scheme - Chicken计划中的生成器

标签 scheme chicken-scheme

此代码适用于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/

相关文章:

scheme - 如何使用方案在另一个函数中调用一个函数?

user-interface - Scheme 可以不用 Racket 做 GUI 吗?还是必须使用Common Lisp?

lisp - 在鸡方案中创建数据库

scheme - Chez 方案可以生成编译的二进制文件吗?

scheme - 如何静态链接使用扩展的 Chicken Scheme 程序?

scheme - 如何在方案中创建列表列表?

c# - 任何序列计算所需的最小序列集 "primitives"是多少?

lambda - 方案:如何测试对象是否是 lambda 表达式

macros - R6RS方案的make-variable-transformer有什么好处?

syntax - 鸡计划是否支持复数?如果是这样,为什么我会收到此错误?