Re: What is the purpose of the Defer Command?
- To: mathgroup at smc.vnet.net
- Subject: [mg81984] Re: What is the purpose of the Defer Command?
- From: Vince Virgilio <blueschi at gmail.com>
- Date: Mon, 8 Oct 2007 02:03:17 -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 - I think I misrepresented your example in my last post, and apologize for that. Nonetheless, please consider the following modification of your example (that fits my argument more :) ): In[18]:= Unevaluated[1+1] Out[18]= Unevaluated[1+1] In[19]:= Head[Out[18]] Out[19]= Unevaluated In[20]:= Defer[1+1] Out[20]= 1+1 In[21]:= Head[Out[20]] Out[21]= Defer Further evaluation of a copy of Out[18] yields Out[18], while further evaluation of a copy of Out[20] yields 2. That, I think, is the important difference, not the syntactic difference between Out[19] and Out[21]. As for the similarity, in hindsight, wouldn't WRI have designed Unevaluated to behave as Defer at the top level? If no, why not? 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?