Kenny Tilton wrote:
(defun p2b (pairs &key ((:test test) #'eql))
"((A 1) (A 2) (B 2) (C 2) (C 3)) ==> ((A 1 2) (B 2) (C 2 3))"
(loop with bunch = nil
for (one two) in pairs
do (push two (cdr (or (assoc one bunch :test test)
(car (push (list one) bunch)))))
finally (return bunch)))
newLISP
;; Alter a value in or add a value to an association list.
(macro (ainc! Alist Key Value Function Deflt)
(local (E-Message Val Func Def)
(setq Func Function)
(if (true? Func)
(setq Val Value)
(begin (setq Func +) (setq Val (or Value 1))))
(setq Def Deflt)
(if (= nil Def) (setq Def 0))
(unless
(catch
(setf (assoc Key Alist)
(list ($it 0) (Func Val ($it 1))))
'E-Message)
(if (starts-with E-Message "ERR: no reference")
(setf Alist (cons (list Key (Func Val Def)) Alist))
(throw E-Message)))))
(define (p2b pairs)
(let (bunch '())
(dolist (xs pairs)
(ainc! bunch (xs 0) (xs 1) cons '()))
bunch))
(p2b '((A 1) (A 2) (B 2) (C 2) (C 3)))
===>
((C (3 2)) (B (2)) (A (2 1)))
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)