2015-12-15 22 views
6

Moje pytanie brzmi:
Jak ustawić precyzję wydruków REPL?Jak sformatować dokładność cyfry mojego pliku REPL w Lisp?

Jako przykład, ta prosta funkcja tutaj:

(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)) 

Jeśli zadzwonię (gaussian 5 5 1), mój wynik jest następujący:

#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)) 

Zważywszy chciałbym dostać:

#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)) 

Jeśli masz odpowiedź, możesz również powiedzieć, gdzie znajdują się te "dostosowania REPL" Ed?

(SBCL 1.2.11; Slime na Emacs 25)

+1

Side: twoje 'loop's może być lepiej wyrażone jako' dotimes': '(dotimes (i rows) (dotimes (j cols) # | .... | #) '. – Svante

+1

Możesz użyć' (pętla for i od 0 poniżej wierszy ... '(i' od 0' jest opcjonalne) zamiast '(pętla dla i od 0 do (- wiersze 1) ...' lub (jeśli absolutnie chcesz robić arytmetyczną na twoich granicach) '(1-wiersze)'. – Vatine

Odpowiedz

10

Korzystanie z Common Lisp ładną drukarkę

Common Lisp ma rozległą pretty printer. Rzadko używaną funkcją jest tablica wysyłkowa do kontrolowania drukowania obiektów określonego typu. Zobacz set-pprint-dispatch, jak skonfigurować tę funkcję.

Funkcja format posiada funkcje do wyprowadzania różnych form liczb zmiennoprzecinkowych.

Przykład ten łączy w sobie zarówno:

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)) 

One mogą też chcą go używać tymczasowo: notatka

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))