; http://cap-lore.com/MathPhys/Field/Inter2.html
(lambda (zer zer? one fa sub fm /)
(let* (
  ; (ex (lambda (m v)(write (list m v))(newline) v))
  (transpose ((fileVal "transpose") 'transpose))
  (fn (lambda (x) (sub zer x)))
  (rref (((fileVal "gRREF") zer? zer one / fm sub #t) 'rref))
  )
(letrec (
  (cull (lambda (n) (lambda (l)
     (let px ((l l)(n n)(k 0)) (if (null? n) l (if (null? l) '()
        (if (= (car n) k) (px (cdr l) (cdr n) (+ k 1))
           (cons (car l) (px (cdr l) n (+ k 1))))))))))
  (iden (lambda (k) (if (zero? k) '() (if (= k 1) (list (list one)) (let ((z (iden (- k 1))))
     (cons (cons one (cons zer (cdar z))) (map (lambda (v) (cons zer v)) z)))))))
  (clz (lambda (a) (if (or (null? a) (not (zer? (car a)))) 0 (+ 1 (clz (cdr a))))))
  (flip (lambda (x) (if (null? x) '() (cons 
     (let ifl ((a (car x))) (if (null? a) '() (cons (fn (car a)) (ifl (cdr a)))))
        (flip (cdr x)))))))
(let (
  (oss (lambda (k sz) (transpose (let ((k (rref k))) (if (pair? k) (let* (
     (a (map clz k))
     (k (let ((l (length (car k))))
       (let ly ((k k) (a a)) (if (null? k) '()
         (if (= l (car a)) '() (cons (car k) (ly (cdr k)(cdr a))))))))
    (b (map (cull a) k)))
    (let puff ((a a)(k (flip b))(i (iden (length (car b))))(j 0))
     (if (and (null? k) (null? i)) '()
        (if (and (not (null? a)) (= j (car a)))
           (cons (car k) (puff (cdr a) (cdr k)      i  (+ j 1)))
           (cons (car i) (puff      a       k  (cdr i) (+ j 1)))
        ))))
        (iden sz)))))))
(letrec (
 ; (gv? (lambda (x) (or (null? x) (and (ge (car x)) (gv? (cdr x))))))
 ; (gm? (lambda (x) (or (null? x) (and (gv (car x))(gm? (cdr x))))))
  (sz (lambda (x) (and (pair? x) (length (car x)))))
  (inter (lambda (a b) (let ((sz (and (sz a)(sz b))))
    (if sz (let ((ul (append (oss a sz) (oss b sz)))) (if (pair? ul) (rref (oss ul 0))
       (iden sz))) '())))))
(lambda (sy) (cdr (assq sy (list 
 (cons 'inter inter) (cons 'oss oss) (cons 'rref rref)(cons 'iden iden))))))))))

(define a '((2.534 4.22 -5.39 0.72003 3.42) (2.344 3.621 0.7 -4.335 5.344) (2.335 4.212 -4.3 -2.1 6.4)))
(define b '((2.354 6.432 3.22 7.6 -2.1) (-3.22 5.4 3.8 3.2 3) (2.6 -4.3 2.2 6.2 3.22)))
(define inters ((fileVal "gIntersect") 0 zero? 1 + - * /))
(define inter (inters 'inter))
(inter a b) ; => ((-0.7283600205908938 -0.8280524922929828 -0.009575249421887921 -0.7131794687048522 1))
(inter a (cons '(3 4 2 6.4 3) b))
; => ((3.785652327371516 5.09353175508096 -1.738365240680639 1 0)
   ;  (1.9714894949452109 2.8045497786269493 -1.2493416481854884 0 1))

((inters 'inter) '((1 3)(1 4)(2 5)) '((3 7)(2 7)))

((((fileVal "gIntersect") 0 zero? 1 + - * /) 'inter) '(3 4 5) '(3 4 5))