;;; Some undocumented higher-order procedures (define both (lambda (pred1? pred2?) (lambda (val) (and (pred1? val) (pred2? val))))) (define compose (lambda (f g) (lambda (x) (f (g x))))) (define either (lambda (pred1? pred2?) (lambda (val) (or (pred1? val) (pred2? val))))) (define listp? (letrec ((kernel (either null? (both pair? (compose kernel cdr))))) kernel))