2015-07-28 4 views
2

Этот код работает в схеме ракетки, приведенной в 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) 

ответ

3

Chicken требует syntax-case egg быть загружен в целях поддержки syntax-case. Однако у ideone нет установленного яйца, поэтому вы не можете его использовать.

Итак, чтобы проверить на ideone, вам нужно будет преобразовать ваш макрос в явный переименованный.

+0

Yuck. Спасибо. – user448810

+0

Исправление: ideone запускает CHICKEN 4.9, для которого яйцо синтаксиса не доступно (это унаследованное яйцо CHICKEN 3). – sjamaan

+0

@sjamaan Спасибо за исправление! Есть ли способ использовать 'синтаксис-case' в 4.9, и если да, то как? –