今天在看《符号计算简明介绍》这本书,做了4.29的练习。 这听起来像是:“使用 IF 和 COND 而不是 AND 来编写 LOGICAL-AND 的版本。”
原文是这样定义的:
(defun logical-and (x y) (and x y t))
这就是我用 cond 和 if 定义它的方式:
(defun logical-and (x y)
(cond ((and x y) t)
(t nil)))
(defun logical-and (x y)
(if (and x y) t nil))
这就是它们在练习答案中的定义方式
(defun logical-and (x y)
(cond (x (cond (y t)))))
(defun logical-and (x y)
(if x (if y t)))
所以问题是所有这些定义都相等吗?
最佳答案
所有这三种情况在行为上都是相同的。具体来说,如果 x 和 y 都非 nil,则函数返回符号 t,否则返回 nil。
在文中的定义中,它只是简单地使用了 and 运算符,并将 t 作为最后一个参数。这是有效的,因为如果 x 或 y 为 nil,则短路并返回 nil,但是如果 x 和 y 均为真,则 and 返回最后一个表达式的结果,即 t。
在您的 cond 定义中,如果 x 和 y 都为真,则第一个子句匹配,返回 t,而在所有其他情况下(即 x 或 y 为假)返回 nil。
您的 if 定义的工作方式类似,当且仅当 x 和 y 都为真时返回 t,否则返回 nil。
练习的答案是有效的,因为如果没有子句匹配,cond 返回 nil,如果条件为假且没有指定 else 子句,则 if 返回 nil。因此,cond 定义仅在两个条件都满足(即 x 为真且 y 为真)时才返回 t,而 if 定义仅在两个条件都为真时才返回 t,否则返回 nil。
关于lisp - 可互换的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23408016/