You only need to do 

newA =: conew 'A'

funcB mean__newA`'' ; 0 

2

that will use whatever "copy of d" that is set in newA
________________________________
From: 'Jon Hough' via Programming <programm...@jsoftware.com>
To: programm...@jsoftware.com 
Sent: Friday, September 1, 2017 9:41 AM
Subject: Re: [Jprogramming] Passing class member gerund to verb in another 
locale



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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to