实现返回功能

Asl*_*986 4 scheme continuations callcc

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

(lambda ()
  (do-some-job-before)
  (return some-value)
  (do-some-job-after))
Run Code Online (Sandbox Code Playgroud)

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

我想我必须继续使用.我试过了:

(define return #f)
(call/cc (lambda (k)
           (set! return k)))
Run Code Online (Sandbox Code Playgroud)

但它不起作用; 例如

(+ 2 (return 3)) ; -> 3 (and not 5 as I expected)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

lep*_*pie 5

编辑:误读问题.

事实上很容易:)

(call/cc 
  (lambda (return)
    (printf "before\n")
    (return 3)
    (printf "after\n")))
Run Code Online (Sandbox Code Playgroud)

这里的例子.

注意:您不能概括这一点,除非您从不卫生的宏中将其包装在语法中.