[#30722] JSON ライブラリの取り込み — "NARUSE, Yui" <naruse@...>

naruseです。

20 messages 2007/04/21

[ruby-dev:30738] Re: Ruby 1.9: multiple splats on rvalues in parallel assignment

From: SASADA Koichi <ko1@...>
Date: 2007-04-26 16:30:13 UTC
List: ruby-dev #30738
 ささだです.

 多分,対応できたと思います.あとでコミットしておきます.

Yukihiro Matsumoto wrote:
> 入ってないですねえ。
> 
>   a = [1,2,3,4,5]
>   [*[1,2],3,4,5] == a
>   [1,2,3,*[4,5]] == a
>   [*[1,2],3,*[4,5]]  == a
>   [*[1,2,3,4,5]] == a
>   [*[1,2,3],*[4,5]] == a
> 
> くらいが通れば大丈夫なんでないでしょうか。
> 
 foo(a, *b, *c) (引数)や x, y, z = a, *b, *c (多重代入)は,それぞれ
特別な処理をしているので,それだけでは足りません.それぞれのテストが必要
になります.

 x, y, z = a, b, *c は,x, y = a, b; z = *c のように,かなり親切にコン
パイルしていたんですが,こういう多重代入が出てくるともう大変なので,x,
y, z = *[a, *b, *c] のようにコンパイルするようにしました.

例:
a, b, c, d = *[1], 2, *[3], 4
#=>
Ruby で書くとこんな感じ:
a, b, c, d = [1].to_splat.concat([2]).concat([3]).concat([4])

コンパイル結果:
0002 duparray         [1]
0004 splatarray       false
0006 putobject        2
0008 newarray         1
0010 concatarray
0011 duparray         [3]
0013 concatarray
0014 putobject        4
0016 newarray         1
0018 concatarray
0019 expandarray      4, 0
0022 setlocal         d
0024 setlocal         c
0026 setlocal         b
0028 setlocal         a

 いかにも重そうな処理をやっていますが(matzruby と同じくらいのコストか
な?),まぁ,多重代入で性能が変わるとも思えないので,こんなところでいい
かな,と.

-- 
// SASADA Koichi at atdot dot net



In This Thread