質問

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

よく読みましたが、著者はすべてのパラメータをリストする方法しか知らないようです。

(defun test (a &rest b) b)

これは見やすいですが、実際にはそれほど便利ではありません。

これまでのところ、最初、2番目などを使用して、探しているパラメーターを取得するのが最善です。

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

このメソッドは10番目のパラメーターで機能しなくなったことに気付きましたが、仕様(これまでに読んだものから)が最低50をサポートしています。それらすべてにアクセスする方法を知っている。

ありがとう

役に立ちましたか?

解決

FIRST、SECONDなどのアクセサー関数は「単なる」です。 CAR / CDRまたはNTH上のユーティリティ機能。そのため、あなたの特定の質問に対する答えは「NTHまたはELTを使用」です。 (または、独自の特定のアクセサー関数を作成します)。

必要に応じて、ELEVENTHを次のように定義できます。

(defun 11(リスト)   (10番目のリスト))

ただし、& RESTリスト内の特定の引数の特定の位置を実際に気にせずに、処理したいものが0個以上ある場合は、ほとんど& REST引数を使用します。通常、LOOP、DO、またはDOLISTを使用して引数をトラバースし、各引数で何かを行う必要があります。 MAPファミリまたは(ときどき)REDUCE。

他のヒント

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

(defun test (a &rest b))
  (dolist (s b)
    (when (> s 1)
      (print s)
      (do-something-else b)))

実際、この関数は便利です。試してみるだけです。

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を教えます。

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!!)"

それらすべてを再帰的に反復処理するだけです。dolistの方が良いと思いますが、昔ながらの方法を使用するのが好きです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top