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

时间:2014-09-15 22:29:10

标签: racket

我有这个文件:

#lang racket

(provide install global-var)

(define global-var 'test)

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

(install)

我开始repl,输入如此:

Welcome to Racket v5.3.5.
> (define global-var "test007")
> global-var
"test007"
> (require "test.rkt")
'(install)
> global-var
'test

是否可以从文件test.rkt加载仅一些定义,这样加载不会改变global-var的值,只有当我自己调用{{ 1}},我加载后?

我只想使用标准球拍系统,而不是默认情况下在球拍中没有安装的外包装。

1 个答案:

答案 0 :(得分:3)

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

举个例子,我有一个健全的图书馆;需要声音库模块初始化声音播放。如果在不运行此代码的情况下加载模块有一种棘手的方法,则会违反我的不变量。

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