Common Lisp:& restパラメーターの使用
-
08-07-2019 - |
質問
& 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には、関連する関数がリストされています:
基本的なLispチュートリアルについては、Touretzkyの本をご覧ください:
この本は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の方が良いと思いますが、昔ながらの方法を使用するのが好きです