The inability of determining the locale of the calling context (to
qualify non-locative names with it) has bothered me for some time
(many years).

However, I did not have a convincing use case where it was significant
(I was trying to work with trace, and that apparently was not
important enough to warrant addressing this issue).

I think something should be done about it, but I'll leave the details
of that to the ISI folks.

Thanks,

-- 
Raul


On Wed, Apr 5, 2017 at 11:40 AM, Xiao-Yong Jin <jinxiaoy...@gmail.com> wrote:
>
>> On Apr 5, 2017, at 3:32 AM, Raul Miller <rauldmil...@gmail.com> wrote:
>>
>> I get:
>>   (-~&(^&3%3:)/ -: *:qromb_nr_) 1 2
>> |domain error
>> |   PolyInterpY=:PolyInterpY    (j-1)}~u trapzdNext ab
>>
> That was because your code has some issues.  You can see what's going on by
> checking the output of *trapzdNext_nr_
> I did some fixing to it.
>
>> But the locale is right, which is all I was concerned with.
>>
>> That said, there's another issue - we are working with an anonymous
>> verb, so we must manually set the locale back to what it was before we
>> exit. (The automatic locale switching only happens with named verbs.)
>>
> And there's another.  u and v has to run in their own respective locales,
> which my little code snippet of aa_t_ failed to address correctly.
>
>> Meanwhile... conjunctions are a bit trickier.
>>
>> However, you can write an adverb or conjunction which returns an
>> adverb or a conjunction. The adverb which returns an adverb is
>> probably the easiest to reason about syntactically (because adverbs
>> and conjunctions have a long left scope). Anyways, you can use this to
>> bring in arbitrarily many arguments. (Though you do need to think
>> about how you terminate the mess, if you are getting overly
>> ambitious.)
>>
>> Still, you wind up building a gerund to pass multiple verbs where they
>> need to be. Which is basically what you were suggesting, and I think
>> that that's all that's needed here.
>>
>> So, for example (being a bit verbose, but this is a verbose issue...):
>>
>> conj_example_=: 2 :0
>>  u`v conj_implementation_example_ (coname '')
>> )
> I don't know how to get the correct locale of u and v here.
> They could be 1) named verb, 2) primitives, 3) anonymous verb.
> How do I make them run in their correct locales?
>
>>
>> conj_implementation_example_=: 2 :0
>>  return_locale=. coname''
>>  cocurrent v
>>  '`u v'=. u
>>  NB. code goes here
> We actually need another level of wrapping because of early 'return.'s.
>
>>  return_value=. expression y NB. fix this expression
>>  cocurrent return_locale
>>  return_value
>> )
>>
>> I hope this helps,
>>
>> --
>> Raul
>>
>>
>>
>>
>> On Wed, Apr 5, 2017 at 2:29 AM, Xiao-Yong Jin <jinxiaoy...@gmail.com> wrote:
>>> Hi Pascal, Henry, and Raul,
>>>
>>> First, thank you for giving me suggestions.  Allow me to reply you all in 
>>> this one message.
>>>
>>> Raul, 'qromb' does a numerical integration, so
>>>   (-~&(^&3%3:)/ -: *:qromb) 1 2
>>> returns 1, meaning integrating *: from 1 to 2 is the same as 2-&(^&3%3:)1 
>>> or 2-&(*:d._1)1
>>> I got your code to work by putting back 'u' in those adverbs.
>>> But the code changes the current locale to nr after calling qromb_nr_ once, 
>>> and I don't see an easy
>>> way to get back to the calling locale.
>>> I also don't like rewriting the adverb into a conjunction.  What would I do 
>>> with a conjunction?
>>> Maybe I can rewrite it into a verb accepting gerunds.  I'll try looking 
>>> into this direction.
>>>
>>> Pascal, it really takes some time to wrap my head around your code.  I want 
>>> to have a generic method
>>> that would work for both adverb and conjunction, and have an interface that 
>>> works like a normal J adverb
>>> or conjunction.  Inspired by your verb and ti, I found the following work 
>>> around satisfying.
>>>
>>> NB.for a simple object/locale, with a monadic adverb a_t_ waiting to be 
>>> wrapped
>>>   a_t_=:1 : 'echo (u y);(5!:1<''u'');''a_t_'';y;(coname'''')label_.d'
>>>   d_t_=:'d_t_'
>>> NB.create an interface adverb aa_t_ for a_t_ and hide the data d_t_ via a 
>>> verb av_t_
>>>   aa_t_=:1 : '(cofullname&.>u`'''') av_t_ y'
>>>   av_t_=:4 : 'x`:6 a y'
>>>
>>> Henry, I see the complication.
>>> Assuming all names are fully qualified with locales (otherwise we stick the 
>>> current locale to it like cofullname does)
>>> What about letting 'v_lv_ a_la_' executes: switch to la, run 'v_lv_ a', 
>>> switch back?  Similar behavior for conjunctions.  Does the locale has to be 
>>> tied to anonymous verbs?
>>> I may have some misunderstanding, but my impression of the execution model 
>>> is that 'v_lv_ y' executes
>>> 1. get the value of 'y'
>>> 2. switch to 'lv'
>>> 3. get the value of 'v_lv_'
>>> 4. run 'v_lv_ y' by following the definition of 'v_lv_'
>>> 5. switch back
>>>
>>>
>>>
>>>
>>>> On Apr 4, 2017, at 9:01 PM, 'Pascal Jasmin' via Programming 
>>>> <programm...@jsoftware.com> wrote:
>>>>
>>>>
>>>>> should the anonymous verb created by
>>>>
>>>>
>>>> verb adv_locale_
>>>>
>>>> automatically be executed in (locale)?
>>>>
>>>>
>>>> The existing behaviour can be leveraged with duck typing in mind.
>>>>
>>>> One easy workaround I didn't get too deep in is based on this magic fork
>>>>
>>>> inl_z_ =: ((cocurrent@] ".@] [)"1 0 boxopen)
>>>>
>>>>
>>>> executes string x in  every locale y
>>>>
>>>> A conjunction version lets you access local parameters,
>>>>
>>>> lr_z_ =: 3 : '5!:5 < ''y'''
>>>> inlC_z_ =: 2 : ' (([: <^:(0=L.) v"_) inl~ m ,"1 '' '',"1 lr@:]) :  (([: 
>>>> <^:(0=L.) v"_) inl~ (lr@:[),"1 '' '' ,"1 m ,"1 '' '',"1 lr@:] )'
>>>>
>>>> inlA =: 1 : 'u inlC  (18!:5 '''')'
>>>>
>>>> ab_far_ =: 1 : (':';'x + a u y')
>>>> a_far_ =: 3
>>>>
>>>> a_base_ =: 33
>>>>
>>>> a ' + ab ' inlA_far_ 3
>>>> 39
>>>>
>>>> b =: 4 : 'x + a + y'
>>>>
>>>> 2 ' b_base_ ab ' inlA_far_ 3
>>>> 41
>>>>
>>>> in jpp, this can be
>>>>
>>>>
>>>> 2  ( b_base_ ab  inlC.: far) 3
>>>> ________________________________
>>>> From: Henry Rich <henryhr...@gmail.com>
>>>> To: programm...@jsoftware.com
>>>> Sent: Tuesday, April 4, 2017 8:12 PM
>>>> Subject: Re: [Jprogramming] locales with adverbs and conjunctions?
>>>>
>>>>
>>>>
>>>> I have been thinking about this & I don't see a better solution than
>>>> Raul's.  @Raul: think about putting something in NuVoc explaining this.
>>>>
>>>> I thought at first: should the anonymous verb created by
>>>>
>>>> verb adv_locale_
>>>>
>>>> automatically be executed in (locale)?  That would solve the immediate
>>>> problem.
>>>>
>>>> But it leaves us with the responsibility of defining a locale for every
>>>> anonymous verb.  What locale should we assign to:
>>>>
>>>> (V0 V1_locale_ V2)
>>>>
>>>> (V0_locale0_ V1_locale1_ V2_locale2_)
>>>>
>>>> (V0_locale0_ V1)
>>>>
>>>> ?
>>>>
>>>> I haven't been able to come up with something I would be willing to
>>>> suggest to Roger & Ken.
>>>>
>>>> Unless someone does, I guess we will leave it as is.  The locale suffix
>>>> gives an easy way to specify the locale of a verb - 98% of the cases -
>>>> and for the rest you need Raul's Device.
>>>>
>>>> Henry Rich
>>>>
>>>>
>>>>
>>>> On 4/4/2017 4:03 AM, Raul Miller wrote:
>>>>> I am not sure how to test this (I do not know what values to use for f
>>>>> a and b in 'f qromb a b' and do not feel like studying your code
>>>>> enough to deduce such values), but I think this is what you are asking
>>>>> for:
>>>>>
>>>>> ---------- 8< ------ cut here ------ 8< ----------
>>>>>
>>>>> coclass'nr'
>>>>>
>>>>> qromb=:1 :0
>>>>>  qromb_implementation (coname '')
>>>>> )
>>>>>
>>>>> qromb_implementation=:2 :0
>>>>> NB.Returns the integral of the function from a to b.  NR P.166 Ch.4.3
>>>>> NB.Uses Romberg's method of order 2*K, where, e.g. K=2 is Simpson's rule.
>>>>> NB.u            function
>>>>> NB.y            a,b,eps integration bounds(a,b), and accuracy(eps,
>>>>> default 1e_10)
>>>>> NB.eps is the fraction error from extrapolation error estimate
>>>>> NB.PolyInterpX stores successive trapezoidal relative stepsizes
>>>>> NB.PolyInterpY stores their approximations
>>>>> NB.K is the number of points used in the extrapolation
>>>>>        cocurrent v
>>>>>        ab=.2{.y [ eps=.2{y,1e_10
>>>>>        PolyInterpY=:20#0 [ PolyInterpX=:21#0 [ PolyInterpM=:K=.5
>>>>>        PolyInterpX=:PolyInterpX 0}~1
>>>>>        TrapzdNextN=:0
>>>>>        j=.1 while.j<:#PolyInterpX do.
>>>>>                PolyInterpY=:PolyInterpY(j-1)}~u trapzdNext ab
>>>>>                if.j>:K do.'ss dy'=.0 polyInterpRawinterp j-K
>>>>> if.(|dy)<:eps*|ss do.ss return.end.end.
>>>>> NB.This is key.  The factor 0.25 allows h^2 extrapolation.  See NR
>>>>> equation 4.2.1.
>>>>>                PolyInterpX=:PolyInterpX j}~0.25*PolyInterpX{~j-1
>>>>>        j=.>:j end.
>>>>>        'Too many steps in routine qromb'assert 0
>>>>> )
>>>>>
>>>>> polyInterpRawinterp=:4 :0
>>>>> NB.Polynomial interpolation.  NR P.119 Ch.3.2
>>>>> NB.x            the point of interpolation
>>>>> NB.y            j       subrange j+i.PolyInterpM is used for the 
>>>>> interpolation
>>>>> NB.Must initialize
>>>>> NB.PolyInterpM=:5
>>>>> NB.PolyInterpX=:21#0
>>>>> NB.PolyInterpY=:20#0
>>>>>        j=.y
>>>>>        dif=.|x-j{PolyInterpX
>>>>>        i=.0 while.i<PolyInterpM do.
>>>>>                if.dif>dift=.|x-PolyInterpX{~j+i do.ns=.i [ dif=.dift end.
>>>>>        i=.>:i end.
>>>>>        d=.c=.PolyInterpY ];.0~ j,:PolyInterpM
>>>>>        ns=.<:ns [ y=.PolyInterpY{~j+ns
>>>>>        m=.1 while.m<PolyInterpM do.
>>>>>                i=.0 while.i<PolyInterpM-m do.
>>>>>                        ho=.x-~PolyInterpX{~j+i
>>>>>                        hp=.x-~PolyInterpX{~j+i+m
>>>>>                        w=.(c{~i+1)-i{d
>>>>>                        'PolyInterp error'assert 0~:den=.ho-hp
>>>>>                        den=.w%den
>>>>>                        d=.d i}~hp*den
>>>>>                        c=.c i}~ho*den
>>>>>                i=.>:i end.
>>>>>                if.(PolyInterpM-m)>2*ns+1 do.dy=.c{~ns+1
>>>>>                else.ns=.<:ns [ dy=.ns{d
>>>>>                end.
>>>>>                y=.y+dy
>>>>>        m=.>:m end.
>>>>>        y,dy
>>>>> )
>>>>>
>>>>> trapzdNext=:1 :0
>>>>>        trapzdNext_implementation (coname '')
>>>>> )
>>>>>
>>>>> trapzdNext_implementation=:2 :0
>>>>> NB.Returns the nth stage of refinement of the extended trapezoidal
>>>>> rule.  NR P.163 Ch.4.2
>>>>> NB.u            function                must accept list
>>>>> NB.y            a,b     range
>>>>> NB.Must initialize TrapzdNextN=:0 before using.
>>>>>        cocurrent v
>>>>>        ba=.-~/y
>>>>>        TrapzdNextN=:>:TrapzdNextN
>>>>>        if.1=TrapzdNextN do.TrapzdNextS=:-:ba*+/u y return.
>>>>>        
>>>>> else.TrapzdNextS=:-:TrapzdNextS+ba*t%~+/u({.y)+(0.5+i.t)*ba%t=.2^TrapzdNextN-2
>>>>> return.
>>>>>        end.
>>>>> )
>>>>>
>>>>> ---------- 8< ------ cut here ------ 8< ----------
>>>>>
>>>>> This is a rather bulky example, if there are problems with this
>>>>> approach it might be better to define a more concise (and complete -
>>>>> with a test case which illustrates the problem) example?
>>>>>
>>>>> 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

Reply via email to