2009-08-12 7 views
5

Zaczynam pisać dla mnie Common Lisp i dopiero zaczynam wszystko kompresować i formatować.Jak sformatować alistę w typowym seplenieniu?

Załóżmy mam alist, tak:

(defvar *map* '((0 . "zero") (1 . "one") (2 . "two"))) 

Jak mogę sformatować go w ten sposób?

0: zero 
1: one 
2: two 

myślałem coś takiego (format t "~{~{~a: ~a~}~%~}" *map*), ale daje błąd, ponieważ „zero” nie jest listą i nie można wziąć samochód od niego.

Oczywiście, robi (format t "~{~a~%~}" *map*) wydruki

(0 . "zero") 
(1 . "one") 
(2 . "two") 

jak to ma, ale to nie całkiem to, czego chcę. Czy istnieje lepszy sposób na zrobienie tego niż tylko (dolist (entry *mapping*) (format t "~a: ~a~%" (car entry) (cdr entry)))?

Odpowiedz

10

the # kanał cl-ogrodnicy na Freenode sugeruje robi wiązania pętli rozpad tak:

(loop for (a . b) in *mapping* 
    do (format t "~a: ~a" a b)) 
1

Nie sądzę, że istnieje lepszy sposób na zrobienie tego; Chciałbym wykorzystywane map():

(format t "~{~a~%~}" 
    (map 'list 
    #'(lambda (entry) 
     (format nil "~a: ~a" (car entry) (cdr entry)) 
    *map*)) 
+0

mapcar jest bardziej na miejscu ... – skypher

6

Masz rację, że to nie wygląda istnieje jakiś sposób, aby odebrać poza komórkę minusy z formatu.

Jeśli zdefiniować inną funkcję formatowania pojedynczej asocjacji:

(defun print-assoc (stream arg colonp atsignp) 
    (format stream "~A: ~A" (car arg) (cdr arg))) 

to proste:

(format t "~{~/print-assoc/~%~}" *map*) 

Nie jestem pewien, czy jest poprawa czy nie. Z jednej strony jest to trochę bardziej skomplikowane, ale z drugiej strony powoduje podział funkcji drukowania na funkcję (wielokrotnego użytku), która może być przydatna.

+6

Należy użyć kwalifikowane nazwy funkcji w pliku PDF. FORMAT analizuje podany symbol w * pakiecie * i nigdy nie dowiesz się, co to jest * pakiet * w momencie wywołania formatu. –

4

Myślę, że lekcja wynos tutaj tak naprawdę nie jest w użyciu list przerywanych dla alists. Na pewno zapiszesz jedną komórkę, ale zrezygnujesz z ładnej sekwencji i funkcji listy. Po prostu nie warto. Formatowanie przykładem jest trywialne w pełni utworzonych list:

(defvar *map* '((0 "zero") (1 "one") (2 "two"))) 
(format t "~:{~a: ~a~}" *map*) 
1

Konwersja komórek ALIST (a . 2) do listy (a 2) użyciu

(mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*) 

a następnie proces, w formacie.

Np., Aby drukować ((a . 2) (b . 3)) jak "a=2&b=3"

użycie

(format t "~{~{~a~^=~}~^&~}" (mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*))