2017-10-10 4 views
0

- 주요 나는 예상대로 그들은 행동, 다음 코드해결이 REPL에서 다른 동작과 나는 (<code>(defn A ...</code>로 시작하는) 라인 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 
) 

있습니다. 마지막 하나

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

" 즉, 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 기능이 외부 정의 할 수 있습니다 즉/-main 기능 이전.

+0

고맙습니다. 이제 작동합니다. – Rat62

+0

@ Rat62이 질문 중 귀하의 질문에 대한 대답은 허용 된 대답으로 표시해야합니다. m – Carcigenicate

관련 문제