12

評価の再実装を伴う4Clojureの問題「UniversalComputationEngine 」を解決しようとしたときに、誤って次のようなものを呼び出すことになりました。

(apply '/ '(16 8))

意図したものではなく:

(apply / '(16 8))

これには、戻るという紛らわしい副作用があり8、数学を台無しにしたと思いました。

後で、デバッグの後でエラーに気づきました。/シンボルを呼び出そうとする前にシンボルの評価に失敗していました。そのため、clojure.lang.Symbolを実装する必要があることに気付きましたclojure.lang.IFn。しかし、その実装は何をしますか?私ができることはnil、1つの引数、または指定されている場合は2番目の引数を返すことだけです。

4

1 に答える 1

13

シンボルは、キーワードと同じように、マップ内で自分自身を検索します。Symbolの実装を参照してください:

…
122 public Object invoke(Object obj) {
123         return RT.get(obj, this);
124 }
125
126 public Object invoke(Object obj, Object notFound) {
127         return RT.get(obj, this, notFound);
128 }
…

RTclojure.lang.RT、ほぼすべてを実行します。「RunTime」?)

与えられた例では、ルックアップが失敗しているため(16はマップではないため)、notFound値(8)が返されます。

于 2012-09-05T12:39:00.507 に答える