我试图端口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