В: Почему у elisp нет пространств имен, и как мы можем их получить?
У Elisp нет пространств имен, кроме глобального, что привело к соглашению о кодировании, заключающемуся в том, что все глобальные функции, переменные и константы имеют префикс с уникальным префиксом.
Помимо фактора раздражения, это также поразило меня как проблему, которая проявляется в связи с 1) постоянно растущим числом замечательных библиотек и пакетов и 2) продолжающимся существованием унаследованных функций и переменных, которые либо не соблюдают соглашение о префиксах, либо достаточно уникальны, так что на самом деле нет хорошего префикса, который они могли бы использовать. Это также означает, что периодические попытки рационализировать старый код (как при переходе от cl
к cl-lib
) - это нетривиальный объем работы. (Хотя я рад за уборку, я все еще плачу каждый раз, когда набираю что-то вроде cl-find
).
Я начал ковыряться, чтобы узнать, смогу ли я узнать, почему elisp все еще не имеет пространств имен после нескольких десятилетий использования, но был немного удивлен скромным урожаем. Вики - страница на пространствах имен является довольно короткой. У Ник Ферье есть немного более длительный подход к этой проблеме, и на emacs-devel также есть довольно свежая ветка . Существует старый поток Stack Overflow 2010 года, в котором обсуждается возможность использования макросов для реализации пространств имен; другой пример макроподхода можно найти здесь . Существует как минимум пара реализаций ( здесь и здесь , с описанием последних здесь), но они не видели много активности в течение нескольких лет, и я не сталкивался с библиотеками, которые их используют.
Я предполагаю, что, если бы добавить пространства имен было легко, это уже было бы сделано. Так:
- Каковы технические барьеры для добавления пространств имен в elisp?
- Не нарушит ли добавление пространств имен существующий код?
- Является ли эта функциональность чем-то, что должно быть органичным для elisp (изменения в самом интерпретаторе), или она действительно может быть построена поверх макросов?