MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: What is the purpose of the Defer Command?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg81908] Re: What is the purpose of the Defer Command?
  • From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
  • Date: Sat, 6 Oct 2007 04:42:25 -0400 (EDT)
  • References: <fe4uhp$155$1@smc.vnet.net>

Hi,

one thing that comes in mind is a help-text with an example.
You can copy the help-text into you notebook and will
lose a will only evaluated there and not in the original help
text.

Regards
   Jens

David Park 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]
> 
> 


  • Prev by Date: Re: Re: Can Integrate[expr,{x,a,b}] give an incorrect result?
  • Next by Date: Re: What is the purpose of the Defer Command?
  • Previous by thread: What is the purpose of the Defer Command?
  • Next by thread: Re: What is the purpose of the Defer Command?