Open Source WEB

where 節のネスト

where節のネストについて筆者は勘違いしており誤った説明をしてしまいました. あらためて説明しなおします.

where 節はネストできます.

  1. where 節は直前の束縛の右辺に対してのみ働く
  2. where 節は直前の束縛よりインデントは深くなければならない

いろいろな例を挙げてみましょう。

foo = bar + baz
where                  
  bar = 1
  baz = 2

↑は,2行目が 2. に違反しているのでシンタックスエラー.

foo = bar + baz
  where
  bar = 1
  baz = 2

↑は foo を評価すると 3 になります.

foo = bar + baz
  where
    bar = 1
    where 
      baz = 2

↑は4行目が 2. に違反しているのでシンタックスエラー.

foo = bar + baz
  where
  bar = 1
    where
    baz = 2

↑は 1. によりトップレベルからは5行目のbazの束縛が見えないので bazの定義が有効範囲にないというエラーになります.

foo = bar + baz
  where 
    bar = 1
    baz = baz + 1
      where
        baz = 1

↑のとき 4 行目の baz の束縛の右辺の baz の値は後の where 節の束縛 baz = 1 により定義された値となるので foo を評価すると 3 になります.

foo = bar + baz
  where 
    bar = bar + 1
    baz = 2
      where
        bar = 0

↑のとき 1. により3行目からは最後の行のbarの束縛は見えておらず, 3行目は自身を自身で定義する再帰的定義とみなされます.構文エラーは ないが,foo を評価には,bar の評価が必要である.ところが bar の評価は 停止しません.したがって,fooの評価も停止せず foo の値は表示されません. (評価はCtrl-Cなどを使って強制終了してください.)

foo = bar + baz
  where 
    bar = bar + 1
      where
        bar = 0
    baz = 2

↑の場合 foo を評価すると 3 になります.


コメントをどうぞ!

Name:
Comment:
Aira: (Sat Feb 18 14:04:50 2012 )
Always the best content from these pordiiguos writers.


このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us