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