Here's an attempt at making this code more "J-ish". Mostly, I have
been assigning names to blocks (instead of allowing anonymous blocks).
I need better names, though. ref0N is not a very evocative name.
trivial=: 0 *./ .= {.
NonTrivial=: ^:(0 = trivial)
refN=: (], 0,. [:REF 1 1}. [ - {."1@[ */ ]) (%{.)@{.
ref00=: 0,. [:REF }."1
ref0N=: [:REF (}.,~ {. + ({.@#~ 0 ~: {."1))
ref0=: ref0N`ref00@.(trivial@:|:)
REF=: refN`ref0@.(0 = {.@{.)NonTrivial
reduce0=: {."1,. [: reduceStep }."1
reduce1=: {., 0 ,. }."1@}.@(- ({."1 */ {.))
reduceStep=: reduce0`reduce1`]@.(2 <. {.@{.) NonTrivial
RREF =: ([:{.&> (reduceStep@}.&.>^:(1<#&>)^:a:@ <@reduceStep))&.|. @ REF
Note that I have eliminated the code corresponding to
if. 0=#y do. i.0 0 return. end.
since this case never happens -- it is handled by
if. *./0={.y do. y return. end.
FYI,
--
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm