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
。我不能再编辑那个评论了,但它仍然让我恼火:我*现在明白那些术语了:)