2012-02-22 23 views

Respuesta

18

Los términos no son exactamente sinónimos, pero no son exclusivos o bien (esta respuesta supone Esquema):

  • Un forma especial (también conocida como una sintaxisen el Esquema Informes) es una expresión que no se evalúa de acuerdo con la regla predeterminada para la aplicación de funciones. (La regla por defecto, sólo para ser explícito, es eval todas las subexpresiones, y luego apply el resultado de la primera en la lista de los resultados de los otros.)
  • El sistema de macro es una característica del lenguaje eso permite la definición de nuevas formas especiales dentro del lenguaje mismo. Una macro es una forma especial definida mediante el sistema de macros.

Así que se podría decir que "forma especial" es un término que se refiere a la interfaz o semántica, mientras que "macro" es un término que se refiere a la aplicación . "Forma especial" significa "estas expresiones se evalúan con una regla especial", mientras que "macro" significa "aquí hay una implementación de una regla especial para evaluar algunas expresiones"."

Ahora, una cosa importante es que las formas especiales más Scheme se pueden definir como las macros de un muy pequeño grupo de primitivas: lambda, if y macros Una aplicación Esquema mínima que proporciona sólo éstos aún pueden poner en práctica el resto como macros;. recientes Informes de Esquemas han hecho esa distinción al referirse a formas especiales como "sintaxis de biblioteca" que se puede definir en términos de macros. En la práctica, sin embargo, los sistemas de Esquemas prácticos a menudo implementan un conjunto más rico de formas como primitivas

Semánticamente hablando, lo único que importa sobre una expresión es qué regla se usa para evaluarla, no cómo se implementa esa regla. Entonces, en ese sentido, no es importante si se implementa una forma especial como una macro o una primitiva. Pero, por otro lado, los detalles de implementación de un sistema Scheme a menudo se "escapan", por lo que puede que se preocupe por ello ...

+1

Puedes implementar' if' como una macro encima de 'lambda' también. No es terriblemente eficiente, pero es bueno saberlo. – amalloy

+0

Siento que esta respuesta es la más clara. Dado que define 'forma especial' de acuerdo con su semántica, es decir, sin depender de los detalles de implementación. –

+1

@amalloy, estoy interesado en cómo se puede hacer eso, ¿tiene un enlace a mano? –

4

En contraste con formas especiales, formas macro se puede macroexpanded:

CL-USER(1): (macroexpand '(with-slots (x y z) 
           foo 
          (format t "~&X = ~A" x))) 

(LET ((#:G925 FOO)) 
    (DECLARE (IGNORABLE #:G925)) 
    (DECLARE (SB-PCL::%VARIABLE-REBINDING #:G925 FOO)) 
    #:G925 
    (SYMBOL-MACROLET ((X (SLOT-VALUE #:G925 'X)) 
        (Y (SLOT-VALUE #:G925 'Y)) 
        (Z (SLOT-VALUE #:G925 'Z))) 
    (FORMAT T "~&X = ~A" X))) 
T 
+0

Hola Matthias. En tAoAI Norvig afirma que 'setf' es una forma especial. Sin embargo, se macroexpand. E.g: '(macroexpand '(setf test 4))' se expande a '(SETQ TEST 4)' ¿Tal vez hay un error en el libro? No veo 'setf' aquí: http://www.lispworks.com/documentation/lw60/CLHS/Body/03_ababa.htm#clspecialops – tsikov

11

Lisp tiene ciertas primitivas del lenguaje, que constituyen formas Lisp:

  • datos literales: números, cadenas, estructuras, ...
  • llamadas a la función, como (sin 2.1) o como ((lambda (a b) (+ a b 2)) 3 4)
  • operadores especiales utilizados en formularios especiales. Estos son los elementos primitivos del lenguaje incorporado. Ver Special Operators en Common Lisp. Estos deben implementarse en el intérprete y el compilador. Common Lisp no proporciona ninguna forma para que el desarrollador introduzca nuevos operadores especiales o para proporcionar su propia versión de estos. Una herramienta de análisis de código deberá comprender estos operadores especiales; estas herramientas se suelen llamar 'caminantes de código' en la comunidad Lisp. Durante la definición del estándar Common Lisp, se aseguró de que el número sea muy pequeño y de que todas las extensiones se realicen mediante nuevas funciones y nuevas macros.
  • macros: las macros son funciones que transforman el código fuente. La transformación ocurrirá de forma recursiva hasta que no quede macro en el código fuente. Common Lisp tiene macros incorporadas y permite al usuario escribir nuevas.

Por lo tanto, la diferencia práctica más importante entre las formas especiales y las macros es la siguiente: los operadores especiales tienen sintaxis y semántica incorporadas. No pueden ser escritos por el desarrollador. Las macros pueden ser escritas por el desarrollador.

4

Para mí, la diferencia más práctica ha sido en el depurador: las macros no muestran en el depurador; en su lugar, el código (típicamente) oscuro de la expansión de la macro aparece en el depurador. Es un verdadero dolor depurar dicho código y una buena razón para garantizar que sus macros sean sólidos como una roca antes de comenzar a confiar en ellos.

+1

Esto es una preocupación si no tienes un depurador de macros, pero algunos Lisps en realidad sí lo tienen. Por ejemplo, Racket tiene uno que incluso puede usar desde [REPL] (http: //docs.racket-lang.org/xrepl/index.html# \ (xrepl._syntax \)). –

2

los super respuesta corta para los perezosos

Puede escribir sus propios macroes cualquier momento que desee, aunque no puede agregar formas especiales sin recompilar clojure.

Cuestiones relacionadas