Emacs lisp definir a sintaxe de
Pergunta
É de se analogias com Esquema de define-syntax
no diretī orio elisp?No define-syntax
Eu posso especificar algumas palavras-chave e no diretī orio elisp defmacro
parece que eu não posso.EDITAR:Parece que eu não o compreendo bem, ou a minha pergunta não está clara.No esquema, é possível definir macros com palavras reservadas como
(loop
for
umin
alguns-lista(loop
while
…
Em Emacs Lisp não achei maneira de introduzir tais açúcar.No mais, eu posso fazer para macro, que deve ser chamado como
(loop-para uma lista (faça um monte de coisas...)
Legibilidade matéria
Solução
Tanto o Esquema e o diretī orio elisp ter sistemas de macro.As "palavras-chave" define-syntax
e defmacro
ambos introduzir um nome para um usuário definido macro.
No momento em que uma macro, foo, é usado no código real, dizer (foo 1 bar)
a macro expansor deve determinar como reescrever a forma dada, (foo 1 bar)
, em uma forma mais simples que não contenham macros do usuário.A macro expansor chama a função que foi definido no momento em que a macro foo
foi definido.I. e.ele chama a função especificada com define-syntax
ou defmacro
com uma representação de forma, (foo 1 bar)
.A representação pode ser como "sintaxe de objetos" ou simples listas (isto difere em diferentes sistemas de macro).
Esta é a minha opinião sobre as semelhanças entre define-syntax
e defmacro
.
A macro sistemas de R5RS o Esquema e o diretī orio elisp são diferentes embora.
A macro associado a expansor de foo
pode R5RS em Regime de ser especificado com a ajuda de syntax-rules
.Isso permite que você use a correspondência de padrões para especificar regras de reescrita (internamente a sintaxe de regras de forma irá avaliar a função).Outras diferenças:A expansão de macro algoritmo R5RS em Regime de ajudá-lo contra inadvertidamente introduzir nomes de confronto com nomes de outras partes do programa (digamos, a partir de uma biblioteca, você não escrever o seu self).Historicamente
Devido à forma como os espaços de nomes funciona em Lisp, este problema não é um grande problema em Lisp, mas é possível cometer erros.
Historicamente, o Esquema e o diretī orio elisp ambos usado o mesmo algoritmo de expansão de macro, mas, em seguida, Schemers começou a fazer experimentos com outros algoritmos.A "sintaxe de regras de" sistemas foi introduzido no R5RS, mas a evolução não parou por aí.Nestes dias, os modernos Esquema de implementação (variantes) a sintaxe "caso" do sistema.
Alguns implementação têm feito um trabalho para fazer esta expansão algoritmo de trabalho com módulos (Raquete, R6RS-implementações, e outros).
Em suma, quando você lê sobre o Esquema de macro sistemas, tomar o cuidado de examinar com precisão qual a variante que você está lendo sobre.Se você está lendo sobre restrições, então o mais provável é que tenha encontrado um texto sobre o (agora, ao invés de idade) syntax-rules
do sistema.