2012-11-21 59 views
3

我又寫道這個函數從列表中移除x口齒不清申請追加

(defun rm-nums (x) 
    (cond 
    ((null x) nil) 
    (t (mapcar 'numberp x)))) 
然而

刪除號碼,當我進入(rm-nums '(32 A T 4 3 E)) 回報(T NIL NIL T T NIL)

我想它,而不是返回T或無,我希望它返回僅導致NIL的值[不是數字] 因此這個例子應該返回(A T E) 我應該使用mapcar沒有遞歸或迭代或bultin函數「remove-if」

我認爲它與一些名爲apply-append的東西有關,但我對此一無所知。任何幫助?

+0

'numberp'是謂詞來測試,如果事情是一個數字,這就是爲什麼你'噸的列表'和'nil'。在[Lisp Hyperspec](http://www.lispworks.com/documentation/HyperSpec/Front/index.htm)中查找'remove-if-not'。 – asm

+0

我知道numberp,但我忘了提及我不應該使用內置的「remove-if」函數 – CSawy

回答

5

我覺得你的課程的初衷這個

(defun my-remove-if (pred lst) 
    (apply #'append (mapcar (lambda (x) 
          (and (not (funcall pred x)) 
           (list x))) 
          lst))) 

它使用applyappendmapcar,就像你說的。用法示例:

(my-remove-if #'numberp '(32 a t 4 3 e)) 
=> (a t e) 

更地道的解決方案通過Rörd建議:

(defun my-remove-if (pred lst) 
    (mapcan (lambda (x) 
      (and (not (funcall pred x)) 
       (list x))) 
      lst)) 
+1

組合'(apply#'append(mapcar ...))''的效果也可以通過標準函數'(mapcan ...)'。 (呃,實際上它更像'(apply#'nconc(mapcar ...))',但是隻要你從傳遞給它的函數只返回新創建的列表,那就沒問題。) –

+0

@RördI added一個基於mapcan的解決方案。你是對的,在這種情況下,所有的清單都是新分配的或零。 –