Чому у Elisp немає просторів імен?


40

Питання: Чому у Elisp немає просторів імен, і як ми могли їх отримати?

У Elisp немає просторів імен, крім глобальних, що призвело до конвенції кодування префіксації всіх глобальних функцій, змінних та констант унікальним префіксом.

Окрім фактора роздратування, це також вражає мене проблемою закипання, що дається 1) постійно зростаючою кількістю великих бібліотек та пакетів та 2) постійним існуванням спадкових функцій та змінних, які або не дотримуються конфігурації префікса, або є достатньо ідіосинкратичними, що насправді не існує хорошого варіанта префікса, який вони могли б використати. Це також означає, що періодичні спроби раціоналізувати старіші коди (як і при переході від clдо cl-lib) є нетривіальним обсягом роботи. (Хоча я радий за прибирання, я все одно проливаю сльозу кожен раз, коли я набираю щось на кшталт cl-find).

Я пішов обдумувати, щоб дізнатись, чому після кількох десятиліть використання у Elisp все ще немає просторів імен, але трохи здивувався скромному врожаю. Сторінка вікі в просторах імен досить коротка. Nic Ferrier має дещо довше питання щодо вирішення цього питання, і на ньому також є доволі недавня тема щодо emacs-devel . Є стара нитка переповнення стека з 2010 року, яка обговорює можливість використання макросів для реалізації просторів імен; інший приклад макро підходу можна знайти тут . Існує хоча б пара реалізацій ( тут і тут , з описом останніх тут) там, але вони не спостерігали особливої ​​активності протягом двох років, і я не натрапляв на жодні бібліотеки, які ними користуються.

Я припускаю, що якби додати простори імен було легко, це вже було б зроблено. Тому:

  • Які технічні бар'єри для додавання просторів імен до elisp?
  • Чи додавання просторів імен порушить багато існуючого коду?
  • Це функціональність, яка повинна бути органічною для elisp (зміни самого інтерпретатора), чи вона справді може бути побудована зверху за допомогою макросів?

6
Ви можете подивитися на це: github.com/Bruce-Connor/names Здається, це сумісна назад (із поточним ручним способом розділення імен) реалізація автоматичних просторів імен. (І я на 99% впевнений, що я бачив ще одну подібну бібліотеку, яка дозволяє розробникові експортувати підмножину функцій з просторами імен, згаданих нещодавно в деяких блогах emacs, але я не зміг її знайти назад).
Т. Веррон

2
По-друге, ви повинні подивитися на посилання вище. Це дуже недавній (вийшов минулого місяця) і дуже надійний макрос простору імен. Я все ще опрацьовую кілька кінь щодо сумісності з такими інструментами, як edebug, але пакет працює. Відповідь на ваше запитання - це справді довгий нарис (технічних бар'єрів, з якими я стикався, було багато), але я спробую розмістити його в публікаціях блогу протягом наступних тижнів.
Малабарба

1
Я думаю, що простори імен означають різні речі. Я б сказав, що у Emacs є кілька просторів імен: один для змінних, інший для функцій та макросів, інший для облич та тем, і…
Харальд Ханш-Олсен

1
@ HaraldHanche-Olsen ви, звичайно, можете це сказати. У цьому контексті він запитує, чому немає просторів імен на один пакет.
Малабарба

Відповіді:


28

Чому немає просторів імен?

Тому що це складно, і ніхто ще не вважав це достатньо терміновим, щоб зробити повну занурення. Про це йшлося в списку розробників раніше (більше разів, ніж один), і були обіцянки виправити це після переходу на git.

Тим часом я написав власне рішення (перелік варіантів див. Нижче).

Які технічні бар'єри?

Тільки біля дверей у вас є три великі перешкоди, які вам потрібно перевершити, щоб простори імен навіть мали шанс працювати над поточним Emacs:

  • Потрібно змінити, як символи інтерновані (це найлегша частина).
  • Байтовий компілятор повинен розуміти простори імен.
  • Генерація автозавантаження використовується package.elдля розуміння просторів імен.

Виправлення цих 3 речей, з якими можна працювати, однак ви прийшли до впровадження просторів імен, не є тривіальним. Якщо ви присвячені лише останній версії Emacs, це, безумовно, можливо. Якщо ви хочете написати якийсь пакет, який також підтримує попередні версії (як, наприклад, ціла 24 сімейство), це перетворюється на пекельний виклик.

Крім цього, існує безліч інших необов'язкових перешкод. Elisp чудовий тому, що вся сила в доступних для вас інструментах, і ВСЕ з них потрібно буде виправити, щоб працювати з просторами імен. Серед найважливіших:

  • edebug
  • евал-дефун
  • eval-last-sexp
  • слиз

Чи зламає це чимало існуючого коду?

Не, якщо ви зробите це правильно.

Це щось, що має бути органічним, чи це справді може бути побудовано зверху за допомогою макросів?

В ідеалі це було б органічно, саме це зазвичай обговорюється, коли воно з’являється у списку розробників. Але це можна зробити досить хорошим, будуючи на вершині.
Ось кілька прикладів цього, взятих із цього списку :


1
Дякую - це було дуже інформативним питанням щодо цього питання. Мені цікаво ваше останнє питання: ваше namesрішення. Цікаво, чи є підстави вважати , що органічні, вбудований в розчині приходять в не надто віддаленому майбутньому, або якщо ми просто повинні прийняти вбудовану на вирішенні , яке ви ввели.
Дан

1
@Dan Так, є. . Це означає, що немає причин не приймати Імена тим часом. Він повністю сумісний з умовами Emacs, тому будь-який пакунок, що використовує Names , вільний у будь-який час припинити використовувати Імена , і користувач нічого не дізнається.
Малабарба

Вам справді слід додати namelessдо цього списку :) Це геніальна ідея, і вона дуже акуратно вирішує проблему.
Клімент

22

Востаннє це обговорювалося на emacs-devel, дискусія припинялася, коли люди, як Ларс, вказували, що їм подобається мати можливість M-x grepчогось. Додавання просторів імен до Elisp не повинно бути надто важким, але отримати всі звичні інструменти для їх правильного використання - ще одна проблема.


Я думаю, що це можна легко «виправити», створивши псевдоніми для найбільш часто використовуваних загальних функцій (або, можливо, всіх)
Jesse

1
Необхідність "grep" з'являється зазвичай під час розробки пакету, де вам потрібно знати, де змінна / функція може використовуватися в інших пакетах, тому вона може застосовуватися до будь-якої довільної змінної / функції, а не лише до конкретних важливих. З цієї причини додавання кількох псевдонімів не матиме значення. Ще одна причина, чому mit не допоможе, полягає в тому, що додавання псевдоніма не допоможе вам знайти способи, які не використовують цей псевдонім.
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.