14

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

我已经阅读了很多,似乎作者只知道如何列出所有参数。

(defun test (a &rest b) b)

这很高兴看到,但并不是那么有用。

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

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

我注意到这个方法在第十个参数处停止工作,但规范(根据我读过的内容)支持至少 50 个。即使我使用 50 个参数的可能性很小,我想知道如何访问它们。

谢谢

4

5 回答 5

8

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

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

FIRST、SECOND 等访问函数是 CAR/CDR 或 NTH 之上的“只是”实用函数。所以,我想,您的具体问题的答案是“使用 NTH 或 ELT”(或构建您自己的特定访问函数)。

如果需要,可以将 ELEVENTH 定义为:

(defun第十一(名单)(第n 10名单))

然而,我发现,当我想要处理 0 件或更多件事情时,我主要使用 &REST 参数,而不是真正关心给定参数在 &REST 列表中的具体位置。这通常需要使用 LOOP、DO 或 DOLIST 来遍历参数并对每个参数做一些事情;MAP 系列或(偶尔)REDUCE。

于 2009-03-10T11:26:56.073 回答
6

其实这个功能很有用。你只需要尝试一下。

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

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

所以你看到 B 只是一个参数列表。所以每个列表和序列操作都适用。没有什么魔法。有访问第 N 个元素的函数、删除元素的函数等。

在 Common Lisp HyperSpec 中列出了相关函数:

14. 康塞斯词典

17. 序列字典

有关基本的 Lisp 教程,请查看 Touretzky 的书:

Common Lisp:符号计算的简单介绍

这本书可以 PDF 和 Postscript 下载。它教授基本的 Common Lisp。

于 2009-03-10T12:00:07.040 回答
3

您还可以使用解构绑定:

(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 回答