#clojure log - Jun 22 2010

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:38 riddochc: A point of trivia: a google search for java logging over-engineered gives me "About 125,000 results"

0:39 mae: lol

0:47 riddochc: Anybody tried buildr for clojure projects?

0:51 (not implying that it's either a good or bad idea, I've not used it.)

4:02 alexyk: how do we cutely sum a seq ([x y] [x' y'] ...) into [(sum x x'..) (sum y y' ...)]?

4:03 Chousuke: alexyk: (apply map + seqs)

4:04 with a vec in front to convert to a vector if you really need to

4:05 alexyk: Chousuke: why does this work? :)

4:05 Chousuke: alexyk: well

4:05 alexyk: ,(apply map + [[1 2][3 4]])

4:05 clojurebot: (4 6)

4:05 Chousuke: ,(map + [1 2] [1 2] [1 2])

4:05 clojurebot: (3 6)

4:05 Chousuke: so just use apply to get the args from the seq

4:06 alexyk: right; it's late and I don't click with + getting into each positional sum

4:06 TheBusby: it's a cool feature of map

4:06 not exactly intuitive though

4:07 alexyk: TheBusby: so how do you intuit it?

4:07 it's reduce in fact

4:07 Chousuke: it's as intuitive as mapping over more than one seq can be :)

4:07 alexyk: arrgh!

4:08 ah ok got it

4:08 TheBusby: Chousuke: very true

4:08 Chousuke: it's very useful though so even if it's not obvious it's good that it's there :P

4:08 alexyk: brrr... I leaned Haskell in the last two weeks and translated my Clojure project into it and also OCaml. A grandiose shootout will come.

4:08 teh amazing result is, Clojure holds its own

4:09 TheBusby: when I discovered that property of map I instantly loved it

4:09 Chousuke: did you also try to make the haskell code idiomatic?

4:09 alexyk: Chousuke: it was helped by other folks and killed Haskell's runtime.

4:09 Chousuke: using currying and composition is much more common in haskell than in clojure.

4:09 heh

4:10 alexyk: JVM is a pretty valuable thing, it turns out, when GC is involved

4:10 Chousuke: I like haskell, though I haven't invested much effort into it

4:10 alexyk: OCaml is usually much faster, but not quite here

4:10 Chousuke: haskell's just good for the concepts

4:11 and the type system is just awesome

4:11 TheBusby: hehe, haskell makes you a better clojure developer

4:11 Chousuke: certainly.

4:11 (and probably the reverse applies too)

4:11 alexyk: Chousuke: you're saying that Scala makes one a better Clojure developer then :)

4:11 since Scala is ML on JVM in a way

4:12 eevar2: scala is too large and bloated ;)

4:12 Chousuke: alexyk: I dunno, does scala have type classes and currying and monads? :P

4:12 alexyk: eevar2: can something be bloated but not too large? :)

4:12 Chousuke: like, yeah? :)

4:13 eevar2: or, too large but not bloated? (well a healthy elephant can be)

4:13 Chousuke: I know next to nothing about scala

4:13 alexyk: and a small frog can be bloated but not too large

4:13 eevar2: alexyk: how about lazyness and purity?

4:13 Chousuke: except that every code example I've seen has scared me :P

4:13 eevar2: like harrop?

4:13 alexyk: eevar2: lazy you can be, and pure too!

4:14 lazy is explicit keyword, Stream's a seq, and all containers are either imperative or pure, you pick

4:15 eevar2: you'd kill jdh with that analogy :)

4:15 in any case clojure's an amazing little mouse

4:15 once I'm done checking, I'll post the code so you guys can speedify it even more

4:15 haskell, ocaml and clojure to start with; only for FP langs

4:16 scala will come later when I get time

4:16 TheBusby: not doing factorial are you?

4:16 alexyk: TheBusby: Twitter graph mining mind you

4:16 TheBusby: Ooooooh

4:16 alexyk: you'd need a 64 GB box to compete

4:16 32 GB min

4:17 TheBusby: I'll definitely be interested in this then

4:17 alexyk: TheBusby: I'll post to the clojure group soonish :)

4:17 later...

4:17 TheBusby: thank you, I'll be looking forward toit

4:55 serp_: .commadns

7:47 spariev: hi, is it possible to change log level per thread with log4j ?

7:47 Licenser: greetings spariev and I'm sorry I don't know

7:47 spariev: not really clojure-related question, sorry

7:47 hi Licenser

7:48 Licenser: no reason to be sorry, people here are usually more friendly and more helpful then in #java :(

7:51 cemerick: spariev: you can bind a log4j logger, and set whatever level you want on it. That's not a per-thread log level, but achieves the same result.

7:52 Just make sure the logger's prefix is such that it finds the parent logger you'd like to have its messages flow through

7:52 * Licenser totally fails to find any clojure project that actually uses arithmetics :( save for incanter of cause but that is optimized to death already so not god for any tests

7:53 cemerick: something like (Logger/getLogger (str (.getName *ns*) \- (.getName (Thread/currentThread)))

7:53 Licenser: it seems 95% of the clojure proects are either wrapper libraries (making java stuff clojury) or in she rare cases that are not java interfaces they are data heavey (as in list vecs maps) or string heavy

7:54 spariev: cemerick: very cool, thanks, I'll try it

7:54 cemerick: Licenser: trying to find some testcases for the numerics changes?

7:54 spariev: java logging frameworks never cease to amaze me

7:54 Licenser: cemerick: yes, mostly I want to get my hands one some code that would be actually benefit from the changes and that is really hard

7:54 cemerick: spariev: indeed, they're quite flexible ;-)

7:54 Licenser: I don't have any and about every

7:54 #

7:55 named clojuran seems not to have any either - at least not on github

7:55 cemerick: we've got a fairly large body of math-heavy code, but I'm nowhere near it at the moment

7:55 Licenser: cemerick: what I want to do is to actually see how the changes (either direction) would impact people

7:55 cemerick: how much have you optimized it? because if it is already optimized then there'll be hardly any changes I fear

7:56 cemerick: I didn't write it, so I can't say. :-)

7:56 Licenser: but if you get near it and it is open enough that I could get a copy for playing with it I'd be very grateful

7:56 heh

7:57 what I'd love for some tests is code that A) does some math but isn't purely math B) is benchmarkable C) isn't optimized too much

7:57 I know that is much to ask for but oddly enough I have problems to find anything that at least satisfies A

7:58 I slowly get the feeling that noone will actually notice the changes, whatever they are since it is not what clojure is used for

7:59 I see a lot of working with seqs, transforming data, sometimes string manipulations, tons of java interop but in many projects you've a hard time to find a + at all o.O

7:59 cemerick: People that do math-heavy things are unlikely to be releasing it as open-source, unless they're just tinkering.

7:59 Licenser: and if you do it is so rare and in so unimportant places that it does not seem so irrelevant that the impact is minor

7:59 karmazilla: cemerick: be careful about get'ting log4j loggers with generated names

8:00 Licenser: cemerick: might be, then again I don't look for math heavy I am already hapy with math at all

8:00 cemerick: karmazilla: hrm, do they hang around in perpetuity?

8:00 karmazilla: yes

