Re: Very very basic question about Mathematica expressions
- To: mathgroup at smc.vnet.net
- Subject: [mg111199] Re: Very very basic question about Mathematica expressions
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Fri, 23 Jul 2010 07:12:46 -0400 (EDT)
Hi Sam, A short answer is that there are no functions in Mathematica, only expressions and replacement rules (except pure functions perhaps). When you define a "function" like s[x_, h_]:=x+h you really associate a certain global replacement rule with a symbol <s>. When evaluator sees a match, it rewrites according to this rule. There are no stack frames or activation records - it is a completely different mechanism that superficially resembles function calls (there is evaluation stack which is similar but not the same). So, <s> is always a Symbol. Generally, Mathematica at its hart is a rule-based engine, not a functional language. Functional layer sits already on top of it. So comparisons with Scheme or Lisp may be misleading. In particular, if you study Mathematica evaluation loop, you will see that the recursive part will be similar to Lisp (that expressions are evaluated before subexpressions normally), but the part related to rule application is not found in Lisp.You may want to check out some simple account explaining these things about Mathematica, perhaps some parts of the virtual book or documentation related to evaluation of expressions. I also dwelt somewhat on this in my book, www.mathprogramming-intro.org/ Regarding Manipulate, this behavior is related to scoping (Manipulate is a scoping construct and you relationship between <s> and <h> was originally defined outside of the scope of Manipulate). Hope this helps. Regards, Leonid On Thu, Jul 22, 2010 at 1:44 PM, Sam Takoy <sam.takoy at yahoo.com> wrote: > Thanks to all who responded! > > May I belabor this point a little. I understand how to make Manipulate > work and I understand functions. (I am a product of Scheme from with > Mathematica seems to have borrowed a few ideas.) > > My question is much more formal: What are the building blocks of > Mathematica, the formal language. When you say > > s = x+h > > what is s? > > Is it an "expression"? Does s represent x+h wherever it appears > (assuming x and h are unassigned at the time of s=x+h)? Apparently not > always: yes in s/.h->5, but not in Manipulate. > > So here, then is my "model" of Mathematica: > In s = x+h, s is an "Expression" > In s[x_, h_]:=x+h, s is a "Function" > > Manipulate expects a "Function" so that answers my question. > > Then what is > > s[h_] := x + h? Is it an "Expression" or a "Function" of h with a > parameter x? > > Would then Manipulate[Plot[s[h], {x, 0, 1}, PlotRange -> {0, 1}], {h, 0, > 1}] work? (The answer is yes.) So apparently, Plot is happy with an > "Expression", but Manipulate wants a "Function"? Why? > > Also, in Manipulate[Plot[x+h, {x, 0, 1}, PlotRange -> {0, 1}], {h, 0, > 1}], x+h is no longer an "Expression", but is once again a "Function", > because of the context? Even though it's inside Plot which is happy with > an "Expression"? > > A personal note: I guess I'm a little frustrated that after a few months > of working with Mathematica, I still have to try things before I know > whether they'll work or not. I'm used to having a clear picture of the > grammar of the language that I'm working with, but I'm struggling here. > > > On 7/21/2010 7:14 AM, dr DanW wrote: > > I ran into this problem yesterday. I don't know exactly why it > > happens, I think it has something to do with the way Manipulate > > localizes variables. To solve it, I use a trick I found that lets me > > take an expression built up of global symbols and localize the > > symbols. Your trivial example: > > > > s = x + h > > > > Make a function out of it. The Evaluate[] is necessary to evaluate s, > > which replaces it with x+h > > > > sfnc = Function[{x, h}, Evaluate[s]] > > > > Now the Manipulate[] works fine > > > > Manipulate[Plot[sfnc[x, h], {x, 0, h}], {h, 0.1, 1}] > > > > I find myself using this trick a lot. > > > > Regards, > > Daniel > > > > >