Модификация читателя позволит ввести новый синтаксис чтения (например, #(hash table)
и '(quoted)
). У многих Лиспов есть такая возможность, но для elisp, похоже, нет такой возможности.
Модификация читателя позволит ввести новый синтаксис чтения (например, #(hash table)
и '(quoted)
). У многих Лиспов есть такая возможность, но для elisp, похоже, нет такой возможности.
Ответы:
Оказывается, что руководство подразумевает, что вы на самом деле не можете делать макросы для чтения.
Согласно Приложению C Портирование Common Lisp :
Считыватель макросов. Common Lisp включает второй тип макросов, который работает на уровне отдельных символов. Например, Common Lisp реализует нотацию кавычек с помощью макроса читателя под названием ', тогда как парсер Emacs Lisp просто рассматривает кавычку как особый случай. Некоторые пакеты Lisp используют макросы читателей для создания для себя специальных синтаксисов, которые парсер Emacs не способен прочитать.
syntax.c
...
Видимо, это можно сделать, но подготовиться к большой работе. (или нет, потому что я собираюсь заняться этим в выходные дни ;-).
(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