Henry, this puzzles me:

   v=: 3 : 0
u=. +:
f y
)
   f=: u
   u=: ]
   v 5
10

Here, f uses the local value of u. This surprised me. However:

   v=: 3 : 0
g=. 10
f y
)
   f=: 3 : 'g'
   g=: 5
   v ''
5

Here, f uses the global value of g (as I expected).

Why is this so?

Thanks,
Louis

> On 07 Nov 2016, at 03:40, Henry Rich <[email protected]> wrote:
> 
> Sorry to throw the burden back on you, but please give an example showing 
> what you think is wrong or puzzling; what you think it should be; and why you 
> think that.  English is simply inadequate to frame such questions with the 
> requisite precision.
> 
> From what I have seen, lack of experience with other languages is a benefit 
> for learning J.
> 
> Henry Rich
> 
> 
> On 11/6/2016 9:35 PM, Louis de Forcrand wrote:
>> Thank you. I got the verb versus pro-verb problem; I guess it can be 
>> surprising to newcomers, but it is logical.
>> 
>> However, I don't understand why sending a verb such as f=: g to an adverb 
>> which (locally) redefines g allows f to see the local definition of g, 
>> whereas sending a verb such as h=: 3 : 'd' to an adverb which redefines d 
>> does not allow h to see the local definition of d. Is it because h is run in 
>> its own locale, while f is not? Would that mean that f=: 3 : 'g y' would not 
>> be able to see local g, while f=: g would?
>> 
>> Keep in mind that, although I did complete the locales lab a littlie while 
>> ago, I program as a hobby and thus have little to no experience whatsoever 
>> with OOP and locales.
>> 
>> Louis
>> 
>>> On 07 Nov 2016, at 03:17, Henry Rich <[email protected]> wrote:
>>> 
>>> I didn't read all this, but I sympathize with your perplexity. If you give 
>>> an individual testcase that produces a result you don't expect, and give a 
>>> thorough justification of why you expect something different, veterans here 
>>> will explain what's happening. More probably, you will discover the reason 
>>> yourself as you try to create the justification.
>>> 
>>> Just to pick up on one thing I did see: The value of (g =: ]) is (]), a 
>>> primitive with no name, which is not the same as (g), a name.
>>> 
>>> Henry Rich
>>> 
>>>> On 11/5/2016 12:38 PM, Louis de Forcrand wrote:
>>>> 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
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> 
> ----------------------------------------------------------------------
> 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