AND procedure in terms of IF for arbitrary number of argument {{{ (define (and . xs) (if (null? xs) #t (if (null? (cdr xs)) (car xs) (if (car xs) (apply and (cdr xs)) #f)))) }}} OR procedure for arbitrary number of arguments {{{ (define (or . xs) (if (null? xs) #f (if (null? (cdr xs)) (car xs) (if (car xs) (car xs) (apply or (cdr xs)))))) }}} These are such a mess due to the fact that we must "extract parameters from a list" (do destructuring) and analyze two special cases (dealing with varying number of arguments) in the same piece of code. In other dialects these constructs do look slightly better. We also could re-write it to look slightly better {{{ (define (last? xs) (and (pair? xs) (null? (cdr xs)))) (define (and . xs) (cond ((null? xs) #t) ((last? xs) (car xs)) (else (if (car xs) (apply and (cdr xs)) #f)))) }}} but it is cheating, because we presumably still do not have {{{and}}} and {{{cond}}}.) Now let's turn these into special forms. The idea is that we do not want to evaluate rest of the argument expressions if we have already reached the base case - a {{{false}}} value for AND or a {{{true}}} value for OR. How do we create new special forms? By writing them as a macro.