Go to the previous, next section.

The  recursive-graph-body-print Function

The  graph-body-print function may also be written recursively. In this case, it is divided into two parts: an outside `wrapper' that uses a  let expression to determine the values of several variables that need only be found once, such as the maximum height of the graph, and a inside function that is called recursively to print the graph.

The `wrapper' is uncomplicated:

(defun recursive-graph-body-print (numbers-list)
  "Print a bar graph of the NUMBERS-LIST.
The numbers-list consists of the Y-axis values."
  (let ((height (apply 'max numbers-list))
        (symbol-width (length graph-blank))
        from-position)
    (recursive-graph-body-print-internal
     numbers-list
     height
     symbol-width)))

The recursive function is a little more difficult. It has four parts: the `do-again-test', the printing code, the recursive call, and the `next-step-expression'. The `do-again-test' is an  if expression that determines whether the  numbers-list contains any remaining elements; if it does, the function prints one column of the graph using the printing code and calls itself again. The function calls itself again according to the value produced by the `next-step-expression' which causes the call to act on a shorter version of the  numbers-list .

(defun recursive-graph-body-print-internal
  (numbers-list height symbol-width)
  "Print a bar graph.
Used within recursive-graph-body-print function."

  (if numbers-list
      (progn
        (setq from-position (point))
        (insert-rectangle
         (column-of-graph height (car numbers-list)))
        (goto-char from-position)
        (forward-char symbol-width)
        (sit-for 0)     ; Draw graph column by column.
        (recursive-graph-body-print-internal
         (cdr numbers-list) height symbol-width))))

After installation, this expression can be tested; here is a sample:

(recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))

Here is what  recursive-graph-body-print produces:

                *        
               **   *    
              ****  *    
              **** ***   
            * *********  
            ************ 
            *************

Either of these two functions,  graph-body-print or  recursive-graph-body-print , create the body of a graph.

Go to the previous, next section.