2017-06-09 14 views
1

この状況は再現するのが非常に難しいです。最初に私は含まCLJファイルを作成します。この特定の状況でsource-fnがソースコードを見つけられないのはなぜですか?

(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)"になります。しかし、2番目の式は'(m/myfn nil)です。ここで何が起こっているのですか?

'm/myfn as' myns/myfnを完全修飾すると、一致する動作が復元されることに注意してください。また、iterating source-fnはちょっと変なものだと私は理解していますが、これは動作を再現するために私が知っている最も簡単な方法です。

+1

一つの違い:evalの中に 'second'、'ソースfn'の実行とlein testを経由してファイルから実行すると、私は異なる結果を取得していますREPLのステップ。 'take 2'では、' 'source-fn''は印刷の段階で(遅延のために)実行されます。 – ez121sl

答えて

0

私はあなたの結果を理解していません。結果と

(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))) 

:2例の間

(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)" 
+0

spyxを使用しているため、再現できません。コメントに書かれているように、違いは 'iterate'は評価が完了した後にのみ印刷されるlazy seqを返します。 spyxはevalフェーズ中に文字列に変換することでそれを変更します。 – amalloy

関連する問題