Я не могу получить правильное форматирование в комментарии, поэтому я делаю это в качестве ответа ...
Хорошо, я думаю, что в вашем ответе приведен код, пожалуйста, дайте мне знать, если я прав.
Определяет, что оценивается до и после оценки «контрольного примера». Примечание: вы определяете f
в before
, неопределенное f
в after
.
(* Mathematica Test File *)
before[]:= (Print["Before Test: ",f[2]];f[x_]:=x^3);
after[] := (ClearAll[f];Print["After Test: ",f[2]]);
Определяет функцию withCodeAfter
. Он принимает два выражения, первое выражение, before
, оценивается при передаче. Второе выражение, after
, передается в неоцененном виде и является первым выражением, которое будет оценено в withCodeAfter
. Первое вычисленное выражение before
возвращается withCodeAfter
.
SetAttributes[withCodeAfter,HoldRest];
withCodeAfter[before_,after_]:=(after;before)
Определяет функцию wrapTest
. Требуется одно выражение code
, которое передается как неоцененное. Это выражение code
является вторым выражением составного выражения before[];code
, которое передается как первое выражение before
в withCodeAfter
. Составное выражение before[];code
вычисляется при передаче в withCodeAfter
. Значение вычисленного выражения, code
, возвращается withCodeAfter
после after
, оцениваемого. Значение, возвращаемое withCodeAfter
, возвращается wrapTest
.
SetAttributes[{wrapTest},HoldAll]
wrapTest[code_]:= withCodeAfter[before[];code,after[]]
Это то же самое, что звонить wrapTest[Test[f[2], 8, TestID -> "MyTest1"]]
wrapTest@
Test[f[2], 8, TestID -> "MyTest1"]