P: Dlaczego elisp nie ma przestrzeni nazw i jak możemy je zdobyć?
Elisp nie ma przestrzeni nazw innych niż globalna, co doprowadziło do konwencji kodowania polegającej na prefiksowaniu wszystkich globalnych funkcji, zmiennych i stałych unikalnym prefiksem.
Oprócz czynnika irytacji, wydaje mi się to również kwestią duszenia się, biorąc pod uwagę 1) stale rosnącą liczbę wielkich bibliotek i pakietów oraz 2) ciągłe istnienie starszych funkcji i zmiennych, które albo nie przestrzegają konwencji przedrostka, albo są wystarczająco idiosynkratyczni, że tak naprawdę nie ma dobrej opcji przedrostka, której mogliby użyć. Oznacza to również, że okresowe próby zracjonalizowania starszego kodu (jak w przypadku przejścia z cl
na cl-lib
) są nietrywialnym nakładem pracy. (Chociaż cieszę się z tego sprzątania, wciąż ronię łzę za każdym razem, gdy piszę coś takiego cl-find
).
Zacząłem się rozglądać, aby sprawdzić, czy po kilkudziesięciu latach użytkowania elisp nadal nie ma przestrzeni nazw, ale byłem trochę zaskoczony skromnymi zbiorami. Strona wiki w przestrzeniach nazw jest dość krótka. Nic Ferrier ma nieco dłuższe podejście do problemu, a także na temat emacs-devel . Istnieje stary wątek Przepełnienie stosu z 2010 roku, który omawia możliwość użycia makr do implementacji przestrzeni nazw; inny przykład podejścia makro można znaleźć tutaj . Istnieje co najmniej kilka implementacji ( tu i tutaj , wraz z opisem tych ostatnich tutaj), ale od kilku lat nie widzieli dużej aktywności i nie natknąłem się na biblioteki, które ich używają.
Zakładam, że gdyby dodanie przestrzeni nazw było łatwe, byłoby to już zrobione. Więc:
- Jakie są techniczne przeszkody w dodawaniu przestrzeni nazw do elisp?
- Czy dodanie przestrzeni nazw złamałoby wiele istniejących kodów?
- Czy ta funkcjonalność musi być organiczna, by ją wywołać (zmiany w samym interpreterie), czy może naprawdę można ją zbudować za pomocą makr?