On Feb 24, 11:35 pm, David Sletten <da...@bosatsu.net> wrote:
> 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?
It depends if I'm on your lawn.
>
> 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
-~----------~----~----~----~------~----~------~--~---