35 lines
992 B
Common Lisp
35 lines
992 B
Common Lisp
(defun mapc-tree (fn tree)
|
|
"Apply FN to all elements in TREE."
|
|
(cond ((consp tree)
|
|
(mapc-tree fn (car tree))
|
|
(mapc-tree fn (cdr tree)))
|
|
(t (funcall fn tree))))
|
|
|
|
(defun count-source (source)
|
|
"Load and count all function-bound symbols in a SOURCE file."
|
|
(load source)
|
|
(with-open-file (s source)
|
|
(let ((table (make-hash-table)))
|
|
(loop for data = (read s nil nil)
|
|
while data
|
|
do (mapc-tree
|
|
(lambda (x)
|
|
(when (and (symbolp x) (fboundp x))
|
|
(incf (gethash x table 0))))
|
|
data))
|
|
table)))
|
|
|
|
(defun hash-to-alist (table)
|
|
"Convert a hashtable to an alist."
|
|
(let ((alist))
|
|
(maphash (lambda (k v) (push (cons k v) alist)) table)
|
|
alist))
|
|
|
|
(defun take (n list)
|
|
"Take at most N elements from LIST."
|
|
(loop repeat n for x in list collect x))
|
|
|
|
(defun top-10 (table)
|
|
"Get the top 10 from the source counts TABLE."
|
|
(take 10 (sort (hash-to-alist table) '> :key 'cdr)))
|