这是我的if语句
(if (equal 1 (or 3 2 1))
(write "ok")
(write "wrong"))
我尝试执行以下代码:
(equal 1 (or 3 2 1))
它返回nil
在这种情况下我如何正确使用(或)?
答案 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")
)