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.
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.
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 ;-).
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).
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.
Respostas:
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 :
fonte
syntax.c
, também ...Aparentemente, isso pode ser feito, mas prepare-se para muito trabalho. (ou não, porque eu vou lidar com isso algum fim de semana ;-).
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
defpackage
sí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
fonte