宏扩展的执行逻辑初探(二)

再来一个例子

看看以下运行的结果是什么呢?

1
2
3
4
(defmacro a_macro [x]
(list '+ 1 x))

(macroexpand-1 '(a_macro (+ 1 2)) ) ;; => ?

如果是一个函数呢?

1
2
3
4
(defn a_func [x]
(list '+ 1 x))

(a_func (+ 1 2)) ;; => ?

宏参数绑定表达式,而不是表达式的值

a_macro进行扩展的的运行结果是

#'user/a_macro
(+ 1 (+ 1 2))    # 注意!不是 (+ 1 3)

而不是(+ 1 3)。说明扩展宏的时候,宏的参数绑定的是表达式, x绑定了表达式(+ 1 2),这样宏内部的list函数求值运行的时候,x的值是一个表达式(+ 1 2)

a_func则不同,内部调用同样的list函数的时候,入参(+ 1 2)首先进行了求值。因此x绑定的是3 。 因此a_func运行结果是

(+ 1 3)