       Re: scope all wrong? in Mathematica 4.1

• To: mathgroup at smc.vnet.net
• Subject: [mg31832] Re: scope all wrong? in Mathematica 4.1
• From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
• Date: Fri, 7 Dec 2001 05:55:44 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```Hi,
> Consider the mathematica definition
>
> rr[x_] := Block[{x}, x = 5; Print["x is ", x]]
>
>   what do you expect here?

A disaster ? a complete crash of the system ?
The destruction of Mathematica's memory management ?
Future unpredicted results form Mathematica ?
(That happens in early versions of Mathematica in such a case)

>
> rr[z]  -->   x is 5  is printed.
> but you might not expect
>
> rr  -->    "Block::"lvsym": "Local variable specification{4} contains 4
> which is not a symbol or an assignment to a symbol."
>
> If you use Module instead of Block, you get
> the same.

Wow ! Mathematica is so smart -- one of the most clever
programs I have ever seen.

You type complete nonsense and assign a value to a pattern
and you only get an error message -- it is great !

You should definitely try to assign a value to a pattern
to Mathematica version 1.2 !

A pattern stand for "all things like ..." and you can't
say "all things" are 5.

>
> However,
> Block[{x = 4}, Block[{x}, x = 5; Print["x is ", x]]]
>
> prints   x is 5
>
> Using pattern matching for
> substituting 4 for x in rr even when x is bound seems
> to be counter to what most programming language designers
> would expect.

A pattern is *not* a variable on the stack of a C-program !
A pattern is a general form and can't have a value.

>
> Now look at
>
> uu[x_?((x = 5; Print["x is ", x]; True) &)] := x
>
> Usually when one defines a program, nothing is printed.
> Here, we get
> x is 5
> 5
> x is 5

My Mathematica 4.1 prints nothing.

>
> If we do this:
> x =400
> uu
>      x is 5  printed
> the value returned is 70
> and the global x is 5.
>

This is absolutely correct. What whould you expect from

uu[canBeAnyExpression_?((x = 5; Print["x is ", x]; True) &)] := x

(?) the behaviour that you report ! That you just like to say
that "any expression" has the name "x" on the right hand side
can't affect the transformation rule.

> Try this:
> Module[{x}, uu[x_?((x = 5; Print["x is ", x]; True) &)] := x;
>    Print["in Module, x is " , x]]
>
> The expectation in a system supporting lexical scope
> with Module
> is that no use of x inside the module would escape.
> But it does.  The global x is set to 5.

No ! You have typed all you examples but you have not cleared uu and x
before you enter the last example:

Try

x =.;
Clear[uu];
Module[{x}, uu[x_?((x = 5; Print["x is ", x]; True) &)] := x;
Print[DownValues[uu]];
Print["in Module, x is ", x]]
x

and your global x is unchanged.

>
> The reason this all came up is in correspondence suggesting
> that programs in one computer algebra system could be
> translated into another.

If you have a Mathematica code, there is no reason
to translate it to an other system.
But is a noble idea to translate the code from
other systems to Mathematica.

> If systems are semantically
> "surprising", it is more difficult. I wonder how much
> of mathematica internally depends on wrong scope, or how
> much of the code is susceptible to bugs because of unexpected
> capture of names.  (I suspect that this has caused a proliferation
> of package names e.g. MySecretNameSpace`x   in Mathematica
> routines).

And *I* wonder how much of your work depends on such
sloppy "observations".
Please be a bit more careful *before* you make a wild
guesses about the internal structure of Mathematica !

Regards
Jens

```

• Prev by Date: Re: Fourier: Execution time for real and complex arguments
• Next by Date: Re: scope all wrong? in Mathematica 4.1
• Previous by thread: scope all wrong? in Mathematica 4.1
• Next by thread: Re: scope all wrong? in Mathematica 4.1