yarv-dev:286
From: MAEDA Atusi <maeda-yarv atusi.org>
Date: Tue, 2 Nov 2004 20:05:37 +0900
Subject: [yarv-dev:286] Re: multivple values (Re: multiple assgin return value)
SASADA Koichi <ko1 atdot.net> writes: > 今日ずっと考えていたんですが、そもそも多値をサポートする理 > 由ってなんでしたっけ。言語仕様が綺麗になるから? Common LispとかSchemeだと、「綺麗になる」という論拠があるとすれば、 ・多引数の関数があるのに、なんでcontinuationが多引数じゃいけないんだ。 ということでしょうね。 実際に複数の値を返したい時はあって、例えばCのfgetsなんかは「エラーや EOFになったかどうか」と「読み込んだ値」を返したいんだけど、できないか らステータス以外は副作用で返すのが定石になってますね。 Common Lispだとハッシュ表を引くGETHASH関数は、キーに対応する値が存在し なければNILを返しますが、それだと「キーに対応する値がNILだった」時と区 別できないので、2つめの値として「値が見つかったかどうか」を返します。 でも、実際に多値を使ってみると、少なくともCLでは「綺麗」とはほど遠いプ ログラムになります。 Common Lispに多値を入れた実際的な理由は、 ・複数の値を返すが、ほとんど最初の値しか使わないような関数がある時、 使うのが少し楽になる。 例えば、floor が「商と剰余をconsしたpairを返す」としても良いんだけど、 (+ (car (floor 5 3)) (car (floor 19 4))) みたいに書くより (+ (floor 5 3) (floor 19 4)) と書きたい。 (そのかわり、全部の値を使うのは面倒になるので、トレードオフがある。) ・同じく、複数の値を返すのを、効率良くしたい(メモリを割り付けたくない)。 そのために、普通のケースが遅くなるようだと本末転倒ですけどね。 なんてとこじゃないでしょうか。 要するに「受けとったり、受けとらなかったりしたい」っていうお気楽な言語 特有のものかも知れません。 MLやHaskellなどのコミュニティに聞けば、「どうせ常に複数の値を返すなら、 素直にタプルなりレコードなりを返せば良いじゃん」ということになるでしょ う。で、コンパイラが頑張ってなるべくメモリ割り付けしないようにする。 あ、あと、Common Lispだと、 ・副作用だけのための関数(Cでいうvoid, Pascalのprocedure)を書く時、「0 個の値を返す」と書くと綺麗かも。 というのもあるかな。 前田敦司 -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
268 2004-11-01 19:28 [ko1 atdot.net ] multiple assgin return value 269 2004-11-01 19:56 ┗[matz ruby-lang.org ] 270 2004-11-02 05:27 ┗[ko1 atdot.net ] 271 2004-11-02 05:38 ┣[ko1 atdot.net ] 273 2004-11-02 08:01 ┃┗[matz ruby-lang.org ] 272 2004-11-02 08:00 ┣[matz ruby-lang.org ] 274 2004-11-02 08:15 ┃┗[ko1 atdot.net ] 275 2004-11-02 08:25 ┃ ┗[matz ruby-lang.org ] 276 2004-11-02 09:14 ┃ ┗[ko1 atdot.net ] 277 2004-11-02 09:36 ┃ ┗[matz ruby-lang.org ] 279 2004-11-02 14:05 ┃ ┣[maeda-yarv atusi.org] multivple values (Re: multiple assgin return value) 280 2004-11-02 14:49 ┃ ┃┗[matz ruby-lang.org ] 281 2004-11-02 17:54 ┃ ┃ ┣[maeda-yarv atusi.org] 282 2004-11-02 18:14 ┃ ┃ ┃┗[ko1 atdot.net ] 284 2004-11-02 19:37 ┃ ┃ ┃ ┗[maeda-yarv atusi.org] 283 2004-11-02 18:16 ┃ ┃ ┗[ko1 atdot.net ] 285 2004-11-02 19:47 ┃ ┃ ┣[matz ruby-lang.org ] 288 2004-11-02 20:43 ┃ ┃ ┃┗[ko1 atdot.net ] 289 2004-11-02 23:31 ┃ ┃ ┃ ┣[shugo ruby-lang.org ] 293 2004-11-03 08:35 ┃ ┃ ┃ ┃┗[ko1 atdot.net ] 290 2004-11-03 01:17 ┃ ┃ ┃ ┗[matz ruby-lang.org ] 291 2004-11-03 03:54 ┃ ┃ ┃ ┣[maeda-yarv atusi.org] 294 2004-11-03 08:57 ┃ ┃ ┃ ┃┗[matz ruby-lang.org ] 296 2004-11-03 11:58 ┃ ┃ ┃ ┃ ┗[maeda-yarv atusi.org] 298 2004-11-03 14:34 ┃ ┃ ┃ ┃ ┣[akr m17n.org ] 299 2004-11-03 15:39 ┃ ┃ ┃ ┃ ┃┗[maeda-yarv atusi.org] 315 2004-11-04 11:46 ┃ ┃ ┃ ┃ ┃ ┗[akr m17n.org ] 307 2004-11-04 01:49 ┃ ┃ ┃ ┃ ┗[matz ruby-lang.org ] 308 2004-11-04 02:08 ┃ ┃ ┃ ┃ ┗[shugo ruby-lang.org ] 310 2004-11-04 02:48 ┃ ┃ ┃ ┃ ┗[matz ruby-lang.org ] 292 2004-11-03 08:32 ┃ ┃ ┃ ┣[ko1 atdot.net ] 300 2004-11-03 17:36 ┃ ┃ ┃ ┃┣[matz ruby-lang.org ] 301 2004-11-03 22:19 ┃ ┃ ┃ ┃┃┗[ko1 atdot.net ] 304 2004-11-03 23:29 ┃ ┃ ┃ ┃┗[shugo ruby-lang.org ] 311 2004-11-04 02:56 ┃ ┃ ┃ ┃ ┗[ko1 atdot.net ] 312 2004-11-04 09:40 ┃ ┃ ┃ ┃ ┗[shugo ruby-lang.org ] 313 2004-11-04 09:45 ┃ ┃ ┃ ┃ ┗[ko1 atdot.net ] 314 2004-11-04 10:58 ┃ ┃ ┃ ┃ ┗[shugo ruby-lang.org ] 316 2004-11-04 12:48 ┃ ┃ ┃ ┃ ┗[ko1 atdot.net ] 295 2004-11-03 09:29 ┃ ┃ ┃ ┗[ko1 atdot.net ] -> 286 2004-11-02 20:05 ┃ ┃ ┗[maeda-yarv atusi.org] 287 2004-11-02 20:13 ┃ ┃ ┗[matz ruby-lang.org ] 302 2004-11-03 22:21 ┃ ┗[ko1 atdot.net ] 303 2004-11-03 22:54 ┃ ┗[matz ruby-lang.org ] 305 2004-11-03 23:31 ┃ ┗[ko1 atdot.net ] 306 2004-11-04 00:49 ┃ ┗[matz ruby-lang.org ] 278 2004-11-02 12:40 ┗[maeda-yarv atusi.org]