[Go to BBS]
All articles in a thread
SubjectSet演算子の結合規則に付いて
Article No647
Date: 2008/09/24(Wed) 19:05:18
ContributorAkio 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演算子を複数使用した際に定義が破壊される
可能性があります。