2012-02-01 10 views
5

Od Yesod Book.Hamlet automatyczny dostęp do zmiennych w zakresie

Hamlet automatycznie ma dostęp do zmiennych w zakresie, gdy jest wywoływana. Nie ma potrzeby specyficznego przekazywania zmiennych.

Czym jest ta głęboka magia? W jaki sposób można automagicznie wiedzieć, jakie zmienne są w zakresie?

+0

O ile nic nie wiem, to prawdopodobnie szablon haskell. Oczywiście (do mnie) szablon haskell to głęboka magia, więc proszę bardzo :) Prostszym przykładem tego jest quickcheck. Wszystko: w magiczny sposób wie o wszystkich wiązaniach prop_ * i uruchamia je. –

Odpowiedz

9

Hamlet jest oparty na Template Haskell; w szczególności, do tworzenia szablonów wbudowanych jest stosowany kod quasiquoter (tj. [hamlet| ... |]), a do tworzenia szablonów z pliku stosuje się splot (to jest $(hamletFile "foo")). Zmienne są następnie dostępne za pomocą funkcji introspekcji szablonu Haskella.

To ma swoje zalety poza umożliwiając automatyczny dostęp do zmiennych:

  • Powstałe szablony są prawdopodobnie bardziej skuteczne niż te, analizowany i interpretowany w czasie wykonywania, ponieważ szablony Hamlet są kompilowane do regularnego kodu Haskell w czasie kompilacji.

  • Podczas odczytywania szablonu z pliku, plik jest analizowany podczas kompilacji i osadzany w wynikowym pliku binarnym, więc szablony nie muszą być przechowywane w tej samej lokalizacji w czasie wykonywania, a ważność szablony są statycznie zabezpieczone.

Uważam, że te zalety mają zastosowanie do wszystkich szablonów rodzin Shakespeare. The Haddock documentation ma więcej informacji o dostępnych quasiquoters i spojeniach.

+0

Powyższy link do łamacza Haddock jest uszkodzony, ale może wskazywać we właściwym kierunku: http://www.haskell.org/haskellwiki/Template_Haskell#Template_Haskell_tutorials_and_papers –

4

Jest to funkcja składająca się z Haskella quasiquotation, która jest składnią [xxx| .... |].

Quasiquoter może uzyskać dostęp do zmiennych znajdujących się w zakresie, dzięki czemu można je interpolować. Rzeczywista implementacja interpolacji (jeśli taka istnieje) zależy od samego quasiquoter.

Powiązane problemy