Parameters Common Lisp:使用&;静止参数

Parameters Common Lisp:使用&;静止参数,parameters,lisp,common-lisp,Parameters,Lisp,Common Lisp,有人能告诉我如何使用存储在&rest指定的值中的参数吗 我读过很多书,似乎作者只知道如何列出所有参数 (defun test (a &rest b) b) 这很好看到,但不是真的有用 到目前为止,我发现最好的方法是使用first、second等来获取您要查找的参数 (defun test (a &rest b) (first b)) 我注意到该方法在第十个参数处停止工作,但该规范(根据我所阅读的内容)至少支持50个参数。即使我使用50个参数的可能性很小,但我想知道如何

有人能告诉我如何使用存储在&rest指定的值中的参数吗

我读过很多书,似乎作者只知道如何列出所有参数

(defun test (a &rest b) b)
这很好看到,但不是真的有用

到目前为止,我发现最好的方法是使用first、second等来获取您要查找的参数

(defun test (a &rest b)
    (first b))
我注意到该方法在第十个参数处停止工作,但该规范(根据我所阅读的内容)至少支持50个参数。即使我使用50个参数的可能性很小,但我想知道如何访问所有参数


谢谢,Rest参数只是一个列表。您可以使用普通的列表操作来处理它

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

第一个、第二个等访问器功能是位于CAR/CDR或NTH之上的“just”实用程序功能。因此,我想,您的具体问题的答案是“使用NTH或ELT”(或构建您自己的特定访问函数)

如果需要,可以将第十一个定义为:

(第十一届(名单) (第10组名单)
然而,我发现,当有0件或更多的事情需要处理时,我通常使用&REST参数,而不是真正关心给定参数在&REST列表中的具体位置。这通常需要使用LOOP、DO或DOLIST遍历参数,并对每个参数进行处理;地图族或(偶尔)缩小。

实际上,该函数很有用。你只要试一下就可以了

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

CL-USER 2 > (test 1 2 3 4)
(2 3 4)
所以你们可以看到B只是一个参数列表。因此,每个列表和序列操作都适用。没有什么神奇的。有访问第n个元素的函数、删除元素的函数等

在通用Lisp HyperSpec中,列出了相关函数:

有关基本Lisp教程,请参阅Touretzky的书:


这本书有PDF和Postscript两种版本可供下载。它教授基本的公共Lisp。

您也可以使用解构绑定:

(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更好,但我喜欢使用老式的方式

感谢链接到温和的介绍。我浏览了前几章,我不得不说我真希望这是我读的第一本编程书。这做得很好。它是函数中的一个列表,但是将列表作为&rest传递可能不会给出您想要的行为(与C#language中的params[]相反)。初学者(比如我自己)很容易犯这样的错误:假设您的函数是带有&rest参数的递归函数。然后,在递归过程中,不能将列表作为&rest参数传递,如果需要传递列表,则必须使用apply#'yourfun…@PawelP,然后使用常规函数param传递该列表&rest参数只是一种简单的方法,可以使用可变数量的参数调用函数,而无需在每个调用站点将其包装在列表中。但对我来说,误导性的是,在函数内部,&rest参数的访问方式与列表类似,但您不能将其作为&rest参数递归地直接传递(因为你会传递一个列表,而这可能不是你想要的)。我想我不是唯一一个落入这个陷阱的初学者。所以看起来LISP在函数调用的幕后做了一些“打包”(用解析为&rest的参数制作一个列表)。当然,你的解释是正确的,我对此没有异议。