^^ Again, somebody has to write the nastiness ^^. The main difficulty really is the fact that you have a polymorphic function that dispatches based on number of parameters as well as their contents.
Although I suppose you could actually use --warning-blatant-self-proclamation-- my p-m: macro:
(p-m:def matrix
(,(s (is s settersym)))
writerfunction
(i j)
(readerfunction i j)
x (err "argument error"))