我被搞糊涂了所有内置在声称为防止评价在某种程度上数学函数:Unevaluated
,Defer
,Hold
,以及超过一半的形式的打Hold*
.Mathematica文档只是单独解释了每个函数,但没有解释为什么要选择其中一个函数.任何人都可以对所有这些功能提供一致的解释吗?整件事对我来说似乎是一个令人费解的混乱.将它全部与Lisp宏相关可能是一个很好的起点.
大多数Mathematica语言都设计得非常好,但看起来Wolfram真的把自己描绘成了这方面的一个角落.或者我可能会遗漏一些东西.
这些都是非常棘手的结构,很难给出明确的解释; 它们并不像Lisp的宏(或者,对于这个问题,Lisp的关系那么简单QUOTE
和EVAL
).然而,在Wolfram网站上的Robby Villegas 1999年的演讲"未评估的表达"中,有一个很好的,冗长的讨论形式.
Defer
从那次谈话中省略,因为它是Mathematica 6.0的新版本.这很像HoldForm
,除了当它在前端输出(但不是裸内核)时,它被剥离,留下一个可以用作输入的表达式.如果您想以编程方式构造用户可以编辑和评估的表达式,比如在调色板中,这非常有用.