2016-06-12 208 views
-1

这里是我的if语句如何使用(或)在if语句中?

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

我试图执行下面的代码:

(equal 1 (or 3 2 1)) 

它返回零

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

+1

或返回第一个真正的价值。这是3. 3永远不等于1. 你可能想告诉我们你想要做什么。 “正确”是什么意思? –

+4

你现在正在做的是像大多数其他语言的'1 ==(3 || 2 || 1)'。这当然没有意义。我假设你正在寻找'(成员1'(3 2 1):test#'=)'。 – jkiiski

+0

它适用于整数,但不适用于字符串列表。例如:'(成员“TAG”'(“TAA”“TAG”))' –

回答

0

如果您愿意将表达式转换为列表,您可以使用find而不是or

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

你可以使用find,但成员可能会更习惯于这里。特别是如果你需要检查列表中的NIL(因为find会返回NIL,这是错误的)。 –

+0

你是对的。我忘了NIL案例:/ 该成员更适合。 – cb0

1

你现在在做什么就像1 == (3 || 2 || 1)在其他大多数语言。这当然没有意义。什么你要找的是

(member 1 '(3 2 1) :test #'=) 

默认情况下MEMBER使用EQL查找特定对象。这适用于诸如整数之类的基元,但它不适用于字符串或混合整数和浮点数。您应该使用:TEST关键字参数为您的项目的任何类型指定正确的比较函数。

(member 1.0 '(3 2.0 1) :test #'=) ; numeric 
(member "fOo" '("foo" "FOO" "fOo") :test #'string=) ; case-sensitive 
(member "foo" '("FOO" "BAR" "QUUX") :test #'string-equal) ; case-insensitive 
+0

它确实有道理。它只需要John McCarthy的“amb”运算符,或者类似的东西。 – Kaz

0

首先。如何真正地运作或运作lisp?我们从几个例子开始。

  • (OR 5 4 3) - > 5

  • (OR 1 2 3) - > 1

  • (OR零7 8) - > 7

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

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

此功能检查如果一个元素在一个列表升

例如正存在

  • (findout 1 '(3 2 1)) - > T

  • (查找4'(3 2 1)) - >无

(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")