Because the name 'u' is a special name. One of six special names in the language.
-- Raul On Mon, Nov 7, 2016 at 6:37 PM, Louis de Forcrand <[email protected]> wrote: > 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 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
