lisp - 可互换的条件

标签 lisp common-lisp

今天在看《符号计算简明介绍》这本书,做了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/

相关文章:

format - 使用变量作为格式指令的前缀参数

lisp - lisp 中的自定义 '+'(求和)函数

scheme - 在 Racket 方案或其他方案中解码十六进制格式字符串的惯用方法

list - 替换列表中第一次出现的元素

Emacs 组织模式 : textual reference to a file:line

emacs - 如何向 emacs 宏添加动态触摸和/或查询替换?

LISP 变量交换

lisp - 遵循 lisp 代码库中的定义

scheme - 是否有内置的 Racket 将元素作为列表重复 n 次?

utf-8 - 一次一个字节地解析 Common Lisp 中已知长度的 UTF-8 字符串