假设我想在 s 表达式中的第一项以外的其他内容上触发 Scheme 宏。例如,假设我想define
用中缀样式替换:=
,这样:
(a := 5) -> (define a 5)
((square x) := (* x x)) -> (define (square x) (* x x))
实际的转变似乎很简单。诀窍是让 Scheme 找到:=
表达式并对其进行宏扩展。我已经考虑过使用标准宏的中缀语法来包围大部分代码,也许是:(with-infix-define expr1 expr2 ...)
,并让标准宏遍历其主体中的表达式并执行任何必要的转换。我知道如果我采用这种方法,我将不得不小心避免转换实际上应该是数据的列表,例如引用列表和准引用列表的某些部分。我设想的一个例子:
(with-infix-define
((make-adder n) := (lambda (m) (+ n m)))
((foo) :=
(add-3 := (make-adder 3))
(add-6 := (make-adder 6))
(let ((a 5) (b 6))
(+ (add-3 a) (add-6 b))))
(display (foo))
(display '(This := should not be transformed))
所以,我的问题有两个:
- 如果我走这
with-infix-define
条路,除了报价和准报价外,我是否必须注意任何绊脚石? - 我感觉有点像在重新发明轮子。这种类型的代码遍历似乎正是标准宏扩展系统必须要做的——唯一的区别是它们在决定是否进行任何代码转换时只查看列表中的第一项。有什么办法可以搭载现有系统吗?