2

リスト内のアトムのリストを返す関数を作成しようとしています.アトムとリストの両方を含むリストがあり、関数を実行すると、内部のアトムのリストが返されるはずです..

例えば:

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

そして、結果内の引数が true であるかどうかを試して、実行したときに次のようにします。

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

どうすればそれを実行できるかについてのアイデアはありますか? 本や参考書?

4

2 に答える 2

3

標準 CL 関数を使用して、

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

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

自分で書きたい場合は、 in を融合して、 となどの#'atom2 つの特殊な関数を作成できます。ただし、「atom」は組み込み関数の名前です。remove-atomsevery-is-atomatom

最初に書く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))))
于 2012-10-21T09:43:26.893 に答える