LISP复制函数
我正在尝试创建一个函数,该函数创建用户放入的任何列表的副本,该列表的副本数为所需的副本数 使用者:(复制(A)’(7)) 输出:(A) 我试图设置一个计数器,并通过递减计数器在当前列表中创建一个新列表。到目前为止,计数器是伪代码。LISP复制函数,lisp,common-lisp,Lisp,Common Lisp,我正在尝试创建一个函数,该函数创建用户放入的任何列表的副本,该列表的副本数为所需的副本数 使用者:(复制(A)’(7)) 输出:(A) 我试图设置一个计数器,并通过递减计数器在当前列表中创建一个新列表。到目前为止,计数器是伪代码。 这就是我想弄清楚的柜台 (defun count (y) (let ((a y)) (- a 1))) 我得到的错误是,我在y中输入的任何参数都不是数字。虽然我可以理解为什么第一个参数是列表,但第二个参数必须是数字。一个非常简单的实现可能如下所示: (d
这就是我想弄清楚的柜台
(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
参数传递,并使用循环
:
(defun repeat (n &rest items)
(loop repeat n append items))
试验
出于好奇,当一个参数只是一个元素,而另一个只是一个数字时,为什么要以列表的形式传递参数呢?两者都可以吗?假设一个用户想要:user:(abcde)并且他们想要每个元素被复制这么多次(10511)。所以输出应该是(A B B C D E)。当然是。:)你只需要在你的问题中明确这个要求。你的第一个例子不一定假设这种情况。是的,我对lisp不太熟悉,我发现处理新材料的最好方法是一次分解问题的一个方面。我讨厌引入一个完整的问题并得到一个我无法理解的复杂答案=p第二个问题是否应该类似于数组维度?(但我怀疑这是目的。)lisp如何定义什么是int和什么是字符串?我使用java talk,因为我对lisp非常陌生。
(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)