¿Hay alguna diferencia práctica entre formularios especiales y macros? ¿En qué difieren?¿Cuáles son las diferencias prácticas entre formularios especiales y macros?
Respuesta
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 luegoapply
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 ...
Puedes implementar' if' como una macro encima de 'lambda' también. No es terriblemente eficiente, pero es bueno saberlo. – amalloy
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. –
@amalloy, estoy interesado en cómo se puede hacer eso, ¿tiene un enlace a mano? –
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
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
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.
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.
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 \)). –
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.
- 1. ¿Cuáles son las diferencias entre $ {} y # {}?
- 2. ¿Cuáles son las diferencias y similitudes entre MVC y MVVM?
- 3. ¿Cuáles son las diferencias entre PHP y Java?
- 4. ¿Cuáles son las diferencias entre osql, isql y sqlcmd?
- 5. ¿Cuáles son las diferencias entre "=" y "<-" en R?
- 6. ¿Cuáles son las diferencias entre Flash Professional y Flash Builder?
- 7. ¿Cuáles son las diferencias entre LLVM y bytecode java?
- 8. ¿Cuáles son las diferencias entre usar `rails server` y` rackup`?
- 9. ¿Cuáles son las diferencias entre RedrawWindow y UpdateWindow en Win32?
- 10. ¿cuáles son las diferencias exactas entre jsch ChannelExec y ChannelShell?
- 11. ¿Cuáles son las diferencias entre JSP y Facelets?
- 12. ¿Cuáles son las diferencias entre ConcurrentQueue y BlockingCollection en .Net?
- 13. ¿Cuáles son las diferencias entre LinFu.DynamicProxy y Castle.DynamicProxy?
- 14. ¿Cuáles son las diferencias fundamentales entre OSGi y Java EE?
- 15. ¿Cuáles son las diferencias entre TFS, SVN y GIT?
- 16. ¿Cuáles son las principales diferencias entre EnhancedPatternLayout y PatternLayout?
- 17. ¿Cuáles son las diferencias entre INSERT y UPDATE en MySQL?
- 18. ¿Cuáles son las diferencias entre NSURLConnection y ASI-HTTP-Request?
- 19. ¿Cuáles son las principales diferencias entre fwrite y write?
- 20. ¿Cuáles son las diferencias entre JSP, PHP, HTML5 y javascript?
- 21. ¿Cuáles son las diferencias entre los modelos CSS y Latex?
- 22. ¿Cuáles son las diferencias entre MOQ y AutoFixture?
- 23. ¿Cuáles son las diferencias entre Vanilla Perl y Strawberry Perl?
- 24. ¿Cuáles son las diferencias entre el objeto JSON y JavaScript?
- 25. ¿Cuáles son las diferencias reales entre Zend Framework y Django?
- 26. ¿Cuáles son las diferencias entre free, dealloc, release y autorelease?
- 27. ¿Cuáles son las diferencias actuales entre jQuery y Prototype?
- 28. ¿Cuáles son las diferencias entre la lechuga y la pictografía?
- 29. ¿Cuáles son las diferencias entre PEG y CFG?
- 30. ¿Cuáles son las diferencias entre Doctrine1 y Doctrine2?
posible duplicado de [¿Se puede ignorar con seguridad la diferencia entre una macro y una función incorporada?] (Http://stackoverflow.com/questions/5120780/can-one-safely-ignore-the-difference-between- a-macro-and-a-built-in) – amalloy