2016-02-09 40 views
0

嘿,我试图打破一个复杂的问题,并能够添加一个元素而不在列表中创建列表将使问题更容易。我做了大量的Google搜索,并且在common-lisp中找不到任何提及的add函数。我还应该提到,我正试图将其添加到列表的末尾。是否有基于sbcl的common-lisp添加(列表)函数?

- 我看到了推宏,但不会因为任何原因编译。我收到一个非法函数调用。

- 我试过使用缺点,并且不会工作,因为它会使我正在使用的主列表中的多个列表。我需要将每个元素放在一个列表中,这样不会有帮助。

- 使用列表将产生与cons相同的问题,因为我将再次获取分层列表。

必须有一些方法可以在不创建分层列表的情况下将元素添加到列表中。我是新来的lisp,所以我很抱歉,如果这是基本的。

+0

显示代码,否则您将无法获得帮助。我不知道如何使用'push'来设法产生非法函数调用。 – Svante

回答

2

我相信你正在寻找追加。

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

+0

不知道这个功能是否可用。我正在上课的是一位臭名昭着的教授和一本可怕的书。感谢您亲切回答我简单的问题。 – Xuluu

+3

@ user3622073 common lisp记录在免费提供的[hyperspec](http://www.lispworks.com/documentation/HyperSpec/Front)中。它很大,但可以访问,我们将组织。浏览会发现你很多有用的东西。 –

+2

@ user3622073还有一些免费的在线书籍,即[Practical Common Lisp](http://gigamonkeys.com/book/)和[Common Lisp:符号计算的简洁介绍](http:// www.cs.cmu.edu/~dst/LispBook/)。 – Pascal

1

当链表(cons单元基于列表)的工作往往是有帮助的 “逆向思考”。你说过要将元素添加到列表的末尾,但将某些内容添加到链接列表的最佳方式是将其添加到前面。所以如果你能够把你的问题转到你可能会用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) 

倒车列表一次在很多情况下,你看到了很多在函数式编程的开销,我们可以住在一起,有什么东西。

相关问题