#clojure logs

2008-12-20

09:14poiuytis there no way to abort a functon without killing the jvm? its incredibly annoying
09:15Chouseryou may be able to use Thread/interrupt to stop the thread that's running the function.
09:15Chouserof course if that's the Repl thread it's not a terribly useful technique
09:16Chouserif the function is busy printing, you can limit it with *print-length*
09:18Chousers/can limit/could have limited/
09:25poiuythow do I just kill the function without closing the window?
09:25poiuytif i do C-x k the windows holding the thread is destroyed, not just aborting the jvm
09:25Chousersorry, I don't use emacs or slime.
09:26Chousermany others do, but perhaps they're not here this morning.
09:26poiuytVIM!!!???
09:27Chouseryes
09:27poiuytill find out where you live
09:29leafwer, don't you mess around with vim'ers.
09:48poiuytclojure-load-file: Symbol's value as variable is void: f
09:48poiuytemacs ^^
09:48poiuytwhy?
10:03poiuytgot it
10:28poiuytis there a group or group-by like function in clojure already?
10:28poiuyt(group-by ["h" "j" "h"] 0) -> [["h" "h"] ["j"]]
10:28kotarak(doc partition)
10:28clojurebotReturns a lazy sequence of lists of n items each, at offsets step apart. If step is not supplied, defaults to n, i.e. the partitions do not overlap.; arglists ([n coll] [n step coll])
10:29kotarakHowever it does cut off parts.
10:29poiuytnot what i asked for
10:29kotarak(partition 2 [1 2 3 4 5]) => ((1 2) (3 4))
10:30kotarakWhat is your function supposed to do? I'm not sure I understand the 0)
10:31poiuytit groups stuff
10:32poiuytuser=> (group-by [[1 2 3] [1 2 3] [4 2 6] [1 2 3]] 0)
10:32poiuyt[[[1 2 3] [1 2 3] [1 2 3]] [[4 2 6]]]
10:32poiuytuser=> (group-by [[1 2 3] [1 2 3] [4 2 6] [1 2 3]] 1)
10:32poiuyt[[[1 2 3] [1 2 3] [4 2 6] [1 2 3]]]
10:33poiuytuser/group-by
10:33poiuyt([coll on-elem])
10:33kotarakHmmm... Not that I am aware of.
10:34poiuytGroup a collection of items comparing on the on-elem element
10:34Chouserclojure.contrib.group-by
10:34Chouserclojure.contrib.seq-utils/group-by
10:35Chouserthat takes a predicate and returns a map, but should get you close
11:08dcnstrcthey is clojurebot written in clojure ?
11:08dcnstrctclojurebot, give me source
11:15Chouserhe is
11:15Chouserclojurebot: where are you?
11:15clojurebothttp://gist.github.com/27733
11:16durkakotarak: would you be interested in a trace of gorilla freezing?
11:16kotarakSure. did you find something?
11:16durkaunclear
11:16kotarak(I had a look, yesterday, but was too sleepy)
11:18lisppaste8durka pasted "gorilla freeze" at http://paste.lisp.org/display/72449
11:18durka---ALL CAPS denote what I did in Vim
11:20kotarakHow do I get such a nice trace? (Have no clue about java and its tools so far.)
11:21Chouserthat's got to be a clojure-aware trace
11:23kotarakYes. There is no prompt sent. As I suspected.
11:23kotarakI'll have a look, why this is the case.
11:23durkai didn't know if the proposed clojure.contrib.trace2 ever got into contrib
11:23durkabut i just took the code from here
11:24durkahttp://groups.google.com/group/clojure/browse_thread/thread/b70cf422ab268cbd
11:24durkaand I did a (trace-ns) in gorilla.clj and gorilla/repl-ln.clj
11:24kotarakThis will definitively go to my toolbox. That's really nice.
11:25kotarakConcerning debugging I'm still on stone-age here.
11:28kotarakI'm really a bit puzzled. There is no code which checks for a ( or ).
11:28kotarakI don't know, why eg. *out* is treated differently.
11:30leafwa profiler would be nice too: count the time spent on each function, and keep track of the parent chain of function calls.
11:34kotarakHmmm... It seems, that the repl doesn't read the trailing null byte.
11:34kotarakBut I don't know, why.
11:34durkaseems like the bug is triggered when the input doesn't end with a )
11:34durka() is fine
11:34kotarakYes.
11:34durka"() nonsense" hangs
11:34durka"nonsense ()" does not hang
11:37kotarak) is not treated specially...
11:55kotarakNow it gets funny.
11:55kotarakI extract the command and add a 0x0.
11:55kotarak(+ 1 1)
11:55clojurebot2
11:55kotarakworks
11:55kotarak*out* does not work.
11:56kotarakdoing cmd + " " + 0x0.chr instead of simply cmd + 0x0.chr.
11:56kotarakfixes the problem.
11:56kotarakI don't get it.
11:57kotarakdurka: thanks for the trace. Will push a fix to the bitbucket repo.
12:26poiuythow do I nest loop-recurs?
12:27kotarakpoiuyt: recur always goes to the inner-most loop
12:27kotarakor function
12:30poiuytso how do I jump back?
12:33kotarakJust don't call recur: (loop [x 0] (cond condition1 (recur 1) condition2 (recur (loop [y 0] (if inner-condition (recur 1) 2 (<-leaves inner loop)))) condition3 3 (<- leaves outer-loop)))
12:34kotarakpoiuyt: maybe you can translate the loops in map, reduce and friends.
12:48poiuytwell this was something very simple getting ridic hard lol
12:49poiuytI have a list of lists. for each elem in the inner list i want to do something with a sideeffect and then conj that to a function-global vector and then return the vector once everyhting is done
12:49durkakotarak: fix confirmed, thanks
12:49kotarakdurka: np, though I still don't understand, why this is a fix...
12:50durkayeah, i know no ruby at all so i can't really speculate there
12:50kotarakdurka: I'm not sure, that the problem lies in Ruby... But as long as it works for now...
12:51kotarakpoiuyt: Can you paste an example? I don't under stand the side effect thing, I don't understand what you want to conj to the vector. The original thing?
12:52durkakotarak: gorilla still doesn't setup its maps unless I put a "ruby Gorilla.setup_maps()" at the bottom of gorilla.vim
12:52poiuythttp://hpaste.org/13212
12:52poiuytthat should return a vector of 2 matrices
12:52kotarakdurka: Have you put in place the after/... file?
12:53poiuytit is a simplified version of what im doing but illustrates the problem
12:53durkathe ftplugin?
12:56kotarakdurka: yes
12:58lisppaste8kotarak pasted "maybe with map?" at http://paste.lisp.org/display/72450
12:59kotarakdurka: and of course you must be in a clojure buffer.
12:59kotarakpoiuyt: maybe like this?
12:59durkaoh that would be it
13:00kotarakdurka: in other buffers, it doesn't make sense to capture the keymaps.
13:02durkaeven when i open a .clj file it doesn't seem to work
13:02durkagorilla.vim is in ~/.vim/ftplugin/clojure/gorilla.vim
13:03kotarakdurka: ehm. which? the one from after/ftplugin...?
13:03durkayes
13:03kotarakhmmm
13:03durkais macvim weird about these things?
13:04kotarakno. works for me.
13:04kotarakYou have activated ftplugins?
13:04durkawell the syntax highlighting works
13:04durkasorry, i'm really a vim newbie
13:05kotaraktry ":filetype plugin indent on"
13:05kotarakPut this in your .vimrc.
13:12kotarakhi wizz
13:35poiuytkotarak: i did (reduce (reduce...)) dont know what i was thinking before
13:39poiuytif im nesting to #()-closures/functions/whatever ina reducea nd i need to refer to the outer %2 in the inner then i cant use #( in both? i solvced wioth using (fn [acc elem]... and #( %1 %2 so no prob, just wondering
13:39kotarakpoiuyt: I sometimes stare to hours at a loop and then *poo*f* it vanishes into a reduce with take-while and is 2/3 shorter.
13:40kotarak#() cannot nest. You have to use fn, then
13:40kotarak#() is only short-cut for very simple fns
13:40kotarakNot a replacement for fn
13:56poiuytok ty
14:04fffejquick question - is there a Clojure defined function for absolute or is (Math/abs x) the way to go?
14:06danlarkinfffej: Math/abs
14:09fffejthanks, is the guidance basically that if it's available in core Java as a simple static func, there probably isn't a Clojure equivalent?
14:10danlarkinfffej: you can always consult http://clojure.org/api
14:11poiuythow do I contribute to contrib?
14:11poiuytand how do I do if I want to suggest functions for clojure-core?
14:15danlarkinpoiuyt: http://clojure.org/contributing
14:16poiuytclojurebot contributing
14:17danlarkinclojurebot: contributing?
14:17clojurebotNo entiendo
14:17danlarkinclojurebot: contributing is <reply> http://clojure.org/contributing
14:17clojurebotRoger.
14:20poiuytok i think if i do something ill just host it on github then and people can pull from there
14:20fffeji'm just trying to understand recur by implementing my own version of "range", but it's overflowing the stack.
14:20poiuytffej: post
14:20poiuytclojurebot: paste?
14:20clojurebotPardon?
14:20poiuytclojurebot: paste
14:20clojurebotexcusez-moi
14:20fffejpost:
14:20fffej(defn my-range [start end]
14:20fffej ((fn [x y accum]
14:20fffej (if (= x y)
14:20fffej (concat accum (list x))
14:20kotarakpoiuyt: you should probably discuss your contribution on the google groups list
14:20fffej (recur (inc x) y (concat accum (list x))))) start end nil))
14:21poiuytffej: you can use recur without loop but often oyu use loop. ill copy it and try it
14:21kotarakfffej: http://paste.lisp.org/new/clojure
14:21fffejthanks kotarak, will use that from now on
14:22fffej(range 1 50000) works whereas my one gives a stack overflow
14:23lisppaste8py pasted "range" at http://paste.lisp.org/display/72451
14:24poiuytyou are doing some unneccessasry stuff
14:24poiuyti posted another version ^^
14:25fffejpoiuyt: thanks, conj was the bit I was missing
14:26fffejI'm a bit confused why change from (concat accum (list x)) to (conj accum x) fixes the stack overflow though? What am I missing?
14:26lisppaste8kotarak annotated #72451 with "my-range with lazy-cons" at http://paste.lisp.org/display/72451#1
14:28fffejthanks kotarak
14:28fffejso far when I've been playing around I've avoided explicit recursion because of the lack of TCO. I'm guessing that when lazy-cons is used this doesn't apply and the tail call is only evaluated when it's needed?
14:29kotarakyes
14:30fffejthanks all, that's helped me understand a few things!
14:33danlarkinkotarak: lazy-cons is the best... it's faster _and_ more memory efficient
14:34fffejbut more difficult to reason about complexity wise
14:34cljnewbhello. I have an object that implements java.util.Collection, Iterator, List, etc. how do I simply iterate over it and print its members?
14:34kotarakfffej: one must take care for side effects.
14:34kotarakeg. open files and such
14:35kotarakcljnewb: (doseq [x your-coll] (prn x)), not tested
14:36danlarkinor if you just wanna see it use (seq your-coll)
14:38cljnewbkotark & danlrkin: thanks.
14:41poiuytand there is no problem with lazy-cons as far as blowing stack somehow? like in Haskell when not using foldr foldl' etc correctly it all works fine until you hit some cornercase and blow the stack and have to change it to use strictness instead
14:41poiuytare lazy expressions building up large thunks that can blow the stack?
14:42poiuytand when doing count on a lazy sequence does that take the same time as on a normal one?
14:44kotarakpoiuyt: In general count on seq is O(n), since you don't know the length in advance (eg. line-seq). For collections (vectors, maps, sets, lists, ...) it's O(1). I'm not sure about a seq based on such a collection.
14:46fffejthere's a good book about this "Purely Functional Data Structures". It talks about how to understand the performance of an algorithm when it's evaluated lazily
14:49aperotteI know this is relatively new, but does anyone know if there are plans for JVM support of the new OpenCL standard?
14:50Kerris7fffej: I hope to "port" that book to Scala one day :V
14:52poiuytcount on lists are O(n) right? it seems so when timingat least
14:52kotarakpoiuyt: O(1)
14:52kotarakhmmm
14:52poiuyt(time (count (range 1000000)))
14:52poiuyt"Elapsed time: 45.857505 msecs"
14:52poiuyt(time (count (range 1)))
14:52poiuyt"Elapsed time: 0.047772 msecs"
14:52fffejdoesn't that tell you more about range?
14:53poiuytlol
14:53kotarakpoiuyt: yes. range is a lazy-seq.
14:53kotarakpoiuyt: (list ....) are lists.
14:54poiuytbut still the same
14:54poiuytuser=> (time (count b))
14:54poiuyt"Elapsed time: 0.196114 msecs"
14:54poiuyt1
14:54poiuytuser=> (time (count a))
14:54poiuyt"Elapsed time: 45.200996 msecs"
14:54poiuytai i see
14:54fffejbut range is lazily evaluated, so you need to force it first I guess
14:54kotarakhttp://clojure.org/data_structures#toc43 says "count is O(1)"
14:55poiuytes when doing (apply list (range 10000))
14:55poiuytthne timing it is the same
14:55poiuytalso lazy-seq allows loooong lists where normal ones blows the heao
14:55poiuytp
14:57kotarakGorilla=> (def y (apply list (range 100000)))
14:57kotarak#'user/y
14:57kotarakGorilla=> (time (count y))
14:57kotarak"Elapsed time: 0.029 msecs"
14:57kotarak100000
14:57kotarakGorilla=> (time (count (range 100000)))
14:57kotarak"Elapsed time: 9.055 msecs"
14:57kotarak100000
14:58kotarakGorilla=>
15:00poiuytyes as i noticed
15:00poiuytanyway where can isee the implementation of # as the function-shorthand?
15:01kotarakpoiuyt: don't know of hand the doc, but #(foo %) is shorthand for (fn [x] (foo x))
15:02kotarakpoiuyt: http://clojure.org/reader#toc2
15:11poiuythmm does a macro always need parenthesis to be called? I always got the impression that macros was this "divine" thing that you could do superawesome stuff with but what I really like about clojure is that sit is so close to purely functional and immutable datstructures. macros i still have never needed one.
15:11poiuyti cant do: (+ 2 q 3 add 5) -> 10? where q is a macro: (defmacro q [a b c]
15:11poiuyt `(~b ~a ~c))
15:11kotarakmacros are the "divine" thing you can do superawesome stuff with. ;)
15:12kotarakBut they are also this super 100Mt atomic bomb, which blows your code of the water.
15:12durkais there a function that will "reset" clojure
15:12arohnerpoiuyt: macros are fns that are called at compile time
15:12durkalike, if i managed to start some agents at the repl with infinite loops or memory leaks or something
15:12arohnerthat just happen to return lists
15:12durkaand i want to terminate them all instead of cleaning up my mess
15:13kotarakpoiuyt: (apply + 2 (q 3 add 5))
15:14kotarakArg.
15:14poiuytarohner: yes they are functions but i thought od them more like: when some character or word is occured, replace that word with this. but having to use parenthesises greatly reduces the dsl-ishness of them
15:14kotarakForget the apply
15:16kotarakpoiuyt: what a lisp can do, is a DSL in lisp style. For more, you need an external DSL.
15:28dreishI check http://www.google.com/trends?q=clojure%2Cocaml&amp;ctab=0&amp;geo=all&amp;date=ytd&amp;sort=0 every day. When Clojure passes OCaml, confetti will appear out of nowhere at my house.
15:30waltersnot a fan of staring at type inference clashes?
15:31dreishNo, nothing against OCaml specifically. It's just an easy-to-google language at a low enough popularity level to make it a reasonable one to measure Clojure against.
15:32waltersah
15:34danlarkinO'caml big in france eh
15:34waltersit originated from INRIA
15:37triddellWhen I println a data structure I get from a java call is looks like:
15:37triddell(#=(java.util.ArrayList. [#=(java.util.HashMap. {id MachineStandards, title Standards, column 1, app-context machine, row 1, skin nil}) #=(java.util.HashMap. {id MachineInventory, title Inventory, column 2, app-context machine, row 1, skin nil})])
15:37triddellnil nil)
15:37triddell(#=(java.util.ArrayList. [#=(java.util.HashMap. {id MachineStandards, title Standards, column 1, app-context machine, row 1, skin nil}) #=(java.util.HashMap. {id MachineInventory, title Inventory, column 2, app-context machine, row 1, skin nil})]) nil nil)
15:38triddellIs this a list with a vector containing two Hashmaps and two nils?
15:39triddellI'm try to get a sequence of Maps from this and can't seem to get it.
15:39danlarkintriddell: well those are java containers
15:39triddellright, just trying to read it properly
15:39triddelland then just get the maps as a sequence
15:40dreish(first (seq above-thing)) doesn't work?
15:40dreishOops, I mean (seq (first ...))
15:40poiuytwhat is the preferred way to package clojure programs? should I always have each file in a separate namespace?
15:42triddelldreish (seq (first ... gets me: ((#<Entry id=MachineStandards> #<Entry title=Standards> #<Entry column=1> #<Entry app-context=machine> #<Entry row=1> #<Entry skin=null>)
15:43triddellwhich I don't think is a map any more
15:43arohnerpoiuyt: it's a good rule of thumb to use the (ns ... ) macro,
15:43arohnerthat pushes you in the direction of of file per ns
15:43dreishOh, weird, first got you the first thing in the ArrayList (the HashMap) instead of the ArrayList itself. I wonder where the outer parens came from.
15:43kotarakpoiuyt: ns do not correlate to files. you can use several files for one namespace.
15:44dreishIt looks like you ought to be able to just do (seq above-thing).
15:44danlarkintriddell: so try (apply hash-map (seq (first above-thing)))
15:54triddellThat seems to do it... now I have this:
15:54triddell({#=(java.util.HashMap. {id MachineStandards, title Standards, column 1, app-context machine, row 1, skin nil}) #=(java.util.HashMap. {id MachineInventory, title Inventory, column 2, app-context machine, row 1, skin nil})}
15:54triddellnil nil)
15:55triddellcombined... not sure why it's a list with two nils on the end but I'll see if I can use the first map, thanks
16:07AWizzArdclojurebot: max people
16:07clojurebotmax people is 116
16:16poiuyti dont quite get how to use namespaces
16:16poiuyt(ns linear-algebra)
16:16poiuythow should i then import it from another file?
16:16poiuytand how do i refer to names from that namespace?
16:17kotarak(ns other.namespace (:require linear-algebra)) (linear-algebra/foo)
16:18poiuytand do i do load-file first or how does it find the namespace?
16:19kotarakput (ns linear-algebra) ... in a file /linear_algebra.clj in your classpath.
16:19kotarakThe rest does require.
16:22hiredmanI think good form requires at least two segments in the ns
16:22hiredmanpoiuyt.linear-algebra
16:44hiredmanclojurebot: ,(println "pong")
16:44clojurebotI don't understand.
16:44hiredman,(println "pong")
16:44clojurebotpong
16:45poiuytis there no way to prepend a macro?
16:45poiuytlike clojure doe salready
16:45poiuyt#(+ % 3)
16:46hiredmanpoiuyt: sounds like you are talking about read macros
16:46poiuytso i can do |(2 + 3) instead of (+ 2 3)
16:46kotarakpoiuyt: no. this is not possible.
16:46hiredmanrhickey doesn't seem to want people to that
16:46kotarakthe problem is, you can't resolve such reader macros.
16:47kotarakwhat happens, why I have to a |... macro?
16:47kotarakwhich to use?
16:47hiredmanhttp://markmail.org/message/zp4minh63ewqsdtj
16:53poiuytyeah well if theyare what they seem to be those are what i really need. normal macros i really never ever nee
16:53poiuytd
16:54kotarakpoiuyt: Funny. I never needed reader macros up to now. (Maybe with exception of #())
16:56hiredmanpoiuyt: why not just use a normal macro?
16:57hiredman(| 3 + 2)
16:57zakwilsonCLSQL does very useful things with reader macros.
17:06poiuytyes exactly what i was thinking
17:06poiuyti hate sql-statements ugly long. want to make a simple dsl for taking away allt he boilerplate from sql
17:06poiuytit is jsut cleanrer having the macro-symbol outside the expr
17:16Lau_of_DKGood evening gents
17:16kotarakhi lau
18:24mmcgranaI know of assoc, assoc-in, and update-in, but there is no "update". e.g. (update {:wins 2 :losses 3} :losses inc) => {:wins 2 :losses 4} Is there a function for this with a different name?
18:25kotarakmmcgrana: you can use (update-in {...} [:losses] inc), but I also noted that this missed.
18:25kotarakAlso get-in has no default value.
18:25kotarakMaybe we need some polish here?
18:28mmcgranayeah i think so
18:31drewrI wonder if this is worthy of core:
18:31drewr(defn toggle [_atom]
18:31drewr (swap! _atom #(not %)))
18:35lisppaste8mmcgrana pasted "update" at http://paste.lisp.org/display/72456
18:36mmcgrananote that this is just the base case for update-in, thus we could replace that case in update-in with a call to update
18:43kbarrosHi folks, I have a question about the slime command M-. (i.e., slime-edit-definition). How is it supposed to work?
18:44kbarrosIf I change a file, should M-. use the updated information?
18:50mmcgranai might work up a proper patch for the update thing, but gtg now
19:22Lau_of_DKAnyone up ?
19:23Lau_of_DKIve got a simple job, convert (> one two) to "one > two". Is there anything built into Clojure which allows me to do this elegantly ?
19:29Chouser(defn f [[a b c]] (list b a c))
19:30RSchulzHa! That's exactly what I was going to ask... How general is the transformation you require?
19:30RSchulzArbitrary infix -> prefix parsing?
19:32hiredmanI seem to recall this in some cs class
19:32RSchulzThat's good. Having taken CS classes is a good thing...
19:33danlarkinuse interleave?
19:33hiredmanat the time I did not have internet hat home so I wa busy goofing off on the laptop so I don't remember
19:34danlarkinsorry, I mean interpose
19:34danlarkin(doc interpose)
19:34clojurebotReturns a lazy seq of the elements of coll separated by sep; arglists ([sep coll])
19:34danlarkinthrow a wrapper around that IMO
19:37RSchulzFace it! Infix -> Prefix requires a parser. Trying to finesse it with things like (interpose ...) just don't cut it.
19:37RSchulzThey're two different realms, and never the twain shall meet!
19:44danlarkinbut this is prefix -> infix
19:44danlarkinmuch easier!
19:47RSchulzYes. Magic is always easier...
19:47RSchulzOh. Prefix TO Infix. Trivial..
19:48RSchulzA slight complication ensues if you want minimal parenthesization of the resulting infix.
19:50gnuvince_What's with all the infix talk lately? Do people really want to write 2 + 3 instead of (+ 2 3)?
19:51danlarkin2nd place to infix
19:51danlarkindistant last place to posfix *shudder*
19:52RSchulzgnuvince_: Yes, people _do_ want to write that.
19:52RSchulzWhat can you do?
19:52gnuvince_RSchulz: flame them until they don't want to?
19:52RSchulzWell... It's worth a try!
19:52gnuvince_;)
19:53RSchulzYou want to write WHAT?!?! 2 + 3 * 4 = What? 14? 20? Say what you mean, dammit!!
19:54gnuvince_I feel that not having infix maths in Lisp languages is less of a problem than these people think. The most common operations are increasing and decreasing values by one
19:54gnuvince_I don't think a lot of people spend their days writing quadratic equations in their programs
19:54RSchulz"Syntactic sugar leads to cancer of the semicolon." -- Alan Perlis.
19:55RSchulz...RIP...
20:00gnuvince_This guy had some good quotes
20:45hiredmanI have a seq of vectors, I would like to eliminate all the vectors with duplicate data in a certain slot
20:52Chouserhiredman: "certain slot" as known by its index?
20:52hiredmanyeah
20:52hiredmanwoa
20:52hiredmanhttp://clojure.org/sequences <-- changed
20:53Chouserindeed. what do you think?
20:53hiredmanuh
20:53hiredmancuts down on duplication I guess
20:53Chouserbiab
20:54hiredmanthe seq is registration data, but some people registered twice, with slightly different data
20:59Chouseroh, I see.
21:03Chouser(vals (reduce #(assoc % (nth %2 1) %2) {} theseq)
21:07hiredmanthanks
21:08hiredmanlet me try and figure that out
21:08hiredmanok
21:13hiredmanwonderful
21:13Chouseror (vals (into {} (for [v theseq] [(nth v 1) v])))
21:14Chousereh. nevermind. use 'reduce'
21:16hiredmanworks great
21:17hiredmanyou are a gentlemen and a scholar, and there are only four of us left
21:28karmazillais there an API page for contrib?
21:29Chouserkarmazilla: nope.
21:30Chouserkarmazilla: but 'doc' and 'find-doc' work
21:32karmazillayeah, but quite a substitute if overview is what you want.
21:33ChouserI agree -- contrib is under-documented.
21:34karmazillawhat about test-is tutorials?
21:38Chousertest-clojure uses test-is a bunch
21:40karmazillayeah, just remembered that as well
21:55karmazillaI think the test-that macro in clojure.contrib.test-clojure.evaluation looks like something that would be nice to have in test-is itself
22:00dpthfltrclojure + htmlunit FTW
22:01dpthfltrI was doing this kind of testing with Ruby before.. the clojure version looks much more concice even though htmlunit is more verbose than Ruby's WWW::Mechanize
22:02dpthfltrand the clojure version is somehow faster even though a whole extra browser engine is being loaded... weird
22:03dpthfltrRick Hickey I kiss you
22:03dpthfltrok that is all
22:03dpthfltrgoodnitez
23:20hiredmanclojurebot: ping?
23:52lisppaste8jawolfe pasted "lazy concat?" at http://paste.lisp.org/display/72461
23:52jawolfeHi, what's the proper idiom for *truly* lazy concatenation ?
23:53jawolfe(in situations where lazy-cat is not applicable since the number of arguments is not known at compile-time)
23:53jawolfeAs you can see in the above post, while it claims to be lazy, concat seems to get ahead of itself.