【发布时间】:2019-06-22 13:06:45
【问题描述】:
我目前正在学习 Common Lisp,作为该过程的一部分,我正在尝试实现一个通用的井字游戏,其中棋盘可以是任何奇数大小(所以有一个中心正方形)。我到了我正在检查获胜者的地方,并且正在使用这个函数来检查行或列是否有获胜者。
(defun straight-winner-p (board start size)
(let ((row-player (aref board start 0))
(row-count 0)
(col-player (aref board 0 start))
(col-count 0))
(loop for step from 0 to (- size 1) do
(if (equal
(aref board start step)
row-player)
(incf row-count))
(if (equal
(aref board step start)
col-player)
(incf col-count))
)
(format t "row ~a, col ~a~%" row-count col-count)))
格式调用最终将被替换为检查播放器是否为零且计数等于大小。无论如何,我想用宏替换这两个 if。所以,它会是这样的
(check row start step)
宏会生成 if 语句
(if (equal
(aref board start step)
row-player)
(incf row-count))
然后使用 (check col step start) 调用相同的宏。我似乎无法让宏从行生成行数和行播放器。你会怎么做?
【问题讨论】:
-
如果编程的话,这不是一种非常 Lisp 的方式。
-
这里为什么需要宏?只需将其设为函数并像往常一样传递数据即可。如果使用不当,宏会使您的代码更难理解。
-
我知道这是一种相当愚蠢的做事方式。我故意做一些奇怪的事情来应对我不知道如何用语言做的情况。这里没有充分的理由使用宏,但我想知道怎么做。
-
您至少可以使用 emacs 并正确缩进您的代码(即像 emacs 一样)。另外,您是否缺少
do?我在indented version 中添加了一个。
标签: common-lisp