8:00 Licenser: I think about our every day work not the few special cases

8:01 cemerick: Good to know. If the generated names are namespace + thread name, that's not a very large set of generated names. *shrug*

8:02 Licenser: I think it's pretty safe to say that there's a lot of math going on, given the survey results. Math is often close to where real money is made though, so people are far less likely to share from that department.

8:02 Licenser: *nods*

8:02 but it's hard to reason about if people don't share

8:03 I've seen claims that things are 10% faster, but I didn't found any examples for it. The one incanter example I found that actually took some time even got 10% slower with the equal branch

8:05 cemerick: As you said, stuff that's already in a loop body and hinted properly isn't going to get any boost -- that stuff was already essentially running at Java speeds.

8:06 Licenser: *nods*

8:06 cemerick: it's the cross-fn stuff that'll benefit most, and presumably there'll be less cognitive overhead in order to get optimized behaviour across the board.

8:06 Licenser: well the cross fn stuff will be boxed anways as I understood unless you hint the fn's too in which case you don't see a change since it would be fast already right?

8:06 lpetit: hello there

8:06 Licenser: hi lpetit

8:07 cemerick: Licenser: no, if the fns are :static and hinted, then boxing should be avoided, which was never the case before.

8:07 lpetit: you guys seem ready to push google groups to its limits regarding the number of posts for the same thread :)

8:07 Licenser: ah okay

8:07 lpetit: working on it

8:08 lpetit: I see :)

8:08 Licenser: cemerick: ah I see true, but this isn't affected by things like primitive literals or not boxing math ops then

8:08 cemerick: right, those are orthogonal issues

8:08 Licenser: what I'm looking for is the 'out of the box (aka w.o. optimisation)' speedup

8:09 I know I tried to say that :P

8:09 cemerick: well, whether that happens depends on which defaults rhickey chooses

8:09 Licenser: but that is what the whole argument in the goroup is about

8:09 cemerick: *nods* and what I would like to do is to measure the changes in real cases since I think it is somthing that is missing yet in the entire discussion

8:10 we have claims from both sides which is better in the end but I've not seen any real measurements that are based on reality :P

8:10 the thing they call science I think.

8:11 cemerick: You're never going to get a good enough sample size to do real science on this.

8:11 Besides which, there's taste and personal preferences mixed up in it.

8:11 rhickey: Licenser: there are huge classes of things that don't yet exist in Clojure because these optimizations aren't there. For instance, you'll find no helper methods that take primitives, no competitive versions of the alioth shootout stuff etc. Essentially, there are things for which Clojure wasn't suitable (maybe possible but too hard) for which it now is

8:12 * cemerick plugs his ears at mention of alioth

8:12 Licenser: heh

8:13 rhickey, cemerick what I wanted to try is to bring some hard (at least harder then most of them in the discussion now) facts into the discussion.

8:13 rhickey: cemerick: yes, not useful in and of itself, but not being there leave the 'Scala is faster than Clojure' meme wide oper

8:14 cemerick: rhickey: yeah, I know -- good numbers there are good PR. I guess I'm just not in the mood this morning. :-)

8:16 rhickey: Licenser: count the number of (int some-literal)'s in gvec.clj. Missing any one of them, performance would suck terribly versus the vector written in Java. Every time I wrote one, I thought 'this is stupid', and whle I was willing and able to fo that correctly, most people won't be

8:17 * Licenser nods

8:18 rhickey: Anyone who is consuming Clojure and simultaneously saying primitives aren't important is blind, or just conceding writing things like Clojure to other languages

8:18 I wrote Clojure to replace Java in my work, not Ruby

8:18 cemerick: heh

8:19 rhickey: Ruby was never a contender for the kind of work I do, nor for the work of people like me

8:19 cemerick: rhickey: you're always good for a quotable

8:20 Licenser: rhickey: I'd have to shamefully admit I don't know what work you do aside from writing clojure :P

8:20 clojurebot: clojureql is http://gitorious.org/clojureql

8:21 cemerick: Now I just need to get over primed operator fns and such.

8:21 Licenser: I tried today how bad it would be to have non boxing + catch the overflow and 'greacefully' go down to boxing +. Sadly this seems not an option :(

8:21 rhickey: cemerick: well, there's still the BigInteger contagion option I first produced

8:22 cemerick: with that, there's substantially less need for primed ops

8:22 Licenser: I think if it would be possible to do this fast it'd be great

8:22 cemerick: rhickey: and it's still contagious even with the current fast ops, no?

8:22 rhickey: cemerick: no, right now everything is fully reduced

8:23 cemerick: I wonder if both could be present -- primed ops as well as contagious bigs.

8:23 rhickey: which means yo ucan't drive the result size through the input type

8:23 cemerick: yes, they would, but as I said, you'd rarely need the primes since you could say (foo 1N)

8:24 as it stands now, people need to make a choice to use primed ops inside, with contagion use of normal ops would work well with bigint input

8:24 cemerick: It seems a lot of people like the primed ops, just for clarity, but I suspect those that don't do a lot of math would get confused by primed ops and would be far happier with general advice of "append an N on your literals to get 'correct' math".

8:25 * cemerick is thinking of usability, not capability at the moment

8:25 rhickey: cemerick: agreed, the tradeoff is on the equality issue, as with contagion it would be more likely to have 42 and 42N in the same program

8:26 you really need to go back to equiv = in order to not have that be maddening

8:26 cemerick: rhickey: I thought you were favoring dropping equiv in general?

8:26 rhickey: OTOH, equiv = allows you to box all non-bigints as Longs, which I think will be more escape-analysis friendly than the smallest-box method

8:27 cemerick: I just put all of the things that interact on the table, switching back and forth is easy

8:28 But while everyone has an opinion, there are real engineering tradeoffs here. My sensibilities don't like equiv =, but I might take it to make all of the other pieces fit

9:16 fyuryu: dnolen: I saw you forked clj-processing on github. Planning to make work with prim branch?

9:18 dnolen: fyuryu: heh I thought there was a bug so I forked it, but I saw that I was just out of date. I haven't seen issues with the prim branch I don't think, have you ?

10:03 fyuryu: dnolen: I tried a couple examples and everything worked fine. But I was thinking about adding ^:static to some (most?) fns and benchmark a bit

10:19 AWizzArd: ,(class (byte-array 1))

10:19 clojurebot: [B

10:20 AWizzArd: Is ^[B the type hint for byte-arrays then?

10:25 chouser: ^"[B"

10:26 I think ^bytes works in a lot of cases too

11:14 hehe. But I want my gazelles to be *slow* so I can eat them more easily.

11:20 lpetit: chouser: :)

11:36 mattrepl: hrmm, I'm seeing an IllegalStateException with a message stating that a var is unbound when used within a deftest

11:38 cemerick: Man, peanut galleries are rough.

11:39 mattrepl: (something else going on, nm)

11:49 Licenser: there is something I'm not sure about with the non auto promoting math will (+ 1 (num 1)) be a long or a Number?

12:11 dnolen: Licenser: + doesn't return primitives if it can't return primitives

12:25 Licenser: dnolen: but it could return primitives :P

12:58 dnolen: hmm

12:58 so clojure.contrib.json still converts the strings keys to Clojure keywords

13:05 cemerick: dnolen: which was made the default recently

13:07 joshua-choi: ,(class (seq "aa"))

13:07 clojurebot: clojure.lang.StringSeq

13:07 joshua-choi: ,(class (next (seq "aa")))

13:07 clojurebot: clojure.lang.StringSeq

13:08 joshua-choi: Question. Does a StringSeq hold its entire source string in memory?

13:08 dnolen: cemerick: huh, seems odd since "foo bar" is a valid JSON key, but read-json will produce bad output from that.

13:08 joshua-choi: If it's next-ed, etc.

13:09 cemerick: dnolen: the attractiveness of keywords-as-keys is hard to resist for most :-)

13:10 * dnolen grumbles

13:10 cemerick: (read-json content false) will avoid the keywordization.

13:10 dnolen: cemerick: oh! nice

13:10 cemerick: dnolen: yeah, an option was always there, the default was just flipped for 1.2

13:11 dnolen: cemerick: sweet, thx!

13:11 cemerick: my problem is that I now tend to produce maps with keywords containing dashes, which you can't get with obj.slot notation in js :-/

14:27 bigwavejake: what does the -> operater do?

14:27 it's hard to google for "clojure ->"

14:28 Hun: evaluate forth style

14:28 ,(-> 5 (+ 3) (* 4))

14:28 clojurebot: 32

14:28 bigwavejake: where can I find the doc for it?

14:28 qbg: ,(doc ->)

14:28 clojurebot: "([x] [x form] [x form & more]); Threads the expr through the forms. Inserts x as the second item in the first form, making a list of it if it is not a list already. If there are more forms, inserts the first form as the second item in second form, etc."

14:29 chouser: also here: http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/->

14:29 bigwavejake: ok... thanks!

15:06 systay: what does this mean? "java.lang.IllegalStateException: Var src.www.controller/post is unbound. (NO_SOURCE_FILE:0)"

15:06 chouser: it means the var was declared but never given a root value, and then you tried to use it

15:07 like: (def foo) foo

15:09 systay: hmm... that makes sense. it's just that I did give a value...

15:09 well, obviously I didn't... :)

15:11 chouser: :-)

