I must be the least qualified member of the forum to comment on this
because I write tacitly and I fix everything (no names, no name
conflicts). Yet, I occasionally use external explicit verbs which might
include explicit adverbs or conjunctions.
Apologies in advance if I am misunderstanding the issue, I usually do not
pay much, if any, attention to explicit coding or issues but I briefly
browsed this thread. Anyway, (my two cents) if I had to use the adverb
qromb today, as suggested, I would just do the following.
Make qromb in the nr locale a verb,
qromb=: 3 :0
Start by reproducing in the opening lines u and y as required by the
original adverb...
'u y'=. y
u=. (<u) `:6
The wrapper in the base locale would be,
coclass'base' NB. Back to the base locale
qromb=. 1 : 0 NB. Base wrapper
qromb_nr_ (u`'') ; y
)
coname''
┌────┐
│base│
└────┘
*: qromb 1 2
2.33333
((*: qromb 1 2) * *:) qromb 1 2
5.44444
coname''
┌────┐
│base│
└────┘
I must have missed something.
The full script follows:
coclass'nr'
NB. Make qromb a verb
qromb=: 3 :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
NB. Reproduce u and y as required by the original adverb...
'u y'=. y
u=. (<u) `:6
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
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.
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.
)
coclass'base' NB. Back to the base locale
qromb=. 1 : 0 NB. Base wrapper
qromb_nr_ (u`'') ; y
)
coname''
*: qromb 1 2
((*: qromb 1 2) * *:) qromb 1 2
coname''
On Tue, Apr 4, 2017 at 2:48 AM, Xiao-Yong Jin <[email protected]> wrote:
> I still have trouble properly use an adverb from another locale.
> Allow me to put a concrete example in the following, which I directly
> translated from Numerical Recipes. My goal is to define
>
> qromb_z_ =: 1 :'...' NB. How to write a wrapper for qromb_nr_ ?
>
> which I can use as a normal adverb.
>
> A complete definition BEGINS ------
>
> coclass'nr'
>
> qromb=:1 :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
> 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
> 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.
> 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.
> )
>
> ------ Definition ENDS here.
>
> I really want to use qromb_z_ as a normal adverb without resorting to some
> helper functions.
> In addition, I also want to write the wrapper qromb_z_ such that it would
> call conew'nr'
> to get a one time locale, so I don't have to worry about global variables
> clashing, which
> also makes calling qromb inside of qromb (consider using 'f qromb a b',
> where 'f' also
> uses qromb) possible.
>
> Welcome any suggestions. Thank you.
>
>
> > On Mar 31, 2017, at 4:17 PM, Raul Miller <[email protected]> wrote:
> >
> > If you have implemented libAdvb properly (which is what the message
> > you were responding to should explain), then a locative reference to
> > it is all you need to implement libAdvbInSomeLib
> >
> > Does this make sense?
> >
> > If not, let's try again with actual meaningful definitions and test
> cases.
> >
> > Thanks,
> >
> > --
> > Raul
> >
> >
> >
> > On Fri, Mar 31, 2017 at 1:05 PM, Xiao-Yong Jin <[email protected]>
> wrote:
> >> I don't see how this would help. In concrete terms, I want the
> following
> >> public stable interface of a library SomeLib,
> >>
> >> cocurrent'SomeLib'
> >> libAdvb=:1 :'...'
> >> libVerb=:3 :'...'
> >>
> >> they refer to each other and a list of other names in SomeLib that
> should
> >> remain isolated as hidden implementation details that could change
> later.
> >> Now in a separate application,
> >>
> >> cocurrent'SomeApp'
> >> appVerb=:3 :0
> >> ...
> >> libVerb_SomeLib_ appNoun NB. This is OK.
> >> otherAppVerb libAdvbInSomeLib otherAppNoun NB. ???
> >> ...
> >> )
> >>
> >> How would I write libAdvbInSomeLib to actually use libAdvb_SomeLib_,
> which
> >> can depend on all the names defined in SomeLib?
> >>
> >> The wiki link Henry sent told me to define a new verb in SomeLib, but
> that
> >> is undesirable. The newVerb_SomeLib_ defined in SomeApp pollutes the
> >> namespace in SomeLib and could clash with existing names. I wouldn't
> want
> >> SomeApp to touch the namespace of SomeLib.
> >>
> >> The following seems to work, but I wish for a simpler solution.
> >>
> >> h_t_=:1 : 0 NB. the helper for a_t_
> >> echo'h_t_ in ',>coname''
> >> ff_t_=.u a_t_ NB. ff_t_ actually becomes public in t
> >> ff_t_ y
> >> )
> >> a_t_=:1 : 0 NB. can be a lot more involved definition
> >> echo 'a_t_ in ',>coname''
> >> u f y
> >> )
> >> f_t_=:3 : 0 NB. some verb in t
> >> echo 'f_t_ in ',>coname''
> >> y
> >> )
> >> f=:3 : 0 NB. some verb outside of t
> >> echo'f in ',>coname''
> >> y
> >> )
> >> a=:3
> >> f_base_ h_t_ a NB. need to fully qualify the locale of f, but
> not a
> >> aa_t_ in base
> >> a_t_ in t
> >> f_t_ in t
> >> f in base
> >> 3
> >> f h_t_ a NB. otherwise f_t_ is actually used
> >> aa_t_ in base
> >> a_t_ in t
> >> f_t_ in t
> >> f_t_ in t
> >> 3
> >> ff h_t_ a NB. STACK ERROR for fun
> >>
> >>
> >>> On Mar 31, 2017, at 10:39 AM, Raul Miller <[email protected]>
> wrote:
> >>>
> >>> There are certainly ways to work around this issue. It's just a minor
> >>> matter of coding them up.
> >>>
> >>> The important thing here is that adverb evaluation and verb evaluation
> >>> are two different things, and when your adverb is named in a locale
> >>> you need to capture the identity of that locale before creating the
> >>> verb if you want the verb to execute within that locale.
> >>>
> >>> Here's an approach that might work for you:
> >>>
> >>> advA_example_=:1 :0
> >>> locale=. coname''
> >>> u helperA locale
> >>> )
> >>>
> >>> helperA_example_=:2 :0
> >>> u__v y
> >>> )
> >>>
> >>> Note also that if you don't like having a named helper, and if it's
> >>> small enough, you could put it in line:
> >>>
> >>> advB_example_=:1 :0
> >>> locale=. coname''
> >>> u 2 :'u__v y' locale
> >>> )
> >>>
> >>> I haven't actually tested this, but I think I got this right - but let
> >>> me know if it doesn't work for you.
> >>>
> >>> Thanks,
> >>>
> >>> --
> >>> Raul
> >>>
> >>>
> >>> On Fri, Mar 31, 2017 at 11:15 AM, Xiao-Yong Jin <[email protected]>
> wrote:
> >>>> This is less useful. The simplest case that I use locale for is
> writing
> >>>> a_z_=:a_t_
> >>>> with a_t_ an explicit definition that uses all the things defined in
> locale 't'.
> >>>> I could do it, had 'a' been a verb.
> >>>> With 'a' an adverb or conjunction, I have to suffix all names in
> 'a_t_' with '_t_',
> >>>> and as you mentioned this is less desirable as I can't override those
> definitions with
> >>>> the locale path any more.
> >>>>
> >>>> Is there any other way to work around it?
> >>>>
> >>>> I guess I can always do
> >>>> coinsert't'
> >>>> but that leaves open the possibility of name collisions and removes
> benefits of locales.
> >>>>
> >>>>> On Mar 31, 2017, at 8:40 AM, 'Pascal Jasmin' via Programming <
> [email protected]> wrote:
> >>>>>
> >>>>> "The rule" is that "Semi tacit" modifiers can implicitly access
> members of their own locale. Explicit modifiers cannot. The reason why.
> >>>>>
> >>>>> +: 1 : 'u' NB. semi tacit: processes entirely in locale and returns
> tacit expression (then vanishes)
> >>>>>
> >>>>> +:
> >>>>>
> >>>>> +: 1 : ' u y' NB. explicit. returns bound explicit expression that
> executes in some unknown locale.
> >>>>> +: (1 : ' u y')
> >>>>>
> >>>>>
> >>>>> You can also explicitly label the locales used in an explicit
> modifier.
> >>>>>
> >>>>> 1 : ' u aa_t_ y'
> >>>>>
> >>>>> will work from any locale. Though may not be appropriate when you
> make "object instances" and need to have the reference move with the
> instance.
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> ________________________________
> >>>>> From: roger stokes <[email protected]>
> >>>>> To: [email protected]
> >>>>> Sent: Friday, March 31, 2017 4:37 AM
> >>>>> Subject: Re: [Jprogramming] locales with adverbs and conjunctions?
> >>>>>
> >>>>>
> >>>>>
> >>>>> If you want +: a_t_ 3 to give a result of 6 then you need to write:
> >>>>>
> >>>>> a_t_ =: 1 : 'u aa'
> >>>>> aa_t_ =: 1 : 'u'
> >>>>>
> >>>>> +: a_t_ 3
> >>>>> 6
> >>>>>
> >>>>>
> >>>>> On Fri, Mar 31, 2017 at 5:08 AM, Xiao-Yong Jin <
> [email protected]>
> >>>>> wrote:
> >>>>>
> >>>>>> Does locale change only happens with verbs?
> >>>>>>
> >>>>>> v_t_=:3 :'vv y'
> >>>>>> vv_t_=:3 :'+: y'
> >>>>>> v_t_ 3
> >>>>>> 6
> >>>>>> a_t_=:1 :'u aa y'
> >>>>>> aa_t_=:1 :'u y'
> >>>>>> +: a_t_ 3
> >>>>>> |value error: aa
> >>>>>> | u aa y
> >>>>>> c_t_=:2 :'u cc v y'
> >>>>>> cc_t_=:2 :'u v y'
> >>>>>> +: c_t_ *: 3
> >>>>>> |value error: cc
> >>>>>> | u cc v y
> >>>>>>
> >>>>>> This seems to be very inconvenient.
> >>>>>> ------------------------------------------------------------
> ----------
> >>>>>> For information about J forums see http://www.jsoftware.com/forum
> s.htm
> >>>>>
> >>>>> ------------------------------------------------------------
> ----------
> >>>>> For information about J forums see http://www.jsoftware.com/forum
> s.htm
> >>>>> ------------------------------------------------------------
> ----------
> >>>>> For information about J forums see http://www.jsoftware.com/forum
> s.htm
> >>>>
> >>>> ------------------------------------------------------------
> ----------
> >>>> For information about J forums see http://www.jsoftware.com/forum
> s.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