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