William James
10/13/2015 1:02:00 AM
WJ wrote:
> Wade Humeniuk wrote:
>
> > Yeah, but I do not worry about it, much, at the beginning. Here
> > is another, it seems easier to think in the morning
> >
> > (defun summarize (list)
> > (let ((summary nil))
> > (map nil (lambda (elt)
> > (let ((sum (find (first elt) summary :test #'eql :key #'first)))
> > (if sum
> > (incf (second sum) (second elt))
> > (push elt summary))))
> > list)
> > summary))
> >
> > and its loop version
> >
> > (defun summarize (list)
> > (loop with summary = nil
> > for elt in list
> > for sum = (find (first elt) summary :test #'eql :key #'first)
> > if sum do (incf (second sum) (second elt))
> > else do (push elt summary)
> > finally (return summary)))
> >
> > CL-USER 2 > (summarize '((c 7) (a 1) (a 3) (b 1) (b 10) (b 100)))
> > ((B 111) (A 4) (C 7))
Portable Standard Lisp:
(load useful)
(de summarize (list)
(for
(with summary sum)
(in elt list)
(do
(setq sum (assoc (car elt) summary))
(if sum
(incr (second sum) (second elt))
(push elt summary)))
(returns summary)))
(summarize '((c 7) (a 1) (a 3) (b 1) (b 10) (b 100)))
===>
((b 111) (a 4) (c 7))
Shorter:
(de summarize (list)
(let (summary)
(while list
(let* ((elt (pop list))
(sum (assoc (car elt) summary)))
(if sum
(incr (second sum) (second elt))
(push elt summary))))
summary))