[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:281

From: MAEDA Atusi <maeda-yarv atusi.org>
Date: Tue, 2 Nov 2004 17:54:53 +0900
Subject: [yarv-dev:281] Re: multivple values (Re: multiple assgin return value)

Yukihiro Matsumoto <matz ruby-lang.org> writes:

> |Common Lisp風にすれば、現在のプログラムはそのままで行けませんか?
> 
> そうかも。全部VMスタックに積むことを考えていました。先頭の値
> だけを通常の戻し方をして、なんらかの手段で他にも値があること
> を伝えてやるだけでいいんですね。

はい。

さらにオーバーヘッドを減らす(通常のreturnではnvaluesをセットしなくてよ
いようにする)方法が
  An Efficient Implementation of Multiple Return Values in  Scheme.
  J. Michael Ashley and R. Kent Dybvig. 1994 ACM Conference on
  LISP and Functional Programming, pp. 140-149, June 1994.
  (http://www.cs.indiana.edu/~dyb/pubs/mrvs.pdf)
にありました。

呼び出し側で、svの場合とmvの場合の2つのリターンポイントを用意しておく
という方法です。

     call命令
Lmv: 多値を返す場合のリターンポイント(1命令)
Lsv: 通常のリターンポイント

というように。

  1つだけの値を期待するコード: (Schemeでは、これに多値を返すとエラー)
	 call
    Lmv: jump error
    Lsv: 

  値を捨てる(副作用のみのために呼び出す)コード:
	 call
    Lmv: nop
    Lsv: 

  多値を期待するコード:
	 call
    Lmv: jump Lskip
    Lsv: nvalues ← 1
    Lskip:

Common Lisp風に、svな文脈で多値が返ってきたら最初の値だけを使って後は
捨てるようにするには、0個の値の時には最初の値レジスタにNILを入れて返す
とともに、
  1つだけの値を期待するコード: (CL風)
	 call
    Lmv: nop
    Lsv: 
で良いとのことです。

> |svな文脈でも、返ってきたのが多値かどうかチェックするわけですよね。
> |多値を使わない場合のオーバーヘッドが気になります。
> 
> オーバーヘッドはあるでしょうが、Rubyのようなあちこちにチェッ
> クが入る言語では目立たないと目算していました。甘いかも。

たとえば、
  o1.method1(o2.method2, o3.method3)
の場合、method2やmethod3の返した値がValuesかどうか調べないといけません
ね。

また、
  1 + o.method
の足し算をインライン展開できたとして、足し算する前にmethodの返り値が
Valuesかどうかやはりチェックしないといけませんね。

つまり、svな文脈でメソッド呼び出しをすると、必ずチェックが入ってしまう
ように思います。

				前田敦司

--
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]