为什么我的(chez)scheme符号在与--program一起运行时不可见,而与--script一起运行



我正试图使用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

相关内容

  • 没有找到相关文章

最新更新