我想寫一個函數,返回一個列表中的原子列表,可以說我有一個列表,它既有原子也有列表,當我運行函數時它應該返回一個列表原子裏面..使用lisp函數
。例如:
(func '(2 34 5 (12) 7 (A B C) +))
-> (2 34 7 +)
我想嘗試,如果結果裏面的論據是真實的,這樣當我運行:
(ATOM ((func '(2 34 5 (12) 7 (A B C) +)))
->T
任何想法如何我可以去呃?書籍或參考?
我想寫一個函數,返回一個列表中的原子列表,可以說我有一個列表,它既有原子也有列表,當我運行函數時它應該返回一個列表原子裏面..使用lisp函數
。例如:
(func '(2 34 5 (12) 7 (A B C) +))
-> (2 34 7 +)
我想嘗試,如果結果裏面的論據是真實的,這樣當我運行:
(ATOM ((func '(2 34 5 (12) 7 (A B C) +)))
->T
任何想法如何我可以去呃?書籍或參考?
使用標準的CL功能,
[3]> (remove-if-not #'atom '(1 2 (12) +))
(1 2 +)
[6]> (every #'atom (remove-if-not #'atom '(1 2 (12) +)))
T
如果你想給他們自己寫的,你可以融合#'atom
中有兩個專門的功能,比如remove-atoms
和every-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))))
所以你想要一個函數,只返回列表中存在的原子值作爲參數傳遞?
是否這樣?
(defun func (lst)
(cond
((null lst) '())
((atom (first lst))
(cons (first lst) (func (rest lst))))
(t (func (rest lst)))))
並非特異性Common Lisp的,但仍然是一個良好的閱讀在我看來:SICP