当您调用 Unevaluated[] 时,Mathematica 会尝试计算它的参数。所以{x}[[i]] 被转换成你不想要的{18, b, c}[[i]],然后i 上的迭代不再起作用,因为Unevaluated[] 不允许Table 访问迭代器。
因此,要真正解决问题,您应该完全禁用 Mathematica 的评估功能,以便让符号通过。
In[1]:= SetAttributes[SymbolName, HoldAll];
SetAttributes[Map, HoldAll];
在这之后你就可以做
In[2]:= a=18; SymbolName @@@ Unevaluated /@ {a, b, c}
Out[2]:= {a, b, c}
其中@@@ 和/@ 是Apply[] 和Map[] 的简写。
在 Mathematica 的内置函数中设置 Hold[] 或类似属性可能会导致麻烦。有关更多信息,请参阅 Mathematica stackexchange 中的this 问答。
具体来说,制作一个接受任意数量参数的函数将是
sym = SymbolName @@@ Unevaluated /@ {##} &
但是将参数序列## 用于函数& 的List[] 函数将再次评估a 并为List[] 打开HoldAll 是不行的。
因此,最简单的方法是使用HoldAll 定义一个函数,该函数只是将参数传递给Block[] 作为局部变量列表。这使得 a 创建了一个孤立的上下文,其中变量不计算任何值。
In[1]:= SetAttributes[f, HoldFirst];
In[2]:= f[seq__] := Block[{seq}, Print[SymbolName /@ {seq}]];
In[3]:= a=18; f[a, b, c]
Out[3]:= {a, b, c}