The "list" and "list*" patterns are nice, but sometimes it's convenient to have them inline (so that the list itself doesn't need to be spliced in).
Consider adding these as built-in:
(defpattern ilist (arg)
(when (consp arg) `(cons ,(car arg) (ilist ,(cdr arg)))))
(defpattern ilist* (arg)
(if (null (cdr arg)) `(and ,(car arg) (type list)) `(cons ,(car arg) (ilist* ,(cdr arg)))))