15:11 how do you think you gave it a value?

15:11 with def, binding, or what?

15:14 systay: git://gist.github.com/448916.git

15:14 sorry, http://gist.github.com/448916

15:17 chouser: hm. you have two things named post -- a var holding a fn and a local holding whatever new-node returns

15:17 systay: ouch

15:18 that must confuse clojure, yes...

15:18 chouser: well, it's more likely to confuse you. :-)

15:18 is 'relate' a macro?

15:18 systay: I thought that the inner post, since it was defined in the "let"m wouldn't show up outside

15:19 relate is from neo4j

15:20 chouser: I don't see a with-tx in neo4j

15:20 dnolen: systay: are you using clojure-neo4j for creating a blog?

15:21 chouser: I see a with-neo and a tx macro

15:21 systay: dnolen: well, I need a real project to try things out on

15:22 chouse: I'm using bobby's fork of neo4j

15:22 chouse: of the neo4j bindings, that is

15:22 chouser: anyway, if that's not the problem, I'm not seeing it. relate should be getting the new-node result, and I don't know what else would be using the name 'post'

15:24 Licenser: I for once don't care how fast the gazelle is I eat, as long as it is tasty, I when it comes to that by all means I take the turtle gazelles they are easier to catch!

15:26 chouser: systay: what line is the exception pointing to?

15:27 systay: chouser: solved it...

15:28 I hadn't closed the def above post...

15:28 damn you parenthesis!

15:28 chouser: heh

15:29 dnolen: it would be cool if someone made something like Gremlin for clojure-neo4j

15:50 systay: is there any way to expand exceptions? I'd love to see the stacktrace of some of the exceptions I see

15:51 TimMc: No you wouldn't. :-(

15:51 chouser: (.printStackTrace *e)

15:52 systay: nope, I wouldn't :(

15:53 chouser: They're chock full of useful details!

15:55 TimMc: I don't know *what* I'd do without the clojure.lang.Compiler.eval lines!

15:55 But more importantly, all the "invoke"s.

15:56 Chousuke: clojure.stacktrace has a pretty-printer

16:01 cemerick: It seems like stacktrace (or something similar) should really get bolted into the REPL. Yesterday wouldn't have been too soon.

16:04 chouser: always showing only the root-cause isn't acceptible.

16:05 that sounded harsher than I meant

16:05 cemerick: I know I was offended.

16:05 ;-)

16:05 chouser: always showing only the root cause will sometimes obscure the most important information.

16:06 cemerick: I knew you would be

16:06 cemerick: I think, as a first pass, filtering out all clojure.* frames in intermediate causes would help a lot.

16:07 35 LazySeq.seq calls aren't fun, etc.

16:07 But regardless of the right tradeoffs, error reporting is probably the #1 gripe at the moment.

16:08 chouser: it'd be worth experimenting with some filtering/reporting options and see what seems to work well over time

16:08 TimMc: Maybe a Bayesian spam filter for stacktraces. :-P

16:08 chouser: heh

16:08 with a rhickey profile and a cemerick profile available by default

16:09 cemerick: ha!

16:09 * cemerick waits for the torches and pitchforks

16:11 chouser: huh. clojure.main already treats compiler exceptions differently from others.

16:15 KirinDave: silent consumption still?

16:16 dnolen: My least favorite exception is "No message"

16:17 KirinDave: Aka, "We're sorry Programmario, but your macro is in another castle."

16:17 chouser: eh

16:17 er, heh

16:17 KirinDave: Seriously, that is the worst part of clojure macros.

16:17 I really miss plt-scheme's system.

16:18 dnolen: KirinDave: think it could be ported to Clojure?

16:18 * dnolen is intrigued by Scheme macros, but hasn't look into them.

16:19 chouser: cljure.main/root-cause is the same (but slightly tighter code) as clojure.stacktrace/root-cause

16:19 KirinDave: dnolen: It'd be tough to do it properly. You could do an MBE system, but the symbol scoping stuff requires a lot of work.

16:41 alexyk: hey guys: I plan a shootout between clojure, haskell, and ocaml processing huge twitter graph. I have all code already. Each lang gets its own repo. Haskell's called husky and ocaml's called clams. I need a short anumal name for clojure. Any idea?

16:41 I leaned towards mouse as clojure is really small. Anything better?

16:41 or moujure

16:41 (kidding)

16:41 any animal with clo- or -jure will be considered.

16:43 chouser: hedjhog

16:43 rfg: badjure

16:43 jkkramer: cockatoo

16:43 chouser: badger is cool

16:43 alexyk: chouser: rfg: awesomer and awesomester!

16:43 badger is good

16:43 jkkramer: cockortoo?

16:44 jkkramer: that's for coq projects

16:44 rfg: badjure is a Grisham novel. Runaway badjure.

16:45 Goodjear tires...

16:45 jkkramer: i was thinking of the bird angle, for twitter

16:45 alexyk: jkkramer: ah! deep

16:47 lancepantz: ooo

16:47 Subject: [Clojure] Milestone "Release 1.2" updated

