V10/cmd/sml/doc/examples/spread/sheet.sml

functor Spreadsheet(P : PARSE) : SPREADSHEET =
struct

 structure F = P.F

 fun array2(i,j,v) =  
    let fun init 0 = nil | init i = array(j,v) :: init(i-1)
   in arrayoflist(init i)
  end
 fun update2(a,i,j,v) = update(a sub i, j, v)

 val dim = 10

 val vtable = array2(dim,dim,0)
 val ftable = array2(dim,dim,F.eval(P.parse "0"))
 val stable = array2(dim,dim,"0")

 fun set(i,j,s) = (update2(ftable,i,j, F.eval(P.parse s));
		   update2(stable,i,j,s))

 fun for (i,j) f = if i<=j then (f i; for(i+1,j) f) else ()

 fun eval() = for(0, dim-1)
	        (fn i => for(0, dim-1)
			    (fn j => update2(vtable,i,j,
				     	     (ftable sub i sub j) vtable)));

 fun get(i,j) =  (stable sub i sub j, vtable sub i sub j)
end