LISP Cannot take CAR of T -
i trying evaluate each atom of list , see if it's equal number provided , remove if not running slight problem.
i wrote following code:
(defun equal1(v l) (cond((= (length l) 0)) (t (cond( (not(= v (car(equal1 v (cdr l))))) (cdr l) ))) ) ) (equal1 5 '(1 2 3 4 5))
i obtain following error
error: cannot take car of t.
if add (write "hello") action if true, following error obtained:
error: cannot take car of "hello".
i'm still quite new lisp , wondering going on , how fix evaluate each atom , remove if not, cdr l action.
there couple of things improve function.
firstly, let's indent
(defun equal1 (v l) (cond ((= (length l) 0)) (t (cond ((not (= v (car (equal1 v (cdr l))))) (cdr l))))))
rather saying (= (length l) 0)
, can use (zerop (length l))
. minor sylistic point. worse branch returns no value. if list l
empty should return?
the issue function in t
branch of first cond
.
what want is
- remove list item same value
v
- keep item not
=
v
the function should return list.
the expression
(cond ((not (= v (car (equal1 v (cdr l))))) (cdr l)))
is trying (i think) deal both conditions 1 , 2. it's not working.
we have recall items in list , result of equal function needs list. in expression above result of function boolean , hence result of function call boolean.
the function needs step along each element of list , when sees matching value, skip it, otherwise use cons function build filtered output list.
here skeleton out. notice don't need embedded cond
, have 3 conditions deal - list empty, filter value out, or continue build list.
(defun equal-2 (v l) (cond ((zerop (length l)) nil) ((= v (car l)) <something goes here>) ;skip or filter value (t (cons (car l) <something goes here>)))) ;build output list
of course, being common lisp, there built-in function this. can remove-if
...
Comments
Post a Comment