我想加载一个图像并在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
。