format - 漂亮地打印固定宽度字段中的值

标签 format lisp common-lisp multidimensional-array

我想在固定宽度字段中漂亮地打印一个由列名和值组成的矩阵。这是我写的代码:

(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 指令的格式用于此目的,但并没有真正理解它是如何工作的。

最佳答案

format 指令中使用 "~NN":

(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)))
                         (loop :for i :upto number-of-columns
                           :do (if (< i number-of-columns)
                                   (format stream "~10s" (nth i column-names))
                                   (terpri 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 "~10s" (aref values j k))
                                         (terpri stream))))))))
  dimensions
  column-names
  values)
PS。 let 中不需要 progn

关于format - 漂亮地打印固定宽度字段中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26894147/

相关文章:

python - 使用 datetime.strptime 转换的输入格式

scheme - 查找调用许多过程的过程的增长顺序

printing - SBCL 切换打印和读取顺序 (lisp)

lisp - Common LISP代码解释

macros - 如何在一个宏调用中分配多个常量

Python .format() 使用 class.__dict__ 时出现 KeyError

c# - 条件格式隐藏文本

c# - 如何通过示例在 C# 中格式化日期?

macros - 从 CL 宏中的字符串创建类访问器名称

macros - OnLisp 中的 CONDLET 宏对我来说并不简单