9

Hamletテンプレート メカニズムについては、コンパイル時にテンプレートが解析され、blaze-html コンビネータ (および補間による他の式) への呼び出しを含むソース コードが生成されることを理解しています。したがって、補間が発生するポイント (サブツリー) はコンパイル時に認識されます。

実行時に、補間された値を計算し (もちろん)、ツリーに「プラグイン」する必要があります。つまり、html コンビネータを適用します。それらのすべて?実際、これらのアプリケーションの一部はコンパイル時に評価できます (下に補間がないもの)。これは起こりますか?

4

3 に答える 3

7

私がコードに取り組んでからしばらく経ちましたので、これを正式なものと見なさないでください(ダニエルが言及したように、ここで-ddump-simplは良い呼び出しです)。しかし、blaze-html コンビネータを使用しているとは思いません。データ型だけです。Hamlet 自体は、実行時のコストを回避するために、コンパイル時に可能な限り文字列を連結します。私が最後にベンチマークを行ったとき (それは何年も前のことでした)、最適化がかなりうまくいったことを私は知っています。

于 2015-06-09T03:12:17.953 に答える
3

マイケルが言うように、「ハムレット自体は、実行時のコストを回避するために、コンパイル時に可能な限り文字列を連結します。」

本の例では、

main = putStrLn $ renderHtml [shamlet|
<p>Hello, my name is #{name person} and I am #{show $ age person}.
<p>
    Let's do some funny stuff with my name: #
    <b>#{sort $ map toLower (name person)}
<p>Oh, and in 5 years I'll be #{show ((+) 5 (age person))} years old.
|]
  where
    person = Person "Michael" 26

-ddump-simplこれが含まれています:

               (>>
                  @ Text.Blaze.Internal.MarkupM
                  Text.Blaze.Internal.$fMonadMarkupM
                  @ ()
                  @ ()
                  (id
                     @ (Text.Blaze.Internal.MarkupM ())
                     (. @ Data.Text.Internal.Text
                        @ Text.Blaze.Internal.Markup
                        @ String
                        Text.Blaze.Internal.preEscapedText
                        Data.Text.pack
                        (GHC.CString.unpackCString#
                           ".</p>\n\
                           \<p>Let's do some funny stuff with my name: <b>"#)))

実際、これは HTML の構文ツリーではありません (最後の行 - 文字列には終了タグと次の開始タグが含まれています)。

このハムレットの機能はもっと宣伝されるべきです!

于 2015-06-09T08:33:05.117 に答える