我是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
答案 0 :(得分:0)
当我在Clojure REPL中评估这些表达式时,第一个表达式为true,第二个表达式为false。您如何启动Clojure REPL?您正在使用什么版本的Clojure?您可以一致地重现吗?
答案 1 :(得分:0)
(resolve 'x)
尝试获取由x
符号(绑定)命名的Var。如果此Var不存在,则应返回nil。因此,您的假设是正确的。
如果您使用实时REPL进行编码,请记住,您评估的代码会保留在内存中,直到用新版本替换它或手动取消定义它为止。
这是我旁边的可视REPL会话,显示正确的行为:
答案 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