You are correct. However, I really need to use an instance of A (actually the possibility of several instances existing at the same time). If I am absolutely sure I only have one instance of A, i.e. myA, then I could cache the reference in the A locale cocurrent 'A'
instance=: '' NB. none by default coclass 'A' create=: 3 : 0 ... do stuff... instance_A_=: coname '' ) Then once I have the reference, as I understand it, I can do pretty much anything by switching in and out of locales, and grab myA's reference when in B. This will only work if there is a single instance of A. But, my whole purpose is to have several different instances of A, any of whose member verbs can be passed (as gerunds or however else) to some verb in B locale. It seems that an object's verbs do not contain any reference to the actual object, so what I want is pretty difficult to do in J. Although this is trivial in some other languages, e.g. pseudo-python: # create two instances of A myA =A(1) myOtherA = A(10000) # pass the instances' method1 to some utility function, "interestingFunction" # and get some interesting results. result1 = interestingFunction(myA.method1) result2 = interestingFunction(myOtherA.method1) It seems J's locale system does not handle this very well. -------------------------------------------- On Fri, 9/1/17, 'Pascal Jasmin' via Programming <programm...@jsoftware.com> wrote: Subject: Re: [Jprogramming] Passing class member gerund to verb in another locale To: "programm...@jsoftware.com" <programm...@jsoftware.com> Date: Friday, September 1, 2017, 10:19 PM this simplification seems to work, (defined in base) d_A_ =: 1 2 3 mean_A_ =: 3 : '(+/ % #) d' mean_A_ 0 2 NB. use F8, also works with funcB_B_ definition funcB=: 3 : 0 'vrb data' =: y f=: vrb `:6 f data ) funcB mean_A_`'' ; 0 2 geoMean_A_ =: 3 : 0 NB. same as before, but add d. d+(#%:(*/)) y ) funcB geoMean_A_`'' ; 2 3 4 3.8845 4.8845 5.8845 funcB_B_ geoMean_A_`'' ; 2 3 4 3.8845 4.8845 5.8845 the create verb only gets called when you do conew, and so d is not defined for non-instanced locale. one way to fix this is to have a default value for d that will get overwritten with the create verb so that it both works with the "raw" locale and instances. ________________________________ From: 'Jon Hough' via Programming <programm...@jsoftware.com> To: programm...@jsoftware.com Sent: Friday, September 1, 2017 8:48 AM Subject: Re: [Jprogramming] Passing class member gerund to verb in another locale Hi Pascal. Thanks for the response. You are correct in this case. Not to move the goal posts, but funcB_B_ geomean_A_`'' ; will not work if geoMean is redefined to be geoMean_A_ =: 3 : 0 NB. same as before, but add d. d+(#%:(*/)) y ) The variable d was created in myA's create verb. This is not visible from _A_ locale. I will repost the entire (modified) source below. Note that getAvg__myA calls funB_B_ with gerund geoMean__myA. coclass 'A' create=: 3 : 0 d=:y ) geoMean=: 3 : 0 d+(#%:(*/)) y ) myVerb=: 3 : 0 ((geoMean ) ; (+/%#)) y ) getAvg=: 3 : 0 data=.y funcB_B_ (myVerb_A_ `''); data ) cocurrent 'B' NB. accepts the object ref as param. NB. helper verb, for special case of NB. classes with a member verb called myVerb. funcB2=: 3 : 0 'obj data'=: y verb=. 3 : ' myVerb__obj y' funcB ((verb f.) `'');data ) NB. More general verb, accepts any verb NB. (assuming verb is callable from this locale) funcB=: 3 : 0 'vrb data' =: y f=: vrb `:6 f data ) myA=: 1 conew 'A' geoMean__myA 1 2 3 NB. no problem here getAvg__myA 1 2 3 NB. error here -------------------------------------------- On Fri, 9/1/17, 'Pascal Jasmin' via Programming <programm...@jsoftware.com> wrote: Subject: Re: [Jprogramming] Passing class member gerund to verb in another locale To: "programm...@jsoftware.com" <programm...@jsoftware.com> Date: Friday, September 1, 2017, 8:19 PM funcB_B_ geomean_A_`'' ; data do not use f. inside funcB. f. will lose locale info From: 'Jon Hough' via Programming <programm...@jsoftware.com> To: programm...@jsoftware.com Sent: Friday, September 1, 2017 1:09 AM Subject: Re: [Jprogramming] Passing class member gerund to verb in another locale I forgot to add a definition of funcB cocurrent 'B' funcB=: 3 : 0 'vrb data' =: y f=: vrb `: 6 NB. vrb is the gerund f data NB. call f. This creates the error. ) -------------------------------------------- On Fri, 9/1/17, 'Jon Hough' via Programming <programm...@jsoftware.com> wrote: Subject: [Jprogramming] Passing class member gerund to verb in another locale To: "Programming Forum" <programm...@jsoftware.com> Date: Friday, September 1, 2017, 2:03 PM My problem is, I have a class 'A' say. and I have a locale 'B'. A contains several verbs. I would like to pass a verb (or gerunds of the verbs), let's call it myVerb, to some verb in B. However, this creates a problem, as when the B verb tries to call myVerb it cannot find it, being in a different locale. i.e. I get a value error. I attempted to use fix (f.) to get myVerb explicitly, but this only works if myVerb does not contain any other verbs from A. This is the contrived example, that is essentially the same as my real problem, but stripped of superfluous things: NB. A is some class with several verbs. coclass 'A' create=: 3 : 0 d=:y ) NB. some verb in A geoMean=: 3 : 0 (#%:(*/)) y ) NB. I want to pass this to another verb in another locale. NB. Note that it calls geoMean. myVerb =: 3 : 0 ((geoMean f.) ; (+/%#)) y ) NB. calling a verb in B getAvg=: 3 : 0 data=.y funcB_B_ ( myVerb f. `''); data ) NB. create my instance of A myA =: 0 conew 'A' NB. call myVerb. No problem here! myVerb__myA 1 2 3 NB. pass myVerb to funcB_B_ getAvg__myA 1 2 3 NB. this gives an error |value error: geoMean | ((geoMean f.);(+/%#))y Solutions: (1) One solution is to make funcB_B_ a conjunction / adverb. But in reality, I want to send several verbs to funcB together. (2) Another solution is to send the instance reference of A to funcB (i.e. just send the whole of myA to funcB). But I would prefer not to send the whole object, as it then makes B less flexible, because I may want to call funcB_B_ without the need for a class instance, just a standalone verb. (3) Another solution is to not call any other verbs of myA inside myVerb__myA. This is not a realistic solution as A could be quite complicated. Is there a better way? Just to explain my motivation, I am trying to replicate the functionality most languages that have first-class functions possess - to pass arbitrary function(s) to other functions and call them. e.g. in Python # myVerb is a Python function, and could be a member method of some class. someData is just some data def funcB (myVerb, someData): return myVerb(someData, someOtherData) Obviously J doesn't have first class functions in this sense, but with gerunds, I was hoping to be able to recreate the functionality. ---------------------------------------------------------------------- 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