下面的宏实现了一个逻辑:
首先将expression求值,然后赋值给var
如果var为真,则执行then参数求值后的表达式
否则执行else参数求值后的表达式,else参数为可选。
感谢danlei带来的例子。
该文章他的回答解释了为什么比C/C++宏强大的原因。
(require 'cl)
(defmacro* bif ((var expression) then &optional else)
`(let ((,var ,expression))
(if ,var ,then ,else)))
(macroexpand-all '(bif (x 5) (print "ok") (print "bad")))
注意,必须加载cl的库,而且要是用defmacro* 函数。
如果要是实现这样的逻辑,C/C++用宏怎么解决呢?光一个编译时求值用宏就非常难办了。