c) Not that it'll really save anything when it comes to the overall computational complexity, but this version of list length comparison will only traverse the lists up to the end of the shorter one:
(def longer-list (a b)
(if a
(if b
(longer-list cdr.a cdr.b)
t)
nil))
d) Where you say "(if empty.xs ys <else>)", you can probably squeeze out more performance with "(if xs <else> ys)". You can actually use "(iflet (x) xs <else> ys)" here too, but I don't know what that'll do to the performance.
e) There's no need to call 'testify.
After incorporating a bunch of this feedback--I didn't pit '< against '> --the code might look like this: