7

The documentation for $Pre gives the following example

SetAttributes[saveinputs, HoldAll];
inputs = {};
saveinputs[new_] := (inputs = {inputs, HoldForm[new]}; new);
$Pre = saveinputs;

Evaluating the 3 input cells a then b then Flatten[inputs] gives

{a,b,Flatten[inputs]}

which is the the expected output. For some reason the intermediate step $Pre = saveinputs is necessary, but why? If one tries to define $Pre directly via

SetAttributes[$Pre, HoldAll];
inputs = {};
$Pre[new_] := (inputs = {inputs, HoldForm[new]}; new);

then $Pre does not work and inputs = {}. How is this different?

Kuba
  • 136,707
  • 13
  • 279
  • 740
Andrew Norton
  • 847
  • 4
  • 13

1 Answers1

6

We can only guess. My guess is that it is only applied when it has OwnValues which your second example does not have.

p.s. you can do it in a one run:

inputs = {};
$Pre = Function[new, inputs = {inputs, HoldForm[new]}; new, HoldAll]
Kuba
  • 136,707
  • 13
  • 279
  • 740
  • Thank you. I see now that the assignment $Pre = saveinputs is not being handled any differently from, say, f = saveinputs (in terms of OwnValues and DownValues of $Pre and f). It is also nice to see that it can be done with Function ... difficult to use HoldAll with & :) – Andrew Norton Jul 19 '19 at 09:32
  • 1
    @AndrewNorton ... but possible :) https://mathematica.stackexchange.com/questions/29168/pure-function-with-attributes-of-arbitrary-number-of-arguments-is-it-possible – Anton.Sakovich Jul 19 '19 at 12:43