Неверный тип аргумента listp, GIF При переворачивании списка

Я пишу такую ​​функцию, чтобы перевернуть список

Упражнение 2.18. Определите обратную процедуру, которая принимает список в качестве аргумента и возвращает список тех же элементов в обратном порядке:

#+begin_src emacs-lisp :session sicp :lexical t
(defun reversex(item)
  (cond
   ((null item) nil)
   ((cons (reversex (cdr item))
          (car item)))
   ))
(reversex (list 1 4 9 16 25))
#+end_src

Получил следующий вывод при первом запуске:

#+RESULTS:
: (((((nil . 25) . 16) . 9) . 4) . 1)

Но при втором запуске получаю ошибку:

  Wrong argument type listp, "GIF"

person AbstProcDo    schedule 16.11.2019    source источник


Ответы (1)


Непонятно, откуда взялся этот «GIF», потому что вы не предоставили данные для «второго запуска», о котором вы упоминаете. В любом случае, ваш алгоритм обращения списка неверен, вы должны построить правильный список в качестве вывода, а это не так:

(((((nil . 25) . 16) . 9) . 4) . 1)

Это должно выглядеть так:

'(25 . (16 . (9 . (4 . (1 . nil)))))

Вот один из способов сделать это — использовать параметр-аккумулятор. Также обратите внимание, как должно быть написано условие else для cond:

(defun reversex (lst acc)
  (cond
    ((null lst) acc)
    (t (reversex (cdr lst) (cons (car lst) acc)))))

(reversex '(1 4 9 16 25) nil)
=> (25 16 9 4 1)
person Óscar López    schedule 16.11.2019
comment
sicp потрясающий, я считаю, что мое неправильное решение - это упражнение 2.22, которое выявляет ошибку в качестве упражнения. - person AbstProcDo; 04.01.2020