> With[ { a = 2, b = 3 }, a + b x]
>
> wird
>
> 2 + 3 x ausgegeben.
>
> Aber mit
>
> g = a + b x ;
> With[ { a = 2, b = 3 }, g]
>
> ist das Resultat
>
> a + b x
>
> was meiner Meinung nach zumindest nicht dem entspricht, was im Handbuch
> bzw. in der Hilfe beschrieben wird. ist g keine expression? Warum werden
> hier die Größen a und b nicht ersetzt?
With funktioniert ganz ähnlich wie Ersetzungen in
Substitutionsregeln, nämlich, daß der Ersetzungsparameter
nicht als Variable "greifbar" ist (wenn das der richtige
Ausdruck ist), daher geht etwa
With[ {x = {}}, AppendTo[x, 1] ]
schief.
Im Gegensatz dazu definiert Block "echte" Variablen, daher
funktioniert
Block[ {x = {}}, AppendTo[x, 1] ]
ganz einwandfrei. Module definiert ebenfalls "echte" lokale
Variable, aber da Module lexical scoping implementiert (wenn
auch nur als dynamical scoping mit umbenannten Variablen), haben
diese lokalen Variable keinen Einfluß auf zuvor definierte
Ausdrücke.
Analog werden die Substitutionen von With sofort eingesetzt,
d.h.
With[ {a = 2}, Print[HoldForm[a]] ]
gibt "2" zurück, während dasselbe Konstrukt mit Block "a"
hinschreibt.
Viele Grüße,
Thomas