When you want to have a sequence of expressions
c to evaluate, you need to put them in a
(progn a b c) form. But here you had them wrapped in a list of forms: when you evaluate
(a b c) in a normal evaluation context, ie. not in macros, special forms, …,
a is expected to be a function being called with arguments
That’s why you have that specific error:
(push ...) is indeed not a function name or a lambda expression.
You are calling
setq on symbols that are not bound to known variables, at least in your function. Most implementations then treat the assignment as an assignment to
symbol-value of the symbol, even though the behaviour is unspecified. You should rather declare them in your function by having a
(let ((w (length list)) (... ...)) ...)
By the way, you compute the length of the list twice in this function, the length could be computed once only, and in fact you only need to know if the list has one element and no list in its cdr: this is a constant-time computation, unlike
list-length which needs to traverse the whole list.
variable names, case
Be careful about how you name your variables, and please stick to the Lisp conventions by using
hyphen-separated-words instead of a mix of upper and lower case.
CLICK HERE to find out more related problems solutions.