如何在Lisp中格式化REPL输出的数字精度?
我的问题是:如何在Lisp中格式化REPL输出的数字精度?,lisp,common-lisp,number-formatting,Lisp,Common Lisp,Number Formatting,我的问题是: 如何设置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 f
如何设置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上的粘液)使用通用Lisp pretty打印机 CommonLisp具有广泛的应用前景。一个很少使用的功能是一个调度表,用于控制特定类型对象的打印。请参阅如何配置此功能 函数
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))
旁注:您的
循环
可以更好地表示为dotimes
:(dotimes(i行)(dotimes(j cols)| | | | | | |#)
)而不是(i从0到(-1行)的循环)(如果你绝对想在你的边界上做算术)(1行)
。