是否有基于 sbcl 的 common-lisp 的添加(到列表)功能?
Is there an add (to a list) function for sbcl based common-lisp?
大家好,我正在尝试分解一个复杂的问题,如果能够在不在列表中创建列表的情况下添加元素,这将使问题变得容易得多。我进行了大量的谷歌搜索,但在 common-lisp 中找不到任何提及 add 函数的地方。我还应该提到我正在尝试将它添加到列表的末尾。
-我看到了 push 宏,但无论出于何种原因,它都无法编译。我收到非法函数调用。
-我试过使用 cons,但它不起作用,因为它会在我使用的主列表中生成多个列表。我需要每个元素都在一个列表中,这样不会有帮助。
-使用 list 会产生与 cons 相同的问题,因为我将再次获得分层列表。
一定有某种方法可以在不创建分层列表的情况下将元素添加到列表中。我是 lisp 的新手,所以如果这是基本的,我深表歉意。
我相信你正在寻找追加。
CL-USER> (append '(:a :b :c) '(1 2 3))
(:A :B :C 1 2 3)
http://www.lispworks.com/documentation/HyperSpec/Body/f_append.htm#append
在使用链接列表(基于单元格的列表)时,它通常对 "think backwards" 很有帮助。您说要将元素添加到列表的末尾,但是向链表添加内容的最佳方法是将其添加到前面。因此,如果您能够解决您的问题,那么您毕竟可以使用cons
。
例如,如果我在哪里创建一个函数来构建一个范围作为列表,我可以这样做:
(defun make-range (from to result)
(if (<= from to)
(make-range (1+ from) to (cons from result))
result))
但这会导致向后的范围:
* (make-range 1 5 ())
(5 4 3 2 1)
然而,解决这个问题就像在我完成构建后反转列表一样简单。
(defun make-range2 (from to result)
(if (<= from to)
(make-range2 (1+ from) to (cons from result))
(reverse result)))
* (make-range2 1 5 ())
(1 2 3 4 5)
反转列表一次在很多情况下是我们可以忍受的开销,这在函数式编程中经常看到。
大家好,我正在尝试分解一个复杂的问题,如果能够在不在列表中创建列表的情况下添加元素,这将使问题变得容易得多。我进行了大量的谷歌搜索,但在 common-lisp 中找不到任何提及 add 函数的地方。我还应该提到我正在尝试将它添加到列表的末尾。
-我看到了 push 宏,但无论出于何种原因,它都无法编译。我收到非法函数调用。
-我试过使用 cons,但它不起作用,因为它会在我使用的主列表中生成多个列表。我需要每个元素都在一个列表中,这样不会有帮助。
-使用 list 会产生与 cons 相同的问题,因为我将再次获得分层列表。
一定有某种方法可以在不创建分层列表的情况下将元素添加到列表中。我是 lisp 的新手,所以如果这是基本的,我深表歉意。
我相信你正在寻找追加。
CL-USER> (append '(:a :b :c) '(1 2 3))
(:A :B :C 1 2 3)
http://www.lispworks.com/documentation/HyperSpec/Body/f_append.htm#append
在使用链接列表(基于单元格的列表)时,它通常对 "think backwards" 很有帮助。您说要将元素添加到列表的末尾,但是向链表添加内容的最佳方法是将其添加到前面。因此,如果您能够解决您的问题,那么您毕竟可以使用cons
。
例如,如果我在哪里创建一个函数来构建一个范围作为列表,我可以这样做:
(defun make-range (from to result)
(if (<= from to)
(make-range (1+ from) to (cons from result))
result))
但这会导致向后的范围:
* (make-range 1 5 ())
(5 4 3 2 1)
然而,解决这个问题就像在我完成构建后反转列表一样简单。
(defun make-range2 (from to result)
(if (<= from to)
(make-range2 (1+ from) to (cons from result))
(reverse result)))
* (make-range2 1 5 ())
(1 2 3 4 5)
反转列表一次在很多情况下是我们可以忍受的开销,这在函数式编程中经常看到。