Як я можу змінити читач Elisp?


12

Змінення читача дозволило б ввести новий синтаксис читання (наприклад, #(hash table)та '(quoted)). Багато Lisps мають таку можливість, але, схоже, не існує такої можливості для Elisp.


Злому джерел C.
wasamasa

3
Emacs Lisp не має програмованого зчитувача Lisp.
Дрю

@wasamasa Ну, це завжди варіант :) Не портативний , а варіант.
Шон Алред

Я думаю, "У багатьох Ліпсів це є". не є актуальним питанням. Я б хотів би мати справжнє запитання. Я пропоную скоротити заголовок і перефразувати його в основу.
ЯнгФрог

@YoungFrog редагує вітання. Я не міг придумати нічого більш прямого або підходящого, не будучи надмірно словним. Питання просте; це не повинно бути довгим.
Шон Аллред

Відповіді:


11

Виявляється, керівництво означає, що ви не можете дійсно робити макроси для читання.

Згідно з додатком C Porting Common Lisp :

Макроси для читання. Загальний Lisp включає в себе другий тип макросів, який працює на рівні окремих символів. Наприклад, Common Lisp реалізує позначення цитат макросом читача під назвою ', тоді як аналізатор Emacs Lisp просто трактує цитату як особливий випадок. Деякі пакети Lisp використовують макроси читачів, щоб створити для себе спеціальні синтаксиси, які аналізатор Emacs не може прочитати.


Я думаю, що мова йде про програмне забезпечення Common Lisp, яке використовує спеціальні макроси для читання, а не Elisp. Сторінка стосується перенесення коду CL в Elisp. І так, офіційно читач не настроюється, але дивіться мою відповідь нижче ...
mishoo

Інша проблема тут, навіть якщо ви якось ввели новий синтаксис читача, решта Emacs цього не знають, тому вам також потрібно буде виправити syntax.c...
wasamasa

9

Мабуть, це можна зробити, але підготуйтеся до великої роботи. (чи ні, тому що я з цим вирішусь у вихідні ;-).

(defvar *orig-read* (symbol-function 'read))

(defun read (&optional in)
  (message "reading from %s" load-file-name)
  (funcall *orig-read* in))

(setq load-read-function (symbol-function 'read))

Тепер "все", що залишилося зробити, це реалізувати повний читач Lisp, який підтримує все, що робить Elisp і все, що ви хочете більше. Я думаю, що це може бути використане для надання defpackageвнутрішніх символів, подібних до CL та упаковки, як одного із прикладів. Крім того, спеціальний синтаксис для регулярних виразів - це те, що я дуже хочу зробити (а точніше - синтаксис рядків, який не інтерпретує зворотні риски).

Редагувати: ось реалізація концепції підтвердження: https://github.com/mishoo/elisp-reader.el


Напевно, найкраще не розміщувати це як відповідь, поки ви фактично не реалізували повного читача Lisp, як ви запропонували (що, я думаю, не є тривіальним підприємством).
Дан

@Dan Це можливо, просто робити це в C набагато болючіше, як це затягує для оброблення рядків.
wasamasa

1
@Dan це працює, я відредагував відповідь, щоб додати посилання на реалізацію.
mishoo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.