遠藤です。また目からうろこが1枚ポロリと落ちました。

On Wed, 21 Apr 1999 15:38:14 +0900
matz / netlab.co.jp (Yukihiro Matsumoto) wrote:

> |>   def foo(cmd=Proc.new)
> |>     p cmd
> |>   end
> |> 
> |>   foo{p 1}
> |>   foo(Proc.new{p 1})
> |
> |この例は、どちらも引数として手続きを与えてしまっていないでしょうか?
> |つまり、def foo(cmd=Proc.new)のデフォルトのProc.newは実行されて
> |いないようです。
> 
> 前者はブロックを,後者は引数として手続きオブジェクトを与えて
> ます.で,前者の場合,デフォルト引数として Proc.new が呼び出
> され,ここでブロックを手続きオブジェクトに変換してます.

parse.yを読んだり、foo({})としたり、def bar;endとして、bar{}と
やったりしてようやく納得しました。イテレータブロックのsyntaxと
同じことですねえ。。。最後のbar{}で{}が使われてないよーという
メッセージが出てこないというのがまた面白い(?!) いれません?
それはさておき、ソースをみて、Proc.newで何が出てくるんだろ、と
興味を抱いたのがはまった原因とはいえ、逆に新しい発見をさせて
いただきありがとうございました。

> |まだまだローカル変数のスコープもあやしくて、頭にlocal = nil を
> |置きたい気持ちと戦っていますし、
> 
> 実はブロック内初出のローカル変数は同じローカル変数でもアクセ
> ス速度が遅かったりしますので,頭に local = nil とやるのはお
> 勧めです.遠慮なく.

この話は前も一度お聞きしましたが、せっかく変数宣言がいらないのに
宣言まがいの文を置くのが私の美学に合わなくて。Perlの時はmyを
置かなければどうしようもないので置いたわけですが。それと、メモリ
が貴重だった時にプログラミングを覚え始めたことも影響しているかも
しれません。Rubyでプログラミングを始めました、という世代が早く
誕生することを願っています。今朝も電車の中で厚いCの本を読んでいる
学生とおぼしき人がいましたが、Cを覚えるとハードよりのプログラミング
手法を身につけてしまいますよ、とおせっかいをやきたくなります。

> |お祈りの方は、あちこち心当たりでやってみます。うまく聞いてもら
> |えるとも思えませんが。
> 
> キリスト教系だと喜びます.^^;;;

カトリックでよろしいでしょうか? 日基(ん? 字は合ってるかな)なら
近くにありますが、聖公会は立教? ギリシャ正教ならついでに秋葉原。

またはまったらお世話になります。
----
Akira Endo, akendo / t3.rim.or.jp