【发布时间】:2019-01-13 22:57:52
【问题描述】:
我正在运行 Chez Scheme 9.5 并尝试在 图书馆。这是一个例子:
(library (forlib)
(export for)
(import (rnrs (6)))
(define-syntax for
(syntax-rules (in)
[(for x in lst body1 body2 ...)
(for-each (lambda (x) body1 body2 ...) lst)])))
我将它保存在文件 forlib.ss 中并从同一目录运行 chez。
然后在 REPL 中,我得到了这个:
> (import (forlib))
> (for x in '(1 2 3) (display x))
Exception: invalid syntax (for x in (quote (1 2 3)) (display x))
Type (debug) to enter the debugger.
如果我将语法定义更改为
(define-syntax for
(syntax-rules ()
[(for x lst body1 body2 ...)
(for-each (lambda (x) body1 body2 ...) lst)])))
(没有in 关键字),一切正常:
> (import (forlib))
> (for x '(1 2 3) (display x))
123
> _
回到旧定义 in 关键字。
如果我把测试代码放到一个测试文件中:
;;; test-for.ss
(import (rnrs (6))
(forlib))
(for x in '(1 2 3) (display x))
并尝试执行该文件,结果取决于我如何执行该文件。
如果我使用chez --program 运行这个程序,它会按预期工作:
$ chez --program test-for.ss
123
$ _
如果我使用chez --script 运行它,我会得到与上面相同的错误:
$ chez --script test-for.ss
Exception: invalid syntax (for x in (quote (1 2 3)) (display x)) at line 6, char 1 of test-for.ss
$ _
这提出了两个问题:
- 为什么 REPL 和
--script在导入语法形式时没有问题 特殊关键字,但拒绝接受具有特殊的语法形式 关键字? -
--script和--program之间到底有什么区别?这 用户手册说--program表示文件内容被解释 作为一个 rnrs 顶级程序,但对它的语义保持沉默--script是。
最后,如果我输入上面的语法定义,请完成我的困惑 直接在 REPL 中,然后一切都按预期工作:
> (define-syntax for
(syntax-rules (in)
[(for x in lst body1 body2 ...)
(for-each (lambda (x) body1 body2 ...) lst)])))
> (for x in '(1 2 3) (display x))
123
> _
那么从 直接在 REPL 中定义的库和语法转换器?
【问题讨论】:
-
forlib 需要导出 'in' 和 'for'
-
@ChrisVine:这只是解决方案的一部分。如果我按照您的建议尝试导出
in,我会收到错误消息,因为forlib中没有定义要导出的名称。正如下面@gmw 所指出的,要使其工作,forlib必须创建一个可以导出的虚拟名称in。 -
在检查这一点时,你是对的。看到这个:cisco.github.io/ChezScheme/csug9.5/use.html#./use:s14。我很幸运在我的代码中使用了辅助关键字,因为它们已经由 chezscheme 定义,并且我正在宏中重新绑定它们。在这种情况下,我需要做的就是导出它们。
标签: scheme r6rs chez-scheme