2

末尾のコンマを印刷せずに、シーケンスの各項目をコンマで区切って印刷する慣用的な方法を探しています。clojure.string/join中間文字列を作成したくないので、使用を避けたいと思います(これは以前行っていたものであり、コードを追跡するのがはるかに困難でした)。むしろ要素を印刷したいだけです。

これは私が今持っているものです:

(doseq [element a-map]
  (printf "%s = %s" (key element) (val element))
  (print ", "))

私はこれを行うためのいくつかの方法を考えることができます:

  1. の外側の最初の項目doseqを印刷してから、各項目の前にコンマを付けて印刷します。

    (printf "%s = %s" (key (first a-map)) (val (first a-map)))
    (doseq [element (rest a-map)]
      (print ", ")
      (printf "%s = %s" (key element) (val element)))
    
  2. 最後の後にコンマが続くものを除くすべての項目を印刷してから、最後の項目を。の外側に印刷しますdoseq。コードは最初のオプションに似ていますが、ランダムにアクセスできないシーケンスでは非効率的です。

  3. を使用して、が文字列であるinterposeかどうかを確認します。element

    (doseq [element (interpose ", " a-map)]
      (if (str? element)
        (print element)
        (printf "%s = %s" (key element) (val element))))
    

重複しているので、1または2は好きではありません。if条件のため、3は好きではありません。

4

1 に答える 1

3

OK、これが新しい試みです:

(defn str-commas [a-map]
  (doseq [[[k v] sep] (partition-all 2 (interpose ", " a-map))]
    (printf "%s = %s%s" k v (or sep ""))))

partitionサイズNのリストを返しますが、コンマを挿入しても偶数の要素が作成されないため、最後のキーと値のペアが削除されました。partition-all要素が少ないパーティションを含めることができます(最後の要素にはキーと値のペアのみが含まれます)。

(or sep "")最後の要素にはセパレータがないことがわかっているので、トリックを使用することです。したがって、それはnullになります。

于 2013-03-13T21:40:04.173 に答える