我对所有内置的Mathematica函数感到困惑,这些函数旨在以某种方式阻止评估:Unevaluated
,Defer
,Hold
以及超过六种形式Hold*
。 Mathematica文档只是单独解释了每个函数,但没有解释为什么要选择其中一个函数。任何人都可以对所有这些功能提供一致的解释吗?整件事对我来说似乎是一个令人费解的混乱。将它全部与Lisp宏相关可能是一个很好的起点。
大多数Mathematica语言都设计得非常好,但看起来Wolfram在这方面确实把自己描绘成了一个角落。或者我可能会遗漏一些东西。
答案 0 :(得分:11)
这些都是非常棘手的结构,很难给出明确的解释;它们不像Lisp宏那么简单(或者就此而言,Lisp的QUOTE
和EVAL
之间的关系)。但是,在Wolfram的网站上以notes from Robby Villegas's 1999 talk "Unevaluated Expressions"的形式提供了一个很好的,冗长的讨论。
Defer
,因为它是Mathematica 6.0的新版本。这很像HoldForm
,除了当它在前端输出(但不是裸内核)时,它被剥离,留下一个可以用作输入的表达式。如果您想以编程方式构造用户可以编辑和评估的表达式,比如在调色板中,这非常有用。