Змінення читача дозволило б ввести новий синтаксис читання (наприклад, #(hash table)
та '(quoted)
). Багато Lisps мають таку можливість, але, схоже, не існує такої можливості для Elisp.
Змінення читача дозволило б ввести новий синтаксис читання (наприклад, #(hash table)
та '(quoted)
). Багато Lisps мають таку можливість, але, схоже, не існує такої можливості для Elisp.
Відповіді:
Виявляється, керівництво означає, що ви не можете дійсно робити макроси для читання.
Згідно з додатком C Porting Common Lisp :
Макроси для читання. Загальний 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 і все, що ви хочете більше. Я думаю, що це може бути використане для надання defpackage
внутрішніх символів, подібних до CL та упаковки, як одного із прикладів. Крім того, спеціальний синтаксис для регулярних виразів - це те, що я дуже хочу зробити (а точніше - синтаксис рядків, який не інтерпретує зворотні риски).
Редагувати: ось реалізація концепції підтвердження: https://github.com/mishoo/elisp-reader.el