我正在编写一个调试函数,它打印一个变量名及其值。我使用程序中任意位置的变量列表调用此调试函数。所以我们的想法是让它像这样工作:
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]}
谢谢
请您参考如下方法:
只需使用Thread
:
Thread[HoldForm[{x, y}]]
或者,
Map[HoldForm, Unevaluated[{x, y}]]