[ruby-list:435] Re: Q. repeat

From: matz@... (Yukihiro Matsumoto)
Date: 1996-08-27 09:30:16 UTC
List: ruby-list #435
In message "[ruby-list:434] Q. repeat" on 96/08/27,
	Keiju ISHITSUKA <keiju@shljapan.co.jp> writes:

|
|けいじゅ@SHLジャパンです. 

|はありますが, n回だけ繰り返す
|
|n.repeat {
|  ...
|} 
|
|が, ないようです. リクエストさせて下さい.

これは

 100.times {
   ...
 }

があります.

|あと, 上記のイテレータは bignumやfloatにはありませんが, 何か理由がある
|のでしょうか?

実は上記のイテレータはNumericで定義されています.つまり実際
にはBignumやFloatにもあります.ドキュメントが古いんです.今
0.99.2用のドキュメントを用意していますから(日本語・英語とも)
ちょっと待ってください.

|これが, ruby の構文のポリシイとマッチしていないと感じるのですが...

つまり制御構造なのに end で終っていないという意味ですね.

|foo.each {|elm|
|  ...
|}
|
|が,
|
|for elm in foo 
|  ...
|end
|
|となるように, 一般のイテレータでもどうにかなりませんか?

どういう風にするのが良いと思いますか? 意見を聞かせてください.

一応,現時点では

  * 通常の制御構造は文として使われる事が圧倒的に多いが,イテ
    レータは比較的式として使われる事が多い

     例: grep, sub/gsubなど

  * ユーザ定義の制御構造は特別な(目立つ)形式の方が望ましいだ
    ろう

  * 今の形式はイテレータの実態(暗黙のブロック引数が付加され
    ている)を想像しやすい

  * ruby-modeを使えばちゃんとインデントできるだろう

  * 実はイテレータブロックには動的ローカルスコープの導入とい
    う働きも有り({}の中で初めて代入された変数の有効範囲はそ
    のブロックの中に限る),それを暗示する働きもある.ちなみ
    に for では動的ローカルスコープは導入されない

とかいうような理由で今のようになっています.

参考までにはるかな昔は

  do iter using foo
    ...
  end

という構文でした.ちょっと見慣れない構文ですね.その頃には今
のイテレータ構文はありませんでした.が,上にあげたような理由
で今のようになっています.

他の案として,互換性を捨てて今の制御構造を全部 { } を使った
ものに変更するというものも考えられますが,2年前ならともかく
今はちょっと受け入れがたいと感じています.

# begin,whenは {} と相性が悪く,while,ifは比較的良いという
# のは昔から分かっているのですが….

                                まつもと ゆきひろ /:|)

In This Thread

Prev Next