LISP 复制函数

LISP copy function

我正在尝试创建一个函数,根据所需的副本数创建用户放入的任何列表的副本。

用户:(复制'(A)'(7)) 输出:(A A A A A A A)

(defun copy (x y)
  (cond ((-1 counter)
         nil)
        (T
         (list (cons (car x) (cdr x)))
               copy
               (cdr x)))

我正在尝试设置一个计数器并通过递减计数器在当前列表中创建一个新列表。到目前为止,计数器是伪代码。
这是我想弄清楚的计数器。

(defun count (y)
  (let ((a y))
    (- a 1)))

我得到的错误是我输入 y 的任何内容都不是数字。

虽然我能理解为什么第一个参数是一个列表,但第二个参数必须是一个数字。一个非常简单的实现可能如下所示:

(defun copy (lst count)
  (when (> count 0)
    (append (copy-list lst) (copy lst (1- count)))))

测试:

CL-USER> (copy '(A) 7)
(A A A A A A A)
CL-USER>  (copy '(A B C) 7)
(A B C A B C A B C A B C A B C A B C A B C)

有关使用 append 和对象复制的常见注意事项适用。

我建议将您的列表作为 &rest 参数传递,并使用 loop:

(defun repeat (n &rest items)
  (loop repeat n append items))

测试

CL-USER> (repeat 10 0 1 2)
(0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2)