2010-08-14 22 views
21

¿Por qué alguien preferiría las macros Scheme sobre las macros Common Lisp (y realmente quiero saber también, no estoy tratando de ser un troll)?¿Cuáles son las ventajas de las macros de esquema?

Mi experiencia como Lisb newb es que las macros de estilo Common Lisp son mucho más fáciles de aprender que las macros de Scheme. Aún no he visto ninguna ventaja en las macros de Scheme, pero, por supuesto, eso no significa que no existan.

Sé que las macros de Scheme son "higiénicas", pero todavía no estoy convencido de que valga la pena la complejidad adicional. Por otro lado, obviamente, son personas que están convencidas de que esto es necesario, de lo contrario no habría implementaciones de macros Scheme en Common Lisp.

Para resumir, ¿alguien puede defenderme las macros de Scheme?

Respuesta

17

Las macros de esquema presentan dos conceptos, esencialmente ortogonales: la higiene y la coincidencia de patrones. La higiene es menos importante en un lisp2 como Common Lisp. El lenguaje de coincidencia de patrones captura muchas de las expresiones idiomáticas comunes, pero tiene el problema de que es esencialmente un lenguaje diferente del esquema. Probablemente la mejor introducción a las macros de esquema, junto con algunas de las razones detrás de ellos es PLAI capítulos de Shriram Krishnamurthi 36 y 37.

Sospecho que la razón por la gente escribe estilo esquema de sistemas de macro en Common Lisp es más por la coincidencia de patrones de para la higiene

7

Debido a que utilizan un lenguaje diferente, no Esquema, los macros de Scheme son menos potentes que las macros Common Lisp en el sentido casi formal: que puede hacer el cálculo en tiempo de compilación arbitraria con ellos, pero es peludo y enrevesado. Es muy parecido al argumento de no usar set!: los lenguajes libres set! menos efectivos producen menos código con errores a cambio de un manejo incómodo del estado. Cada vez que intercambia poder por disciplina, está apostando a que podrá construir sistemas más complejos a largo plazo.

Ese es el mejor argumento que he visto para las macros de Scheme sobre las de Common Lisp: si estás construyendo un lenguaje complejo sobre Scheme, es menos probable que introduzcas sutiles errores si te quedas con el sistema de macro estándar.

Personalmente, no creo grandes idiomas con macros, por lo que prefiero las macros Common Lisp. Los encuentro mucho más fáciles para trabajos pequeños y evitar la captura de variables, etc. no es un gran problema a pequeña escala.

+4

Las "macros de esquemas" son * no * menos potentes que las macros CL: solo las reglas de sintaxis 'patrón-coincidente-restringido' son menos potentes. Las macros de estilo 'sintaxis-case' arbitrarias son tan potentes como las macros CL, y de hecho son más potentes ya que las macros CL casi ignoran la información léxica. –

+0

@Eli Barzilay: varias implementaciones de CL proporcionan la información léxica utilizando la interfaz a los "entornos" descritos en CLtL2. –

+1

Tenga en cuenta que dije * casi formal *. Estoy bastante seguro de que Oleg ha demostrado que incluso 'sintaxis-rules' es Turing-completa. En mi opinión, las restricciones en 'syntax-rules' y' syntax-case', a pesar de que 'syntax-case' tiene formas más simples, están en su lugar para prevenir errores sutiles en macros complejas (y para hacer papers publicables por supuesto) Pero también creo que esas restricciones hacen que las macros simples sean mucho menos convenientes que con el sistema macro CL. –

4

Scheme macros preserve referential transparency.

Citando el "Manual de referencia Guile" 6.10.2.2 Higiene:

-reglas de sintaxis de macros (..) preservar la transparencia referencial. Cuando lee una definición de macro, cualquier enlace libre en esa macro se resuelve relativo a la definición de macro; y cuando lee una instancia macro , todos los enlaces libres en esa expresión se resuelven en relación con la expresión.

Esta propiedad a veces se conoce como higiene, y ayuda en el código limpieza. En las definiciones de macro, puede introducir libremente variables temporales , sin preocuparse por introducir inadvertidamente enlaces en la macro expansión.

El esquema estándar ofrece syntax-rules y syntax-case.

+0

Sin embargo, la captura variable puede ser una característica deseable. ¿Hay alguna forma de hacerlo con la macro de Scheme? –

Cuestiones relacionadas