Concurrent Clean : HTML

http://page.freett.com/shelarcy/log/2006/diary_11.html#where_is_stdhtml
shelarcyさんから突っ込みが入っていますが、私がやろうとしているのはそんな繊細なものでもなくて、泥臭いテンプレートライブラリです。でも、そういう泥臭いことをするにもCleanは結構便利だよということは言えるのかも。

      • -

ということで、少し形になってきました。下のように __HTMLSTART__ から __HTMLEND__ で囲んだ部分を、HTMLとして扱うプリプロセッサを作っています。CleanのプログラムにHTMLを埋め込んで使います。
ちなみに、この段階で、プリプロセッサの行数は、80行程度です。自作ライブラリを書きながらなので、そっちで行数を稼いでいるところはありますが、それでも短いと思います。

module PageIndex

import StdEnv, OptEnv, Html

Start w # (f,w) = stdio w
          f = f --> printHttpHeader ["Content-type: text/html"]
                --> printHtml page
          (_,w) = fclose f w
        = w

page =
    __HTMLSTART__
    <HTML>
    <HEAD>
    <TITLE>CGI by Clean</TITLE>
    </HEAD>
    <BODY>
    <H1 class="title">HELLO WORLD.</H1>
    </BODY>
    </HTML>
    __HTMLEND__

変換後は、

page =
    [HtmlText "<HTML>", HtmlText "\n"
    ,HtmlText "<HEAD>", HtmlText "\n"
    ,HtmlText "<TITLE>CGI by Clean</TITLE>", HtmlText "\n"
    ,HtmlText "</HEAD>", HtmlText "\n"
    ,HtmlText "<BODY>", HtmlText "\n"
    ,HtmlText "<H1 class=\"title\">HELLO WORLD.</H1>", HtmlText "\n"
    ,HtmlText "</BODY>", HtmlText "\n"
    ,HtmlText "</HTML>", HtmlText "\n"
    ]

となります。

      • -

Cleanの式を埋め込む機能を追加しました。

page s =
    __HTMLSTART__
    <HTML>
    <HEAD>
    <TITLE>CGI by Clean</TITLE>
    </HEAD>
    <BODY>
    <H1 class="title"><% s %></H1>
    </BODY>
    </HTML>
    __HTMLEND__

JSPな人の「<% %>」とPHPな人の「<? ?>」の両方が使えます。囲んだ中がCleanの式としてそのまま埋め込まれます。

                --> printHtml (page (HtmlText "Hello World."))

というように呼び出します。
これで、120行くらい。