# Why does $Pre need to be defined indirectly via some other function? 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?

We can only guess. My guess is that it is only applied when it has OwnValues which your second example does not have.
inputs = {};
$Pre = Function[new, inputs = {inputs, HoldForm[new]}; new, HoldAll]  • 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 at 9:32