To rephrase what you are saying... it should remain a bug. It should still be called a bug in the sense that there is no sane intent of defining a modifier in a locale that relies on the caller's locale definitions, or not something in its own copath. The issue of no possible workaround for numbered locales is also serious.
I can't speak to the wisdom of broader execution time issues, but it would seem possible to execute: 2 : 'u a v y' as: u_caller_ a v_caller_ y within the locale that it is called (numbered or static definition location). is a "compiled" conjunction already marked/classified as to whether it accesses x and y or not? I imagine so because there is usually significant performance benefits when we are able to define modifiers that avoid access to x/y. explicit code already provides workarounds in verbs for preventing unwanted fixing of noun__localed in tacit definitions. The same type of unoptimizations should probably be extended to explicit modifiers (that return explicit expressions). ----- Original Message ----- From: Henry Rich <[email protected]> To: [email protected] Cc: Sent: Sunday, November 17, 2013 11:17:52 AM Subject: Re: [Jprogramming] bug in conjunction locales? This is not a bug and the explanation is in my long message. Briefly, c_my1_ executes in my1, but the derived verb (>: c_myl_ +) executes in the user's locale. Note that c references a when the derived verb is executed, but cp references a when cp itself is executed. This really points out the differences in the two executions. Henry Rich On 11/17/2013 10:53 AM, Pascal Jasmin wrote: > I added a bug report and narrowed down the issue: > > Most likely the error occurs when a modifier definition accesses y. This > cannot be intentional design because one locale's definition cannot possibly > rely on another locale's state, and the primary reason for defining a > modifier in a specific locale is to use that locale's environment. > > > cocurrent 'myl' > a=: 4 > c =: 2 : 0 NB. will execute wrong (callers) locale > smoutput 18!:5 '' > u a v y > ) > cp =: 2 : 0 NB. will execute right (this) locale > smoutput 18!:5 '' > v@:u^:a > ) > > cocurrent 'newl' > > c2_myl_ =: 2 : 0 > smoutput 18!:5 '' > u a v y > ) > > test =: 3 : 0 > a=: 14 > smoutput >: c_myl_ + 1 > smoutput >: c2_myl_ + 1 > c =: conew 'myl' >> : c2__c + 1 > ) > > in session: > > test_newl_ '' NB. results should be 6 (and <'myl') for all 3. > ┌────┐ > │newl│ > └────┘ > 16 > ┌────┐ > │newl│ > └────┘ > 16 > ┌────┐ > │newl│ > └────┘ > 16 > > conjunction that does not access y in session (or script): > conj_myl_=: 2 :'v@:u^:a' > >: conj_myl_ ] 1 NB. result for both should be 5 > 5 > >: cp_myl_ ] 1 > 5 > > c3_myl_ =: 2 : 'u@:(a&v)' > >: c3_myl_ + 1 NB. result should be 6 > 6 > > > > ----- Original Message ----- > From: Henry Rich <[email protected]> > To: [email protected] > Cc: > Sent: Sunday, November 17, 2013 12:14:24 AM > Subject: Re: [Jprogramming] bug in conjunction locales? > > I cannot replicate this (I run J602). > > conj_cat_=: 2 :'v@:u^:a' > a_cat_ =: 5 > + conj_cat_ - > -@:+^:5 > > load 'C:\Jprograms\temp\99.ijs' > NB. contents of the script are: > NB. conj_dog_=: 2 :'v@:u^:a' > > a_dog_ =: 6 > + conj_dog_ - > -@:+^:6 > > Henry Rich > > On 11/16/2013 11:36 PM, Pascal Jasmin wrote: >> I'll just make this shorter. The only bug is in script files vs. >> interactive mode. The key to (and only way of) noticing the bug is to use a >> conjunction definition that accesses an external parameter affected by what >> the current locale is (such as the 'a' parameter in following): >> >> conj_cat_=: 2 :'v@:u^:a' >> >> >> If the above is defined in repl then it will correctly use a_cat_, and use a >> late binding for a. >> >> If it is defined in a script file, then a will be whatever 'a' is in the >> caller's locale. >> >> I of course agree with you in what the locale of verb vb should be, but that >> is unrelated to this issue. I agree with the interactive mode's execution >> of locales. But at any rate, either interactive or script mode necessarily >> has a bug. >> >> >> ----- Original Message ----- >> From: Henry Rich <[email protected]> >> To: [email protected] >> Cc: >> Sent: Saturday, November 16, 2013 11:02:10 PM >> Subject: Re: [Jprogramming] bug in conjunction locales? >> >> The point, as Raul has pointed out, is that 'execution' of the >> conjunction is not what you think it is. Raul said that conjunctions >> are executed twice, which is not quite right: the conjunction is >> executed once, to produce an anonymous verb, and then that verb is >> executed, at which time the text of the conjunction is interpreted. >> >> Consider >> >> vb =: + c_loc_ - >> >> Assume c_loc_ is defined like >> c_loc_ =: 2 : 0 >> u@v y >> ) >> >> What is vb? >> >> Answer: it is the result of executing c_loc_ . It is a verb, which >> contains the +, -, and text of c_loc_, saved for interpretation when vb >> is executed. The text of c_loc_ has not been executed. >> >> What is the locale of vb? >> >> Answer: whatever locale was in effect when it was defined. The loc >> locale has nothing to do with vb. >> >> Why doesn't >> vb 3 >> execute in loc? >> >> Answer: Why should it? c_loc_ has been executed and is a distant >> memory. vb contains the text that was in c_loc_, but it is not c_loc_, >> and is not in the loc locale. >> >> What about >> (+ c_loc_ -) 3 >> ? What locale does it execute in? >> >> Answer: The locale that was in effect. Now there is no name vb, but >> the idea is the same: the verb (+ c_loc_ -) is an /anonymous verb/ >> and it is defined in the locale in effect. It executes in that locale. >> >> Given >> vb_loc1_ =: + c_loc_ - >> vb_z_ =: vb_loc1_ >> vb 3 >> what locale is in effect when the text of vb is executed? >> >> Answer: loc1. Again, c_loc_ is long gone, and executing vb_loc1_ >> sets the locale to loc1. >> >> Isn't this a bug? >> >> Answer: No. To say otherwise would be to say that a derived verb >> must inherit locale from its components. Then there is a whole new set >> of problems: >> vb =: (+ adv_loc1) @ (- adv_loc2) >> What would be the locale of vb? >> vb =: (+ adv_loc1) (- adv_loc2) (- adv_loc3) >> What would be the locale of vb? >> >> The current definition is clear and crisp, and hasn't revealed any >> insuperable problems. >> >> JfC discusses this in more detail. >> >> Henry Rich >> >> >> On 11/16/2013 10:39 PM, Raul Miller wrote: >>> The issue, I think, is that (except for verbs) names are resolved to >>> their definitions before their definitions are used. >>> >>> require 'trace' >>> trace 'verb_dog_ conj_cat_ %' >>> --------------- 4 Conj ------- >>> verb_dog_ >>> 2 : 'u&.(v inv)' >>> % >>> verb_dog_&.(%^:_1) >>> ============================== >>> >>> Notice how the verb is named and the conjunction is not. >>> >>> I remember there being an explanation for this but I do not remember >>> if that was grounded in "efficiency concerns" or in dictionary. >>> >>> Thanks, >>> >> ---------------------------------------------------------------------- >> 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
