5

やった:

user=> (println (for [line (range 1 5)] (str "line=" line)))

そして得た:

(line=1 line=2 line=3 line=4)

line=1 line=2 line=3 line=4しかし、私はひもとしてだけ欲しかった。どうすればいいですか?

4

3 に答える 3

9

「申請」が必要です。

(apply println (for [line (range 1 5)] (str "line=" line)))

あるいは、

(println (apply str (interpose " " (map #(str "line=" %) (range 1 5)))))
于 2012-09-21T18:00:04.293 に答える
3

これはどうですか。doseqシーケンスに対して副作用を行うことであり、印刷は副作用です。

(doseq [line (range 1 5) 
        :let [msg (str "line=" line " ")]] 
       (print msg))
于 2012-09-22T04:46:06.403 に答える
2

の代わりに、次のようにapply使用することもできます。reduce

user> (reduce #(str %1 " line=" %2) "" (range 1 5))
=> " line=1 line=2 line=3 line=4"

reduce関数は、関数 ( f の場合に呼び出しましょう) 、 「開始値」、およびfの 2 番目の引数として使用されるもののリストを取る関数です。開始値とリストの最初の項目でfを遅延して呼び出し、次にこれが返すものとリストの 2 番目の項目で f を呼び出し、次にこれが返すものとリストの 3 番目の項目でfを呼び出します。リスト内のすべてのアイテムを使い果たしました (というか、怠け者なので、「要求」した場合にのみリスト全体を調べます)。

最初のスペースが気に入らない場合は、すべてをラップすることができますtriml(最初に行う必要があります(use 'clojure.string))。(reduce #(str %1 "line=" %2 " ") (range 1 5))または、スペースを最後に配置する を行うこともできます。

私の経験では、 で何かを実行できるときはいつでもapply、 を使用するともう少しエレガントに実行できますreduce。さらに重要なことは、私の代替手段は通常、私のreduce代替手段よりも常にapply高速であるということです。これが常に正しいと保証することはできず、特定の問題について速度テストを行っていません.

編集
私は自分のバージョン ( ) と JohnJ の 2 番目の提案 ( ) を使用して大まかなタイミングをreduce調べましapplyた。(range 1 100)(range 1 500)apply

于 2012-09-21T23:30:53.187 に答える