在Common Lisp中一起压缩列表 - "和"问题

Tom*_*Tom 5 macros function list common-lisp

我想要做的是创建一个函数zip(现在注意这不是作业),它同时迭代多个列表,将函数应用于每个元素列表,如下所示:

(zip f '(1 2 3) '(4 5 6) '(7 8 9)) = (list (f 1 4 7) (f 2 5 8) (f 3 6 9))
(zip f '(1 2 3 4) '(5 6) '(7 8 9)) = (list (f 1 5 7) (f 2 6 8))
Run Code Online (Sandbox Code Playgroud)

基本上,当任何列表用完元素时它会停止.这是我目前的尝试:

(defun zip (f &rest lists)
  (if (apply and lists) ; <- Here is where I think the problem is.
    (cons (apply f (mapcar #'car lists)) (zip f &rest (mapcar #'cdr lists)))
    nil))
Run Code Online (Sandbox Code Playgroud)

我想知道如何修复条件语句and,或者说是什么.我认为这个问题源于and一个宏.我还想知道是否有内置函数来执行此操作.

Dou*_*rie 16

你正在重新实施 mapcar

? (mapcar #'list '(1 2 3) '(4 5 6) '(7 8 9))
((1 4 7) (2 5 8) (3 6 9))
? (mapcar #'list '(1 2 3 4) '(5 6) '(7 8 9))
((1 5 7) (2 6 8))
? (mapcar #'+ '(1 2 3) '(4 5 6) '(7 8 9))
(12 15 18)
? (mapcar #'+ '(1 2 3 4) '(5 6) '(7 8 9))
(13 16)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你代码中想要的功能all就是and

  • 有几个选项:( notany#'endp lists)或(每个#'身份列表)让人想起. (3认同)