Common Lisp:使用& rest参数

时间:2009-03-10 11:10:26

标签: parameters lisp common-lisp

任何人都可以告诉我如何使用存储在& rest。

指定的值中的参数

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

(defun test (a &rest b) b)

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

到目前为止我发现的最好的是使用第一个,第二个等等来获取你正在寻找的参数。

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

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

由于

5 个答案:

答案 0 :(得分:8)

Rest参数只是一个列表。您可以使用常规列表操作来处理它。

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

答案 1 :(得分:6)

FIRST,SECOND等访问器功能是CAR / CDR或NTH之上的“公正”效用函数。所以,我想,你的具体问题的答案是“使用NTH或ELT”(或建立你自己的特定访问功能)。

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

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

答案 2 :(得分: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. The Conses Dictionary

17. The Sequences Dictionary

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

Common Lisp: A Gentle Introduction to Symbolic Computation

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

答案 3 :(得分: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!!)"

答案 4 :(得分:0)

我只是有一个递归迭代来完成所有这些,我猜dolist更好但我喜欢用老式的方式