В: Почему у elisp нет пространств имен, и как мы можем их получить?
У Elisp нет пространств имен, кроме глобального, что привело к соглашению о кодировании, заключающемуся в том, что все глобальные функции, переменные и константы имеют префикс с уникальным префиксом.
Помимо фактора раздражения, это также поразило меня как проблему, которая проявляется в связи с 1) постоянно растущим числом замечательных библиотек и пакетов и 2) продолжающимся существованием унаследованных функций и переменных, которые либо не соблюдают соглашение о префиксах, либо достаточно уникальны, так что на самом деле нет хорошего префикса, который они могли бы использовать. Это также означает, что периодические попытки рационализировать старый код (как при переходе от cl
к cl-lib
) - это нетривиальный объем работы. (Хотя я рад за уборку, я все еще плачу каждый раз, когда набираю что-то вроде cl-find
).
Я начал ковыряться, чтобы узнать, смогу ли я узнать, почему elisp все еще не имеет пространств имен после нескольких десятилетий использования, но был немного удивлен скромным урожаем. Вики - страница на пространствах имен является довольно короткой. У Ник Ферье есть немного более длительный подход к этой проблеме, и на emacs-devel также есть довольно свежая ветка . Существует старый поток Stack Overflow 2010 года, в котором обсуждается возможность использования макросов для реализации пространств имен; другой пример макроподхода можно найти здесь . Существует как минимум пара реализаций ( здесь и здесь , с описанием последних здесь), но они не видели много активности в течение нескольких лет, и я не сталкивался с библиотеками, которые их используют.
Я предполагаю, что, если бы добавить пространства имен было легко, это уже было бы сделано. Так:
- Каковы технические барьеры для добавления пространств имен в elisp?
- Не нарушит ли добавление пространств имен существующий код?
- Является ли эта функциональность чем-то, что должно быть органичным для elisp (изменения в самом интерпретаторе), или она действительно может быть построена поверх макросов?
Ответы:
Почему нет пространств имен?
Потому что это сложно, и никто не посчитал это достаточно срочным, чтобы сделать полный шаг. Это обсуждалось в списке разработчиков ранее (более одного раза), и были обещания исправить это после перехода на git.
Тем временем я написал собственное решение (список вариантов см. Ниже).
Каковы технические барьеры?
Прямо за дверью у вас есть 3 больших препятствия, которые вам нужно преодолеть, чтобы пространства имен даже имели возможность работать с текущим Emacs:
package.el
потребностями, должна понимать пространства имен.Исправление этих трех вещей для работы, как бы вы ни реализовали пространства имен, не тривиально. Если вы посвящены только самой последней версии Emacs, это, безусловно, выполнимо. Если вы хотите написать какой-то пакет, который также поддерживает предыдущие версии (например, все 24 семейства), это превращается в один адский вызов.
Помимо этого, есть множество других дополнительных препятствий. Elisp великолепен, потому что обладает всеми возможностями доступных вам инструментов, и ВСЕ из них необходимо будет исправлять для работы с пространствами имен. Среди наиболее важных:
Это сломало бы много существующего кода?
Нет, если вы делаете это правильно.
Это что-то, что должно быть органическим или действительно может быть построено поверх макроса?
В идеале это было бы органично, это то, что обычно обсуждается, когда появляется в списке разработчиков. Но это может быть сделано достаточно хорошо, будучи построенным сверху.
Вот несколько примеров этого, взятых из этого списка :
источник
names
решение. Интересно, есть ли основание полагать , что органические, встроенный в растворе приходят в не слишком отдаленном будущем, или если мы просто должны принять встроенную на решении , которое вы ввели.nameless
в этот список :) Это блестящая идея, и она решает проблему очень аккуратно.В прошлый раз, когда это обсуждалось на emacs-devel, обсуждение прекратилось, когда такие люди, как Ларс, указали, что им нравится быть способными
M-x grep
на что-то. Добавление пространств имен в Elisp не должно быть слишком сложным, но получение всех знакомых инструментов для правильной работы с ними - другая проблема.источник