为什么 source-fn 在这种特定情况下找不到源代码



这种情况很难重现。首先,我创建一个包含以下内容的 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)"

最新更新