Common Lisp:使用& rest参数
-
08-07-2019 - |
题
任何人都可以告诉我如何使用存储在& rest。
指定的值中的参数我已经阅读了很多内容,似乎作者只知道如何列出所有参数。
(defun test (a &rest b) b)
很高兴看到,但不是那么有用。
到目前为止我发现的最好的是使用第一个,第二个等等来获取你正在寻找的参数。
(defun test (a &rest b)
(first b))
我注意到这个方法在第十个参数处停止工作,但是规范(从我读过的内容)支持至少50个。即使机会很小,我将使用50个参数,我想知道如何访问它们。
由于
解决方案
FIRST,SECOND等访问器功能是“正好”的。实用功能在CAR / CDR或NTH之上。所以,我想,你的具体问题的答案是“使用NTH或ELT”。 (或建立自己特定的后续功能)。
如果需要,可以将ELEVENTH定义为:
(defun第十一(列表) (第10个清单))但是,我发现,当我想要做的事情有0个或更多时,我主要使用& REST参数,而不是真正关心& REST列表中给定参数的具体位置。这通常需要使用LOOP,DO或DOLIST来遍历参数并对每个参数做一些事情; MAP系列或(偶尔)REDUCE。
其他提示
Rest参数只是一个列表。您可以使用常规列表操作来处理它。
(defun test (a &rest b))
(dolist (s b)
(when (> s 1)
(print s)
(do-something-else b)))
实际上这个功能很有用。你只需要尝试一下。
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的书:
本书可以PDF和Postscript下载。它教授基本的Common Lisp。
你也可以使用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!!)"
我只是有一个递归迭代来完成所有这些,我猜dolist更好但我喜欢用老式的方式
不隶属于 StackOverflow