我想要一个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程序_
编辑:没关系-我现在知道了:)