在这个程序中,我将确定放置一个女王是否会对董事会造成威胁。这将使用位置1-8(可以扩展)作为行和列。如果一列中没有任何一块,则该行的y将为0(否则为相应的y)。空板如下:((1 0)(2 0)(3 0)(4 0)(5 0)(6 0)(7 0)(8 0))
我编写了以下程序来确定给定的移动是否会导致垂直威胁:
(defun THREAT? (x y)
(not (eq
(cdr (nth (car x) y ))
0
)
)
)
这将是我的意见:
(THREAT?'(1 3)'(1 0)(2 4)(3 7)(4 3)(5 2)(6 8)(7 5)(8 1))
我的想法是,我抓住第一个参数(我正在检查的x值)的汽车使用它来访问第二个列表中的正确元素,并找到该元素的cdr,它将给我y值。然后我检查它是否为0,如果它不是0,那么它将是一个威胁。 我还没有添加检查水平和对角线的功能,所以我怀疑我可以通过条件或if语句轻松实现这一点,但我希望在继续之前清除我对此的理解中的问题
我的错误如下:
*** - EVAL:2不是函数名称;尝试使用符号
非常感谢任何和所有帮助!
修复该错误后,我发现我的程序将始终返回true。当输入'(1 3)'((1 0)...)时它将返回true,尽管(1 0)的0应该发现它等于0,返回true然后否定真如此返回是的,但我的程序总是会返回true。
编辑:修复了之前的错误消息
答案 0 :(得分:2)
要了解(threat? '(1 3) '((1 0) (2 4) (3 7) (4 3) (5 2) (6 8) (7 5) (8 1)))
返回true的原因,您必须查看nth
的定义
请注意,元素从零开始编号,而不是一个。
所以,(nth 1 '((1 0) (2 4) (3 7) ...))
会返回(2 4)
(这里我们再次:-)而不是(1 0)
。
答案 1 :(得分:0)
错误消息来自第三个参数(2 4)
,这是正确的,因为2不是函数名。
Lisp在将所有参数传递给函数之前对其进行求值。在(2 4)
的情况下,它搜索名为2的函数并失败。剩余的不带引号的参数也会发生同样的情况。
你的threat?
函数只需要两个参数,所以我想,这应该是
(threat? '(1 3) '((1 0) (2 4) (3 7) (4 3) (5 2) (6 8) (7 5) (8 1)))