眠いのでPerl6について書いてみる
なんか眠い。というか体の調子悪い。
まぁそれはともかくPerl6について書いてなかったので今さらながらなんか書いてみることにする。
タイトルでは順接になってるけど気にしない。
Perl6の機能で便利と思ったものはたいたい次の通り。
- sigilの扱い
- 型宣言
- オブジェクト指向 e.g.: "hello world".say
- $obj.perl() # RubyのObject#inspect(だっけ?)のようなもの
- Junction e.g.: "foo" == ("foo" | "bar" | "baz")
ていうかもうほとんど全部。
これまで不便だと思っていた所が細かい所まで全て直されてるのはさすがという感じ。
あと{ ... }は無名サブルーチンだったり(ハッシュリファレンスはこれまで通り明示的な+{ ... }って書き方で作るのかな?)、引数の*@restってのもRubyっぽい感じ(ってRuby書いたことないけど)。
Perlはやっぱ色々できることはできるけど書き方がややこしいかったんだなーとPerl6を見たとき気が付いた。
個人的に欲しい機能にコールスタックを消費しないサブルーチン呼び出しをもっと簡単に書けるようにしてほしい。
use feature qw(say); sub func2 { say "enter: func2"; say "leave: func2"; } sub func { say "enter: func"; @_ = qw(foo bar baz); goto &func2; # goto &func2で現在のコールスタックのトップが # func2に置き換わるのでこれは表示されない say "leave: func"; } func();
Perl6ではこんな書き方したい。
sub func2 { say "enter: func2"; say "leave: func2"; } sub func { say "enter: func"; func2.exec(qw(foo bar baz)); # goto &func2で現在のコールスタックのトップが # func2に置き換わるのでこれは表示されない say "leave: func"; } func();
execって名前が個人的に気に入ってたり。
StrとかNumみたいにサブルーチンオブジェクト(リファレンス)のクラスがあればそこにメソッド追加すればできるのかな。
でもexec()メソッドを呼び出した時点でコールスタックを置き換えるなんてできるのかな。
つまり
メイン -> func() -> exec()
と来たら
メイン -> func2()
にするのはコールスタックを2段階置き換える必要があるので、追加メソッドではほぼ無理なんじゃないかという話。ソースフィルタとか使わない限り。(ソースフィルタはPerl6にもあるのかな...使ったことないけど)
やっぱこういうことを考えるとメソッドじゃなく特殊構文でしか表現できないかなやっぱ。
あとここからいきなりPerl6と関係ない話になるけど、最近CマクロにLisp系マクロみたいに構文木を操作できるだけの機能があればポインタなんていらなかったんじゃないかと思った。
まぁCでポインタ扱えなくなったらそれCじゃねーよという感じではあるけれど、マクロのようにコードの呼び出し元に展開されてしまえば、少なくともポインタを関数の結果の保存場所として指定するような使い方は恐らく必要がなくなるんじゃないかなーと思った。
Lispのマクロはすごい。やっぱLispすごい。
あとLispの例外処理にあたる、コンディションとかいう機能もなにやら凄そうだ。
他の言語の例外のように、ただコールスタックを巻き戻してtry?catchがあるとこまで飛ぶというだけじゃなくて、例外が起きる(コンディションオブジェクトが投げられる)と処理をその場で継続(Schemeのとは関係ない)させるかどうかを選べるらしい。
これSchemeでできるんだろうか。
そもそもコンディションをまだよく理解できていない俺がSchemeでできるのかなとか考えるだけ無駄だけど。
最近オレオレ言語を作ることばっかり考えてる。
前から言語を作りたいと思って、色々構想を練った自己満なメモを書きためたりしてるんだけど、何日か経ってから見返すと、この機能はこの言語のこういう機能の方が優れてるよねとかが判明しちゃったりして、本当に自己満足過ぎててワロタ。
あーもうだめ ねむい