【问题标题】:Implement a return function实现返回函数
【发布时间】:2012-08-20 10:44:40
【问题描述】:

我正在尝试在 Scheme R6RS 中实现 return 函数。我想要这样的东西:

(lambda ()
  (do-some-job-before)
  (return some-value)
  (do-some-job-after))

执行(do-some-job-before),不执行(do-some-job-after)some-value中的lambda函数的最终值。

我想我必须使用延续。我试过了:

(define return #f)
(call/cc (lambda (k)
           (set! return k)))

但它不起作用;例如

(+ 2 (return 3)) ; -> 3 (and not 5 as I expected)

我该怎么做?

【问题讨论】:

    标签: scheme continuations callcc


    【解决方案1】:

    已编辑:误读问题。

    其实很简单:)

    (call/cc 
      (lambda (return)
        (printf "before\n")
        (return 3)
        (printf "after\n")))
    

    例如here

    注意:你不能一概而论,除非你把它包装在一个不卫生的宏的语法中。

    【讨论】:

    • 感谢您的回答,但这不是我需要的。我不希望执行清理部分。
    • @Aslan986:那么请跳过动态风位,对不起,我误读了您的问题 :) 编辑答案。
    • @Aslan986:你的例子并没有真正的意义,为什么你会想要这个。
    • @Ieppie:我想做这样的事情:eval.ironscheme.net/?id=67。 (我知道我可以通过闭包轻松做到这一点)。我需要一个 C 风格的 return 函数。
    • @Aslan986:不幸的是 IronScheme 没有完整的延续,所以我不能真正测试它或提出一个可行的例子,除非我去一些其他的 Scheme。我假设您想要一些类似于 yield 在某些语言中的无限生成器。正如你所说,使用闭包是正常的方式,也是我会使用的方式。
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2010-11-25
    • 2019-10-22
    • 2013-04-04
    • 2019-12-17
    相关资源
    最近更新 更多