LISP复制功能

时间:2016-03-09 20:55:01

标签: lisp common-lisp

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

用户:(复制'(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的任何内容都不是数字。

2 个答案:

答案 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)