【问题标题】:resolve behaves different in REPL and -mainresolve 在 REPL 和 -main 中的行为不同
【发布时间】:2017-10-10 22:47:54
【问题描述】:

我有以下代码

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

如果我在 repl 中一一输入行(以 (defn A ... 开头),它们的行为与预期相同。最后一个

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

在“.”上调用 A即附加字母a。 但是在 leiningen 中用lein run 调用的整个过程在倒数第二行给出了nil,在最后一行给出了空指针异常,即resolve 没有按预期解决。

我做错了什么? lein repl 和 lein run 有什么区别?

【问题讨论】:

    标签: clojure read-eval-print-loop resolve


    【解决方案1】:

    简短的回答是,当resolve 在lein repl 与lein run 中进行评估时,您的当前命名空间 是不同的,并且resolve 在当前命名空间上工作。 resolve 文档字符串:

    与 (ns-resolve *ns* 符号) 或 (ns-resolve *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 函数之外/之前定义。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2021-02-16
      • 2023-03-28
      • 2014-07-22
      相关资源
      最近更新 更多