2013-12-10 2 views
7

modo che io possa fare questo:Giustificazione in un formato con numero variabile di elementi in un elenco

CL-USER> (format t "~80<~a~;~a~;~a~;~a~>~%" "hello" "how are you" "i'm fine" "no you're not") 
hello    how are you    i'm fine    no you're not 

uniformemente spazi delle 4 corde lungo tutto l'arco di 80 come specificato.

Tuttavia, voglio passare un elenco di stringhe e giustificare quelle invece, in base a quante sono nella lista.

Nessuno di questi lo fanno:

CL-USER> (format t "~{~80<~a~;~>~}~%" '(1 2 3 4 5 6)) 
1 
2 
3 
4 
5 
6 

CL-USER> (format t "~80<~{~a~;~}~>~%" '(1 2 3 4 5 6)) 
; Evaluation aborted on #<SB-FORMAT:FORMAT-ERROR {126651E1}>. 
; ~; not contained within either ~[...~] or ~<...~> 

C'è un modo per fare questo?

risposta

7

Si può fare questo con (format stream (format nil ...)) in cui si genera il controllo del formato per la giustificazione basata format:

CL-USER> (format nil (format nil "|~~40<~{~a~^~~;~}~~>|" '(1 2 3 4 5))) 
"|1  2   3   4   5|" 
CL-USER> (format nil (format nil "|~~40<~{~a~^~~;~}~~>|" '(1 2 3 4 5 6 7 8 9 10))) 
"|1 2 3 4 5 6 7 8 9 10|" 
CL-USER> (format nil (format nil "|~~40<~{~a~^~~;~}~~>|" '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))) 
"|1 2 3 4 5 6 7 8 9 10 11 12 13 14 15|" 

Se non si desidera generare l'intero controllo del formato per l'esterno format, è possibile utilizzare qualche variante di ~? per elaborare una stringa e alcuni argomenti in modo ricorsivo:

CL-USER> (format nil "|[email protected]?|" (format nil "~~40<~{~a~^~~;~}~~>" '(1 2 3 4 5))) 
"|1  2   3   4   5|" 
CL-USER> (format nil "|[email protected]?|" (format nil "~~40<~{~a~^~~;~}~~>" '(1 2 3 4 5 6 7 8 9 10))) 
"|1 2 3 4 5 6 7 8 9 10|" 
CL-USER> (format nil "|[email protected]?|" (format nil "~~40<~{~a~^~~;~}~~>" '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))) 
"|1 2 3 4 5 6 7 8 9 10 11 12 13 14 15|" 

Il trattamento ricorsiva con ~? consente solo di elaborare un'altra forma a controllo con una lista di argomenti; non ti dà un modo per unire una nuova stringa di formato. Sembra che il testo giustificato debba essere presente nella stringa di controllo, quindi avresti davvero bisogno di un modo per unire una stringa di controllo che già contiene il testo che desideri.

Anche se il primo di questi sembra più semplice, c'è un pericolo perché si sta inserendo il testo stampato in un'altra stringa di formato, e nel secondo caso non lo si fa. Nel primo caso, se uno di questi numeri fosse stato sostituito con direttive di formato, il formato esterno avrebbe cercato di elaborarli. Nel secondo caso, questo non succede. Come tale, penso che suggerirei il secondo.