SAD部屋 - Ticket-32 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
:Priority:Normal
:Reporter:Akio Morita
:Status:New
:Assigned to:?
:Version:4037
:Milestone:?
:Created:2012-06-13
!! Description
純関数リテラル (With[{foo = #}, foo + 1]&) を With[{foo = 1}, ...]環境で評価すると異なる値(With[{1 = #}, 2&])に展開される
問題の本質と実用上の障害
* Withスコープが局所スコープになっていない
* 純関数内の局所シンボルを安全に保護できない
同様に純関数のSymbolic Slot表現もスコープ保護されていない問題がある
(With[{foo = 1}, Function[{foo}, foo + 1]])
類似のModuleスコープでは、この例の範囲では問題が生じない(ただし、\$Immediate = 1(default)の場合)
(With[{foo = 1}, Module[{foo = #}, foo + 1]])
\$Immediate = 0の場合は、上記のWithスコープと同様の結果となる
(\$Immediate = 1の場合、Module[{foo}, ...]内の fooシンボルが '''maxgeneration'''なシンボルに置換されている)
!! Attachement files
{{attach_map('Ticket-32')}}
{{attach_form('','')}}
!! Changelog
!!!Akio Morita (2012-06-13 (水) 14:56:03)
意味論のモデルにしている MathematicaではWithによるシンボル bindingは局所スコープで行われている
SEE ALSO: http://reference.wolfram.com/mathematica/ref/With.ja.html
!!!Akio Morita (2012-06-13 (水) 15:02:45)
FunctionにおけるPlace Holder シンボルも局所スコープと思われる
SEE ALSO: http://reference.wolfram.com/mathematica/ref/Function.ja.html
!!!Akio Morita (2012-06-13 (水) 16:17:33)
Withが、シンボル置換するスコープをModuleスコープにすると同様の混同が起こる
Print[ With[{foo = 1}, Module[{foo = #}, foo + 1]&] ];
Print[Module[{foo}, With[{foo = 1}, Module[{foo = #}, foo + 1]&]]];
シンボルの世代を調べた限りでは、
第一のケース
With[{foo = 1}, Module[{foo\$maxgeneration = #}, foo\$maxgeneration + 1]&]
第二のケース
Module[{foo\$2}, With[{foo\$2 = 1}, Module[{foo\$2 = #}, foo\$2 + 1]&]]
となっている。内側のModuleスコープのfooシンボルが次の世代(foo$3)になっていないのが問題の本質か?
{{its_edit_ticket_form}}