Modyfikacja czytnika pozwoliłaby na wprowadzenie nowej składni odczytu (takiej jak #(hash table)i '(quoted)). Wiele Lisps ma taką możliwość, ale wydaje się, że nie ma takiej możliwości dla elisp.
Modyfikacja czytnika pozwoliłaby na wprowadzenie nowej składni odczytu (takiej jak #(hash table)i '(quoted)). Wiele Lisps ma taką możliwość, ale wydaje się, że nie ma takiej możliwości dla elisp.
Odpowiedzi:
Okazuje się, że instrukcja sugeruje, że nie można tak naprawdę robić makr czytników.
Zgodnie z dodatkiem C Porting Common Lisp :
Makra czytelników. Common Lisp zawiera drugi typ makra, który działa na poziomie pojedynczych znaków. Na przykład Common Lisp implementuje notację cytatu przez makro czytelnika o nazwie ', podczas gdy parser Emacsa Lispa traktuje cytat jako szczególny przypadek. Niektóre pakiety Lisp używają makr czytników, aby tworzyć dla siebie specjalne składnie, których parser Emacsa nie jest w stanie odczytać.
syntax.c...
Najwyraźniej można to zrobić, ale przygotuj się na dużo pracy. (lub nie, bo poradzę sobie z tym w weekend ;-).
(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))
Teraz „wszystko”, co pozostało do zrobienia, to wdrożyć kompletny czytnik Lisp, który obsługuje wszystko, co robi Elisp i cokolwiek chcesz więcej. Myślę, że można to wykorzystać do dostarczenia defpackagesymboli CL i wewnętrznych symboli, jako jednego z przykładów. Specjalna składnia wyrażeń regularnych to coś, co bardzo chcę zrobić (a dokładniej, niektóre składnie łańcuchowe, które nie interpretują ukośników odwrotnych).
Edycja: oto implementacja sprawdzonej koncepcji: https://github.com/mishoo/elisp-reader.el