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

If statement 如何在if语句中使用(或)?,if-statement,lisp,common-lisp,equality,If Statement,Lisp,Common Lisp,Equality,这是我的if声明 (if (equal 1 (or 3 2 1)) (write "ok") (write "wrong")) 我正在尝试执行以下代码: (equal 1 (or 3 2 1)) 它返回零 在这种情况下如何正确使用(或)?如果您愿意将表达式转换为列表,可以使用查找,而不是或 (defun test (x) (if (find x '(1 2 3)) (format t "equal") (format t "not equal"))

这是我的if声明

(if (equal 1 (or 3 2 1))
    (write "ok")
    (write "wrong"))
我正在尝试执行以下代码:

(equal 1 (or 3 2 1))
它返回零


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

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

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

在大多数其他语言中,您现在所做的是
1==(3 | 2 | 1)
。这当然毫无意义。你要找的是

(成员1'(3 2 1):测试#=)
默认情况下,通过使用查找特定对象。这适用于诸如整数之类的基本体,但不适用于字符串或混合整数和浮点。您应该使用
: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

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

  • (或5 4 3)->5

  • (或1 2 3)->1

  • (或零7 8)->7

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

因此,在您的代码中: (等于13)->零

此函数检查列表l中是否存在元素n

比如说

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

  • (findout 4'(3 2 1))->NIL

(定义findout(n-l)
(如果(空l)
无
(如果(等于(车辆l)n)
T
(财政司司长)
)
)
)

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

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

)

或返回第一个真值。也就是3。3永远不等于1。你可以告诉我们你想做什么。“正确”是什么意思?在大多数其他语言中,您现在所做的是
1==(3 | | 2 | | 1)
。这当然毫无意义。我假设您正在查找
(成员1'(3 2 1):test#'=)
。它适用于整数,但不适用于字符串列表。例如:
(成员“TAG”(“TAA”“TAG”))
必须使用正确的比较运算符
=
表示数字相等,
STRING=
表示区分大小写的字符串,
STRING-EQUAL
表示不区分大小写的字符串,等等。谢谢!我在哪里可以阅读更多关于
:test#'=
构造的内容?您可以使用find,但这里的成员可能更习惯于使用find。特别是当您需要检查列表中是否为NIL时(因为find将返回NIL,这是错误的)。您的操作是正确的。我忘记了NIL的情况:/该成员更适合。它实际上是有道理的。它只需要约翰·麦卡锡的
amb
操作符,或者类似的东西。