HoldAll
是一个属性,指定一个函数的所有自变量保持不计算的形式.
范例
打开所有单元 关闭所有单元基本范例 (1)
为函数 f 赋予属性 HoldAll:
SetAttributes[f, HoldAll]因此,在进入(在本例中不存在的)函数体之前,参数不会被求值:
f[1 + 1, 2 + 2, 3 + 3]g[1 + 1, 2 + 2, 3 + 3]范围 (2)
FullForm[1 - 1]HoldForm[FullForm[1 - 1]]这是因为 HoldForm 具有 HoldAll 属性,所以才能实现这一点:
Attributes[HoldForm]为函数 inout 赋予属性 HoldAll:
SetAttributes[inout, HoldAll]定义一个具有两个参数的函数,它返回用 Hold 封装的这两个参数,以及未进行封装的第一个参数:
inout[in_, tag_] := {Hold[in], in, Hold[tag]}在进入函数体之前,两个参数都不会被求值,但第一个参数会在函数内部被求值:
inout[1 - 1, 1 + 1]应用 (3)
许多具有作用域行为的函数都有 HoldAll 属性:
Attributes[Plot//Evaluate]Plot[{Sin[x], Cos[x]}, {x, 0, 2π}]Plot[Through[{Sin, Cos}[x]], {x, 0, 2π}]使用 Evaluate 使得列表结构清晰明显:
Plot[Evaluate[Through[{Sin, Cos}[x]]], {x, 0, 2π}]Plot[{Through[{Sin, Cos}[x]], Through[{Tan, Cot}[x]]}, {x, 0, 2π}]用 HoldAll 和 Unevaluated 在计算发生时抑制符号计算:
SetAttributes[symbolLength, HoldAll];
symbolLength[s_Symbol] := StringLength[SymbolName[Unevaluated[s]]]xyzzy = 1;symbolLength[xyzzy]until::usage = "until[cond,cmd] repeats evaluating cmd until cond is True.";SetAttributes[until, HoldAll]until[cond_, cmd_] := While[True, cmd;If[cond, Return[]]]i = 1;
until[Prime[i] > 10 ^ 6, i++];i属性和关系 (12)
Attributes[Hold]Hold[1 + 2]在符号上运算的函数通常需要 HoldAll 属性:
i = 5;
Protect[i]Protect[Evaluate[i]]类似 Table 的控制结构会避免对它们的参数进行计算:
i = 5;Table[i, {i, 1, 4}]Table[Evaluate[i], {i, 1, 4}]用 Evaluate 强制计算一个 HoldAll 函数的参数:
Attributes[Unprotect]syms = {Plus, Times};Unprotect[Evaluate[syms]]Expand[(1 + x) ^ 3]f[x_] := Evaluate[%]Definition[f]使用 Unevaluated 来暂时将函数视为具有属性 HoldAll:
Length[Unevaluated[1 + 2 + 3]]Length[1 + 2 + 3]Function[e, Hold[e], {HoldAll}][1 + 2]Function[e, Hold[e]][1 + 2]对具有 HoldAll 属性的函数,依然存在序列连接:
SetAttributes[f, HoldAll]
f[Sequence[a, b, c]]Unevaluated 在进入函数体之前会被剥离:
f[x_] := Hold[x]
f[Unevaluated[1 + 1]]_[___, g, ___] ^:= "upvalue"
f[Sequence[a, b, c], g]属性 HoldAllComplete 会抑制全部这三种行为:
Attributes[HoldComplete]HoldComplete[Sequence[a, b, c], g]Hold[f[1 + 2]] /. f[x_] :> g[x]Insert[Hold[x + x], y, {1, 2}]NHoldAll 保护 N 的参数,否则以正常方式对它们进行计算:
Attributes[Derivative]N[Derivative[1 + 1]]N[f[1 + 1]]HoldPattern 保护模式不进行计算,但不干扰模式匹配:
{HoldPattern[_ + _], _ + _}相关的工作流程
- 替换保持参数的函数中变量的值
历史
1988年引入 (1.0)
文本
Wolfram Research (1988),HoldAll,Wolfram 语言函数,https://reference.wolfram.com/language/ref/HoldAll.html.
CMS
Wolfram 语言. 1988. "HoldAll." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/HoldAll.html.
APA
Wolfram 语言. (1988). HoldAll. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/HoldAll.html 年
BibTeX
@misc{reference.wolfram_2026_holdall, author="Wolfram Research", title="{HoldAll}", year="1988", howpublished="\url{https://reference.wolfram.com/language/ref/HoldAll.html}", note=[Accessed: 05-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_holdall, organization={Wolfram Research}, title={HoldAll}, year={1988}, url={https://reference.wolfram.com/language/ref/HoldAll.html}, note=[Accessed: 05-November-2026]}