Сначала 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