首页 > 解决方案 > 如何处理 Racket 中的名称冲突?

问题描述

在学习 Racket 时,我遇到了gregor包,它说它的date结构与内置结构冲突date

Gregor 提供了一个日期结构,它表示没有时间或时区的日历日期。不幸的是,名称日期与球拍/基地中现有的、不兼容的定义冲突。

在我做之前(require gregor),我得到了内置的date. 之后(require gregor),我得到了 gregor 的约会。没关系。

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

标签: packageracketconflict

解决方案


您可以重命名每个必需的 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


推荐阅读