eintr: Several defuns

 
 14.4 Count Several ‘defuns’ Within a File
 =========================================
 
 A file such as ‘simple.el’ may have a hundred or more function
 definitions within it.  Our long term goal is to collect statistics on
 many files, but as a first step, our immediate goal is to collect
 statistics on one file.
 
    The information will be a series of numbers, each number being the
 length of a function definition.  We can store the numbers in a list.
 
    We know that we will want to incorporate the information regarding
 one file with information about many other files; this means that the
 function for counting definition lengths within one file need only
 return the list of lengths.  It need not and should not display any
 messages.
 
    The word count commands contain one expression to jump point forward
 word by word and another expression to count the jumps.  The function to
 return the lengths of definitions can be designed to work the same way,
 with one expression to jump point forward definition by definition and
 another expression to construct the lengths’ list.
 
    This statement of the problem makes it elementary to write the
 function definition.  Clearly, we will start the count at the beginning
 of the file, so the first command will be ‘(goto-char (point-min))’.
 Next, we start the ‘while’ loop; and the true-or-false test of the loop
 can be a regular expression search for the next function definition—so
 long as the search succeeds, point is moved forward and then the body of
 the loop is evaluated.  The body needs an expression that constructs the
 lengths’ list.  ‘cons’, the list construction command, can be used to
 create the list.  That is almost all there is to it.
 
    Here is what this fragment of code looks like:
 
      (goto-char (point-min))
      (while (re-search-forward "^(defun" nil t)
        (setq lengths-list
              (cons (count-words-in-defun) lengths-list)))
 
    What we have left out is the mechanism for finding the file that
 contains the function definitions.
 
    In previous examples, we either used this, the Info file, or we
 switched back and forth to some other buffer, such as the ‘*scratch*’
 buffer.
 
    Finding a file is a new process that we have not yet discussed.