Неожиданный результат функции (рекурсия)
Мне нужно реализовать функцию, которая создает список из аргументов, которые передаются в функцию.
Вот мой код:
(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)