[Date Index]
[Thread Index]
[Author Index]
Re: What is the purpose of the Defer Command?
*To*: mathgroup at smc.vnet.net
*Subject*: [mg82013] Re: What is the purpose of the Defer Command?
*From*: Szabolcs Horvát <szhorvat at gmail.com>
*Date*: Tue, 9 Oct 2007 05:42:01 -0400 (EDT)
*References*: <fe4uhp$155$1@smc.vnet.net><200710060846.EAA25515@smc.vnet.net> <fecak2$fvn$1@smc.vnet.net>
Vince Virgilio wrote:
>
> Your example doesn't go far enough. It shows only an incidental
> syntactic difference.
>
> Now that I've read the documentation for Defer, I think my comparison
> is quite apt, and that the semantics between Defer and Unevaluated
> align much more than their syntax differs. And yet there is
> significant difference, that is not essentially syntax.
Vince, you're confusing some terms here. Syntax is the *format*
(grammar) of a language, not the meaning of language constructs.
Semantics refers to *meaning*.
Andrzej is right. With his example, he has shown that Defer and
Unevaluated have completely different *meanings*, i.e. they affect
evaluation differently.
> The documentation uses Defer in an example to create cells with
> unevaluated contents. Before, one might try the same with Unevaluated
> (hence the strong relation).
No, Hold[] is the function that serves this purpose, not Unevaluated[].
And for as long as we are concerned only with the structure of
expressions (and evaluation), Defer and Hold behave in *exactly* the
same way. The only difference between them is how they are formatted
in the Front End. So Defer is like HoldForm, with the difference that
copying and pasting its printed form in the Front End will result in
losing the information that Defer is there.
Defer does not bring anything new to the Mathematica *language*
(programming). It is only about formatting.
> But that would give cells with contents
> wrapped in Unevaluated, since Unevaluated is not removed when it's
> Head of "Mathematica input" (Level 0, I suppose). (Substitute
> Unevaluated for Defer in the example to see this.) This is the
> idempotent behavior of Unevaluated. Defer, while it remains as Head of
> Level 0 (your difference), does not show such idempotent behavior (my
> "better-behaved" difference).
>
> Interesting, and apparently a fix. For why would one ever want
> Unevaluated to linger? (Anyone?) I think Robby Villegas issued a
> related caveat in his notebook on Unevaluated expressions.
Remember how Mathematica evaluation works. Replacement rules are
applied until the expression does not change any more. This requires
that Unevaluated be processed only when the surrounding expression is
evaluated (and not before). Consider f[Unevaluated[1+1]]. Here
Unevaluated is processed only when 'f' is evaluated. If Unevaluated
were removed in the stand-alone expression Unevaluated[1+1], then
Mathematica would need to go on, and evaluate Plus[1,1] too (to obey the
rule the replacement rules must be applied for as long as they change
the expression).
It is simply not possible to have a wrapper function that is always
removed during evaluation, but its arguments are kept unevaluated. (I
mean that it is impossible to do this without changing the basic
principles upon which the Mathematica language is built.)
--
Szabolcs
Prev by Date:
**Re: What is the purpose of the Defer Command?**
Next by Date:
**Re: Change colors in contour plot and including a legend?**
Previous by thread:
**Re: What is the purpose of the Defer Command?**
Next by thread:
**Re: What is the purpose of the Defer Command?**
| |