2017-10-10 85 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