Я пишу функцию отладки, которая печатает имя переменной и ее значение. Я вызываю эту функцию отладки со списком переменных из любой точки программы. Так что идея в том, чтобы он работал так:
debug[var_List] := Module[{values = ReleaseHold[var], i},
For[i = 1, i <= Length[values], i++,
Print[var[[i]], " = ", values[[i]]]
]
];
Теперь я использую выше, как это
x = 3; y = 5;
debug[{HoldForm[x], HoldForm[y]}]
и я вижу в консоли следующее
x = 3
y = 5
Но у меня есть большая программа и длинный список переменных в разных местах, которые я хочу отлаживать. И я не хочу вводить HoldForm
для каждой переменной, чтобы составить список для вызова функции debug []. Гораздо проще, если это возможно, Map
. Меньше печатать каждый раз. Но это не работает:
debug[ Map[HoldForm,{x,y}]]
Причина в том, что {x, y} был оценен до того, как HoldForm
получил его. Таким образом, я получаю список со значениями, например:
3 = 3
5 = 5
Я не смог найти способ Map
HoldForm
без оценки списка.
Лучшее, что я смог найти, это:
debug[HoldForm[Defer[{x, y}]]]
, который дает следующий вывод из вышеприведенной функции debug []:
{x,y} = {3,5}
Так как Defer[{x, y}]
имеет длину 1, и это только одна вещь, я не мог разбить ее, чтобы создать список из 2 столбцов, как в приведенном выше примере.
Будет лучше, если я смогу получить вывод вида
x = 3
y = 5
проще сопоставить переменную с ее значением, так как у меня много переменных.
Вопрос в том, что любой знает программный трюк для преобразования HoldForm[{x,y}]
в {HoldForm[x],HoldForm[y]}
спасибо