Re: Printing an alist of plists with cons format

[email protected]
Newsgroups gmane.emacs.help
Message-ID <[email protected]>
Heime <[email protected]> writes:

> Have made a two level plist 
>
> (defvar mpl-length
>   '(:cm  (:10pt 283.46456 :pt 28.34646 :mm 10 :in 0.39370 :ft 0.03281)
>     :in  (:10pt 720 :pt 72 :mm 25.4 :cm 2.54 :ft 0.083333)
>     :ft  (:10pt 8640 :pt 864 :mm 304.8 :cm 30.48 :in 12)))
>
> And wanted to convert it to a different form: making the top-level plist
> into an alist.
>
> (defun mpl-plist-to-alist (plist)
>   "Convert a nested two-level plist (:u1 plist1 :u2 plist2 ...)
> to a plist nested in an alist '((u1 . plist1) (u2 . plist2) ...)."
>
>   (let (alist)
>     (while plist
>       (let ((unit   (pop plist))
>             (plist  (pop plist)))
>         (push (cons unit plist) alist)))
>     (nreverse alist)))
>
>
> This gives 
>
> ((:cm :10pt 283.46456 :pt 28.34646 :mm 10 :in 0.3937 :ft 0.03281) 
>  (:in :10pt 720 :pt 72 :mm 25.4 :cm 2.54 :ft 0.083333) 
>  (:ft :10pt 8640 :pt 864 :mm 304.8 :cm 30.48 :in 12))
>
>
> How can I get the new list being printed as
>
> ((:cm . (:10pt 283.46456 :pt 28.34646 :mm 10 :in 0.3937 :ft 0.03281))
>  (:in . (:10pt 720 :pt 72 :mm 25.4 :cm 2.54 :ft 0.083333))
>  (:ft . (:10pt 8640 :pt 864 :mm 304.8 :cm 30.48 :in 12)))
>
>

Consider that

(cons 'a '(b c d))
;;=> (a b c d)

but

(cons 'a (list '(b c d)))
;;=> (a (b c d))

which is equivalent to

(list 'a '(b c d))
;;=> (a (b c d))

So, in your function definition, instead of:

>         (push (cons unit plist) alist)

use
          (push (cons unit (list plist)) alist)
or
          (push (list unit plist) alist)

Also, because you are only referencing ‘unit’ once, you can
replace it with the expression that sets its value, (pop plist):

(defun mpl-plist-to-alist (plist)
  "Convert a nested two-level PLIST (:u1 plist1 :u2 plist2 ...)
to a plist nested in an alist '((u1 . plist1) (u2 . plist2) ...)."
  (let (alist)
    (while plist
      (push (list (pop plist) (pop plist)) alist))
    (nreverse alist)))

For more discussion of this, see chapter 2 "Lists" and
chapter 6 "List Data Structures" in this book:

https://www.cs.cmu.edu/~dst/LispBook/book.pdf

-- 
The lyf so short, the craft so long to lerne.
- Geoffrey Chaucer, The Parliament of Birds.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.