Неожиданный результат функции (рекурсия)

Мне нужно реализовать функцию, которая создает список из аргументов, которые передаются в функцию.

Вот мой код:

(defun lstbuilder (&rest args)
  (if (eq (car args) NIL)
      NIL
      (cons (car args)
            (lstbuilder (cdr args)))))

Эта функция не работает правильно. Результаты:

(lstbuilder 'a 'b 'c 'd 'e) ;expected (a b c d e)
(a (b c d e)) ;result

2 ответа

Решение

Вам нужно использовать (apply #'lstbuilder (cdr args)) чтобы "разбить" содержимое списка как аргументы вызова функции.

Стиль

  • Пожалуйста, используйте стандартное форматирование Lisp. Использование редактора поможет вам сделать отступ для кода на Лиспе.

  • Не ставьте круглые скобки в одиночку. Это просто тратит пространство без пользы.

  • Длинные имена получают - между словами: list-builder,

  • Не использовать carа также cdr для операций со списком. использование first а также rest,

  • Конец проверки списка endp,

Пример:

(defun list-builder (&rest args)
  (if (endp args)
      nil
    (cons (first args)
          (apply #'list-builder (rest args)))))

Так как args переменная уже список, мы можем просто скопировать его:

(defun list-builder (&rest args)
  (copy-list args))

Или мы можем просто использовать list функция, которая уже создает список своих аргументов:

(setf (symbol-function 'list-builder)
      #'list)
Другие вопросы по тегам