2012年2月11日土曜日

Trying "dart:io" with dart

ブラウザ側の処理を書くためちょっと試しにjavascriptを書こうとしてたものの、そのあまりに気持ちわるい言語仕様に挫折してしまった。Coffee Scriptも試したけどやっぱり文法が受けつけなかったので、早々にdartを試してみることにした。

dart:io

dartはブラウザの中だけじゃなく普通のスクリプト言語的にも実行できるようなので、ちょっと前に追加されたというioライブラリでちょろっと書いてみた。環境の構築方法はこの辺を参照。APIリファレンスを見るかぎり〜Syncていう同期的に実行する関数と非同期的に実行する関数の二種類があるみたい。Sync無しの関数がデフォルトっぽいので、ひとまず全て非同期で書いてる。

#import('dart:io');

void onOpen(RandomAccessFile opened) {
    opened.closeHandler = () => print("Closed stream");
    opened.errorHandler = (err) => print(err);
    opened.noPendingWriteHandler = () => opened.close();
    print("Writing to stream");
    opened.writeString("aardvark\n");
}

void main() {
    var name = "./aardvark";
    var f = new File(name);
    print("Attempting to write "+f.name);
    f.existsHandler = (bool b) {
        if (b) {
            print(f.name+" already exists!");
        } else {
            print(f.name + " doesn't exist...");
            f.openHandler = onOpen;
            f.open(FileMode.WRITE);
        }
    };
    f.exists();
}

"=>"記号で関数を定義するのはC#で慣れてるからどってことない。それより全て非同期で書こうとするとハンドラーだらけで変な感じ。

実行結果

$ dart --enable_type_checks test.dart
Attempting to write ./aardvark
./aardvark doesn't exist...
Writing to stream
Closed stream
$ dart --enable_type_checks test.dart
Attempting to write ./aardvark
./aardvark already exists!
$ cat aardvark 
aardvark
$ 

実行結果は期待通り。ついでに"--enable_type_checks"オプション型チェックを試してみた(existsHandlerの引数をbool bじゃなくてint bにしてみた)ところ、下のような結果になった。

$ dart --enable_type_checks test.dart
Attempting to write ./aardvark
Unhandled exception:
'dart:io': Failed type check: line 1888 pos 31: type '(int) => Dynamic' is not assignable to type '(bool) => void' of 'handler'.
 0. Function: '_File@14117cc4.set:existsHandler' url: 'dart:io' line:1888 col:31
 1. Function: '::main' url: '/home/masato/dart/test/test.dart' line:15 col:21

"--enable_type_checks"無しで実行すると何も言わないので、一応ちゃんと動いてるみたい。

まとめ

javascriptよりはるかにまっとうな言語なので早く普及してください。ちなみにsynonym.dartlang.orgにはjavascriptとdartを比較した色々な例が出てて、javascriptがいかに気持ち悪い言語かが良くわかる。

0 件のコメント:

コメントを投稿