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,

-- 
Raul



On Tue, Apr 4, 2017 at 2:48 AM, Xiao-Yong Jin <jinxiaoy...@gmail.com> 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 <rauldmil...@gmail.com> 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 <jinxiaoy...@gmail.com> 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 <rauldmil...@gmail.com> 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 <jinxiaoy...@gmail.com> 
>>>> 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 
>>>>>> <programm...@jsoftware.com> 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 <rogerstokes...@gmail.com>
>>>>>> To: programm...@jsoftware.com
>>>>>> 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 <jinxiaoy...@gmail.com>
>>>>>> 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/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
>> ----------------------------------------------------------------------
>> 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