#clojure log - Mar 05 2009

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

0:07 zakwilson: ~translate to it: I don't speak Italian.

0:07 clojurebot: Non parlo italiano.

0:22 cooldude127: clojurebot is a liar

0:22 it obviously speaks italian

0:28 durka42: clojurebot: do you speak italian?

0:28 clojurebot: Huh?

1:23 djkthx: any idea why im getting this error from sql in clojure-contrib?

1:23 user=> (use '[clojure.contrib.sql :as sql])

1:23 java.lang.Exception: No such var: clojure.contrib.def/alter-meta! (sql.clj:22)

1:26 durka42: djkthx: i don't get that. are your builds out of sync?

1:26 djkthx: i dont think so

1:26 everything is the latest

1:27 durka42: alter-meta! is in core

1:27 ~latest

1:27 clojurebot: latest is 1323

1:27 durka42: ~latest contrib

1:27 clojurebot: latest contrib is 334

1:27 durka42: whoa that's incorrect

1:27 latest contrib is 565

1:28 djkthx: hmm

1:28 im using the git repo for clojure-contrib

1:28 i wonder if thats the problem...

1:28 durka42: kevinoneill's?

1:28 djkthx: yeah

1:29 durka42: i thought that was supposed to mirror googlecode

1:29 so it shouldn't be a problem

1:29 but i don't know

1:29 djkthx: hmm

1:29 weird

1:29 durka42: the last commit was today

1:29 er, yesterday

1:29 in error-kit

1:30 djkthx: hmmm

1:33 alter-meta doesn't show up anywhere in clojure's src/ for me...

1:34 durka42: ~source alter-meta!

1:34 djkthx: hmm

1:34 guess my source is messed up

1:34 hiredman: djkthx: what svn rev are you at?

1:35 durka42: hiredman: how can one check, without svn up'ing?

1:35 hiredman: svn info

1:35 durka42: hiredman: i think he is using the git mirror

1:35 djkthx: im using svn for clojure

1:35 didnt switch to the git mirror

1:36 whoa

1:36 r1162

1:36 thats quite old

1:36 durka42: hiredman: this is incorrect:

1:36 ~latest contrib

1:36 clojurebot: latest contrib is 334

1:36 hiredman: that may be pre-google code

1:36 durka42: then fix it

1:36 durka42: that is pre-google code

1:36 djkthx: i believe it is

1:36 yeah

1:36 durka42: does clojurebot not watch contrib as it does core?

1:36 hiredman: someone set that, clojurebot doesn't track contrib svn

1:36 durka42: it may have been me

1:36 djkthx: im assuming kevin oneill's follows google-code?

1:36 hiredman: at least note yet

1:37 I really need to make svn.clj better

1:38 djkthx: cool

1:38 works now

1:38 thanks guys

2:20 Lau_of_DK: Hey guys

2:23 hiredman: yo

2:30 brennanc_: I'm trying to understand the difference between alter and commute. Can someone explain?

2:33 hiredman: clojurebot: alter?

2:33 clojurebot: alter is always correct

2:34 brennanc_: if thread A starts a transaction that modifies a ref and the B comes along after and completes the entire transaction before A is done, does that mean that A overwrites B? or does A start over when it sees there has been another commit

2:37 cgrand: brennanc_: A starts over

2:37 brennanc_: thanks

2:37 cgrand: unless you used commute

2:37 hiredman: ...

2:37 brennanc_: that's what I was referring to

2:37 so what happens in the case of commute?

2:39 cgrand: at the end of the transaction A, the commute is recomputed with the latest value of the ref (since B modified it)

2:40 brennanc_: isn't that the same as what alter does?

2:43 cgrand: if in thread A you use alter the whole transaction restarts, with commute the transaction would never restart.

2:44 the return value of alter is guaranteed to be the value to which the ref will be set, there's no such guarantee with commute

2:45 brennanc_: is there a better example/scenario? I'm not getting it.

2:46 can you go throw 2 different examples, one with alter and one with commit?

2:46 hiredman: ,(doc io!)

2:46 clojurebot: "([& body]); If an io! block occurs in a transaction, throws an IllegalStateException, else runs body in an implicit do. If the first expression in body is a literal string, will use that as the exception message."

2:47 hiredman: ~def io!

2:50 cgrand: brennanc_: 2 min

3:00 lisppaste8: cgrand pasted "alter vs commute" at http://paste.lisp.org/display/76500

3:11 brennanc_: cgrand: so it's set to 4 either way?

3:13 cgrand: yup

3:13 brennanc_: I think I'm kind of getting it. What about the classic cash register example? Let's say 1) get balance, 2) add to balance, 3) set balance ...

3:14 with commute, if B comes along after A does step 1, will A base it's result off of what it read, or will it know what it read is now invalid?

3:15 cgrand: if you use commute steps 1 2 and 3 are blended together

3:15 (commute balance add some-cash)

3:17 brennanc_: blended?

3:17 I see there's a concurrency video, I'm going to look through that. Hopefully it explains it in there.

3:19 cgrand: commute gets the actual value, adds to it and sets it in one atomic step, B can't come along after setp 1 and before step 2

3:20 alter is the safe choice

3:20 brennanc_: it sounds like B is safe as well from what you just said

3:20 I'm confused :(

3:22 cgrand: "alter is the safe choice" is a general rule of thumb, in your last example I think commute would do fine

3:24 hiredman: clojurebot: alter?

3:24 clojurebot: alter is always correct

3:26 cgrand: if, in your transaction, you rely on the new value of the ref you need to use alter, else you can use commute.

3:26 brennanc_: you're referring to the return value of the function vs the value of the ref?

3:27 in alter they are the same, in commute they can be different?

3:29 cgrand: yes (the return value vs the value of the ref after the txn succeeded)

3:29 brennanc_: ok, starting to get it

3:30 :)

