" I doubt non like-for-like substitutions (in terms of word class) will ever work; at least not in general."
I understand that the source template still has to parse before and after substitutions. Candidates for the placeholders would be: _: for verbs The difficulty for adverbs and conjunctions is that they don't necessarily parse to any verb and noun. Its also a stretch to need to parameterize them, and so I think can be ignored. There is also the straightforward explicit parameterization with sprintf, and : n : (textvariable sprintf p1;p2;p3) " unless we insist on a distinct "blank token" for each substitution" One approach if it is simpler, is to just use unusual numbers for the parameters. Say: _999010999 _999020999 _999030999 the natural choice for verb parameters would be _1: , _2: ... ----- Original Message ----- From: Dan Bron <j...@bron.us> To: "programm...@jsoftware.com" <programm...@jsoftware.com> Cc: Sent: Thursday, February 20, 2014 8:20:55 PM Subject: Re: [Jprogramming] Generating code from templates Adverb and conjunction templates are straightforward. Multiple substitutions won't be difficult, but will inflate our codebase a bit (the L: approach is well suited to single substitutions, but unless we insist on a distinct "blank token" for each substitution [like named parameters], we'll have to make it vector or higher rank, which will entail an entirely different approach). Verb/adverb/conjunction substitutions will take more thought, as we'll need to understand the structure of (the atomic representations of) both the template and the substitution in order to marry them seamlessly. I doubt non like-for-like substitutions (in terms of word class) will ever work; at least not in general. I'll try to take a whack at these extensions, and your timer code, tomorrow. -Dan > On Feb 20, 2014, at 5:37 PM, Pascal Jasmin <godspiral2...@yahoo.ca> wrote: > > very cool. To help people understand it, the requirements for the template > are that it is an implicit definition, and that it parses ok, and also that > it is a verb (modifiers don't play well as gerunds). > > with that in mind, here are some verbs to make things a bit easier: > > substit =: [^:(__-:])L:_ 0 > substit2 =: substit"_1 _~ > mktemplate =: 1 : '{. u f. `''''' > > One useful "verb" that requires 3 arguments, and has special code as an > adverb is power residue &|@^ > > (3&|@^) will raise x to the y power and then take the residue to 3. > Basically Dan's code allows to fix these verbs. Once you have created your > template implicit verb > > powmod3 =: __&|@^ mktemplate substit2 3 > > powmod3`:6 > 3&|@^ > > Dan, is there a way to make multiple substitutions, ie. for this template: > > (__ + __&|@^) mktemplate NB. could it substitute 2 seperate nouns from y? > > > > Also are verbs (modifiers?) substitutable? > > In terms of other examples, > > Here is a class that wraps around Jqt 's new timer functionality. There is > only one global timer callback available, and so assuming the possibility > that more than one routine would like to be run, without knowing that any > other routine has been set, this could work: (not tested extensively) > > Its not gerunds, but it was was pretty straight forward to write. The class > accumulates the sequence of callbacks into the callback variable (in add > variation), and tells the timer to run them all. > > > cocurrent 'timer' > callback =: ] > > set=: 4 : 0 NB. x is explicit code to run/string. y is miliseconds interval > if. y do. > callback =: (3 : x) > sys_timer_z_=: callback f. "_ > wd 'timer ',":y > else. > wd 'timer 0' > sys_timer_z_=: ] > end. > EMPTY > ) > add =: 4 : 0 > if. y do. > callback =: (callback f.)`(3 : x) > sys_timer_z_=: callback"_ `:0 > wd 'timer ',":y > else. > wd 'timer 0' > sys_timer_z_=: ] > end. > EMPTY > ) > > ________________________________ > From: Dan Bron <j...@bron.us> > To: programm...@jsoftware.com > Sent: Thursday, February 20, 2014 2:39:49 PM > Subject: [Jprogramming] Generating code from templates > > > There was a question on StackOverflow today on generating constant > functions from the items of an array. As in, 100 200 300 <==> > 100"_`(200"_)`(300"_) . > > As a more general question, how can we specify code templates and then use > them to dynamically produce gerunds for later execution? * > > Here's one idiom I've found useful in such situations: > > substit =: [^:(__-:])L:_ 0 > > template =: __"_ NB. The template; note the __ > TEMPLATE =: {. template f.`'' NB. Atomic rep of template > > GERUND =: TEMPLATE substit"_1 _~ 100 * 1 + i.3 > > GERUND`:6 > (100"_) (200"_) 300"_ > > GERUND@.0 > 100"_ > > GERUND@.2 'hello' > 300 > > The basic idea is to "fill in the blanks" in the template with the inputs. > Here, the blank is __ (negative infinity), so we look for that in the > gerund template, and when we find it, we replace it with the input. I kind > of like how the verb does this: first, we only bother looking at level 0 > (because __ is unboxed, so it will never appear above level 0), and > second, the verb is passive until __ is detected (because ^:(]-:__) is > ^:0, i.e. "do nothing and just return the RHA" until then). > > One possible issue is what we use to denote "blank". If we're going to > allow users to pass in any gerund, then he could potentially want to > include __ as part of the code to be produced, rather than replaced. There > are a couple possible ways to address that limitation. First, we could use > a value which a user is very unlikely to want to produce (as opposed to > replace), i.e. _. : > > substit =: [^:(1-:128!:5@])L:_ 0 > SPARTA =: ({. _."_ `'') substit"_1 _~ 300 > SPARTA`:6 > 300"_ > > Or, we could define substit as an adverb (adjective), which takes the > "blank" as an argument: > > Substit =: (-:&) (@]) ([^:) (L:_ 0) > > substit =: 'blank' Substit > substit > [^:(-:&'blank'@])L:_ 0 > > ; , ((< {. 'blank'&;`'') substit~&.> ;:'fill in the blanks' )`:0 '!' > fill!in!the!blanks! > > But if we do that, we have to start wondering about the 0 in L:_ 0 , > because the user's "blank" might be boxed, and therefore have L.>0 . Of > course, we could fix this up by making the L: dynamic: > > Substit =: adverb : '[^:(m-:])L:(_,L.m)' > > NOTNULL =: ({. ~:&a:` '') a: Substit~ <'#N/A#' > NOTNULL`:6 > ~:&(<'#N/A#') > > But it might be more fun to go meta-meta: > > (({. substit f.`'') substit~ _999)`:6 > [^:(_999 -: ])L:_ 0 > > Here, define the "standard" blank to be __, and then let the user change it > by using substit :) > > Anyway, thought I'd share, and see if anyone else has useful tools for > manipulating J code (metaprogramming). > > -Dan > > * For a recent example of where such metaprogramming might be useful, or > convenient, see the postscript of: > > http://www.jsoftware.com/pipermail/programming/2013-December/034373.html > > Other examples can be found with a forum archive search for the string L:0 _ > ---------------------------------------------------------------------- > 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