標準 CL 関数を使用して、
[3]> (remove-if-not #'atom '(1 2 (12) +))
(1 2 +)
[6]> (every #'atom (remove-if-not #'atom '(1 2 (12) +)))
T
自分で書きたい場合は、 in を融合して、 となどの#'atom
2 つの特殊な関数を作成できます。ただし、「atom」は組み込み関数の名前です。remove-atoms
every-is-atom
atom
最初に書く1つの方法は
(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 固有の翻訳と見なすことができます。
そして2番目の機能:
(defun every-is-atom (xs)
(dolist (x xs T)
(if (not (atom x))
(return-from every-is-atom NIL))))