我不得不在每一個我寫過的Lisp程序中重新實現一個特定的函數。由於這個功能非常有用,它之前必須已經實施。我希望它是衆所周知的。也許它是Common Lisp標準庫的一部分。它叫什麼,它來自哪個庫?滿足謂詞的函數收集子樹的標準名稱?
(defun unknown-function (predicate tree)
(loop for item in tree
if (funcall predicate item) collect item
else if (listp item) append (unknown-function predicate item)))
它下降通過一棵樹,並創建該樹中所有滿足謂詞的節點的平面列表。
通常,您嘗試執行的任務是通過組合兩個不同的函數解決的,一個是平坦化樹,另一個是過濾來自該列表的元素。在Common Lisp中沒有平坦的原始函數(但是如果你google了,你會發現很多定義,例如見[這個鏈接](http://stackoverflow.com/questions/2680864/how-to-remove-nested) -parentheses-in-lisp)),而對於過濾器函數,可以使用remove-if或remove-if-not([manual](http://www.lispworks.com/documentation/HyperSpec/Body/f_rm_rm.htm #刪除-IF))。 – Renzo
'flatten'和'remove-if-not'不能產生這個函數,因爲謂詞可以從樹中選擇子列表,而flatten會在謂詞有機會看到它們之前擺脫所有的子列表。 –