Сделай сам себе язык

Nov 13, 2020 19:42

Для тех немногих сильных духом, кто заинтересовался «псевдо-макросами» в приложении к матмоделям, запилил статью с гораздо более подробными разъяснениями и всевозможной философией по этой теме.


Read more... )

наука, философия, xx2 век, программирование

Leave a comment

lex_kravetski April 29 2023, 20:17:34 UTC
Ну, я для этих целей сделал специальную функцию, которая добавляет в $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

Up