2015-12-15 1 views
6

私の質問は
どのようにREPLプリント出力の精度を設定できますか?一例として、LispでREPL出力の桁精度をどのようにフォーマットするのですか?

、ここではこのシンプルな機能:

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

私は(gaussian 5 5 1)を呼び出すと、私の出力は以下の通りです:

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

回答がある場合は、これらの「REPLのカスタマイズ」がどこにあるか教えてくださいエド?

(SBCL 1.2.11。のEmacs 25にスライム)

+1

サイドノート:あなた 'loop'sが良いdotimes''として表現されるかもしれないが: '( – Svante

+1

'(行の下にある0行目のループ... 'を使うことができます(' from 0'はオプションです) '(0〜( - rows 1)...)または'(あなたの境界の算術演算を絶対にしたい場合は) '(1行)の代わりに' ' – Vatine

答えて

10

共通Lispは広範pretty printerを有しているCommon Lispのプリティプリンタを使用。めったに使用されない機能は、特定のタイプのオブジェクトの印刷を制御するためのディスパッチテーブルです。この機能の設定方法については、set-pprint-dispatchを参照してください。

機能formatには、さまざまな形式の浮動小数点数を出力する機能があります。

この例では、両方を兼ね備え:

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

1つはまた、一時的にそれを使用することもできます。

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)) 
関連する問題