Это не положительный ответ.
В одном конкретном случае использования, который может потребовать удаления атрибута Locked
, будет локальная модификация символа, например, с. Internal
InheritedBlock`. Часто эта обзорная конструкция используется для локального изменения / удаления атрибутов системных символов, чтобы получить другое поведение для области видимости блока (см., Например, этот ответ ).
Однако, согласно моему исследованию, из 38 Locked
символов (из всех контекстов и пакетов, загруженных Quiet[Needs /@ Contexts[]]
!) ни один не имеет каких-либо других функциональных атрибутов , которые в случае изменения могли бы приводят к измененному поведению (например, нет Flat
, Orderless
, Hold***
и т. д.), и ни у одного из них нет Options
, который можно изменить. Обычно эти символы очень простые, почти все из контекста System`
, например. I
, List
или True
. Единственные 3 исключения, имеющие функциональные атрибуты или параметры:
(* Symbol *) (* Attributes *) (* Options *)
Remove {HoldAll, Locked, Protected} {}
$ProductInformation {Locked, Protected} {"ProductIDName" -> "Mathematica", "ProductKernelName" -> "Mathematica 9 Kernel", "ProductVersion" -> "9.0 for Microsoft Windows (64-bit) (January 25, 2013)", "ProductVersionNumber" -> 9.}
Developer`StartProtectedMode {Locked, Protected} {"Allow" -> Null, "Deny" -> Null, "Execute" -> {}, "Read" -> {}, "ReadWrite" -> {}, "Write" -> {}}
Таким образом, кроме изменения этих удаленно используемых функций, единственная причина, по которой нужно удалить Locked
, - это непосредственное изменение определений некоторых символов. Но это может быть выполнено только , если * символ также равен ReadProtected
, в противном случае код написан ниже уровня Mathematica , который полностью скрыт от пользователя (кроме, возможно, высокого) обертки) Таких символов всего три (опять же, из всех стандартных контекстов и пакетов):
I (* with {Locked, Protected, ReadProtected} *)
$InputStreamMethods (* with {Locked, Protected, ReadProtected} *)
$OutputStreamMethods (* with {Locked, Protected, ReadProtected} *)
В заключение я бы сказал, что удаление Locked
на самом деле не даст никаких преимуществ при исследовании / изменении внутренних функций функций для большого числа функций, а также при изменении поведения таких фундаментальных функций, как I
или $Input
. быть очень плохой идеей , поэтому никто вряд ли потратит слишком много времени на выяснение хака.
Кроме того, поскольку Locked
сам по себе имеет атрибут Locked
(так как в v9, в v8 это был только Protected
), его нельзя переоткрыть, например, до. Locked = Sequence[]
перед загрузкой пакета, чтобы обойти защиту даже для зашифрованных файлов. Можно переопределить Attributes
и SetAttributes
перед загрузкой пакетов, но бог знает, что может пойти не так, если сделать это.
Конечно, если функция является упакованной и файлы пакета доступны и не закодированы, можно удалить атрибуты вручную, отредактировав файлы напрямую. Но, согласно моему опыту, общая традиция состоит в том, что функции, которые можно свободно использовать в пакетах, не являются Locked
.