美好的一天,
请考虑以下事项:
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中,此消息不会出现。
答案 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}