You might use -.&a: to clean a result before `:6 hits it?

Thanks,

-- 
Raul



On Wed, Mar 5, 2014 at 9:24 PM, Pascal Jasmin <godspiral2...@yahoo.ca>wrote:

>
>
> Looks nice.  Here is a continuation of my gerund manipulation approach:
>
> conjoin=:  (,@:[ <@:; <@:])"1
>
>   ('@' conjoin -.`*) `:6
> -.@*
>
>  '@' conjoin (-.`'') ," 1 ,. *`-`+
> ┌──────────┬──────────┬──────────┐
> │┌─┬──────┐│┌─┬──────┐│┌─┬──────┐│
> ││@│┌──┬─┐│││@│┌──┬─┐│││@│┌──┬─┐││
> ││ ││-.│*││││ ││-.│-││││ ││-.│+│││
> ││ │└──┴─┘│││ │└──┴─┘│││ │└──┴─┘││
> │└─┴──────┘│└─┴──────┘│└─┴──────┘│
> └──────────┴──────────┴──────────┘
>
> stitchtrains =: ,.&(G2train@:(<"1))
>
>    (-.`'') stitchtrains ,. *`-`+
> ┌──┬─┐
> │-.│*│
> ├──┼─┤
> │-.│-│
> ├──┼─┤
> │-.│+│
> └──┴─┘
>
>  ('@' conjoin (-.`'') stitchtrains  *`'') `:6
> -.@*
>
> G2train turns out to be a pretty good idea for working with informal lists
> of verbs and combining them into trains/tacit definitions.  But working
> with tables of gerunds is a bad idea bc `:6 fails when a:/fills are present.
>
> To complete my last example:
>
> shortcircuits =:  ((,'@:'); [<@:;])/ @:(_2&}. , (,'@:') <@:; _2&{ <@:, {:)
>
> (< shortcircuits  '^:' conjoin  (]`>vvtie"1 0]9 12 2) stitchtrains~
> ]`+vvtie"1 0]5+i.3) `:6
> (] + 5"_)^:(] > 9"_)@:((] + 6"_)^:(] > 12"_)@:((] + 7"_)^:(] > 2"_)))
>
>
> AndDoTrains =: ([: <@:shortcircuits  '^:' conjoin  [ stitchtrains ])
>
>    ( (]`>vvtie"1 0]9 12 2) AndDoTrains~ ]`+vvtie"1 0]5+i.3)`:6
> (] + 5"_)^:(] > 9"_)@:((] + 6"_)^:(] > 12"_)@:((] + 7"_)^:(] > 2"_)))
>
> though it turns out this was the wrong spec, as it has the same result as
> the [: version (fails > 12, but still execs later >9)
>
>    ( (]`>vvtie"1 0]9 12 2) AndDoTrains~ ]`+vvtie"1 0]5+i.3)`:6"0  ] 1 2 3
> 4 5 6
> 1 2 15 16 17 24
>
> So, I'm no longer sure there is a way to tacitly break execution on the
> first fail test.  Or actually, I need to paren the whole left side of any
> ^: ... which was probably a needed manipulation function anyway.
>
>
>
>
>
>
>
> _____________________
>   ( shortcircuit=.train o ((power&.:train ~)`(at&.:train ~)/) o |.)
> v0`t0`v1`t1`v2`t2
> v0^:t0@:v1^:t1@:v2^:t2
>
>   ShortCircuit=. shortcircuit sv
>
>   [: v0 t0 v1 t1 v2 t2 v3 t3 v4 t4 ShortCircuit
> v0^:t0@:v1^:t1@:v2^:t2@:v3^:t3@:v4^:t4
>
>
>
>
>
>
> ----- Original Message -----
>
> code at bottom of message,
>
> G2train is needed to make "formal trains" even though `:6 can sometimes
> evaluate a list of boxed verbs as a train, if we add conjunctions to the
> train, it needs to be formalized as a group of verbs.
>
>   ( '^:'(4<]) addconj"1 0 G2train  <"1 ]`+vvtie"1 0]2 4) train6"0 0] 5 4
> 7 4
> ( '^:'(4<]) addconj"1 0 G2train  <"1 ]`+vvtie"1 0]2 4) train6"1 0] 5 4
> 11 4
>
>    (+jointrains '^:'(4<]) addconj"1 0 G2train  <"1 ]`+vvtie"1 0]2 4)
> train6"1 0] 5 4 2 1
> 16 8 4 2
>
>
>    (+jointrains '^:'(4<]) addconj"1 0 G2train  <"1 ]`+vvtie"1 0]2 4)`:6
> (] + 2"_)^:(4 < ]) + (] + 4"_)^:(4 < ])
>
>
>
> addconjar can add tests to each train.
>    (+jointrains (4<])`(2<]) '^:' addconjar"0 G2train  <"1 ]`+vvtie"1 0]2
> 4)  train6"1 0] 5 4 3 1
> 16 12 10 2
>
> seems a useful way to build and chain a series of power conjunctions
>
>    (composetrains (7<])`(2<]) '^:' addconjar"0 G2train  <"1 ]`+vvtie"1 0]2
> 4)  train6"1 0] 5 4 3 1
> 11 10 7 1
>
> but doesn't quite work the same as a real short circuit:
>
>   (composetrains (9<])`(12<])`(2<]) '^:' addconjar"0 G2train  <"1
> ]`+vvtie"1 0] 5+i.3)  train6"1 0] 10 4 3 1
> 28 16 15 1
>
> here the 3 input fails the >12 test, but still evaluates and passes the
> (3+7)> 9 test.
>
>    (composetrains (9<])`(12<])`(2<]) '^:' addconjar"0 G2train  <"1
> ]`+vvtie"1 0] 5+i.3)  `:6
> [: (] + 5"_)^:(9 < ]) [: (] + 6"_)^:(12 < ]) (] + 7"_)^:(2 < ])
>
> note that the tests can also be buit by parameters (and doesn't need the
> G2train processing to pass the `:6 parser.:
>
>   (composetrains ( <"1 ]`> vvtie"1 0]9 12 2) '^:' addconjar"0 G2train  <"1
> ]`+vvtie"1 0] 5+i.3)  `:6
> [:^:((] + 5"_) (] > 9"_)) [:^:((] + 6"_) (] > 12"_))^:((] + 7"_) (] > 2"_))
>
> the above is not a useless pattern, but it would still be nice to have a
> real short circuit.
>
> the pattern:  doN^:testN...@:do2^:test2@:do1^:test1
>
> might be implementable using clever `:3, and ^:`@: but its not
> straightforawd to tie two conjunctions (^:`@: is error).  I'm not sure that
> would work, but there is a simpler approach anyway.  Rewrite addconj as a
> verb where y is a pair of gerunds corresponding to left and right
> conjunction arguments, then join pairs of do, test with ^:, and resulting
> pairs with @:.  maybe next post.
>
> the code:
>
> Cloak1=: (0:`)(,^:) NB. Conjunction to cloak adverbs and conjunctions as
> verbs
> Cloak=: (5!:1@<'Cloak1')Cloak1 NB. Cloaking Cloak
> vtie =: 2 : 'try. ((u"_)`(v"_)"_)^:(0=L.) (u`v) catch. try. u`(v"_) catch.
> (u"_)`(v"_) end. end.'
> vvtie =: Cloak <'vtie'
> train6 =: 4 : ' x `:6 y'
>
>
> jointrains=: 1 : '( [ , (u`'''') ,])/'
> composetrains =: [:`'' , {:,~[: jointrains@:}:
> ar =: 1 : '5!:1 <''u'''
> G2train =: 3 : '; y `:6(`'''')'  each
> addconj =: 1 : (':';' <(,x);<y ; u ar')("1 0)
> addconj2 =: 1 : (':';' <(,u);<y ; x ar')
> addconjar =: 1 : (':';' <(,u);<y ; x')
>
>
> ----- Original Message -----
> From: Pascal Jasmin <godspiral2...@yahoo.ca>
> To: "programm...@jsoftware.com" <programm...@jsoftware.com>
> Cc:
> Sent: Monday, March 3, 2014 7:57:42 AM
> Subject: Re: [Jprogramming] Generating code from templates
>
> Here is a bit of a breakthrough on this type of code:
>
> (uses definitions quoted below including those from Jose)
> consider
>
>    ]`+vvtie"1 0]2 3
>
>   ]`+vvtie"1 0]2 3
> ┌─┬─┬─────────────────┐
> │]│+│┌─┬─────────────┐│
> │ │ ││"│┌─────┬─────┐││
> │ │ ││ ││┌─┬─┐│┌─┬─┐│││
> │ │ ││ │││0│2│││0│_││││
> │ │ ││ ││└─┴─┘│└─┴─┘│││
> │ │ ││ │└─────┴─────┘││
> │ │ │└─┴─────────────┘│
> ├─┼─┼─────────────────┤
> │]│+│┌─┬─────────────┐│
> │ │ ││"│┌─────┬─────┐││
> │ │ ││ ││┌─┬─┐│┌─┬─┐│││
> │ │ ││ │││0│3│││0│_││││
> │ │ ││ ││└─┴─┘│└─┴─┘│││
> │ │ ││ │└─────┴─────┘││
> │ │ │└─┴─────────────┘│
> └─┴─┴─────────────────┘
>
>
>
> or to avoid copying definitions:
>
>    2:`+`] ,: 3:`+`]
> ┌──┬─┬─┐
> │2:│+│]│
> ├──┼─┼─┤
> │3:│+│]│
> └──┴─┴─┘
>
>
> that created 2 gerund trains that are equivalent to functions storing 2
> functions f1 and f2.
>
> Although this is a good essay, it doesn't provide the same functionality
> described below
> http://www.jsoftware.com/pipermail/programming/2013-November/034177.html
>
> train6 =: 4 : ' x `:6 y'
> train0 =: 4 : ' x `:0 y'
>
> With these verbs we can apply lists of functions to lists of arguments.
>  One of the more useful ones has mysterious magic behind it:
> ..f1 f2 y (acutally wrong... see below.  It is (f1 f2) y.  A hook.)
>
>    (<"1  2:`+`] ,: 3:`+`]) train6 4 6
> 9 11
>
> ..each f1 and f2 to y
>    (<"1  2:`+`] ,: 3:`+`]) train6"0 1] 4 6
> 6 8
> 7 9
> ..f1 y1 , f2 y2  NB. one of the most useful forms
>    (<"1  2:`+`] ,: 3:`+`]) train6"0 ] 4 6
> 6 9
> or
>    (<"1  2:`+`] ,: 3:`+`]) train6 &> 4 6
> 6 9
>
> combinable as:
> ....f1 each y , f2 each y
>    (<"1  2:`+`] ,: 3:`+`]) train6 each"0 1 ]  1 4 6;2 3;1 1
> ┌─────┬───┬───┐
> │3 6 8│4 5│3 3│
> ├─────┼───┼───┤
> │4 7 9│5 6│4 4│
> └─────┴───┴───┘
>
> train0 is a bit less useful, but still
>    (<"1  2:`+`] ,: 3:`+`]) train0 each"0 1 ]  1 2
> ┌─────┬─────┐
> │2 1 1│2 2 2│
> ├─────┼─────┤
> │3 1 1│3 2 2│
> └─────┴─────┘
>    2:`+`] `:0 ] 1
> 2 1 1
>
>
> can do train of trains:
>
>    (  ( [ , +`'' ,])/ <"1  2:`+`] ,: 3:`+`]) train6 1 3 5
> 7 11 15
>
> where:
>    (  ( [ , +`'' ,])/ <"1  2:`+`] ,: 3:`+`])
> ┌────────┬─┬────────┐
> │┌──┬─┬─┐│+│┌──┬─┬─┐│
> ││2:│+│]││ │  │3:│+│]││
> │└──┴─┴─┘│ │└──┴─┴─┘│
> └────────┴─┴────────┘
>
>    ( [ , +`'' ,])/ <"1 ]`+vvtie"1 0]2 3 4
>
> not shown due to formatting prob on this comp, but joins 3 outer verb
> trains with + as pivot
>
>    (( [ , +`'' ,])/ <"1 ]`+vvtie"1 0]2 3 4) train6 1 3 5
> 12 18 24
>
> notice that there is a generic function adverb there:
>   jointrains=: 1 : '( [ , (u`'''') ,])/'
>   +jointrains <"1 ]`+vvtie"1 0]2 3 4
>
> this still doesn't quite get to a compose trains function, but its close.
>  one way to get compose is to use the [: form in trains:
>
> composetrains =: [:`'' , {:,~[: jointrains@:}:
>
>    (composetrains <"1 ]`+vvtie"1 0]2 3) train6 1 2 4
> 6 7 9
>    (composetrains <"1 ]`+vvtie"1 0]2 3 4) train6 1 2 4
> 10 11 13
>
> (both compose and join require 2+ verbs)
>
>
> From: Pascal Jasmin <godspiral2...@yahoo.ca>
> To: "programm...@jsoftware.com" <programm...@jsoftware.com>
> Cc:
> Sent: Friday, February 21, 2014 2:18:07 PM
> Subject: Re: [Jprogramming] Generating code from templates
>
> The usefulness of Cloak (and verbifying) is that you can then apply
> adverbs and conjunctions (" ~ ...)to what are essentially adverbs and
> conjunctions.
>
> Consider the now badly named conjunction vtie which is an enhancement to
> tie designed to always produce verbs (promoting nouns with "_), and so is
> useful for the most common gerund cases.  see:
> http://www.jsoftware.com/pipermail/programming/2014-February/034913.html
>
> vtie =: 2 : 'try. ((u"_)`(v"_)"_)^:(0=L.) (u`v) catch. try. u`(v"_) catch.
> (u"_)`(v"_) end. end.'
> 'tie vvtie'=. (Cloak @: < each) @: ;: '` vtie'
>
>
> This produces the 2 hooks (+ 2:) and (+ 3:), and returns them as a single
> storable result (equivalent to +&3 and +&2
>
>    (+`'' vvtie"1 0 ] 2 3)
> ┌─┬─────────────────┐
> │+│┌─┬─────────────┐│
> │ ││"│┌─────┬─────┐││
> │ ││ ││┌─┬─┐│┌─┬─┐│││
> │ ││ │││0│2│││0│_││││
> │ ││ ││└─┴─┘│└─┴─┘│││
> │ ││ │└─────┴─────┘││
> │ │└─┴─────────────┘│
> ├─┼─────────────────┤
> │+│┌─┬─────────────┐│
> │ ││"│┌─────┬─────┐││
> │ ││ ││┌─┬─┐│┌─┬─┐│││
> │ ││ │││0│3│││0│_││││
> │ ││ ││└─┴─┘│└─┴─┘│││
> │ ││ │└─────┴─────┘││
> │ │└─┴─────────────┘│
> └─┴─────────────────┘
>
>    ((+`'' vvtie"1 0 ] 2 3){~0) `:6 ] 5  NB. selects the first function and
> applies it to 5
> 7
>
>    (]`+ vvtie"1 0 ]  2) `:6  NB. another way of (]+2:)    ie. +&2
> ] + 2"_
>    (]`+ vvtie"1 0 ]  2) `:6 ] 3
> 5
>
> when searching for a way to apply rank to `:6 to get a list of results, I
> found this:
>
>    (<"1 ]`+ vvtie"1 0 ]  2 3) `:6 &> 4
> 9
>
> That will apply f1 f2 4 , where f1 is (]+2), f2 is (]+3).  I havent found
> how to get the list (append) of  each function
>
> can parameterize both the start and end of an implicit definition this way.
>    [`+ vvtie"1 0 ] #`]
> ┌─┬─┬─┐
> │[│+│#│
> ├─┼─┼─┤
> │[│+│]│
> └─┴─┴─┘
>    [`+ vvtie~"1 0 ] #`]
> ┌─┬─┬─┐
> │#│[│+│
> ├─┼─┼─┤
> │]│[│+│
> └─┴─┴─┘
>
>    %`# vvtie~"1 0 ] +/`(-/)
> ┌───────┬─┬─┐
> │┌─┬───┐│%│#│
> ││/│┌─┐││ │ │
> ││ ││+│││ │ │
> ││ │└─┘││ │ │
> │└─┴───┘│ │ │
> ├───────┼─┼─┤
> │┌─┬───┐│%│#│
> ││/│┌─┐││ │ │
> ││ ││-│││ │ │
> ││ │└─┘││ │ │
> │└─┴───┘│ │ │
> └───────┴─┴─┘
>
>
>
> ----- Original Message -----
> From: Pascal Jasmin <godspiral2...@yahoo.ca>
> To: "programm...@jsoftware.com" <programm...@jsoftware.com>
> Cc:
> Sent: Friday, February 21, 2014 1:11:32 PM
> Subject: Re: [Jprogramming] Generating code from templates
>
> neat.
>
>    tie
> ,^:(0:``)
>
>    tie&'' f.
> ,^:(0:``)&''
>
> which is using the gerund (v1`v2) version of ^: . This appears to be
> undocumented in that v2 here is a conjunction(`).  I assume that using an
> adverb as v2 is impossible?
>
> The other peculiarity is that v1 is 0: which means that , never executes.
>  Is that right?
>
>
>
> ----- Original Message -----
> From: Jose Mario Quintana <jose.mario.quint...@gmail.com>
> To: Programming forum <programm...@jsoftware.com>
> Cc:
> Sent: Friday, February 21, 2014 11:31:56 AM
> Subject: Re: [Jprogramming] Generating code from templates
>
> The verbalized conjunctions tie and rank can be produced as follows:
>
>    9!:14 ''
> j701/2011-01-10/11:25
>
>    Cloak=. (0:`)(,^:) NB. Conjunction to cloak adverbs and conjunctions as
> verbs
>    Cloak=. (5!:1@<'Cloak')Cloak NB. Cloaking Cloak
>
>    'tie rank'=. (Cloak @: < each) @: ;: '` "' NB. Cloaking tie (`) and rank
> (")
>
>
>    cf=. {.@(tie&'')@(rank&_)"0 f.
>    100"_`(200"_)`(300"_) -: cf 100 200 300
> 1
>
>
> Cloak can also be produced without using ^: (although with a caveat).
> Members interested in following the beginnings of the story can look at
> http://www.jsoftware.com/pipermail/programming/2013-March/031883.html .
>
>
> On Thu, Feb 20, 2014 at 8:52 PM, Raul Miller <rauldmil...@gmail.com>
> wrote:
>
> > This would be more fun if you provided definitions for tie and rank (and
> > others you use) in an addon.
> >
> > Without that, it feels like deus ex machina (and does not execute for me
> > like it does for you).
> >
> > Thanks,
> >
> > --
> > Raul
> >
> >
> > On Thu, Feb 20, 2014 at 6:06 PM, Jose Mario Quintana <
> > jose.mario.quint...@gmail.com> wrote:
> >
> > > "
> > > Anyway, thought I'd share, and see if anyone else has useful tools for
> > > manipulating J code (metaprogramming).
> > > "
> > >
> > > Dan, I will try to show some meta-programming exercises soon.  I am
> > jumping
> > > into the darkness hoping that I will land well; so far, so good.  In
> the
> > > meantime, the following is a F^4 underground verb corresponding to
> Raul's
> > > explicit verb (using verbalized primitive conjunctions):
> > >
> > >    cf=. {.@(tie&'')@(rank&_)"0 f.
> > >
> > >    100"_`(200"_)`(300"_) -: cf 100 200 300
> > > 1
> > >
> > >
> > >
> > > On Thu, Feb 20, 2014 at 2:39 PM, Dan Bron <j...@bron.us> wrote:
> > >
> > > > 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
>
> ----------------------------------------------------------------------
> 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