next up previous contents
Next: Functions Up: Scoping Rules Previous: Modifying Global Variables

Modifying the Value of a Parameter

One common mistake many novice programmers make involves attempting to assign to a parameter name which has already been assigned a value. Darwin does not allow a new value to be assigned to the parameter. They may however be assigned a new undefined name. The following two versions of DummyProc exemplify this subtle difference of how Darwin treats a symbol and a value.

> DummyProc1 := proc( inside )
>   inside := 1;                    # assign to inside the value 1
> end:
> outside := 2;
> DummyProc1( outside );            # an error
Error, (in DummyProc1) invalid left hand side in assignment

> DummyProc2 := proc( inside )
>   inside := b;                    # assign to inside a symbol b
> end:
> outside := a;
> DummyProc2( outside );            # now outside has symbol b assigned
> print(outside);                   #   to it.
In the first example DummyProc1, we are attempting to assign the value 1 to the parameter inside. Darwin does not like this and reports an appropriate error. In the second example, DummyProc2, we are attempting to assign the name b to the parameter name. This is entirely legal.

If you are not confused yet, then try to explain the following behaviour:

> DummyProc3 := proc( inside )
>   bb := 7;
>   inside := bb;                    # assign to inside a symbol b
> end:
> outside := aa:
> DummyProc3( outside );             # now outside has symbol b
                                     #   assigned to it.
7
> print(outside);                    
aa
Here we have indirectly assigned the value 7 to the parameter inside. However, the change does not persist after the execution of the procedure.



Gaston Gonnet
1998-09-15