我正试图使用Chez Scheme并用它运行程序,但我遇到了一件我无法理解的事情。比方说,我想有一个scheme程序,它可以做一些事情,定义一些函数,然后运行REPL。这就是我刚刚玩过的东西:
(import (chezscheme))
(define test-function
(lambda (x y)
(+ (* 2 x) y)))
(display (test-function 3 4))
(new-cafe)
不做任何花哨的事情,只定义一个函数,显示一个测试输出,然后使用新的cafe启动REPL(我在Chez Scheme文档中找到了它(。这是我的问题,如果我使用--script
:运行它,这会很好
$ scheme --script test.ss
10
> (test-function 5 6)
16
但是当我以--program
:的形式运行REPL时,它内部并没有定义test-function
$ scheme --program test.ss
10
> (test-function 5 6)
Exception: variable test-function is not bound
Type (debug) to enter the debugger.
但是,请注意,它确实打印了10,所以(test-function 3 4)
在test.ss
中工作,只是在(new-cafe)
中不工作。
这里有一些基本的东西我不理解。--script
和--program
之间到底有什么区别,为什么REPL在以--program
运行时不能识别(test-function)
(即使它在(new-cafe)
之外被识别(?
--script
在可变交互环境中一次计算一个表达式。
--program
评估表达式,就好像它们被包装在top-level-program
形式中一样
CCD_ 15在交互环境中评估其表达式。top-level-program
表单中的定义不会影响交互环境,因此new-cafe
看不到它们。
你需要做的是
- 制作了一个包含CCD_ 18的环境
- 将
interaction-environment
参数化为该环境,然后 - 评价CCD_ 20
为了创建包含test-function
的环境,必须从库中导出test-function
。最简单的方法是创建一个单独的文件。
mylib.ss
(library (mylib)
(export test-function)
(import (chezscheme))
(define test-function
(lambda (x y)
(+ (* 2 x) y))))
测试.ss
(import (chezscheme))
(parameterize ([interaction-environment
(copy-environment (environment '(chezscheme) '(mylib)) #t)])
(new-cafe))
$ scheme --program test.ss
> (test-function 5 6)
16