2012年01月24日 23:30 [Edit]

rust - を早速試してみた

というわけで早速。

Mozillaから新しいプログラミング言語「Rust」のバージョン0.1がリリース - [モ]Modern Syntax
ということで言語マニアな方、どうぞ。

え?これで初物?


思いのほか完成度が高くてびっくり。

論より証拠で、わざと特長的な機能を無駄に使って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みたいなノリで、それ以上に自然な感じで。

Cons

もちろんいい点ばっかりじゃなくて…

プリミティブがオブジェクトじゃない
例えばuint::to_str(n, 10u)n.to_str(10u)と書けない。オブジェクトであるfizzbuzzfizzbuzz.items(...)と書けるのに
ビルトインの機能で足りないのがまだ結構ある
たとえばvec::sortすらなかったり。Regexp?なにそれ?
スクリプト言語ではない
今のところは明示的にrustcでコンパイルして実行する必要がある。でもCだって今やtccがあるし。LL化の障壁は意外と低いかも
Rustって名前はどうよ?
錆ですぞ錆。それだけ「枯れていることを目指して」いるのかも知れないけど

美人とは言えないけど、気に入りました。新しい言語を作っているというより古い言語の「がっ」なところを地味に直しているところが特に。

2012年はプログラミング言語を作りたい - Islands in the byte stream
新しいパラダイムや夢のような新機能はいらない。むしろ、言語仕様は小さくあるべきだ。それでいてより良い。そんな「next Perl」を作りたい。

大いに参考になるはず。

Dan the Man with too Many Languages to Speak


この記事へのトラックバックURL