crimsondoll wrote:Hi, I'm incredibly new to Lisp and I've got to write a program that calculates the depth of an expression. Here's what I've got so far:
- Code: Select all
(DEFUN depth (L)
(IF (NIL L) 0)
(IF (NIL (SECOND L)) 0)
(IF (ATOM (SECOND L)) (1+depth(CDR L)))
)
What it's supposed to do is return 0 if the list L is empty or only has one atom (the two base cases) and if not, return 1 plus the depth of the CDR of the list. Whenever I try to test the code, I get an illegal argument error. I tried to test the function with
- Code: Select all
(depth (1 2 4))
and get this:
- Code: Select all
Error: Illegal argument in functor position: 1 in (1 2 4).
Any help would be much appreciated.
Your first problem is the way you call it: (depth (1 2 4)) is attempting to call DEPTH on the result of calling 1 with arguments 2 and 4 -- 1 is not a function, so you get an error. You need to say (depth (quote (1 2 4))) to stop it trying to evaluate (1 2 4) -- or equivalently, (depth '(1 2 4))
The next problem is the structure of your function: a bunch of IFs one after another, but it doesn't return the value they generate -- if L is NIL, the first IF will evaluate to 0, but the code will go on to evaluate the next IF, and then the third, which will evaluate as NIL since the test is false if L is NIL; the function will return NIL, not 0. If the test in the last IF is not NIL, it'll attempt to call 1+ on NIL (since eventually the recursive calls bottom out in the previous case) -- or at least it would if you fixed the syntax there -- but (1+ nil) is an error...