Разве эта функция не должна возвращать список обратно со всеми элементами в нем? - PullRequest
2 голосов
/ 01 марта 2011
(defun r (list)
  (let ((o ()))
    (dolist (x list o)
      (cons o x))))

(r (list 1 2 3))

Это не так.возвращается nil

Ответы [ 4 ]

3 голосов
/ 01 марта 2011

Вам нужно где-то изменить o .PUSH, например, имеет желаемый побочный эффект.CONS нет.

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

> (r (list 1 2 3))
(3 2 1)
2 голосов
/ 01 марта 2011

Ваш блок dolist возвращает окончательное значение переменной o. Ваша переменная o изначально присваивается nil, а затем никогда не изменяется.

Возможно, вы захотите использовать push вместо cons внутри цикла.

1 голос
/ 03 марта 2011

Список - это не что иное, как связанный список cons-ячеек, заканчивающийся нулевым значением.Например (1 2 3) эквивалентно (минусы 1 (минусы 2 (минусы 3 (ноль 3))))

Ваш код по своему замыслу неверен, потому что то, что вы пытаетесь создать, используя ноль, пустой список, а затем вы пытаетесь довести до него другие элементы.Исправленная версия того, что вы пытаетесь сделать, будет

(defun r (list)
 (let ((o ()))
  (dolist (el list o)
   (setf o (cons el o))))
0 голосов
/ 01 марта 2011

Вы пытаетесь сделать что-то подобное?

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

 (r (list 1 2 3))
 (((NIL . 1) . 2) . 3)

Если это так, обратите внимание на следующее:

  • dolist назначает x из list: (dolist (x list) ...
  • o должен быть установлен: (setf o (...
  • o должен быть «возвращен»
...