2017-09-28 73 views
0

所以我在學校學習Lisp,我必須創建的程序之一是通過使用mapcan複製remove-if-function的功能。我已經創建了該程序並且它可以正常工作,但我不瞭解輸出。這個程序爲什麼返回一個原子列表?

具體而言,如果我是運行:

(findall 'numberp '(1 a 3)) 

的輸出是:(1 3)

該程序如下:

(defun findAll (fct l) 
(cond 
     ((null l) nil) 
     ((mapcan (lambda(x) (if (funcall fct x) (list x) nil)) l)) 
    ) 
) 

我的解決方案的理解是如下所示: 「對於列表中的每個元素,調用lambda函數,如果函數fit的結果和元素x返回true,則返回元素su由括號括起來,否則返回零「

我不明白什麼是一連串的」list(x)「連續調用將如何返回一個原子列表,如(1 2)。

回答

6

不確定爲什麼你標記了你的問題SLIME,這是一個IDE。

讓我們格式化並縮進您的代碼可讀。

(defun findAll (fct l) 
    (cond 
    ((null l) nil) 
    ((mapcan (lambda (x) 
       (if (funcall fct x) 
        (list x) 
       nil)) 
      l)))) 

有可能把它寫這種方式,但通常我們有一個T條件做出明確規定的最後一句總是被調用。

(defun findAll (fct l) 
    (cond 
    ((null l) nil) 
    (t (mapcan (lambda (x) 
       (if (funcall fct x) 
        (list x) 
        nil)) 
       l)))) 

由於MAPCAN以空列表已經交易,你可以刪除COND,第一款。 findAll通常命名爲find-all

(defun find-all (fn list) 
    (mapcan (lambda (item) 
      (if (funcall fn item) 
       (list item) 
       nil)) 
      list)) 

對於每個列表L呼叫lambda函數的元素。如果函數擬合和元素的結果X返回true,則返回用括號括起的元素,否則爲零

返回對於每個列表LIST調用lambda函數的元素。如果函數FN的結果和元素ITEM返回true,則返回僅包含ITEM的列表,否則返回空列表。最終結果是lambda函數的所有結果列表(破壞性地)附加列表。

+0

但是爲什麼最終的結果會被附在一起呢?這不僅僅是一堆列表嗎? – edoreld

+1

@edoreld:MAPCAN可以做到這一點。請參閱其文檔:http://www.lispworks.com/documentation/HyperSpec/Body/f_mapc_.htm#mapcan –

相關問題