2012-11-02 77 views
1

我試圖做一個比較,在這樣的功能:口齒不清比較

(defun omember (x l) 
    (cond 
    ((null l) nil) 
    ((eq (car l) x) t) 
    ((string< (car l) x) (omember (x (cdr l)))) 
    (t nil))) 

它只是去通過列表和搜索如果x在列表L中的元素。這個想法是,因爲傳遞的列表是排序的,你不需要搜索一個值的所有列表。只要你的價值大於元素,你可以返回零。但是,「lessthan」功能不起作用。我想「字符串<」和「<」字符串和整數。 另外,我想知道是否有是採取整數列表是字符串,並將其字符串比較的機制,因爲列表傳遞既可以是整數或字符串。

+0

是'*每種不超過*'一個變量,保存了一個函數對象? –

+0

比較之前,比較整數作爲字符串只是'prin1-to-string'。所以你可以做'(mapcar#'prin1-to-string list)',這將有效地將它強制轉換爲一個字符串列表。 –

+0

由於@wvxvw逗號實際上是一個類型0我改變了它。 – user1011346

回答

0

你可以使用apply一個函數對象適用的參數列表:

((apply *lessthan* (list (car l) x)) (do something)) 

或者funcall,作爲wvxvw指出,這並不需要建立額外的列表:

((funcall *lessthan* (car l) x) (do something)) 
+0

問題是我不知道使用什麼* lessthan *函數來使它在傳入的字符串列表以及傳入的整數列表時都有效。 – user1011346

0

在您的代碼中使用以下內容來區分不同類型:

[15]> (typep 7 'integer) 
T 
[16]> (typep "17" 'string) 
T 
0

遞歸成員周圍使用括號時出現錯誤。

(defun omember(x l) 
    (cond 
    ((null l) nil) 
    ((= (car l) x) t) 
    ((< (car l) x) (omember x (cdr l))) 
    (t nil) 
    ) 
) 

將使整數

(defun omember(x l) 
     (cond 
     ((null l) nil) 
     ((string= (car l) x) t) 
     ((string< (car l) x) (omember x (cdr l))) 
     (t nil) 
     ) 
    ) 

將使名單這項工作它工作的字符串

的名單,但似乎沒有辦法讓它兩部作品的字符串和列表的列表整數

+0

我向你展示了(在我的回答中)使用typep來區分整數和字符串。您只需將兩個函數重命名爲'omember-ints'和'omember-strings',並引入一個接口函數'omember',它將檢查參數列表的第一個元素並相應地調用正確的函數。這假設列表中的所有元素都是相同的類型。如果'x'總是一個整數,你需要將它翻譯成字符串:5 - >「5」或「00000005」或任何你的偏好。但請注意'(string <「5」「51」)'==> 1和'(string <「500」「51」)'==> 1。 –

1

如果您希望以一般方式工作,您應該通過比較函數作爲參數:

(defun member-of-sorted (item list 
         &key (test #'=) (end-test #'<) (key #'identity)) 
    (loop :for tail :on list 
     :for element := (funcall key (first tail)) 
     :until (funcall end-test item element) 
     :when (funcall test item element) 
     :do (return-from member-of-sorted tail)) 
    nil) 

我試圖使這一儘可能相似的標準member。如果你想用它不是數字,但在其他事情上,經過適當的:test:end-test參數。如果您在同一個使用位置有不同的類型,則可以在此處包裝類型化表單。

編輯:我要補充用法示例:

(member-of-sorted 3 '(1 2 3 4 5 6)) 
=> (3 4 5 6) 

(member-of-sorted 3/2 '(1 2 3 4 5 6)) 
=> NIL 

(member-of-sorted "foo" '("bar" "baz" "foo" "quux") 
        :test #'string= 
        :end-test #'string<) 
=> ("foo" "quux") 

(member-of-sorted #\D '(#\A #\C#\E #\S) 
        :test #'char= 
        :end-test #'char<) 
=> NIL 

(member-of-sorted #\D '(#\A #\C#\D #\E #\S) 
        :test #'char= 
        :end-test #'char<) 
=> (#\D #\E #\S)