Racket 加载模块而不在顶层评估其主体

Racket 加载模块而不在顶层评估其主体,racket,Racket,我有这个档案: #lang racket (provide install global-var) (define global-var 'test) (define (install) (set! global-var '(aaa))) (install) 然后我启动repl,输入so: Welcome to Racket v5.3.5. > (define global-var "test007") > global-var "test007" > (requ

我有这个档案:

#lang racket

(provide install global-var)

(define global-var 'test)

(define (install)
  (set! global-var '(aaa)))

(install)
然后我启动
repl
,输入so:

Welcome to Racket v5.3.5.
> (define global-var "test007")
> global-var
"test007"
> (require "test.rkt")
'(install)
> global-var
'test
是否可以只从文件
test.rkt
中加载一些定义,这样加载不会更改
global var
的值,仅当我在加载后调用自己
(安装)


我只想使用标准的racket系统,不想使用默认情况下未安装在racket中的外部软件包。

简短的回答是:可能不会。您应该将racket模块视为导出某些函数的预编译代码包。顶层的任何表达式(如此处对“install”的调用)在概念上都是模块设置的一部分;允许用户在不运行设置代码的情况下使用这些定义将使模块编写器的假设无效——这对模块编写器来说不太好

举个例子,我有一个声音库;要求声音库模块初始化声音播放。如果有一种不运行此代码就加载模块的复杂方法,那么就会违反我的不变量


也许你可以解释一下为什么编辑源代码不方便?

简单的回答是:可能不会。您应该将racket模块视为导出某些函数的预编译代码包。顶层的任何表达式(如此处对“install”的调用)在概念上都是模块设置的一部分;允许用户在不运行设置代码的情况下使用这些定义将使模块编写器的假设无效——这对模块编写器来说不太好

举个例子,我有一个声音库;要求声音库模块初始化声音播放。如果有一种不运行此代码就加载模块的复杂方法,那么就会违反我的不变量


也许你可以解释一下为什么编辑源代码不方便?

简单的回答是:可能不会。您应该将racket模块视为导出某些函数的预编译代码包。顶层的任何表达式(如此处对“install”的调用)在概念上都是模块设置的一部分;允许用户在不运行设置代码的情况下使用这些定义将使模块编写器的假设无效——这对模块编写器来说不太好

举个例子,我有一个声音库;要求声音库模块初始化声音播放。如果有一种不运行此代码就加载模块的复杂方法,那么就会违反我的不变量


也许你可以解释一下为什么编辑源代码不方便?

简单的回答是:可能不会。您应该将racket模块视为导出某些函数的预编译代码包。顶层的任何表达式(如此处对“install”的调用)在概念上都是模块设置的一部分;允许用户在不运行设置代码的情况下使用这些定义将使模块编写器的假设无效——这对模块编写器来说不太好

举个例子,我有一个声音库;要求声音库模块初始化声音播放。如果有一种不运行此代码就加载模块的复杂方法,那么就会违反我的不变量


也许您可以解释为什么编辑源代码不方便?

为什么不直接从模块中删除
(安装)
行?您希望在需要时何时运行此功能?这就是问题所在。我想进行某种延迟加载,将模块加载为thunk,加载后我可以发送一些消息,这样可以评估模块的某些部分。对我来说,更直接的做法是不删除
(安装)
。我发现这个:。我认为加载到一个新的名称空间是有效的,方法是评估我需要从这个新的nspace中得到什么。我现在试试,看看这是否解决了我的问题。我不确定这是否会改变全局名称空间。在这种情况下,不是很好。为什么不从模块中删除
(安装)
行?您希望在需要时何时运行此功能?这就是问题所在。我想进行某种延迟加载,将模块加载为thunk,加载后我可以发送一些消息,这样可以评估模块的某些部分。对我来说,更直接的做法是不删除
(安装)
。我发现这个:。我认为加载到一个新的名称空间是有效的,方法是评估我需要从这个新的nspace中得到什么。我现在试试,看看这是否解决了我的问题。我不确定这是否会改变全局名称空间。在这种情况下,不是很好。为什么不从模块中删除
(安装)
行?您希望在需要时何时运行此功能?这就是问题所在。我想进行某种延迟加载,将模块加载为thunk,加载后我可以发送一些消息,这样可以评估模块的某些部分。对我来说,更直接的做法是不删除
(安装)
。我发现这个:。我认为加载到一个新的名称空间是有效的,方法是评估我需要从这个新的nspace中得到什么。我现在试试,看看这是否解决了我的问题。我不确定这是否会改变全局名称空间。在这种情况下,不是很好。为什么不从模块中删除
(安装)
行?您希望在需要时何时运行此功能?这就是问题所在。我想进行某种延迟加载,将模块加载为thunk,加载后我可以发送一些消息,这样可以评估模块的某些部分。对我来说,更直接的做法是不删除
(安装)
。我发现这个:。我认为加载到一个新的名称空间是有效的,方法是评估我需要从这个新的nspace中得到什么。我现在试试,看看这是否解决了我的问题。我不确定这是否会改变全局名称空间。在这种情况下,不是很好。我有很多文件,它们以树的形式存在依赖关系。每个文件都会向全局变量添加一些内容,一些文件会重置全局变量。这些文件就是问题所在。我无法加载2个这样的文件