我正在尝试从 Common Lisp 转移到Chicken Scheme,并且遇到了很多问题。
我目前的问题是:如何编写define-syntax
调用其他宏的宏(大概使用?)?
例如,在 Common Lisp 中,我可以这样做:
(defmacro append-to (var value)
`(setf ,var (append ,var ,value)))
(defmacro something-else ()
(let ((values (list))
(append-to values '(1)))))
而在 Scheme 中,等效代码不起作用:
(define-syntax append-to
(syntax-rules ()
((_ var value)
(set! var (append var value)))))
(define-syntax something-else
(syntax-rules ()
((_)
(let ((values (list)))
(append-to values '(1))))))
append-to
不能从宏调用宏something-else
。我收到一条错误消息,说append-to
“变量”未定义。
根据我从谷歌和其他来源收集到的所有信息,宏是在封闭环境中评估的,无法访问其他代码。本质上,在评估宏时,除了内置的 Scheme 函数和宏之外,什么都不存在。我已经尝试使用er-macro-transformer
, syntax-case
(无论如何现在在 Chicken 中已弃用)甚至procedural-macros
模块。
当然,宏的全部目的是它们建立在其他宏之上,以避免重复代码。如果必须单独编写宏,那么在我看来,它们几乎毫无用处。
我调查了其他方案的实现,但没有更多的运气。似乎它根本无法完成。
有人可以帮我解决这个问题吗?