Обнаружение конфликтов DownValue / OwnValue - PullRequest
7 голосов
/ 24 ноября 2010

Иногда я сталкиваюсь со следующим сценарием - одна процедура использует глобальную функцию f[x] для выполнения некоторых вычислений, в то время как другая процедура выполняет f=5, которая превращает все последующие вызовы f[x] в 5[x]

Я знаю о локализации переменных, но я предпочитаю использовать глобальные переменные в начале разработки.

Я не могу придумать законную причину смешать OwnValues ​​и DownValues. Есть ли способ реализовать предупреждающее сообщение при возникновении ситуации, подобной описанной выше?

В дополнение к советам, приведенным ниже, контекст по умолчанию можно найти в OptionsInspector в разделе Параметры ячейки / Параметры оценки / CellContext

Ответы [ 2 ]

11 голосов
/ 24 ноября 2010

Вы можете использовать Protect[f], чтобы избежать дальнейших назначений (любого рода) и Unprotect[f], чтобы разрешить их снова.

Вы также можете сделать несколько простых хакеров с использованием значений up, чтобы Set[f, ...] не мог на самом деле выставить собственные значения на f, но при этом разрешить присвоение значений down без необходимости использования Protect / Unprotect:

In[76]:= ClearAll[f]

In[77]:= f /: Set[f, x_] := x

In[78]:= f = 7

Out[78]= 7

In[79]:= f

Out[79]= f

In[80]:= f[x_] := x + 1

In[81]:= f[1]

Out[81]= 2

Вышеуказанное явно блокирует использование Set на f. Выдача фактического сообщения также проста:

In[93]:= f::noov = "Blocked attempt to assign `1` as an OwnValue of f";

In[94]:= f /: Set[f, x_] := (Message[f::noov, x]; x)

In[95]:= f = 7

During evaluation of In[95]:= f::noov: Blocked attempt to assign 7 as
   an OwnValue of f

Out[95]= 7
3 голосов
/ 12 декабря 2010

Это не отвечает на первоначальный вопрос о создании предупреждающего сообщения, но Формальные символы удобны для использования в качестве глобальных символов.Они автоматически защищены и поэтому не могут быть случайно переопределены.Вы вводите формальный символ, используя клавиши <ESC>$f</ESC>, где f может быть любой буквой.Недостатком является то, что для ввода символа требуется четыре нажатия клавиш вместо одного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...