2017-10-10 70 views
0

我有以下代碼決心表現在REPL不同,-main

(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")) ".")) 

調用A上「。」即附加字母a。 但是在leiningen中調用lein run的整個事件倒數第二次給出nil,最後一行產生空指針異常,即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功能可以被定義之外/在-main之前的功能。

+0

非常感謝!它現在有效。 – Rat62

+0

@ Rat62這回答你的問題,你應該將它標記爲接受的答案m – Carcigenicate