16:51 Chousuke: badger is a good name, because http://www.youtube.com/watch?v=c81bcjyfn6U

16:52 miner49r: alexyk: a conure is kind of parrot

16:52 rfg: or http://www.youtube.com/watch?v=bzHlDxyO8SI

16:53 :)

16:54 qbg: We're here tracking the Clojure in its native habitat. As you can see, hiding beneath its small exterior is a powerful beast...

16:57 Licenser: there is an odd problem with all things using threads - it does not quit :( how does this come?

16:58 the moment I use future or pmap my program won't stop any more

16:58 alexyk: beneath its small leiningen we see a seething maven...

16:58 chouser: once the agent pools are used, the repl will not quit automatically unless you shutdown-agents

16:58 rfg: Licenser: I had an issue the other day where I failed to cancel a future.

16:58 alexyk: its repl is sharp and forked

16:58 Licenser: ah thanks

16:58 alexyk: and its swank's plumage is colorful

16:59 qbg: It's full of slime!

17:06 StartsWithK: hi

17:07 found a small problem with clojure.walk, http://paste.pocoo.org/show/228702/

17:07 TimMc: Watch as it parens its feathers!

17:07 StartsWithK: it removes all the metadata while walking

17:12 TimMc: alexyk: Lungfish, because it is a Lisp that lives in Java land?

17:12 qbg: No, Clojure is the Borg

17:14 StartsWithK: where do i report the bug? i don't see a link on assembla to open a new ticket

17:15 mmarczyk: StartsWithK: you'd better post to the mailing list first, but for the record, there's a link to open a new ticket on this page: http://www.assembla.com/spaces/clojure/support/tickets

17:17 StartsWithK: mmarczyk, it says i have to be a watcher.. i don't want to pay for assembla just for one bug

17:17 but yes.. i'll post on ml

17:18 oh.. they have a free plan :)

17:18 mmarczyk: StartsWithK: you don't have to pay to register, or indeed to use it for foss projects, you'd only need to pay if you needed stuff like private repos etc.

17:18 Licenser: ,(byte \a)

17:18 $(byte \a)

17:18 sexpbot: java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.Number

17:18 Licenser: $(int \a)

17:18 sexpbot: => 97

17:18 Licenser: ^- odd behaviour

17:20 is there a difference between (count "abc") and (.length abc)?

17:20 mmarczyk: isn't a byte too narrow for a char?

17:21 TimMc: $(int \✩)

17:21 sexpbot: => 10025

17:21 mmarczyk: oh, cool star character! need to learn to type those!

17:22 Licenser: mmarczyk: I'm not sure

17:22 qbg: Licenser: Yes, the first one works ;)

17:23 Licenser: qbg: I ment under the assumption that I didn't forget the ""

17:23 mmarczyk: Licenser: um, see above; JVM chars are 2 bytes long (UTF-16)

17:23 Licenser: and the second one could work to if I def'ed abc as "abc" :P

17:23 Lajla: mmarczyk, have you missed me?

17:23 After all, together we are the second and fifth best programmers in the world.

17:24 Licenser: hmm me bing the best?

17:24 mmarczyk: Licenser: note that I'm not claiming that this explains why the exception message you quoted makes sense ;-)

17:24 Lajla: licenser, no the microsoft chief software architect

17:24 Licenser: mmarczyk: Agreed

17:24 Lajla: ah okay

17:24 qbg: Licenser:

17:24 Licenser: can't beat that guy, after all he manages to keep is job despite of windows

17:25 qbg: Using count is less hosty

17:25 Licenser: heh

17:25 I figured that but will count convert it into a seq first and then actually count stufF?

17:26 mmarczyk: Licenser: nope, it's backed by a static method of clojure.lang.RT which does the sensible thing for all arguments

17:26 qbg: And if the compiler doesn't know it is going to be a string, there is reflection overhead

17:27 mmarczyk: actually the reflection overhead is there for .length too

17:27 Lajla: mmarczyk: http://codepad.org/2NUYHYWp

17:27 Licenser: ah okay

17:27 qbg: (I was talking about .length)

17:27 Licenser: smart rhickey!

17:27 Lajla: It is possible for an algorithm to detect tail-recursion lexically and then rewrite code, right?

17:27 I still don't understand why it is not possible, I mean, there should be a reason, but I don't see it.

17:27 mmarczyk: Lajla: um, we've been through this already :-P

17:27 Licenser: the reflection is there only for lenght isn't it?

17:27 * Licenser is just reading the code

17:27 Lajla: mmarczyk, and we haven't answered me!

17:28 mmarczyk: Lajla: I must say I enjoyed that conversation in many ways, if that answers your previous question :-)

17:28 Lajla: mmarczyk, but tail-recursion is lexically _decidable_!

17:28 mmarczyk: what does not at all follow is that I want to reiterate the same stuff again

17:28 Lajla: Surely it can be algorithmically re-written to a form using loop/recur by a praeprocessor?

17:28 mmarczyk: look, nobody's claiming that you can't decide tail-recursion

17:28 well of course not

17:29 Lajla: mmarczyk, why not?

17:29 I don't get it.

17:29 Licenser: Lajla: I think tail recursion can be the case even if it is not lexically decidable

17:29 Lajla: I wish for you to explain it.

17:29 mmarczyk: you could rewrite *local* tail calls, say within a single function, by inlining any locally declared "subfunctions"

17:29 etc.

17:29 Licenser: as in you can decide a sub case of the problem but not all

17:29 Lajla: licenser, then it is not deciding of course.

17:29 mmarczyk: which is something I mentioned last time round

17:29 *but* for general tail recursion to work

17:30 Lajla: But I believe that Steele and Sussman proved that tail recursion is lexically decidable with lexical scope.

17:30 mmarczyk: you need to be able to handle a tail call to an arbitrary function

17:30 Lajla: After all, how else could they require it in Scheme?

17:30 mmarczyk: Scheme controls its own stack discipline

17:30 Licenser: Lajla: I think the point is, rhickey does not want to say 'we have tail recursion' when the truth is 'in some cases we have tail recursion'

17:30 mmarczyk: Clojure doesn't

17:30 Lajla: Hmm, maybe that's it.

17:30 qbg: TCO is easy to implement (for simple cases at least) if you are doing everything yourself

17:30 Lajla: But tail-recursion is only a special case of tail-call optimization anyway.

17:30 mmarczyk: Licenser: that's not accurate, he really *can't*, for fundamental reasons, have tail recursion *and* have Clojure functions be called through the JVM calling convention

17:31 TimMc: Lajla: What happens here? (defn foo [bar] (bar))

17:31 mmarczyk: Lajla: well with this terminology, Clojure does give you tail recursion with recur

17:31 Lajla: I shall not praetend to understandthese JVM calling conventions.

17:31 Licenser: mmarczyk: I realize that, what I ment is clojure could have a automatic TCO for the simple cases but doing this would give the false impression clojure would do TCO for all cases

17:31 mmarczyk: Lajla: I can see multi-level recur -- "nested loops" -- as possible, though I'm hardly expert enough to want to claim this as a certainty

17:31 cemerick: Lajla: relevant to this discussion, each method call consumes stack, full stop.

