2017-10-10 7 views
0

を-main私は次のコード決意はREPLで異なる振る舞いと

(ns clojure-noob.core 
    (:gen-class)) 

(defn -main [& args] 
    (defn A [x] (str x "a")) 
    (println (A "."))      ; .a 
    (println A)        ; some object 
    (println (symbol "A"))     ; just A 
    (println (resolve(symbol "A")))   ; nil 
    (println ((resolve(symbol "A")) ".")) ; nullpointer exception 
) 

を持って、私はライン((defn A ...から始まる)REPLでの一つ一つを入力した場合、予想通り、彼らは動作します。最後のもの

(println ((resolve(symbol "A")) ".")) 

"on"すなわち、文字aを付加する。 しかし、leiningenでlein runと呼ばれるものは、最後の行ではnilとなり、最後の行ではnullポインタ例外が発生します。つまり、resolveは期待通りに解決されません。

私は間違っていますか? lein repllein runの違いは何ですか?

答えて

1

短い答えはresolvelein repllein run、および現在のネームスペースにresolve作品に評価されているとき、あなたの現在のネームスペースが異なることです。resolveドキュメント文字列:

(NS-解決* NS *記号)または(NS-解決* NS * & ENVシンボル)

*ns*と同様に現在のネームスペースがどのように結合されています。

(println "current ns is" *ns*)を追加して違いを確認できます。

明示的にどちらの場合も、あなたのコードの作業になりますns-resolve使用して名前空間を渡す:余談として

(println (ns-resolve 'clojure-noob.core (symbol "A"))) 
(println ((ns-resolve 'clojure-noob.core (symbol "A")) ".")) 

を、あなたは一般的に表示されていないネストされたdefnあなたA機能を外部に定義することができIE /前に-main機能。

+0

ありがとうございました!それは今働く。 – Rat62

+0

@ Rat62これはあなたの質問に答えて、あなたはそれを受け入れられた答えとしてマークする必要がありますm – Carcigenicate

関連する問題