如何在if语句中使用(或)?

时间:2016-06-12 12:08:36

标签: if-statement lisp common-lisp equality

这是我的if语句

(if (equal 1 (or 3 2 1))
    (write "ok")
    (write "wrong"))

我尝试执行以下代码:

(equal 1 (or 3 2 1))

它返回nil

在这种情况下我如何正确使用(或)?

3 个答案:

答案 0 :(得分:1)

您现在所做的就像大多数其他语言中的SELECT p.*, (SELECT count(*) FROM users s WHERE s.parentUserId = p.userid) as ChildrenCount FROM users p WHERE p.ParentUserId = 0 AND p.CategoryId = 2 ORDER BY p.userid DESC LIMIT 10 OFFSET 0 一样。那当然没有意义。您正在寻找的是

1 == (3 || 2 || 1)

默认情况下MEMBER使用EQL查找特定对象。这适用于整数等基元,但它不适用于字符串或混合整数和浮点数。您应该使用(member 1 '(3 2 1) :test #'=) - 关键字参数为您的项目指定正确的比较函数。

:TEST

答案 1 :(得分:0)

如果您愿意将表达式转换为列表,则可以使用find代替or

(defun test (x)
  (if (find x '(1 2 3))
      (format t "equal")
      (format t "not equal")))

答案 2 :(得分:0)

首先。如何在lisp上运行或操作?让我们从几个例子开始。

  • (OR 5 4 3) - > 5

  • (OR 1 2 3) - > 1

  • (或零7 8) - > 7

OR函数的输出只是第一个不等于NIL的元素。

所以在你的代码中: (等于1 3) - > NIL

此函数检查列表l

中是否存在元素n

例如

  • (查找1'(3 2 1)) - > T

  • (找出4'(3 2 1)) - > NIL

(defun findout (n l) (if (null l) nil (if (equal (car l) n) t (findout n (cdr l)) ) ) )

然后您可以像这样更改代码:

(if (findout 1 '(3 2 1))
(write "yes")
(write "no")