【问题标题】:Generators in Chicken Scheme小鸡计划中的发电机
【发布时间】:2015-07-28 18:08:16
【问题描述】:

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

【问题讨论】:

    标签: scheme chicken-scheme


    【解决方案1】:

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

    因此,为了在 ideone 上进行测试,您必须将宏转换为显式重命名宏。

    【讨论】:

    • 更正:ideone 运行 CHICKEN 4.9,其语法案例 egg 不可用(它是遗留的 CHICKEN 3 egg)。
    • @sjamaan 感谢您的更正!有没有办法在 4.9 中使用syntax-case,如果可以,如何使用?
    • @chris-jester-young 不幸的是,(目前)没有办法这样做。语法案例非常多毛。它只有两个可移植的实现,并且都包含您的 Scheme 的整个宏和模块系统。这意味着您不能使用它们,除非您允许它们接管一切。我们在 CHICKEN 3 中使用了 psyntax 实现,这没问题,因为 CHICKEN 3 没有自己的模块/宏系统。在 CHICKEN 中使用 ER/IR 宏可能可以实现语法大小写,但还没有人敢尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多