我正在寻找这样的功能:
(op (+ 1 2))
; +
我似乎一辈子都想不通如何使用define-macro
来做到这一点。有帮助吗?
谢谢,
编辑:
这特别令人困惑,因为我可以这样做:
(car '(+ 1 2))
; +
但是如果我这样做:
(define-macro (op expr)
(car expr))
(op '(+ 1 2))
不起作用。
Lisp宏不是简单的文本替换宏。对宏表格进行评估以产生一种新表格,以替代原始的宏调用。
宏op
的目标不是评估(car expr)
,而是产生form (car expr)
,在宏扩展发生后,由REPL对其进行评估。可以使用list
:
(define-macro (op expr)
(list 'car expr))
或使用半引号:
(define-macro (op expr)
`(car ,expr))