我想评估一个宏的参数是否是一个函数。如果是我想返回未评估的功能。否则返回一个不同的功能。像这样:如何在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'与你的“解释器”有关? –