1

我想要一个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程序_

编辑:没关系-我现在知道了:)

4

1 回答 1

2

你想要的是syntax-case而不是syntax-rules.

R6RS 定义提供了一些示例,特别是有关语法对象和数据转换的部分,这正是您想要的。您应该能够使loopw/break示例适应您的return.

于 2010-07-10T22:31:46.573 回答