我想評估一個宏的參數是否是一個函數。如果是我想返回未評估的功能。否則返回一個不同的功能。像這樣:如何在clojure宏中測試未評估函數?
(defmacro func? [function]
(if (fn? function)
function
identity))
((func? "oops") 5) ;=> 5
((func? -) 5) ;=> 5
然而上述失敗,因爲未計算的功能還不是真正功能得到這個工作,我必須使用邪惡的eval:
(defmacro func? [function]
(if (fn? (eval function))
function
identity))
((func? "oops") 5) ;=> 5
((func? -) 5) ;=> -5
如何避免使用在這裏評估? 答案必須是宏。
在我的情況下宏功能的原因是,這個宏被用於很多在我的遊戲中被調用很多次的函數。該宏是一個輸出格式解釋器。換句話說,我自己可以這樣寫,但宏使我的代碼更清晰。如果我使用了一個函數而不是這個宏,它會做同樣的解釋,只需要進行一次,每50ms重複我的遊戲大約60次。希望澄清而不是混淆我的情況。
什麼是你正在試圖解決的實際問題?我不禁想到,那裏可能有更好的解決方案。 –
我很抱歉無法與編譯時在運行時評估此函數的需求。問題已更新。 –
這有幫助。但是,「輸出格式解釋器」是什麼意思?你可以添加一些例子,說明你真的想要如何使用這個宏(在上下文中)?你的例子沒有太大的意義。如何使'((func?「oops」)5)'評估爲'5'與你的「解釋器」有關? –