Автоматический доступ Hamlet к переменным в области видимости

Из книги Yesod.

Hamlet автоматически получает доступ к переменным в области видимости при вызове. Нет необходимости специально передавать переменные.

Что это за глубокая магия? Как он может автоматически узнать, какие переменные находятся в области видимости?


person Dan Burton    schedule 01.02.2012    source источник
comment
Пока ничего не знаю, наверное это шаблонный хаскелл. Конечно (для меня) template haskell — это глубокая магия, так что вот так :) Более простой пример того же самого — quickcheckAll от QuickCheck: он волшебным образом знает обо всех ваших привязках prop_* и запускает их.   -  person Tikhon Jelvis    schedule 01.02.2012


Ответы (2)


Hamlet основан на Template Haskell; в частности, квазицитатор (т. е. [hamlet| ... |]) используется для встроенных шаблонов, а сращивание (т. е. $(hamletFile "foo")) используется для создания шаблоны из файла. Затем доступ к переменным осуществляется с помощью функций самоанализа Template Haskell.

Это имеет преимущества помимо автоматического доступа к переменным:

  • Результирующие шаблоны, вероятно, более эффективны, чем те, которые анализируются и интерпретируются во время выполнения, поскольку шаблоны Hamlet компилируются в обычный код Haskell во время компиляции.

  • При чтении шаблона из файла файл анализируется во время компиляции и встраивается в результирующий двоичный файл, поэтому шаблоны не нужно хранить в одном и том же месте во время выполнения, а достоверность шаблонов обеспечивается статически.

Я считаю, что эти преимущества применимы ко всем шаблонам семейства Shakespeare. Документация по Haddock содержит дополнительную информацию о доступных квазицитаторах и соединениях. .

person ehird    schedule 01.02.2012
comment
Ссылка выше на Haddock не работает, но она может указывать на правильное направление: haskell.org/haskellwiki/< /а> - person ljs.dev; 03.09.2014

Это функция квазицитирования в Haskell, которая представляет собой синтаксис [xxx| .... |].

Квазиквотёр может получить доступ к любым переменным, находящимся в области видимости, поэтому их можно интерполировать. Фактическая реализация интерполяции (если таковая имеется) зависит от самого квазиквота.

person porges    schedule 01.02.2012