任何人都可以告诉我如何使用存储在& 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中列出了相关的功能:

14。 Conses词典

17。序列词典

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

Common Lisp:一个关于符号计算的温和介绍

本书可以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更好但我喜欢用老式的方式

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top