Como posso modificar o leitor do Elisp?


12

Modificar o leitor permitiria introduzir nova sintaxe de leitura (como #(hash table)e '(quoted)). Muitos Lisps têm essa capacidade, mas parece que esse recurso não existe para o elisp.


Hackear as fontes C.
wasamasa

3
O Emacs Lisp não possui um leitor programável por Lisp.
Tirou

@wasamasa Bem, isso é sempre uma opção :) Não é portátil , mas é uma opção.
Sean Allred

Eu acho que "muitos Lisps têm isso". não é uma pergunta real. Eu preferiria muito ter uma pergunta real. Sugiro encurtar o título e reformulá-lo no corpo.
YoungFrog

Edições do @YoungFrog são bem-vindas. Eu não conseguia pensar em nada mais direto ou apropriado sem ser excessivamente prolixo. A questão é simples; não precisa ser longo.
Sean Allred

Respostas:


11

Acontece que o manual implica que você não pode realmente executar macros de leitor.

De acordo com o Apêndice C Portando Common Lisp :

Macros do leitor. O Lisp comum inclui um segundo tipo de macro que funciona no nível de caracteres individuais. Por exemplo, Common Lisp implementa a notação de citação por uma macro de leitor chamada ', enquanto o analisador do Emacs Lisp apenas trata citação como um caso especial. Alguns pacotes Lisp usam macros de leitor para criar sintaxes especiais para si mesmos, que o analisador do Emacs é incapaz de ler.


Eu acho que isso é sobre o software Common Lisp, que usa macros especiais de leitor, em vez de Elisp. A página é sobre como portar o código CL para o Elisp. E sim, oficialmente o leitor não é personalizável, mas ver minha resposta abaixo ...
Mishoo

O outro problema aqui é mesmo se você de alguma forma introduziu nova sintaxe leitor, o resto do Emacs não tem conhecimento de que, assim que você vai precisar para correção syntax.c, também ...
wasamasa

9

Aparentemente, isso pode ser feito, mas prepare-se para muito trabalho. (ou não, porque eu vou lidar com isso algum fim de semana ;-).

(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))

Agora, "tudo" que resta a fazer é implementar um leitor Lisp completo que suporte tudo o que o Elisp faz e o que você quiser mais. Eu acho que isso poderia ser usado para fornecer defpackagesímbolos internos do tipo CL e empacotar, como um exemplo. Além disso, uma sintaxe especial para regexps é algo que eu quero muito fazer (ou mais exatamente, alguma sintaxe de string que não interpreta barras invertidas).

Edit: aqui está uma implementação de prova de conceito: https://github.com/mishoo/elisp-reader.el


Provavelmente, é melhor não postar isso como resposta até que você tenha realmente implementado um leitor Lisp completo, como sugeriu (o que, suponho, não é uma empresa trivial).
Dan

@ Dan É factível, é que fazê-lo em C é muito mais doloroso, pois é uma porcaria para o processamento de strings.
wasamasa

1
@ Dan conseguiu, editei a resposta para adicionar o link à implementação.
Mishoo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.