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

yarv-dev:24

From: "K.Sasada" <ko1 namikilab.tuat.ac.jp>
Date: Mon, 17 May 2004 16:58:13 +0900
Subject: [yarv-dev:24] Re: initialize block local variables

ML: yarv-dev quickml.atdot.net
新メンバー: ko1@n...

  matz ruby-lang.org (Yukihiro Matsumoto) wrote :
    [ [yarv-dev:23] Re: initialize block local variables ]
    at Mon, 17 May 2004 16:14:38 +0900

 ささだです。
 迅速なご返信に感謝します。


> evalで増えたりしないのでより静的にできるとかを考えてました。

 eval などの動的な部分は考えてもみませんでした。

 そういえば、eval 中で出てきた新しい変数って、ブロックロー
カル変数扱いになるんだと思っていたのですが、どうなんでしょう
か。揮発性(?)メソッドローカルみたいな変なものを新しく導入
したりするんでしょうか。

 って、現在の実装もよくわかっていないのでソース見て出直して
きます。

eval('i=1; p defined?(i)')
p i

#=>
"local-variable"
t.rb:4: undefined local variable or method `i' for main:Object (NameError)


> |2. ブロックパラメータの渡し方

> ここはまだ決めていません。おそらくは「多重代入と同じだが、多
> 重代入が現状よりも整理される」のではないかと。
> 
> 現状の多重代入は複雑怪奇なルールですが、新しいものは
> 
>   * return, yieldなどに複数の値を渡すとValuesオブジェクトを
>     作る。
> 
>   * 複数の左辺値はValuesオブジェクトの各要素と対応する。

 配列を展開する今の仕様は obsolete ということでしょうか。

 また、配列の展開によるブロックパラメータの渡し方である、

  def m
    yield([1,2])
  end

  m{|i,j|
    p i,j #=> 1,2
  }

 は、駄目になるんでしょうか。


> | 新しく導入するキーワード引数もブロックパラメータに含まれる
> |のでしょうか。
> 
> 気持ちとしてはlamdaを予約語にしてlambdaのパラメータだけキー
> ワード引数やブロック引数を受け付けるようにしたいのですが、
> define_methodのようなメソッドのためには普通のブロックパラメー
> タにもこれらを含みたいんですよね。悩んでます。

 define_method の仕様を変えて、ブロックとしてわたってきた NODE
をメソッドとして利用する、ような対応は不可能でしょうか。

  define_method(:m){|i,j|
    ...
  }
  <= 無理やり同じ =>
  eval <<-EOS
    def m(i,j)
      ...
    end
  EOS

 こういう無理やりな操作はあとで後悔するかな・・・。


> 評価順序は基本的に左から右、上から下です。
> 文法は
> 
> 定義側
> 
>   def foo(a, b=15, *rest, c:val, **krest)
>     ...
>   end
> 
> 呼び出し側
> 
>   foo(1, 2, 4, *ary, c:44, k:42, **hash)
> 
> です。


 評価順序、という言葉は、キーワード引数がどこに来てもいいも
のだと思っていたのでそう書きました。


callee:
def foo(a, b, c, *rest, k:100, **krest)
  p a,b,c,k,rest
end

caller:
foo(1, 2, k:3, 4, 5)

#=> 1 2 4 3 5

 のようなものを想像していました。
(キーワード引数をサポートした言語を知らないので。すみません)


 最後にまとまるんなら、問題ないかもしれませんね。
(でも、どういうふうにアクセスするんだろう。新しい
node or bytecode を増やして実現するのかな。)


 また、proxy オブジェクト作るときとかの method_missing は、

  def method_missing *args, **kargs
    ...
    someobj.send *args, **kargs # (A)
  end

 のように書かないといけなくなるんですね。
((A) の部分は本当にこう書くのかわかりませんが)


-- 
// SASADA Koichi at atdot dot net
//



--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

このMLを退会する方法:
- 本文が空のメールを <yarv-dev quickml.atdot.net> に送ってください
- 本文が空のメールを送れない場合は、
  本文に「退会」とだけ書いたメールを <yarv-dev quickml.atdot.net> に送ってください
  (署名やhotmailの広告などがついて空メールを送れない場合など)

<yarv-dev quickml.atdot.net> のメンバー:
ko1@a...
aamine@l...
babie7a0@y...
cv8t-hdk@a...
fukumori@m...
g-stuff@b...
gotoyuzo@n...
iga@r...
ikoma@m...
kawaji@h...
kou@c...
kumaryu@k...
maeda-yarv@a...
makoto.nakagawa@h...
masato@c...
matz@r...
nobsun@s...
nobu.nakada@n...
sakai@t...
sheepman@t...
shudo@c...
shugo@r...
usa@g...
yuya-ml@4...
zn@m...
nobu.nokada@s...
ko1@n...

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

        15 2004-05-17 04:14 [ko1 atdot.net       ] initialize block local variables        
        16 2004-05-17 08:38 ┗[matz ruby-lang.org  ]                                       
        17 2004-05-17 10:37  ┣[ko1 atdot.net       ]                                     
        20 2004-05-17 13:23  ┃┗[matz ruby-lang.org  ]                                   
        22 2004-05-17 15:58  ┃ ┗[ko1 atdot.net       ]                                 
        23 2004-05-17 16:14  ┃  ┗[matz ruby-lang.org  ]                               
->      24 2004-05-17 16:58  ┃   ┗[ko1 namikilab.tuat.a]                             
        25 2004-05-17 17:27  ┃    ┗[matz ruby-lang.org  ]                           
        26 2004-05-17 18:09  ┃     ┗[ko1 atdot.net       ]                         
        27 2004-05-17 18:38  ┃      ┗[matz ruby-lang.org  ]                       
        21 2004-05-17 13:45  ┗[nobu.nokada softhome]