• Re: My LOOP is ugly

    From B. Pym@21:1/5 to Kenny Tilton on Sun Aug 18 04:25:34 2024
    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)