Quais são as aplicações típicas das macros Lisp?


19

Estou tentando aprender algumas LISP e li muito sobre a importância das macros LISP, então gostaria de ter alguma experiência de trabalho com elas.

Você pode sugerir uma área de aplicação prática que me permita usar macros para resolver um problema do mundo real e entender a utilidade dessa construção de programação?

NOTA

Este não é um projeto genérico que eu devo fazer na próxima pergunta. Estou interessado em entender que tipos de problemas geralmente são resolvidos por meio de macros LISP. Por exemplo, eles são bons para implementar tipos de dados abstratos? Por que essa construção foi adicionada ao idioma? Que tipos de problemas resolve e que não podem ser resolvidos por meio de funções simples?


Respostas:


9

As macros Lisp combinam algumas propriedades distintas:

  1. Macros definem nova sintaxe, eles usam código-fonte como entrada
  2. As macros geralmente são executadas em tempo de compilação
  3. Macros geram código-fonte

As melhores aplicações fazem uso de todos esses aspectos. Provavelmente o exemplo mais conhecido é o (loop…) no Common Lisp, não estaria nem perto da sua utilidade sem um desses recursos. Sem a fonte como entrada, seria estranho definir as ações dentro do loop; sem expansão em tempo de compilação, seria muito lento; e sem a geração de código, não seria executável.

Outro bom exemplo é o capítulo de serialização binária em Practical Common Lisp , Practical: Parsing Binary Files .

Uma macro de consulta que implementa algo semelhante ao LINQ pode ser outro bom aplicativo. Mas estaria faltando a conclusão automática que torna o LINQ tão bom quanto é. Quase tudo o que hoje é resolvido por geradores de código para fins especiais com entradas XML (por exemplo, XAML) também pode ser implementado usando macros Lisp.


Acabei de comprar o livro "Practical Common Lisp", vou dar uma olhada no exemplo que você sugeriu.
Giorgio

2

O jeito que eu gosto de pensar em macros no lisp comum é que elas são funções que retornam código a ser avaliado, mas 'não' avaliam seus argumentos antes de retornar esse código. As funções também retornam algo, mas avaliam cada argumento antes que seu corpo seja avaliado. Macros não.

Paul Graham em 'On Lisp' fornece (IMHO) uma das melhores descrições das diferenças entre macros e funções e discute sua sobreposição e singularidade. Muitos bits de código podem ser gravados como uma função ou uma macro, mas há casos em que apenas uma macro funcionará. Depois de entender isso, acho que você tem a essência das macros no lisp.

Como exemplo de uma macro em que uma função não funcionará, confira 'aif' (anaphoric if). São apenas algumas linhas de código e minha recomendação sobre por onde começar.

E faça referência à versão anaphoric if do Common Lisp, que tira proveito da captura intencional de variáveis. A versão automaticamente higiênica do esquema não é, na OMI, o "negócio real". A captura variável é uma parte importante da macrologia lisp, e algumas das macros mais poderosas e úteis certamente se aproveitam dela.

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.