5

YesodBookから。

Hamletは、呼び出されると、スコープ内の変数に自動的にアクセスできます。に変数を具体的に渡す必要はありません。

この深い魔法は何ですか?どの変数がスコープ内にあるかを自動的に知るにはどうすればよいですか?

4

2 に答える 2

9

HamletはTemplateHaskellに基づいています; 特に、準クォーター(ie [hamlet| ... |])はインラインテンプレートに使用され、スプライス(ie $(hamletFile "foo"))はファイルからテンプレートを作成するために使用されます。次に、テンプレートHaskellのイントロスペクション機能を使用して変数にアクセスします。

これには、変数への自動アクセスを許可する以外にも利点があります。

  • Hamletテンプレートはコンパイル時に通常のHaskellコードにコンパイルされるため、結果のテンプレートは実行時に解析および解釈されるテンプレートよりも効率的である可能性があります。

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

これらの利点は、すべてのシェイクスピアファミリーのテンプレートに当てはまると思います。Haddockのドキュメントには、利用可能な準クォーターとスプライスに関する詳細情報があります。

于 2012-02-01T07:15:34.160 に答える
4

これは、構文であるHaskellの準引用の機能です[xxx| .... |]

準クォーターは、スコープ内にあるすべての変数にアクセスできるため、内挿することができます。補間の実際の実装(存在する場合)は、準クォーター自体に依存します。

于 2012-02-01T07:14:55.523 に答える