在Lisp的列中打印嵌套列表

问题描述 投票:1回答:1

我对如何在一行,一行又一行,垂直对齐的情况下打印几个矩阵状的嵌套列表存有疑问,因此它们在一个列中一个在另一个列中出现。

我尝试了几种方法,但是没有一种起作用,并且我使用了几种文本格式,但是并没有按预期的那样输出。有什么建议吗?

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

(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)
layout formatting output lisp common-lisp
1个回答
2
投票

如果在示例数据中输入是常规的,则可以通过遍历表的行索引并遍历表本身以依次打印行来完成此操作:

(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,并为每个表格打印第n行。可以使用相同的方法处理更多不规则的数据,并添加一些额外的格式化代码。

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-groups功能中编写和使用print-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接受一个表列表和一个整数参数,该参数指定每个输出行所需的最大分组。本地iter函数建立了一个组列表,但是随着进展,每个组都在累加器中构造;请注意,此处使用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
© www.soinside.com 2019 - 2024. All rights reserved.