Am 18.08.2011 22:28, schrieb Marshall Lochbaum: > You can use 128!:2 for this:
Very cool stuff. This helps a lot. Thanks Kim > '0>. 100&-' (128!:2) 3 > 97 > > This is what I meant for the function apply to do, but I had the incorrect > meaning for ~ : it only takes names, not any string that evaluates to a > function. > > Marshall > > On Thu, Aug 18, 2011 at 3:49 PM, Kim Kuen Tang<[email protected]> wrote: > >> Hi Marshall and everyone here in the forum. >> >> First of all i need to say sorry for not replying to any of the comments >> or email because i was off line for several days. >> (My wife didnt allow me to go online during the holidays. :-) ) >> >> Marshall thanks for your constructive full answers here. I read it >> several times but still dont know how to use it in my existing project. >> So i will try to elaborate my question again with code snippets in q/kdb: >> >> In kdb i have implemented a function called .ql.binbaum that is able to >> take a function (payoff) as argument to calculate a number based on this >> function. >> >> kdb code: >> >> t:([] spot:100;rate:0.01;vola:0.25;matur:1.0;num:2500;payoff:({x};{max >> 0,x-100};{max 0,100-x};{abs 100-x}));t >> >> >> >> Here you can see that i am able to place function in the list. >> >> Now i update the table with the prices calculated from the arguments of >> the table: >> >> >> >> So my question again: >> >> Can i pass a function to another function as argument? >> Using adverb is not an option for me since payoff is also part of the >> argument. >> >> Using >> >> apply =: 4 :'x~ y' >> >> seems also not an option for me, since refering by name is very ugly. >> >> I was not lazy i define the same function also in J: >> >> binbaum=. monad define >> 's0 k r sig t n' =. y >> dt =. t % n >> beta =. (-:@+/@:^) dt*(0 ,*:sig)+(_1 1)*r >> u =. ([+(%:@:(*:-1:))) beta >> d =. %u >> p =. ((^r*dt)-d)%(u-d) >> S =. s0*(u&^*d&^@|.)i.n >> V =. 0>. k-S NB. This is the place where i want to use the payoff >> q =. 1-p >> >> v=.((q&*@:}:)+(p&*@:}.)) ^: (-.@:(#=1:)) ^:_ V >> (^(-r*t ))*v >> ) >> >> binbaum (100;100;0.01;0.25;1.0;3000) >> >> Here i would like to pass the payoff in the argument. >> Is it possible to pass the function as character? >> Something like ' 0>. 100-]' ? >> >> If you can give me some hints this would be great. >> >> >> Regards, >> >> Kim >> >> Am 15.08.2011 16:58, schrieb Marshall Lochbaum: >>> Here are the full answers to your questions: >>> >>> Verbs are not first-class objects in the sense that they cannot be used >> as >>> arguments or return values to other verbs. The reason is that if this >> were >>> the case, it would be impossible to tell when to invoke verbs or when to >> use >>> them as arguments; should >>> f g h >>> be interpreted as (f (g h)), two monadic applications, or (f g h), a >> single >>> dyadic application? I consider this one of the weaknesses of J. >>> >>> However, there are a number of ways of getting around this problem. The >>> first is to use adverbs and conjunctions, which can take verbs as >> arguments >>> and return verbs. However, this is only a partial solution as adverbs and >>> conjunctions cannot take each other as arguments or outputs. >>> >>> The second is to refer to verbs by name, using a string. This is the >>> approach taken by plot. Utilities for this form are 5!:5, which takes a >>> boxed name and returns a string, and ~ , an adverb which takes a string >> and >>> returns a verb. So, to make a verb "apply," which takes a string on the >> left >>> and a noun on the right and applies the verb to the noun, you could write >>> apply =: 4 :'x~ y' >>> >>> The third is to use gerunds, which are J's way of turning a verb into a >>> noun. f`g`h will produce a list of boxes, each of which is the "atomic >>> representation" of f, g, or h. This is similar to a list of verbs; if you >>> wanted to apply them you could use (f`g`h) `: 0 , which produces a list >> of >>> the outputs of f, g, and h. You could also make `:0 a verb: >>> apply =: 4 :'x`:0 y' >>> allowing you to control it precisely using rank. >>> >>> >>> A dictionary data type is not supported. However, you could make a >>> dictionary conjunction which takes two lists and returns a dictionary >>> function: >>> dict =: 2 :'n {~ m&i.' >>> >>> 1 2 3 dict 7 8 9 >>> 7 8 9 {~ 1 2 3&i. >>> (1 2 3 dict 7 8 9) 2 >>> 8 >>> (1 2 3 dict 7 8 9) 1.5 >>> |index error >>> | (1 2 3 dict 7 8 9)1.5 >>> >>> Marshall >>> >>> -----Original Message----- >>> From: [email protected] >>> [mailto:[email protected]] On Behalf Of Raul Miller >>> Sent: Monday, August 15, 2011 7:10 AM >>> To: Programming forum >>> Subject: Re: [Jprogramming] Several questions about j >>> >>> On Mon, Aug 15, 2011 at 5:08 AM, Kim Kuen Tang<[email protected]> >> wrote: >>>> Are verbs ( dyad or monad) first-class citizen in j? >>> The answer to this is "no" in the same sense that objects are not >>> first-class citizens in any object oriented language. >>> >>>> Is it possible to forward a verb to another verb? >>> Yes. >>> >>>> Is it possible to box a verb into list ? >>> Yes. >>> >>>> Is it possible to have a dictionary like the case in kdb? Something >>>> like : (`a`b`c)!(1 2 3) >>> Yes, but not exactly. >>> >>> Typically, in J, locales are used for this purpose. But locales are not >>> values and can only be referred to (by name). >>> >>> You would have to implement a replacement for this use of ! as a user >>> defined verb. >>> >>> -- >>> Raul >>> ---------------------------------------------------------------------- >>> 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
