【问题标题】:Is there an add (to a list) function for sbcl based common-lisp?是否有基于 sbcl 的 common-lisp 的添加(到列表)功能?
【发布时间】:2016-02-13 06:08:34
【问题描述】:

大家好,我正在尝试解决一个复杂的问题,并且能够在不创建列表的情况下添加元素将使问题变得更容易。我已经进行了大量的谷歌搜索,但在 common-lisp 中找不到任何关于 add 函数的内容。我还应该提到我正在尝试将其添加到列表的末尾。

-我已经看到了 push 宏,但无论出于何种原因,它都无法编译。我收到一个非法函数调用。

-我尝试过使用 cons 但这不起作用,因为它会在我正在使用的主列表中创建多个列表。我需要将每个元素都放在一个列表中,这样不会有帮助。

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

必须有某种方法可以在不创建分层列表的情况下将元素添加到列表中。我是lisp的新手,所以如果这是基本的,我深表歉意。

【问题讨论】:

  • 显示代码,否则您无能为力。我不知道你是如何通过使用push 来产生非法函数调用的。

标签: common-lisp


【解决方案1】:

我相信你正在寻找追加。

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

【讨论】:

  • 不知道有这个功能。我正在上课的班级有一个臭名昭著的糟糕教授和一本糟糕的书。感谢您友好地回答我的简单问题。
  • @user3622073 common lisp 记录在免费提供的hyperspec 中。它很大,但易于使用,我们会组织起来。浏览会发现很多有用的东西。
  • @user3622073 还有几本书可以在线免费获得,即Practical Common LispCommon Lisp: A Gentle Introduction to Symbolic Computation
【解决方案2】:

使用链接列表(基于单元格的列表)时,“向后思考”通常很有帮助。你说你想将元素添加到列表的末尾,但是将某些内容添加到链表的最佳方法是将其添加到前面。因此,如果您能够解决您的问题,毕竟您可能会使用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)

反转列表一次在许多情况下是我们可以忍受的开销,并且您在函数式编程中经常看到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2017-02-27
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多