I must say this is very confusing.
Shouldn’t any function that
a) makes no use of any foreigns or ?,
b) uses only local definition =. and
c) does not access any global variables (or has shadowed them with a local 
definition)
return the same result every time it is run with identical (same value) 
arguments?

   a=: 1 : 0
     g=. +:
     u y
   )

   ] a 5
5
   (u=: ]) a 5
5
   (g=: ]) a 5
5
   g a 5
10
   u a 5
|stack error: u
| u y

That is _very_ misleading. I understand that in the first 3 cases ] is passed 
by value
and in the other two by name, but I still see this as strange behaviour. When 
the adverb’s
argument is u, wether u has a value or not in the calling locale, gives a stack 
error. Using g,
no matter the value of g, gives 10. Using any other undefined name gives a 
value error.
Finally, using an anonymous function or proverb which isn’t g or u yields the 
correct answer.
That’s 3 different results or errors for basically one input _value_ (not 
counting the correct
value error).
The worst one IMHO is (g=: ]) a 5 versus g a 5. Finding such an error must be a 
quite
painful experience. Note that this happens here as well:

   a=: 1 : 0
     u=. +:
     g y
   )

   g=: u=: ]
   g a 5
5
   u a 5
5
   g=: u
   u=: ]
   g a 5
10
   u a 5
10

I guess this means that function arguments can access variables which are local 
to the
calling adverb. So can functions that use a value referred to by a global 
variable see
this value change if they are supplied as an argument to an adverb? Apparently 
not:

   g=: 3 : 'global'
   global=: 5
   a=: 1 : 0
     global=. 10
     u y
   )
   g 0
   5
   g a 0
   5

This is how I would have expected it to work in the first place. Why then can a 
function
argument to an adverb (unexpectedly) access a verb which is local to the adverb,
while it (as expected) cannot access a local variable?

Louis

> On 05 Nov 2016, at 15:33, Raul Miller <[email protected]> wrote:
> 
> On Sat, Nov 5, 2016 at 10:09 AM (EST), I wrote:
>> ... Now that I think this through, I think I can do a passable job of that.)
> 
> Actually, no, I do not.
> 
> Extracting the locale from a name is straightforward:
> 
> conamed=:3 :0
>  'a b'=. _2{.I.'_'='_',y
>  if. (0=a)+.1~:#;:y do.  NB. implied
>    18!:5 ''
>  elseif. b=a+1      do.  NB. indirect
>    ".b}.y
>  elseif.            do.  NB. direct
>    <}:a}.y
>  end.
> )
> 
> And, getting the name of an adverb argument is trivial:
> 
>   ;u`''
> 
> However, this does not address the issue faced by jtrace, which is
> finding the locale that jtrace was invoked from.
> 
> As a workaround, I would recommend assuming that that locale was the
> base locale. This potentially reduces the utility of the jtrace
> facility, but it seems like the right balance of simplicity.
> Specifically, I am recommending changing line 8 of executet_jtrace_
> and executep_jtrace_ from
> 
>   ". 't_z=. ', ; t_x
> and
>   ". 't_z=. ',t_x=. '(',(;:^:_1 t_x),')'
> 
> to
> 
>   do_base_ 't_z=. ', ; t_x
> and
>   do_base_ 't_z=. ',t_x=. '(',(;:^:_1 t_x),')'
> 
> Does this make sense?
> 
> Thanks,
> 
> -- 
> Raul
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to