2012-02-01 12 views
5

Yesod Bookから。範囲内の変数へのハムレットの自動アクセス

ハムレットは、呼び出されるとスコープ内の変数に自動的にアクセスします。変数を特に渡す必要はありません。

この深い魔法とは何ですか?どの変数が範囲内にあるかを自動的にどのように知ることができますか?

+0

私は何も知りませんが、おそらくテンプレートのhaskellです。もちろん、テンプレートのhaskellは深い魔法ですので、そこに行く:)同じことのより簡単な例は、QuickCheckのquickcheckAllです:すべてのprop_ *バインディングについて魔法のように知っていて、実行します。 –

答えて

9

ハムレットは、Template Haskellに基づいている。特に、quasiquoter(すなわち、[hamlet| ... |])がインラインテンプレートに使用され、スプライス(すなわち、$(hamletFile "foo"))がファイルからテンプレートを作成するために使用される。変数は、Template Haskellのイントロスペクション機能でアクセスされます。

これは、変数への自動アクセスを許可を超えての利点があります。

  • ハムレットテンプレートはコンパイル時に通常のHaskellコードにコンパイルされるため、結果テンプレートは、おそらくより効率的な実行時に解析され、解釈されたものよりもあります。

  • ファイルからテンプレートを読み込む場合、ファイルはコンパイル時に解析され、結果のバイナリに埋め込まれるため、実行時に同じ場所にテンプレートを保存する必要はなく、テンプレートは静的に確保されます。

私は、これらの利点は、すべてのShakespeare -familyのテンプレートに適用されます信じています。 The Haddock documentationには、利用可能な準分数とスプライスの詳細があります。

+0

上記のHaddockリンクは壊れていますが、正しい方向を指している可能性があります:http://www.haskell.org/haskellwiki/Template_Haskell#Template_Haskell_tutorials_and_papers –

4

これは、Haskellのquasiquotationの機能で、[xxx| .... |]の構文です。

準クォータは、スコープ内にある任意の変数にアクセスできるため、補間することができます。補間の実際の実装(もしあれば)は、準整数そのものに依存する。

関連する問題