2016-11-11 6 views
1

2つのコードスニペットがあり、アラートが発生すると想定しています。ただし、最初の結果はなし、2番目のアラートは実行されます。予期せぬ動作をするClojurescriptマップ関数

(map #(.alert js/window %) ["hey1" "hey2"]) 

このわずかな変更は、警告の問題を修正するだけでなく、期待どおりに(nil nil)を出力します。質問はWHYですか?

(print (map #(.alert js/window %) ["hey1" "hey2"])) 

もう一つの奇妙な観察は、コードに入力されたとき、最初のスニペットは、ブラウザ-REPLから動作しますが、ではないということです。

マップ機能の副作用はありませんが、印刷されていませんか?多分私が知りませんいくつかのコアコードの最適化?

回避策と回答の両方が高く評価されています。もっと情報が必要な場合は、私にコメントでお知らせください。

[org.clojure/clojurescript "1.8.51"]

BOOT_CLOJURE_VERSION = 1.7.0

BOOT_VERSION = 2.5.5

Javaバージョン "1.8.0_101"

説明:Ubuntu 14.04.4 LTS

+0

の可能性のある重複した[副作用が出て、最適化](http://stackoverflow.com/questions/31097067/side-effect-optimized-out) –

+0

はい、彼らは両方とも同じ話題について話しています。しかし、この疑問を疑問視している人々のタイプは、副作用が何であるか、それが問題を引き起こしているかどうかを知りません。私の質問は、その答えが必要な人々によって見つけられる可能性が高いと思います。 ***要約すると、この質問をここに保持する唯一の理由は、質問に単語の副作用が含まれていないということです。***重要だと思わない場合は、削除するのが妥当でしょう。 –

答えて

5

mapを警告のような副作用の操作に使用したくない場合。あなたが見ている問題は、mapという結果が怠けているため、結果のシーケンスの要素を消費するまで実際には動作しません。あなたは本当に物事の副作用のソートを行いたい場合は、doseqはあなたが結果のシーケンスを必要としない場合は特に、より良い選択肢かもしれません:

(doseq [msg ["hey1" "hey2"]] 
    (.alert js/window msg)) 

それともの評価を強制的にdoallを使用することができますシーケンス全体:

(doall (map #(.alert js/window %) ["hey1" "hey2"])) 
関連する問題