layout - 在 Lisp 中打印列中的嵌套列表

标签 layout formatting output lisp common-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)

最佳答案

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

(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 函数将表列表作为其参数。这里假设表格都是相同的形状,具有规则的列宽。计算第一个表的行数,循环计算从 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

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

关于layout - 在 Lisp 中打印列中的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61551936/

相关文章:

vim tabular 只在第一场比赛就行?

c - sscanf 用于格式化文件中的字符串

c++ - 我将如何从二叉树写入 txt 文件?

java - GridBagLayout 2 JPanels - 比其他宽度小一个

下方和上方的 Android 布局

c++ - 你如何设置 cout 语言环境来插入逗号作为千位分隔符?

date - 如何从json中获取AngularJS日期

android - 抽屉导航 Android API 特定的布局属性

css - 如何使用 CSS 将图像放置在文本旁边

linux - Node JS : Executing command lines and getting outputs asynchronously