任何人都可以告诉我如何使用存储在&rest指定的值中的参数.
我已经阅读了很多内容,似乎作者只知道如何列出所有参数.
(defun test (a &rest b) b)
这很好看,但不是很有用.
到目前为止我发现的最好的是使用第一个,第二个等等来获取你正在寻找的参数.
(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之上的"公正"效用函数.所以,我想,你的具体问题的答案是"使用NTH或ELT"(或建立你自己的特定的后续功能).
如果需要,可以将ELEVENTH定义为:
(defun第十一(列表)(第10个清单))
但是,我发现,当我想要做的事情有0个或更多时,我主要使用&REST参数,而不是真正关心&REST列表中给定参数的具体位置.这通常需要使用LOOP,DO或DOLIST来遍历参数并对每个参数做一些事情; MAP系列或(偶尔)REDUCE.
实际上这个功能很有用.你只需要尝试一下.
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. Conses词典
17.序列词典
有关基本的Lisp教程,请查看Touretzky的书:
Common Lisp:对符号计算的温和介绍
该书可以PDF和Postscript下载.它教授基本的Common Lisp.