Lambda 如何只制作宏的一部分
我想要一个版本的Lambda 如何只制作宏的一部分,lambda,scheme,callcc,r6rs,hygiene,Lambda,Scheme,Callcc,R6rs,Hygiene,我想要一个版本的lambda,名为lambda-r,从中可以返回。例如: (+ ((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)
lambda
,名为lambda-r
,从中可以返回
。例如:
(+ ((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表达式而不是内部define来表示,但是为了清晰起见,我使用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
不是有效的标识符
编辑:多亏了内森·桑德斯的回答,我更接近于理解我在这里要做什么。但是,我不完全理解以下步骤,因此还不能使其正常工作。如果您能向我解释/指导以下资源,我将不胜感激:
过程语法
/datum->syntax
过程syntax->datum
Edit:Nevermind-我现在已经找到了:)你想要的是
语法大小写
,而不是语法规则
给出一些例子,特别是你想要的。您应该能够将
循环
w/中断
示例改编为您的返回
谢谢,我想这就是我想要的。我一直在读那一页,它有点难以消化;你能解释一下语法的作用吗?同样有帮助的是更容易理解的语法描述,以及datum->syntax
/syntax->datum
。我不能再编辑那个评论了,但它仍然让我恼火:我*现在明白那些术语了:)