JavaでLisp的なと言うか、S式モドキ的な記述をしてみた。
id:koichikさんが、LispやSmalltalkでは、まぁ、ああいう感じになるのは、
ごく自然だよねぇ…と、言うので、Javaでも出来るんじゃねぇかと考えてみたり。
まぁ、出来るには、出来た様な気がするけど、かなり気持ち悪いアレ的な感じに。
用意したのは、以下の5つ+1つのクラス。
ちなみに、Tiger以降のJavaでなければ、こういう変な事は出来ません。
本気でやるなら、HTMLの全てのタグに対応したクラスを作る必要があるかと思います。
- HtmlElement
- 全体に統一感を出す為のアレ。単に趣味の代物。一番イラナイ子。
- Html
- 名前見て何が出てくるか想像して下さい。分岐の実現可能性を示す為に作りますた。
- Head
- 特に何もしてない子。
- Body
- 特に何もしてない子。
- Form
- Main
- 上記のクラスを頑張って使って、コンソールにHTMLを出力する子。
- static importがかもし出す非日常が見所。
ソースコードはこんな感じ。
package element; public interface HtmlElement { public StringBuilder toHtml(StringBuilder builder); } package element; public class Html implements HtmlElement { private Head head; private Body body; private Html(Head head, Body body) { this.head = head; this.body = body; } public static Html html(Head head, Body body) { return new Html(head, body); } public StringBuilder toHtml(StringBuilder builder) { builder.append("<html>"); head.toHtml(builder); body.toHtml(builder); builder.append("</html>"); return builder; } } package element; public class Head implements HtmlElement { public static Head head() { return new Head(); } public StringBuilder toHtml(StringBuilder builder) { builder.append("<head>"); builder.append("</head>"); return builder; } } package element; public class Body implements HtmlElement { private Form form; private Body(Form form) { this.form = form; } public static Body body(Form form) { return new Body(form); } public StringBuilder toHtml(StringBuilder builder) { builder.append("<body>"); form.toHtml(builder); builder.append("</body>"); return builder; } } package element; public class Form implements HtmlElement { private String action; private String name; public static Form form() { return new Form(); } public Form name(String name) { this.name = name; return this; } public Form action(String action) { this.action = action; return this; } public StringBuilder toHtml(StringBuilder builder) { builder.append("<form "); builder.append("name=\""); builder.append(this.name); builder.append("\" "); builder.append("action=\""); builder.append(this.action); builder.append("\""); return builder.append("></form>"); } }
で、何となく想像が付くと思うけど、ここから先が本番的なアレ。
import static element.Body.body; import static element.Form.form; import static element.Head.head; import static element.Html.html; import element.Html; public class Main { public static void main(String[] arg) { Html html = html( head() ,body( form().action("hoge").name("fuga") ) ); System.out.println(html.toHtml(new StringBuilder())); } }
心眼を持ってすれば、HTMLに見える事でしょう。
ちなみに、これの実行結果は、こんな感じ。
<html><head></head><body><form name="fuga" action="hoge"></form></body></html>
おお!HTMLだ。
これを真面目にやると、eclipseの超絶インテリセンスを使いながら、
文字通りHTMLをJavaでコーディングできるまする。
テンプレート言語なんて覚えてられるか!
全部Javaだぜ!って「漢」に是非オススメしたい。