鸡计划的发电机

时间:2015-07-28 18:08:16

标签: scheme chicken-scheme

此代码适用于codepad.org提供的Racket Scheme,在显示消息"意外返回"之前在连续行上显示数字1,2和3,但相同的确切代码无法使用ideone.com的鸡计划,我不明白Chicken Scheme提供的错误信息。如何使其与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)

1 个答案:

答案 0 :(得分:3)

鸡需要加载syntax-case egg才能支持insertBefore。但是,ideone没有安装那个鸡蛋,所以你不能在那里使用它。

因此,为了测试ideone,您将不得不将宏转换为显式重命名。