我已經實現了這個功能。它應該檢查我們提供給它的輸入,如果它在列表中找到,屏幕上將顯示「True」。但是,它只適用於數字,如果我給它一個字符,我收到一個錯誤。如何檢查項目是否是Common Lisp中列表的成員?
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
我該如何修改它,以便它也可以查找給它的任何字符? 在此先感謝。
我已經實現了這個功能。它應該檢查我們提供給它的輸入,如果它在列表中找到,屏幕上將顯示「True」。但是,它只適用於數字,如果我給它一個字符,我收到一個錯誤。如何檢查項目是否是Common Lisp中列表的成員?
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
我該如何修改它,以便它也可以查找給它的任何字符? 在此先感謝。
簡單,使用#情商,而不是#'=,因此3號線就變成了:(if (eq item x) ...
或者,你可以使用內置的#'intersection檢查,如果任何給定的項目是在列表中,這樣的:(if (not (eq (intersection lst '(x)) nil)))
當你發現,the =
function只適用於數字。
如果你嘗試find
基礎的功能,而不是,你可能會發現,它的默認使用the eql
function爲測試提供你所尋求的行爲:
(defun element (needle haystack)
(not (null (find needle haystack))))
候補委員到find
,你應該還研究其兄弟姐妹member
和position
。在你的情況下,因爲你只是想區分已找到的項目,你應該選擇功能最少的功能。我的猜測是position
在這裏輸了,那member
和find
是等價的; member
返回從中提取的car
的列表中,而find
返回car
。在這兩個函數中,都需要提取car
。
有幾個比較操作。一般的是eq
,eql
,equal
和equalp
。在hyperspec中查看它們。
對於特定類型的對象,常常出現專門比較器,例如string=
和char=
。
最後,列表操作,有喜歡member
功能,可以通過手寫循環中解脫出來。他們採用可選test
參數,通過該參數您可以傳遞比較功能。
非常感謝。它工作完美。但只有一個問題「eq」功能與「equalp」功能之間有什麼區別? – Momed 2012-07-17 05:41:44
@Momed:http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node74.html那裏你去 – 2012-07-17 15:57:21
'eql'通常是更好的相等謂詞比'eq'(嘗試,例如,'(列表(=(/ 1 2)(/ 2 4))(當量(/ 1 2)(/ 2 4) )(eql(/ 1 2)(/ 2 4)))'看看結果是否讓你感到意外)。 – Vatine 2012-07-19 10:06:15
這是非常有趣的,謝謝(是的,它讓我感到驚訝:) – 2012-07-19 10:50:10