【发布时间】:2017-06-09 21:00:04
【问题描述】:
这种情况很难重现。首先我创建一个 clj 文件,其中包含:
(ns myns)
(defn myfn [x] x)
然后我创建第二个 clj 文件,其中包含:
(ns myns2
(:require [myns :as m]
[clojure.repl :as repl]))
(comment
(second (iterate repl/source-fn 'm/myfn))
(take 2 (iterate repl/source-fn 'm/myfn))
)
然后我启动一个 REPL 并在其中加载第二个文件。最后,我通过将两个 cmets 发送到 REPL 来评估它们。第一个表达式将按预期产生"(defn myfn [x] x)"。然而,第二个表达式产生'(m/myfn nil)。这是怎么回事?
请注意,将 'm/myfn 完全限定为 'myns/myfn 会恢复匹配行为。我也知道迭代 source-fn 有点古怪,但这是我所知道的重现行为的最简单方法。
【问题讨论】:
-
两种情况之间的一个区别:
second,source-fn在 REPL 的 eval 步骤中运行;take 2,source-fn在打印步骤中运行(由于懒惰)。
标签: reflection clojure namespaces