【发布时间】:2014-11-12 18:40:07
【问题描述】:
我想在固定宽度的字段中漂亮地打印一个由列名和值组成的矩阵。这是我写的代码:
(defstruct
(matrix
(:print-function (lambda (my-matrix stream depth)
(declare (ignore depth))
(let* ((dimensions (matrix-dimensions my-matrix))
(column-names (matrix-column-names my-matrix))
(values (matrix-values my-matrix))
(number-of-rows (nth 0 dimensions))
(number-of-columns (nth 1 dimensions)))
(progn (loop :for i :upto number-of-columns
:do (if (< i number-of-columns)
(format stream (nth i column-names))
(format stream "~%")))
(loop :for j :upto (1- number-of-rows)
:do (loop :for k :upto number-of-columns
:do (if (< k number-of-columns)
(format stream (write-to-string (aref values j k)))
(format stream "~%")))))))))
dimensions
column-names
values)
但是,如果我运行这段代码,我会得到以下结果:
CL-USER> (make-matrix :dimensions '(3 2)
:column-names '("Michael" "Alexandra")
:values (make-array '(3 2) :initial-contents '((54 34) (65 78) (49 38))))
MichaelAlexandra
5434
6578
4938
如何编辑我的 :print-function(更具体地说是它的格式部分),以便在固定宽度的字段中整齐地打印列名和值?
我读到有一个 ~w 格式的指令用于此目的,但并没有真正掌握它是如何工作的。
【问题讨论】:
-
您可能会从 Hyperspec 的 this question、this chapter 和 this section 中获得里程。
标签: format lisp common-lisp multidimensional-array