langsmith:296
From: Dan Kogai <dankogai dan.co.jp>
Date: Thu, 15 Sep 2005 22:40:57 +0900
Subject: [langsmith:296] Re: なぜ代入演算子に限ってright associativeなのか?
弾です。 On Sep 15, 2005, at 21:01 , MAEDA Atusi wrote: > (推測1) FORTRANの頃は,数学での「変数の定義」の書き方に > 近づけたかった. これが大きいでしょうねえ。ただ、現在の電脳言語で「代入」するのは 数値ばかりではないですからねえ。 > (推測2) 構文解析が楽だった. うーん、こちらはあやしい。これを突き詰めれば Forth だし。 > (推測3) > 式 → 変数 > という文法だと,アセンブリ言語とか教科書のアルゴリズムくらい > の単純さ > なら良いが式が複雑になると読みにくいかも. > (これは,単なる慣れの問題かも知れないので,実際には分かりま > せん.) > > たぶん,みんながそれに慣れちゃったので,という歴史的な理由が大 > きいんで > しょうね. 結局慣れの問題がある一方で、CのPerlの慣用句で、 while((c = getc()) != eof){ ... } とか (my $foo = $bar) =~ s/.*:://; とか、代入してすぐ評価したりというケースでは、 (左 辺 ← 右辺)→右辺 と切り返しが多くて大変 ですし、OOPでは object.accessA(new_value).accessB(new_value).print とか一貫して左→右なので。 あと、左←右で結構難儀だと思うのが、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; とこれまた大変きれいに書けます。 もっとも perl6 では自分で任意の operator を書けるの で、 sub infix:<→>($from, $to is rw){ $to = $from; } と定義しとけば $from → $to; と出来ちゃうわけですが。 # ==> が単純な代入に使えるかどうかは、Synopsis 6 を 見ても今一明らかじゃない。まだPugsでも==>は実装され てないし。 #せっかく -> が空いたのに、これは lambda にとられ ちゃいましたね。 逆に左 ← 右でいいと思うのは、初期化のときですね。さ すがに 0 → my $n; ってのはなんか気味が悪いので。 Dan the Assigning Man -- 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 ]