代码之家  ›  专栏  ›  技术社区  ›  BlueBadger

公共lisp:使用和rest参数

  •  14
  • BlueBadger  · 技术社区  · 16 年前

    有人能告诉我如何使用存储在&rest;指定值中的参数吗?

    我读了很多东西,似乎作者只知道如何列出所有参数。

    (defun test (a &rest b) b)
    

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

    到目前为止,我发现最好的方法是使用first、second等来获取您要查找的参数。

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

    我注意到这个方法在第十个参数处停止工作,但是规范(根据我读到的)至少支持50个参数。即使我使用50个参数的可能性很小,我还是想知道如何访问所有参数。

    谢谢

    5 回复  |  直到 14 年前
        1
  •  6
  •   Vatine    16 年前

    第一个、第二个等访问函数是位于car/cdr或nth之上的“just”实用函数。所以,我想,对您的特定问题的答案是“使用nth或elt”(或者构建您自己的特定访问函数)。

    如果需要,可以将第十一个定义为:

    (第十一项(清单) (第10期列表)

    但是,我发现,当有0个或更多我想做的事情时,我主要使用&rest;参数,而不是真正关心给定参数在&rest;列表中的具体位置。这通常需要使用循环、do或dolist遍历参数,并对每个参数进行处理;映射族或(偶尔)减少。

        2
  •  8
  •   Marko    16 年前

    rest参数只是一个列表。您可以使用普通的列表操作来处理它。

    (defun test (a &rest b))
      (dolist (s b)
        (when (> s 1)
          (print s)
          (do-something-else b)))
    
        3
  •  6
  •   Rainer Joswig mmmmmm    16 年前

    实际上,这个函数是有用的。你只需要试一下。

    CL-USER 1 > (defun test (a &rest b) b)
    TEST
    
    CL-USER 2 > (test 1 2 3 4)
    (2 3 4)
    

    所以你看到b只是一个参数列表。所以每个列表和序列操作都适用。没有什么魔法。有访问第n个元素的函数、删除元素的函数等。

    在通用的lisp hyperspec中,列出了相关的函数:

    14. The Conses Dictionary

    17. The Sequences Dictionary

    有关基本的Lisp教程,请参阅Touretzky的书:

    Common Lisp: A Gentle Introduction to Symbolic Computation

    这本书可以下载PDF和PostScript。它教授基本的共同口齿不清。

        4
  •  3
  •   Mark Cox    16 年前

    您还可以使用破坏绑定:

    (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!!)"
    
        5
  •  0
  •   Isaiah    14 年前

    我只是有一个递归迭代来遍历它们,我想dolist更好,但我喜欢使用老式的方法