2016-10-07 8 views
0

私は、別の関数に渡されるハッシュマップのリストを作成しています。 mapを使用してリストから各ハッシュマップを印刷しようとすると、それは機能しません。私は完全なリストを印刷するか、最初の要素などを得ることができます。clojureのマップ関数を使用してハッシュマップリストの各要素をプリントする方法は?

(defn m [a] 
    (println a) 
    (map #(println %) a)) 

次のものはreplのみで動作します。

(m (map #(hash-map :a %) [1 2 3])) 

しかし、load-fileを使用して読み込んだプログラムからは機能しません。私はaを見ていますが、個々の要素は見ていません。どうしましたか?

+0

あなたはどのようなエラーが出るのですか?小さなコードの例でデモンストレーションできますか? –

+0

何度か結果を出力しますが、それ以外のときは何も出力しません。 'doall'は働いています。 – boring

+0

'(map#(println%)a)'は '(map println a)'です。 – Thumbnail

答えて

4

Clojureの変換関数では、レイジーシーケンスが返されます。したがって、(map #(println %) a)は遅延のあるシーケンスを返します。消費されるとマップアクションが適用され、印刷側のエフェクトのみが表示されます。

機能の目的が印刷のような副作用を持つことである場合、熱心に変換を評価する必要があります。機能dorundoall

(def a [1 2 3]) 
(dorun (map #(println %) a)) 
; returns nil 

(doall (map #(println %) a)) 
; returns the collection 

あなたが実際にマップするが、唯一の副作用を持ってしたくない場合は、doseqを使用することができます。副作用を行うには「反復」に意図されています

(def a [1 2 3]) 
(doseq [i a] 
    (println i)) 
+0

'mapv'を使うこともできます。これは遅延ではなく、常にその結果をベクトルで返します。 –

+1

'println'は' nil'を返しますので、 'doall'ではなく' dorun'を使います。 – Thumbnail

4

あなたの目標は、戻り値を無視して、順番に、コレクション内のすべての項目の既存の関数を呼び出すだけであるならば、あなたはrun!を使用する必要があります。

(run! println [1 2 3]) 
;; 1 
;; 2 
;; 3 
;;=> nil 

いくつかのより複雑なケースでは、@Gamlorの通りdoseq使用することが好ましいが、この場合には、doseqのみ定型を追加します。

+0

いいえ、値が必要です。 – boring

+0

@kadajなぜあなたはGamlorの答えを受け入れたのですか?彼の 'dorun'と' doseq'は私の 'run! 'のように' nil'を返します。彼の 'doall'は' nil'値のシーケンスを返すだけです。あなたは何を意味するのか説明していただけますか? –

+0

問題のコードはサンプルでした。私は先物のリストを返す関数を呼び出しています。それで '(map deref xs)'を適用するとうまくいきませんでしたが、 'doall(map deref xs)')は動作します。 – boring

0

私は末尾再帰を使用することをお勧めします。

(defn printList [a] 
    (let [head (first a) 
     tail (rest a)] 
    (when (not (nil? head)) 
     (println head) 
     (printList tail)))) 
関連する問題