Subject | : Re^3: Withの束縛の取扱いがおかしい |
Date | : 2012/07/20(Fri) 11:22:51 |
Contributor | : Akio Morita |
> この問題は、Functionも含めてk64-1-6で対応が試みられています。
>
> With[{a=2}, With[{a=3}, ...]]
>
> のように、Withのlocal symbolがかぶる場合、内側のsymbolが優先します。ただし、
>
> With[{a=2}, With[{a}, ...]]
>
> のように、内側のsymbolの値を与えない場合は、内側のsymbol aを外側のWithの置換対象にしています。要議論です。
>
> Functionの場合は常に内側が優先します。
>
With[{a = 2}, With[{a}, ...]]の解釈ですが、
With[{a}. ...]は、式(...)中の aを aの評価値(つまり、当該With環境の外で aに拘束された値)と置換するので、
冗長な記述をすると With[{a = a}, ...]に等価になると思います
したがって、シンボルスコープを含めて書き下すと
With[{a = 2}, With[{a}, ...]] -> With[{a$1 = 2}, With[{a$2 = a$1}, ....]]
となるべきだと思います
同じようなスコープ解決問題として、With[{a = 3}, With[{a = a + 2}, a]]の評価値は
(2+a)ではなく 5を返すべきだと思います
2012-07-20 11:18 checkoutのソースだと (2+a)を返します
スコープ解決
With[{a = 3}, With[{a = a + 2}, a]]
-> With[{a$1 = 3}, With[{a$2 = a$1 + 2}, a$2]]