17:31 TimMc: Lajla: The call to bar is in a tail position, but I don't think the compiler can do much about it.

17:32 Lajla: TimMc, I see your point.

17:32 mmarczyk: Licenser: ah, as in "we could have TCO'd self calls" -- true, I misunderstood you

17:32 Lajla: You mean calling (foo foo) right?

17:32 TimMc: Sure, that's one possibility.

17:32 mmarczyk: Lajla: Clojure function calls are ultimately Java method calls

17:32 Licenser: *nods* and I think the decision made was: Either we have automated TCO or not, we don't go half way just to have a buzz word

17:32 Lajla: Well then I see your point.

17:33 Licenser: and I actually like it since it forces you to realize when you have TC's and when not

17:33 mmarczyk: Lajla: there's nothing you can do about TCO-ing Java method calls

17:33 Lajla: mmarczyk, I guess.

17:33 mmarczyk: Lajla: and I said all that last time round! :-P

17:33 Lajla: I would have implemented it via a CPS though

17:33 You didn't

17:33 You said you loved me and wanted to stroke my hair.

17:33 mmarczyk: Lajla: we have quite significantly different recollection of that conversation :-P

17:34 Lajla: mmarczyk, the nihilists have won, sorry.

17:34 Reality is not objective.

17:34 cemerick: Lajla: I think kawa uses CPS, and gives you full TCO. It's brutally inefficient though.

17:34 Licenser: I double Lajla, that was actually what mmarczyk said

17:34 Lajla: To say that one person is insane is saying that same as that all other people are safe that person.

17:35 Licenser: sclala code looks so ugly to me :(

17:35 Raynes: Is there another MongoDB library (a la http://github.com/somnium/congomongo) that isn't ancient?

17:35 Lajla: cemerick, kawa targets the JVM?

17:35 cemerick: yes

17:35 Raynes: I'm considering forking the FleetDB client library and updating it to make it 1.2 compatible tonight. Don't have many options.

17:35 Lajla: The only reaosn I can think for Scheme compilers not targeting C-- is that they are ignorant of its existence.

17:35 Licenser: Raynes: do you want to cheat on me!

17:35 Raynes: Licenser: Too many StupidDB instances!!! Too many!!!

17:35 :p

17:35 mmarczyk: Lajla: see http://clojure-log.n01se.net/date/2010-06-09.html#01:21d and around

17:36 TimMc: $(int \丏)

17:36 sexpbot: => 19983

17:36 Licenser: Raynes: there should only be one! or at least one per file

17:36 Raynes: Plus I'm bored, and have never used a db that isn't Stupid.

17:36 :p

17:36 Lajla: I am on the internet, I am famous.

17:36 Raynes: There is one per file.

17:36 Licenser: which is fine!

17:36 Raynes: Which is a *lot*.

17:36 TimMc: Curious. When I ran (int \丏) in `lein repl`, I got 15.

17:36 Raynes: When about 5 sexpbot plugins run a db.

17:36 :p

17:36 Licenser: so?

17:37 they are working aren't they?

17:37 mmarczyk: TimMc: using a funny terminal encoding?

17:37 TimMc: Probably.

17:37 Raynes: I mostly just need to try out different things though. I'm almost a db virgin.

17:37 Indeed, they work. I need to see how much of an effect they have on memory consumption.

17:37 Licenser: Raynes: try couchdb

17:37 mongodb sucks

17:37 mmarczyk: Licenser: why'd you say that? :-)

17:38 Licenser: mmarczyk: because they refuse to support SPARC hosts

17:38 Raynes: Good idea.

17:38 Licenser: I whine to them once a month and they keep refusing

17:38 which reminds me

17:38 mmarczyk: Licenser: oh... that's really awful :-( ;-)

17:38 Licenser: no it actually is really awful

17:38 since I loved mongodb but I can't use it

17:39 since I run on sparc

17:39 mmarczyk: um, wait

17:39 Raynes: Oh boy.

17:39 mmarczyk: do you, right now, chat with us from a sparc machine?

17:39 Raynes: http://github.com/danlarkin/clojure-couchdb DB people just hate being up-to-date, don't they?

17:39 Licenser: no, I chat with you from a intel, but my server runs on sparc

17:39 danlarkin: Hmm, I thought I deleted that :)

17:40 Licenser: I could chat from the spark too if I'd install irssi, but I kind of like the clicky stuff from my mac

17:40 mmarczyk: Licenser: ah... well, still, that's cool :-)

17:40 Licenser: so I've two more sparc systems next door

17:40 mmarczyk: it is, ask Raynes they aren't even that bad :P

17:40 TeXnomancy: danlarkin: github needs a "this repo is deprecated; please see $FOO" marker

17:40 * Raynes is still going to fork the FleetDB client and bring it up-to-date tonight though. For fun.

17:40 Raynes: Sparc's cool. It runs sexpbot. :D

17:40 Licenser: is stupiddb the only db that runs well with 1.2? :P

17:41 actually clojure runs darn well on sparc

17:41 danlarkin: gaha, now it's really deleted

17:41 Raynes: Licenser: It's the only one I can find that's purposely compatible with 1.2

17:41 * Raynes is going to watch a Robin Williams HBO special.

17:41 Licenser: that is terrible in a funny way

17:41 mmarczyk: Licenser: and does CouchDB currently offer a reasonable way of running non-system-wide instances?

17:41 Licenser: ...should have said "private instances" actually...

17:42 sth like desktop-couch, I guess

17:42 Licenser: hmm good question, but since there are solaris zones which are darn cheep I don't realy care :P

17:42 I can spawn one for every person who is on the system if I'm boored

17:42 * dnolen +1 for CouchDB

17:43 mmarczyk: dnolen: same question then...?

17:43 dnolen: mmarczyk: what do you mean by system-wide?

17:44 Licenser: also couchdb runs on erlang, that alone is cool

17:45 mmarczyk: dnolen: well, the standard story for running CouchDB seems to be as a service started, say, with an /etc/init.d script

17:45 it binds to a port ~5.9k, I think? then if you can cram however many dbs you like in there

17:46 dnolen: mmarczyk: you can start it directly, though you'll probably have to do some tweaking to specify which port to run the new instance.

17:46 mmarcyzk: but one running instance of CouchDB can have multiple DBs

17:46 from what I've heard it can handle many concurrent connection just fine, that's it's strong point

17:46 mmarczyk: dnolen: which I'm liable to do something unpleasant to with my "fooling around" code

17:47 or maybe not, but anyway, makes me feel uneasy to work alongside "production" data, even on my own box

17:47 dnolen: the most powerful aspect of CouchDB is replication, you can do fun stuff with that.

17:47 CouchDB won't corrupt your data it uses MVCC

17:48 differents versions of a document preserved

17:48 Lajla: mmarczyk, the JVM, does it allow jumps?

17:48 mmarczyk: the Canonical people seem to believe it necessary to have a separate desktop-couch project for spawning per-user instances for config data

17:48 Lajla: nope

17:48 Lajla: I find it abstract that a virtual machine has 'method calls'

17:48 AH

17:48 That explains it.

17:48 mmarczyk: dnolen: yeah, I know about their storage model

17:48 Lajla: You told me this JVM was as simple as the average CPU instruction set. =(

17:49 You lied to me.

17:49 mmarczyk: (about CouchDB) that's why I think Couch is super-cool

17:49 just haven't got 'round to understand how I'm actually supposed to use it :-P

17:50 Lajla: yet another case of differing perspectives on "simple" ;-)

17:50 but I have told you explicitly that there are no jumps :-P

17:51 Lajla: This is an outrage!

17:51 * Lajla cannibalizes mmarczyk's leg.

17:51 mmarczyk: except through return, break/continue (multi-level) and throwables

17:52 ouch, you're a vicious person :-P

17:52 TeXnomancy: no jumps unless you're using John Rose's crazy experimental JDK branches: http://blogs.sun.com/jrose/entry/tailcalls_meet_invokedynamic

17:53 qbg: I think you have goto

17:53 mmarczyk: TeXnomancy: wow, that's crazy :-)

17:53 Lajla: mmarczyk, well, you are quite tasty-legged.

17:54 mmarczyk, anyhow, you must have some respect for the fact that I ask such theoretical quaestions before I even decide whether or not to learn a language.

17:54 mmarczyk: Lajla: pleasure to be of use

17:54 Lajla: I like people that like to be used, it's my masculine side.

17:54 * Lajla proceeds to put his woman into a veil and hits her.

17:55 KirinDave: Some joke.

17:55 mmarczyk: qbg: in Java? nope

17:55 qbg: I'm talking at bytecode level

17:56 KirinDave: Lajla: You don't mind if I take that out of context and put it up on my website, do you?

17:56 TimMc: Yes, the bytecode supports goto.

17:56 KirinDave: How could it not?

17:57 mmarczyk: qbg: ah, well, that's true then

17:57 Lajla: 'Like most virtual machines, the Java Virtual Machine has a stack-based architecture akin to a microcontroller/microprocessor. However, the JVM also has low-level support for Java-like classes and methods, which amounts to a highly idiosyncratic memory model and capability-based architecture.'

17:57 KirinDave, not at all.

17:57 No idea of which you speak, but information is free as far as I'm concerned.

17:57 KirinDave: Lajla: I'm sort of sad that you said you don't mind. But it won't deter me.

17:57 mmarczyk: qbg: but you can't use it funky ways -- even if you write your bytecode by hand -- because it won't get past the bytecode verifier when you try to load it

17:57 Licenser: if I don't have lein and want to build one single clojure file w/o anything else what would be the command for it?

17:58 Lajla: KirinDave, of what are you speaking anyway?

17:59 What are you putting on which site of yours?

17:59 KirinDave: Lajla: http://idisk.me.com/dfayram/Public/Pictures/Skitch/clojure_%28irc.freenode.net%29-20100622-145517.jpg

17:59 Lajla: Ahaha

17:59 What client is that?

18:00 Chousuke: looks like colloquy

18:00 Licenser: yap looks like it

18:00 * Lajla nuolee Chousuke:n kalun.

18:00 Chousuke: eh :P

18:01 mmarczyk: Licenser: you mean compile?

18:01 Licenser: yes

18:01 mmarczyk: Licenser: there's a compile function in clojure.core

18:01 see docstring for details

18:02 Licenser: I know but starting a repl isn't really fun :P I'd enjoy a lot if I could just call something like clojure.compile <file>

18:02 mmarczyk: NB. you'll need to have your output directory for .class files on your classpath

18:02 well you can use clojure.main -e "(compile ...)"

18:02 or maybe wrap it in binding to set the output path

18:03 * Lajla thinks that Java is a danger to others and itself.

18:03 mmarczyk: hm, I think the syntax was -e "...", I hardly ever use that though

18:04 Licenser: I tried that but didn't really work - I think

18:04 actually did

18:09 mmarczyk: hm

18:11 * Lajla panee lajlan Chousukeen

18:12 dnolen: anybody else messin with clj-apache-http ?

18:13 stuartthecol: hi guys - I think I'm having some classpath trouble with leiningen. I made a new project with lein new foo, run lein swank, but then when I connect with slime and run the auto built core.clj file, it gives me No such namespace: foo.core. any ideas?

18:14 mmarczyk: Licenser: strangely enough, with 1.1 at least, -e "(compile ...)" throws an exception for me, but *after* producing a .class file

18:14 Licenser: mmarczyk: it seems to work

18:14 mmarczyk: Licenser: ah, good

18:14 Licenser: I was rather hoping there was something funny with the one-off "project" I'm using for this :-P

18:14 Licenser: rhickey's comment this morning about 'with the new changes clojure at least stands a change in the benchmark shootouts' got me thinking and I figured I'll write a few of the shootouts :P

18:15 cemerick: looks like the hinting available to definterface isn't there for protocols yet?

18:19 rhickey: cemerick: protocols are ordinary fns, and don't take specific types (yet)

18:19 the prim work is the path to that

18:19 cemerick: rhickey: OK, so definterface + extend-type is idiomatic for now

18:20 rhickey: cemerick: this to get an interface for Java?

18:20 cemerick: yeah

18:20 I figured I'd just reuse the protocol-generated one, but alas :-)

18:20 rhickey: but you want the interface to reach a Java type you don't own?

18:20 cemerick: nope, I own the whole stack

18:21 (trying to be 100% clojure these days, as much as I can anyway)

18:21 rhickey: so definterface + deftype/defrecord

18:21 cemerick: right -- well, almost -- the implementing class *is* in Java. Probably the 2nd-gnarliest thing I've got, 7 years old now. :-/

18:22 so, extend-type :-)

