14

&rest で指定された値に格納されているパラメーターを操作する方法を教えてください。

私はたくさん読んだことがありますが、作成者はすべてのパラメーターをリストする方法しか知らないようです。

(defun test (a &rest b) b)

これは見やすいですが、実際にはそれほど役に立ちません。

これまでに見つけた最良の方法は、first、second などを使用して、探しているパラメーターを取得することです。

(defun test (a &rest b)
    (first b))

このメソッドは 10 番目のパラメーターで動作を停止することに気付きましたが、仕様 (私が読んだものから) は最小 50 をサポートしています。50 のパラメーターを使用する可能性はわずかですが、方法を知りたいです。それらすべてにアクセスします。

ありがとう

4

5 に答える 5

8

Rest パラメータは単なるリストです。通常のリスト操作を使用して処理できます。

(defun test (a &rest b))
  (dolist (s b)
    (when (> s 1)
      (print s)
      (do-something-else b)))
于 2009-03-10T11:14:44.013 に答える
6

実際、その機能は便利です。試してみるだけです。

CL-USER 1 > (defun test (a &rest b) b)
TEST

CL-USER 2 > (test 1 2 3 4)
(2 3 4)

したがって、B は単なる引数のリストであることがわかります。したがって、すべてのリスト操作とシーケンス操作が適用されます。魔法は何もありません。NTH 要素にアクセスする関数、要素を削除する関数などがあります。

Common Lisp HyperSpec には、関連する関数がリストされています。

14. コンセス辞書

17. シーケンス辞書

Lisp の基本的なチュートリアルについては、Touretzky による本を参照してください。

Common Lisp: シンボリック計算のやさしい入門

この本は PDF と Postscript でダウンロードできます。基本的な Common Lisp を教えます。

于 2009-03-10T12:00:07.040 に答える
3

destructuring-bind を使用することもできます。

(defun my-function (&rest arguments)
  (destructuring-bind (a b &rest c) arguments
    (format nil "~A,~A followed with ~A" a b c)))

CL-USER> (my-function 1 2 "Give" 'me "more" 'arguments!!)
==> "1,2 followed with (Give ME more ARGUMENTS!!)"
于 2009-03-10T13:41:44.160 に答える
0

私はそれらすべてを通過するために再帰的な繰り返しを持っています.dolistの方が優れていると思いますが、昔ながらの方法を使用するのが好きです.

于 2010-09-28T20:44:27.567 に答える