这种情况很难重现。首先,我创建一个包含以下内容的 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 并在其中加载第二个文件。最后,我通过将评论发送给 REPL 来评估这两个评论。第一个表达式将按预期生成"(defn myfn [x] x)"
。但是,第二个表达式产生'(m/myfn nil)
。这是怎么回事?
请注意,将 'm/myfn 完全限定为 'myns/myfn 会恢复匹配行为。我也知道迭代 source-fn 有点古怪,但这是我所知道的重现行为的最简单方法。
我不明白你的结果。通过lein test
从文件运行,我得到不同的结果:
(newline)
(def iii (iterate inc 0))
(spyx (nth iii 0))
(spyx (nth iii 1))
(spyx (nth iii 2))
(defn foo [x] 42)
(def bar (repl/source-fn 'foo))
(newline)
(spyx bar)
(newline)
(spyx (take 1 (iterate repl/source-fn 'foo)))
(spyx (take 2 (iterate repl/source-fn 'foo)))
(newline)
(spyx (first (iterate repl/source-fn 'foo)))
(spyx (second (iterate repl/source-fn 'foo)))
结果:
(nth iii 0) => 0
(nth iii 1) => 1
(nth iii 2) => 2
bar => "(defn foo [x] 42)"
(take 1 (iterate repl/source-fn (quote foo))) => (foo)
(take 2 (iterate repl/source-fn (quote foo))) => (foo "(defn foo [x] 42)")
(first (iterate repl/source-fn (quote foo))) => foo
(second (iterate repl/source-fn (quote foo))) => "(defn foo [x] 42)"