Вы можете использовать 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