2011-01-06 22 views
6

Bu soru muhtemelen bir facepalm ile bitecek, ama bir süredir denedim ve hala hiperspec okumaya rağmen sıkışıp kaldım.biçimi - Bir tablo yazdırma ile yardım

Temelde ne yapmak istediğinizi

(format t "~{|~{ ~5d~}|~%~}" '((1 23 2 312) (23 456 1 7890))) 

gibi bir şey ama yerine sabit kodlama listeden hesaplanmalıdır 5 (herhangi bir iç içe listeden + 1'den en uzun elemanın uzunluğu) vermek üzere bir şeydir gibi

| 1 23  2 312| 
| 23 456  1 7890|  

Belki burada yol çok karmaşık düşünüyorum ve istediğim şeyi yapmak için daha kolay bir yolu yoktur, ama ben dışarı alamayan bir zihinsel köşeye kendimi koştum düşünüyorum. format sihirli biçimi dize kendisini gidip diğer döngüleri kullanabilir veya oluşturmasına izin: longest-member tanımı okuyucuya bir alıştırma olarak bırakılmıştır

(defun facepalm-printer (lol) 
    (format t (format nil "~~{|~~{ ~~~ad~~}|~~%~~}" 
        (longest-member lol)) 
      lol)) 

+0

İstediğinizi yapmak için bir '~' kontrol olabilir, ancak bunu 2 adımda yapabilirim: en geniş elemanı hesaplayın, ardından bunu kullanarak bir biçim dizesi (biçim!) Oluşturun, ardından arayın tabloyu oluşturmak için format. Yani, 1 satırlı bir işlev yerine 3 satırlı bir işlev. :-) – Ken

cevap

3

width bağlıdır, o zaman bu yapabilir:

(format t "~{|~{ ~Vd~}|~%~}" width '((1 23 2 312) (23 456 1 7890))) 

5 V ile ikame edilmiş ve width FORMAT/

bir argüman olarak eklendi düzenleme: özgün yanıt, iç içe doğrular için doğru hesaplanmadı

Bir biçim denetiminde V denetim dizesi, herhangi bir sabit değer yerine kullanılabilir; bu, karşılık gelen değerin argüman listesinden alınacağını gösterir.

Bu deneyebilirsiniz:

(setf width 5) 
(setf data '((1 23 2 312) (23 456 1 7890))) 

(format t "~{|~{ ~{~Vd~}~}|~%~}" 
    (mapcar #'(lambda (r) (mapcar #'(lambda (v) (list width v)) r)) data)) 

Bu biçim dizesi her değeri önce istenen genişliğe gerektirir. (mapcar ...) ifadesi bunu gerçekleştirir.

+1

+1 Güzel cevap. Maksimum genişlik en az hesaplanması kolaydır (en azından tüm pozitifler pozitifse). Örneğin, '(1+ (# uygulanacak maksimum '(mapcar #' (lambda (x) (kat (log x 10))) '(1 10 100 1000 200000))))'. –

+0

Bu çözümü bilinçli olarak reddettim çünkü genişliğin argüman listesine eklenmesi, gereksiz yere karmaşık ve bana israf etmiş gibi görünüyor. – Svante

+0

+1 ve V'den beri kabul ettiğim şey tam olarak aradığım şeydi (ve tekrar tekrar göründüğü gibi). Svanet'in amacını görüyorum, o yüzden +1 orada da var :) –

5

Sana iki seçenek olduğunu düşünüyorum. Gerekli genişliği varsayarsak