The script below produces
Warning: 'mfx' shadows a function of the same name
I wanted
Warning: 'mfx' shadows a lag creation for series of the same name
rename it if you need to use name(lag), or name(lag1 to lag2)
Renaming series is much simpler.
Instead of unwanted behavior of lags for single variable
we have broken package
<hansl>
nulldata 100
series mfx = normal()
series y = normal()
series x = normal()
include a_eff.gfn
ols y 0 x
mod = $model
mfx(&mod)
series z = mfx
delete mfx
<hansl>
Oleh
On Fri, 26 Oct 2018, Sven Schreiber wrote:
> Am 26.10.2018 um 14:46 schrieb Allin Cottrell:
>> On Fri, 26 Oct 2018, Sven Schreiber wrote:
>>>
>>> I don't mean to imply any consequences (except perhaps warnings and hints
>>> to package writers in the docs), but for completeness it should perhaps be
>>> noted that this is not entirely true: If you receive a list argument and
>>> pick out certain series their names come from the outside.
>>
>> But they cannot be referenced by their outer names within the function, you
>> have to use the List.$i syntax. Here's an example:
>>
>> <hansl>
>> function void argnames (list L)
>> loop foreach i L
>> series x$i = L.$i(-1)
>> print x$i
>> endloop
>> end function
>>
>> open denmark
>> rename LRY sin # try to cause trouble!
>> list X = LRM sin
>> argnames(X)
>> </hansl>
>>
>> Inside argnames() we're able to take a lag of the series known as "sin" in
>> main without a problem.
> Also good to know, but what I meant is something like this:
>
> <hansl>
> clear
> function list LRM(int i)
> print "just to have a function with this name"
> list L1 = null
> return L1
> end function
>
> function list exlag(list L)
> s = varnames(L)[1]
> series @s = L[1]
> list out = @s(-1)
> return out
> end function
>
> open denmark
> list Lo = exlag(LRM)
> list Lo print
> </hansl>
>
> Again, I'm not saying these artificial cases have to be caught,
> just adding this example for completeness.
OK. But I'd say that what now happens with your example in git is
correct. Within exlag(), the user-function LRM() is masked by the
series-name LRM; the function is ignored and the first lag of LRM is
created.
If that's not what "you" (hypothetical function-writer) wanted, then
don't use varnames() on series you got via a list; you can't be sure
that these names won't collide with other stuff -- not only
functions, but variables of type other than series that you have
defined. That's the point of the "List.$i" syntax.
I guess if we wanted to get very nanny-ish about this we could
figure out a way to make varnames() fail on series whose names
you're not supposed to have access to inside a function.
Allin
_______________________________________________
Gretl-devel mailing list
Gretl-devel@lists.wfu.edu
http://lists.wfu.edu/mailman/listinfo/gretl-devel