2016-06-12 226 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")