       Re: mathematica newbie trouble

• To: mathgroup at smc.vnet.net
• Subject: [mg99303] Re: [mg99276] mathematica newbie trouble
• From: Leonid Shifrin <lshifr at gmail.com>
• Date: Sat, 2 May 2009 05:59:30 -0400 (EDT)
• References: <200905010952.FAA02056@smc.vnet.net>

```Hi,

The point is that 1. SetDelayed is a scoping construct, and 2. It does not
evaluate its rhs at the moment when assignment (definition) is made.
The first point means that it creates bindings between formal parameters and
the piece of code on the r.h.s (actually it relegates this to RuleDelayed in
the rule it creates). The second means that It adds
to the global rule base the delayed rule/definition (with its rhs not
evaluated), whose contract is exactly the following: when, during
evaluation, some expression matches the pattern of its lhs, take the
(unevaluated) code on the rhs of the rule, find all occurrences of the
parameters (names) on the lhs in this code, replace them by the actual
parameters passed (present in evaluated expression that matched the rule/def
pattern), and only then start evaluating the code. Thus, by the time the
parameters (say, 3,4,5) are used, it does not know what "s" is (considers it
a literal s), while by the time it starts to evaluate "s", the relations
between the parameter names (a,b,c) and their actual values in this function
call (3,4,5) (their bindings)  are long gone (in fact, by that time all of
the a,b,c-s in the original code have been replaced by 3,4,5), so a,b,c in s
remain it their symbolic form.

When you use Set, you force everything to evaluate at the moment of an
assignment, and s gets rewritten into (a + b + c)/2 before the actual
definition for <k> is formed. This problem is then avoided. However, using
Set to define functions is generally inappropriate (there are exceptions).
For example, your parameters a,b,c could have had global values, and then it
wouldn't work as intended. In your particular case, a cleaner solution would
be to use With:

k[a_, b_, c_] :=  With[{s = (a + b + c)/2}, Sqrt[s (s - a) (s - b) (s -
c)]];

Regards,
Leonid

On Fri, May 1, 2009 at 2:52 AM, Guapo <yangshuai at gmail.com> wrote:

> i wrote the following mathematica code:
>
> s := (a + b + c)/2;
> k[a_, b_, c_] := Sqrt[s (s - a) (s - b) (s - c)];
> k[3, 4, 5]
> k[5, 9, 12]
>
> when run it, i can't get the write answer. but i change setDelayed(:=)
> to set(=), everything works ok
>
> s = (a + b + c)/2;
> k[a_, b_, c_] = Sqrt[s (s - a) (s - b) (s - c)];
> k[3, 4, 5]
> k[5, 9, 12]
>
> i did a google search for the difference of set and setDelayed,
> however, i still can't understand it for the upper described problem,
> could anyone explain it? great thanks.
>
>

```

• Prev by Date: Re: How do I send the palette behind other windows?
• Next by Date: Re: Ten chess-players...
• Previous by thread: Re: mathematica newbie trouble
• Next by thread: Re: mathematica newbie trouble