I like the codeinsert adverb. I didn't understand the solution at
first so I thought I'd write my own.
I started here at a few attempts at first that didn't use "each". I
also quickly realized that I needed to reverse the input
Attempt #1
> 4 : '''('',y,'' and '',x,'')''' each/ |. ;: 'a b c d e'
((((a and b) and c) and d) and e)
Then, I cheated and made that expression tacit with 13 :
13 : '''('',y,'' and '',x,'')'''
'(' , ] , ' and ' , ')' ,~ [
Attempt #2
> ('(' , ] , ' and ' , ')' ,~ [) each/ |. ;: 'a b c d e'
((((a and b) and c) and d) and e)
Then I wondered, how could I extract 'and' since that should be an
input, and I've already used my 2 arguments x/y in my dyad. I stopped
and looked at your solution again and realized it was starting to
resemble mine and mine should become an adverb.
Attempt #3 - turning into an adverb
> ' and ' ( 1 : '[: > (''('' , ] , m , '')'' ,~ [)') each/ |. ;: 'a b c d e'
((((a and b) and c) and d) and e)
Attempt #4 - moving the each and / inside the adverb
' and '( 1 : '[: > (''('' , ] , m , '')'' ,~ [) each /@:|.') ;: 'a b c d e'
((((a and b) and c) and d) and e)
Attempt #5 - remove space padding from input M
codeinsertJB =: 1 : '[: > (''('' , ] , '' '',m, '' '','')'' ,~ [) each /@:|.'
'and' codeinsertJB ;: 'a b c d e'
((((a and b) and c) and d) and e)
And yours:
codeinsert =: 1 : '[: > ((''('' , '')'' ,~ [ , '' '' , m , '' '' , ])~&.>/)@:|.'
'and' codeinsert ;: 'a b c d e'
((((a and b) and c) and d) and e)
Turns out to be basically the same solution. I enjoyed working through it.
Regarding the rest of the spreadsheet formulas - can you share how
you're applying it? I can see using the dsl for some simple amends.
Are you using it for a more complex amend or selection example, or did
you add the ability for the complex cases just to see if you can? The
complex amend/select would make me want to first attempt to
restructure the input data
On Thu, Aug 21, 2014 at 12:01 PM, 'Pascal Jasmin' via Programming
<[email protected]> wrote:
> replying to other topic, because it fixes issues with spreadsheet range
> parsing:
>
>
> codeinsert =: 1 : '[: > ((''('' , '')'' ,~ [ , '' '' , m , '' '' ,
> ])~&.>/)@:|.'
>
> the y argument is a list of boxes where the code will be inserted along with
> parentheses to allow left to right parsing: (result is a string. eval will
> work regardless of whether expression results in noun or function)
>
> 'and' codeinsert ;: 'a b c d e'
> ((((a and b) and c) and d) and e)
>
> Function that strips outer tokens if they are present (default '()')
> stripouter_z_ =:'()'&$: :(}:@:}.@:]^:(-: ({. , {:)))
>
> can work with conjunctions too, and the parens strategy is designed to
> provide some consistency with verbs and conjunctions.
> stripouter '@:' codeinsert cut '+/ +: (-:@*/~)'
> (+/ @: +:) @: (-:@*/~)
>
>
> this allows several simplifications to spreadsheet parser:
>
> parselessand =: ( [: 'less' codeinsert [: 'and' codeinsert each [: '&'&cut
> each '~'&cut)
>
> we can note that this first part of the parser does not care at all what the
> range format is:
>
> parselessand 'A3:C6&D1&B2:B4~F2:F3~G2'
>
> ((((A3:C6 and D1) and B2:B4) less F2:F3) less G2)
> parselessand '2 0:5 2 &0 4&1 1:1 3~1 4:_4 2~5 _1'
> ((((2 0:5 2 and 0 4) and 1 1:1 3) less 1 4:_4 2) less 5 _1)
>
> we can also note that alphanum col format is confusing and useless even
> though the range operator can help with avoiding some parens and whitespace.
>
> If we ignore parsing alphanum rowcols then the full parser becomes simply
>
> parseN =: (':';' to ') rplc~ parselessand
> p =: 1 : 'boxopen ". parseN m'
>
> '2 0:5 2 &0 4&1 1:1 3~1 4:4 2~5 _1'p
> ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
> │2 0│2 1│2 2│3 0│3 1│3 2│4 0│4 1│4 2│5 0│5 1│5 2│0 4│1 1│1 2│1 3│
> └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
>
> its also possible to directly use parselessand without the range operator
>
> parselessand '2 0 to 5 2 &0 4&1 1 to 1 3~1 4 to _4 2~5 _1'
> ((((2 0 to 5 2 and 0 4) and 1 1 to 1 3) less 1 4 to _4 2) less 5 _1)
> boxopen ". parselessand '2 0 to 5 2 &0 4&1 1 to 1 3&_4 2 to _4 3~5 _1'
> ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┬────┐
> │2 0│2 1│2 2│3 0│3 1│3 2│4 0│4 1│4 2│5 0│5 1│5 2│0 4│1 1│1 2│1 3│_4 2│_4 3│
> └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴────┴────┘
>
> if the less and and operators were remapped to say ? and ! then you could
> also include a fuller range of J code within the string.
>
> ----- Original Message -----
> From: 'Pascal Jasmin' via Programming <[email protected]>
> To: "[email protected]" <[email protected]>
> Cc:
> Sent: Wednesday, August 20, 2014 10:22:40 PM
> Subject: Re: [Jprogramming] dsl for spreadsheet like input selectors
>
> some updates on this, Original definitions:
>
> to2 =: [: <"1 [: ,."0/&>/ [ +&.> [: i.@:>:&.> -~
> to =: 2 : 'm ,@:to2 n'
> and=: ~.@:,&boxopen
> less =: -.&boxopen
>
> a conjunction that takes n (or v"_) as the selection indexes, and then uses x
> if any as the updateto indexes, and assigns to those indexes the expression u
> selected{ y.
>
> amendto_z_ =: 2 : 0
> s=. v"_ y
> (u (s{y)) (s}) y
> :
> s=. v"_ y
> (u (s{y)) (x}) y
> )
>
> doubles left-top 4 cells and sets them to bottom right 4 cells:
> 1 1 to 2 2 +: amendto (0 0 to 1 1) i.3 3
> 0 1 2
> 3 0 2
> 6 6 8
>
>
>
> here are routines to parse spreadsheet format : & ~ . I think I need help
> for the parselessand as it doesn't work for multiple and/less (&~) within
> their frames. This does parse negative indexes though, and you can use the
> and and less keywords in combination with the parser, so the bug has a
> workaround.
>
> linearize
> =: , $~ 1 -.~ $
> parselessand =: [: >@:> [: ('(' , ([: ;`$:@.(1 < #) [) , ') less ' ,
> ])&>/@:(}: ; {:)^:(1 < #) [: linearize@:>L:1^:(1 < #) [: ('(' , ([: ;`$:@.(1
> < #) [) , ') and ' , ])&>/@:(}: ; {:)^:(1 < #)&.> [: <;._2&.> '&' ,~&.> [:
> <;._2 '~' ,~ ]
>
> that takes care of "compiling" the structure around the cells:
> parselessand'A3:C6&D1~A2:BB3'
> ((A3:C6) and D1) less A2:BB3
>
> splitrowcol=:([: , [: boxopen&> (] <;.1~ [: (1 , }.) 10 >
> '0123456789'&i.)`]@.((1 = L.) *. 2 = #)&.>`(]&.>)@.(2 = #))@:(] <;.1~ [: (1 ,
> }.) '_' -.@:i: ])
> assidx =: (([: <: 0 ". ]) , (] -@:>:@:]^:('_'= {.@:[) [: fixlet ALPHA i.
> }.^:('_'= {.))@:[) &>/@: splitrowcol
> parseS =: [: ;: inv [: ":@:assidx^:(([: +./ '0123456789' e.~ ]) *. [: +./
> ALPHA e.~ ]) each ( (<,':');<<'to') rplc~ [: ;: ( ':';' : ') rplc~
> parselessand
> final adverb executes compiled sentence and makes sure result is boxed
> p =: 1 : 'boxopen ". parseS m'
>
>
> 'A_0'p +: amendto ('A4'p) 'A4'p (+/%#) amendto ('A1:A3'p) 'A3'p *:
> amendto ('A2'p) 'A2'p 3&* amendto ('A1'p) 3 'A1'p } 5 1 $ _
> 3
> 9
> 81
> 31
> 62
>
> to see more negative indexing,
>
>
> '_A_3:C_1' p
> ┌─────┬────┬────┬────┬─────┬────┬────┬────┬─────┬────┬────┬────┐
> │_4 _1│_4 0│_4 1│_4 2│_3 _1│_3 0│_3 1│_3 2│_2 _1│_2 0│_2 1│_2 2│
> └─────┴────┴────┴────┴─────┴────┴────┴────┴─────┴────┴────┴────┘
>
>
>
> compound statements
> '_A_2:C_1'p less~ '_A_3:C_1&A1:B2' p and 'B1:B3'p
> ┌─────┬────┬────┬────┬───┬───┬───┬───┬───┐
> │_4 _1│_4 0│_4 1│_4 2│0 0│0 1│1 0│1 1│2 1│
> └─────┴────┴────┴────┴───┴───┴───┴───┴───┘
>
> A modification to amendto into an adverb such that indexes can set as part of
> tacit code:
> A dyad where x is either a list of boxes (updated and selected indexes are
> the same), or 2 boxes where each box is updatelist , selectlist
>
> amendtoA_z_ =: 1 : 0
> :
> if. 2=L.x do. 'a s' =. x else. a =. s =. x end.
> (u (s{y)) (a}) y
> )
>
> Boxlink =: boxopen&.>@:,&< NB. joins 2 list of boxed indexes into 2 boxes.
>
>
> different shape assignments: (to2 function allows retrieving selection with
> shape)
> ('A4:C4'p Boxlink 'A1'p to2&> 'C3'p) +/ amendtoA i.4 3
> 0 1 2
> 3 4 5
> 6 7 8
> 9 12 15
>
> sample function that takes any size tables, adds a row and column and puts
> the sum of rows and columns in the new obvious place, and then in the bottom
> right cell, puts the average of the row and column sums:
>
> extendSumAvg =: ((<@:$ Boxlink ((0 ,~ {.@$) ,@:to2 {.@$ , <:@{:@:$) and (0 ,
> {:@:$) ,@:to2 <:@:{.@:$ , {:@:$) (+/%#) amendtoA (((0 ,~ {.@:$) ,@:to2 ({.,
> <:@:{:)@:$) Boxlink 0 0 to2 <:@:$) +/ amendtoA (,@:((0 , {:@:$) to2 (<:@{.,
> {:)@:$) Boxlink 0 0 to2 <:@:$) +/"1 amendtoA 0 ,~ 0 ,.~ ])
>
> ]/each extendSumAvg i.3 2
> ┌─┬─┬─┐
> │0│1│1│
> ├─┼─┼─┤
> │2│3│5│
> ├─┼─┼─┤
> │4│5│9│
> ├─┼─┼─┤
> │6│9│6│
> └─┴─┴─┘
>
> to show off, repeatedly growing spreadsheet 5 times with the algorithm
>
> extendSumAvg^:5 i.3 3
> 0 1 2 3 6 12 24 48
> 3 4 5 12 24 48 96 192
> 6 7 8 21 42 84 168 336
> 9 12 15 12 48 96 192 384
> 18 24 30 48 30 150 300 600
> 36 48 60 96 150 78 468 936
> 72 96 120 192 300 468 208 1456
> 144 192 240 384 600 936 1456 564.571
>
>
>
> ----- Original Message -----
> From: 'Pascal Jasmin' via Programming <[email protected]>
> To: "[email protected]" <[email protected]>
> Cc:
> Sent: Monday, August 18, 2014 5:39:50 PM
> Subject: Re: [Jprogramming] dsl for spreadsheet like input selectors
>
> sorry, mistyped to2
>
> to2
> =: [: <"1 [: ,."0/&>/ [ +&.> [: i.@:>:&.> -~
>
>
> ----- Original Message -----
> From: Brian Schott <[email protected]>
> To: Programming forum <[email protected]>
> Cc:
> Sent: Monday, August 18, 2014 5:32:43 PM
> Subject: Re: [Jprogramming] dsl for spreadsheet like input selectors
>
> I am not getting good results with to2.
> I am playing with the following.
>
> CP=: {@(,&<)
> cross =: [: CP &>/< @:i.@>:"0
> 0 1 -.~&(,&cross) 2 3
> ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
> │0 2│0 3│1 0│1 1│1 2│1 3│2 0│2 1│2 2│2 3│
> └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
>
>
>
> On Mon, Aug 18, 2014 at 4:25 PM, 'Pascal Jasmin' via Programming <
> [email protected]> wrote:
>
>> spreadsheets have a range selection syntax like A1:C3&F4~B2 which means
>> the block range from A1 to C3 with the cell F4 added, and the cell B2
>> removed.
>>
>> Ignoring the letter conversions, here are some useful J functions for
>> building a list of selectors (can be used with both { and }). Conjunctions
>> are used for their power to be higher precedence functions, and reduction
>> of parentheses. Perhaps the only really neat feature of this dsl is the
>> use of conjunctions, as the functions themselves are pretty simple. At the
>> same time, the conjunctions might get in the way if using these functions
>> within forks.
>>
>> the 3 core spreadsheet combiners:
>>
>> to2 =: ( [: <"1 [: ,."0/&>/ [: i.@:>: each -~)
>> to =: 2 : 'm ,@:to2 n'
>> and=: ~.@:,&boxopen
>> less =: -.&boxopen
>
>
>
>>
>>
> --
> (B=)
> ----------------------------------------------------------------------
> 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