Re: scope of variable in NCL

From: David Brown <dbrown_at_nyahnyahspammersnyahnyah>
Date: Wed Oct 21 2009 - 14:37:30 MDT

Hi Saji,

I'd like to return to this question, because I may have been somewhat
misleading in my response of Oct 16:

In particular, I need to note the difference between what in Fortran
is called the 'actual' argument versus the 'dummy' argument. In the
second of your examples the function
'testme' has 3 dummy arguments a, b, and c. These are used in the
definition of the function. When called it is passed the actual
arguments a, 1, and 2. Thus in the example the symbol 'a' is both an
actual argument and a dummy argument, somewhat obscuring the true
behavior of NCL. Here is an alternate version of your example:

a=5
foo = 42
function testme(foo,b,c)
begin
   foo=2
return(1)
end
print(""+a)
print(""+testme(a,1,2))
print(""+a)
print(""+foo)

The output is as follows:

(0) 5
(0) 1
(0) 2
(0) 42

So yes, an actual argument can be modified within a function, but a
global variable that just happens to have the same name as a dummy
argument is not affected by calling the function. So in that sense,
the dummy arguments are inherently 'local'. Presumably if you call a
function using a variable that has been defined globally you know you
are doing so. Any function or procedure that potentially changes an
input argument should definitely be documented as doing so.

The rationale for passing arguments by reference in NCL is that
arguments might be large data arrays and it would be expensive to copy
them. Unlike C, NCL (in the interest of keeping things simple) does
not have a pointer type, so the only way to avoid copying is to pass
arguments by reference.

The only difference between a function and a procedure in NCL is that
a function returns a value.
  -dave

On Oct 17, 2009, at 6:42 PM, Saji wrote:

> Hi Dave and Wei and others,
>
> Thanks for the feedback and clarification. I understand it
> , but doesn't it illustrate a situation, where some unsuspecting
> user accidentally uses the same name somewhere in his script
> as the function argument and lands up a nasty surprise. If the
> library developer cannot ensure the 'local' scope of the arguments
> within the function, it is a bit inconvenient, as the developer
> has to be careful not to change the arguments that are passed on
> to the function. I still wonder why this behaviour is implemented
> in NCL functions, as a function is supposed to return a single data
> object.
> ...why should it change other variables or arguments that it does not
> return. Also this means that there is no real difference between a
> so called 'procedure' and 'function'. If I am a paranoid user, I
> would have
> to check all function definitions, before I feel confident to use
> them.
>
> I wonder if it will be possible to rethink this design issue in NCL at
> least for functions --
>
> Best regards,
> saji
>
>
> * David Brown <dbrown@ucar.edu> [2009-10-16 09:29:30 -0600]:
>
>> Hi Saji,
>> Wei is quite correct about this case. Arguments are passed by
>> reference and the variables they reference can be modified inside
>> the function. The 'local' statement has no meaning for arguments.
>> You can ignore the last message I sent. I apologize that I did not
>> notice that 'a' was being used as an argument to the function.
>> -dave
>>
>> On Oct 16, 2009, at 8:09 AM, Wei Huang wrote:
>>
>>> Saji,
>>>
>>> That is because you use "a" as an argument element, and local.
>>>
>>> If you do "print("" + test(0,1,2))", then you can not change "a"
>>> out side your function.
>>>
>>> Wei Huang
>>> huangwei@ucar.edu
>>> VETS/CISL
>>> National Center for Atmospheric Research
>>> P.O. Box 3000 (1850 Table Mesa Dr.)
>>> Boulder, CO 80307-3000 USA
>>> (303) 497-8924
>>>
>>>
>>>
>>>
>>>
>>> On Oct 15, 2009, at 11:03 PM, Saji N Hameed wrote:
>>>
>>>> Even declaring "a" as local does not seem to work :(
>>>> ncl 1> function test(a,b,c)
>>>> ncl 2> local a,b,c
>>>> ncl 3> begin
>>>> ncl 4> a=-999
>>>> ncl 5> return(1)
>>>> ncl 6> end
>>>> ncl 7> print(""+test(a,1,2))
>>>> (0) 1
>>>> ncl 8> print(""+a)
>>>> (0) -999
>>>>
>>>> * Saji N Hameed <saji@apcc21.net> [2009-10-16 13:59:15 +0900]:
>>>>
>>>>> Dear NCL Developers,
>>>>>
>>>>> I suppose that the following should not happen. Isn't it a bug?
>>>>> We are told that variables inside a function have local scope, and
>>>>> this unusual feature can lead to a lot of headaches. Any
>>>>> solutions,
>>>>> other than "local a" or using another variable name than "a"
>>>>>
>>>>> Copyright (C) 1995-2009 - All Rights Reserved
>>>>> University Corporation for Atmospheric Research
>>>>> NCAR Command Language Version 5.1.1
>>>>> The use of this software is governed by a License Agreement.
>>>>> See http://www.ncl.ucar.edu/ for more details.
>>>>> ncl 0> a=5
>>>>> ncl 1> function testme(a,b,c)
>>>>> ncl 2> begin
>>>>> ncl 3> a=2
>>>>> ncl 4> return(1)
>>>>> ncl 5> end
>>>>> ncl 6> print(""+a)
>>>>> (0) 5
>>>>> ncl 7> print(""+testme(a,1,2))
>>>>> (0) 1
>>>>> ncl 8> print(""+a)
>>>>> (0) 2
>>>>>
>>>>> Thanks,
>>>>> saji
>>>>> --
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> ncl-talk mailing list
>>>>> List instructions, subscriber options, unsubscribe:
>>>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>>>>
>>>>
>>>> -- Saji N. Hameed
>>>>
>>>> APEC Climate Center
>>>> 1463 U-dong, Haeundae-gu, +82 51 745
>>>> 3951
>>>> BUSAN 612-020, KOREA saji@apcc21.net
>>>> Fax: +82-51-745-3999
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> ncl-talk mailing list
>>>> List instructions, subscriber options, unsubscribe:
>>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>>
>>> _______________________________________________
>>> ncl-talk mailing list
>>> List instructions, subscriber options, unsubscribe:
>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>
>>
>
> --
> Saji N. Hameed
>
> APEC Climate Center
> 1463 U-dong, Haeundae-gu, +82 51 745
> 3951
> BUSAN 612-020, KOREA saji@apcc21.net
> Fax: +82-51-745-3999
>
>
>
> _______________________________________________
> ncl-talk mailing list
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk

_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Wed Oct 21 14:37:28 2009

This archive was generated by hypermail 2.1.8 : Thu Oct 22 2009 - 13:09:30 MDT