Функция обычно возвращает только одно значение, которое является значением ее тела.Если вы внимательно посмотрите на pl
, то увидите, что это форма if
, поэтому pl
либо возвращает значение lst
, либо значение progn
.
Первое, на что я должен указать, это то, что возвращаемое значение формы (progn ...)
является значением ее последнего выражения, которое в данном случае является рекурсивным вызовом (pl (cdr lst))
.Поскольку вы ничего не делаете с возвращаемым значением (pl (car lst))
, этот вызов не оказывает никакого влияния .Значение рекурсивного вызова в какой-то момент упадет до теста atom
.Второе, на что следует обратить внимание, это то, что (atom nil)
также верно.Помните, что последний элемент списка - nil
, поэтому, когда вы дадите pl
список, он будет всегда возвращать ноль , как вы заметили.
Если ваша версия для печати ничего не показываетВозможно, это связано с тем, что выходные данные для печати отображаются где-то еще, например, в другом буфере.
Что касается решения: вы либо хотите получить чисто рекурсивное решение, используя append
вместо progn
, потому что эточто в вашем домашнем задании.В обычном lisp вы просто используете одну из конструкций итерации.
Мой совет - проверить любой учебник по lisp или схеме, чтобы понять основы рекурсии и хвостовой рекурсии.