Re: How to localize a symbol when using Manipulate?
- To: mathgroup at smc.vnet.net
- Subject: [mg112611] Re: How to localize a symbol when using Manipulate?
- From: John Fultz <jfultz at wolfram.com>
- Date: Thu, 23 Sep 2010 04:20:41 -0400 (EDT)
Do you need to use a symbol? Why not use a string? Since you seem to be saying that you would never make any assignments to it, a string should substitute in cleanly for a symbol, and the quotes will not display in Manipulate output. E.g., Manipulate[Expand[("a" + "b")^40]] Sincerely, John Fultz jfultz at wolfram.com User Interface Group Wolfram Research, Inc. On Wed, 22 Sep 2010 01:58:11 -0400 (EDT), Nasser M. Abbasi wrote: > Mathematica experts: > > I came up against this problem when writing a demo. > > I simplified to it to the following: > > I want to make a call to a lower level function which makes an > expression (say build a polynomial in s) and returns it back to be > displayed. > > I want this function to use a symbol, say s, to build the polynomial. > > The problem is how to localize the symbol itself so it is not global. > > Since one dose not declare things in Mathematica, (sometime I wish I > could) I can't declare the s to be a symbol, but must just use it. > > Here is a simple example to show the problem: > > If one does not pass a symbol for a lower level function during the call > to be used in constructing an expression, then the expression will have > $nnnn added to it. > > Manipulate[process[n], {n, 2, 10}, > Initialization :> > (process[n_] :== Module[{s}, s^n]) > ] > > If you run the above, the result shown will be s$nnn^2 where nnn is > some number. > > > To solve the above problem, typical solution is to pass the symbol name > to be used. Example > > Manipulate[process[s, n], {n, 2, 10}, > Initialization :> > (process[s_, n_] :== Module[{}, s^n]) > ] > > If you run the above, the result shown will be s$^2 > > There is a problem with the above solution. s in the above is global > variable. Hence s needs to be localized. Since 's' is not a control > variable (like 'n' is in this example), it needs to be explicitly > localized (control variables are localized by default). > > The problem is how to localize 's'? > > One can not write the following, since 's' becomes Null > > Manipulate[process[s, n], {n, 2, 10}, > {s, ControlType -> None}, > Initialization :> (process[s_, n_] :== Module[{}, s^n]) > ] > > If you run the above, the result shown will be Null^2 > > I also can't use the Symbol[] trick > > Manipulate[process[Symbol["s"], n], {n, 2, 10}, > Initialization :> ( > process[s_, n_] :== Module[{}, s^n]) > ] > > One way is not not pass 's' at all, and on return, strip the $$$n from > the symbol, as follows, However using ToExpression is not allowed in a > demo (for same reason as Symbol is not allowed, security). (someone > helped me long time ago with providing the following nice strip function > here in this newsgroup) > > Manipulate[ strip[process[n]], {n, 2, 10}, > Initialization :> ( > process[n_] :== Module[{s}, s^n]; > > strip[expr_] :== > Module[{}, ToExpression[StringReplace[ToString[expr, > FormatType -> TraditionalForm], > c:LetterCharacter~~"$"~~DigitCharacter.. :> c]]]; ) > ] > > > I have to use ToExpression, else the result will be String, which makes > it hard to use later on, but is OK for just printing and display. > > Any one has other ideas I could try? > > thanks > --Nasser