Любой способ заставить Mathematica удалить атрибут Locked? - PullRequest
6 голосов
/ 19 марта 2012

Очевидно, что Mathematica может удалить этот атрибут; это просто не позволяет мне. Кто-нибудь знает какие-нибудь взломы, чтобы заставить Mathematica делать то, что я говорю?

1 Ответ

4 голосов
/ 05 октября 2013

Это не положительный ответ.

В одном конкретном случае использования, который может потребовать удаления атрибута 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.

...