定义一个宏,返回Scheme中表达式的运算符?
我正在寻找这样的功能:定义一个宏,返回Scheme中表达式的运算符?,scheme,Scheme,我正在寻找这样的功能: (op (+ 1 2)) ; + 我一辈子都不知道如何使用define macro实现这一点。有什么帮助吗 谢谢 编辑: 这尤其令人困惑,因为我可以做到: (car '(+ 1 2)) ; + 但如果我这样做: (define-macro (op expr) (car expr)) (op '(+ 1 2)) 它不起作用。OP将宏定义为一个函数,但Lisp宏不起作用。对宏窗体求值以生成一个新窗体,该窗体替代了原始的宏调用,但宏参数未求值就被传递到宏体中。这
(op (+ 1 2))
; +
我一辈子都不知道如何使用define macro
实现这一点。有什么帮助吗
谢谢
编辑:
这尤其令人困惑,因为我可以做到:
(car '(+ 1 2))
; +
但如果我这样做:
(define-macro (op expr)
(car expr))
(op '(+ 1 2))
它不起作用。OP将宏定义为一个函数,但Lisp宏不起作用。对宏窗体求值以生成一个新窗体,该窗体替代了原始的宏调用,但宏参数未求值就被传递到宏体中。这意味着在
op
的宏体中,car
不在数据(+12)
上运行,而是在数据(引号(+12))
上运行
宏op
的目标不是计算(car expr)
,而是生成(car expr)
(其中expr
被宏参数的值替换),然后在宏展开后在REPL中计算。可以使用列表
:
(define-macro (opl expr)
(list 'car expr))
或使用准旋转:
在这里,反引号为列表引入了一个模板,逗号使符号expr
计算为其值((引号(+1 2))
),并将结果插入列表。一个简单的引用列表,例如”(car expr)
将计算为列表(car expr)
,其中expr
只是符号expr
。使用准旋转,,expr
计算为宏调用中提供的参数值,例如`(car,expr)
-->(car'(+1 2))
。请注意,(list'car expr)
在expr
为(+12)
时生成的表单与(opl'(+12))
这种define macro
语法与Common Lisp的传统defmacro
语法几乎相同,区别在于defmacro
宏的名称在形式参数列表之前,例如(defmacro op(expr);…)
<代码>定义宏在标准方案中不可用,但某些方案实现确实支持它。Guile方案同时支持defmacro
和define macro
。上述两种宏观解决方案均以Guile为基础:
scheme@(欺骗用户)>(opl'(+12))
$2 = +
方案@(欺诈用户)>(opq'(+12))
$3 = +
您使用的是哪种方案实施<代码>定义宏不是方案标准的一部分。它有define syntax
。如果这是MzScheme,我认为语法是(define macro op(lambda(expr)…)
。你不能像定义函数时那样缩写lambda
。很遗憾,我的学校正在使用scheme的自定义实现。请尝试使用(define macro(op expr)(write expr))
查看expr
的实际值。错误:未知标识符:quote。我认为它会将报价作为列表的一部分,然后是car,然后尝试评估报价
(define-macro (opq expr)
`(car ,expr))