2012年01月24日 23:30 [Edit]
rust - を早速試してみた
思いのほか完成度が高くてびっくり。
論より証拠で、わざと特長的な機能を無駄に使ってfizzbuzzを書いてみた。
fizzbuzz.rs
use std; // for std::io and std::map
native mod c {
fn atoi(src: *u8) -> ctypes::c_int;
}
fn rust_atoi(s:str) -> int unsafe {
ret c::atoi(vec::unsafe::to_ptr(str::bytes(s))) as int;
}
fn main(args:[str]) {
let n:uint = vec::len(args) > 1 as uint // 1 is int, not uint
? rust_atoi(args[1]) as uint // uint::from_str() to be safe
: 100u; // 100u is uint
// don't you guys love closures ?
let fizz = fn@(n:uint)->str{ n % 3u == 0u ? "Fizz" : "" };
// and vec(tor) literals ?
let buzz = fn@(n:uint)->str{ ["Buzz", "", "", "", ""][n % 5u] };
// hash is not built-in
let fizzbuzz:std::map::map = std::map::new_uint_hash();
uint::range(0u, n) { |n| // definitely makes rubyists happy
fizzbuzz.insert(n + 1u, fn@(n:uint)->str{
let fz = fizz(n) + buzz(n);
ret str::is_empty(fz) ? uint::to_str(n, 10u) : fz;
}(n + 1u)); // range is like python: 0..n - 1
};
fizzbuzz.items(fn@(&&k:uint, &&v:str) {
std::io::println(uint::to_str(k, 10u) + " -> " + v);
});
}
Pros
- closureが普通に使える!
- ただの「無名関数」ではなく、スコープ外の変数をきちんとencloseする本当の意味でのclosure。「普通に」というのは、PHPやC++11やPythonのように、encloseする変数を明示する必要がないということ。
- rubyishなブロックも使える!
- 型指定が
name:type type nameだと引数の型が書きにくいったらありゃしない。- 配列リテラルがネイティブサポート
- 上記のbuzzに注目。普通にああ書ける。
- Cのライブラリーを直に呼べる
- Pythonのctypesみたいなノリで、それ以上に自然な感じで。
- プリミティブがオブジェクトじゃない
- 例えば
uint::to_str(n, 10u)をn.to_str(10u)と書けない。オブジェクトであるfizzbuzzはfizzbuzz.items(...)と書けるのに - ビルトインの機能で足りないのがまだ結構ある
- たとえば
vec::sortすらなかったり。Regexp?なにそれ? - スクリプト言語ではない
- 今のところは明示的に
rustcでコンパイルして実行する必要がある。でもCだって今やtccがあるし。LL化の障壁は意外と低いかも - Rustって名前はどうよ?
- 錆ですぞ錆。それだけ「枯れていることを目指して」いるのかも知れないけど
Cons
もちろんいい点ばっかりじゃなくて…
美人とは言えないけど、気に入りました。新しい言語を作っているというより古い言語の「がっ」なところを地味に直しているところが特に。
2012年はプログラミング言語を作りたい - Islands in the byte stream新しいパラダイムや夢のような新機能はいらない。むしろ、言語仕様は小さくあるべきだ。それでいてより良い。そんな「next Perl」を作りたい。
大いに参考になるはず。
Dan the Man with too Many Languages to Speak
Posted by dankogai at 23:30│Comments(0)│TrackBack(0)