langsmith:299
From: MAEDA Atusi <maeda-langsmith atusi.org>
Date: 16 Sep 2005 12:37:55 +0900
Subject: [langsmith:299] Re: なぜ代入演算子に限ってright associativeなのか?
Dan Kogai <dankogai dan.co.jp> writes: > > (推測2) 構文解析が楽だった. > > うーん、こちらはあやしい。これを突き詰めれば Forth だし。 Pascalに限っていうと,構文解析の簡単さが,シンタックスにかなり影響して るのは確かです.gotoの飛び先ラベルに名前が使えない(符号なし整数しか使 えない)とか. > 結局慣れの問題がある一方で、CのPerlの慣用句で、 > > while((c = getc()) != eof){ ... } > > とか > > (my $foo = $bar) =~ s/.*:://; > > とか、代入してすぐ評価したりというケースでは、 (左 > 辺 ← 右辺)→右辺 と切り返しが多くて大変 「値と副作用の両方を使う」という(いかにもC的な)ちょい邪悪なプログラミ ングで,しかも「数学的な2項演算子の表記法を維持したい」となると,この 「行ったり来たり」に人間が合わせざるを得ないですね. > ですし、OOPでは > > object.accessA(new_value).accessB(new_value).print > > とか一貫して左→右なので。 この場合も,メソッドの引数の中に副作用があると,かなり混乱しますね. Javaでは評価順序がきっちりしてますが,C++とかだと「未定義動作」とか 言われそう. > あと、左←右で結構難儀だと思うのが、Schwartzian Transform. > > @result = map { $_->[0] } sort {$a->[1] <=> $b->[1] } map { [$_ => > length($_) ]} @data; > > というのは完全に右から左で、一行に収まりきれず複数行にまたがった > 時なんかは下から上ですし。これが Perl6 だと > > @result = @data.map({ [$^x => $^x.chars] }).sort({$^a.[1] <=> $^b. > [1]}).map{ $x.[0]}; > > と書けてずっとintuitiveになりますし、==> (piping > operator)を使うと > > @data ==> map { [$^x => $^x.chars] } > ==> sort{ $^a.[1] $^b.[1] } > ==> map { $^x.[0] } > ==> @result; > > とこれまた大変きれいに書けます。 Perlは良く知らないんですが(あまりに覚えづらいので手を出しかねている) map なんてのは関数型言語やLispから持ってきた表記なんでしょうね. Lispでは(当然)右から左でも,何の違和感もありません. piping operator というのは良くわかりませんが, . 演算子と代入を合わせ たものなんでしょうか.mapする関数の引数が複数あったらどうなるのかな. > 逆に左 ← 右でいいと思うのは、初期化のときですね。さ > すがに > > 0 → my $n; > > ってのはなんか気味が悪いので。 ま,←と→と両方使うのは混乱しそうなので,どっちかに統一するでしょうね. 特に理由がなければ,どの言語も←に合わせてて良いんじゃないかと思います. 前田敦司 -- ML: langsmith quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
293 2005-09-15 20:17 [dankogai dan.co.jp ] なぜ代入演算子に限ってright associativeなのか? 294 2005-09-15 21:01 ┣[maeda-langsmith atus] 296 2005-09-15 22:40 ┃┗[dankogai dan.co.jp ] 297 2005-09-16 09:47 ┃ ┣[takuo aya.or.jp ] 298 2005-09-16 12:06 ┃ ┃┗[maeda-langsmith atus] -> 299 2005-09-16 12:37 ┃ ┗[maeda-langsmith atus] 295 2005-09-15 21:38 ┗[shiro lava.net ]