`(defun bar(y) \
(funcall ,change-fn ,x y)))
当调用(foo 1 :change-fn #'list )时没有问题因为宏扩展为: (DEFUN BAR (Y) (FUNCALL #'LIST 1 Y))
而当调用(foo 1)时就会报错 此时宏扩展为: (DEFUN BAR (Y) (FUNCALL #<FUNCTION LIST> 1 Y))
;;;;;;;;;;;;;;;;;;;;;;;
正确的写法为
(defmacro foo(x &key(change-fn 'list))
`(defun bar(y)
(funcall (function ,change-fn) ,x y)))
此时调用有两种办法1:(foo 1 :change-fn list)
2: (foo 1 :change-fn (lambda(x y) (list x y))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
不知道自己总结得是否正确 希望有人指点下