我的问题是:
如何设置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上的史莱姆)
使用Common Lisp漂亮的打印机
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))
人们可能也想暂时使用它:
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))