【问题标题】:Shouldn't this function return the list back with all elements in it?这个函数不应该返回包含所有元素的列表吗?
【发布时间】:2011-03-01 07:39:41
【问题描述】:
(defun r (list)
  (let ((o ()))
    (dolist (x list o)
      (cons o x))))

(r (list 1 2 3))

它没有。它返回nil

【问题讨论】:

  • 你想用(dolist (x list o)...做什么?好像打错了。
  • 另外,您可能是指(setf o (cons o x))。目标是反转列表吗?
  • 好像应该是(dolist (x list)...
  • @Eelvex: (dolist (x list o) ...) 是有效的。它返回 o 的值。
  • @Rainer:是的,它是......但是在这里返回o(即nil)有什么意义?

标签: lisp common-lisp


【解决方案1】:

您需要在某处更改o。例如,PUSH 具有所需的副作用。缺点没有。

(defun r (list)
  (let ((o ()))
    (dolist (x list o)
      (push x o))))

> (r (list 1 2 3))
(3 2 1)

【讨论】:

    【解决方案2】:

    您的dolist 块返回变量o 的最终值。您的变量o 最初被分配nil,然后永远不会改变。

    您可能希望在循环内使用push 而不是cons

    【讨论】:

      【解决方案3】:

      列表只不过是一个 cons 单元的链接列表,以 nil 值结尾。 例如 (1 2 3) 等价于 (cons 1 (cons 2 (cons 3 nil)))

      您的代码设计是错误的,因为您尝试使用 nil 构建的内容,即空列表,然后您尝试将其用于其他元素。您正在尝试做的更正版本将是

      (defun r (list)
       (let ((o ()))
        (dolist (el list o)
         (setf o (cons el o))))
      

      【讨论】:

      • 抱歉,错字:“尝试以 nil 开头的构造”
      【解决方案4】:

      您是否正在尝试做这样的事情?

      (defun r(list)  
       (let ((o ()))
        (dolist (x list)
         (setf o (cons o x)))
        o))
      
       (r (list 1 2 3))
       (((NIL . 1) . 2) . 3)
      

      如果是这样,请注意以下几点:

      • dolistlist 分配 x: (dolist (x list) ...
      • o 必须设置:(setf o (...
      • o 必须被“退回”

      【讨论】:

      • (dolist (x list o) ...) 返回 o。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多