Java Closures: first prototype を見て1

http://gafter.blogspot.com/2007/10/java-closures-first-prototype.html

なんか出てたんでとりあえず実験。JDK6.0以上必須だそうです。
Neal Gafterのページで「download an executable version of the prototype here」から closures.ztarをダウンロード。
適当な場所に解凍する。

テストをコンパイル&実行してみる。

 % cd closures-2007-11-04
 % ./bin/javac test/tools/javac/closures/Clarkson2.java
 % ./bin/java Clarkson2
 print
 % ./bin/java Clarkson2
 % ./bin/java Clarkson2
 % ./bin/java Clarkson2
 print
 print 

Clarkson2.javaの中身はこんな感じ。

public class Clarkson2
{
    public static void main(String[] args)
    {
    wihle.invoke({=>Math.random()<0.5},{=>System.out.println("print");});
    }

    interface BThunk extends {=>boolean} { }

    static final {BThunk,{=>void}=>void} wihle={BThunk cond, {=>void} action =>
                        while (cond.invoke())
                        action.invoke();};
}
/*
Exception in thread "main" java.lang.ClassCastException: Main$1 cannot
be cast to Main$BThunk
*/

かなりキモい文法だけど読めんこともないな。

wihleの型

次の2つを引数にとる関数で、戻り値はない。

  • 第1引数はBThunk型
    • BThunk はbooleanを返す関数。引数はとらない。
  • 第2引数は 「「引数を受けとらず void を返す関数」を受けとって voidを返す関数」 という型

wihleの実体

  • 第1引数にBThunkを受けとって、
  • 第2引数に 「void を返す関数」を受けとって、それを第1引数の条件を見たすまで実行するというもの。

main

  • 乱数を発生させて 0.5未満かどうか調べる述語が第1引数
  • void を返す関数として、「"print"を表示させる」を第2引数
  • whileに渡して invoke
  • プログラムはprintを0回以上出力するというもの

インタフェースを関数リテラルで実装するところが、Javaっぽくなくていい。

眠いので今日はこのへんで。