如何将HoldForm应用于变量列表而不首先评估列表中的变量?

Nas*_*ser 2 wolfram-mathematica

我正在编写一个调试函数,它打印一个变量名及其值.我用这个调试函数调用程序中任何地方的变量列表.所以我的想法是让它像这样工作:

debug[var_List] := Module[{values = ReleaseHold[var], i},

  For[i = 1, i <= Length[values], i++,
   Print[var[[i]], " = ", values[[i]]]
   ]
  ];
Run Code Online (Sandbox Code Playgroud)

现在我使用上面这样的

x = 3; y = 5;
debug[{HoldForm[x], HoldForm[y]}]
Run Code Online (Sandbox Code Playgroud)

我在控制台中看到以下内容

 x = 3
 y = 5
Run Code Online (Sandbox Code Playgroud)

但是我在一个我想要调试的不同地方有一个大型程序和很长的变量列表.而且我不想键入HoldForm每个变量来组成列表来调用debug []函数.Map如果可能的话,更容易.每次少打字.但这不起作用:

 debug[ Map[HoldForm,{x,y}]]
Run Code Online (Sandbox Code Playgroud)

原因是在HoldForm获得它之前评估了{x,y} .所以我最终得到一个包含值的列表,如下所示:

 3 = 3
 5 = 5
Run Code Online (Sandbox Code Playgroud)

如果没有Map HoldForm评估列表,我找不到办法.

我能找到的最好的是:

debug[HoldForm[Defer[{x, y}]]]
Run Code Online (Sandbox Code Playgroud)

它给出了上面的debug []函数的以下输出:

{x,y} = {3,5}
Run Code Online (Sandbox Code Playgroud)

由于Defer[{x, y}]长度为1,这只是一件事,我无法将其分解为如上例所示的2列列表.

如果我能得到表格的输出会更好

 x = 3
 y = 5
Run Code Online (Sandbox Code Playgroud)

因为我有很多变量,所以更容易将变量与其值匹配.

问题是:任何人都知道要转换 的编程技巧HoldForm[{x,y}] {HoldForm[x],HoldForm[y]}

谢谢

Leo*_*rin 5

只需使用Thread:

Thread[HoldForm[{x, y}]]
Run Code Online (Sandbox Code Playgroud)

或者,

Map[HoldForm, Unevaluated[{x, y}]]
Run Code Online (Sandbox Code Playgroud)