Если вы вызываете функцию, например. (#'(lambda (a b) (+ a b)) 2 3)
существует требование, чтобы количество аргументов соответствовало количеству предоставленных аргументов. При использовании apply
требования одинаковы, поэтому (apply #'(lambda (one) ...) lst)
требует, чтобы lst
был только одним списком элементов, таким как '(a)
, но это не может быть '()
или '(a b)
. Единственный способ поддержать переменное количество аргументов, вам нужно использовать &rest
аргументы, например. (apply #'(lambda (&rest lst) ...) '(a b))
Глядя на логику, я ее не понимаю. Вы хотите вернуть t
, когда вы встретили список с последним элементом в виде числа, но также искали элементы списка в пути и возвращали рано, если вы их нашли. Это должно быть возможно без использования last
на каждом шаге. например.
(defun has-a-last-numeric (lst)
(labels ((helper (lst)
(loop :for (e . rest) :on lst
:if (and (null rest) (numberp e))
:do (return-from has-a-last-numeric t)
:if (listp e)
:do (helper e))))
(helper lst)))