Scheme 球拍中的重叠模块导入

Scheme 球拍中的重叠模块导入,scheme,racket,htdp,Scheme,Racket,Htdp,我想加载一个图像并在Racket中设置动画。我可以在Dr.Racket中轻松完成,但我正在使用Emacs和Geiser。要加载图像,我需要: (require racket/draw) 接下来,为了在屏幕上绘制这个图像,我计划使用大爆炸模块。要加载此模块,我必须: (require 2thdp/image) 但我得到了这个错误: module: identifier already imported from: 2htdp/image at: make-pen in: racket/draw

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

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

(require 2thdp/image)
但我得到了这个错误:

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

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

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

一种简单的方法是重命名其中一个模块中的所有函数,使用一些公共前缀重命名所有函数。您可以使用
中的
前缀将
修改为
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-
。无论您使用什么,它都会在该模块提供的每个名称前面加上前缀

如果只有一个函数名冲突,您可以使用
中的
重命名,从其中一个模块中重命名该函数


有关更多信息,请参见。

如果我错了,请纠正我的错误,但传统来自CL的软件包,对吗?因此,我经常惊讶于简单(至少对用户而言)和优雅的球拍解决了问题。这是另一个很好的例子。