Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
where 節のネスト
where節のネストについて筆者は勘違いしており誤った説明をしてしまいました. あらためて説明しなおします.
where 節はネストできます.
- where 節は直前の束縛の右辺に対してのみ働く
- 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 になります.
コメントをどうぞ!
Aira: (Sat Feb 18 14:04:50 2012
)