3:31 cgrand: (I hope I'm not going to confuse you further: but the return value is always consistent with the in-txn value)

3:33 brennanc_: I'm going to finish watching the video, go to sleep, and then come back to it tomorrow. Hopefully it will make a lot more sense then.

5:31 eevar2: ,(use 'clojure.contrib.lazy-seqs)

5:31 clojurebot: java.io.FileNotFoundException: Could not locate clojure/contrib/lazy_seqs__init.class or clojure/contrib/lazy_seqs.clj on classpath:

5:33 eevar2: ,(use 'clojure.contrib.seq-utils)

5:33 clojurebot: java.io.FileNotFoundException: Could not locate clojure/contrib/seq_utils__init.class or clojure/contrib/seq_utils.clj on classpath:

5:35 eevar2: ,(doc use)

5:35 clojurebot: "([& args]); Like 'require, but also refers to each lib's namespace using clojure.core/refer. Use :use in the ns macro in preference to calling this directly. 'use accepts additional options in libspecs: :exclude, :only, :rename. The arguments and semantics for :exclude, :only, and :rename are the same as those documented for clojure.core/refer."

5:35 kotarak: eevar2: do you have a problem with use?

5:39 eevar2: not any more, thanks .)

6:50 timothypratley1: user=> (import '(javax.sound.sampled AudioSystem))

6:50 nil

6:50 user=> (import '(javax.sound.sampled DataLine.Info))

6:50 java.lang.ClassNotFoundException: javax.sound.sampled.DataLine.Info

6:51 DataLine.Info <- was this invented to annoy Clojure users?

6:52 rhickey: ,javax.sound.sampled.DataLine$Info

6:52 clojurebot: javax.sound.sampled.DataLine$Info

6:52 timothypratley1: :) thanks!

9:48 AWizzArd: BTW, yesterday was the birthday of AIM-8, Lisp: http://www.informatimago.com/develop/lisp/small-cl-pgms/aim-8/

9:55 alinp1: ,(doc take)

9:55 clojurebot: "([n coll]); Returns a lazy sequence of the first n items in coll, or all items if there are fewer than n."

9:55 alinp1: ,(doc from)

9:56 clojurebot: java.lang.Exception: Unable to resolve var: from in this context

9:56 alinp1: is possible in clojure to generate an infinite list ?

9:56 like in haskell

9:56 haskell equivalent: [1..]

9:57 in fact, will be nice to be a lazy infinite list

9:57 Chouser: ,(take 10 (iterate inc 5))

9:57 clojurebot: (5 6 7 8 9 10 11 12 13 14)

9:57 alinp1: ,(doc iterate)

9:57 clojurebot: "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"

9:57 alinp1: oh, thanks

9:58 Chouser: np

10:48 tashafa: Chouser: should duck-streams include a case for gzip compressed streams or our apps should handle those?

11:04 clojurebot: svn rev 1324; sped up for

11:09 Chouser: tashafa: that's a nice thought. would it need a parameter, or would it examine the stream itself in order to do the right thing?

11:11 rhickey_: so much re-indenting recently. Is there a particular reason you're choosing to do that now?

11:13 leafw: Chouser: the new doc for doseq has a dangling parenthesis, very weird.

11:13 ,(doc doseq)

11:13 clojurebot: "([seq-exprs & body]); Repeatedly executes body (presumably for side-effects) with bindings and filtering as provided by \"for\". Does not retain the head of the sequence. Returns nil."

11:13 leafw: not here on clojure bot, bot yes on latest revision.

11:14 rhickey_: Chouser: looking at the :use proposal, I'd been thinking about namespaces declaring a preferred alias, to avoid having to :as when :require, now if :use does what :require did, but only when :as is supplied, that's thwarted

11:14 cemerick: some of the new indenting is irregular, too (like condp in r1324)

11:14 Chouser: rhickey_: I like the idea of a preferred alias.

11:15 rhickey_: Chouser: aargh, I hadn't noticed that - there's a reformat code checkbox on IntelliJ I don't remember it ever having been set, but it must have been. I double-check the diff before checkins, but this happens on upload - yikes

11:16 Chouser: :-(

11:16 cemerick: rhickey_: are you using the intellij clojure plugin, then?

11:16 * cgrand just found the actual change

11:17 Chouser: cgrand: I found the def, still trying to find the actual changes...

11:17 Cark: hello

11:17 Chouser: cemerick: I don't know -- the clojure code appears to be indented unlike clojure code.

11:18 Cark: hi

11:18 Cark: it has been a while (damn delphi project) glad to be back !

11:18 cgrand: Chouser: line 2756 when-let -> when-first

11:19 cemerick: Chouser: I was thinking that perhaps the newness of the plugin might be falling down. I presume IntelliJ doesn't try to apply code reformatting to clojure files in any default config.

11:19 Chouser: Cark: I really liked Delphi, last time I used it.

11:20 probably just over a decade ago now. :-)

11:20 Cark: chouser : the lack of closures is pretty hard to live with

11:21 Chouser: yes, my tastes have changed in the meantime, I'm sure.

11:22 Cark: but it's not too bad, for an imperative language, no need to be smart at all =P just let the fingers do the coding

11:22 rhickey_: cemerick: I'm not editing with the plugin yet, but I use IntelliJ for svn and have plugin installed - the reformat checkbox must have been set in my upgrade to IntelliJ V8

11:22 Chouser: leafw: I'm not seeing the paren mismatch on doseq.

11:23 rhickey_: first noticed it in svn 1318

11:23 rhickey_: Chouser: aargh

11:24 cemerick: enclojure's formatting is almost perfect, IMO. It falls down a little with parens found in strings, tho.

11:24 leafw: Chouser: never mind. Appeared only once -- my interpreter may have screwed up.

11:24 rhickey_: tools modifying after you say commit is a truly bad idea

11:24 clojurebot: svn rev 1325; sped up for, w/fixed formatting

11:25 Chouser: rhickey_: I wholeheartedly agree. Sounds destined for pain.

11:25 rhickey_: 1325 better?

11:27 cemerick: yeah, I think so

11:28 rhickey_: Chouser: so how does preferred alias jive with new :use?

11:29 cemerick: rhickey_: it looks like line number information for else forms isn't being reported properly -- the compile error reports the line number where the if-let form starts, rather than the line number of the else form (where a recent error of mine was)

11:30 don't know if that's easily fixable, but...

11:30 actually, the same thing happens with plain if forms as well

11:31 tashafa: Chouser: Regarding duck-streams: preferably it would examine the stream, so duck streams stay true to the "just-give-me-a-stream" mantra

11:34 rhickey_: cemerick: got a test case?

11:39 cemerick: ah, the behaviour is different for fn invocations vs. symbols, and it has nothing to do with if at all -- same behaviour with do...

11:39 lisppaste8: cemerick pasted "rhickey_: loss of line-number info" at http://paste.lisp.org/display/76525

11:41 rhickey_: cemerick: there's no line number info kept on plain symbols during compilation, only on lists

11:42 cemerick: OK, good to know. A good reason to keep the shorter form first. ;-)

11:43 rhickey_: cemerick: aren't those errors always going to be a variant of 'I don't understand foo, or foo unbound' etc? pretty easy to find foo

11:49 cemerick: rhickey_: probably true, but I had an if-let that set a bunch of bindings from destructuring a map and had a long body; the else form was just returning a value that is available in the if-let body via the map destructuring. A casual look at the entirety of the if-let had a bunch of valid usages of foo, so finding the solitary foo reference in the else form required a careful reading.

11:53 rhickey_: cemerick: ok. I'm still on the fence on adorning read symbols with line metadata

11:54 cemerick: is it just a question of space or compile time, or?

11:54 rhickey_: yes

11:57 cemerick: I imagine that eventually there should be different compilation "profiles" -- I could care less about space or compile time, but I'll bet the mobile folks care very deeply.

11:58 rhickey_: cemerick: yeah, there are a bunch of interesting pulls on Clojure right now - mobile, OSGi and other module-based platforms, TerraCotta, potability to CLR/JavaScript, high-perf people ...

11:59 portability

12:00 cemerick: actually, we have multiple use-cases ourselves -- space is a real concern once we start looking at distributing software that includes clojure, rather than running stuff in-house (just to contradict myself within 60 seconds)

12:00 Chouser: spin-offs. did you guys see L# ?

12:01 rhickey_: heh - this: http://www.lsharp.org/ ? is actually a derivative of my original DotLisp

12:02 Chouser: yeah, I think that's the one I was reading about, implemented using LINQ

12:02 http://groups.google.com/group/LSharp/browse_frm/thread/f966f9a809cc702b

12:03 rhickey_: That's why I like the supported Clojure/CLR effort

12:04 rather than see clones, maybe all interested parties can pool their effort

12:08 Chouser: as for :use/:require, I'd very much like to see them consolidated. I don't think what they do is sufficiently different to warrant them being separate.

12:10 with that as a goal, perhaps (uses 'foo.bar.baz) could default to using the preferred alias

12:10 then (uses 'foo.bar.baz :exclude ()) could act like 'use' does now, refer'ing in all the symbols

12:11 (uses 'foo.bar.baz :as qux) would ignore the perferred alias and use qux instead.

12:12 'uses' could support all the other flags that 'use' and 'require' currently do, so they could be deprecated to allow everyone to transition to 'uses'

12:15 shoover: clojurebot: thirsty is yes, until Clojure is potable

12:15 clojurebot: You don't have to tell me twice.

12:26 kotarak: Hmmm... AOT compilation looses metadata on namespaces.

12:28 Having a (ns foo.bar "docstring") in a corresponding file and loading the file via require shows the docstring in the (doc foo.bar) output. AOT compiling the file and loading from the class file only shows nil in the (doc foo.bar) output.

12:32 Cark: i'm having a bit of trouble making a jar execuable

12:33 if i do this : java -cp app.jar application

12:33 it works

12:33 leafw: jars cannot be executable

12:33 Cark: but it won't work by just java -jar app.jar

12:33 leafw: oh that. Just declare the manifest file.

12:34 Cark: right i made a manifest file

12:34 danlarkin: leafw: hm? jars can be executable

12:34 leafw: ant should do it for you if you set up its XML sourcery properly.

12:34 Cark: i'm doing it manually, i want to understand it all

12:34 my manifest file has this : ClassPath: .

12:34 and : Maiin-Class: application

12:34 with only one i =P

12:35 the application.class file is at the root of the jar file

12:35 hiredman: manifests aren't xml

12:35 oh

12:35 ant

12:36 Cark: so when trying to run the jar file i get "Exception in thread "main" java.lang.NoClassDefFoundError: application"

12:36 hiredman: Cark: there should be a directory structure inside the jar that mirrors the namespace declartion of your application

12:36 Cark: right

12:36 i tried all combinations

12:37 eventually i went for no directory structure at all as a simple case

12:37 hiredman: ~namespace

12:37 clojurebot: namespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it

12:37 Cark: but i tried test/application.class with a namespace of test.application aswell

12:38 right now it's application.clj direct in root of jar, with clojure namespace of 'application' all alone

12:38 hiredman: so a single segment namespace?

12:38 Cark: right

12:38 hiredman: "Do not try to use single segment namespaces."

12:39 Cark: ah ok... i'll revert to directory and let you know !

12:41 still no good : Exception in thread "main" java.lang.NoClassDefFoundError: test/application

12:41 but it is really there in the jar file ... i don't get it

12:41 keithb: Hi, all. I'm trying to subclass a Java file for the first time. What am I doing wrong here?: http://gist.github.com/74451 . Line 71 is the 'def clear-action...' line.

12:41 hiredman: lisppaste8: url?

12:41 lisppaste8: To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.

12:42 hiredman: cat you pastebin your manifest?

12:42 keithb: you are missing a few parens

12:42 lisppaste8: cark pasted "a manifest file" at http://paste.lisp.org/display/76529

12:43 robnik: Hi. Is there a way to use `for' to process 2+ sequences in parallel, like you can with `map'? So that you can do something like (for [a (range 2) b (range 2)] (list a b)) --> ((0 0) (1 1)) ?

12:43 keithb: hiredman: really? Even with the 2 parens at the bottom (where they probably shouldn't be)?

12:44 hiredman: keithb: really

12:46 keithb: hiredman: I appreciate your help. I count 4 open and 4 close parentheses. Do you see differently?

12:46 hiredman: keithb: I did not say your parens are unbalanced

12:46 keithb: hiredman: Oh, I see...

12:47 hiredman: Cark: how are you making your jar?

12:47 Cark: jar cmf mf-app.txt app.jar -C classes .

12:47 kotarak: Cark: did you actually compile the source file?

12:48 hiredman: kotarak: apperently java -cp foo.jar test.application works

12:48 Cark: yes it is in the jar

12:48 yes it does

12:48 kotarak: ah. Sorry. Didn't see this.

12:49 Cark: well i can use it this way, that's not such a big deal, still i hate it when i don't understand the problem =P

12:49 hiredman: try something like jar cevf test.application app.jar -C classes .

12:50 kotarak: Cark: did you include also the Clojure .class files in the jar?

12:50 hiredman: (get jar to auto-generate a manifest for you)

12:50 Cark: kotarak : they are there, in the right place

12:50 keithb: hiredman: Got it. Doh! Of course I needed to put parens around the overridden function. Thanks for your help.

12:50 Cark: hiredman : will try that now

12:54 hiredman : now it's working ... the only difference is the Class-Path declaration isn't there anymore

12:54 thanks !

12:55 hiredman: are you sure that is the only difference? is there an extra line at the end?

12:55 Cark: i checked that

12:55 hiredman: huh

12:56 anyway

12:56 It Works!

12:56 Cark: now i tried doing it manually, and no good ...

12:56 that's soem crazy sh*t

12:56 gnuvince: Hello everyone

12:56 Cark: hello gnuvince

12:57 gnuvince: Has anyone read "Calculus Made Easy" by Silvio Thompson and re-worked by Something Gardner?

12:58 hiredman: the only books I read are ones with spaceships on the cover

12:58 gnuvince: hiredman: you read that Forth book, eh?

12:58 hiredman: gnuvince: FICTIONAL spaceships

13:00 Cark: for the record ... i had a space character after test.application in the manual case ....

13:00 that's nuts

13:01 hiredman: *shrug*

13:02 Cark: some guy at sun must have thought : "you never know there might be a class file with a space at the end"

13:02 anyways thanks again hiredman

13:26 AWizzArd: Has there been some success to let Clojure apps run on mobile phones?

13:31 scottj: The feature in slime that highlights in the echo area parameter list what parameter you're currently editing doesn't work with clojure right? I just want to make sure I'm not missing out on this awesome feature because I have something misconfigured.

14:11 Lau_of_DK: Hello everybody

14:11 kotarak: Hi Lau

14:11 cgrand: Hi!

14:12 danlarkin: Heya!

14:15 sverrej: Is it possible to create java classes at runtime in Clojure, or do they have to be compiled first?

14:16 I tried to proxy Object, but it seems as with proxy one can only create methods that are defined in an interface.

14:16 leafw: sverrej: see doc gen-class

14:17 sverrej: leafw: Yes, I did, and there it seemed as if I have to do it compile time, with the extra hassle of setting the classpath.

14:17 leafw: IIRC, you can do it on the fly

14:18 kotarak: gen-class must be compiled

14:19 Chouser: leafw: that used to be the case, but gen-class does nothing now except when compiled.

14:19 AOT

14:19 sverrej: ok, and gen-class is the only way of making classes?

14:19 kotarak: sverrej: classes with new methods, yes.

14:20 sverrej: exactly

14:20 ok

14:20 Chouser: no, proxy makes classes, but there are constraints as you noted.

14:20 leafw: ok thanks Chouser

14:20 Lau_of_DK: sverrej: for adding methods and accessing protected fields, you need gen-class

14:20 If none of those apply, you SHOULD be fine with proxy

14:20 clojurebot: proxy?

14:20 clojurebot: proxy is <Chouser> proxy teases with its ease of use, then suddenly betrays.

14:20 Chouser: you can use gen-interface, AOT compile that, and then try out various implementations using proxy.

14:21 sverrej: Chouser: Yes, I will probably do something like that.

14:21 Lau_of_DK: Chouser: Example?

14:21 Chouser: Lau_of_DK: sverrej will cook one up for you. ;-)

14:21 sverrej: Is this because of limitations in the JVM, or is this a Clojure design choice?

14:21 Chouser: sverrej: a bit of both.

14:23 Lau_of_DK: Chouser: You've got a definate meanstreak

14:23 Chouser: My understanding is that the JVM puts various restrictions here and there about classloaders, classes can't be changed once their loaded, etc. that together made dealing with dynamically-defined classes error-prone.

14:23 Lau_of_DK: But I understand, if I was as cocky as you, I'd have the same :)

14:23 Chouser: So Clojure attempted to support that for a while, but no longer does.

14:24 mtz: Chouser: http://www.zeroturnaround.com/javarebel/

14:24 Chouser: I think the reason proxy is still allowed at runtime is that it takes so few parameters that actually effect how it bahaves -- essentially just the superclass and list of interfaces. This allows a single unique name for the class to be created, and there's no question of trying to change it later.

14:25 mtz: interesting. have you tried it with Clojure?

14:26 mtz: no. i just wanted to show that they somehow solved the class reloading problem.

14:28 pjstadig: ok so another terracotta issue

14:28 i got two repls connected to terracotta last night at 10:40pm

14:29 but it's really flakey and for some reason it was printing my repl prompt in one of the repls readably ("user=>" with the quotes)

14:29 now i can't get two connected again

14:30 i'm getting an NPE in PersistentHashMap

14:30 durka42: ,(binding [*print-dup* true] (println "user=>"))

14:30 clojurebot: "user=>"

14:30 durka42: ,(println "user=>")

14:30 clojurebot: user=>

14:30 pjstadig: i think it has to do with the fact that Classes are used occasionally as keys into PersistentHashMap

14:30 and Classes don't seem to have the same hashCode across VMs

14:31 at least while debugging i'm seeing clojure.lang.Var being compared to an existing node with the same key

14:32 and the hashes are different, so it attempts to split the leafnode and it dies with an NPE when trying to create a new node

14:32 Chouser: classes are used as hash keys for the print-method multimethod table

14:32 I had to work through some issues with that for ClojureScript.

14:32 pjstadig: yeah that's exactly where the problem is

14:33 it's trying to print the REPL prompt

14:33 it is trying to cache a value in the multimethod table

14:34 Chouser: any words of wisdom?

14:38 Chouser: hm... I had to write a JS version of clojure.lang.Util.hash() anyway, so I handled classes directly there.

14:38 pjstadig: ok

14:39 so i could rewrite clojure.lang.Util.hash()

14:39 Chouser: right. it was a natural solution for me. not sure if it makes sense in your scenario.

14:39 pjstadig: actually i think it makes sense

14:39 i'm gonna give it a whirl

14:40 i've already had to make some changes to Util.equals and introduce a Util.equiv because of the "object identity crisis" for java.lang.Boolean with TC

14:41 Chouser: ah, ok.

14:42 pjstadig: sorry

14:42 i meant introduce Util.same

14:42 i'm going to have a PhD in the innerworkings of Clojure after this :0

14:45 cool

14:45 i have REPLs

14:46 in one VM:

14:46 user=> (defn foo [] 42)

14:46 #'user/foo

14:46 user=>

14:46 In another:

14:46 "user=> "(foo)

14:46 42

14:46 "user=> "

14:47 Chouser: whoa.

14:47 pjstadig: it's weird that the one is printing the REPL prompt with quotes

14:47 because

14:47 "user=> "*print-dup*

14:47 false

14:47 "user=> "

14:47 there is obviously still a lot to do :)

14:48 i'm gonna try disconnecting/reconnecting and look for foo

14:49 cool

14:49 reconnected and foo still exists

14:50 kotarak: pjstadig: \o/ grats

14:50 pjstadig: thx

14:51 still very raw, but i should package this up and push it to github

14:54 jwinter: pjstadig: wow, that sounds v. cool.

15:34 Lau_of_DK: Compojure crew (Madison Square Clabango, chime in if relevant) - Is there anyway to persist an object in memory, which all clients to the website can access?

15:35 danlarkin: atom or a ref

15:35 Lau_of_DK: ref

15:35 its a massive struct, that I dont want to go to I/O for every time

15:42 rhickey_: pjstadig: congrats on TC progress!

15:44 danlarkin: Lau_of_DK: so what's the question, just have a ref like any other program

15:45 pjstadig: rhickey_: thx

15:45 Lau_of_DK: Yea - What Im thinking is, I can make a little Clojure app on the server, which acts as a local server, where you feed it your data and it returns the result of a look up it does on a hash-map it has in memory - But I'd be very happy to avoid this, if I could persist this structure in my webapp directly

15:46 pjstadig: once i sort out what can be part of the integration module and what probably needs to be patched in clojure

15:46 should i just open tickets?

15:47 rhickey_: pjstadig: no, you should post on the group what your issues are/were and let me think about how best to accommodate TC, or start a Google Doc or something

15:47 danlarkin: Lau_of_DK: so why not just define a ref in some namespace and access it directly from your compojure functions

15:48 Lau_of_DK: That might be a way - Im just not sure what happends to compojure/jetty between clients

15:49 danlarkin: Have you tested this in Madison Square Clabango ?

15:50 pjstadig: k

15:50 danlarkin: Lau_of_DK: haven't tested it, but my intuition says it will work just fine

15:50 pjstadig: yeah i wasn't even thinking about code, but just tickets to explain the issues, but a google doc will work too

15:51 danlarkin: Lau_of_DK: as long as you use defonce, since the builtin runserver does code reloading

15:52 Lau_of_DK: oh, defonce... that might do the trick

16:01 danlarkin: Works well I think - Thanks for the tip

16:05 jwinter: Lau_of_DK: so defining a ref from one servlet makes it available to others?

16:06 Lau_of_DK: (defonce *data-set* (import-huge-data-set source))

16:06 Its read-only

16:06 But yes, this is available to all clients, like a ref would be I imagine

16:06 jwinter: cool, that's handy

16:07 Lau_of_DK: Very

16:07 Cutting out SQL and Disk I/O gains alot of speed

16:07 Im doing lookups on 1M lines in 200 msecs

16:08 danlarkin: Lau_of_DK: cool, glad it worked out

16:24 redalastor: What's the idiom already to simulate default values to functions?

16:25 Chouser: you can use either destructuring or multi-arity functions

16:25 (fn [a & [b c d]] ...) ; b c and d are optional, default to nil

16:26 (fn foo ([a] (foo a 2 3)) ([a b] (foo a b 3)) ([a b c] ...)) ; b and c are optional, default to 2 and 3 respectively

16:26 redalastor: That wouldn't do, I can either pass a, b, both or neither. I need a default value for both of them.

16:26 That would :)

16:27 Chouser: the second way is probably faster at runtime too

16:27 hiredman: ,((fn [{:keys a b :or {a 1 b 2}}] [a b]) {})

16:27 clojurebot: java.lang.ArrayIndexOutOfBoundsException: 5

16:27 kotarak: redalastor: you can use :keyword arguments and turn the arglist into a hash-map.

16:28 redalastor: see hiredman :)

16:28 hiredman: ,((fn [{:keys a b :or {a 1 b 2}}] [a b]) {:a 1})

16:28 clojurebot: java.lang.ArrayIndexOutOfBoundsException: 5

16:28 hiredman: bah

16:28 http://clojure.org/special_forms#let <-- estructuring

16:29 destructuring

16:29 ,((fn [{:keys [a b] :or {a 1 b 2}}] [a b]) {})

16:29 clojurebot: [1 2]

16:29 hiredman: ,((fn [{:keys [a b] :or {a 1 b 2}}] [a b]) {:a 3 :b 4})

16:29 clojurebot: [3 4]

16:29 kotarak: ,((fn [& args] (let [{:keys [a b] :or {a 1 b 2}} (apply hash-map args)] [a b]) :a 5)

16:29 clojurebot: EOF while reading

16:29 kotarak: ,((fn [& args] (let [{:keys [a b] :or {a 1 b 2}} (apply hash-map args)] [a b])) :a 5)

16:29 clojurebot: [5 2]

16:30 hiredman: ugh

16:53 AWizzArd: Does the JVM currently have a concurrent GC?

16:53 It seems Java 6 Update 14, which should appear in a few months, will have one, the G1: http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf

17:01 Lau_of_DK: When Im JavaC compiling isnt there a simple way to add all jars in a directory to classpath ? like javac -classpath ${/path/to/jars}/*.jar ?

17:02 AWizzArd: Lau_of_DK: I think most people wrote a script which will call javac with the right parameters

17:02 Lau_of_DK: can most people paste their scripts here? :)

17:02 StartsWithK: javac -classpath "basepath/*.jar" dosn't work?

17:03 Lau_of_DK: no

17:03 AWizzArd: Lau_of_DK: write a small Clojure program that runs in the shell

17:03 cp2: iirc you can specify a directory for it to search in

17:03 AWizzArd: Or alternatively you could use Enclojure. There you just need to press a green Play button.

17:04 Lau_of_DK: javac -classpath /home/lau/coding/lisp/clojure/libs/*.jar -d classes/ com/jme/bounding/*.java

17:04 javac: invalid flag: /home/lau/coding/lisp/clojure/libs/commons-io-1.4.jar

17:04 Usage: javac <options> <source files>


17:04 cp2: -sourcepath sourcepath Specify the source code path to search for class or interface definitions. As with the user class path, source path entries are separated by semicolons (;) and can be directories, JAR archives, or ZIP archives.

17:04 well

17:04 hm

17:04 i dont know if that will included already compiled stuffs

17:05 worth a try

17:05 Lau_of_DK: man I hate java compilation

17:05 I think I'll surrender and just use netbeans

17:05 cp2: yeah

17:05 javac is kinda lacking

17:05 on some useful features

17:06 you could write a short (dare i say) perl (or maybe bash) script to concat all jar files in whatever dir with :

17:06 StartsWithK: Lau_of_DK: javac -cp "lib/*" Test.java

17:06 cp2: so then you can java -cp `getstuff lib/` blah

17:06 StartsWithK: works for me

17:06 Lau_of_DK: I'd rather format my harddrive that you perl

17:06 cp2: lool

17:06 Lau_of_DK: s/you/use

17:07 StartsWithK: Windows?

17:07 StartsWithK: Lau_of_DK: linux

17:08 Lau_of_DK: k

17:08 doesnt work here

17:09 http://www.jmonkeyengine.com/wiki/doku.php?id=downloading_and_installing_jme_2

17:09 *sigh*

17:10 cp2: [will@microwave ~]$ javac -cp ".clojure/*" test.java

17:10 worked for me too

17:10 AWizzArd: with NetBeans it is really very easy.

17:10 cp2: Lau_of_DK: java -version

17:10 Lau_of_DK: cp2 its always these addons to jmonkey I cant get to compile

17:11 Theres something fundamental Im missing, and its not JMonkey

17:11 cp2: heh

17:11 Lau_of_DK: AH

17:11 cp2: what message(s) are you getting

17:11 class not found etc

17:11 Lau_of_DK: It might be the library path

17:11 StartsWithK: Lau_of_DK: Just tried it again and i'm sure it works http://pastebin.com/d2ab2b791

17:11 AWizzArd: In NetBeans you have a window in which you select all the .jar files which you want to use. When you press a button it will generate your own double clickable .jar file with everything you need.

17:11 cp2: library path is used for shared libraries, it will compile without it

17:11 infact im not sure if javac even has a -D flag

17:11 Lau_of_DK: Not according to the wiki

17:12 StartsWithK: you don't need library path for javac

17:12 its a runtime thing

17:12 cp2: yeah

17:13 StartsWithK: i just downloaded jme from zip on there google code site

17:13 and included jogl libs in my lib/ dir

17:14 it was easyest way to go

17:14 kefka: I've noticed a performance "bug" (perhaps not really) in clojure.set/intersection.

17:15 (clojure.set/intersection #{5} +large-set+) takes a long time, when it needn't,

17:15 but (filter +large-set+ #{5}) is essentially instantaneous (as it should be)

17:15 Lau_of_DK: I gotta get to bed - Thanks for looking into this with me guys

17:16 cp2: np

17:18 kefka: Ok: the obvious work-around is to use clojure.set/select.

17:19 ,(let +s+ (range 1000000) (time (clojure.set/intersection #{5} *s*)))

17:19 clojurebot: java.lang.IllegalArgumentException: let requires a vector for its binding

17:19 kefka: ,(let [+s+ (range 1000000)] (time (clojure.set/intersection #{5} *s*)))

17:19 clojurebot: java.lang.Exception: Unable to resolve symbol: *s* in this context

17:19 kefka: ,(let [+s+ (range 1000000)] (time (clojure.set/intersection #{5} +s+)))

17:19 clojurebot: #{}

17:19 "Elapsed time: 1.069 msecs"

17:20 kefka: ,(let [+s+ (set (range 1000000))] (time (clojure.set/intersection #{5} +s+)))

17:20 clojurebot: Execution Timed Out

17:20 kefka: ,(let [+s+ (set (range 1000000))] (time (clojure.set/select +s+ #{5})))

17:20 clojurebot: Execution Timed Out

17:20 kefka: ,(let [+s+ (set (range 100000))] (time (clojure.set/select +s+ #{5})))

17:20 clojurebot: #{5}

17:20 "Elapsed time: 0.759 msecs"

17:21 kefka: ,(let [+s+ (set (range 100000))] (time (clojure.set/intersection +s+ #{5})))

17:21 clojurebot: #{5}

17:21 "Elapsed time: 0.17 msecs"

17:21 kefka: ,(let [+s+ (set (range 100000))] (time (clojure.set/intersection #{5} +s+)))

17:21 clojurebot: #{5}

17:21 "Elapsed time: 0.161 msecs"

17:21 kefka: Odd. Select gets killed there. Has clojure.set/intersection recently been improved? I guess I need to update my checkout.

17:22 Chouser: kefka: http://groups.google.com/group/clojure/browse_thread/thread/29609929e94f279c

17:23 http://code.google.com/p/clojure/issues/detail?id=52 fixed Feb 22

17:26 kefka: Chouser: Cool. Thanks.

17:29 keithb: All: I've got a question. In the code at http://gist.github.com/74602, shouldn't I be able to define a fn in a let clause, and then use it subsequently? What am I doing wrong?

17:31 Chouser: do you say (label-panel) later?

17:32 anyway, nothing is jumping out at me there. perhaps pasting a small runnable example would help.

17:32 keithb: Chouser: Yes, sorry, here's the whole function: http://gist.github.com/74604

17:34 Chouser: I was hoping for the package name of GridLayout so I didn't have to go look it up. :-)

17:34 java.awt.GridLayout

17:34 keithb: Chouser: Sorry, it's java.awt, and JPanel is javax.swing. Forgot to include them...

17:36 Chouser: Ok, what the heck, I'm not going to win the Nobel Prize for it, so here's the whole file posted: http://gist.github.com/74606

17:36 Chouser: and it's still not runnable, because call functions not shown there.

17:36 :-) ok

17:36 other than pasting the whole thing, you could trim it down to the few lines actually causing the error.

17:37 you might find you can spot it on your own then as well.

17:37 keithb: Chouser: I've been doing that for quite a while now ... ;)

17:37 Chouser: ok

17:38 keithb: First I used #( notation, and thought that was the problem, so changed to fn.

17:38 Chouser: keithb: you know how to examine the stack trace?

17:39 hiredman: are you sure it is that function that is cause the exception

17:39 keithb: Chouser: Yes, I've worked with Java for many years, but this one goes into the Clojure compiler code, and not my code, so I don't understand it very well.

17:39 wait...

17:40 hiredman: are you working at the repl with this? my guess is you def'ed that function without the . after JPanel

17:40 Chouser: stray paren

17:40 line 134

17:41 hiredman: oh

17:41 jave: hello

17:41 keithb: Chouser: hiredman Holy #@$#$! Thank you, and sorry to waste your time...

17:41 jave: why doesnt the following snippet work? (.getPackages (proxy [ClassLoader] [] (getPackages [] (.. this getParent getPackages ))))

17:42 Chouser: keithb: also worth noting that the real error wasn't in any of the earlier pastes. :-)

17:42 hiredman: jave: that crashed my jvm

17:42 jave: oh :|

17:43 hiredman: ~jdoc ClassLoader

17:43 Chouser: jave: you can't add methods using proxy

17:43 hm.

17:43 jave: ive read that, but dont quite understand

17:43 keithb: Chouser: Sorry about that. it turns out that I wasn't aware that it was a nested exception and the real cause was further down the stack trace. Now I understand why you asked about the stack trace. So I was indeed looking in the wrong place. Lesson learned. Hopefully will remember next time. ;)

17:43 Chouser: I though you could override protected methods, though.

17:44 keithb: not a problem. happy to help.

17:44 jave: Chouser: yes the docs do say you can overide protected methods

17:45 Chouser: oh, it wants a string arg

17:46 nope, sorry, misread.

17:46 oh, but you can't call the protected method of the Parent classloader.

17:46 jave: ah hmm

17:47 that kind of killed my plan then :)

17:48 Chouser: hm, yes, I see you plan. a pity.

17:49 jave: (my plan involves making a backend for Emacs/CEDET using Clojure)

17:50 Chouser: oh

17:50 jave: a java backend, that is

17:54 scottj: The feature in slime with common lisp that highlights in the echo area parameter list what parameter you're currently editing doesn't work with clojure right? I just want to make sure I'm not missing out on this awesome feature because I have something misconfigured.

17:57 ayrnieu: scottj - if you see the echo'd parameters but don't see one highlighted, then the feature isn't supported.

18:23 keithb: All, is there a way to have a function's documentation string extend to more than 1 line?

18:24 ayrnieu: just extend it to more than one line.

18:24 Chouser: literal newlines are allowed in strings

18:25 keithb: Thanks.

18:29 Am I correct in understanding that use of proxy creates a new (sub)class? Is a new class added to the system each time it's called?

18:39 hiredman: keithb: nope

18:39 keithb: hiredman: No to both?

18:39 hiredman: ~jdoc java.lang.reflect.Proxy

18:42 keithb: thanks.

18:43 where can i find documentation for the clojurebot commands? They're really cool...

18:43 hiredman: uh, well, you see, they are not really documented

18:43 clojurebot: where are you?

18:43 clojurebot: http://github.com/hiredman/clojurebot/tree/master

18:44 hiredman: I sort of started down that direction in the README

18:44 but have not made it very far

18:45 Chouser: Clojure's proxy does not create a java.lang.reflect.Proxy

18:45 hiredman: oh

18:45 my mistake

18:45 ~def proxy

18:45 Chouser: easy one to make. :-/

18:45 hiredman: so it does do teh subclass thing?

18:46 how embarressing

18:46 Chouser: keithb: the first time a set of superclasses is given the proxy macro, it creates a new class at macro-expand time.

18:47 then at runtime, every time proxy is called a new instance of that class is created.

18:47 Cark: .

18:47 hum that was my cat speaking

18:47 keithb: Chouser: Very cool. I imagine then that performance for that "real" class is faster than it would be for a Java proxy class?

18:48 Cark: so why the limitations about protected members ?

18:48 Chouser: Cark: I don't know.

18:49 Cark: i'll have a look tomorrow

18:49 Chouser: hm, perhaps because the body of the given methods aren't really inside the class at all

18:50 rhickey_: Cark: the methods defined in proxy classes are stubs that call out to real fns, which have no relationship to the superclass and thus no protected access

18:50 Chouser: the methods in the class generated by 'proxy' all simply look up the approriate clojure fn in a map.

18:50 Cark: that makes sense

18:50 Chouser: such a pity

18:51 perhaps proxy could generate stubs for all the protected members

18:53 that'd be another set of use cases that could be handled by proxy that currently require gen-class

18:53 Cark: ah that might be usefull

18:54 though i didn't have such a need yet

18:55 keithb: ~def gen-class

19:11 Chouser: In Java, if you have class B that extends class A, can an instance of class B use a protected member of class A?

19:12 Raynes: I want to say yes.

19:13 Chouser: yeah, that's what I thought. I should experiment, but if so then simply creating a proxy subclass of B that exposes B's protected members will only solve part of the problem.

19:14 rhickey_: what's wrong with proxy-super?

19:15 Chouser: nothing at all

19:15 other than that it probably should be mentioned in the proxy docstring near "they have no other access...to super"

19:16 Raynes: People seem to not be able to prevent themselves from writing text editors in Clojure.

19:18 lisppaste8: rhickey pasted "new streams" at http://paste.lisp.org/display/76549

19:20 keithb: Chouser: Here's a table of Java access levels: http://is.gd/eJYt

19:22 * danlarkin fears core.clj stealing all the good function names

19:22 rhickey_: streamlined streams ^^, much happier with client code, still safe

19:23 still on the fence as far as unification, but will probably add as standalone, good interop with seqs. Just need a naming convention for the 'stream' version of a function

19:24 input welcome

19:26 gnuvince_: map~, filter~, reduce~: the ~ looks like a little ripple in the water of a stream

19:26 ;)

19:28 hiredman: ,(let [a~ 1] a~)

19:28 clojurebot: Unmatched delimiter: )

19:28 hiredman: not so much

19:29 gnuvince_: oh yeah

19:29 Anyway, it wasn't a very serious suggestion.

19:46 Chouser: rhickey_: that's a lot prettier.

19:47 rhickey_: Chouser: yeah, I moved all the boilerplate into Stream itself, also simpler model

19:48 lisppaste8: rhickey annotated #76549 "new streams, some stateful ones" at http://paste.lisp.org/display/76549#1

19:48 rhickey_: model is now just supply fn of item, can process, skip or eos, also considering expand

19:49 same single pipeline model, got rid of detach

19:53 Chouser: ok. I can't say I understand the use cases sufficiently to know when it would have been useful.

19:53 by standalone you mean in a non-core namespace, or something else?

19:58 rhickey_: Chouser: I mean separately-named functions vs. changing map et al to streams

19:59 clojurebot: svn rev 1326; interim checkin, incorporating new stream model

20:00 rhickey_: 1326 doesn't have any clj code yet, but the examples in the paste work for those that want to experiment

20:10 redalastor: Is there a better way to remove a value from a vector than using two subvec?

20:18 cmvkk_: hmm, is there a document somewhere about what these streams do and what sort of functionality they provide?

20:19 Chouser: would you then pour those two subvecs into a another vector?

20:24 ayrnieu: ,([:a :b :c] 1)

20:24 clojurebot: :b

20:25 ayrnieu: oh, you mean the other 'remove'.

20:29 redalastor: Yeah as Python would do if I pop()ed an item out of a list.

20:30 ayrnieu: (let [v [:a :b :c]] (vec (map v (filter #(not (= % 1)) (range (count v)))))) ;; best possible solution.

20:30 redalastor: Is there a reason why dissoc doesn't work on vectors since assoc does?

20:32 rhickey: redalastor: what would it do?

20:34 redalastor: rhickey: (dissoc [:a :b :c] 1) would yield [:a :c]

20:34 rhickey: redalastor: changing the indexes of all the following items?

20:34 redalastor: Yes

20:35 rhickey: I don't think so

20:35 dissoc removes a key, not possible with vectors

20:36 redalastor: I see, makes sense.

20:36 rhickey: e.g. removing an item still leaves its index, re-indexes the following, that's not diccoc

20:36 disspc

20:36 dissoc

20:36 :)

20:37 redalastor: I guess there's no "insert" function that pushes the indexes to the right either?

20:38 rhickey: redalastor: nope, can't be done efficiently, maybe with a data structure like finger trees

20:40 jhawk28_: are vectors array based?

20:42 ayrnieu: http://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/

21:20 rhickey: cmvkk_: these docs reflect some of the new logic, note not everything is up in svn yet: http://clojure.org/streams

21:21 cmvkk_: aha, thanks, that's exactly what i was looking for.

21:24 i'm working on a framework right now that generates PCM data by chaining closures together; i think this sort of thing might really be useful for that.

21:34 jhawk28_: does anyone know what an arity is?

21:34 cmvkk_: the number of arguments a function takes.

21:58 keithb: Q: I have a vector of Java objects, and want to call instance methods on them that have side effects. What is the simplest way for me to do this? I know I can use map, but it's lazy and I'd have to force it.

21:58 cmvkk_: doseq?

21:59 keithb: cmvkk_: Ah, thanks.

21:59 Chouser: cmvkk_: try again, with more confidence this time.

21:59 hiredman: ~def doseq

22:00 keithb: Chouser: He probably couldn't believe I didn't know that. ;)

22:00 cmvkk_: i hate to sound like an authority on what the simplest way to do something is.

22:01 keithb: cmvkk_: On the contrary, that's the best kind of authority there is. :)

22:18 ~def in-ns

23:28 blbrown: ,(+ 1 1)

23:28 clojurebot: 2

23:28 Chouser: surprised?

23:29 Raynes: Surprised?

23:29 (- 1 2)

23:29 clojurebot: -1

23:29 Raynes: That surprised me when I first started in Clojure.

23:29 Funky LISP syntax.

23:29 <3

23:30 Chouser: (infix 2 - 1)

23:30 blbrown: Chouser, hehe, just checking if the bot is alive

23:30 -clojurebot/#clojure actually I was trying to see what this meant

23:30 Chouser: http://paste.lisp.org/display/75230 -- infix

23:30 Raynes: ,(infix 2 - 1)

23:30 clojurebot: java.lang.Exception: Unable to resolve symbol: infix in this context

23:30 Raynes: That would have felt dirty anyways.

23:32 blbrown: I guess I should add save to the text editor. hmm

23:33 dcnstrct: do clojure maps impliment java.util.Map ? anyone know ?

23:33 Chouser: dcnstrct: they do

23:33 ayrnieu: ,(ancestors (class {}))

23:33 clojurebot: #{java.io.Serializable java.lang.Iterable clojure.lang.IObj clojure.lang.Obj clojure.lang.IPersistentCollection clojure.lang.Counted clojure.lang.Seqable java.util.Map clojure.lang.IMeta clojure.lang.AFn java.lang.Runnable clojure.lang.Associative java.util.concurrent.Callable clojure.lang.IPersistentMap clojure.lang.IFn java.lang.Object clojure.lang.APersistentMap}

23:34 dcnstrct: awesome, thnx

23:34 Chouser: ,(instance? java.util.Map {})

23:34 clojurebot: true

23:35 Chouser: for almost 5 months now

23:36 hiredman: ,(pl (partial map inc) $ range $ 3)

23:36 clojurebot: java.lang.Exception: Remove at top

23:36 hiredman: damn

23:37 blbrown: that is a NOTICE

23:38 blbrown: hiredman, did you just implement that

23:38 I guess it is for the svn updtaes

23:38 hiredman: nope

23:38 cmvkk: it does it for ~doc responses too. why?

23:38 hiredman: svn stuff it uses a normal message

23:38 blbrown: hiredman, I have a plan to out do your bot with my own clojure bot. Just wait till this weekend and we will have bot wars

23:38 Raynes: How do you pronounce Fibonacci?

23:39 hiredman: "Fib"

23:39 Raynes: Smartass. ._.

23:39 blbrown: FIBBBB--- O - NACHI ?

23:40 cmvkk: wow, i always thought it had an R in it, like fibronacci. why did I think that?

23:40 Raynes: I was pronouncing it Fib o' nawssy.

23:41 hiredman: chee

23:42 cmvkk: i still want to know why you use notices for ~doc

23:42 Chouser: the lie of the third reich. fib o' nazi

23:42 cmvkk: ohhh

23:44 hiredman: cmvkk: I am willing to entertain arguments that it should be otherwaise

23:45 cmvkk: unavailable, since i don't really understand the difference between a notice and a message anyway.

23:45 oh well!

23:45 hiredman: ~google IRC NOTICE

23:45 clojurebot: First, out of 256000 results is:

23:45 blbrown: ~doc

23:45 clojurebot: A Short IRC Primer

23:45 http://www.irchelp.org/irchelp/ircprimer.html

23:45 gitdoc is http://github.com/Lau-of-DK/gitdoc/tree/master

23:52 sverrej: ~def gen-and-load-class

23:52 gen-and-load-class is removed, or?

23:53 hiredman: yes

23:53 sverrej: Expected that, ok. Thanks.

23:54 Still haven't managed to swallow the fact that it's not possible to create new classes dynamically. Like proxy without an interface.

Logging service provided by n01se.net