Racket中的模块重叠导入

11

我想在Racket中加载并对图片进行动画处理。在Dr. Racket中这很容易实现,但我正在使用带有Geiser的Emacs。为了加载图片,我需要:

(require racket/draw)

接下来,为了将这张图片绘制到屏幕上,我打算使用 big-bang 模块。要加载此模块,我需要执行以下步骤:

(require 2thdp/image)

但我收到了这个错误:

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

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

1个回答

17

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

一个简单的方法是从其中一个模块中重命名 所有 函数,并使用某个公共前缀来重命名它们。您可以使用 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

1
请纠正我,但这个传统是来自于CL的包,对吗? - daniel gratzer
很多时候,我对Racket解决问题的简单(至少对于用户而言)和优雅感到惊讶。这是另一个很好的例子。 - Zelphir Kaltstahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接