18:30 rhickey: cemerick: no, extend-type can;t be used to make an interface reach a non-derived type

18:31 Licenser: hmm is unchecked-inc gone?

18:32 rhickey: now unchecked-inc-int/long specific

18:32 Licenser: ah thanks!

18:34 rhickey: bbl

18:35 Licenser: take care rhickey

18:42 bed time for me see you tomorrow poeple

19:09 quidnunc: I keep getting "let: File exists: /home/me/.emacs.d/elpa/clojure-mode-1.7.1/clojure-mode.el" when trying to install clojure-test-mode from elpa in emacs. Anyone have a similar problem?

19:14 lancepantz: when i do a C-c C-d C-d, can i close the description buffer inline when i'm done, without having to switch to it?

19:16 jkkramer: quidnunc: http://groups.google.com/group/clojure/msg/4d2814711fa732a8

19:25 quidnunc: jkkramer: Thanks (not quite working yet, I think I have to restart emacs).

20:10 rntz: what does it mean for a symbol in a parameter list to begin with &, as eg &form, &env do in: (fn [&form &env name & args] ...)?

20:11 cat26: hi...

20:11 someone has a clue how to call a method from a class generated on clojure from coldfusion?

20:11 lancepantz: rntz: it's optional and anything past the & will be rolled up

20:11 rntz: oh, i'm sorry, i misread

20:11 ignore me

20:12 never noticed it at the beginning of a symbol

20:15 cat26: instead of coldfusion, more generic, from java itself

20:17 mmarczyk: rntz: the & has no special meaning

20:17 rntz: &form and &env are implicit arguments received by all macros

20:18 qbg: cat26: Like any other java method

