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