Этот код работает в схеме ракетки, приведенной в codepad.org, отображая номера 1, 2 и 3 на последовательных линиях перед отображением сообщения «неожиданный возврат», но тот же самый точный код не работает с использованием схемы цыплят по адресу ideone.com, и я не понимаю сообщение об ошибке, которое предоставляет Chicken Scheme. Как я могу заставить его работать с куриной схемой?Генераторы в схеме цыпленка
(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)
Yuck. Спасибо. – user448810
Исправление: ideone запускает CHICKEN 4.9, для которого яйцо синтаксиса не доступно (это унаследованное яйцо CHICKEN 3). – sjamaan
@sjamaan Спасибо за исправление! Есть ли способ использовать 'синтаксис-case' в 4.9, и если да, то как? –