Re: What is the purpose of the Defer Command?
- To: mathgroup at smc.vnet.net
- Subject: [mg81988] Re: What is the purpose of the Defer Command?
- From: Vince Virgilio <blueschi at gmail.com>
- Date: Mon, 8 Oct 2007 02:05:20 -0400 (EDT)
- References: <fe4uhp$155$1@smc.vnet.net><200710060846.EAA25515@smc.vnet.net>
On Oct 7, 5:55 am, Andrzej Kozlowski <a... at mimuw.edu.pl> wrote:
> On 6 Oct 2007, at 17:46, Vince Virgilio wrote:
>
>
>
>
>
> > On Oct 5, 5:01 am, "David Park" <djmp... at comcast.net> wrote:
> >> I do not understand the utility of the new Defer statement in
> >> Mathematica
> >> Version 6. Also, it seems to me to be similar to, but not as good
> >> as, the
> >> HoldTemporary command introduced by Ted Ersek on MathSource a few
> >> years ago.
>
> >> The help for Defer says: "Defer[expr] yields an object that
> >> displays as the
> >> unevaluated form of expr, but which is evaluated if it is
> >> explicitly given
> >> as Mathematica input." What does 'given as Mathematica input'
> >> mean? The
> >> examples seem to only involve copying and pasting, which I don't
> >> consider a
> >> great method for doing mathematics, or evaluation in place.
>
> >> I would like to understand how Defer might be used in expository
> >> notebooks
> >> to clarify some piece of mathematics. The problem is that it
> >> requires an
> >> interactive action, which would be invisible to a reader of a
> >> notebook. I
> >> think the idea of 'modification in place' is poor in technical
> >> communication
> >> because it destroys the record of what was done.
>
> >> (In the examples below, whenever an output resulted in an
> >> expression that
> >> copied as a box structure, I converted to InputForm to simplify the
> >> posting.)
>
> >> Here is a simple example:
>
> >> y = Defer[1 + 1]
> >> 1 + y giving
>
> >> 1 + 1
>
> >> 1 + (1 + 1)
>
> >> I would prefer that the Defer expression would have evaluated in
> >> the second
> >> statement but I guess it is logical that it didn't. If I write:
>
> >> 1 + y
>
> >> then select the y and Evaluate In Place I obtain the following,
> >> which must
> >> then be further evaluated to obtain 3.
>
> >> 1 + 1 + 1
>
> >> 3
>
> >> A second example. I want to show an integral without evaluation
> >> and then the
> >> evaluated result. I have to write the following expression, then
> >> select the
> >> second line of output, evaluate in place, and then I obtain the
> >> result - but
> >> as an Input cell. This is certainly a place where HoldForm would
> >> be better.
>
> >> Defer[Integrate[x^2 Exp[-x], {x, 0, 1}]]
> >> %
> >> giving
>
> >> Integrate[x^2/E^x, {x, 0, 1}]
>
> >> 2 - 5/\[ExponentialE] (which is an Input cell)
>
> >> Here is third example. Defer does not evaluate and we obtain an error
> >> message.
>
> >> numb = Defer[2^67 - 1]
> >> FactorInteger[numb] giving
>
> >> 2^67 - 1
>
> >> FactorInteger::"exact" : "\"Argument \!\(\*SuperscriptBox[\"2\", \
> >> \"67\"]\) - 1 in FactorInteger[\!\(\*SuperscriptBox[\"2\", \"67\"]
> >> \) \
> >> - 1] is not an exact number\""
>
> >> FactorInteger[2^67 - 1]
>
> >> But it works if I copy and paste into FactorInteger.
>
> >> Now, look at the behavior of Ted's MathSource package.
>
> >> Needs["Enhancements`HoldTemporary`"]
>
> >> y = HoldTemporary[1 + 1]
> >> 1 + y giving
>
> >> 1 + 1
>
> >> 3
>
> >> The expression is evaluated if it is an argument of some function.
>
> >> HoldTemporary[Integrate[x^2 Exp[-x], {x, 0, 1}]]
> >> Identity[%]
> >> giving
>
> >> Integrate[x^2/E^x, {x, 0, 1}]
>
> >> 2 - 5/\[ExponentialE] (which is an Output cell)
>
> >> numb = HoldTemporary[2^67 - 1]
> >> FactorInteger[numb] giving
>
> >> 2^67 - 1
>
> >> {{193707721, 1}, {761838257287, 1}}
>
> >> Much better. I might be missing the point, but I don't think that
> >> Defer is
> >> at all well designed.
>
> >> There is another Hold that is very useful. This is one that holds an
> >> operation but evaluates the arguments. We have a HoldOp statement
> >> in the
> >> Tensorial package.
>
> >> Needs["TensorCalculus4V6`Tensorial`"]
>
> >> ?HoldOp
>
> >> HoldOp[operation][expr] will prevent the given operation from being
> >> evaluated in expr. Nevertheless, other operations within expr will be
> >> evaluated. Operation may be a pattern, including alternatives, that
> >> represents heads of expressions. The HoldOp can be removed with
> >> ReleaseHold.
>
> >> One reason we want the arguments to evaluate is that the arguments
> >> often
> >> contain tensor shortcut expressions and we want them evaluated to
> >> show the
> >> full tensor expression inside some operation. However, there are
> >> many other
> >> uses.
>
> >> f[x_] := Sin[x] \[ExponentialE]^x
>
> >> We would like f[x] to be evaluated inside the Integrate statement,
> >> but hold
> >> the actual itegration.
>
> >> Integrate[f[x], {x, 0, \[Pi]}] // HoldOp[Integrate]
> >> % // ReleaseHold
> >> giving
>
> >> HoldForm[Integrate[E^x*Sin[x], {x, 0, Pi}]]
>
> >> 1/2 (1 + \[ExponentialE]^\[Pi])
>
> >> For exposition purposes we might want to keep the following
> >> expression in
> >> the input order.
>
> >> \[Pi] Sin[x] \[ExponentialE]^x // HoldOp[Times]
> >> % // ReleaseHold
> >> giving
>
> >> HoldForm[Pi*Sin[x]*E^x]
>
> >> \[ExponentialE]^x \[Pi] Sin[x]
>
> >> Often we will have cases where some operation has automatic built-
> >> in rules,
> >> such as linear and Leibnizian breakouts with differentiation.
> >> Again, for
> >> exposition purposes, we might want to show the expression before
> >> these rules
> >> are applied.
>
> >> g[x_] := x^2
>
> >> D[a f[x] g[x], x] // HoldOp[D]
> >> % // ReleaseHold giving
>
> >> HoldForm[D[a*E^x*x^2*Sin[x], x]]
>
> >> a \[ExponentialE]^x x^2 Cos[x] + 2 a \[ExponentialE]^x x Sin[x] +
> >> a \[ExponentialE]^x x^2 Sin[x]
>
> >> --
> >> David Park
> >> djmp... at comcast.nethttp://home.comcast.net/~djmpark/
>
> > Perhaps Defer is a kind of better-behaved Unevaluated:
>
> > 1. That disappears even when not an argument to another function
> > 2. And that terminates infinite evaluation immediately.
>
> > ?
>
> > Vince Virgilio
>
> Better-behaved Unevaluated ? I can't see any (or almost any)
> relation between the two, and certianly no "better behavior".
>
> Head[Unevaluated[1 + 1]]
> Plus
>
> Head[Defer[1 + 1]]
> Defer
>
> That's a pretty basic difference.
>
> Andrzej Kozlowski- Hide quoted text -
>
> - Show quoted text -
On another topic about Defer . . .
Here is a quote from its documentation:
If an object contains several levels of nested Defer constructs,
one level is removed
each time the object is evaluated as Mathematica input.
How to invoke this behavior? I see no way to observe the incremental
release of Defer. For example, I can't find it here:
In[34]:= Total@{Defer[1+Defer[1+Defer[1+1]]]}
Out[34]= 1+(1+(1+1))
In[35]:= 1+(1+(1+1))
Out[35]= 4
where In[35] is a copy of Out[34] (either copy/paste, or evaluate-in-
place % or Out[34]).
The copies do not contain Defer; they contain only the visible text
(per ctl-shift-e "Show Expression"), so I am not surprised that In[35]
evaluates to 4.
Perhaps the question should be how to get the nested "object" referred
to in the documentation; I can only get copies of the displayed
expression, as above.
Vince Virgilio
- References:
- Re: What is the purpose of the Defer Command?
- From: Vince Virgilio <blueschi@gmail.com>
- Re: What is the purpose of the Defer Command?