Path: nntp.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp Subject: Re: need help with data structure problem Date: Mon, 30 Jun 2025 04:07:32 -0000 (UTC) Organization: A noiseless patient Spider Lines: 73 Message-ID: <103t2i3$1vn48$1@dont-email.me> References: <1034rga$akhr$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Mon, 30 Jun 2025 06:07:33 +0200 (CEST) Injection-Info: dont-email.me; posting-host="b316bafb1ab57d3a7e95c5e7f34e7f34"; logging-data="2088072"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18NLiX0nlcKfire+hhXUrp1" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:V+q79nKmPzvGr9+Rfg7dijWvkEY= B. Pym wrote: > > hi, I need to write a function (join_similar expr) where expr is > > adata structure with the following format ( (x1 y1) (x2 y2) (x3 y3)... > > (xn yn)), > > > > join_similar will return an expression like ( (x1 y1 y2) (x3 y3) ...) > > when x1=x2 > > > > for instance: > > *(join_similar '((3 4) (7 5) (3 6) (7 8) (3 9) (0 1)) > > > > would return: > > ((3 4 6 9) (7 5 8) (0 1)) > > > Kenny Tilton wrote: > > > Lieven Marchand wrote: > > > CL-USER 9 > (defun join-similar (list) > > > (loop with ht = (make-hash-table) > > > for (first second) in list > > > do > > > (pushnew second (gethash first ht nil)) > > > finally (return (loop for first being each hash-key in ht using (hash-value rest) collect (cons first rest))))) > > > JOIN-SIMILAR > > > > > Isn't LOOP beautiful? > > > > No... > > > > (defun join-similar (pairs &aux result) > > (dolist (pair pairs (nreverse result)) > > (nconc (or (assoc (first pair) result) > > (first (push (list (first pair)) result))) > > (list (second pair))))) > Gauche Scheme Using a collector that collects into an association list. (define (join-similar pairs) (let1 a (malistbag) (dolist (xs pairs) (a (car xs) (cadr xs) cons ())) (a))) (join-similar '((foo 4)(bar 7)(foo 5)(bar 8)(fun 9))) ===> ((fun 9) (foo 5 4) (bar 8 7)) Given: (define (mbag init func :optional (pass-through #f)) (let ((val init) (func func) (pass-through pass-through)) (lambda args (if (null? args) val (begin (set! val ;; A "kons" may have been supplied. ((if (null? (cdr args)) func (cadr args)) (car args) val)) (if pass-through (car args) val)))))) (define (mlistbag :optional (pass-through #t)) (let ((bag (mbag '() cons pass-through))) (lambda args (if (null? args) (reverse (bag)) (apply bag args)))))