1

スレッド化マクロの使用はなぜですか ->> cider-repl でエラーが発生します:

(-> "x..")

//  Unable to resolve symbol: -> in this context
4

1 に答える 1

6

これは、repl で新しい名前空間を作成し、まだ何も定義していない場合に発生します。そのため、clojure.core 関数のエイリアスはまだ確立されていません。

新しい空の名前空間を作成することから始めます。

user> (in-ns 'i-dont-exist-yet)
#namespace[i-dont-exist-yet]

次に、スレッド マクロ (または clojure.core の何か) を使用してみます。

i-dont-exist-yet> (-> 1)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: -> in this context, compiling:(*cider-repl api*:47:18) 

現在の名前空間でシンボルを検索できませんが->、使用する名前空間を明示的に指定すると機能します。

i-dont-exist-yet> (clojure.core/-> 1)
1

clojure.core には、新しい名前空間に期待されるすべての参照を追加する便利な関数があります。ns上部にマクロを含むファイルから名前空間を作成する場合、これを行う必要はありませnsん (他の便利なことの中でも特に)。

i-dont-exist-yet> (clojure.core/refer-clojure)
nil
i-dont-exist-yet> (-> 1)
1
于 2016-03-21T22:36:39.850 に答える