gpt4 book ai didi

scheme - 加载定义值的文件会覆盖顶级绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 01:35:27 26 4
gpt4 key购买 nike

如果我有一个文件 test.scm:

(define foo 5)

然后使用 REPL:

(define foo 2)

foo
==> 2

(define bar
(lambda ()
(load "test.scm")
foo))

foo
==> 2

(bar)
==> 5

foo
==> 5

换句话说,在一个词法上下文中加载文件允许绑定(bind)转义到顶层。为什么会这样,有没有办法按照 C #include 包含另一个文件,即执行命令,就好像它们当时已拼接到代码中一样?

最佳答案

如果 load 执行的代码能够访问 load 形式的词法上下文,那么它就不是一个词法上下文.

如果 load 是宏而不是函数,情况会有所不同 - 但即便如此,标准 R5RS 宏也是卫生的,不会轻易扰乱词法上下文。

但是,您可以编写一个 defmacro 样式的宏,通过读取文件并返回包含从文件中读取的所有内容的 begin 表单来完成您所要求的操作。

示例代码:

(define-macro (include file)
(let ((read-forms
(lambda ()
(let loop ((forms '()))
(let ((form (read)))
(if (eof-object? form)
(reverse forms)
(loop (cons form forms))))))))
(with-input-from-file file
(lambda ()
(cons 'begin (read-forms))))))

请注意,define-macro 是非标准的。您必须根据您的方案实现来弄清楚它是否以及如何工作。

关于scheme - 加载定义值的文件会覆盖顶级绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6985777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com