投稿

8月, 2008の投稿を表示しています

Javaのクロージャをいじってみた(5)

(※updated 2008-08-11のBGGAクロージャライブラリ使用) 6.static初期化ブロックに見えてこまる クラスのメンバにパッケージスコープのクラス変数として クロージャを宣言すると、static初期化ブロックと一瞬見間違える。 慣れの問題か? class Test { //たとえばこんな記述。static初期化ブロックに見えなくね? static { int, int => int } plus() { return {int x, int y => x+y}; } } 個人的なクロージャの記述スタイルの好みとしては、クロージャ型宣言の 記述スタイルは下のようなスペースを入れない方が好きだなあ。   {int,int=>int} // { int, int => int }   でもクロージャ本体の{}はスペース入れる派かも。 こちらの{}は普通のブロックと同じ意味と考えてるので。   // こんな感じ。 int sum = {int x, int y => x + y }.invoke(3, 4);   ちなみに私のC言語のポインタ記述は以下のとおり。   char* text; // char *text;   このポインタの例で私がクロージャ型宣言の記述スタイルについて 言わんとしていること、わかっていただけるでしょうか。 一種の"型"という意味の強調と、ブロックとしての{}と混同しない様にする ことが目的です。

OpenJDKのオープンソースライセンスについて

大変いまさらな話ですが、OpenJDKのオープンソースライセンスについて よく知らなかったので調べてみた。 Q: なんでOpenJDKはGPLなのに、これを利用するアプリケーションはGPLが 継承(いわゆるGPLのウイルス性)されないの? A: VM以下OpenJDKに含まれるツールは "GPL" で、その他classライブラリやツールが 提供する公開インタフェースは "GPL-Classpath特例(例外)" というライセンスを 適用しているのだそうな。 このClasspath特例によって、javaAPIを利用したプログラムもGPLになる制約 はないみたい。 へー そういえば、Java7でjamとかsuperpackageとか(今は名称変わった?)が 出てくるけどこれを適用したcom.sun~クラスなどは、調べた内容から考えると 非公開インタフェースとなるので"GPL-Classpath特例(例外)"ではなく、 ただの"GPL"が適用されることになるかも? 参考URL: http://www.sun.com/software/opensource/java/faq.jsp#g http://www.gnu.org/software/classpath/license.html http://d.hatena.ne.jp/t_yano/20061113/1163440273    

thikpad X60のキーボード交換した

thinkpadを購入するときから決めていた英語キーボード化。 ついに交換しだぜ! 既存の日本語配列がへたってからとか、x60のパームレスト右側が ものすごく熱いのでx200に近いうち乗り換えるからもったいないとか。 今まで色々理由をつけて見送っていました。 でもよくよく考えてみると、週一程度しかthinkpadに触らない人間が、 キーボードがへたるって何時の話だよとか、x200は新しすぎて値段が 高くすぐには手が出ないじゃんとか、直販で英語キーボード版販売 という話を聞いたけど、x200は英語キーボード選択できないじゃん…。 ということで、熱いの我慢して当分こいつ(X60)と付き合っていく 方針を固めたわけです。 幸い秋葉原の"若松通商"にキーボードの在庫ある様子。 早速アキバへGO。買ってきました。 自宅PCのキーボードは英語配列のHHKなので、まあすぐなれるじゃろ。 thinkpad買ったのはこれがやりたかったからに他ならない。 thinkpad本領発揮!!みたいな。 それにしてもパームレストの熱、いらつくなあ。 今この書き込み書いているそばから、右側が熱くなってきた…。 無線モジュールはBIOSで無効にしているんだけど、やっぱり暖かいわ。 x200であれだけ冷却に関して改良され/冷却についてアピールている ところを見ると、相当数のユーザーからのクレームや要望があったん だろうなあ。 x200系の今後は大いに期待。値段が安くなったら絶対乗り換えるぜ。 ところで、あまった日本語キーボードどうすりゃいいだろ? じゃんぱらとかSofmap辺りなら中古パーツの買取もOKかな? 後でググってみよう。    

Javaのクロージャいじってみた(4)

6.関数参照(Function Reference)   新しい記述が導入されるみたい。   クラス/インスタンスメンバへの参照は、"."演算子だが、   関数参照として新しく"#"演算子(みたいの)が導入されている。   このときは引数は型のみ記述している。メソッドを呼び出すというより、   クロージャとして取得したいメソッドのシグネチャを指定している感じ。   .netのデリゲート生成と似ている気がする。   例)   関数参照のコード String str = "Hello World !!"; {int,int=>String} subString = str#substring(int,int); // 引数も"型"を指定する --> ~~~~~~ System.out.println("subString=" + subString.invoke(0, 5)); // 出力:subString=Hello   逆コンパイルしたコード    finalも@Sharedも無しでコンパイルできたのは自動でfinal代入コードが   挿入されるためと判明。 String s = "Hello World !!"; final String binding = s; // このコードが自動挿入され変数がクロージャに渡される OII oii = new OII() { public final String _2B_invoke(int i, int j) { return binding.substring(i, j); } public final String invoke(int i, int j) { return _2B_invoke(i, j); } public volatile Object invoke(int i, int j) throws Throwable { return invoke(i, j); } final String val$binding; {...

