Для тех немногих сильных духом, кто заинтересовался «псевдо-макросами» в приложении к матмоделям, запилил статью с гораздо более подробными разъяснениями и всевозможной философией по этой теме.
Ну, я для этих целей сделал специальную функцию, которая добавляет в $Pre, заблокировав в процессе добавления предобработку и предварительно проверяя, не добавлена ли уже такая функция. А потом Такие функции добавляю уже через эту. Поскольку, таки да, очень легко где-то что-то перепутать, а потому проще пользоваться однажды проверенной и отлаженной функцией добавления.
Private`PreReplacements = {};
Private`PreRepeatedReplacements = {};
Private`PreSetupMode = False;
Private`PreSetup = Function[
body,
Private`PreSetupMode = True;
body;
Private`PreSetupMode = False;,
HoldAll
];
$Pre = Function[code,
If[Private`PreSetupMode,
code,
Cases[code // Hold,
HoldPattern[
AddReplacementToPre[from_ :> _]] :> (Verbatim[from] :> _),
All
] //
Map[
(Private`PreReplacements =
DeleteCases[Private`PreReplacements, #]) &
];
Cases[code // Hold,
HoldPattern[
AddRepeatedReplacementToPre[
from_ :> _]] :> (Verbatim[from] :> _),
All
] //
Map[
(Private`PreRepeatedReplacements =
DeleteCases[Private`PreRepeatedReplacements, #]) &
];
Fold[
ReplaceEvaluated[#2][#1] &,
code // Hold,
Private`PreReplacements
] //
Fold[
ReplaceRepeated[#2][#1] &,
#,
Private`PreRepeatedReplacements
] & //
ReleaseHold
],
HoldAll
];
AddReplacementToPre = Function[
replacement,
AppendTo[Private`PreReplacements, replacement];
Private`PreReplacements,
HoldAll
];
AddRepeatedReplacementToPre = Function[
replacement,
AppendTo[Private`PreRepeatedReplacements, replacement];
Private`PreRepeatedReplacements,
HoldAll
];
Reply
Leave a comment