20:18 mmarczyk: rntz: &form holds the entire form which triggered the macro transformation and &env contains the compilation-time local environment in the context of which the macro is being expanded

20:19 cat26: well, the problem is that cf loads the object, but apparently has no methods

20:19 qbg: cat26: How are you generating the class?

20:20 cat26: when -main should return a string, cf prints only the name of the class plus a id

20:20 with gen-class

20:23 stuartthecol: does anyone know why paredit would work correctly with () and []'s, but not {}'s? it won't auto close them, but it also won't let me delete unmatched ones

20:23 tomoj: which version of paredit

20:24 stuartthecol: 20

20:24 tomoj: get 22

20:24 http://mumble.net/~campbell/emacs/paredit-beta.el

20:25 stuartthecol: cool, thanks

20:25 tomoj: clojure-mode will fix {} if it sees that you're using 22

21:12 ttmrichter: http://kirindave.tumblr.com/post/726735921/special-kind-of-asshole

21:12 Please tell me that was faked.

21:13 lancepantz: nope

21:14 its odd, that's actually not the first time he's brought up beating women

21:15 ttmrichter: I see.

21:15 Every time I question my decision to leave the industry, I stumble over reminders of why I did.

21:19 defn: ugh, don't get mstarted on that guy

21:19 me*

21:19 Raynes: You guys realize he is here, right?

21:19 defn: yes...

21:19 Raynes: Last thing #clojure needs is a IRugment.

21:19 :p

21:20 defn: he'll likely bring one of those whether we say any of this or not

21:20 that's his MO

21:22 I think it just might be an epic informed troll...

21:22 lancepantz: worse, a scheme troll

21:22 defn: D:

21:23 Raynes: D:

21:23 defn: Anyways, moving on... I had an interview today and as usual the "people" side of the interview went sort of meh

21:23 nDuff: good coworkers are hard to find

21:23 defn: but the technical side was epic. reason? this guy writes clojure.

21:23 nDuff: heh :)

21:23 defn: i almost leaped over the table to hug him

21:24 lancepantz: haha, thats awesome

21:24 defn: i was like: you? wait... you said... are you? you write clojure!

21:25 nDuff: ...just as an aside, last time I interviewed with a small, profitable startup with a bunch of brilliant people (and accepted their offer over a potentially more lucerative alternate), it got announced the day after I accepted that they were getting bought by Dell.

21:25 defn: oh...shit...

21:26 nDuff: ...that said, a fair number of the brilliant people stuck around, so it wasn't entirely a fiasco

21:28 upside: great health plan, hands-off immediate management (yes, we use Clojure)

21:28 defn: until they transformed the culture into a nice filthy sewer water id imagine

21:28 nDuff: downside: evil corner-cutting facilities department (they took away our espresso machine, those bastards!)

21:29 defn: we used to have free soda

21:29 nDuff: ...at one point they took away our trash cans and made us walk our own trash to the hall

21:29 defn: now it's a quarter

21:29 lancepantz: nDuff: i would imagine you would lost some upside though, as your stock hadn't been granted?

21:29 defn: we used to have really awesome vacuum packed coffee, now we have cheap flavored crap

21:29 lancepantz: options imean

21:29 nDuff: lancepantz, ehh, most of the equity was owned by VCs anyhow

21:29 lancepantz, ...I wasn't really in this one for the options

21:30 defn: background: we got bought out by a fortune 500, which then was bought out by an even larger company

21:30 lancepantz: fair enough

21:30 defn: so basically, my highest level manager, is one of the lowest in the company

21:30 and we dont get anything we want

21:30 *facepalm*

21:31 nDuff: ugh.

21:31 defn: c'est la vie -- they're going to lose me in a few weeks along with everyone other smart person here eventually

21:31 s/everyone/every

21:31 kind of a wasted investment on their part :\

21:32 nDuff: we're finally losing some good people, but they managed to keep things reasonable and sane for over 2 years; that's longer than I expected

21:32 defn: now that people arent buying gold bullion in anticipation of the apocalypse a lot of people have been jumping around

21:32 from what ive read

21:33 lancepantz: defn: are you tied to wisconsin?

21:33 defn: lancepantz: hell no.

21:33 er, well, wait -- how do you mean?

21:33 nDuff: frankly, I'm a bit conflicted; despite the Dell name we have lots of fun and interesting projects to work on, and the pay is much better than I can get from most of the folks I know running startups right now (unless I'm willing to take my chances on equity, and I've been down that road a time or two already)

21:33 lancepantz: you should move

21:33 defn: oh yeah... i was surprised you knew i was in WI

21:34 lancepantz: i think there are alot more clojure jobs on the coast

21:34 i think its in your host or something

21:34 defn: yeah i really wanna move to SF, but i need to let my girlfriend get through college (one more year)

21:34 lancepantz: nope. must have been a blog or something

21:35 the perks are alot better out here :)

21:35 i'm in la now though

21:35 * nDuff isn't going back to the Bay Area. Awful traffic, unfriendly people; Austin is a much, much nicer place to live

21:35 nDuff: okay, not unfriendly compared to LA

21:35 defn: :D

21:35 lancepantz: i like austin

21:35 traffic here though is nuts

21:35 defn: ive heard nothing but awesome stuff about austin

21:35 nDuff: also the cost of living difference

21:35 lancepantz: i work weird hours though, so its tolerable

21:35 defn: but man...id feel weird calling TX home

21:35 nDuff: defn, it's not Texas, it's *Austin*!

21:36 defn, ...nothing in common but the weather :)

21:36 defn: :D -- yeah yeah, just not ready to move to the south pole of North America

21:36 i need to go in between before i can settle down that low

21:36 hence SF

21:36 i would kill for the music in austin though

21:37 lancepantz: i probably wouldnt have a car, probably would sell it to pay my rent! ;)

21:37 nDuff: heh; there's a lot going on, but I just never get downtown to enjoy it. Cousin-in-law runs a bar downtown right next to La Zona Rosa (one of the local music venues), and I've rarely ever been.

21:37 lancepantz: i haven't bought one since i moved down from sf

21:37 probably will next month or so, been putting it off

21:38 defn: if i move to texas there's the temptation to be a coyote, which i dont need

21:38 i wonder if i could use clojure to improve the ratio of immigrants i could get across the border

21:38 nDuff: <plug type="shameless">re: transport in high-density living areas where garaging is expensive, the folks over in #bikefriday make some damn fine folding bicycles</plug>

21:39 defn: i ride a fixed gear, mainly because im 25 and a hipster

21:39 nDuff: pah

21:39 * nDuff loves the internally geared hubs

21:40 defn: like the old schwinns?

21:40 lancepantz: oh jesus

21:40 defn: those things are a bear to put together...

21:40 lancepantz: if i had admin i would kick you on principle defn

21:40 nDuff: a Rohloff on the big bike, a SRAM i-Motion 9 on the Tikit (the folder), a Nexus on the old shaft-drive commuter

21:40 rntz: there are a lot of swank-clojure repos on github. which one should I be using?

21:40 defn: lancepantz: :D

21:40 lancepantz: track stands are cool!

21:40 rntz: use technomancy's

