2015-12-15 12 views
6

La mia domanda è:
Come posso impostare la precisione del mio output di stampa REPL?Come si formatta la precisione delle cifre della mia uscita REPL in Lisp?

A titolo di esempio, questa semplice funzione qui:

(defun gaussian (rows cols sigma) 
    (let ((filter (make-array `(,rows ,cols))) 
    (rowOffset (/ (- rows 1) 2.0)) 
    (colOffset (/ (- cols 1) 2.0))) 
    (loop for i from 0 to (- rows 1) 
     do (loop for j from 0 to (- cols 1) 
      do (setf (aref filter i j) 
      (gaussDistVal i j rowOffset ColOffset sigma)))) 
    filter)) 

Se chiamo (gaussian 5 5 1), la mia uscita è il seguente:

#2A((0.01831564 0.082085 0.13533528 0.082085 0.01831564) 
    (0.082085 0.36787945 0.60653067 0.36787945 0.082085) 
    (0.13533528 0.60653067 1.0 0.60653067 0.13533528) 
    (0.082085 0.36787945 0.60653067 0.36787945 0.082085) 
    (0.01831564 0.082085 0.13533528 0.082085 0.01831564)) 

Mentre mi piacerebbe ottenere:

#2A((0.0 0.1 0.1 0.1 0.0) 
    (0.0 0.4 0.6 0.4 0.1) 
    (0.1 0.6 1.0 0.6 0.1) 
    (0.0 0.4 0.6 0.4 0.1) 
    (0.0 0.1 0.1 0.1 0.0)) 

Se hai la risposta, potresti anche dirmi dove sono queste "personalizzazioni REPL" Ed?

(SBCL 1.2.11; Slime su Emacs 25)

+1

Side: le vostre 'loop's potrebbero essere meglio espresso in' dotimes': '(dotimes (i rows) (dotimes (j cols) # | .... | #) '. – Svante

+1

E puoi usare' (loop for i from 0 below rows ... '(e' from 0' è opzionale) invece di '(loop per i da 0 a (- rows 1) ...' o (se si vuole assolutamente fare aritmetica sui propri limiti) '(1- righe)'. – Vatine

risposta

10

Utilizzando la bella stampante Common Lisp

Common Lisp ha una vasta pretty printer. Una caratteristica usata raramente è una tabella di distribuzione per il controllo della stampa di oggetti di un certo tipo. Vedi set-pprint-dispatch come configurare questa funzionalità.

La funzione format dispone di funzioni per l'emissione di varie forme di numeri mobili.

Questo esempio combina:

CL-USER 32 > (set-pprint-dispatch 'float 
            #'(lambda (s obj) 
             (format s "~,1F" obj))) 
NIL 

CL-USER 33 > (setf *print-pretty* t) 
T 

CL-USER 34 > #2A((0.01831564 0.082085 0.13533528 0.082085 0.01831564) 
       (0.082085 0.36787945 0.60653067 0.36787945 0.082085) 
       (0.13533528 0.60653067 1.0 0.60653067 0.13533528) 
       (0.082085 0.36787945 0.60653067 0.36787945 0.082085) 
       (0.01831564 0.082085 0.13533528 0.082085 0.01831564)) 

#2A((0.0 0.1 0.1 0.1 0.0) 
    (0.1 0.4 0.6 0.4 0.1) 
    (0.1 0.6 1.0 0.6 0.1) 
    (0.1 0.4 0.6 0.4 0.1) 
    (0.0 0.1 0.1 0.1 0.0)) 

Si può anche decidere di utilizzare temporaneamente: nota

CL-USER 37 > (let ((*print-pprint-dispatch* (copy-pprint-dispatch))) 
       (set-pprint-dispatch 'float 
            #'(lambda (s obj) 
             (format s "~,1F" obj))) 
       (pprint #2A((0.01831564 0.082085 0.13533528 0.082085 0.01831564) 
          (0.082085 0.36787945 0.60653067 0.36787945 0.082085) 
          (0.13533528 0.60653067 1.0 0.60653067 0.13533528) 
          (0.082085 0.36787945 0.60653067 0.36787945 0.082085) 
          (0.01831564 0.082085 0.13533528 0.082085 0.01831564)))) 

#2A((0.0 0.1 0.1 0.1 0.0) 
    (0.1 0.4 0.6 0.4 0.1) 
    (0.1 0.6 1.0 0.6 0.1) 
    (0.1 0.4 0.6 0.4 0.1) 
    (0.0 0.1 0.1 0.1 0.0)) 
Problemi correlati