相关疑难解决方法(0)

实现 yield 并在 Scheme 中发送

我试图端口yield,并yield from从Python的方案。

这是我完成的一个实现:

(define (coroutine routine)
  (let ((current routine)
    (status 'new))
    (lambda* (#:optional value)
      (let ((continuation-and-value
         (call/cc (lambda (return)
            (let ((returner
                   (lambda (value)
                 (call/cc (lambda (next)
                        (return (cons next value)))))))
              (if (equal? status 'new)
                  (begin
                (set! status 'running)
                (current returner))
                  (current (cons value returner)))
              (set! status 'dead))))))
    (if (pair? continuation-and-value)
        (begin (set! current (car continuation-and-value))
           (cdr continuation-and-value))
        continuation-and-value)))))
Run Code Online (Sandbox Code Playgroud)

这个实现的问题在于它必须被调用的方式看起来不像 Python 的yield.

(define why (call/cc (lambda (yield)
               (format #t "love me or leave me!")
               (yield …
Run Code Online (Sandbox Code Playgroud)

scheme continuations guile coroutine delimited-continuations

4
推荐指数
1
解决办法
1532
查看次数