I took the model proposed at
https://code.jsoftware.com/wiki/Vocabulary/semico#Running_the_Machine
and fixed a few problems and added an opcode 7, and built a state
table that satisfies the tests I put it through.
It seems to work:
sq=:4 :0
'f s m ijrd'=. x,(#x)}.0;0;'';0 _1 0 _1 assert. 2 <: #x
'i j r d'=. ijrd
'p pj'=. _1,j
if. 0 < L. m do.
n=. (y i.~;m) { (#m),~(#&>m)#i.#m
elseif. ''-:m do.
n=. y
elseif. do.
n=. (a.i.y){m
end.
result=. f {:: (0#a:);'';i.&.>0 2;0;0 3;0 6
while. i <: #n do.
if. i = #n do.
if. d >: 0 do. 'newrow action' =. (<r,c =. d) { s
elseif. j = _1 do. break.
elseif. f = 5 do. break. NB. Don't output final flush
elseif. do. 'newrow action' =. 0 5
end.
else. 'newrow action' =. (<r,c =. i { n) { s
end.
assert. newrow < #s
if. f = 5 do. result =. result , i, j, r, c, newrow, action end.
select. action
case. 0 do.
case. 6 do. break.
case. 7 do. i=. i-2
fcase. 2;3;4;5 do. NB. emit
assert. j >: 0
if. f ~: 5 do.
ej=. ((r=p)*action>3) { j,pj
select. f
case. 0 do. newdata =. < ej }. i {. y
case. 1 do. newdata =. ej }. i {. y
case. 2 do. newdata =. ej , i
case. 3 do. newdata =. (}:$s) #: r,c
case. 4 do. newdata =. ej , (i-ej) , (}:$s) #: r,c
case. do.
'Invalid output type' 13!:8 (1)
end.
if. (action <: 3)+.r~:p do. result =. result , newdata
else. result =. newdata (<:#result)} result
end.
end.
if. r~:p do. pj=. j end.
p=. action {_1 _1 _1 _1,r,r
case. 1 do.
j =. (action e. 1 2 4) { _1,i
case. do.
'Invalid action' 13!:8 (1)
end. NB. select action
r =. newrow
i =. i + 1
end.
result
)
mj=: 256$0 NB. X other
mj=: 1 (9,a.i.' ')}mj NB. S space and tab
mj=: 2 (,(a.i.'Aa')+/i.26)}mj NB. A A-Z a-z excluding N B
mj=: 3 (a.i.'N')}mj NB. N the letter N
mj=: 4 (a.i.'B')}mj NB. B the letter B
mj=: 5 (a.i.'0123456789_')}mj NB. 9 digits and _
mj=: 6 (a.i.'.')}mj NB. . the decimal point
mj=: 7 (a.i.':')}mj NB. : the colon
mj=: 8 (a.i.'''')}mj NB. Q quote
mj=: 9 (a.i.'{')}mj NB. { the left curly brace
mj=:10 (a.i.'}')}mj NB. } the right curly brace
NB.0 1 2 3 4 5 6 7 8 9 10
sj=: _2]\"1 }.".;._2 (0 : 0)
' X S A N B 9 . : Q { } ']0
1 1 0 0 2 1 3 1 2 1 6 1 1 1 1 1 7 1 10 1 11 1 NB. 0 space
1 2 0 3 2 2 3 2 2 2 6 2 1 0 1 0 7 2 10 2 11 2 NB. 1 other
1 2 0 3 2 0 2 0 2 0 2 0 1 0 1 0 7 2 10 2 11 2 NB. 2 alp/num
1 2 0 3 2 0 2 0 4 0 2 0 1 0 1 0 7 2 10 2 11 2 NB. 3 N
1 2 0 3 2 0 2 0 2 0 2 0 5 0 1 0 7 2 10 2 11 2 NB. 4 NB
9 0 9 0 9 0 9 0 9 0 9 0 1 0 1 0 9 0 9 0 9 0 NB. 5 NB.
1 4 0 5 6 0 6 0 6 0 6 0 6 0 1 0 7 4 10 4 11 4 NB. 6 num
7 0 7 0 7 0 7 0 7 0 7 0 7 0 7 0 8 0 7 0 7 0 NB. 7 '
1 2 0 3 2 2 3 2 2 2 6 2 1 2 1 2 7 0 10 2 11 2 NB. 8 ''
9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 9 0 NB. 9 comment
1 2 0 3 2 2 3 2 2 2 6 2 1 0 1 0 7 2 12 0 1 2 NB. 10 {
1 2 0 3 2 2 3 2 2 2 6 2 1 0 1 0 7 2 1 2 13 0 NB. 11 }
1 2 0 3 2 2 3 2 2 2 6 2 1 7 1 7 7 2 1 2 1 2 NB. 12 {{
1 2 0 3 2 2 3 2 2 2 6 2 1 7 1 7 7 2 1 2 1 2 NB. 13 }}
)
(0;sj;mj) sq '{{+/y}}'
+--+-+-+-+--+
|{{|+|/|y|}}|
+--+-+-+-+--+
(0;sj;mj) sq '{{+/y}}}'
+--+-+-+-+--+-+
|{{|+|/|y|}}|}|
+--+-+-+-+--+-+
(0;sj;mj) sq '{{.+/y}}.'
+-+--+-+-+-+-+--+
|{|{.|+|/|y|}|}.|
+-+--+-+-+-+-+--+
Thanks,
--
Raul
On Sat, Nov 7, 2020 at 9:58 AM Henry Rich <[email protected]> wrote:
>
> (;: y) is very fast, quite a bit faster than (x ;: y), and the only
> error it recognizes is open quote. If you just want to avoid that
> error, I recommend
>
> ;: :: (;:@:(,&''''))
>
> You might want to enlarge that so as to leave some indication that the
> quote was added.
>
>
> Raul, if a new action were added to (x ;: y) to decrement i (that is, if
> an iteration is looking at character 6 the next iteration will look at
> character 5), with no output and no change to j, would that allow you to
> model (;: y)?
>
> Henry Rich
>
>
>
> --
> This email has been checked for viruses by AVG.
> https://www.avg.com
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm