如何处理球拍中的名称冲突?

时间:2019-02-06 00:21:48

标签: package racket conflict

在学习球拍时,我遇到了gregor软件包,该软件包说其date结构与内置date结构冲突:

  

Gregor提供了一个日期结构,该结构表示日历日期,而没有   一个时间或时区。不幸的是,名称日期与   球拍/底座中存在不兼容的现有定义。

在执行(require gregor)之前,我先获得了内置的date(require gregor)之后,我得到了格里高尔的日期。很好。

但是,为了理解如何处理冲突和名称空间,我是否可以访问内置的date?我可以以某种方式将gregor放入命名空间中,以便可以同时使用两者吗?处理这个的惯用方式是什么?

2 个答案:

答案 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

请参见https://docs.racket-lang.org/reference/require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._prefix-in%29%29

答案 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?中的dateracket 现在,如果您想同时使用两者,则可能需要添加前缀:

(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?分别设为daterb:date?,同时保持所有其他绑定,例如rb:date

您可以混合搭配,通常您会选择最简单的解决方案来提供所需的确切信息。在requireprovide

的共同化中,有更多的方法可以做到这一点。