Как бороться с конфликтами имен в Racket? - PullRequest
0 голосов
/ 06 февраля 2019

Изучая Racket, я наткнулся на пакет gregor , в котором говорится, что его структура date конфликтует со встроенной структурой date:

Грегор предоставляетструктура даты, представляющая календарную дату без часового пояса или часового пояса.К сожалению, дата имени конфликтует с существующим несовместимым определением в ракетке / базе.

Прежде чем я сделаю (require gregor), я получу встроенный date.После (require gregor) я встречаюсь с Грегором.Это нормально.

Но в интересах понимания того, как бороться с конфликтами и пространствами имен, могу ли я получить доступ к встроенному date?Можно ли как-то поместить Грегора в пространство имен, чтобы я мог использовать оба?Какой идиоматический способ борьбы с этим?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Сначала require переопределяет базовый пакет импортируемых языков.Таким образом, в отличие от стандартной схемы, где вам нужно переименовать или исключить из базового пакета, вы можете require, и если конфликтующее имя не из другого require, оно работает.

Представьте, что я использую #!racket/base througout в качестве языка.Итак, давайте представим, что вы хотите сделать это:

(require racket) ; now date it will conflict
(require gregor)

Я просто нажимаю Run и вижу, что происходит.Итак, я получил ошибку, что 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? и date, я бы сделал это:

(require (rename-in racket [date? rb:date?] [date rb:date]))
(require gregor)

Таким образом, у нас есть date? и date как rb:date? и rb:date при сохранении всех других привязок, таких как second, как есть.

Вы можете смешивать и сочетать, и обычно вы выбираете самое простое решение для предоставления именно того, что вы хотите.Больше способов сделать это в codumentation для require и provide

0 голосов
/ 06 февраля 2019

Вы можете переименовать все требуемые идентификаторы, чтобы они не конфликтовали.

(require (rename-in gregor [date gregor-date]))
date ;; Racket's date
gregor-date ;; gregor's date

Но быстрое решение - это префикс каждого требуемого идентификатора (что в некотором смысле создает "пространство имен")

(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

...