我想有一个版本的 lambda, ,称 lambda-r, ,从中你可以 return.一个例子:

(+ ((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-expression而不是内部定义来表达,但是为了清楚起见,我使用了define。

请注意,上面的代码确实按预期工作。 问题出在哪里 我在表达上有困难吗? lambda-r 作为一个 .原因是我想 kv 要卫生,但我不想 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 程序

编辑:Nevermind-我现在已经得到了:)

有帮助吗?

解决方案

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

R6RS定义 举了一些例子,特别是 关于语法-对象和基准转换的一节, ,这就是你想要的。你应该能够适应 loop w/ break 你的例子 return.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top