XPost: comp.lang.scheme
Christopher N. Vogt wrote:
;; Hi. I would like to invert an alist of the form ;; ;; ((reference-1 referent-a referent-b...) (reference-2 referent-c ...)...) ;; ;; to
another alist of the form ;; ;; ((referent-a reference-1) (referent-b reference-1) ;; (referent-c reference-2) ...) ;; ;; I have gotten something to work but it's so stupefyingly *UGLY* that I ;; just know someone out there can demonstrate a more better beautiful ;; elegant
means of achieving the same result. ;; ;; [ I'm working in emacs-lisp
with the 'cl' package, so the code below ;; ought to be reasonably close
to Common Lisp...] ;; ;; ;; Mind you, I am teaching myself lisp and THIS
....
I'd do it something like this:
(defun invert-alist (alist)
(loop for list in test
for reference = (first list)
appending (loop for referent in (cdr list)
collect (list referent reference))))
Gauche Scheme
(define (invert-alist alist)
(@ append-map xs :
(map (cut list <> (car xs)) (cdr xs)) :
alist))
Given:
(define-syntax @-aux
(syntax-rules (:)
;; No parameters given; use "cut".
[(_ func () ((e0 e ...)) : stuff ...)
(func (cut e0 e ...) stuff ...)]
[(_ func vars (e0 e ...) : stuff ...)
(func (lambda vars e0 e ...) stuff ...)]
[(_ func vars (e0 e ...) expr more ...)
(@-aux func vars (e0 e ... expr) more ...)]
[(_ func vars () : expr more ...)
(@-aux func vars (expr) more ...)]
[(_ func (vars ...) () var more ...)
(@-aux func (vars ... var) () more ...)]
))
(define-syntax @
(syntax-rules ()
[(_ func stuff ...)
(@-aux func () () stuff ...)]))
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)