我正在编写一个调试函数,它打印一个变量名及其值。我使用程序中任意位置的变量列表调用此调试函数。所以我们的想法是让它像这样工作:

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}]] 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!