21:41 nDuff: defn, "those things" meaning internally geared hubs? I'm too much of a wuss to overhaul them myself; that's what professional bike shops are for. :)

21:42 defn: nDuff: yeah those things are crazy hard to put together

21:42 i couldnt even begin to know where to start

21:42 i tried once...just one.

21:42 once*

21:43 Madison, WI has some really nice bike paths. It's note exactly startup mecca, but there's starting to be some more VCs around town, more biotech, etc.

21:43 * defn is rationalizing his poor choices again...

21:44 rntz: is there some way to run a swank-clojure instance /not/ associated with a "project"?

21:44 arohner: lancepantz, nDuff: you two are in Austin?

21:44 lancepantz: arohner: i'm in los angeles

21:44 * nDuff lives in Austin, but is typing from Round Rock.

21:44 lancepantz: i just like it

21:45 defn: man, I hear nothing but bad things about LA

21:45 arohner: sounds like it might be time to start an Austin Clojure users group

21:45 defn: all the fake palm trees

21:45 i started one in madison, we're at a grand total of 2 members! huzzah!

21:46 arohner: I think with nDuff and my cofounder, we're at 3!

21:46 nDuff: we've got two people who make production commercial use of clojure here in the office, and me (playing around, but nothing in production yet)

21:46 lancepantz: defn: i was miserable at first, but i've came around, you just have to figure it out

21:46 arohner: nDuff: where do you work?

21:47 Raynes: I know several Alabama people in #Haskell. We started a usergroup back on early '09, and are still just-a-plannin' to meet.

21:47 nDuff: arohner, Dell

21:47 Raynes: About 4 or 5 of us.

21:47 arohner: nDuff: I'm sorry. I know a bunch of people there, none of them happy

21:47 defn: Raynes: I'm from the north. I don't understand this "just-a-plannin'" lingo.

21:48 nDuff: arohner, well -- I'm in a little startup that got acquired a few years back, and the digestion process has actually been pretty slow.

21:48 Raynes: Since the group was formed, we've talked about meeting, but never actually did so.

21:48 arohner: nDuff: ah. The ones I know are in sales, the belly of the beast. What did the startup do?

21:48 defn: Raynes: oh i know I was just givin you trouble, spergy

21:49 nDuff: arohner, software-as-a-service

21:49 defn: Startup: SaaS. Investor: $

21:50 arohner: defn: if only it were that easy

21:50 defn: yeah..i have no startup experience

21:50 arohner: defn: they want customers, and revenue, and a plan and pretty soon you never get to code

21:51 defn: i just hear all sorts of stuff about SaaS + Getting paid

21:51 * nDuff has enough startup experience to be old and jaded and bitter

21:51 defn: arohner: yuh :(

21:51 Have you guys played with Quora at all?

21:51 I'm sort of...well...obsessed with it ATM.

21:51 arohner: defn: a little. just poked around, no serious use

21:52 defn: As the user base grows I really hope they are able to keep up (admins and tech-wise)

21:53 there is a problem with new users' questions and the topics they assign to a question. some people dont understand how to tag things. sad, but true.

21:53 like a miley cyrus question somehow gets "Facebook", because the person saw it on facebook, for instance

21:54 qbg: A random 5 minute hack: http://gist.github.com/449372

21:54 defn: I guess Facebook is making a Q/A thingamajig to compete with Quora, and there are some questions wherein a lot of anonymous users, who are in my estimation Quora employees venting some insane rage in the direction of Mr. Zuckerberg

21:55 sorry so O/T. qbg i don't really get it, but I'm not "smaert".

21:56 qbg: Just a random hack. Scoped destructors might be useful for some.

22:06 pdk: is quora basically formspring

22:16 defn: pdk: hmmmmmmm not sure

22:17 i bet there's a question like that on quora though! :)

22:29 unfortunately no...there wasn't

22:29 tomoj: programming challenge: fix http://www.quora.com/challenges

22:29 cemerick: I'm starting to think that type-hinted interop should throw a compiler exception if nothing with the named field/method exists at all.

22:30 defn: ive been working on that actually in clojure tomoj

22:30 it's a hamiltonian path problem

22:30 tomoj: it's a 500 error

22:30 defn: tomoj: they're down for maintenance

22:30 tomoj: ah

22:30 defn: "double secret maintenance" apparently :\

22:30 it just happened a few minutes ago

22:31 hugod: cemerick: would that work if you were dynamically importing classes?

22:31 defn: tomoj: it's a neat challenge though

22:31 cemerick: hugod: you mean using an import in a fn body?

22:32 hugod: well, using it somewhere after compilation

22:32 defn: basically given [[2 0 0 0] [0 0 0 0] [0 0 3 1]] you need to find all of the longest paths which start at 2, end at 3, and dont touch any 1s

22:33 cemerick: hugod: you'd have to have the class loaded before you use the type hint naming it in any case

22:34 hugod: cemerick: you're right

22:34 cemerick: rhickey: am I just nuts w.r.t. to the above?

22:36 hugod: I've been thinking too much about dynamic classloaders - I would like to be able to run multiple versions of jars (in different threads)

22:37 defn: tomoj: it's back up

22:38 tomoj: woohoo

22:38 cemerick: hugod: hahaha. Sorry. :-D

22:39 I tried doing that once a long time ago by mangling classnames based on what thread was loading the class. It didn't go well.

22:40 chouser: cemerick: I wonder if that strays too far from hinting and toward enforcement.

22:40 hugod: cemerick : I'm slowly thinking it would be a bad idea - but that means lots of vm spawning for me

22:41 chouser: I don't see why interop calls couldn't use call-site caching like keywords and protocol fns do now. Then you'd never need hinting at all for best performance.

22:41 cemerick: chouser: I'm not married to whatever baggage the "hint" term carries. If I try to compile (.foo ^ClassName bar), and there's *nothing* in ClassName called foo, then throwing an exception has nothing but upside IMO.

22:41 danlarkin: technomancy: I emailed you a clojure-mode present

22:42 cemerick: chouser: call-side caching is fast, but still just a hair slower than direct invocation, no?

22:42 call-site*

22:44 chouser: hm, not sure.

22:45 I thought for keywords rich was claiming parity.

22:45 dnolen: cemerick: same speed in every test I could come up with.

22:45 chouser: but last time I measured, protocol methods implemented via extend were a bit slower than those in deftype/defrecord bodies.

22:45 cemerick: I thought there was still a map lookup involved?

22:46 chouser: no, call-site caching doesn't have any map lookup on cache hit

22:46 cemerick: chouser: that makes sense, there's definitely a lookup there

22:46 I sit corrected, then.

22:46 chouser: I should check those measurements again.

22:46 but before that, I should go to bed.

22:46 g'night folks.

22:47 cemerick: In any case, I'd be happy with some hinted enforcement. It certainly doesn't impact dynamicism.

22:47 sleep well :-)

23:02 redalastor: I noticed a mistake in the cheatsheet on the main site. It says that creating an empty list is '() which works but () is more idiomatic.

23:23 defn: ,()

23:23 $()

23:23 sexpbot: => ()

23:23 defn: $'()

23:23 sexpbot: Command not found. No entiendo lo que estás diciendo.

Logging service provided by n01se.net