在学习球拍时,我遇到了gregor软件包,该软件包说其date
结构与内置date
结构冲突:
Gregor提供了一个日期结构,该结构表示日历日期,而没有 一个时间或时区。不幸的是,名称日期与 球拍/底座中存在不兼容的现有定义。
在执行(require gregor)
之前,我先获得了内置的date
。 (require gregor)
之后,我得到了格里高尔的日期。很好。
但是,为了理解如何处理冲突和名称空间,我是否可以访问内置的date
?我可以以某种方式将gregor放入命名空间中,以便可以同时使用两者吗?处理这个的惯用方式是什么?
答案 0 :(得分:3)
您可以重命名每个必需的ID,以免它们冲突。
(require (rename-in gregor [date gregor-date]))
date ;; Racket's date
gregor-date ;; gregor's date
但是一种快速的解决方案是在每个必需的id之前加上前缀(从某种意义上说,这会创建“命名空间”)
(require (prefix-in gregor: gregor))
date ;; Racket's date
gregor:date ;; gregor's date
答案 1 :(得分:2)
首先require
会覆盖基本软件包中导入的语言。因此,与标准方案不同,在标准方案中,您需要重命名或从基本包中排除,可以require
,并且只要冲突的名称不是来自另一个require
,它就可以工作。
想象一下,我将#!racket/base
用作语言。因此,假设您要执行此操作:
(require racket) ; now date it will conflict
(require gregor)
我只需要按运行,看看发生了什么。所以我收到一个错误,指出date?
是一个冲突,因此我选择忽略它:
(require (except-in racket/base date?))
(require gregor)
我仍然遇到冲突date
,所以我将其添加到异常中:
(require (except-in racket date? date))
(require gregor)
现在我们可以使用某些东西了,但是您不能使用date?
中的date
和racket
现在,如果您想同时使用两者,则可能需要添加前缀:
(require (prefix-in rb: racket))
(require gregor)
这将像rb:date
那样绑定racket/base
,但也将包含rb:second
等。如果您只想重命名date?
和{{1 }}我会这样做的:
date
像这样,我们将(require (rename-in racket [date? rb:date?] [date rb:date]))
(require gregor)
和date?
分别设为date
和rb:date?
,同时保持所有其他绑定,例如rb:date
。