eintr: Every

 
 Recursive Pattern: _every_
 ..........................
 
 In the ‘every’ recursive pattern, an action is performed on every
 element of a list.
 
    The basic pattern is:
 
    • If a list be empty, return ‘nil’.
    • Else, act on the beginning of the list (the CAR of the list)
         − through a recursive call by the function on the rest (the CDR)
           of the list,
         − and, optionally, combine the acted-on element, using ‘cons’,
           with the results of acting on the rest.
 
    Here is an example:
 
      (defun square-each (numbers-list)
        "Square each of a NUMBERS LIST, recursively."
        (if (not numbers-list)                ; do-again-test
            nil
          (cons
           (* (car numbers-list) (car numbers-list))
           (square-each (cdr numbers-list))))) ; next-step-expression
 
      (square-each '(1 2 3))
          ⇒ (1 4 9)
 
 If ‘numbers-list’ is empty, do nothing.  But if it has content,
 construct a list combining the square of the first number in the list
 with the result of the recursive call.
 
    (The example follows the pattern exactly: ‘nil’ is returned if the
 numbers’ list is empty.  In practice, you would write the conditional so
 it carries out the action when the numbers’ list is not empty.)
 
    The ‘print-elements-recursively’ function (SeeRecursion with a
 List Recursion with list.) is another example of an ‘every’ pattern,
 except in this case, rather than bring the results together using
 ‘cons’, we print each element of output.
 
    The ‘print-elements-recursively’ function looks like this:
 
      (setq animals '(gazelle giraffe lion tiger))
 
      (defun print-elements-recursively (list)
        "Print each element of LIST on a line of its own.
      Uses recursion."
        (when list                            ; do-again-test
              (print (car list))              ; body
              (print-elements-recursively     ; recursive call
               (cdr list))))                  ; next-step-expression
 
      (print-elements-recursively animals)
 
    The pattern for ‘print-elements-recursively’ is:
 
    • When the list is empty, do nothing.
    • But when the list has at least one element,
         − act on the beginning of the list (the CAR of the list),
         − and make a recursive call on the rest (the CDR) of the list.