2014-02-03 2 views
0

Можно ли переименовать пространство имен, которое уже загружено?Переименование пространства имен в Clojure

В моем случае у меня есть Clojure скрипт с пространством имен, скажем main-xxx, а также множество других сценариев, которые используют main пространство имен (изменяя их не представляется возможным, main и main-xxx Пространства имен имеют одни и те же функции, но с различными реализациями).

Что бы я хотел сделать, это сделать что-то вроде (alias 'main 'main-xxx) - но для того, чтобы это сработало, мне пришлось бы звонить alias в каждом скрипте (что не может быть сделано).

Любые идеи?

+0

Я не знаю, можно ли переименовать пространство имен, и если бы это было возможно, я думаю, что это была бы плохая идея. Вы можете использовать 'in-ns',' unalias' и 'alias' для изменения сопоставлений пространства имен в ns, которые вы не можете редактировать, но это все еще низкое решение для простое создание новой версии пространства имен (даже если вы не можете отредактируйте его, вы можете вручную внести измененную версию, которую можно редактировать). – noisesmith

+0

Да, мне понадобится псевдоним «global» или «inherited». Но, если я правильно понимаю, таких вещей нет в Clojure. –

+0

Прагматично, я думаю, вы могли бы использовать протоколы, чтобы получить то, что вы хотите - если код написан с точки зрения функций какого-либо протокола, тогда клиент может поменять реализацию этого протокола по своему усмотрению. – noisesmith

ответ

1

Это не будет работать так, как вы хотите. Вы можете указатьв качестве псевдонима в каждом пространстве имен (вы просто внутри каждого пространства имен и вызывать его), но наложение не влияет на функции, определенные перед псевдонимом - их привязки уже относятся к vars исходного пространства имен. Вам нужно будет на самом деле переопределить vars пространства имен, чтобы изменить, какие функции вызывают через них.

Смежные вопросы