我有一個像這樣定義的函數規範,我想將它計算到一個函數對象中,以便我可以傳遞。如何在clojure中將列表形式轉換爲函數
(def spec '(foo [n] (* 2 n)))
我可以創建這樣
(defmacro evspec [name arg & body] `(defn ~name [~arg] [email protected]))
那麼下面的電話給我函數foo的宏。當3調用(FOO 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 [email protected]>
而工作FOO功能
user=> foo
#<user$foo [email protected]>
有誰能夠解釋爲什麼差別,我怎麼能讓它起作用 ?我想有一種方式沒有在eval上回復?來自javascript的背景,總覺得eval是邪惡的。
如果你想傳遞一個函數對象,只需使用(defn foo [...)並傳遞符號foo。 –