任何人都可以告诉我如何使用存储在& rest。
指定的值中的参数我已经阅读了很多内容,似乎作者只知道如何列出所有参数。
(defun test (a &rest b) b)
很高兴看到,但不是那么有用。
到目前为止我发现的最好的是使用第一个,第二个等等来获取你正在寻找的参数。
(defun test (a &rest b)
(first b))
我注意到这个方法在第十个参数处停止工作,但是规范(从我读过的内容)支持至少50个。即使机会很小,我将使用50个参数,我想知道如何访问它们。
由于
答案 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中列出了相关的功能:
有关基本的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更好但我喜欢用老式的方式