layout - 在 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
函数将表列表作为其参数。这里假设表格都是相同的形状,具有规则的列宽。rows
计算第一个表的数量,计数loop
行索引从 0 开始,在打印(terpri)
每个表行序列之前打印一个换行符。dolist
迭代tables
并为每个表打印第n
th 行。相同的方法可用于更不规则的数据,并带有一些额外的格式化代码。
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
需要一个表列表和一个整数参数,指定每个输出行所需的最大分组。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
推荐阅读
- arrays - Typescript:为数组类型扩展 IterableIterator 但返回一个简单类型
- c++ - 如何在 C++ 中创建对的优先级队列。弹出具有最小值的元素。默认弹出最大
- json - 放心 + 解析 JSON 文档失败
- kubernetes - How to run a command on PersistentVolume creation?
- c# - 取消 Graph 方法 GetAsync(CancellationToken t) 似乎不起作用
- java - 我的 MediatorLiveData 没有更新
- c++ - is_same 上的 Cppcheck 语法错误与模板
- jquery - 如何重新显示第二个有条件隐藏的当第一个条件改变时?
- java - Java Servlet 如何按用户角色过滤页面
- javascript - 如何在函数外的节点中从 https.request 获得响应