Racket中的重叠模块导入



我想加载一个图像并在Racket中为其设置动画。我可以在Dr.Racket中轻松完成,但我使用的是带有Geiser的Emacs。要加载图像,我需要:

(require racket/draw)

接下来,为了在屏幕上绘制这个图像,我计划使用大爆炸模块。要加载此模块,我必须:

(require 2thdp/image)

但我得到了这个错误:

module: identifier already imported from: 2htdp/image
at: make-pen
in: racket/draw
errortrace...:

这基本上意味着我不能两次导入同一个模块。但我需要这两个图书馆。如何避免这个问题?

当两个模块提供相同名称的函数时,可以在导入时重命名这些函数。

一个简单的方法是重命名其中一个模块中的所有函数,并使用一些通用前缀重命名所有函数。您可以使用prefix-in修饰符对require:执行此操作

(require racket/draw)
(require (prefix-in htdp: 2htdp/image))
make-pen      ; the `make-pen` from racket/draw
htdp:make-pen ; the `make-pen` from 2htdp

顺便说一句,:没有什么特别之处,它只是我见过的一种惯例。前缀可以是(比如)htdp-,而不是htdp:。无论您使用什么,它都是该模块提供的每个名称的前缀。

如果只有一个函数名称冲突,则可以使用rename-in仅重命名其中一个模块中的一个函数。

有关详细信息,请参阅require