このように定義された関数仕様があり、それを関数オブジェクトに評価して、受け渡しできるようにしたいと考えています。
(def spec '(foo [n] (* 2 n)))
このようなマクロを作成できます
(defmacro evspec [name arg & body] `(defn ~name [~arg] ~@body))
次に、次の呼び出しで関数 foo が得られます。(foo 3) を 3 で呼び出すと、6 が返されます。
(evspec foo n (* 2 n))
ただし、上記で定義した仕様から関数本体を取得すると、返された関数 foo は本体フォーム (* 2 n) を評価せず、代わりに本体フォームを返します。
(let [foo (first spec) arg (first (second spec)) body (last spec)]
(evspec foo arg body))
user=> (foo 3)
(* 2 n)
今作成された foo 関数が $eval$foo であることに気付きました
user=> foo
#<user$eval766$foo__767 user$eval766$foo__767@39263b07>
作業中の foo 関数は
user=> foo
#<user$foo user$foo@66cf7fda>
なぜ違いがあり、どうすればそれを機能させることができるのか、誰でも説明できますか? 私は eval に返信せずに方法を持ちたいですか? javascript のバックグラウンドから来ているので、どういうわけか私はいつも eval が悪だと思っています。