> 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