There are many ways do skin a cat, but here’s how I handled the occurrences task…


>(occurrences '(a b a d a c d c a))
((A . 4) (C . 2) (D . 2) (B . 1))

See, it retuns the token (A, B, etc.) and how many times it occurred


(defun occurrences (queue)
  (sort-count-pairs (scan-queue queue () () )

(defun scan-queue (aQueue aSearched aCount)
  (if (null (car aQueue))
	(if (member (car aQueue) aSearched)
	    (scan-queue (cdr aQueue) aSearched aCount)
	    (let ((scantoken (car aQueue)))
	      (push scantoken aSearched)
	       (count-token scantoken aQueue  0)
	      (scan-queue (cdr aQueue) aSearched aCount))))))

(defun count-token (sToken aQ count)
  (if (null (car aQ))
	(cons count sToken)
	(if (equal (car aQ) sToken )
	    (setf count (+ count 1)))
	(count-token sToken (cdr aQ) count))))

(defun sort-count-pairs (pairs)
  (let ((sortcount
	 (mapcar #'(lambda (x) (car x)) pairs)))
    (sort sortcount #'>)
    (mapcar #'(lambda (x)
		(let ((mypair (assoc x pairs)))
		  (setf pairs (remove (assoc x pairs) pairs))
		  (cons (cdr mypair) (car mypair)))) sortcount)))