2012-10-21 84 views
2

我想寫一個函數,返回一個列表中的原子列表,可以說我有一個列表,它既有原子也有列表,當我運行函數時它應該返回一個列表原子裏面..使用lisp函數

。例如:

(func '(2 34 5 (12) 7 (A B C) +)) 
-> (2 34 7 +) 

我想嘗試,如果結果裏面的論據是真實的,這樣當我運行:

(ATOM ((func '(2 34 5 (12) 7 (A B C) +))) 
->T 

任何想法如何我可以去呃?書籍或參考?

回答

3

使用標準的CL功能,

[3]> (remove-if-not #'atom '(1 2 (12) +)) 
(1 2 +) 

[6]> (every #'atom (remove-if-not #'atom '(1 2 (12) +))) 
T 

如果你想給他們自己寫的,你可以融合#'atom中有兩個專門的功能,比如remove-atomsevery-is-atom。但「原子」是built-in function atom的名稱。先寫

一種方法是

(defun remove-atoms (xs &aux (ys (list 1))) 
    (let ((p ys)) 
    (dolist (x xs (cdr ys)) 
     (if (atom x) (setf (cdr p) (list x) p (cdr p)))))) 

此使用破壞性更新,這不違反函數式編程這裏的精神,因爲它是用來建立一個自上而下的方式結果列表在本地,作爲一種實現技術。這可以被看作是Common-LISP –特定翻譯的一般功能tail-recursive-modulo-cons代碼來自其他答案。

而第二個功能:

(defun every-is-atom (xs) 
    (dolist (x xs T) 
    (if (not (atom x)) 
     (return-from every-is-atom NIL)))) 
2

所以你想要一個函數,只返回列表中存在的原子值作爲參數傳遞?

是否這樣?

(defun func (lst) 
    (cond 
    ((null lst) '()) 
    ((atom (first lst)) 
    (cons (first lst) (func (rest lst)))) 
    (t (func (rest lst))))) 

並非特異性Common Lisp的,但仍然是一個良好的閱讀在我看來:SICP