bugfix> clojure > 投稿

「分解」しようとしているシーケンスにランダムな量の文字列がありますか? seqの最後の文字列も削除しながら、別々の文字列に変換します。

( "a" "b" "c")->"a" "b"

私はいくつかのことを試しましたが、最も近いのは(apply str(drop-last args))ですが、おそらくご存知のように、これにより文字列のシーケンスが1つの文字列に変わります。「ab」

どうすればよいですか?

回答 1 件
  • シーケンシャルデストラクチャリングを使用するようです。

    (def col-of-strings '("a" "b" "c" "d" "e"))
    (let [ [a b c & etc ]  col-of-strings
           last            (drop-last etc) ]
      (println "a=" a " b=" b " c=" c " and etc=" etc " last=" last))
    
    

    印刷する

    a= a  b= b  c= c  and etc= (d e)  last= (d)
    
    

    別のオプションは、最初に最後の文字列を削除してから、構造を解除することです。

    (let [ col-minus-last  (drop-last col-of-strings)
                  [ a b c & etc]  col-minus-last ]
      (println "a=" a " b=" b " c=" c " etc=" etc))
    
    

    印刷する

    a= a  b= b  c= c  etc= (d)
    
    

    コレクションに含まれる要素の数が本当にわからない場合は、ループを使用するのが最善の策だと思います。

    (loop [ c  (drop-last col-of-strings) ]
      (let [s  (first c) ]
        (println "s=" s)
        (if (nil? s)
          nil
          (recur (rest c)))))
    
    
    編集

    OPは、処理のために可変数の文字列を渡したいと言っています。その場合、リストを再帰的に歩くことが適切であるように思われます。

    (defn vararg-func [ s & etc]
      (println "s=" s)
      (if (nil? s)
        nil
        (recur (first etc) (rest etc))))
    
    

    しかし、OPはすでに文字列(ファイル名)の怠惰なシーケンスを持っていると言っているので、それを処理する最も簡単な方法は、シーケンスを関数に渡してループすることだと思います。

    (defn seq-func [ s ]
      (loop [ str     (first s)
              usw     (rest s) ]
        (println "str=" str)
        (if (nil? str)
          nil
          (recur (first usw) (rest usw)))))
    
    

    これは以前のコードと非常によく似ています。

あなたの答え