【发布时间】:2014-10-28 20:52:47
【问题描述】:
我一直在编写一些代码,使用 R5RS 进行赋值,以使用宏将某些表达式扩展为表达式的核心形式。这些稍后会通过提供的 eval/apply 循环进行处理
(define expand (lambda (exp)
(letrec-syntax
((let (syntax-rules ()
((_ ((var init) ...) body ...)
(`((lambda (var ...) body ...) init ...))))) )
(exp)) ; sequence to expand
))
(expand (let ((x 2) (y 1)) (+ x y)) )
当我运行这样的代码时,我会返回 ;The object 3 is not applicable.,但看起来它实际上是在评估 exp,但我需要返回一个 uh...string 表示形式。
如果我将想要扩展的表达式嵌入到 letrec-syntax 主体中,我会得到我真正想要的。像这样:
(define expand (lambda (exp)
(letrec-syntax
((let (syntax-rules ()
((_ ((var init) ...) body ...)
(`((lambda (var ...) body ...) init ...))))) )
(let ((x 2) (y 1)) (+ x y))) ; sequence to expand
))
我回来了...
;The object ((lambda (x y) (+ x y)) 2 1) is not applicable 这看起来像是我想发回以进行解释的内容。
所以我的问题是我怎样才能重写它以使任何 exp 像第一个示例中那样扩展,但返回其扩展形式,就像在第二个示例中一样?
我认为问题与 lambda 定义的 exp 在 letrec 语法方面处于错误范围有关。我对 Scheme 很陌生,我觉得我在这里缺少一个简单的解决方案。到目前为止,我最好的线索涉及以某种方式使用语法案例或有关卫生的东西,但我觉得到目前为止我一直在追逐我的尾巴,试图研究这些主题,我不确定它们是否是正确的方向。
感谢您的帮助。 :)
【问题讨论】:
-
你使用的是哪个 Scheme 实现?
-
MIT/GNU Scheme 基于来自here的R5RS