rember
(defn rember [atom l]
(loop [a atom lat l]
(cond
(empty? lat) `()
(= (first lat) a) (rest lat)
:else (cons (first lat) (recur a (rest lat))))))
Is the call to recur not in tail position here?
Nope. The return from recur has to be, directly, the return from the
enclosing loop form for it to be a tail position. Here you're consing
something onto it in between. Generally that means you need to add a
result accumulator to the loop, something like:
(defn rember [atom l]
(loop [a atom lat l res []]
(cond
(empty? lat) res
(= (first lat) a) (rest lat)
:else (recur a (rest lat) (conj res (first lat))))))
though I can think of further improvements, like hoisting a out of the
loop (it doesn't change) and using seq/next like so:
(defn rember [atom l]
(loop [lat (seq l) res []]
(if lat
(let [f (first lat)]
(if (= f atom)
(rest lat)
(recur (next lat) (conj res f))))
res)))
--
Protege: What is this seething mass of parentheses?!
Master: Your father's Lisp REPL. This is the language of a true
hacker. Not as clumsy or random as C++; a language for a more
civilized age.