関数型言語の勉強必要かも

関数型言語について知っておくと、boostとかC#3.0とかRubyとか javaに限らず色々役に立つかもしれないので、Haskellの本読み始めた。 仕組みが全く違っていて難しい。 なんというか、こう...日本語配列と英語配列キーボードの違いがc/c++,c#, javaの違いなら、関数型言語はdevorak配列のような違いがある。 読みきる前に他の本に浮気しそう。(汗 この遅延評価というのが…ん?んんー??んんんーー!? ……とりあえずモナドはUNIXコマンドのパイプなイメージで。 そういえば、Fork-Join Frameworkのメソッド名とかHaskellで見覚えのある キーワードだった。(withFilter()とかwithMapping()とか) 影響受けているのかね。 む。BGGAのクロージャサイトのプロトタイプまた新しくなってる。  → (updated 2008-08-04)   

Javaのクロージャいじってみた(3)

5.カリー化   メソッド内無名クラス定義ではfinal修飾子をつけたローカル変数を   無名クラス内部で利用することができるが、これを利用して   カリー化を実現している...みたい。   マイコミジャーナルの記事 にクロージャ内で利用したいローカル   変数には@Sharedアノテーションをつけることで利用可能になる   という記述があった。   へー   てっきり無名クラスのシンタックスシュガーだからfinalにしないと   駄目かと思っていたけど、ちょっと違うのね。   ……?あれ?私の試しているクロージャ実装(*1)ではfinalにも@Shared   つけなくてもコンパイル通るぞ??このバージョンの実装では文句は   言わないのかな?それとも@Sharedはクロージャのための機能じゃない   からjava7入れないとだめとか?   (*1 JDK1.6.0_10_bate, BGGAプロトタイプ実装2008-07-07版)   例)   javaクロージャでカリー化 //int local = 2; final int local = 2; {int=>int} func = { => {int num => num / local } }.invoke(); func.invoke(10); // 結果=5   上記コードの逆コンパイルコード final byte local = 2; II ii = (II)(new O() { public final II _2B_invoke() { return new II() { public final int _2B_invoke(int i) { return i / local; } public final int invoke(int i) { return _2B_invoke(i); } ...

Javaのクロージャいじってみた。(2)

4.自動でインタフェース継承  ・型推論   クロージャで記述すると自動的にインタフェースを継承してくれる。   いわゆる型推論ていうの?   いじってみた限りでは、以下の2つの記述で自動的に継承してくれる   ことは確認した。他のケースはしらん。     (1) 引数埋め込みで記述。     (2) クロージャの戻り値の型を継承したいインタフェース型で記述。   ・継承した場合メソッドはクロージャ型のinvoke()ではなく、    各インタフェースのメソッドとして扱われる。(内部処理的にはinvoke()    ぽいメソッドが生成されている模様。)   ・継承(実装)できるのはインタフェースだけで、抽象クラス/クラスは    継承できなかった。(コンパイルエラーになる)   ソースコード Functor<Integer> func = {Integer i => (int)(i * 2.4 + 68)};   逆コンパイルコード   // 呼び出し側   obj._fld1 = _2B_INSTANCE0; // 定義側 // 定数メンバとして定義される public static final _cls2 _2B_INSTANCE0 = new Functor() { // 戻り値型に継承されてる --> ~~~~~~~~~ public final int _2B_invoke(Integer integer) { return (int)((double)integer.intValue() * 2.39...9D + 68D); }     // ジェネリクスの場合、ブリッジメソッドもちゃんと生成されてる。 public final Integer calc(Integer integer) { return Integer.valueOf(_2B_invoke(integer)); } public volatile Object calc(Object obj) { return calc((Integer)obj); ...