Re: Re: What is the purpose of the Defer Command?
- To: mathgroup at smc.vnet.net
- Subject: [mg81956] Re: [mg81916] Re: What is the purpose of the Defer Command?
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 7 Oct 2007 05:40:15 -0400 (EDT)
- References: <fe4uhp$155$1@smc.vnet.net> <200710060846.EAA25515@smc.vnet.net>
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
- 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?