Неожиданная ошибка Remove :: rmnsm при попытке удалить временный символ - PullRequest
3 голосов
/ 19 апреля 2011

Добрый день,

Обратите внимание на следующее:

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 Ответ

3 голосов
/ 19 апреля 2011

Я думаю, что при удалении символа 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...