Search code examples
lispcommon-lispsmlmutual-recursion

Mutual Recursion in Common Lisp


This is the Common Lisp code:

(defun take (L)
  (if (null L) nil
     (cons (car L) (skip (cdr L)))))

(defun skip (L)
  (if (null L) nil
     (cons (car L) (take (cdr L)))))

The idea here is that, "take" will give all the odd sequence elements in the input list and "skip" will give all the even sequence elements in the input list. However, in both cases the entire list is returned.

What is the error in this code? Is this something to do with how CL handles lists, because the similar code in SML gives the desired output.

fun take(lst) = 
     if lst = nil then nil 
     else hd(lst)::skip(tl(lst))
and
    skip(lst) = 
     if lst = nil then nil 
     else hd(lst)::take(tl(lst));

Solution

  • To expound on what Sylwester has said, your skip is wrong in both Lisp and SML. It should be

    (defun take (L)         ; even-indexed elements of a list L
      (if (not (null L))
         (cons (car L) (skip (cdr L)))))
    
    (defun skip (L)         ; odd-indexed elements of a list L
      (if (not (null L))
         (take (cdr L))))
    

    and

    fun take(lst) = 
         if lst = nil then nil 
         else hd(lst)::skip(tl(lst))
    and
        skip(lst) = 
         if lst = nil then nil 
         else take(tl(lst));