Вам не нужно использовать RETURN
. В Лиспе последнее выражение в теле функции возвращается автоматически, поэтому просто поместите переменную в конец функции. Кроме того, вам следует связать локальную переменную с LET
, а не назначать глобальную переменную.
(defun take-n (lst i)
(let ((newlist '()))
(dotimes (n i)
(setf newlst (cons (car lst) newlst))
(print (cons (car lst) newlst))
(setf lst (cdr lst)))
newlst))
Ошибка, которую вы получаете, заключается в том, что DEFUN
помещает именованный блок вокруг тела функции, поэтому вынужно использовать (return-from take-n newlst)
. return
может использоваться только для возврата из неназванного блока (блока с именем NIL
);они автоматически помещаются в циклические макросы типа DO
.