Re: Re: HoldForm in defined function doesn't seem to work
- To: mathgroup at smc.vnet.net
- Subject: [mg99306] Re: [mg99266] Re: HoldForm in defined function doesn't seem to work
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Sat, 2 May 2009 06:00:03 -0400 (EDT)
- References: <gt9aki$q22$1@smc.vnet.net> <gtbuo8$2r4$1@smc.vnet.net>
Hi Joel, in your last example, the data won't survive in unevaluated form - the numbers are multiplied inside a list before being passed to EditingSequence. Here is a possible fix, which does not affect the code of your EditingSequence: 1. Make sure you wrap your (unevaluated) expressions in Hold rather than List In[1] = expr = Hold[12, 12 34, 12 34/56]; 2. The following code then will do the trick: In[2] = Module[{myHold}, Attributes[myHold] = {HoldAll}; EditingSequence[myHold @@ expr] /. myHold -> List] We need a local Hold-like wrapper because you may have some Hold-s somewhere deeper in expressions you analyze, and you can not use Hold-> List. Regards, Leonid On Fri, May 1, 2009 at 2:23 AM, <joel.aufgang at gmail.com> wrote: > Wow! What a great number of responses. Thanks to all of you who > helped me out with this. > > The SetAttributes[f,HoldAll] solution was just what I was looking > for. > > > > Unfortunately, I'm still stuck on something.... Namely, using this > with the Map function. > > I'm trying to display the way the notebook front end rewrites the box > model representation of an expression as it is edited. I'd like to > display a sequence of expressions and their ToBoxes representations > using a SlideView. So I'm doing something like this: > > ========================== > ============== > > ShowBoxForms[expr_] := TableForm[ {HoldForm[expr], ToBoxes[HoldForm > [expr]][[1]], TreeForm[ToBoxes[HoldForm[expr]][[1]]]}]; > EditingSequence[expr_] := SlideView[Map[ShowBoxForms, expr], > AppearanceElements -> All]; > SetAttributes[ShowBoxForms, HoldAll]; > SetAttributes[EditingSequence, HoldAll]; > {a, a b, a b c, a b c/d} // EditingSequence > {a, ab, a b, a b c, a b c^2, a b + c^2, a (b + c)^2, a (b + c)^ > (2/3)} // EditingSequence > {12, 12 34, 12 34/56} // EditingSequence > > ========================== > ============== > > Unfortunately, even though I am setting the HoldAll attributes on my > functions, the hold is being removed when the Map function is being > called. You can see this by looking at the third editing sequence in > my example, where the numeric expressions are being evaluated before > being converted to boxes. "12 34/56 // ShowBoxForms" Works > perfectly, but I need it to display the same way when being called > through EditingSequence > > I've tried setting HoldAll on Map, but that messes everything up even > more. Doing this holds the entire list from the argument, which > causes Map to be applied to the entire list and not each element. I > need to be able to use Map while performing a HoldForm on each element > of the input argument list. > > Any help with this would be greatly appreciated. And Thanks again for > the previous help as well. > > Joel. > > > On Apr 30, 6:32 am, mju... at gmail.com wrote: > > On Apr 29, 9:37 pm, joel.aufg... at gmail.com wrote: > > > > > > > > > I'm struggling to understand why this doesn't work: > > > > > f[x_] = HoldForm[x]; > > > HoldForm[123 456 789] (* returns "123 x 456 x 789" *) > > > f[123 456 789] (* returns"44253432" *) > > > > > I don't understand why the two results are different. Is there a > > > special trick I need to do to be able to define f so that the HoldForm > > > works? > > > > > I'm using this to help visualize the way a notebook represents typed > > > expressions, so I'm trying to do something like this: > > > > > BoxTree[expr_] := TreeForm[ToBoxes[HoldForm[expr]][[1]]]; > > > a b c d e // BoxTree > > > 123 456 789 // BoxTree (* want this to show as a RowBox like the > > > previous example *) > > > > > Any help would be greatly appreciated. Thanks. > > > > That's the way Mathematica evaluates expressions. To achieve the > > desired effect add command: > > SetAttributes[f,HoldAll] > > > > Best wishes, Yuri > > >