零? def

时间:2020-03-07 08:29:02

标签: clojure

我是Clojure的新手,所以这很明显。

(println (nil? (resolve 'x)))
(def x 1)
(println (nil? (resolve 'x)))

这将打印出来

true
true

第二个println为什么不输出false

根据ClojureDocs上的示例,不是这样吗?

编辑:

不是通过REPL运行它。

这就是我到达那里的方式:

通过lein new testing创建一个项目。

修改core.clj之后,它看起来像这样:

(ns testing.core
  (:gen-class))

(defn -main
  [& args]

  (println (nil? (resolve 'x)))
  (def x 1)
  (println (nil? (resolve 'x)))
)

通过lein run运行时,输出为:

true
true

4 个答案:

答案 0 :(得分:0)

当我在Clojure REPL中评估这些表达式时,第一个表达式为true,第二个表达式为false。您如何启动Clojure REPL?您正在使用什么版本的Clojure?您可以一致地重现吗?

答案 1 :(得分:0)

(resolve 'x)尝试获取由x符号(绑定)命名的Var。如果此Var不存在,则应返回nil。因此,您的假设是正确的。 如果您使用实时REPL进行编码,请记住,您评估的代码会保留在内存中,直到用新版本替换它或手动取消定义它为止。


这是我旁边的可视REPL会话,显示正确的行为:

Screen recording of a REPL session described in this post

答案 2 :(得分:0)

您的环境有些奇怪:

$ cat x.py
#coding: pythonql
data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
q = [x match {'x': as x, 'y': as y} in data where y > 0]
print(sum(q))
print(list(q))

q = [x match {'x': as x, 'y': as y} as d in data where d['y'] > 0]
print(sum(q))

答案 3 :(得分:0)

尝试改为运行以下程序,并仔细阅读输出。请注意,函数“ resolve”的doc字符串表示它解析名称空间中的符号,即* ns *的当前值,即“动态变量”,根据下面所示程序的输出,默认情况下等于“用户”名称空间,不同于定义函数的名称空间,即“ x”为“ def”的名称空间。

(ns testing.core
  (:gen-class))

(defn -main
  [& args]

  (println)
  (println "before (def x 1)")
  (println "*ns*=" *ns*)
  (println "(resolve 'x)=" (resolve 'x))
  (println "(resolve 'user/x)=" (resolve 'user/x))
  (binding [*ns* 'testing.core]
    (println "*ns*=" *ns*)
    (println "(resolve 'x)=" (resolve 'x))
    (println "(resolve 'user/x)=" (resolve 'user/x)))

  (def x 1)
  (println)
  (println "after (def x 1)")
  (println "*ns*=" *ns*)
  (println "(resolve 'x)=" (resolve 'x))
  (println "(resolve 'user/x)=" (resolve 'user/x))
  (binding [*ns* 'testing.core]
    (println "*ns*=" *ns*)
    (println "(resolve 'x)=" (resolve 'x))
    (println "(resolve 'user/x)=" (resolve 'user/x))))

我的系统上的输出:

before (def x 1)
*ns*= #object[clojure.lang.Namespace 0x524f3b3a user]
(resolve 'x)= nil
(resolve 'user/x)= nil
*ns*= testing.core
(resolve 'x)= #'testing.core/x
(resolve 'user/x)= nil

after (def x 1)
*ns*= #object[clojure.lang.Namespace 0x524f3b3a user]
(resolve 'x)= nil
(resolve 'user/x)= nil
*ns*= testing.core
(resolve 'x)= #'testing.core/x
(resolve 'user/x)= nil
相关问题