lisp - 将项目放在二维矩阵列中的第一个 nil 元素处

标签 lisp

所以我正在使用 Lisp 制作一个相对简单的游戏。

我用所有 NIL 元素创建了一个指定大小的板:

(defun make-board(rows columns) 
  (cond ((= rows 1) (list (make-list columns)))
        (t ( append (list (make-list columns)) (make-board (1- rows) columns)))))

现在我正在研究 place 函数,它将在 2D 列表的列中的第一个 NIL 元素处放置一个值:

(defun place(player column matrix)
    ;need some help here

    ;I can get the specified column, is there a better way?!
    (let (col)(get-column column matrix))
)

我可以检索指定的列:

; return the given column
(defun get-column 
   (colnum matrix)
   (mapcar (lambda (row) (nth colnum row)) matrix))

我觉得这很简单,但不幸的是,Lisp 不能很好地适应我。我也更喜欢这种没有迭代的实现,因为这是执行 Lisp 的“正确”方法。

编辑:

为了澄清,make-board 将返回如下内容:

(make-board 5 5)
((NIL NIL NIL NIL NIL) 
 (NIL NIL NIL NIL NIL) 
 (NIL NIL NIL NIL NIL) 
 (NIL NIL NIL NIL NIL)
 (NIL NIL NIL NIL NIL))

最佳答案

我不知道为什么递归应该是在 Lisp 中编程的“正确”方式。循环宏非常有用,使用它可以轻松实现您想要实现的功能。

(defun make-board(rows columns)
  (loop repeat rows collect
    (loop repeat columns collect nil)))

关于lisp - 将项目放在二维矩阵列中的第一个 nil 元素处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16000522/

相关文章:

带列表的 Lisp 递归

lisp - 检查 lisp 中是否存在某个项目

debugging - 如何从 Common Lisp REPL 提示中检查已定义函数的列表

layout - Autocad - 自动更新 lisp 生成的字段(布局计数器)

erlang - 如何在 LFE REPL 中显示长结果?

lisp - 执行存储为列表的代码

list - Racket - 列表的输出内容

lisp - 澄清玻璃市格言, "LISP programmers know the value of everything and the cost of nothing."

macros - 可以放心地忽略宏和内置宏之间的区别吗?

微 Controller 编程中的 LISP 和 Scheme