首页 > 解决方案 > 在 Lisp 的列中打印嵌套列表

问题描述

我对如何连续打印几个类似矩阵的嵌套列表有疑问,一行接一行,垂直对齐,以便它们出现在另一列之下。

我尝试了几种方法,但都不起作用,我使用了几种文本格式,但没有按预期出现。有什么建议么?

我更新了疑问,希望现在您能理解。

(defun tabA()
  '((X 0 0 0 0 0 0) 
    (0 0 0 X 0 0 0) 
    (0 0 0 0 0 0 0) 
    (0 0 0 T 0 0 0)  
    (0 0 0 0 0 0 0)))

(defun tabB()
  '((0 0 0 0 X 0 0) 
    (0 0 0 0 0 0 0) 
    (0 T 0 0 0 0 0) 
    (0 0 0 X 0 0 0)  
    (0 0 0 0 0 0 0)))

(defun tabC()
  '((0 0 0 T 0 0 0) 
    (0 0 0 0 0 0 0) 
    (0 0 X 0 0 X 0) 
    (0 0 0 0 0 0 0)  
    (0 0 0 0 0 0 0)))

(defun states ()
  (list (tabA) (tabB) (tabC)))

(defun test-print ()
  (format T "~%--- Result ---")
  (mapcar #'(lambda(x) (print-state x)) (states)))

(defun print-state (x)
  (format T "~%")
  (mapcar (lambda (x) (format T "~@T~@T~@T~@T~@T ~A ~%" x)) x)
  (format NIL ""))

  ;;test print
  (test-print)

你可以像这个例子一样在ideone.com中测试并查看结果

--- Result ---
  (X 0 0 0 0 0 0) 
  (0 0 0 X 0 0 0) 
  (0 0 0 0 0 0 0) 
  (0 0 0 T 0 0 0) 
  (0 0 0 0 0 0 0) 

  (0 0 0 0 X 0 0) 
  (0 0 0 0 0 0 0) 
  (0 T 0 0 0 0 0) 
  (0 0 0 X 0 0 0) 
  (0 0 0 0 0 0 0) 

  (0 0 0 T 0 0 0) 
  (0 0 0 0 0 0 0) 
  (0 0 X 0 0 X 0) 
  (0 0 0 0 0 0 0) 
  (0 0 0 0 0 0 0) 

我想将这些列表打印成两列或三列,就像这个例子

--- Result ---
(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0) 
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0) 
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0) 
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0) 
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)

(0 0 0 T 0 0 0) 
(0 0 0 0 0 0 0) 
(0 0 X 0 0 X 0) 
(0 0 0 0 0 0 0) 
(0 0 0 0 0 0 0)

标签: layoutformattingoutputlispcommon-lisp

解决方案


如果输入像示例数据中一样是规则的,则可以通过遍历表的行索引并遍历表本身以按顺序打印行来简单地完成:

(defun print-tables (tables)
  (let ((rows (length (first tables))))
    (loop for n below rows do
         (terpri)
         (dolist (table tables)
           (format t "~A  " (elt table n))))))

print-tables函数将表列表作为其参数。这里假设表格都是相同的形状,具有规则的列宽。rows计算第一个表的数量,计数loop行索引从 0 开始,在打印(terpri)每个表行序列之前打印一个换行符。dolist迭代tables并为每个表打印第nth 行。相同的方法可用于更不规则的数据,并带有一些额外的格式化代码。

SCRATCH> (print-tables (list (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0)  (0 0 0 T 0 0 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0)  (0 0 X 0 0 X 0)  
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
NIL

上面的代码只是在单行表格中按顺序打印表格,但是对于大量表格,明智地对表格进行分组会很好。可以在使用上述函数的函数中group-tables编写和使用函数。print-groupsprint-tables

(defun group-tables (grouping tables)
  (labels ((iter (tables group)
             (cond ((null tables)
                    (list group))
                   ((= (length group) grouping)
                    (cons group
                          (iter tables '())))
                   (t
                    (iter (rest tables)
                          (append group (list (first tables))))))))
    (iter tables '())))

这里group-tables需要一个表列表和一个整数参数,指定每个输出行所需的最大分组。localiter函数建立了一个组列表,但是每个组都在一个累加器中随着进度的进行而构建;请注意,append此处用于保持表格与输入的顺序相同。

(defun print-groups (grouping tables)
  (dolist (group (group-tables grouping tables))
    (print-tables group)
    (terpri)))

这里print-groups只是用来group-tables将表格收集成组,然后dolist用来挑选出每个单独的组供print-tables函数处理。

示例 REPL 交互:

SCRATCH> (print-groups 3 (list (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0)  (0 0 0 T 0 0 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0)  (0 0 X 0 0 X 0)  
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
NIL
SCRATCH> (print-groups 2 (list (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0)  
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  

(0 0 0 T 0 0 0)  
(0 0 0 0 0 0 0)  
(0 0 X 0 0 X 0)  
(0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  
NIL
SCRATCH> (print-groups 3 (list (tabA) (tabB) (tabC) (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0)  (0 0 0 T 0 0 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0)  (0 0 X 0 0 X 0)  
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  

(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0)  (0 0 0 T 0 0 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0)  (0 0 X 0 0 X 0)  
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
NIL
SCRATCH> (print-groups 4 (list (tabA) (tabB) (tabC) (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0)  (0 0 0 0 X 0 0)  (0 0 0 T 0 0 0)  (X 0 0 0 0 0 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 X 0 0 0)  
(0 0 0 0 0 0 0)  (0 T 0 0 0 0 0)  (0 0 X 0 0 X 0)  (0 0 0 0 0 0 0)  
(0 0 0 T 0 0 0)  (0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 T 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  

(0 0 0 0 X 0 0)  (0 0 0 T 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
(0 T 0 0 0 0 0)  (0 0 X 0 0 X 0)  
(0 0 0 X 0 0 0)  (0 0 0 0 0 0 0)  
(0 0 0 0 0 0 0)  (0 0 0 0 0 0 0)  
NIL

推荐阅读