2012-02-01 18 views
5

Desde el Yesod Book.Hamlet acceso automático a las variables en el alcance

Hamlet automáticamente tiene acceso a las variables en el ámbito cuando se llama. No hay necesidad de pasar específicamente variables en.

¿Qué es esta magia profunda? ¿Cómo puede saber automágicamente qué variables están dentro del alcance?

+0

Si bien no sé nada, probablemente sea la plantilla de Haskell. Por supuesto (para mí) template haskell es magia profunda, así que ahí lo tienes :) Un ejemplo más simple de lo mismo es QuickCheck's quickcheckAll: mágicamente conoce todas tus conexiones prop_ * y las ejecuta. –

Respuesta

9

Hamlet se basa en Template Haskell; en particular, se utiliza un quasiquoter (es decir, [hamlet| ... |]) para plantillas en línea, y un empalme (es decir, $(hamletFile "foo")) se utiliza para crear plantillas a partir de un archivo. A continuación, se accede a las variables con las funciones de introspección de Template Haskell.

Esto tiene beneficios más allá de lo que permite el acceso automático a las variables:

  • Las plantillas resultantes probablemente sean más eficientes que los analizados e interpretados en tiempo de ejecución, ya que las plantillas de Hamlet son compilados a código regular de Haskell en tiempo de compilación.

  • Al leer una plantilla de un archivo, el archivo se analiza en tiempo de compilación e incrustado en el binario resultante, por lo que no es necesario mantener las plantillas en la misma ubicación en tiempo de ejecución y la validez de plantillas está garantizado estáticamente.

Creo que estas ventajas se aplican a todas las plantillas de la familia Shakespeare. The Haddock documentation tiene más información sobre los quasiquoters y empalmes disponibles.

+0

El enlace arriba de Haddock está roto, pero estos pueden apuntar en la dirección correcta: http://www.haskell.org/haskellwiki/Template_Haskell#Template_Haskell_tutorials_and_papers –

4

Es una característica de Haskell quasiquotation, que es la sintaxis [xxx| .... |].

El quasiquoter puede acceder a cualquier variable que esté en el alcance, por lo que se pueden interpolar. La implementación real de la interpolación (si la hay) depende del cuasicuador en sí mismo.

Cuestiones relacionadas