[#13493] yield *[[]] — Tanaka Akira <akr@...17n.org>

しばらく前に、yield *[[]] の挙動に関して bug report をして、まつもとさ

96 messages 2001/06/07
[#13494] Re: yield *[[]] — nobu.nakada@... 2001/06/07

なかだです。

[#13496] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/08

In article <200106071409.XAA21101@sharui.nakada.kanuma.tochigi.jp>,

[#13503] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/08

まつもと ゆきひろです

[#13506] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/08

In article <991988462.179562.20598.nullmailer@ev.netlab.zetabits.com>,

[#13512] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/08

まつもと ゆきひろです

[#13497] Re: yield *[[]] — Shugo Maeda <shugo@...> 2001/06/08

前田です。

[#13500] Re: yield *[[]] — "K.Kosako" <kosako@...> 2001/06/08

Shugo Maedaさんの<87lmn336s3.wl@localhost.netlab.jp>から

[#13501] Re: yield *[[]] — Shugo Maeda <shugo@...> 2001/06/08

前田です。

[#13504] Re: yield *[[]] — "K.Kosako" <kosako@...> 2001/06/08

Shugo Maedaさんの<87hexr316u.wl@localhost.netlab.jp>から

[#13505] Re: yield *[[]] — Shugo Maeda <shugo@...> 2001/06/08

前田です。

[#13511] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/08

まつもと ゆきひろです

[#13526] Re: yield *[[]] — Shugo Maeda <shugo@...> 2001/06/09

前田です。

[#13530] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/09

In article <m38zj242y9.wl@localhost.localdomain>,

[#13549] Re: yield *[[]] — Shin-ichiro HARA <sinara@...> 2001/06/12

原です。

[#13553] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/12

In article <4.3.2-J.20010612154813.02c89a70@blade.nagaokaut.ac.jp>,

[#13554] Re: yield *[[]] — Shin-ichiro HARA <sinara@...> 2001/06/12

原です。

[#13560] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/13

In article <4.3.2-J.20010612185543.00c8b988@blade.nagaokaut.ac.jp>,

[#13561] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/13

まつもと ゆきひろです

[#13566] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/13

In article <992410104.066682.22743.nullmailer@ev.netlab.zetabits.com>,

[#13591] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/14

In article <hvor8wo501g.fsf@flux.etl.go.jp>,

[#13597] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/14

まつもと ゆきひろです

[#13598] Re: yield *[[]] — Tanaka Akira <akr@...17n.org> 2001/06/15

In article <992533086.935976.4066.nullmailer@ev.netlab.zetabits.com>,

[#13616] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/19

まつもと ゆきひろです

[#13622] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/22

まつもと ゆきひろです

[#13628] Re: yield *[[]] — matz@... (Yukihiro Matsumoto) 2001/06/23

まつもと ゆきひろです

[#13633] Re: yield *[[]] — keiju@... (石塚圭樹) 2001/06/24

けいじゅ@日本ラショナルソフトウェアです.

[#13647] Re: yield *[[]] — "KANEMITSU Masao" <masao-k@...> 2001/06/25

金光です。

[#13567] Parallel Assignment — Shin-ichiro HARA <sinara@...> 2001/06/13

原です。

[#13577] Re: Parallel Assignment — matz@... (Yukihiro Matsumoto) 2001/06/13

まつもと ゆきひろです

[#13650] Re: [ruby-ext:01803] Re: Ruby/SDL on PS2 LinuxKit — WATANABE Hirofumi <eban@...>

わたなべです。

56 messages 2001/06/26
[#13653] Re: [ruby-ext:01803] Re: Ruby/SDL on PS2 LinuxKit — matz@... (Yukihiro Matsumoto) 2001/06/26

まつもと ゆきひろです

[#13659] library search path — matz@... (Yukihiro Matsumoto) 2001/06/26

まつもと ゆきひろです

[#13906] Re: library search path — nobu.nakada@... 2001/07/16

なかだです。

[#13978] Re: library search path — nobu.nakada@... 2001/07/21

なかだです。

[#13990] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/22

まつもと ゆきひろです

[#14002] Re: library search path — nobu.nakada@... 2001/07/23

なかだです。

[#14011] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/23

まつもと ゆきひろです

[#14017] Re: library search path — "U.Nakamura" <usa@...> 2001/07/24

こんにちは、なかむら(う)です。

[#14020] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14036] Re: library search path — nobu.nakada@... 2001/07/24

なかだです。

[#14075] Re: library search path — nobu.nakada@... 2001/07/25

なかだです。

[#14079] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/25

まつもと ゆきひろです

[#14090] Re: library search path — nobu.nakada@... 2001/07/25

なかだです。

[#14095] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/26

まつもと ゆきひろです

[#14115] Re: library search path — akira yamada / やまだあきら <akira@...> 2001/07/26

[#14121] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/26

まつもと ゆきひろです

[#14136] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/27

まつもと ゆきひろです

[#14137] Re: library search path — nobu.nakada@... 2001/07/27

なかだです。

[#14138] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/27

まつもと ゆきひろです

[#14141] Re: library search path — nobu.nakada@... 2001/07/27

なかだです。

[#14142] Re: library search path — matz@... (Yukihiro Matsumoto) 2001/07/27

まつもと ゆきひろです

[#14148] Re: library search path — nobu.nakada@... 2001/07/28

なかだです。

[#13666] net/http.rb warnings — nobu.nakada@...

なかだです。

14 messages 2001/06/26

[#13668] ruby_m17n make error — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

43 messages 2001/06/26
[#14038] Re: m17n ruby 特に TRON 文字コード — "TOYOFUKU Chikanobu" <toyofuku@...> 2001/07/24

豊福です。

[#13705] eval(code, true, filename) — Shugo Maeda <shugo@...>

前田です。

14 messages 2001/06/29

[ruby-dev:13528] Re: yield *[[]]

From: Tanaka Akira <akr@...17n.org>
Date: 2001-06-09 13:34:40 UTC
List: ruby-dev #13528
In article <992022213.746115.25347.nullmailer@ev.netlab.zetabits.com>,
  matz@zetabits.com (Yukihiro Matsumoto) writes:

> |asgn.rb を読んでみましたが... なんというか nil.to_a が [] であることを
> |巧みに利用した仕様ですねぇ。いまのところ穴は見当たりません。
> 
> 今までちゃんと考えてなかったんで、良い機会でした。

さらに検討してみたところ、いくつか疑問が湧いてきました。

(1) ... = arg, *[] の挙動

% ruby -e 'a, b = [1, 2], *[]; p [a,b]'
[[1, 2], nil]

*[] が展開されて消えるとすれば、[1, 2] と表示されるというのが意図する
挙動な気がします。

(2) ... = ..., *non-array の挙動

% ruby -e 'a, b = 1, *2'
-e:1: failed to convert Fixnum into Array (TypeError)

* が右辺先頭にある場合には例外が起きないので一貫性に欠けると感じます。
そもそも「配列への変換」というのはどのようにして行なわれるのでしょうか?

(3) 自己代入の右辺で複数の式が扱えてもいい気がする.

  % ruby -e 'a = [1]; a += 2, 3; p a'        
  -e:1: parse error

もはや多重代入の右辺はなんらかの(ひとつの)値を生成するための形式なので、
自己代入の右辺に使えない理由はないと思います。

(4) Proc との関連性

    self[arg ...]
    call(arg ... )
        手続きオブジェクトを実行します.引数はブロックの引数にそのまま
        (多重代入のルールに従い)代入されます.

というマニュアルの記述はもはや明らかに正しくありません。
(以前正しかったのかどうかも怪しいところですが。)

% ruby -e 'lambda {|a,| p a}.call([1,2,3])'  
[1, 2, 3]
% ruby -e 'a, = [1,2,3]; p a'
1

% ruby -e 'a, = 1,2,3; p a'     
1
% ruby -e 'lambda {|a,| p a}.call(1,2,3)'  
-e:1: wrong # of arguments (3 for 1) (ArgumentError)
        from -e:1:in `call'
        from -e:1

さて、現在の挙動をちゃんと理解できたかどうかを確認するために、私が理解
しているところの挙動を(マニュアル風に)書き下してみました。この理解は正
しいでしょうか? (左辺の記述が甘いのは承知していますが。)

  代入
    文法:
      左辺式 '=' 右辺式

    左辺式の文法:
      変数
      定数
      式`['expr..`]'
      式`.'識別子

    右辺式の文法:
      式

  多重代入
    左辺式の文法:
      左辺式 `,' [左辺式 [`,' 左辺式 ...] [`,']]
      [左辺式 `,' ...] `*' [左辺式]

    右辺式の文法:
      式 `,' 式 [`,' 式 ...]
      [式 `,' ...] `*' 式

    代入の左辺・右辺には複数の式を記述することができ、
    どちらかにでも複数の式がある場合の代入を多重代入といいます。

    左辺に複数の式が記述された場合、
    右辺の値が配列に変換され、各要素がそれぞれの式に代入されます
    左辺の式の数よりも配列の要素の数の方が多い場合には、
    余った要素は無視されます。
    配列の要素が足りない場合には対応する要素の無い式には nil が代入されます。
    左辺の最後の式の直前に * がついていると、
    対応する左辺のない余った要素が配列として代入されます。
    余った要素が無い時には空の配列が代入されます

    右辺の最後に「`*' 式」がある場合、その式の評価結果は
    配列に変換され、右辺に展開されます。
    展開後、右辺に式がなくなった場合、nil が右辺の値になります。
    右辺の式がひとつになった場合はその式の値が右辺の値になります。
    右辺に複数の式がある場合はそれらの配列が右辺の値になります。

    つまり、右辺式が「式1 `,' ... `,' 式n」という形であった場合、
    [式1の値, ..., 式nの値] という配列が右辺の値になります。

    また、右辺式が「式1 `,' ... 式n `,' `*'式0」という形であった場合、
    基本的には [式1の値, ...  式nの値, *式0の値]という配列が右辺の値になります。
    ただし、右辺式が「`*' 式」という形で配列に変換した式の値が [] の場合、
    nil が右辺の値になります。
    また、右辺式が「`*' 式」という形で
    配列に変換した式の値が要素を一つしか持たない配列であった場合、
    その要素が右辺の値となります。
    さらに、右辺式が「式1 `,' `*' 式2」という形で
    配列に変換した式2 の値が [] の場合、
    式1 の値自体が右辺の値となります。

    多重代入も式であり、その値は右辺の値です。
    ただし、式自体に `,' が含まれるため、
    引数など、式の後に `,' が現れる可能性のある文脈に使用する時は
    かっこで括る必要があります。

> 意外ですが、Pythonでも許されているのです。Pythonの場合
> formal argumentにもできると思う。

あぁ、そういや Python でもできますね。忘れてました。昔は知っていたはず
なんですが、ぜんぜん思い出しませんでした。かわりに ML を思い出しました
が。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)

In This Thread