JavaでLisp的なと言うか、S式モドキ的な記述をしてみた。

id:koichikさんが、LispSmalltalkでは、まぁ、ああいう感じになるのは、
ごく自然だよねぇ…と、言うので、Javaでも出来るんじゃねぇかと考えてみたり。
まぁ、出来るには、出来た様な気がするけど、かなり気持ち悪いアレ的な感じに。


用意したのは、以下の5つ+1つのクラス。
ちなみに、Tiger以降のJavaでなければ、こういう変な事は出来ません。
本気でやるなら、HTMLの全てのタグに対応したクラスを作る必要があるかと思います。

  • HtmlElement
    • 全体に統一感を出す為のアレ。単に趣味の代物。一番イラナイ子。
  • Html
    • 名前見て何が出てくるか想像して下さい。分岐の実現可能性を示す為に作りますた。
  • Head
    • 特に何もしてない子。
  • Body
    • 特に何もしてない子。
  • Form
    • 属性の編集可能性を示す為に、action属性とname属性を編集できる様にしてみました。
    • ポイントは、javaでメンバ変数を弄るメソッドなのだけど、雪駄になってない事。
  • 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だぜ!って「漢」に是非オススメしたい。