いやなブログ: 配列操作の比較表: Ruby, Python, JavaScript, Perl, C
プログラムを書いていると、他のプログラミング言語の記憶とごっちゃになって、「配列の後ろに要素を追加するのは push だっけ、 append だっけ」などと混乱することがあります。特に Ruby, Python, JavaScript はコードの書き方が似ているので、この問題が起きがちです。
ということで perl6 (pugs) で調べてみました。
Ruby | Perl6 |
---|---|
a = [1, 2, 3] | @a = (1, 2, 3) |
a.length | @a.elems |
a.empty? | @a.elems == 0 |
a.push(x) | @a.push($x) |
a.unshift(x) | @a.unshift($x) |
a.pop | @a.pop |
a.shift | @a.shift |
a.concat( b ) | @a.push(@b) |
a.clear | @a = () |
a.insert(i, x) | @a.splice($i, 0, $x) |
a.delete(x) | |
a.delete_at(i) | @a.splice($i, 1) |
a.nitems { |e| e == x } | @a.grep({ $_ == $x }) |
a.include?(x) | any(@a) == $x |
a.index(x) | |
a.first | @a[0] |
a.last | @a[-1] |
a[i, l] or a.slice(i, l) | @a[$i..$i+$l-1] |
a[i..j] or a.slice(i..j) | @a[$i..$j] |
a[i...j] or a.slice(i...j) | @a[$i..$j-1] |
a.sort | @a.sort |
a.sort! | @a = @a.sort |
a.reverse | @a.reverse |
a.reverse! | @a = @a.reverse |
a.uniq | @a.uniq |
a.uniq! | @a = @a.uniq |
a.join(d) | @a.join($d) |
a.each | for @a => $x { ... } |
Pugs の svn からとってきた最新でためしています。 iif (any(@a) == $x) { } が perl6 っぽい。
ここではプリミティブをオブジェクトで扱いましたが、もちろんビルトインの function をつかって、push @a, 1; って書き方もそのまま使えます。perl6 ではプリミティブデータ型とそのリファレンスの操作においての区別はほとんどなく、
$foo = [1, 2, 3]; $foo.push(4);
なんてやれば思ったとおりに動きます。ちなみに perl5 でも CPAN モジュールの autobox を使うと、first-class object を扱えるようになるみたい。2年前の LL Saturday でこのネタしゃべった覚えが。。
# for $a => $x { ... }
for @a -> $x { }
# だよ
修正しました。
Posted by: miyagawa on September 4, 2005 04:15 PM