10

我想在 Racket 中加载图像并为其设置动画。我可以在 Dr. Racket 中轻松做到这一点,但我正在使用 Emacs 和 Geiser。要加载图像,我需要:

(require racket/draw)

接下来,为了将这个图像绘制到屏幕上,我打算使用 big-bang 模块。要加载此模块,我必须:

(require 2thdp/image)

但我得到这个错误:

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

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

4

1 回答 1

16

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

一种简单的方法是重命名一个模块中的所有函数,使用一些公共前缀重命名所有函数。您可以使用以下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:前缀可以是 (say) htdp-。无论您使用什么,它都会添加到该模块提供的每个名称之前。

如果只有一个函数名称发生冲突,您可以使用rename-in.

有关详细信息,请参阅require

于 2013-07-27T14:27:52.127 回答