尝试删除临时符号时出现意外删除:: rmnsm错误

时间:2011-04-19 08:16:44

标签: wolfram-mathematica

美好的一天,

请考虑以下事项:

In[1]:= HoldComplete[With[{line=a},Null]]
Names["`*"]
Attributes/@Names["`*"]
Remove/@Names["`*"]
Out[1]= HoldComplete[With[{line=a},Null]]
Out[2]= {a,line,line$}
Out[3]= {{},{},{Temporary}}
During evaluation of In[1]:= Remove::rmnsm: There are no symbols matching
"line$". >>
Out[4]= {Null,Null,Null}

可以看到Remove::rmnsm消息虽然是临时的,但仍然会出现 那一刻Symbol line$仍然存在。为什么会这样?

P.S。我正在使用Mathematica 7.01。在v.5.2中,此消息不会出现。

1 个答案:

答案 0 :(得分:3)

我认为发生的事情是当您删除符号line时,没有对临时变量line$的进一步引用,因此会自动删除它。

In[1]:= HoldComplete[With[{line=a},Null]]
        Names["`*"]
        Attributes/@Names["`*"]
Out[1]= HoldComplete[With[{line=a},Null]]
Out[2]= {a,line,line$}
Out[3]= {{},{},{Temporary}}

In[4]:= Remove["line"]

In[5]:= Names["`*"]
Out[5]= {a}

这是在Mma v8中测试的。因此,自v5以来,引用计数(或本地化的实现)可能略有改变?

请注意,如果您首先尝试删除临时符号,则会收到非常有用的警告:

In[6]:= HoldComplete[With[{line=a},Null]]
        Names["`*"]
        Attributes/@Names["`*"]
        Remove/@Reverse@Names["`*"]
Out[6]= HoldComplete[With[{line=a},Null]]
Out[7]= {a,line,line$}
Out[8]= {{},{},{Temporary}}
During evaluation of In[6]:= Remove::relex: Cannot remove lexical symbol 
   line$ except automatically (when line is removed). >>
Out[9]= {Null,Null,Null}