Как перехватить присвоение нового значения для переменной In? - PullRequest
1 голос
/ 11 апреля 2011

Я хочу перехватить присвоение новых значений для переменной In.

Я попытался сделать это, определив UpValues для In, но это не помогает в этом случае:

Unprotect[In];
In /: Set[In[line_], expr_] /; ! TrueQ[$InsideSet] := 
 Block[{$InsideSet = True}, 
  Print[HoldForm@HoldForm[expr]; Set[In[line], expr]]]
In /: SetDelayed[In[line_], expr_] /; ! TrueQ[$InsideSet] := 
 Block[{$InsideSet = True}, 
  Print[HoldForm@HoldForm[expr]; SetDelayed[In[line], expr]]]

Можно ли это перехватить?

P.S. Этот вопрос возник как часть предыдущего вопроса на сцене, когда Mathematica создает новые Symbol s.

EDIT

Я хотел бы явно перехватить присвоение нового DownValue для переменной In. $Pre выполняет после этого назначения и после , создавая все новые Symbol с в текущем $Context:

In[1]:= $Pre := (Print[Names["`*"]]; 
   Print[DownValues[In][[All, 1]]]; ##) &

In[2]:= a

During evaluation of In[2]:= {a}

During evaluation of In[2]:= {HoldPattern[In[1]],HoldPattern[In[2]]}

Out[2]= a

1 Ответ

4 голосов
/ 11 апреля 2011

Вы смотрели на $Pre и $PreRead?

$Pre - глобальная переменная, значение которой, если установлено, применяется к каждому входному выражению.

$PreRead - это глобальная переменная, значение которой, если установлено, применяется к текстовой или блочной форме каждого входного выражения перед его передачей в Mathematica.

ОБНОВЛЕНИЕ (теперь с лучше пример)

In[1]:= $Pre = 
  Function[{x}, Print["In[",$Line,"] is: ", Unevaluated[x]]; x, HoldFirst];

In[2]:= 2 + 2

During evaluation of In[2]:= In[2] is: 2+2

Out[2]= 4

In[3]:= InString[2]

During evaluation of In[3]:= In[3] is: InString[2]

Out[3]= "\\(2 + 2\\)"

ОБНОВЛЕНИЕ 2

Замените $Pre на $PreRead в моем коде выше, и вы приблизитесь к тому, что вы хотите, я считаю:

In[1]:= $PreRead = Function[{x}, Print[Names["`*"]]; x, HoldFirst]

Out[1]= Function[{x}, Print[Names["`*"]]; x, HoldFirst]

In[2]:= a = 1

During evaluation of In[2]:= {x}

Out[2]= 1

In[3]:= b = 2

During evaluation of In[3]:= {a,x}

Out[3]= 2

Невозможно перехватить In на уровне *Value, потому что Ядро просто не взаимодействует с In посредством манипулирования значениями в коде Mathematica "верхнего уровня".

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