此代码适用于codepad.org提供的 Racket 方案。 ,在显示消息“意外返回”之前,在连续的行中显示数字 1、2 和 3,但使用小鸡方案在 ideone.com 处相同的代码失败了。 ,我不明白 Chicken Scheme 提供的错误消息。我怎样才能让它与 Chicken计划一起工作?
(define-syntax define-generator
(lambda (x)
(syntax-case x (lambda)
((stx name (lambda formals e0 e1 ...))
(with-syntax ((yield (datum->syntax-object (syntax stx) 'yield)))
(syntax (define name
(lambda formals
(let ((resume #f) (return #f))
(define yield
(lambda args
(call-with-current-continuation
(lambda (cont)
(set! resume cont)
(apply return args)))))
(lambda ()
(call-with-current-continuation
(lambda (cont)
(set! return cont)
(cond (resume (resume))
(else (let () e0 e1 ...)
(error 'name "unexpected return"))))))))))))
((stx (name . formals) e0 e1 ...)
(syntax (stx name (lambda formals e0 e1 ...)))))))
(define-generator (test-gen)
(yield 1)
(yield 2)
(yield 3))
(define t (test-gen))
(display (t)) (newline)
(display (t)) (newline)
(display (t)) (newline)
(display (t)) (newline)
最佳答案
鸡需要syntax-case
egg加载以支持syntax-case
。但是,ideone 没有安装该 Egg,因此您无法在那里使用它。
因此,为了在 ideone 上进行测试,您必须将宏转换为显式重命名宏。
关于scheme - Chicken计划中的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31683997/