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 um in 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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top