Вопрос по определению и значению символов - PullRequest
8 голосов
/ 07 мая 2011

Definition «знает», как было определено значение для символа: используя Set или SetDelayed.Но как?Как я понимаю, после того, как значение для символа было присвоено, для оценщика не будет никакой разницы в том, как оно было назначено: с помощью Set или SetDelayed.Это можно проиллюстрировать функцией OwnValues, которая всегда возвращает определения с Head RuleDelayed.Как Definiton получает эту информацию?

In[1]:= a=5;b:=5;
Definition[a]
Definition[b]
OwnValues[a]

Out[2]= a=5
Out[3]= b:=5
Out[4]= {HoldPattern[a]:>5}

Ответы [ 3 ]

7 голосов
/ 07 мая 2011

OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a] дает {HoldPattern[a] :> 3} вместо {HoldPattern[a] -> 3}, но Definition[a] показывает, что можно ожидать.Вероятно, это определение хранится внутри в виде Rule, но преобразуется в RuleDelayed на OwnValues для подавления оценки относительной влажности определения.Эта гипотеза противоречит моему первоначальному пониманию, что нет никакой разницы между значениями, присвоенными Set и SetDelayed.Вероятно, такие определения хранятся в разных формах: Rule и RuleDelayed соответственно, но эквивалентны с точки зрения оценщика.

Интересно посмотреть, как MemoryInUse[] зависит от вида определения.

В следующем эксперименте я использовал ядро ​​ Mathematica 5.2 в интерактивной сессии без FrontEnd.С ядрами Mathematica 6 и 7 можно получить разные результаты.Одной из причин этого является то, что в этих версиях Set по умолчанию перегружен .

Прежде всего я оцениваю $HistoryLength=0; для наличия DownValues для In и Outпеременные, не влияющие на мои результаты.Но кажется, что даже когда $HistoryLength установлен в 0, значение In[$Line] для текущей строки ввода все еще сохраняется и удаляется после ввода нового ввода.Вероятно, это причина того, что результат первой оценки MemoryInUse[] всегда отличается от второй.

Вот что я получил:

Mathematica 5.2 для студентов: версия Microsoft Windows

Авторские права 1988-2005 Wolfram Research, Inc.

- Инициализирована графика терминала -

In [1]: = $ HistoryLength = 0;

In [2]: = MemoryInUse []

Out [2]= 1986704

In [3]: = MemoryInUse []

Out [3] = 1986760

In [4]: ​​= MemoryInUse []

Out [4] = 1986760

In [5]: = a = 2;

In [6]: = MemoryInUse []

Out [6] = 1986848

In [7]: = MemoryInUse []

Out [7] = 1986824

In [8]: = MemoryInUse []

Out [8] = 1986824

In [9]: = a: = 2;

In [10]: = MemoryInUse []

Out [10] = 1986976

In [11]: = MemoryInUse []

Out [11] = 1986952

In [12]: = MemoryInUse []

Out [12] =1986952

В [13]: = a = 2;

В [14]: = MemoryInUse []

Out [14] = 1986848

В [15]: = MemoryInUse []

Out [15] = 1986824

In [16]: = MemoryInUse []

Out [16] = 1986824

Можно видетьчто определение a=2; увеличивает MemoryInUse[] на 1986824-1986760 = 64 байта.Замена его на определение a:=2; увеличивает MemoryInUse[] на 1986952-1986824 = 128 байтов.И замена последнего определения на прежние возвращает MemoryInUse[] к 1986824 байта.Это означает, что отложенные определения требуют на 128 байт больше, чем непосредственные определения.

Конечно, этот эксперимент не подтверждает мою гипотезу.

4 голосов
/ 08 января 2014

Полное определение символа можно получить с помощью недокументированных символов new-in-8 Language`ExtendedDefinition и Language`ExtendedFullDefinition. Цитируя Александр Распутинов :

"Если кому-то интересно, Language`ExtendedDefinition и Language`ExtendedFullDefinition аналогичны Definition и FullDefinition, но фиксируют определение символа таким образом, чтобы его можно было воспроизвести в другом ядре. Например, defs = Language`ExtendedFullDefinition[sym] возвращает объект Language`DefinitionList. Синтаксис, используемый для восстановления определения, крайне нерегулярен: Language`ExtendedFullDefinition[] = defs, где defs - Language`DefinitionList. Обратите внимание, что Language`ExtendedFullDefinition принимает параметр ExcludedContexts, тогда как Language`ExtendedDefinition - нет. "

3 голосов
/ 07 мая 2011

Information вызывает Definition, а трассировка на Definition (или FullDefinition) ничего не показывает. Я должен предположить, что это функция низкого уровня, которая обращается к данным вне таблиц *Values. Возможно, он хранит копию оригинальных выражений определений, которые были проанализированы в то время.

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