如何使宏观卫生的一部分
题
我想有一个版本的 lambda
, ,称 lambda-r
, ,从中你可以 return
.一个例子:
(+ ((lambda-r ()
(return 1)
2)) 5)
这会给出价值 6
.虽然您可能期望值为7,但它是6,因为在达到2之前,从lambda表达式返回1。
这是我正在寻找的那种转变的一个例子。假设一个是用的 lambda-r
如下:
(lambda-r (a b)
(return a)
(+ a b))
我希望它变成这样:
(call/cc (lambda (k)
(define return (lambda (v)
(k (lambda (a b)
v))))
(lambda (a b)
(return a)
(+ a b))))
这也可以用let-expression而不是内部定义来表达,但是为了清楚起见,我使用了define。
请注意,上面的代码确实按预期工作。 问题出在哪里 我在表达上有困难吗? lambda-r
作为一个 宏.原因是我想 k
和 v
要卫生,但我不想 return
要卫生。
我目前的宏是这样的:
(define-syntax lambda-r
(syntax-rules (return)
[(_ (var ...) body ...)
(call/cc (lambda (k)
(define return (lambda (v)
(k (lambda (var ...)
v))))
(lambda (var ...)
body ...)))
]))
这是行不通的,因为 return
经过卫生处理,因此在使用时不能直接看到 lambda-r
.所以 (lambda-r () (return 1))
给出一个错误,上面写着 return
不是有效的标识符。
编辑:感谢Nathan Sanders的回答,我更接近理解我在这里要做的事情。但是我不完全理解下面的程序,结果还没有能够得到这个工作。如果你能解释/引导我到解释以下内容的资源,我将不胜感激:
- 该
syntax
程序 - 该
datum->syntax
/syntax->datum
程序
编辑:Nevermind-我现在已经得到了:)
解决方案
你想要的是 syntax-case
而不是 syntax-rules
.
R6RS定义 举了一些例子,特别是 关于语法-对象和基准转换的一节, ,这就是你想要的。你应该能够适应 loop
w/ break
你的例子 return
.
不隶属于 StackOverflow