我正在尝试创建一个函数,该函数创建用户按所需份数放入的任何列表的副本。
用户:(复制'(A)'(7)) 输出:(A 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
的任何内容都不是数字。
答案 0 :(得分:2)
虽然我可以理解为什么第一个参数是列表,但第二个参数必须是数字。一个非常简单的实现可能如下所示:
(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
和对象复制的常见警告适用。
答案 1 :(得分:1)
我建议您将列表作为&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)