On Sun, Feb 22, 2009 at 1:46 PM, David Nolen <dnolen.li...@gmail.com> wrote:
> I agree that this is initially confusion, but I think that if you spend more
> than a couple of days with Clojure you will understand the ubiquitous and
> liberal use of binding forms.

I know I'm beating this to death and need to let this drop. I do
appreciate the use of binding forms. It's just that in this case I
have to specify a binding that isn't even used ... well the value is
used, but not the variable.

> On Sun, Feb 22, 2009 at 2:42 PM, Mark Volkmann <r.mark.volkm...@gmail.com>
> wrote:
>>
>> On Sun, Feb 22, 2009 at 1:34 PM, David Nolen <dnolen.li...@gmail.com>
>> wrote:
>> > In general, I find that multiple arguments types for a function
>> > confusing.
>> > If dotimes is going to take multiple types it should be a multifn. That
>> > seems to imply a performance hit.
>> > I think Clojure wisely does not (or rarely does not?) allow for multiple
>> > types to be passed into a function.
>> > On top of that it's trivial to produce a macro on top of dotimes that
>> > does
>> > what you want that doesn't spend time checking the type of it's
>> > argument.
>>
>> Really my main goal is to make Clojure code as easy to read as
>> possible. In this particular case, I think code like this:
>>
>> (dotimes [n 3] (println "knock"))
>>
>> leaves the reader wondering "What is the n for?".
>>
>> Someone suggested this:
>>
>> (dotimes [_ 3] (println "knock"))
>>
>> That still seems like too much to read for what I'm getting.
>>
>> OTOH, (dotimes 3 (println "knock")) isn't likely to confuse anybody.
>>
>> Sure, I could get what I want by writing my own macro. The problem I
>> have with that is that I don't want to litter my code with calls to
>> custom macros that readers of my code have to figure out. I prefer to
>> use functions that readers will already be familiar with unless
>> introducing my own macros is going to significantly shorten the code.
>>
>> > On Sat, Feb 21, 2009 at 11:10 PM, Mark Volkmann
>> > <r.mark.volkm...@gmail.com>
>> > wrote:
>> >>
>> >> On Sat, Feb 21, 2009 at 8:53 PM, André Thieme
>> >> <splendidl...@googlemail.com> wrote:
>> >> >
>> >> > On 21 Feb., 18:24, Mark Volkmann <r.mark.volkm...@gmail.com> wrote:
>> >> >> Currently the dotimes macro requires its first argument to be a
>> >> >> vector
>> >> >> for binding a variable to the number of times the body should be
>> >> >> executed. Inside the body, that variable is bound to the values from
>> >> >> 0
>> >> >> to that number minus 1. How about changing this macro to also accept
>> >> >> an integer as the first argument instead of a binding vector for
>> >> >> cases
>> >> >> where the number isn't needed in the body.
>> >> >
>> >> > I don't find this very interesting.
>> >> > There several variants of how dotimes could be, but the one that we
>> >> > currently have is the one that is used since a few decades in Lisp,
>> >> > and it is the one that makes very much sense.
>> >> >
>> >> >> For example,
>> >> >>
>> >> >> (print "Santa says")
>> >> >> (dotimes 3 (print "Ho"))
>> >> >> (.flush *out*)
>> >> >
>> >> > (print "Santa saysHoHoHo")
>> >> >
>> >> > How often do you really want to repeat the same side effect many
>> >> > times
>> >> > in a row?
>> >> > Why does it hurt to just say (dotimes [i 100] ...)?
>> >> > This will not reduce readability dramatically, but is a consistant
>> >> > use of dotimes. It also does not reduce productivity.
>> >> > Why make a breaking change for this?
>> >>
>> >> Why do you say it would be a breaking change? I just got the following
>> >> to work with minimal changes to the dotimes macro.
>> >>
>> >> (dotimes 3 (println "Ho"))
>> >> (dotimes [n 4] (println n))
>> >>
>> >> So both forms work with a single macro definition.
>> >>
>> >> Here's what I did.
>> >>
>> >> 1) Wrap the body of the macro inside the following:
>> >>
>> >>  (let [new-bindings (if (integer? bindings) ['n bindings] bindings)]
>> >>    ...
>> >>  )
>> >>
>> >>  This creates the required binding when only an integer is passed and
>> >> using the supplied value for bindings otherwise.
>> >>
>> >> 2) Change every occurrence of "bindings" in the body to "new-bindings".
>> >>
>> >> 3) Move the (defmacro dotimes ... ) to just before (defn make-array
>> >> ...).
>> >>    That's the first time it's used in core.clj and it will not be
>> >> after the definition of "integer?".
>> >>
>> >> Is there a reason to not make this change?

-- 
R. Mark Volkmann
Object Computing, Inc.

--~--~---------~--~----~------------~-------~--~----~
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