Защита от модификации и ее отмена
Как уже отмечалось, объекты Mathematica имеют средства установки и снятия защиты от модификации. Для этого используются следующие функции-директивы:
- Protect [s1, s2,…] – устанавливает атрибут защиты от модификации Protected для перечисленных объектов si;
- Protect ["form1", "form2",…] – устанавливает атрибут защиты от модификации для всех объектов, имена которых сопоставимы с любым из указанных строковых шаблонов formi;
- Unprotect [s1, s2,…] – удаляет атрибут защиты от модификации Protected для объектов si, что делает возможной их модификацию;
- Unprotect ["form1", "form2",…] – снимает защиту всех объектов, имена которых текстуально (по буквам) сопоставимы с любым из указанных шаблонов formi.
Приведем наглядный пример модификации встроенной функции логарифма:
Log[
7
]
=
2
Set::write: Tag Log
in
Log[
7
] is Protected.
2
Итак, здесь предпринята попытка приписать логарифму числа 7 вовсе не свойственное ему значение 2. В ответ система выдала сообщение, что символ Log имеет атрибут Protected, то есть защищен от модификации. С помощью директивы Unprotect снимем защиту:
Unprotect[Log]
{Log}
Теперь выражение Log [ 7 ] можно модифицировать:
Log[
7
]
=
2
2
И использовать его уже в новом значении:
Log[
7
]
=
2
2
Log[
7
]
+
Log[
3
]
2
+
Log[
3
]
Для отмены произведенной модификации и защиты символа Log от изменений выполните следующие действия:
Log[
7
]
=
.
Protect[Log]
{Log}
Теперь можно проверить, что присваивание Log [7] =2 не действует и функция Log работает как положено, возвращая значение In (7) =1. 94591:
Log[
7
]
Log[
7
]
N[Log[
7
]]
1.94591
Защита идентификаторов объектов от модификации является мощным средством контроля правильности вычислений. Эту защиту вряд ли стоит снимать подавляющему большинству пользователей. Тем не менее, возможность устранения защиты позволяет переименовать объект, например, при использовании с ним новых алгоритмов вычислений или при задании системе Mathematica каких-то новых свойств, не присущих ей изначально.