On Feb 24, 2009, at 6:07 PM, David Sletten wrote:

>
> (defn kill-nil
>    ([l] (kill-nil l '()))
>    ([l result] (cond (nil? l) (reverse result)
>                      (nil? (first l)) (recur (rest l) result)
>                      true (recur (rest l) (cons (first l) result)))) )
>
>

I forgot to ask...

In Lisp, rather than repeatedly testing for an optional argument like  
this:
(defun kill-nil (l &optional (result '()))
   (cond ((endp l) (nreverse result))
         ((null (first l)) (kill-nil (rest l) result))
         (t (kill-nil (rest l) (cons (first l) result)))) )

I would preserve the interface to the user (i.e., single arg) but  
eliminate the decisions regarding the optional arg from the recursive  
calls:
(defun kill-nil (l)
   (labels ((kill-nil-aux (l result)
              (cond ((endp l) (nreverse result))
                    ((null (first l)) (kill-nil-aux (rest l) result))
                    (t (kill-nil-aux (rest l) (cons (first l)  
result)))) ))
     (kill-nil-aux l '())))

In the Clojure version above there doesn't seem to be any penalty  
since the "recur" only occurs after the correct arity has been selected.

Is this correct? How about a more traditional recursion?
(defn kill-nil
   ([l] (kill-nil l '()))
   ([l result] (cond (nil? l) (reverse result)
                     (nil? (first l)) (recur (rest l) result)
                     true (kill-nil (rest l) (cons (first l)  
result)))) )

Is there a penalty deciding which arity to use on each call?

Aloha,
David Sletten

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to