Subject | : Set演算子の結合規則に付いて |
Article No | : 647 |
Date | : 2008/09/24(Wed) 19:05:18 |
Contributor | : Akio Morita |
Set演算子(=)の結合規則ですが、SAD/Tkinterマニュアルによれば a = b -> Set[a, b] a = b = c -> a = (b = c) -> Set[a, Set[b, c]] と右再帰で解釈される(グループ化される)と記述されています。
同一優先順位のSetDelayed演算子(:=)などと混在させた場合は、 現在の SADインタープリターの実装でも a = b := c -> a = (b := c) -> Set[a, SetDelayed[b, c]] のように右再帰で解釈されています。
ですが、同一の演算子が続く場合、現在のインタープリターは次のように解釈します。 a = b = c -> Set[a, b, c]
問題は、Set[a, b, c]の評価時の上方値の解決にあります。 例えば、aに対してのSet[a, foo_]を UpsetDelayedしている場合でも、 Set[a, b, c]は Set[a, foo_]にマッチしないので、式''a = b = c''が cの評価値を bへ代入し、部分式''b = c''の評価結果を aへ代入するという 直感的解釈と実行結果が一致しなくなっています。
特に、a = b = cの評価時に aや bに対してSetDelayed[a, bodyA], UpsetDelayed[Set[a, foo_], setA]のような Proxy的な定義を行っている場合、 これらの定義(SetDelayed[a, bodyA]など)をSet[a, b, c]が破壊することになり 期待した動作が得られません。 特に、ライブラリやフレームワークがシンボルに対する代入・参照操作を Proxy的に 定義している場合、ユーザーがSet演算子を複数使用した際に定義が破壊される 可能性があります。
|