我想要一个lambda
名为 的版本,lambda-r
您可以在其中使用return
。一个例子:
(+ ((lambda-r ()
(return 1)
2)) 5)
这将给出价值6
。尽管您可能期望该值为 7,但它是 6,因为 1 在到达 2 之前从 lambda 表达式返回。
这是我正在寻找的那种转换的例子。假设一个要使用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 表达式而不是内部定义来表达,但为了清楚起见,我使用了定义。
请注意,上面的代码确实按预期工作。问题是我无法表达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
程序_
编辑:没关系-我现在知道了:)