【问题标题】:&rest in common lisp&rest in common lisp
【发布时间】:2020-07-17 04:00:53
【问题描述】:

我对@9​​87654322@ 在普通 lisp 中的作用感到困惑。 这可能是一个代表我的意思的例子:

(defmacro switch (value &rest pairs)
             .... 
)

&rest 和 pair 到底是什么意思?

【问题讨论】:

标签: function macros lisp common-lisp


【解决方案1】:

函数(或宏)定义中的最后一个参数可以以&rest 开头。在这种情况下,当调用函数(或宏)时,所有未绑定到前一个参数的参数都被收集到一个绑定到最后一个参数的列表中。这是一种为函数或宏提供未指定数量的参数的方法。

例如:

CL-USER> (defun f (a &rest b)
           (list a (mapcar #'1+ b)))
F
CL-USER> (f 1 2 3 4 5)
(1 (3 4 5 6))
CL-USER> (f 1)
(1 NIL)
CL-USER> (f 1 2 3)
(1 (3 4))
CL-USER> (defmacro m (f g &rest pairs)
           (let ((operations (mapcar (lambda (pair) (list g (first pair) (second pair))) pairs)))
             `(,f (list ,@operations))))
M
CL-USER> (macroexpand-1 '(m print + (1 2) (3 4) (5 6)))
(PRINT (LIST (+ 1 2) (+ 3 4) (+ 5 6)))
T
CL-USER> (m print + (1 2) (3 4) (5 6))
(3 7 11)

请注意,如果没有剩余参数,则传递给最后一个参数的列表为空。

【讨论】:

  • 好吧,与其说是“无限”不如说是“未指定”,参数列表的长度是有实现限制的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多