Как я могу изменить читатель Elisp?

12

Модификация читателя позволит ввести новый синтаксис чтения (например, #(hash table)и '(quoted)). У многих Лиспов есть такая возможность, но для elisp, похоже, нет такой возможности.

Шон Оллред
источник
Взломайте C-источники.
Васамаса
3
Emacs Lisp не имеет программируемого на Lisp читателя.
Дрю
@ wasamasa Ну, это всегда вариант :) Не портативный , но вариант.
Шон Оллред
Я думаю, "У многих Лиспов есть это". это не актуальный вопрос. Я бы предпочел иметь реальный вопрос. Я предлагаю сократить заголовок и перефразировать его в текст.
YoungFrog
@YoungFrog редактирование приветствуется. Я не мог придумать ничего более прямого или уместного, не будучи слишком многословным. Вопрос прост; это не должно быть долго.
Шон Оллред

Ответы:

11

Оказывается, что руководство подразумевает, что вы на самом деле не можете делать макросы для чтения.

Согласно Приложению C Портирование Common Lisp :

Считыватель макросов. Common 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, и все, что вы хотите больше. Я думаю, что это можно использовать для предоставления CL-подобных defpackageи пакетных внутренних символов, как один из примеров. Кроме того, я очень хочу сделать специальный синтаксис для регулярных выражений (или, точнее, некоторый строковый синтаксис, который не интерпретирует обратную косую черту).

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

Mishoo
источник
Вероятно, лучше не публиковать это как ответ до тех пор, пока вы на самом деле не внедрили полный читатель Lisp, как вы предложили (что, я полагаю, не является тривиальным предприятием).
Дан
@Dan Это выполнимо, просто делать это на C гораздо сложнее, чем отстойно для обработки строк.
Васамаса
1
@ Дан получил это работает, я отредактировал ответ, чтобы добавить ссылку на реализацию.
Mishoo