0:05 hamza: guys, what is the best way to add 1 to a list contaning (2 3) so that i get (1 2 3), tried (concat 1 '(2 3)) but does not work?
0:06 _ato: ,(cons 1 '(2 3))
0:06 hamza: _ato: thanks.. that worked..
0:07 hiredman_: ,(cons 1 '(2 3))
0:07 clojurebot: (1 2 3)
0:07 hiredman_: _!
0:07 good lord freenode
0:32 hiredman: clojurebot: ping?
0:32 clojurebot: PONG!
0:33 Raynes: hiredman: ping?
0:38 KirinDave1: Hmm
0:38 Compojure+enlive's performance is damn impressive if you don't run the template every time.
0:39 I wonder if I could genericize this into a macro.
1:20 hamza: guys i am kinda at lost, how would you turn a list such as ((1) (2 3 4)) into (1 (2 (3 4))) or reverse ((1 2 3) (4)) into (((1 2) 3) 4) ?
1:23 arbscht: ,(reduce #(list %1 %2) (clojure.contrib.seq-utils/flatten '((1 2 3) (4))))
1:23 clojurebot: (((1 2) 3) 4)
1:23 hiredman: :|
1:23 list
1:24 the anonymous function is not needed
1:25 arbscht: hm yes
3:27 LauJensen1: Morning team
3:55 tomoj: I wonder what the probability is that I will someday find a clojure job
3:56 esj: morning all
4:09 hoeck: tomoj: not that low, I think
4:10 tomoj: at least I am very confident :)
5:26 shantanu: did anybody encounter this error while compiling Clojure sources through Maven?
5:26 org.apache.maven.lifecycle.LifecycleExecutionException: Clojure failed.
6:00 ordnungswidrig: hi
6:01 esj: yo
6:03 ordnungswidrig: that was hard work. irc over ejabberd. connecting as a osx newbie trouble
7:35 aldebrn: Hi, I'm trying to use git clojure, and "ant clean jar" gives me hundreds of warnings, plus some errors in clojure/src/jvm/clojure/lang/Numbers.java all complaining about methods on toBigDecimal(x). This is on OpenJDK java version "1.6.0_0", any hints?
7:37 hamza: just a guess, but maybe some methods on suns api not availible on openjdk..
7:41 aldebrn: Thanks hamza. What's the difference between the clojure and the "clojure (new)" entities at build.clojure.org ?
7:43 the-kenny: aldebrn: new is based on the "new" branch on github. It has some new things like defprotocol/deftype
7:43 hamza: here is some more info if you are intrested,
7:43 http://
7:44 talks about the new features in new branch
7:44 the-kenny: _ato: ping
7:44 aldebrn: Is new strictly a superset of non-new?
7:44 _ato: the-kenny: pong
7:44 the-kenny: _ato: Is that you compojure-jar on clojars?
7:45 *your
7:45 _ato: the one with ato in it?
7:45 yeah
7:45 the-kenny: Yes.
7:46 It looks like it's broken because clojure was renamed to "1.1.0-master-SNAPSHOT"
7:46 _ato: egh.. annoying. Yeah that pretty much broke everything, I wish they symlinked it
7:48 the-kenny: hm.. maybe someone will symlink it.
7:49 _ato: hrmm..
7:49 I wonder if I can do it in Clojars actually
7:50 oh well, probably betters to just update all the jars, hopefully it won't get renamed again
7:51 liebke: the-kenny: I uploaded a version of Compojure to address that problem: [org.clojars.liebke/compojure "0.3.1-master"]
7:52 the-kenny: liebke: Ah, sounds good. That one wasn't listed in my search for "compojure"
7:53 liebke: yeah, the search doesn't seem exhaustive
7:56 _ato: search doesn't work if there's no description set. Damn have I still not pushed out the fix for that. I gotta stop tinkering with this widefinder stuff and give Clojars some more work
7:57 ugh... all the tutorials and such are going to be pointing at 1.1.0-alpha as well, aren't they?
7:57 perhaps I should upload the old snapshot
7:58 I guess it's better that people are out of date than can't get things to work at all
8:00 aldebrn: liebke, I'm about to send a message to incanter group asking about an error in compiling Incanter: it breaks with 'Exception in thread "main" java.lang.ClassFormatError: clojure.contrib.pprint.PrettyWriter (erroneous identifier) (io.clj:22)' and I wanted to apologize in advance for asking what must have a very simple answer...
8:00 Chousuke: aldebrn: you might want to try recompiling clojure-contrib
8:01 hamza`: i had this error, when i compiled clojure-contrib without pointing clojure.jar
8:01 even if clojure.jar is in your classpath for some reason it won't pick it.
8:01 aldebrn: That's where I know it from too, but incanter build includes clojure
8:01 liebke: aldebrn: yes, Chousuke and hamaza' are right
8:01 which build script are you using?
8:01 ant or maven?
8:10 * the-kenny likes compojure
8:10 _ato: ok, I've just pushed the old-named clojure jar to clojars' repository: http://
8:10 liebke: aldebrn: if you're using maven, I wonder if you have a version of clojure-contrib in your repository that isn't pointing to the clojure jar. If you're using ant (and ant deps), then I don't know what's wrong :-(
8:10 _ato: that should at least serve as a temporary measure
8:11 come on 1.1 so we can all start pointing everything at stable version numbers
8:11 liebke: _ato: nice :-)
8:17 Chousuke: _ato: until everyone starts using defprotocol and deftype and then you need git master for everything again ;P
8:18 Hm, I wonder if it's right to call transient things "transient values"
8:19 I don't want to call them mutable because they're more than that.
8:20 ordnungswidrig: Chousuke: more than mutable?
8:20 cemerick: Chousuke: if they're mutable, it's hard to call them 'values'
8:20 IMO
8:20 Chousuke: ordnungswidrig: yeah. they're really mutable only as an implementation detail .)
8:21 ordnungswidrig: Chousuke: I see. No third state after immutable and mutable
8:22 Chousuke: I just think it's important that people not think of them as mutable things.
8:23 because you can't use them to write imperative algorithms.
8:23 esj: is there simpler way to select a subset of values from a hash-set directly, or is (into [] (map #({:a 3 :b 3 :c 4} %) '(:c :a))) the way ?
8:23 Chousuke: esj: (into [] the-map [:c :a])
8:24 hm
8:24 forgot map
8:24 oh well.
8:24 I think there's something in the clojure.set namespace too. maybe.
8:24 chouser: "transient collections"?
8:25 esj: ,(into [] {:a 3 :b 3 :c 4} [:a :c])
8:25 clojurebot: java.lang.IllegalArgumentException: Wrong number of args passed to: core$into
8:25 Chousuke: chouser: yeah, but the intermediate things? :/
8:25 chouser: esj: select-keys
8:25 Chousuke: esj: yeah, you need the map still. I was just too hasty :P
8:25 esj: :)
8:26 Chousuke: ,(into [] (map {:a 1 :b 2 :c 3} [:a :c]))
8:26 clojurebot: [1 3]
8:26 chouser: Chousuke: what intermediate things?
8:26 ,(select-keys {:a 1 :b 2 :c 3} :a :c)
8:26 clojurebot: java.lang.IllegalArgumentException: Wrong number of args passed to: core$select-keys
8:26 Chousuke: chouser: those values you get when you're actually building the data structure.
8:26 esj: ,(select-keys {:a 1 :b 2 3} [:a :c])
8:26 clojurebot: 5
8:26 chouser: those are transients, aren't they? transient collections.
8:26 esj: thanks guys, in business now.
8:27 Chousuke: collections is too long a name ;P
8:27 chouser: heh
8:28 Chousuke: I don't think "transient value" is too bad a name. it's immutable for the duration of its lifetime :)
8:28 which is exactly until you try to mutate it.
8:29 ordnungswidrig: Chousuke: ant then?
8:31 Chousuke: hm?
8:32 cemerick: 'value' has a very specific implication of immutability AFAIK. Consider, would "mutable integer" make sense?
8:32 rhickey: transient value is a contradiction
8:32 ordnungswidrig: Chousuke: argl, I meant, "and then?" after you try to mutate them
8:33 Chousuke: ordnungswidrig: the reference becomes invalid and using it again means undefined behaviour.
8:33 all the functions return new transient things that you should use.
8:33 ordnungswidrig: Chousuke: i see
8:36 chouser: just leave off the second word like we do with locals. They are transients.
8:36 "transient" is a noun in this case
8:42 asking for donations apparently gets you some money and *lots* of opinions. :-)
8:43 Chousuke: heh
8:43 rhickey: actually I'm glad it hasn't devolved into arguments about open source and free software in general
8:44 cemerick: rhickey: mostly ;-)
8:44 rhickey: right
8:45 praptak: A quick syntax question - does (fn [] 3) have a #() equivalent?
8:45 Chousuke: not really.
8:46 #(do 3) is the closest you can get :)
8:46 chouser: praptak: not really. You can say #(do 3) but that's rather ugly
8:46 praptak: Thanks, I was just curious.
8:46 chouser: praptak: (fn [] 3) is fine. Or (constantly 3)
8:46 cemerick: I usually use constantly -- code == docs.
8:47 rhickey: yes
8:47 praptak: @chouser: Thanks, I didn't know about constantly.
8:47 ordnungswidrig: i like constantly
8:50 praptak: Ah, it even works for any number of arguments
8:51 chouser: right, so not exactly the same as (fn [] 3)
8:53 cemerick: rhickey: have you bothered to look at any of the jdk7 closure stuff since devoxx?
8:53 ordnungswidrig: Chouser: taken any number of args is not bad in this case
8:54 cemerick: Seems like everything's going to be in flux for an extended period of time from what I've read.
8:54 rhickey: cemerick: I've read the blog posts - there's a long road ahead
8:55 cemerick: that's what I figured you'd say
8:56 There's going to be a lot of jdk7-esque forks come next year, I'll wager.
8:56 rhickey: http://
8:59 cemerick: yeah, i saw that
8:59 I don't grok it all fully, of course. The process seems right broken though.
9:00 rhickey: it's a difficult thing to retrofit
9:01 although, now that Java is behind C#, maybe the borrowing could go the other way
9:02 ordnungswidrig: Anything to whatch out for regarding aquamacs and clojure?
9:02 rhickey: will always be more verbose than in a language built around it
9:02 ordnungswidrig: that's my combo, though I don't use Slime
9:04 cemerick: it seems like this is Java's last hurrah w.r.t. attempting big changes. The gridlock seems intense, and I can't imagine it getting any better.
9:05 rhickey: checked exceptions are proven a terrible idea by closures
9:08 ordnungswidrig: rhickey: clojure-mode with elpa works fine? What do you use if not slime? *wonder*
9:09 rhickey: ordnungswidrig: brute force
9:09 ordnungswidrig: rhickey: never considered this. you mean, just a repl
9:10 rhickey: ordnungswidrig: yes, just clojure-mode + repl
9:10 cemerick: rhickey: how's the intellij clojure stuff these days?
9:11 ordnungswidrig: rhickey: then, you can be sure to receive a donation from me :-) I'll declare it as solatium
9:11 rhickey: cemerick: I just got IDEA 9 installed - haven't done much Clojure editing but debug seems much smoother
9:11 ordnungswidrig: thanks :)
9:17 fliebel: Is there any Markdown thing for Clojure? The only thing I found was Javascript ran through Rhino.
9:18 karmazilla: fliebel: there's markdownj for Java
9:19 fliebel: karmazilla: I read it has serious issues, but I might try it…
9:20 chouser: fliebel: we're using markdownj for the book. Hasn't been a problem yet, afaik.
9:20 fliebel: "the book"?
9:21 hamza`: i use markdownj from clojure, the only problem i had is if i put a list just before a code block it messes up.
9:22 chouser: fliebel: the book about Clojure that Fogus and I are writing.
9:22 markdown as a spec is creaking a bit under our ever-growing requirements, but markdownj as an implementation hasn't cause us any problems I'm aware of.
9:22 fliebel: chouser; ah, that book, cool!
9:23 chouser: yeah, no link for the book yet. hopefully this week...
9:25 fliebel: I think the Showdown+Rhino is a very creative solution… I'm not sure how MarkdownJ compares with that…
9:31 hmmm, showdown+rhino looks good!
9:48 devlinsf: (doc future-canceled)
9:48 clojurebot: I don't understand.
9:48 devlinsf: (doc future-cancelled)
9:48 clojurebot: Gabh mo leithscéal?
9:48 devlinsf: (doc future-cancelled?)
9:48 clojurebot: "([f]); Returns true if future f is cancelled"
9:49 devlinsf: rhichey: cancelled is spelled w/ 1 l
9:49 err... rhickey
9:49 oops
9:50 cypher23: devlinsf, both are correct. 2 l is british, one l is american spelling
9:50 djork: what's up with clojure.contrib.http.agent
9:50 devlinsf: Oh...
9:50 djork: "java.lang.IllegalStateException: bytes already refers to: #'clojure.core/bytes in namespace: user (NO_SOURCE_FILE:0)"
9:50 trying to use it
9:50 devlinsf: Firefox is yelling at me. Nevermind
9:50 the-kenny: djork: I think that's fixed in a newer version of clojure-contrib
9:50 esj: djork: it crashes with an existing symbol
9:51 cypher23: devlinsf, you probably have an american-english dictionary :)
9:51 esj: djork: I'm excluding it on require
9:51 (:use compojure
9:51 clojure.contrib.json.write
9:51 [clojure.contrib.http.agent :exclude (bytes)]))
9:51 djork: huh
9:51 seems like it might be better to fix http.agent :)
9:51 devlinsf: cypher23: Well, seeing how I live in the US :)
9:52 esj: I mailed Stuart at the time, I think.
9:52 the-kenny: djork: It's fixed: http://
9:52 djork: hmm
9:53 rhickey: devlinsf: that's one spelling where I agree with the brits
9:53 fliebel: cypher23: I'd love to have java.awt.colour :D
9:53 devlinsf: rhickey: Okay, cool. It'll be fun to watch this issue pop up on the list occasionally :)
9:54 rhickey: Should I create an assembla ticket & immediately close it to document this non-issue?
9:55 djork: the-kenny: I still seem to be getting the error after pulling and rebuilding the jar
9:55 rhickey: devlinsf: probably not, I wonder if people really look for closed issues on things like that
9:55 the-kenny: djork: hm... strange
9:55 djork: it may be my own classpath problem
9:56 devlinsf: rhickey: Okay, no problem
9:57 djork: both clojure.jar and clojure-contrib.jar are up-to-date from master
10:02 when I change the name of 'bytes' in http.agent, I can use it
10:02 BTW I'm trying to use it in a REPL
10:02 (use 'clojure.contrib.http.agent)
10:03 do I need to use it :as something else?
10:04 fliebel: How would this convert to clojure code? Runtime.getRuntime().exec(Command)
10:05 angerman: (. Runtime/getRuntime exec Command) ?
10:05 chouser: (.exec (Runtime/getRuntime) Command)
10:05 angerman: right. should proably wrap the Runtime/getRuntime.
10:06 fliebel: ,(.exec (java.lang.Runtime/getRuntime) "ls")
10:06 clojurebot: java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)
10:06 scgilardi: The fix to contrib allows "require 'clojure.contrib.http.agent" to work, but by using "use" you're trying to bring bytes into the user namespace.
10:06 chouser: angerman: I don't really like using the naked . operator in regular code anymore.
10:07 scgilardi: you can either require it and use its full namespace to qualify its names, require it :as to use an alias to qualify its names, or use it and exclude bytes yourself.
10:07 fliebel: angerman & chouser: gives back #<UNIXProcess java.lang.UNIXProcess@1629ce8c>
10:07 angerman: chouser: guess that's personl preference. though I hardly do interop, so I don't really have an opinion on it.
10:07 chouser: fliebel: congrats! success!
10:07 angerman: fliebel: so? what did you expect?!
10:07 scgilardi: user=> (use '[clojure.contrib.http.agent :exclude [bytes]])
10:07 nil
10:08 fliebel: I expected to see the output of the command… but it's java anyway, so I guess I should fetch some io reader somewhere... :S
10:09 chouser: fliebel: you might be interested in clojure.contrib.shell-out
10:09 fliebel: chouser: might be :D Thanks!
10:11 chouser: angerman: not a huge deal, but http://
10:13 djork: so I should require http.agent instead of use
10:16 scgilardi: require will work well and is generally preferable to use. require with an :as will make typing more convenient.
10:17 djork: so that's the best way to use a lib that may have namespace conflicts, then?
10:17 I've always been using (use)
10:17 but I guess use is kind of heavy-handed
10:18 chouser: yeah, unadorned 'use' is unfortunately very convenient at first but often causes trouble in the long run.
10:18 * drewr favors use/:only
10:19 devlinsf: Depends on the lib
10:19 chouser: I'm now in the habit of always using 'use', but always with :only and/or :as
10:19 devlinsf: e.g. , I'll use clojure.test in test code
10:19 drewr: the only time I use require is when I'll use most of the publics in an ns
10:19 scgilardi: at the repl, I think it's fine to utilize whatever is convenient. When writing an "ns" form for a lib, it's nice for a (human) reader to be able to trace the origin of every non-core name used. That means either using require, require with :as, or :use with only.
10:20 chouser: scgilardi: yes, good point. naked 'use' at the repl is fine.
10:22 scgilardi: one thing I don't do enough is "enter" the namespace I'm working in at the repl using "in-ns". That makes all of its names available without namespace-qualifying.
10:22 fliebel: what is the preferred way in clojure to handle files? just plain java.io?
10:23 scgilardi: clojure.contrib.duck-streams makes lots of file and stream-related work very easy.
10:23 devlinsf: Hey, question about PersisentStructMap
10:23 scgilardi: clojure.contrib.java-utils has some helpful functions
10:24 aldebrn: liebke, I've made an "fft.clj" in the same vein as stats.clj and core.clj in the incanter/src/main/clojure/incanter directory, is there something else I need to do before clj will pick it up?
10:24 scgilardi: and java.io and java.nio are there to use as well.
10:24 fliebel: scgilardi: thanks
10:24 devlinsf: I have an instance of a struct map and I'm trying to get at the definition
10:25 Similar to how I'd get at a comparator w/ a PeristantSortedMap
10:25 chouser: devlinsf: yeah, you can't get anything useful there.
10:25 devlinsf: Well, looking at the class def it seems I should
10:26 (.def (my-instance)) should do the trick
10:26 Would patching in a simple getDef method do the trick?
10:26 chouser: it's not public
10:27 liebke: aldebrn: use load-file
10:27 chouser: devlinsf: yes, making it public would let you get at it.
10:27 if you just want a list of the keys, you can do (keys (empty a-struct))
10:46 rhickey: devlinsf: I don't want to enhance structmaps, rather people move to deftype
10:48 devlinsf: rhichey: Okay. I'll review deftype, and let you know if I need to request an enhancement
10:48 Ah
10:48 rhickey
10:49 Hacker news calls you Rick... I call you Hichey.. k & h are confusing!
10:50 Anyone: How do I browse the new branch on github?
10:50 chouser: devlinsf: theres a 'brnaches' dropdown
10:50 devlinsf: Ah, got it
10:51 rhickey: devlinsf: there are definitely differences between defstruct and deftype, but defstruct has problems (AOT, serialization) that deftype solves, plus perf is better, can implement protocols etc
10:53 cypher23: devlinsf, use the power of tab completion? :)
10:53 devlinsf: rhickey: Right now I'm intereted in the map-like abilities of defstruct.
10:53 cypher23: Using a brower right now :(
10:54 cypher23: oh
10:54 devlinsf: rhickey: What did you decide about types supporting keyword lookup?
10:55 rhickey: devlinsf: they do
10:56 devlinsf: Okay. What class implements IDynamicType? Or is that compile time magic?
10:56 rhickey: devlinsf: you shouldn't need to fiddle with IDynamicType
10:57 devlinsf: rhickey: Okay, here's what I'm really looking for. defstruct had the associated PersistentStructMap class. What is the analog of PersistentStructMap for types?
10:59 Oh, wait.... do I need to look in clojure.asm?
10:59 rhickey: devlinsf: you should read through this: http://
11:00 shantanu: hi all
11:00 chouser: deftypes don't have to share any common superclass except Object
11:00 devlinsf: Ah.
11:00 chouser: shantanu: hi
11:01 shantanu: am wondering if anybody encountered something like thjis: java.io.FileNotFoundException: Could not locate org/bitumenframework/jettify/clj__init.class or org/bitumenframework/jettify/clj.clj on classpath
11:01 devlinsf: Hmmm... so I think this answer my underlying question.
11:01 shantanu: this is while compiling clojure code with maven
11:01 chouser: shantanu: looks like something you want isn't in your classpath.
11:01 devlinsf: There probably is NOT the need to use a map operation over a type the same way there is in a hashmap
11:02 Thanks rhickey & chouser
11:03 chouser: devlinsf: if the type doesn't implement IPersistentMap, then probably not.
11:03 shantanu: the same code compiled fine with Ant....seems related to maven-clojure-plugin
11:03 devlinsf: chouser: Even if does, it's a completely different beast
11:03 chouser: That, and this discussion can wait until 1.2 is closer to release
11:04 * chouser hopes 1.2 is very close.
11:04 devlinsf: Then let's finish documenting 1.1 :)
11:05 rhickey: we seem to be stuck on 1.1. In the old days I would just zip up the latest and ship it :)
11:05 actually I always did a (painful) doc day
11:05 devlinsf: Ha! the old days
11:05 Shows how fast things have changed
11:06 rhickey: now I'm afraid of all the maven stuff - all the numbers have to align with I don't know what, artifacts etc
11:06 devlinsf: rhickey: Could you help use write the chuncked seqs section?
11:06 *us
11:07 chouser: it's probably unavoidable anyway, but I was hoping to not have to include structs in the book.
11:07 devlinsf: is the chunked seqs section started somewhere?
11:08 devlinsf: Yeah, follow SS' link
11:08 http://
11:08 Well, it's outlined
11:10 rhickey: transients section should just refer to http://
11:11 devlinsf: rhickey. Okay, could you add the last part, where how to properly use them is discussed
11:11 cemerick: rhickey: I'm sure you've seen the writing on the wall that maven is the one true way these days? ;-)
11:12 we'll actually be 95% maven by the end of the week, which is a little crazy
11:13 * rhickey remembers when he pushed a button in IntelliJ and Clojure existed 3 seconds later - no XML
11:14 cemerick: "We need something to manage all this incidental complexity!" :-P
11:15 rhickey: you mean, to introduce it?
11:15 cemerick: that was a joke, there, son!
11:15 * cemerick is in a foghorn leghorn mood today
11:16 rhickey: I'm too afraid of Maven to laugh
11:16 cemerick: I was too until about 12 days ago. Used ant for ~10 years.
11:17 devlinsf: cemerick: Wow. I just had netbeans do it for me
11:17 cemerick: devlinsf: builds, you mean?
11:17 chouser: ant scares me too though
11:17 devlinsf: Yeah
11:17 chouser: we use cmake at work.
11:17 cmake scares me
11:18 cemerick: IDEs beg for you to tie your build to a local environment. That's why I went with NB years ago, it didn't have its own build circus.
11:18 rhickey: devlinsf: I'm fearful of overdoing it as far as release notes etc. There are docs on the functions. Some things are best not said twice. But transients and chunks are topics. See prior release notes - they were just gussied up commit logs. Special notes only to highlight new features, or document breakage/deprecation. I think we need to KISS. Right now, not knowing what maven will need is the dark area for me
11:18 cemerick: chouser: you prefer to use butterflies?
11:18 ;-)
11:19 chouser: cemerick: make. I like make.
11:19 rhickey: cemerick: clojure used to build with a javac one-liner
11:19 chouser: well, gnumake
11:19 cemerick: My only sustained exposure to make is via autoconf. The one time I had to actually screw with a makefile was not pleasant. At that point, I longed for XML.
11:20 chouser: the chunk functions don't seem to have docstrings
11:22 rhickey: I assume you'd take a ticket/patch for chunk fn docstrings?
11:22 hugod: is using extend the expected way to define a protocol method implementation on a deftype that calls the deftype's own factory function?
11:33 Kjellski: When will clojure turn 2.0? I mean, have you a better guess then "When it´s done" ?
11:34 danm_: does anyone even know what 2.0 means for clojure yet? why would the timeline for 2.0 be important to you right now?
11:34 shantanu: chouser: it seems i found out why the maven build was breaking -- whenever the namespace contains an underscore, it barfs
11:35 Kjellski: danm_ : no not really... I´m just interested... ^^
11:35 shantanu: chouser: i faced similar issue when compiling with Ant earlier
11:35 danm_: Kjellski: fair enough, I was just sort of confused
11:35 chouser: shantanu: really? hm.
11:36 shantanu: chouser: i just removed the underscore from the namespace -- it now compiles fine
11:36 bjorkintosh: what happens if people don't start supporting clojure's daddy?
11:36 does it mean it dies and never turns 2.0?
11:37 shantanu: chouser: i suspect this may have to do with Clojure's compile module (the way it resolves namespaces)
11:39 Chousuke: bjorkintosh: probably development just won't be as rapid as it could be.
11:40 bjorkintosh: ah that's sad.
11:40 it seems the language has generated a lot of excitement and it's a shame the creator of it hasn't been banished to an ivory tower :P
11:40 okay okay that was mean.
11:41 lisp and ivory towers seem to go together though.
11:41 chouser: Clojure is not that kind of lisp. :-)
11:41 Chousuke: I suppose Rich just doesn't feel like spending 15 years slowly building up momentum.
11:41 danm_: seems fair
11:44 cemerick: shantanu: what version of clojure-maven-plugin are you using?
11:45 shantanu: chouser: it is <groupId>com.theoryinpractise</groupId> <artifactId>clojure-maven-plugin</artifactId> <version>1.0</version>
11:45 chouser: oops! bad copy-paste
11:46 cemerick: another oops! hi cemerick
11:47 cemerick: well, clojure-maven-plugin is up to 1.1 in releases, so that's a good first thing to try
11:47 Further, the 1.2 snapshots (not sure if they're around anywhere, I just have them deployed internally) have a lot of good improvements.
11:48 shantanu: cemerick: i just decided to learn Maven today, and gave this plugin a try :-) -- i will try 1.1 out
11:48 cemerick: it's worked well for me :-)
11:48 shantanu: and 1.2 as well
11:49 cemerick: (and I have plenty of libs with dashes in the ns, FWIW)
11:49 shantanu: dashes seem to cause problems when compiling with Ant, but underscores were fine with Ant
11:50 so i fell back to underscores
11:50 seems i should experiment a bit more
11:51 rhickey: chouser: I'm not sure I want people using chunk fns yet, maybe label experimental
11:51 ditto transients - experimental (more on this in a sec)
11:52 devlinsf: sorry, I got called away - anyway, your outline is good, but fn docs need to make it into fns and concept docs onto the clojure.org site - I don't want people searching for release notes for docs
11:54 devlinsf: rhickey: Okay, makes sense
11:54 rhickey: should there be a PSA in the mailing list when you release 1.1, though?
11:55 rhickey: devlinsf: sure
11:56 ericthorsen: I want to define a symbol called 'Class in a namespace. I put (:refer-clojure :exclude (Class)) in the ns decl and call (ns-unmap *ns* 'Class). Loads dynamically but won't AOT. Keep getting "Class already refers to: class java.lang.Class in namespace:"
11:56 Is this possible to do?
11:56 rhickey: I'd also like to try release candidates this time around, so we know the zip and naming is all ok for downstream things
11:57 ericthorsen: dunno
11:57 ericthorsen: rhickey: Doh!
11:57 rhickey: sounds scary remapping Class
11:58 Chousuke: at least making source tarballs is relatively easy. github does them for you :P
11:58 devlinsf: rhickey: Sounds cool. What else exactly needs to happen, besides fleshing out the docs? Is there a concrete to do list before RC1?
11:58 ericthorsen: rhickey: I know...I could "want something else" but it will make what I'm doing not uniform
11:58 shantanu: cemerick: the underscores still don't cut it with the 1.1 plugin, but it works with dashes
11:59 Chousuke: hm, right, docs.
11:59 devlinsf: ericthorsen: Steal a trick from Ruby. name your fn klass
11:59 cemerick: shantanu: wait, namespaces with underscores fail, but ns' with dashes are OK?
11:59 Chousuke: IIRC I saw some reference in clojure.test docstrings to subversion and google code. Should probably fix that.
11:59 shantanu: yes
12:00 cemerick: huh. Well, I can't say I've ever made an ns with an underscore in it.
12:00 rhickey: devlinsf: http://
12:00 shantanu: i admit that's unusual...i did so because i ran into issues with Ant with dash-in-filenames
12:01 devlinsf: rhickey: Yeah, I remember that. Do these items have human names attached to them?
12:01 shantanu: i guess avoiding dashes and underscores is a good idea
12:02 rhickey: devlinsf: like code names? :)
12:02 devlinsf: Lol
12:03 That'd be fun. I was think of a much mor boring version, though
12:03 cemerick: dashes are right and proper, IMO. An ns with an underscore is a tad ugly, I'd say. *shrug*
12:03 aldebrn: To make sure I'm remembering correctly: one should try to use deftype instead of structmaps as of now
12:03 devlinsf: Like "Who is responsible for this"?
12:03 subhadeep: clojure rocks
12:03 rhickey: don't use underscores in ns names
12:04 replaca: Q (cause I'm too lazy to read right now): is = on a persistent data structure equivalent to lisp eq or lisp equal? (Seems like eq would be just as effective for persistent structures and a whole lot faster, but I just want to check my logic before I get too deep.)
12:04 rhickey: devlinsf: stuartsierra was supposed to be marshaling the process
12:04 devlinsf: Ah
12:05 rhickey: What about "A Plan for release candidates"? SS or you?
12:06 rhickey: replaca: there's no guarantee that 2 = data structures have a shared genesis and thus a shared root - can't be eq
12:06 devlinsf: I've gotta run right now - my preference is for an absolute minimum of ceremony and fuss
12:06 devlinsf: k
12:06 tttyl
12:07 replaca: rhickey: ahh, yes I thought there was a hole in my thinking! I was thinking the other way around. Thanks.
12:09 aldebrn: To make sure I'm remembering correctly: one should try to use deftype instead of structmaps as of now
12:10 rhickey: very nice response so far: http://
12:10 fliebel: For those who suggested using markdownj: I got this issue as well: http://
12:11 rhickey: maybe you should put up a donation button, or am I overlooking it?
12:12 cypher23: fliebel, right on the front page? http://
12:12 cemerick: fliebel: big honkin' image in the middle of clojure.org ;-)
12:13 fliebel: ok, mi fault, I was just looking on the funders page… my mind ignores buttons and adds for the rest of the time ;)
12:14 replaca: rhickey: Great to hear! I'll be there too, next time I'm sitting in front of my computer at home. Though I think Clojure actually *costs* me money :-)
12:14 Chousuke: rhickey: where do you think :pre and :post should be documented? defn?
12:15 drewr: rhickey: you might want to list the people that donated through sourceforge back in the day
12:15 I'll definitely be donating again though
12:23 qed: http://
12:26 freenode has been absolutely unbearable the last couple of days
12:30 bjorkintosh: hide join/part messages :)
12:30 is it that freenode is b0rked or buggy?
12:30 nuba: and netsplits
12:30 bjorkintosh: can't the netsplits be done cleanly?
12:31 nuba: from [Global Notice] >we're still experiencing heavy ddos directed at a variety of locations where we have infrastructure hosted.
12:31 bjorkintosh: oh.
12:31 that's not nice.
12:32 nuba: nope
12:32 set yourself to +w if you want to receive these notices
12:32 /mode bjorkintosh +w
12:34 fliebel: Who made clojurebot?
12:36 chouser: clojurebot: who's your daddy?
12:36 clojurebot: who is x
12:36 chouser: fliebel: hiredman
12:37 fliebel: chouser: It's written in Clojure I guess? :D
12:37 chouser: fliebel: I believe so, yes. :-)
12:37 clojurebot: where are you?
12:37 clojurebot: http://
12:39 fliebel: It would be cool if it had some voicemail functionality…
12:41 qed: why voicemail?
12:41 are you calling irc channels or something?
12:42 "hello, yes, this is fliebel, im looking to speak with chris houser"
12:42 Chousuke: hm.
12:42 fliebel: I mean that you can leave a message for someone who's not online
12:42 qed: "ahhh, he's away from his desk...very well then"
12:42 fliebel: ahh :)
12:42 Chousuke: it might be useful to have "dummy vars" to document some features of Clojure that apply to multiple functions.
12:43 qed: Chousuke: clojurebot !
12:43 oops
12:43 clojurebot: !
12:43 clojurebot: CLABANGO!
12:44 qed: heh heh, whatever happened to Madison Square Clabango
12:46 Chousuke: that makes sense to me
12:48 clojurebot: outback steakhouse
12:48 clojurebot: I want to go to there
12:59 qed: clojurebot: whose job isthat
12:59 clojurebot: that's romanb's job
12:59 polypus: clojurebot: who are you?
13:00 clojurebot: You will not become skynet
13:00 the-kenny: clojurebot: skynet?
13:00 clojurebot: Gabh mo leithscéal?
13:00 the-kenny: clojurebot: skynet
13:00 clojurebot: I don't understand.
13:00 the-kenny: Hm... I thought I've told him he *will* become skynet
13:00 polypus: clojurebot: wanna come back to my pad for a drink?
13:00 clojurebot: for is not used enough
13:01 qed: heh
13:01 clojurebot: e4
13:01 clojurebot: I resign
13:01 polypus: lol
13:02 qed: clojurebot: curious
13:02 clojurebot: /nick other-clojure-bot
13:02 polypus: maybe he (she?) could do better: http://
13:03 qed: clojurebot: sex?
13:03 clojurebot: It's greek to me.
13:04 polypus: greek sex?
13:04 qed: kinky
13:06 clojurebot: historical ninja robots
13:06 clojurebot: historical ninja robots are so 1999...
13:06 qed: clojurebot: futuristic ninja robots
13:06 clojurebot: sooo much better than any of the historical ninja robots
13:06 qed: agreed
13:07 StartsWithK: 3000 users on ml :)
13:07 qed: clojurebot: twitteronia
13:07 clojurebot: twitteronia is where shaq lives
13:10 bagucode: clojurebot: seen ztellman?
13:10 clojurebot: no, I have not seen ztellman
13:10 bagucode: clojurebot: thank you
13:10 clojurebot: You will not become skynet
13:10 qed: heh
13:11 he's got an attitude today
13:11 bagucode: That's rude
13:12 cp2_: hrm, im surprised this iphone didnt burn through my desk yet
13:12 Benchmarking: FreeBSD MD5 [32/32 X2]... DONE
13:12 Raw: 434 c/s real, 444 c/s virtual
13:12 er
13:12 http://
13:12 the-kenny: clojurebot: I will become skynet
13:12 clojurebot: Titim gan éirí ort.
13:12 the-kenny: :(
13:13 qed: clojurebot: the-kenny is <reply>I heard he's becoming skynet.
13:13 clojurebot: c'est bon!
13:13 qed: clojurebot: the-kenny
13:13 clojurebot: I heard he's becoming skynet.
13:13 the-kenny: qed: No, I wanted to bring him to say he will become skynet
13:13 Not me ;)
13:13 qed: oh, hehe
13:13 the-kenny: qed: I told him "You will become skynet" and he got it wrong
13:13 qed: clojurebot: forget the-kenny
13:13 clojurebot: I forgot the-kenny
13:15 qed: i suppose i should quit playing with the bot now...
13:16 clojurebot: leiningen is <reply>http://
13:16 clojurebot: Ack. Ack.
13:16 KirinDave: So I was reading http://
13:16 Cool code
13:17 But is deftype going to become part of idiomatic clojure?
13:17 I thought the point of it was to allow folks to plumb clojure to java with maximum performance
13:17 devlinsf: kirindave: Yes, it is slated for 1.2
13:17 KirinDave: devlinsf: I mean, culturally.
13:17 I worry that everyone will use it in preference to what exists now because it's more familiar to java programmers.
13:18 "I know this, this is an Object System"
13:18 Are there concerns about that?
13:18 qed: i wont use it because i don't like Java
13:18 ;)
13:18 Raynes: 1.2? Not 1.1 :(.
13:18 Chousuke: deftype and protocols are not java things.
13:18 they're Clojure things.
13:18 KirinDave1: yes, I know.
13:18 Chousuke: They're not really object-oriented either.
13:19 Raynes: I wish it would appear sooner. Feels kind of silly using structs when something that will replace them is right around the corner.
13:19 KirinDave1: They're more similar than pure functional.
13:19 hiredman: protocols don't create an is-a relationship
13:19 KirinDave1: Chousuke: See what Raynes just said?
13:19 Chousuke: objects couple methods with data, which neither deftype nor protocols do.
13:19 KirinDave1: deftype, now replacing structs.
13:19 hiredman: KirinDave1: yes
13:20 KirinDave1: Is that the intent of deftype tho?
13:20 hiredman: KirinDave1: in idiomatic clojure deftypes will be like better structs
13:20 just holders for data
13:20 Chousuke: structmaps never were anything besides a size-optimised map
13:20 maps
13:20 hiredman: with a type
13:21 Raynes: And then we have reify. Isn't that going to replace proxy or something?
13:21 Chousuke: most of it.
13:21 polypus: http://
13:21 hiredman: like datatypes in haskell or erlang
13:21 Chousuke: reify is a mostly java interop thing though I think
13:22 Raynes: I would just use the new branch of Clojure, but it still seems to break swank for me for some reason. Phil can't reproduce it.
13:22 polypus: http://
13:23 Chousuke: I suppose deftype feels like object-orientation because it creates things that would be objects in Java and most OOP languages :/
13:23 KirinDave: It just seems like what's going to happen is that idiomatic clojure is going to go from using a set of generic types to using a set of predeclared types.
13:23 chouser: structmaps don't really have a type
13:23 KirinDave: While I understand that sometimes that makes sense.
13:24 In general, it's unnecessary.
13:24 For example, in that circuit breaker example, it didn't seem necessary.
13:25 I'm as big a fan of Wittgenstein's ladder as the next guy, but I am concerned about how readable most clojure code will be if everyone thinks they need a ton of types for every program.
13:25 Chousuke: you'll still be using maps and vectors, don't worry.
13:26 KirinDave: I know _I_ will.
13:26 And 90% of the time that'll make sense
13:26 Chousuke: Well, at first everyone will be excited about the new playthings.
13:26 KirinDave: But I'd hate to start seeing other clojure code senselessly use deftype.
13:26 Chousuke: but I'm sure it'll settle down eventually.
13:26 chouser: most application-level deftypes will implement IPersistentMap
13:26 cemerick: ah, things are coming together now http://
13:28 KirinDave: Well, I admit to some trepidation.
13:28 After years of trying to get java developers to look at lisp and failing.
13:29 I suspect, so crassly, that if you give people a familiar construct they'll prefer it. :)
13:32 Chousuke: there are over 100 contributors already it seems.
13:39 dysinger: cemerick: we setup invoiced support with rich yesterday - did you beat me to it ?
13:39 ;)
13:40 cemerick: dysinger: Yeah, I think we beat you, but ours isn't a monthly commitment -- we don't have all that shiny VC money ;-)
13:40 dysinger: I qualified my tweet with "first _invoiced_ monthly" just in case :P
13:40 cemerick: yeah, I saw that :-)
13:40 drewr: ugh, swank-clojure-find-package is the bane of my existence
13:41 cemerick: I'm hoping to make a monthly contribution, essentially backing into a regular royalty based on clojure-based app sales
13:41 polypus: ugh
13:46 dysinger: holy netsplit x2
13:47 lghtng_away_away: it's DDOS
13:47 lghtng: freenode is under assault atm
13:47 hiredman: dysinger: are you guys still hiring?
13:48 dysinger: hiredman: on going yes
13:49 lghtng: maybe flks didnt hear the 'pikes to the boards' calls a few days back...
13:50 hiredman: dysinger: I sent my resume into the jobs@ address a week or two ago, and had't heard back, so I was just kind of curious
13:50 lghtng: i'd be checking me some updates on critical servers that get referenced alot in freenode traffic, there may be some flanking and spillover onto ircops and allies
13:51 dysinger: hiredman: ok thanks for the reminder
13:51 jasapp: dysinger: likewise
13:51 dysinger: hiredman: I'll go check it out - I may have missed it.
13:51 hiredman: jasapp: he'll snap a pool cue in half and make us fight for it
13:52 dysinger: jasapp: hiredman - real names ?
13:52 jasapp: I didn't write clojurebot, so I'm sure it won't be much of a fight :-)
13:52 dysinger: (so I can match up the emails)
13:52 hiredman: Kevin Downey
13:52 jasapp: Jeff Sapp
13:52 dysinger: ok - I'll setup calls with you today
13:53 hiredman: exciting
13:54 cemerick: heh, sonian is going to swallow the clojure jobs market whole ;-)
13:55 hiredman: pull a google
13:56 drewr: I'm sure dysinger wouldn't mind
13:56 jasapp: I always wondered about when google had to let go of their hiring curve philosophy
13:56 cemerick: We'll just have to grow a new batch when we're ready :-)
13:56 dysinger: We don't have endless slots but there is work
13:57 :) I am just happy there is jobs
13:57 These are just the beginning
13:57 cemerick: absolutely, it helps everyone
13:57 I was a little surprised by Sonatype. They weren't on my radar at all.
13:58 dysinger: same here
13:58 They do maven right ?
13:58 cemerick: right
13:58 dysinger: Nexus server & consulting
13:58 cemerick: I think @talios has done work there before, and he's behind clojure-maven-plugin, so I guess the conversations came easily enough.
14:00 devlinsf: cemerick, dysinger: where is this mythical clojure job market?
14:00 dysinger: devlinsf: @ home
14:00 devlinsf: Ah
14:00 cemerick: devlinsf: dysinger has ~415 devs, we've got two ;-)
14:00 devlinsf: :)
14:00 dysinger: hehehe
14:00 We only have 5
14:01 cemerick: yeah, but that's not nearly as wry
14:01 jasapp: are both of you at snowtide?
14:01 cemerick, and devlinsf?
14:01 cemerick: no, dysinger is with Sonian
14:01 devlinsf: Ha, no I'm somewhere else
14:02 jasapp: ahh, ok
14:02 bagucode: dnolen: ping
14:02 dnolen: bagucode: hola
14:03 bagucode: pong, rather
14:03 bagucode: dnolen: I just updated the default path mappings for :native-path in my leiningen fork. Turns out the "send a function from project.clj that gives back a path" was kinda tricky since everything in defproject is quoted.
14:04 dnolen: bagucode: yeah, I thought about it some more, and I think settling for a uniform lein native path standard is probably the best approach. Sorry haven't had a chance to follow up on the lein ML thread.
14:04 bagucode: But I threw in a fn? check anyway in eval-in-project so if someone manages to pass it a function it will work ;)
14:06 dnolen: bagucode: thx for working this stuff out, it's makes working with Penumbra so much simpler. So do you think supporting LWJGL will be a big project? Or mostly a swap?
14:07 bagucode: dnolen: Actually, ztellman contacted me to tell me that he was planning on switching to lwjgl! So I'm going to leave that to him obviously :)
14:08 dnolen: This is a direct quote "Just FYI, since I noticed the comment in your project.clj file. I plan to begin work on it this weekend."
14:08 dnolen: bagucode: wow, cool.
14:22 cemerick: is DoSing freenode just an exercise in griefing, or is there a real objective?
14:25 dnolen: bagucode: i was thinking about taking a stab it, but if you are going to anyway, I'll just follow your progress ;)
14:25 technomancy: cemerick: sounds like it's targeting a host that's co-located with freenode servers
14:26 cemerick: oh, I see
14:26 mee_: cemerick: I think it's usually just griefing, or perhaps it's the staging environment for botnet developers
14:26 taking down freenode is one of the functional tests in their suite
14:26 ;)
14:28 bagucode: dnolen: Alright, I'll just keep at it then. But I don't have much time (between actual work and some stupid contest I agreed to enter). But I'll tell you if I don't think I'll finish it so you can do something about it yourself if that is the case.
14:29 dnolen: bagucode: actually I'm totally up for collaboration, sorry, didn't know if you want to figure it out yourself.
14:29 bagucode: I will definitely help.
14:30 bagucode: dnolen: I just want it to work :) I think we have the same goal here so I'll gladly take help
14:30 dnolen: bagucode: fetching your latest now ;)
14:32 * stuartsierra is finally back in action after a busy week(end).
14:36 alexyk: what's the idiomatic ways to do this: (merge-with (fn [vr v] (conj (if (seq? vr) vr [vr]) v)) {:a 1 :b 2} {:a 0.5 :c 4})
14:36 ,(merge-with (fn [vr v] (conj (if (seq? vr) vr [vr]) v)) {:a 1 :b 2} {:a 0.5 :c 4})
14:36 clojurebot: {:c 4, :a [1 0.5], :b 2}
14:37 chouser: alexyk: the first map may have seqs as values, but the second may not?
14:38 polypus: it'd be nice if you could go:
14:40 (defmulti name fun (:thing-to-match [args] ...))
14:40 i mean (defmulti name fun (:thing-to-match [args] ...) ...)
14:40 devlinsf: alexy: use group-by
14:40 alexyk: (Sorry) Check clojure.contrib.seq-utils
14:40 Something like (group-by key a-coll-of-maps)
14:40 polypus: w/o always having to rewrite the method names and defmethod
14:41 chouser: polypus: should be an easy enough macro to write. :-)
14:42 devlinsf: alexyk: Hmm... maybe...
14:43 alexyk: no, I like your version
14:44 I can't get group-by to work w/o a second mapping operation
14:44 mee_: except re: chouser's comment, i think 'v' should be replaced with an if to handle v being a seq-providing-thing
14:44 devlinsf: Well... maybe a pivot....
14:45 Yeah
14:45 Check this out:
14:45 My Pivot: http://
14:46 Or Alex Osborne's Map reduce by
14:46 mee_: oh, conj handles that, nm
14:46 devlinsf: Alexyk: http://
14:47 Alexyk: Yeah, use alex's version
14:48 polypus: chouser: yep, just thought it'd be good in core
14:48 irc = fail
14:51 stuartsierra: I feel like there was not a consensus on whether or not we were doing anything with contrib in conjunction with 1.1.
14:51 mefesto: hey everyone. is there some procedure i need to go through in order to be able to post to the clojure google group? I'm already registered as a member but my replies don't seem to go through.
14:51 stuartsierra: mefesto: new members are moderated
14:52 devlinsf: stuartsierra: I think we're supposed to bundle contrib as-is
14:52 stuartsierra: At least something is frozen
14:52 mefesto: stuartsierra: ok, thanks.
14:52 stuartsierra: devlinsf; Bundle, as in, put contrib in clojure.jar?
14:52 That would mean big changes to the build/packaging process.
14:52 rhickey: stuartsierra: I think it got muddled between making a branch of contrib, bringing parts of contrib into core, and the original question (for me at least), bundling some parts of contrib in the release zip
14:53 stuartsierra: rhickey: Right. So what do you want to do?
14:53 My inclination is to get Clojure 1.1 out the door, then deal with contrib.
14:57 devlinsf: Would freezing contrib "as-is", and calling contrib 1.1 be good enough?
14:57 2 different jars
14:58 mattrepl: anyone been working on a queue protocol/interface for passing messages between threads and/or VMs?
14:58 stuartsierra: devlinsf: I'm not thrilled by that prospect, but it would help out with the dependency issues, at least.
14:58 chouser: Java comes with queues for passing between threads. BlockingQueues
14:59 mattrepl: agents have queues inside, too.
14:59 devlinsf: stuartsierra: That's my main concern. At least there would be a common jar to build applications against
15:00 stuartsierra: devlinsf; Yeah, probably the best we can achieve before the end of '09.
15:00 mattrepl: chouser: you mean in the sense that there's a pool of agents?
15:00 devlinsf: stuartsierra: I'd be very happy with that.
15:00 It's above my pay grade, though :)
15:00 chouser: agents queue up to use threads from the pool (when using 'send' not 'send-off'), but also actions queue up to be serviced by the agent they were sent to.
15:01 mattrepl: chouser: cool, didn't realize the latter
15:01 stuartsierra: devlinsf: It's above everyone's pay grade; we're hackers, not release managers. ;)
15:02 devlinsf: stuartsierra: Too true.
15:02 technomancy: it's unfortunate that it's impossible to build a project that uses both Clojure 1.0 and contrib using automated dependency mechanisms
15:02 chouser: well, except stuartsierra's been deputized. He's a release manager now.
15:02 technomancy: hopefully 1.1 can avoid that fate
15:02 stuartsierra: Oh, yeah. :|
15:02 devlinsf: technomancy: Would this plan help lien?
15:03 technomancy: devlinsf: it would help everyone using stable releases who doesn't want to build and copy their jars around by hand.
15:03 stuartsierra: We could even back-release "contrib 1.0", but I'll put that off 'till january.
15:03 technomancy: leiningen, clojure-maven-plugin, and ivy alike.
15:04 devlinsf: stuartsierra: Awesome. how did you feel about my proposal here: http://
15:05 stuartsierra: It's basically what we're saying
15:05 stuartsierra: devlinsf: need to test maven/ant/build stuff first, and finish the changes doc, but otherwise yes
15:06 devlinsf: Okay
15:06 stuartsierra: Rich was talking about removing the transients section, and linking to the clojure page directly
15:07 stuartsierra: devlinsf: I wondered about that myself.
15:07 devlinsf: stuartsierra; Hmmmm... at the very minimum we should provide a link
15:10 Link inserted
15:12 stuartsierra, rhickey: After thinking a bit, I like the idea of leaving the transients section in. Have more than one explanation in place would help people pick up the concept. Hearing it explained differently will help different people.
15:14 stuartsierra: "mvn install" doesn't work in current Clojure master; even after "ant"
15:17 cemerick: yeah, the poms are just wrong
15:18 stuartsierra: I'm tempted to rewrite as a Maven-based build, calling out to Ant for scripting.
15:19 ericthorsen: cemerick: Are you referring to the default source root in the pom files (or lack thereof)
15:20 albino: why not call out to clojure :)
15:20 cemerick: stuartsierra: I floated that last week, rhickey didn't sound receptive
15:20 stuartsierra: albino: because we're building Clojure!
15:20 cemerick: ericthorsen: to start, yes
15:20 stuartsierra: cemerick: ok, I can probably hack the POM so it works with the ant build
15:21 alexyk: hey guys, I know it's almost cast in stone, but contrib is really stdlib
15:21 albino: stuartsierra: so we can't call out to the previous version of clojure while building the newer version?
15:21 cemerick: stuartsierra: I think 1.2 is a reasonable goal for lobbying for a maven-driven build
15:21 alexyk: perhaps a similar mechanism can be deployed as for clojure-lang to rename it
15:21 with an alias to c.c. until deprecated
15:21 stuartsierra: albino: theoretically we could, but the we'd need to include the old version in the build
15:21 cemerick: *parts* of contrib are a stdlib. Other parts, not so much.
15:22 albino: stuartsierra: okay, I'll stop harping, but I'd rather install a previous version of clojure over ant and maven :)
15:22 ericthorsen: cemerick: I was going to submit a patch until I saw that having more than one source root for a maven project was not supported out of the box (I know little about MAven)
15:22 alexyk: cemerick: exactly. So perhaps a smaller, fixed stdlib can be carved out of contrib.
15:22 stuartsierra: albino: you'll probably only need ant
15:22 cemerick: ericthorsen: multiple source roots aren't a problem, that's a simple fix
15:22 devlinsf: alexyk: See here:
15:22 stuartsierra: alexyk: that's a goal in my mind for 1.2
15:23 cemerick: getting the compilation and install/deployment of the various artifacts will take a little bit of work
15:23 devlinsf: http://
15:23 cemerick: devlinsf: thank you
15:23 * technomancy would love to see a clojure.io namespace in 1.2 gathering useful fns from contrib
15:23 * stuartsierra too
15:23 * cemerick thirds
15:24 devlinsf: me 4....
15:24 cemerick: I think that's a more productive path than promoting libs
15:24 devlinsf: Just don't know how to set status in irc...
15:24 stuartsierra: I've got a whole set of standard libs laid out in my head.
15:24 devlinsf: type /me then your status
15:24 alexyk: ah ok, link covers it
15:24 * devlinsf sets status
15:24 devlinsf: stuartsierra: Thanks
15:24 stuartsierra: devlinsf: welcome
15:25 But first, 1.1 or bust!
15:25 devlinsf: Yes, 1.1
15:25 stuartseirra: Want to talk to you about str-utils for 1.2... but it can wait
15:26 cemerick: I'd actually rather see a real stdlib discussion hold off until 1.3 or whatever -- get the types, protocols, reify under our belt
15:26 chouser: also, parts of clojure.jar are stdlib
15:26 clojure.xml, clojure.zip
15:26 devlinsf: clojure.test
15:27 stuartsierra: rhickey: I'm going to make a ticket for Maven-related stuff in 1.1, ok?
15:29 cemerick: good point re types/protocols/reify
15:29 In the interim, numbered contrib releases might help some people out.
15:30 cemerick: If a transition to maven can be made, then that's *almost* not necessary.
15:30 stuartsierra: cemerick: almost
15:30 cemerick: ...or, so easy to do as to make it a non issue :-)
15:30 stuartsierra: Right.
15:30 Chousuke: hmm
15:31 stuartsierra: Here's an easy fix for a Java person: http://
15:31 alexyk: stuartsierra: will maven releases cover cases for different branches? in Scala, it's solved by suffixing the maven artifactId with a version, e.g. scala-json-2.7.7 vs scala-json-2.8-SNAPSHOT. Then the version field is a true version. This is the consensus for Maven-centric tools after a lot of trying.
15:31 Chousuke: I wrote some documentation for function pre- and postconditions but I still don't like that it all is in the fn docstrings
15:32 alexyk: E.g. I'd like to try protocols in an easy to build way, having clojure-new, contrib-new all properly stuffed into maven
15:32 stuartsierra: alexyk: We're close to that with build.clojure.org
15:32 Chousuke: ideally you should be able to do something like (doc preconditions) and (doc postconditions) :/
15:33 stuartsierra: Chousuke: could you copy that into the Changes doc?
15:33 Chousuke: stuartsierra: Sure.
15:33 stuartsierra: Chousuke: thanks
15:33 alexyk: stuartsierra: how close? :) is the convention the same? I've seen clojars kinda tossig namespaces, suggesting same naming for groupId and artifactId. Doesn't help with language branches at all.
15:34 i.e., where does the "new" branch suffix go?
15:34 btw "new" is quite a terrible branch name
15:34 stuartsierra: alexyk: I don't have answers for you, I'm afraid.
15:35 alexyk: stuartsierra: you're the first person not spitting nails about maven but rather wanting something to do with it, hence my asking :)
15:36 stuartsierra: alexyk: I will continue to push for regular Maven-based releases, but there's a lot of organizing to do.
15:36 alexyk: stuartsierra: good
15:37 hiredman: alexyk: new refers to new new, the main feature the branch was originally for work on
15:38 alexyk: hiredman: right, but in maven, it better be called clojure-proto or something meaningful. There's also something new, and nothing's new under the Sun.
15:39 always new, I mean
15:39 stuartsierra: ok, I'm off for a bit, I'll try to tackle the 1.1 POM this evening
15:40 hiredman: alexyk: the feature that the new branch was originally made to work was called "new"
15:40 * hiredman feels like he is in an abbet and castello skit
15:40 alexyk: hiredman: ah, ok. Well it takes 3 iterations to penetrate a head. :)
15:41 It's like a person called Andwhatsyourname.
15:42 "-- My name is John. -- Andwhatsyourname! -- John, and yours? Andwhatsyourname! ..."
15:48 devlinsf: alexyk Who's on first?
15:48 alexyk: devlinsf: I don't get baseball, so that makes no sense to me :)
15:49 devlinsf: gasp!
15:49 It's a classic!
15:50 alexyk: devlinsf: I know, still makes no sense! :)
15:51 * devlinsf shakes head
15:54 lghtng: baseball is a test of coolness under pressure
15:55 unlike continuous action sports that arent quite as dependent on actual 'zero to 60' quickness
16:01 KirinDave: oh man
16:01 alexyk: lghtng: baseball is middle-aged men in tight pants leisurely walking around for 8 hours
16:01 KirinDave: This is not a good conversation to have in #clojure.
16:01 devlinsf: So it doesn't belong in this ball park?
16:02 alexyk: ok, back to basics. How do I merge a seq of tiny maplets, ({:a 1} {:b 2}) into one huge map, {:a 1 :b 2} most concisely & fast? My seq is long.
16:02 arohner: ,(doc merge)
16:02 clojurebot: "([& maps]); Returns a map that consists of the rest of the maps conj-ed onto the first. If a key occurs in more than one map, the mapping from the latter (left-to-right) will be the mapping in the result."
16:03 alexyk: ,(merge ({:a 1} {:b 2}))
16:03 clojurebot: nil
16:03 KirinDave: And also
16:03 chouser: ,(apply merge ({:a 1} {:b 2}))
16:03 clojurebot: nil
16:03 KirinDave: ,(doc merge-with)
16:03 clojurebot: "([f & maps]); Returns a map that consists of the rest of the maps conj-ed onto the first. If a key occurs in more than one map, the mapping(s) from the latter (left-to-right) will be combined with the mapping in the result by calling (f val-in-result val-in-latter)."
16:03 chouser: ,(apply merge [{:a 1} {:b 2}])
16:03 clojurebot: {:b 2, :a 1}
16:03 alexyk: I don't need -with, I'm guaranteed to have distinct keys.
16:04 ,(merge {:a 1} {:b 2})
16:04 clojurebot: {:b 2, :a 1}
16:04 KirinDave: Lol
16:04 alexyk: works for literals, not for enclosing seq
16:04 danm_: ,(reduce merge '({:a 1} {:b 2} {:c 3}))
16:04 clojurebot: {:c 3, :b 2, :a 1}
16:05 danm_: yay?
16:06 the-kenny: ,(apply merge '({:a 1} {:b 2} {:c 3}))
16:06 clojurebot: {:c 3, :b 2, :a 1}
16:06 alexyk: danm_: leaves me with only the last element of real data, which I test with (take 5 bigseq)...
16:07 danm_: hmm, worked for clojurebot though
16:08 hiredman: alexyk: are you sure you are using it correctly?
16:09 alexyk: hiredman: no :)
16:09 hiredman: …
16:10 alexyk: wtf: http://
16:10 doh
16:10 I need to invert keys...
16:10 hiredman: …
16:11 djork: reduce + merge?
16:11 are you positive?
16:11 hiredman: djork: his keys are not unique
16:11 devlinsf: alexyk: clojure.set
16:11 alexyk: djork: works, my data was inverted
16:11 I fetch from Mongo and just need to insert into the map differently
16:12 btw that was justinbieber dominating twitter pagerank. How many of you know who that is? (instant poll)
16:13 or, does *anybody* know who Justin Bieber is?
16:14 ...there's nothing wrong in admitting you do! :) For the betterment of science.
16:29 is there a filter-not predefined?
16:30 chouser: remove
16:30 alexyk: thx!
16:35 lghtbt: hrm
16:36 lghtng: the sparlq might be a little steep for me at this point
16:36 i need something simpler
16:36 as a learning project
17:02 mabes: ,(let [foo (transient {})] (doseq [i (range 15)] (assoc! foo i i)) (persistent! foo))
17:02 clojurebot: {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7}
17:03 mabes: does anyone know why I could only assoc! 8 times within a doseq? ^^ (I'm using transients to count stuff)
17:03 Chousuke: mabes: that's abuse of transients
17:04 mabes: you can't reuse the reference.
17:05 mabes: Chousuke: well, I have a version that is not using transients and just uses maps with persistent structures but the memory use is an issue
17:05 Chousuke: mabes: no, I mean
17:05 mabes: so, I found this post that suggested using transients for something similar: http://
17:05 Chousuke: mabes: you can't write imperative code with transients.
17:05 mabes: oh
17:05 hrm.
17:05 Chousuke: mabes: it's mutable, but it still needs to be functionally structured.
17:06 mabes: treat it as it were a regular immutable map and everything will be fine.
17:06 mabes: Chousuke: ok, so I would need to restructure the comprehension into maps or something?
17:08 alexyk: liebke: how do I plot 4 mllion [x y] pairs?
17:08 * mabes reading http://
17:08 liebke: very carefully :-)
17:08 Chousuke: mabes: http://
17:09 alexyk: liebke: I mean, what's the fun for scatter plot? And will JFreeCharts take 4 mil?
17:09 Chousuke: mabes: build it just as if it were a functional map, just substituting assoc for assoc! and wrapping the final return value with (persistent! ..)
17:10 the-kenny: alexyk: Maybe just write them to a file and call gnuplot on it
17:10 alexyk: the-kenny: the whole point of using incanter is to dispense with files :)
17:10 liebke: the function is incanter.charts/scatter-plot. I would be (pleasantly) surprised if it handled 4 mil points
17:10 alexyk: liebke: need I sort them anyhow?
17:11 liebke: no
17:11 Chousuke: mabes: the whole point is that you don't need to change the way you write algorithms just to use transients :)
17:11 alexyk: liebke: well, histogram can handle millions; I wonder how can I bucket points to plot fewer...
17:12 mabes: Chousuke: right. Thanks for the info and gist. Reading up on transients now..
17:12 liebke: alexyk: try it with the full set, see how it goes
17:13 alexyk: liebke: My data is a seq ([1 2][3 4]...), should I just call scatter-plot repeatedly with it?
17:13 * the-kenny has to try incanter some day
17:14 liebke: scatter-plot takes two sequences, x and y -- you'll need to convert your data format a bit
17:14 alexyk: ah ok
17:14 technomancy: it seems like a lot of the confusion over transients stems from confusion between "persistent" and "immutable" data structures.
17:15 I understand why they are often conflated, but if you focus on the fact that transients are simply not persistent then it's much clearer
17:15 Chousuke: that's why I like the naming.
17:15 rhickey_: yes, the idea is that they are opposites
17:16 in that dimension
17:16 technomancy: if people don't understand what persistence means, it's no wonder transients are confusing.
17:17 Chousuke: rhickey_: btw, how about extending the assert macro to accept an optional message argument? Could make error messages much clearer.
17:17 the-kenny: It's helpful to read the text about the falling tree :)
17:17 Chousuke: wouldn't be a breaking change either.
17:20 rhickey_: I have some documentation stuff in my git tree, and I think the pre/postcondition failure messages are a bit too generic. "assertion failure: (> x y)" is not very nice :/
17:22 lghtng: 'creating identities out of things that should be values'
17:22 man. that's deep.
17:23 * lpetit things he understands how to correctly use transients, and in the same time was not aware one must not conflate "persistent" and "immutable" :-$
17:23 polypus: is there something like finite? implemented for seqs and collections?
17:25 lghtng: you know, i sort of have a theory that object oriented paradigm creep has damaged the business model, which has given birth to the Cloud. a sort of mass retreat behind the firewalls.
17:25 technomancy: polypus: See http://
17:26 polypus: haha
17:26 hiredman: ~the halting problem?
17:26 clojurebot: "There is no problem in computer programming which cannot be solved by an added level of indirection." -- Dr Maurice Wilkes
17:27 drewr: technomancy: you noticed that swank-clojure-find-package doesn't work for namespaces with meta?
17:27 polypus: this could be done though if one knoew the origin of a seq. like (map f [1 2 3]). metadata could indicate that the seq is finite.
17:27 knew*
17:27 hiredman: ~halting problem?
17:27 clojurebot: not a problem, the average bid for it on getacoder is $821.00
17:27 technomancy: drewr: I don't work with any namespaces that have metadata (other than docstrings), so I haven't noticed that myself.
17:27 waiting for someone who does use them to submit a patch. =)
17:28 drewr: I don't work with them either until I try to patch code that does, e.g. clojure.core :-)
17:28 polypus: if it is unknown whether it is finite false could be returned from finite?
17:29 drewr: envisioning the regexp that mimics the clojure reader is giving me a headache
17:29 alexyk: liebke: can I first do (def myplot (scatter-plot xs ys)) and then (view ..) it?
17:29 liebke: yes
17:29 technomancy: drewr: boo; when did that get added to core.clj. =(
17:29 lpetit: polypus: in the case of a seq, how do you know it is unknown ? :-)
17:29 alexyk: well it's ingesting 4 mil points, let's see :)
17:30 polypus: (:finite (meta a-seq))
17:30 technomancy: drewr: not supporting it was my subtle way of discouraging people from adding useless metadata, but I guess if it's made its way into core that battle is lost. =(
17:32 polypus: map could set the meta of a new seq from a finite collection to true. if it is mapping a seq onto a seq it could inherit the meta
17:32 cycle could return a seq with #^{:finite false} etc.
17:33 is there some reason this could not work?
17:33 liebke: alexyk: cool, I need to go now, let me know later if it works.
17:33 alexyk: liebke: yeah, still ingesting...
17:34 liebke: alexyk: I imagine it will take a while. talk to you later
17:34 alexyk: liebke: ttyl
17:34 tomoj: polypus: it bottoms out
17:34 lpetit: polypus: i don't know
17:34 tomoj: and where it bottoms out, I'm sometimes going to have to say for myself whether it's finite or infinite
17:35 arohner: tomoj: what do you mean by 'bottoms out'?
17:35 polypus: tomoj: in cases where it is unknown it just just return false
17:36 hiredman_: polypus: if you want a finite seq, use a list
17:36 tomoj: polypus: ok, that could work
17:36 arohner: polypus: another way to think of this is seqs have two methods: give me the next, and give me the rest
17:37 "give me the rest" is a function that is almost arbitrary
17:37 tomoj: arohner: I mean that eventually the value for :finite has to come from somewhere, and there are places where there is no way for it to automatically be provided
17:37 lpetit: polypus: use case for this new "functionality" ?
17:37 tomoj: (unless you just are conservative and have it be false when you don't know)
17:37 polypus: tomoj: example of a place
17:38 arohner: polypus: I can construct a valid lazy seq that is infinite on Tuesdays, and finite the rest of the days of the week
17:38 tomoj: :)
17:38 polypus: lpetit: when designing an api where the user can supply a collection and you need to know whether it is finite w/o the user having to specify it explicitly.
17:38 arohner: so it does come down to the halting problem
17:39 tomoj: suppose we have a predicate that returns true if the number passed to it is the sum of two primes, false otherwise
17:39 technomancy: polypus: calling it "finite?" is misleading; the best you can do is "known-finite?"
17:39 polypus: sure the name is not set in stone
17:39 hiredman_: if it is finite, use a list
17:39 tomoj: now (take-while goldbach? (iterate (partial + 2) 2))
17:39 hiredman_: ,(list? (iterate inc 0))
17:39 clojurebot: false
17:39 tomoj: no one knows whether this seq is finite or infinite :(
17:39 hiredman_: ,(seq? (iterate inc 0))
17:39 clojurebot: true
17:40 hiredman_: ,(apply list (take 5 (iterate inc 0))))
17:40 clojurebot: (0 1 2 3 4)
17:40 * arohner really wants a function to represent (iterate inc 0)
17:40 arohner: that needs to die as an idiom
17:41 tomoj: yeah
17:41 Chousuke: hmm
17:41 ,(range)
17:41 clojurebot: java.lang.IllegalArgumentException: Wrong number of args passed to: core$range
17:41 technomancy: arohner: why a function? why not just a var? positive-integers
17:41 hiredman_: technomancy: var would hold the head
17:41 Chousuke: technomancy: head holding
17:41 technomancy: doh
17:42 lpetit: polypus: as hiredman said, in your api, either expect your user to pass a real collection (finite), or a seq (possibly infinite) + the explicit flag saying if it's finite or unknown ?
17:42 tomoj: something for just generating arithmetic sequences would be cool
17:43 [2,4,..]
17:44 lpetit: technomancy: can you explain to me the difference between "persistent" and "immutable", or more interestingly, where the difference is important ?
17:45 hiredman_: tomoj: uh, what is iterate then?
17:46 technomancy: lpetit: in a nutshell, persistent means "old versions are still available for use without performance penalties", which means that persistent data structures are immutable, but not neccessarily vice versa
17:46 it probably deserves a blog post. we'll see. =)
17:46 chouser: but transients are still their own thing.
17:46 technomancy: actually not 100% sure if the "without perf penalties" is part of a strict definition of persistent, but in the context of clojure it's true
17:46 chouser: not immutable and therefore not persistent. But also cannot be treated as mutable.
17:47 technomancy: chouser: but their mutability is an implementation detail that the user shouldn't be aware of. the user should just be aware of their non-persistence
17:47 IIUC
17:47 rhickey_: technomancy: yes, that's the better way to think about it.
17:48 because mutability is a weak concept
17:48 tomoj: hiredman_: something I can use to make something which is for generating arithmetic sequences
17:48 aldebrn: Noob question about mutability. How should I think about Java numerical libs that operate on arrays in-place? Should my wrapper function somehow copy the input, send that to the Java lib, and return the processed copy to the caller?
17:49 rhickey_: I didn't have time earlier, but I have some new ideas around transients
17:49 technomancy: it doesn't help that to many developers coming from OO, persistence means "saving to disk". (all the good words have been used)
17:50 rhickey_: yeah
17:51 hiredman_: ~latex \sum_{i=0}^{∞} i+1
17:52 notallama: is there a conventional way to name types with deftype? Like-this, OrThis, or-this?
17:53 lpetit: technomancy: so "persistent", beyond conveying the meaning of immutability, also conveys the meaning that derivative objects can be made cheaply from the datastructure at hand ?
17:55 technomancy: lpetit: more or less. and that old versions persist for free.
17:56 rhickey_: lpetit: the performance promises are those of the data structure. persistence really gets to the fact that 2 versions have independent lifetimes, both preserving those promises
17:57 vs implementations that cheat and have perf degrade for older versions, or older versions are read-only etc
17:58 for me, full persistence means older is as good as newer
18:13 KirinDave: Hm
18:14 I am trying to read that monad tutorial for clojure.
18:14 (at http://
18:14 The "mystery" exercise is eluding me though
18:15 Does anyone know what the intent was there?
18:18 hiredman_: man
18:18 clojure cds!
18:18 like a relase of clojure + contrib on a cd with a printed picture on it
18:19 the swirly λ logo thing
18:22 technomancy: mwoichandising!</space-balls>
19:02 notallama: so i need to run some functions sequentially. order doesn't matter, but only 1 should run at a time. agents don't fit, because i need the value, not the side-effect. atoms don't work because it shouldn't retry. any suggestions?
19:07 arohner: notallama: do you need some kind of threading? Why not just a normal function?
19:07 [(funA) (funB) (funC)]
19:09 notallama: arohner: i'm trying to wrap a side-effectful, mutable-stateful library. so i'm calling the function from multiple threads, but i want it to block if another thread is doing so.
19:10 arohner: ,(doc promise)
19:10 clojurebot: "([]); Experimental. Returns a promise object that can be read with deref/@, and set, once only, with deliver. Calls to deref/@ prior to delivery will block. All subsequent derefs will return the same delivered value without blocking."
19:10 arohner: or maybe
19:10 ,(doc future)
19:10 clojurebot: "([& body]); Takes a body of expressions and yields a future object that will invoke the body in another thread, and will cache the result and return it on all subsequent calls to deref/@. If the computation has not yet finished, calls to deref/@ will block."
19:14 notallama: not quite what i need. i think i know what i need now, though. it just occured to me that this thing is basically an iterator, so a lazy-seq should work.
19:15 arohner: ah, that's interesting. you're right though, one instance of a lazy seq will evaluate each item once, in order
19:16 notallama: i think repeatedly will make this crap much easier to deal with.
19:20 mabes: I am trying to use pmap on some big chunks of data. It seems to work great and churns through everything but after it outputs the data the process just hangs for several seconds.. does that sound familiar to anyone?
19:22 _ato: mabes: add (shutdown-agents) to the end of your program
19:22 mabes: _ato: ahh, so pmap use agents under the hood that you have to shutdown explicitly... thanks for the tip
19:26 _ato: mabes: yeah, well I don't think it uses agents exactly but it uses the same thread pool. That's something that I trip over all the time. Not sure why it can't happen automatically.
19:27 mabes: _ato: ok. many thanks, that was very frustrating but we are now seeing major win with pmap :)
19:28 notallama: future uses the agent pool as well (the send-off pool)
19:31 arohner: _ato: AFAIK, java doesn't have a "it's time to shut down now" hook, so code can't clean itself up automatically
19:31 ah, nm. I has one, but has been deprecated since 1.2
19:31 s/I has/it has/
19:31 hipertracker: how tu run clojure script from the shell? What shebang I can use?
19:35 technomancy: hipertracker: there's a shell script in contrib, but there's really no single good way to do that unfortunately. everyone seems to end up rolling their own launchers. =(
19:36 hipertracker: technomancy: its is strange. even Scala has simple shebang
19:37 twbray: _ato: Waiting with bated breath for your WF writeup.
19:42 _ato: twbray: I'm on the final section. :-) Sorry, I'm a terribly slow writer
19:42 twbray: _ato: nag, nag nag
19:45 hipertracker: technomancy: I create simple bash file cljrun: java -cp /opt/local/share/java/clojure/lib/clojure.jar clojure.main $1. it work
19:45 er, it works
20:03 technomancy: hipertracker: there's no standard location for the jar(s) though. plus most programs at least use contrib. and then many use other third-party jars as well.
20:04 hipertracker: technomancy: I know. I use clojure from macport
20:04 macports
20:06 hiredman_: technomancy: you can replace the system classloader with something you can add stuff to
20:08 (I happen to have such a classloader am looking for feedback)
20:20 technomancy: hiredman_: O RLY? send 'er on over.
20:20 sounds intriguing
20:21 hiredman_: http://
20:21 technomancy: will take a look later tonight; thanks
20:22 hiredman_: let me know what you think
20:29 aldebrn: Any right way to do complex numbers in Clojure? (I'm using JTransform, it stores complex number arrays as [real1 imag1 real2 imag2 real3 imag3])
20:31 defn: aldebrn: check out http://
20:32 aldebrn: if you're going for speed, Java might not be the right direction
20:34 aldebrn: also, just out of curiosity i found there is a clojure-contrib library in the works for
20:35 aldebrn: defn, thanks. I guess I'm looking for the same kind of speed Python and Matlab give, by farming out heavy math stuff to custom C/Fortran libraries
20:35 defn: ah
20:35 for it*
20:35 aldebrn: I saw that too, and was discouraged by clojure-contrib's complex support as limited to arithmetic/compare
20:36 defn: *nod* -- as far as speed goes it looks like C, C++, etc. is probably the best route
20:38 aldebrn: I want to emphasize that scientific computing in Python/Matlab (this latter is heavily Java-based) is very fast computationally (thanks to external libraries) and very fast coding (thanks to high-level language)
20:38 Are you suggesting I find what C/C++/Fortran libraries are used and write wrappers for Clojure?
20:39 defn: aldebrn: i dont know enough to give you a definite answer
20:39 but that seems like a possible route, no?
20:41 aldebrn: Anything is possible :). liebke is gathering a lot of functionality in Incanter, let's hope the complex-number work has been done
20:41 defn: aldebrn: sure, it's hard to imagine incanter wouldn't at some point have complex numbers
20:42 liebke: aldebrn: Parallel Colt has complex number support, I just haven't needed it, so I haven't wrapped it
20:43 aldebrn: liebke, that's great. I'll look into it
20:43 Hard to do FFTs without easy complex numbers
20:46 Parallel Colt todo item: 'Port PLASMA 2.0 and implement all the wrappers (include complex arithmetic in single and double precision).'
20:46 But the basic stuff is there :)!
21:11 dnolen: _ato: ping
21:12 _ato: so there a 10mb limit on Clojars uploads? I'm trying to get jogl2 up there so I can hack on :native-dependencies support, can this be upped just a tad?
21:12 _ato: my jogl2 jar is 11.8mb
21:17 _ato: dnolen: ah sure. I just set a conservative 10mb to start with. Just a sec
21:18 dnolen: _ato: thx!
21:22 _ato: dnolen: give it a try now
21:22 dnolen: _ato: working like a charm.
21:23 _ato: cool. :)
21:23 * Raynes yawns while listening to people whine about Emacs.
21:25 Raynes: I'm surprised people still use the whole "OMG but it's a better OS than it is a text editor." thing anymore.
21:27 dnolen: _ato: how do you delete something you've pushed? does pushing something again wipe out the old one?
21:27 _ato: dnolen: if it's the same version then yeah it'll overwrite it
21:28 a delete function is on my TODO list but I haven't gotten around to it yet.
21:28 dnolen: _ato: ok cool.
21:36 tomoj: is it safe to try leiningen again yet?
21:42 defn: error in process filter: Wrong number of arguments: called-interactively-p, 1
21:43 im getting that when i run swank-clojure-project
21:56 _ato: twbray: http://
22:01 hiredman_: _ato: #^"Ljava[.lang.String;" should be #^"[Ljava.lang.String;"
22:04 _ato: hiredman_: ah thanks
22:08 hiredman_: _ato: excellent write up
22:11 rhickey_: 3000 members on the google group!!
22:12 _ato: hiredman_: thanks. :-)
22:12 danlarkin: _ato: ya just finished reading, supergrats
22:12 _ato: rhickey_: woohoo!! I was watching the count down last night... 2994... 2995...
22:14 stuartsierra: rhickey_: I dropped my Maven ticket, instead added ZIP distribution target to the Ant build.
22:15 chouser: _ato: "We open first open"
22:16 alexyk: stuartsierra: why? maven is very useful!
22:16 _ato: chouser: ah, thanks
22:16 stuartsierra: alexyk: Current build supports maven via Maven Ant Tasks
22:17 Not ideal, in my opinion, but good enough for 1.1.
22:17 alexyk: stuartsierra: oh well
22:17 Raynes: Haha. It's moved from hating on Emacs, to hating on Lisp and other dynamically typed languages. (in #haskell)
22:18 alexyk: Raynes: I found #haskell very disconcerting compared to #ocaml, #scala and #clojure. Probably size matters.
22:18 ..wait until script kiddies arrive en masse
22:19 we need a pack of strict disciplinarians ready
22:19 Raynes: Most of them are rather smart people. It just gets on my nerves when they pretend Haskell is the only viable language out there.
22:19 hiredman_: clojurebot: whose job is it to keep them in line?
22:19 clojurebot: that's weihsiu's job
22:20 Raynes: It's sort of like the Java, C#, etc coders pretending that object orientation is the only way to do things.
22:20 rhickey_: stuartsierra: my maven concerns had to do with artifact naming etc. I think there was some problem last time with the svn tag not matching or something.
22:21 we should still build with ant definitely
22:21 stuartsierra: rhickey_: Ok, I submitted a patch to build a distribution ZIP with Ant.
22:21 rhickey_: also ericthorsen has brought up an issue with our pom which was never resolved
22:21 something about it messes up Netbeans
22:22 stuartsierra: ~seen ericthorsen
22:22 clojurebot: ericthorsen was last seen joining #clojure, 237 minutes ago
22:22 alexyk: funny, I was pondering using jruby in my JVM stable, and tried to see if I have all the standard map, filter, list routines in it. What OO briings there is . notation left to right and the do...end block, possibly as { } -- that's a good contribution to functional. The question is, can you translate most of the goodness between clojure and ruby.
22:25 stuartsierra: Found ericthorsen's msg: http://
22:25 technomancy: _ato: looks like a stray "nnnn" snuck into your WF2 article
22:25 (happens to me all the time)
22:25 stuartsierra: The problem appears to be that Netbeans sees a pom.xml and assumes that the project is Maven-based.
22:26 Which it isn't, so Netbeans assumes a different directory structure than what's there.
22:26 rhickey_: zip with ant a good idea
22:27 stuartsierra: yes, I didn't know enough about either to help him, but no one ever chimed in
22:27 alexyk: how do you materialize a lazy seq in the same way as (count xs)?
22:27 _ato: technomancy: thanks. yeah.. I just recently disabled arrow keys to force myself to do navigate the proper way so I keep doing that all the time now :P
22:27 alexyk: _ato: Clojurnne beginners :)
22:27 stuartsierra: rhickey_: It should be better now that we have pom-template.xml instead of pom.xml
22:28 alexyk: _ato: nice writeup
22:28 rhickey_: stuartsierra: ok
22:29 stuartsierra: rhickey_: sent ericthorsen an email about that
22:29 rhickey_: the new zip file should nest the stuff in a clojure directory, got complaint about the old one
22:30 stuartsierra: Yes, I made sure to do that.
22:30 It creates clojure-{VERSION}.zip, expanding to clojure-{VERSION}/...
22:31 rhickey_: makes sense
22:31 stuartsierra: Changes doc is coming along nicely; Chousuke wrote up pre/post conditions.
22:40 defn: (defn merge-rows [a b] (map + (map #(apply max %) (partition 2 1 a)) b)) (map #(apply max %) (partition 2 1 (reverse [[1] [2 3 4] [5 6 7]])))
22:40 err (merge-rows (reverse [[1] [2 3] [4 5 6]]))
22:40 why doesnt merge-rows blow up here? im only giving it one arg
22:41 hiredman_: it should, if it doesn't then it is not defined or being called as you described
22:41 defn: oops nevermind
22:42 hiredman_: :)
22:42 defn: what i was surprised about i guess is:
22:42 ,(partition 2 1 [[4 5 6] [2 3] [1]])
22:42 clojurebot: (([4 5 6] [2 3]) ([2 3] [1]))
22:43 defn: so merge-rows understands the first arg to be [4 5 6] and [2 3], yes?
22:43 err the first and second args
22:44 hiredman_: eh?
22:45 defn: (defn merge-rows[a b]
22:45 (map + (map #(apply max %) (partition 2 1 a)) b))
22:45 (reduce merge-rows (reverse routes))
22:45 bleh sorry
22:46 the only arg there, in my eyes, is the array of arrays, which is routes: [[4 5 6] [2 3] [1]]
22:46 hiredman_: not arrays
22:46 vectors
22:46 defn: blahhhh im sorry man my brain is mush
22:46 tomoj: reduce is not calling the function with (reverse routes)
22:46 hiredman_: and partition being a seq function calls seq on it's argument
22:46 defn: oh right
22:47 im going to quit on that note, i cant believe i missed that :\
22:47 hiredman_: so you get '([4 5 6] [2 3] [1]) and partition operates on a seq of values
22:48 defn: yeah, reduce is really what gives us the ability to apply that function across routes
22:49 anyways, thanks for showing me the error of my ways
22:52 http://
22:52 _ato: nice.
22:53 _ato: :)
22:56 defn: _ato: this is awesome. thanks for posting it. can i add an rss feed to your blog, or should i download this so i dont lose it :)
22:57 _ato: defn: there's an atom thingy here: http://
22:57 which may or may not be valid
22:57 defn: yeah i found it after a bit of trial and error
22:57 it looks valid to me
22:58 i guess my main question was, do you plan to keep this blog up?
22:59 _ato: yeah probably. I don't expect to post that often, but there's some clojars stuff I'd like to write up
22:59 defn: *nod* -- what are you using for writing your post? it looks like... pygments + markdown maybe?
23:00 twbray: Hey _ato, is http://
23:00 _ato: twbray: yep
23:01 twbray: Yes, your feed is valid, http://
23:01 _ato: defn: yeah, I tried jekyll after you were talking about it. I'm a big fan of markdown and pygments just works. Here's what the source looks like: http://
23:03 twbray: _ato: Was that 13 minutes really your *first* run?
23:03 * technomancy had no idea that pmap used the agent thread pool
23:03 technomancy: should that be mentioned in the docstring?
23:04 twbray: _ato: You want an affiliation if I mention you? "Alex Osborne, of XXX..."
23:05 hiredman_: of #clojure :P
23:05 _ato: twbray: I think it was my first run that completed on the full dataset. That may not be the exact timing but it was around that. I'd done a fair bit of testing on the smaller version, and didn't give it enough RAM in my real first run so it just got stuck.
23:05 defn: _ato: cool, what this {% highlight clojure %} line? I've been using a verion of markdown in python where you specify code blocks with a #!clojure or :::clojure depending on if you want line nos
23:06 twbray: hiredman: I like that
23:08 _ato: twbray: you could say "National Library of Australia" as the affiliation
23:08 twbray: OK
23:08 Canberra is an unsuspected hotbed of functional programming I'm sure
23:09 _mst: our clojure user group has two members!
23:09 but we're marketing aggressively...
23:09 _ato: _mst: we should add Mark Reid to it
23:09 defn: heh, i cant find anyone around here interested in clojure
23:09 _mst: *three* members!
23:09 shoover: technomancy: It uses the cached (growable) thread pool used by send-off, so it shouldn't affect anything related to agents
23:09 _mst: (the third doesn't know he's in yet... the initiation may come as a shock)
23:10 defn: _mst: haha
23:10 is this '_' business preceding your nicks a gang sign?
23:10 _mst: hm... isn't that just something erc does?
23:10 a gang of sorts...
23:10 tomoj: erc doesn't do it to me
23:11 _mst: I mean, since "mst" was already taken by someone more deserving :)
23:11 _ato: yeah.. same for me
23:11 technomancy: shoover: I just was noticing that _ato's code calls shutdown-agents after using pmap
23:11 tomoj: I get a backtick on the end if I try to connect when I'm still here
23:12 technomancy: if that's required it should be stated somewhere
23:12 shoover: technomancy: true, you would need to know that
23:12 twbray: There are a few things in _ato's code that you "need to know" :)
23:12 Now more people will.
23:13 shoover: I like how _ato put the appropriate emphasis on "don't rewrite split unless you have to!"
23:13 defn: yeah, kudos _ato for not just the great code, but an excellent explanation
23:14 _ato: yeah, I think pmap uses the same thread pool as agents. I guess it's called shutdown-agents just because agents existed before pmap
23:14 shoover: technomancy: my question is if we can get rid of shutdown-agents by using daemon threads and making the programmer call await to purposely block on running agent threads
23:15 in other words, use threads that don't intrinsically block System/exit
23:15 _mst: shoover: it's come up before: http://
23:16 shoover: _mst: thanks, I wasn't aware
23:17 technomancy: _ato: hey, I hope you haven't been waiting on me for that clojars browse functionality I said I was going to write.
23:18 I'm going to have to retract my offer to implement it; too busy with lein and swank and holidays etc.
23:18 _ato: technomancy: nope, I've been distracted by this widefinder stuff. I've got 6 clojars emails sitting in my inbox that I need to deal with now that's out of the way
23:18 technomancy: or at least to implement it in a timely manner
23:18 * technomancy would be thrilled to have only 6 to deal with =)
23:18 _ato: technomancy: okay, no worries :)
23:20 technomancy: actually that's not fair; I'm glad there are a lot of people discussing/contributing to leiningen and swank
23:20 I just can't keep up. =)
23:22 chouser: _ato: great writeup!
23:24 _ato: chouser: thanks. :-)
23:32 defn: _ato: will you be submitting this to the results page for WF?
23:32 _ato: you mention you inched past single-threaded C, but you also beat one of the OCaml implementations
23:34 _ato: ah, I guess I should
23:34 hmm
23:37 defn: it looks like you're supposed to email tim.bray@sun.com with your results for a 100,000 line sample, but seeing as tim is in here, im not sure that's necessary
23:37 * mabes is reading _ato's awesome post.
23:38 _ato: yeah, I think that's just to get an account on the box. probably I just need to create a sun account and I'll be able to edit the wiki
23:38 going for lunch though first, I'm starving, writing really takes a lot of energy
23:38 defn: _ato: again, great job, enjoy your lunch :)
23:41 tomoj: mabes: hey, are you a clojurian now?
23:41 devlinsf: Where is _ato's post?
23:41 mabes: tomoj: heh, getting there ;) I have some people on board at work so we've been doing some prototyping with it to get a feel for it
23:42 devlinsf: http://
23:42 tomoj: cool
23:42 mabes: tomoj: what about you?
23:42 tomoj: seems to me that people here aren't as obsessed with testing
23:42 I miss webrat :(
23:43 mabes: also getting there, but much more slowly probably
23:43 mabes: tomoj: I think we are probably going to keep all of out webapps in ruby for the time being.. we are just using clojure for the backend heavy lifting stuff
23:43 tomoj: yeah, makes sense
23:44 defn: tomoj: im interested in testing more, but for now im focused on learning forms and playing with the pieces
23:44 tomoj: I hope someday for a clojure webapp ecosystem that makes me as happy as ruby's
23:44 mabes: there is a clojure webdriver adapter currently.. and you can use cucumber with clojure so that will get you pretty far
23:44 tomoj: wat
23:44 shit, I've been working on a webdriver adapter, didn't know someone already did it
23:45 mabes: heh, yeah... lemme get the link...
23:45 devlinsf: _ato: Good stuff
23:45 defn: what is the biggest step between where clojure's web development tools are now and where ruby's are?
23:45 tomoj: mikitebeka's?
23:45 devlinsf: defn: I'd say front end
23:45 mabes: tomoj: http://
23:46 tomoj: thanks
23:46 devlinsf: defn: It's really easy to make Rails look great
23:46 defn: Of course, I'm a CSS + HTML nerd
23:47 tomoj: I started with an htmlunit adapter because there I could use enlive style selectors easily, which was awesome. with webdriver I don't think I can do that efficiently, but oh well :(
23:47 frontend? you mean like sass/erb/haml stuff?
23:47 devlinsf: Yeah
23:48 The "What people see" stuff
23:48 I like erb
23:48 Of course, I'm no compojure expert
23:49 tomoj: I think I have been convinced of enlive's style of doing things over erb's
23:49 defn: my personal concern currently is acceptance testing
23:49 hiredman_: if I recall correctly webdriver uses htmlunit
23:49 (htmlunit is nice)
23:50 tomoj: yeah but it abstracts over it so that it can also use firefox etc
23:50 technomancy: erb is horrible
23:50 mabes: hiredman_: thats correct- and you can have it switch to seleniun
23:50 tomoj: which means I can't do what I did when using htmlunit directlly
23:50 devlinsf: technomancy: It's what I know
23:51 technomancy: I mean it's obvious, but it's ugly and impossible to write good tool support for
23:51 mabes: erb is nice for designers... if you think your designer complained about writing haml just let them try the compojure html syntax :p
23:51 technomancy: since ruby's grammar is insane to begin with; embedding it inside HTML just pushes it over the edge
23:51 tomoj: mabes: let them try enlive :)
23:52 there they just hand you the html mockup with fake data and everything
23:52 devlinsf: I haven't wrote HTML in 6 months
23:52 I DO like clojure's XML stuff way better
23:52 mabes: tomoj: yeah, it looked interesting but I haven't tried it.. are you working on a project that is available on github?
23:53 defn: devlinsf: yeah ive used rails a lot and ive enjoyed it, im trying to use compojure right now, but ive found it pretty kludgey
23:53 tomoj: nope, I am at the just-playing-around stage
23:53 mabes: yeah...
23:53 danm_: wow, 8 minutes for WF2?
23:53 great writeup
23:53 defn: definitely
23:53 ato is a rockstar
23:53 danm_: no kidding
23:53 defn: to use the parlance of our times
23:54 danm_: that's pretty cool
23:54 technomancy: if his avatar is any reflection of reality, he's got the hair to match