• Re: My LOOP is ugly

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp on Fri Jul 11 22:59:50 2025
    From Newsgroup: comp.lang.lisp

    B. Pym wrote:

    B. Pym wrote:

    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)))

    Testing:

    (p2b '((A 1) (A 2) (B 2) (C 2) (C 3) (A 88)))
    ===>
    ((C 3 2) (B 2) (A 88 2 1))


    Gauche Scheme

    Let's use a collector that collects into an association-list.

    (let ((a (malistbag)))
    (for-each
    (lambda(xs) (apply a `(,@xs ,cons ())))
    '((A 1) (A 2) (B 2) (C 2) (C 3) (A 88)))
    (a))

    Given:


    Another way.

    (define (p2b pairs :optional (test equal?))
    (define alist (map list (delete-duplicates (map car pairs))))
    (define (proc k v) (push! (cdr (assoc k alist test)) v))
    (dolist (e pairs) (apply proc e))
    alist)

    --- Synchronet 3.21a-Linux NewsLink 1.2