定义一个宏,返回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))