(define snlist-recur (lambda (flist fatom init) (letrec ([helper (lambda (l) (cond [(null? l) init] [(pair? (car l)) (flist (helper (car l)) (helper (cdr l)))] [else (fatom (car l) (helper (cdr l)))]))]) helper))) (define last (snlist-recur (lambda (x y) (if (null? y) x y)) (lambda (x y) (if (null? y) x y)) '())) (define first (snlist-recur (lambda (x y) (if (null? x) y x)) (lambda (x y) (if (null? x) y x)) '())) (define matrix-ref (lambda (m row col) ((snlist-recur (lambda (x y) (if (number? y) (if (= y row) x (+ y 1)) y)) (lambda (x y) (if (number? y) (if (= y col) x (+ y 1)) y)) 0) m))) (define matrix-ref-2 (lambda (m row col) (let ([currow 0] [curcol 0] [rower #f] [coler #f]) ((snlist-recur (lambda (x y) (if (= row currow) (set! rower coler) (set! currow (+ currow 1)))) (lambda (x y);;; need to use local let (if (= col curcol) (set! coler rower) (set! curcol (+ curcol 1)))) 0) m) coler)))