[Date Index]
[Thread Index]
[Author Index]
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
>
>
>
Prev by Date:
**Re: HoldForm in defined function doesn't seem to work**
Next by Date:
**Re: Defining function with indexed variables**
Previous by thread:
**Re: HoldForm in defined function doesn't seem to work**
Next by thread:
**Convex hull**
| |