#clojure log - Jul 03 2010

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

0:00 Bahman: Hi all!

0:06 hiredman: ,(->> "foo" class .getMethods (map #(.getName %)))

0:06 clojurebot: ("hashCode" "compareTo" "compareTo" "indexOf" "indexOf" "indexOf" "indexOf" "equals" "toString" "length" "isEmpty" "charAt" "codePointAt" "codePointBefore" "codePointCount" "offsetByCodePoints" "getChars" "getBytes" "getBytes" "getBytes" "getBytes" "contentEquals" "contentEquals" "equalsIgnoreCase" "compareToIgnoreCase" "regionMatches" "regionMatches" "startsWith" "startsWith" "endsWith" "lastIndexOf" "lastIndexOf" "lastIn

0:10 herdrick: tomoj: according to this: http://github.com/technomancy/leiningen/blob/master/sample.project.clj

0:10 you add :jvm-opts "-Xmx1g"

0:10 to your defproject

0:11 (well, with whatever value you want after -Xmx of course

0:11 )

0:12 though I'm not getting any satisfaction from it.

0:12 maybe this is some Incanter issue

0:12 because even with the default heap size there should be plenty of room

0:12 aedon: Does anyone here use emacs viper-mode to edit clojure? I can't get it to automatically switch to viper-mode when I edit clojure files.

0:13 herdrick: i'm only got a 3 by 1000 incanter matrix

0:13 of Doubles

0:13 so, what, 25k of data

0:14 and multiplying it by it's transpose is what blows with the OutOfMemoryError

0:14 (mmult (trans three-by-1000) three-by-1000)

0:14 looks like liebke: isn't here

0:18 tomoj: isn't the jvm started by the lein shell script?

0:18 hiredman: it is

0:18 tomoj: so how could project.clj affect the jvm opts used?

0:19 hiredman: you can also just set JVM_OPTS or JAVA_OPTS or whatever

0:19 tomoj: unless the shell script parses it.. which would be weird

0:19 herdrick: hiredman: ok, thanks

0:19 hiredman: a) it totally could

0:19 b) lein used to launch a new jvm

0:19 c) I don't think it ever does now

0:20 tomoj: so :jvm-opts is useless, right?

0:20 hiredman: no idea

0:20 ^-

0:25 technomancy: no, it's not useless

0:25 it's actively harmful

0:25 wtf.

0:26 I took it as a patch from someone, and they were like, OK; thanks for applying this

0:26 but I never tried it for myself.

0:35 mudge: hello

0:35 newbie question

0:35 I have a Java application loading up a clojure program that I wrote, but when the Java application tries to load my clojure program, this error comes up: Could not locate clojure/core__init.class or clojure/core.clj on classpath:

0:35 at clojure.lang.RT.<clinit>(RT.java:295)

0:36 technomancy: tomoj: lein does fork a subprocess for the project's JVM, but I'm not sure if the CLI options are fixed at that point.

0:38 mudge: anyone know what I should do?

0:41 hiredman: mudge: make sure clojure/core.clj is on the classpath

0:44 mudge: what's the difference between a class loader and a classpath?

0:49 technomancy: mudge: a classloader is a Java mechanism to load class files from disk or another source into memory; a classpath is the locations that are searched for those files.

0:49 mudge: technomancy: awesome, thanks

1:05 technomancy: if someone's having problems AOT-compiling namespaces in a certain order, it means they're leaving out calls to require, right?

1:08 wow... interesting that this Clojure course in India is being offered for free.

10:50 ev4l: anyone here had trouble installing swank-clojure via ELPA?

10:58 Bahman: ev4l: Compilation errors are fine.

11:05 ev4l: Bahman: right, but it seems the package isn't marked as installed after opening the package list after an emacs restart =/

11:06 Bahman: ev4l: I had the same issue...

11:06 and it was because I marked more than one package to install.

11:06 Just did it one package at a time and it went all well.

11:07 Hope it helps.

11:10 ev4l: Bahman: thx!

11:11 Bahman: ev4l: Did you managed to install it?

11:13 kodis: How do I access a static method from a local class? I imagine this is a simple thing to do, but can't make it work.

11:14 ev4l: Bahman: It seems that when i mark swank-clojure for installation it tries to re-install deps like clojure mode (that's already installed)

11:14 raek: kodis: local?

11:14 Bahman: ev4l: Ah, yes! That's a headache.

11:14 raek: static methods are use like this: (Class/method args...)

11:14 Bahman: I deleted .emacs.d/ and started afresh.

11:14 ev4l: Bahman: will attempt a cleanup

11:15 Bahman: Just mark the package you do want...it will calculate the deps but can't re-install them.

11:15 kodis: raek: Just a simple java class file in my current working directory.

11:15 raek: you have to either import the class or use it's full name

11:15 what classpath did you start clojure with?

11:16 or, how did you start clojure?

11:17 kodis: raek: with a -cp of '.', and still no joy: only 'No such namespace:' or java.lang.ClassNotFoundException:

11:17 clojure was started with 'java -cp . -jar /usr/share/java/clojure.jar'

11:18 raek: classes in the default package is handled specially by the JVM, but I don't know of that's the issue here

11:19 if you type the name of the class in the repl, you get a ClassNotFoundException?

11:21 also, is the class compiled?

11:21 kodis: With a class of 'J' containing a static method of 'j', '(J/j)' throws 'java.lang.Exception: No such namespace: J', while '(J)' throws 'java.lang.Exception: Unable to resolve symbol: J in this context'

11:22 raek: have you compiled the .java file into a .class file?

11:22 clojure can only use compiled classes

11:23 kodis: Yes, both J.java and the resulting J.class are in my current working directory.

11:23 raek: ok

11:23 can you make a folder named, say, "foo" and put the .class file in there

11:24 then try enetering "foo.J" into the repl

11:25 kodis: user=> foo.J

11:25 java.lang.ClassNotFoundException: foo.J (NO_SOURCE_FILE:0)

11:25 raek: hrm, maybe the -jat options throws away the -cp args

11:26 try "java -cp '.:/usr/share/java/clojure.jar' clojure.main"

11:26 (use semicolon instead of a colon if you are on windows)

11:26 *the -jar option

11:27 kodis: Well, at least that produces a different error:

11:27 user=> foo.J

11:27 java.lang.NoClassDefFoundError: foo/J (wrong name: J) (NO_SOURCE_FILE:0)

11:28 raek: ah, try adding "package foo;" in the .java file

11:28 now the class is in the foo package

11:29 (the directry structure has to match)

11:29 if this works, you could try to revert all the "foo" stuff

11:29 it was probably just the classpath that was the problem

11:31 kodis: Progress! foo/J still throws an exception, but an import now works!

11:32 raek: and typing foo.J returns foo.J?

11:32 if so, clojure can at least find the class

11:33 kodis: Solved! foo.J returns foo.J, and (J/j) evals to 42 as expected. Thanks for walking me through this.

11:34 I'm surprised that it's not a bit more straight forward. It seems that classes can't be imported, only packages. Can that be correct?

11:35 raek: "importing" is just a matter of not having to type the full name of the class

11:36 so, after running (import 'java.util.contrib.BlockingQueue), one can use the name BlockingQueue

11:36 instead of having to type java.util.contrib.BlockingQueue every time

11:37 I think it should work to have the class file in the root directory, remove the package line from the .java file and use the class under the name J

11:37 since "J" would be its full name then

11:38 but classes in the "default package" (those without a package prefix) are handled specially by the JVM

11:38 i'm not aware of the details, just that "usage of the default package is discouraged"

11:39 kodis: Raek: Yes, that's what I thought, but I still don't see how to access a class without a package.

11:39 raek: wait a sec, and I'll try something

11:40 kodis: Yes, I can see how failing to work would provide some discouragement!

11:41 raek: "You can’t use classes in the default package from a named package."

11:41 right.

11:42 here's the issue on StackOverflow: http://stackoverflow.com/questions/283816/how-to-access-java-classes-in-the-default-package

11:42 kodis: Ah, okay -- unfortunate, but at least now I can stop trying to get that to work and just put the code in a proper package to begin with.

11:44 raek: yes, putting everything in a directory named as the project will do

11:47 kodis: raek, you mean 'in a project named...', right? Just moving the class file into the foo directory doesn't seem sufficient.

11:48 raek: i meant that if your project is called, say, myproj all files (including the .clj files) should be in myproj/

11:49 java classes has to be declared to be in the package using the "package xx.yy.zz;" statement

11:49 aedon: kodis: there's really no magic here. if you have a directory named 'x' and you put that dir in the classpath, then files in the default package should go in x, files in the foo package should go in x/foo and files in the foo.bar.baz package should go in x/foo/bar/baz

11:50 raek: clojure files should have namespace declarations reflecting the directory structure: (ns myproj.main)

11:51 if you have a file with the path myproj/main.clj

11:52 http://clojure.org/libs

11:55 kodis: Right, so the usual java name mappings are still in effect. It still seems that the 'package foo;' line is required though -- just a bare Class won't do.

11:57 raek: yes, the package declaration must match the directory structure too

11:57 you could say that clojure namespaces and java packages are the same thing

11:57 at least when considering the classpath

11:58 kodis: Yup. Organizing classes into packages seems like it's the best practice anyway.

12:00 It's a bit surprising that I can't directly access a simple, unpackaged class, but I guess I understand the rational.

13:16 LauJensen: Good morning (UGT) :)

14:07 cais2002: good night every one

16:04 cmcclell: quick question

16:05 What is the best syntax highlighting offered in emacs23/linux? clojure-mode only seems to highlight known fns. User defined macros/fns do not get highlighted at all

16:08 LauJensen: cmcclell: Most, if not all, use Clojure-mode, but you can add something like idle-highlight (IIRC the name correctly) if you want more highlighting

16:08 technomancy should have the details :)

16:09 cmcclell: thanks. For some reason, aquamacs + clojure-mode seems to do more (like highlight macros, even user defined ones, in green). Not sure why ubuntu + emacs23 seems to do less

16:11 hiredman: it depends on the color scheme you use, and if you are using console emacs, your TERM

16:13 LauJensen: There are actually 2 colors themes out there, by etate whos a Clojurian.

16:23 arohner: what's the best way to tell which dependency causes lein to download an artifact?

16:23 lein pom && mvn dependency:tree appears to be lying to me

16:29 ah. It appears lein exclusions aren't transitive

16:33 neotyk: Hi, is it possible to compile java with new lein?

16:34 arohner: neotyk: I haven't tried this, but it might be useful: http://github.com/antoniogarrote/lein-javac

16:34 raek: there is this, but I haven't tried it myself: http://github.com/antoniogarrote/lein-javac

16:34 whoa

16:34 neotyk: I have tried it :(

16:36 lein doesn't find compile-java

16:40 the-kenny: Why isn't clojure.contrib.graph/lazy-walk checking if n is in the set of nodes? I just experienced some very strange behaviour when passing a node not in the nodes-set.

16:48 technomancy: cmcclell: I can't remember ever making clojure-mode highlight user-defined macros.

16:48 neotyk: did you add lein-javac as a :dev-dependency instead of a regular dependency?

16:48 and run "lein deps" after adding it?

16:48 neotyk: technomancy: yes

16:49 both

16:49 technomancy: neotyk: hmm; possibly a bug in the plugin then; I haven't used it myself.

16:49 neotyk: technomancy: not true, didn't run lein deps

16:49 technomancy: aha

16:50 * technomancy hums "Take on me" for some reason.

16:52 neotyk: technomancy: now it compiles

16:52 technomancy: cools

16:52 neotyk: is there a hook to make compile-java be executed with compile?

16:53 technomancy: neotyk: hooks are a pretty new feature; I don't know if lein-javac has been updated to use them yet.

16:54 neotyk: I want to update it, but don't know how to use a hook

16:56 technomancy: neotyk: you would need to add robert-hooke as a dependency to lein-javac and add a leiningen.hooks.javac namespace that calls add-hook to wrap #'leiningen.compile/compile

16:56 more details here: http://github.com/technomancy/robert-hooke

16:56 if you have trouble go ahead and ask on the leiningen mailing list; I'm taking off for a while.

16:56 neotyk: technomancy: great, will give it a try, thanks

16:56 arohner: is there any metadata on an AOT classfile that identifies which version it was compiled with?

16:57 I've got that stupid java.lang.NoSuchMethodError: clojure.lang.RestFn.(I)V error, and I want to make it easier to identify

17:56 thunk: Compojure noob question: When I reevaluate a defroutes form, jetty doesn't serve the modified form. How do I get the repl development cycle going with compojure?

17:56 * thunk asked in #compojure, but thinks they're asleep.

18:02 thunk: nm, stuarth set me straight.

18:14 itistoday: what is the purpose of :as in destructuring?

18:14 here's an example from The Joy of Clojure: (loop [[part & parts :as work] work]

18:15 if they already have 'work'.... why are they doing :as work?

18:16 hiredman: itistoday: what is the point of a loop?

18:17 if you rewrote the loop as a function, how would it look?

18:17 itistoday: one sec... let me take a screenshot

18:17 hiredman:

18:17 why?

18:17 clojurebot: why not?

18:17 itistoday: or are you already answering my question

18:17 hiredman: clojurebot: buzz off

18:18 clojurebot: No entiendo

18:18 hiredman: itistoday: I am asking you a question

18:18 itistoday: hiredman: it's sometimes hard to tell with you :-p

18:18 hiredman: itistoday: what is the purpose of loop?

18:18 itistoday: to provide a point to jump back into for recur?

18:19 hiredman: so when writing binding forms for a loop you have to keep in mind the recur

18:20 if you don't rebind work in the loop's binding form it will always be bound to value it had outside of the loop

18:21 itistoday: hiredman: oh ok, i see, i thought that wouldn't happen, that work would be bound to the modified version...

18:21 hiredman: (fn [{part & parts :as work}] ...)

18:21 why would it?

18:21 itistoday: no, rather: (fn [{part & parts] work] .. )

18:21 hiredman: er

18:21 nope

18:22 (fn [[part & parts :as work]] ...)

18:22 itistoday: (ok, messed up on the closing bracket)

18:22 oh ok

18:22 i see, you're redefning loop as a function

18:22 hiredman: 15:25 < hiredman> if you rewrote the loop as a function, how would it look?

18:23 itistoday: heh

18:23 ok well i'm still shaky on all the syntax

18:23 it hasn't become second nature yet

18:23 hiredman: the point is parameter names are rebound to new values for each call

18:23 just like loop bindings are rebound for each iteration

18:24 itistoday: ok, i see, it's because the 'work' on the right is only "listened to" once

18:24 on the first call

18:24 from then on it's as if it wasn't there and loop were a function definition

18:24 hiredman: more or less

18:24 mudge: hello

18:25 hiredman: the binding form at the top of a loop is for establishing the initial bindings for the first iteration

18:25 itistoday: right

18:25 mudge: I am using :methods in the gen-class function, how do I specify a method signature that returns void?

18:25 itistoday: it should stick this time hopefully :-p thanks hiredman

18:26 mudge: i've seen other people ask that question, and i think the answer was don't worry about it

18:26 mudge: (i could be wrong, but just try it and see if it works)

18:27 mudge: itistoday: thanks, what am I supposed to try?

18:28 itistoday: mudge: i don't know. :-) I thought you might. :-p

18:28 technomancy: mudge: just return nil

18:28 mudge: can't put nil inside :methods

18:28 I just tried this: :methods [[appleFun [] void]]

18:28 and that worked

18:29 so using void as the return type in :methods worked

18:29 technomancy: any other JoC reviewers here? I think I was missed on the latest review round email.

18:30 itistoday: technomancy: you mean the link to the latest copy?

18:30 mudge: this is pretty sweet, I'm using a class generated with clojure inside my java code

18:30 technomancy: itistoday: I have it; I'm just wondering when the reviews are supposed to be in.

18:31 itistoday: technomancy: ah, yeah i'm probably not a reviewer then cause i don't know what you're talking about :-p

18:32 technomancy: happen to have any guess on when the next chapter's going to be out?

18:32 i'm wondering whether i'll get to it before it comes out or not...

18:33 technomancy: itistoday: I think the final review rounds were 3 or 4 weeks ago, but I don't know beyond that.

18:34 itistoday: k

18:39 mudge: is JoC pretty good?

18:42 technomancy: it's very good.

18:42 but not terribly introductory.

18:42 itistoday: how does the lazy-seq macro work?

18:43 i don't get this: (list 'new 'clojure.lang.LazySeq (list* '^{:once true} fn* [] body))

18:43 err, i should be more specific

18:43 i don't get: '^{:once true}

18:43 hiredman: don't worry about it

18:43 itistoday: hehe

18:44 ,'^{:once true}

18:44 clojurebot: EOF while reading

18:44 technomancy: it's a hint to the compiler that the function's body should be cached and not re-run.

18:44 hiredman: the implementation is not something you need to worry about

18:44 technomancy: pretty low-level obscure stuff.

18:44 hiredman: you just want to know what ^ is?

18:44 itistoday: hiredman: i know i don't *need* to.

18:45 yeah

18:45 and what's the deal with the quote

18:45 i read that as: "don't evaluate something"

18:45 hiredman: itistoday: http://clojure.org/reader

18:46 itistoday: ok, so "don't evaluate some metadata"?

18:46 (i'm guessing that in 1.2 ^{} is #^{})

18:46 technomancy: the quote is a no-op there as far as I can tell

18:46 since the thing that's quoted is a literal anyway

18:46 itistoday: yes

18:47 hiredman: technomancy: well, it quotes the fn form

18:47 technomancy: hiredman: ooooh... the reader passes the quote on... interesting.

18:48 hiredman: right

18:48 quote is a reader macro

18:48 technomancy: that's almost an operator precedence issue

18:48 hiredman: the reader only deals with transforming it to a s-exp

18:48 it is

18:48 itistoday: ok, so it's not quoting the metadata

18:48 but what follows it?

18:49 hiredman: right

18:49 itistoday: i see

18:49 hiredman: the reader attaches that metadata to the symbol fn*

18:49 and then you get (quote fn*)

18:49 itistoday: so my understanding of this thing has gone from completely opaque to the transparency of those glass blocks people put as walls in their bathrooms

18:50 thanks though, i'll save it for another day

18:50 it's just a really weird way of doing laziness

18:50 *lazyness

18:50 (i think)

18:50 streams in scheme are understandable to me, this is still magic :-p

18:51 hiredman: not reallyy

18:51 it jsut generates a thunk

18:51 and the thunk generates the first part of the lazy-seq

18:51 the next part has it's own thunk

18:52 etc etc

18:57 itistoday: ok, i might understand it now after looking at LazySeq.java, at least it's become a bit more clear

18:58 btw, is it inefficient to setup try/catch blocks in java?

18:58 i know that's a java question, not a clojure question... but they're currently closely tied together so maybe someone here knows the answer

18:58 i just see them all over the place and i thought they were inefficient

19:03 ooo, looks like this is the answer: http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop

19:03 seems like they're really cheap, ... err.. don't affect performance at all unless something goes wrong

19:08 i really have to thank rich for getting rid of that # in 1.2's syntax.

19:26 what is that part of speech where a word represents a larger whole?

19:27 like America representing the government or something?

19:28 #languagearts was empty :-p

19:33 bortreb: Synecdoche -- like saying "the pen of the president" to refer to his power or some law that was made

19:37 itistoday: bortreb: thanks! you know that word was bouncing around in my head, i should've looked it up, something's obviously wrong with me. :-p

19:39 i'm glad i finally got to use that word: "The Government" is also not an individual entity with a single consciousness that's out to get you. It's a synecdoche that refers to a large group of _elected_ officials. If there's something wrong, the entire country shares the blame.

19:54 bortreb: yep Synecdoche drives our computers crazy... it's so hard to figure out what it refers to in NLP.

19:56 itistoday: bortreb: cool!

19:57 bortreb: anything i can google that you're working on?

19:58 thunk: Unrelatedly: "Synecdoche, New York" was an amazing movie

20:10 bortreb: isittoday: http://groups.csail.mit.edu/genesis/

20:12 , (+ 1 2)

20:12 clojurebot: 3

20:20 itistoday: bortreb: cool, thanks for the link! looking at the video now

20:24 bortreb: have you looked at jmonkeyengine? java3d is really out of date

20:26 bortreb: (admittedly that probably doesn't matter for your purposes :-p)

20:32 bortreb: I'm actually working on porting Jake2 to clojure so we can use that environment as a hime for the AIs

20:39 itistoday: bortreb: why not use jME?

20:41 bortreb: never heard of it?

20:42 itistoday: have you used it for stuff in the past? is it awesome?

20:42 itistoday: bortreb: yes. it is awesome, and actively being developed, and has a large community.

20:43 bortreb: it's really the best 3d java engine that i know of

20:44 bortreb: and unlike jake2, it's not outdated. ;-)

20:48 bortreb: itistoday: that's really cool. I looked at goldsrc but I wanted to go with something simple that I could use with java. I missed jmonkeyengine

20:50 itistoday: know any clojure related projects using this / a good starting point?

20:50 itistoday: bortreb: google the two

20:51 bortreb: i personally don't, but google showed some stuff

20:51 bortreb: like this: http://nakkaya.com/2010/05/25/jmonkeyengine-hello-world-in-clojure/

21:00 technomancy|away: why? http://paste.pocoo.org/show/233242/

21:28 technomancy: itistoday: sounds like the plugin may not be designed to work with that leiningen version

21:28 ping dnolen; he wrote it

21:29 itistoday: technomancy: thanks, how do i ping him?

21:29 you mean contact him when he's online?

21:29 (using the rc2 btw of lein)

21:35 dabd: is it possible launch a standalone swank server (i.e., one that is not

21:35 associated to a leiningen project) and connect to it with

21:35 slime-connect?

21:36 itistoday: technomancy: now lein won't uberjar: http://paste.pocoo.org/show/233244/

21:36 technomancy: and it deletes everything in the lib/ folder

21:37 thunk: dabd: (swank/start-repl)

21:37 w/ optional port argument

21:38 dabd: thunk: swank/start-repl is a clojure function right?

21:40 thunk: dabd: Correct. swank-clojure has to be on your classpath, and you have to (use :swank) or equivalent.

21:42 mudge: I noticed that when clojure.jar is not on the class path, this error occurs: java.lang.NoClassDefFoundError: clojure/lang/IFn

21:42 dabd: my current setup does not allow me to start a repl from emacs. I can start a swank server with 'lein swank' and then slime-connect from emacs.

21:43 mudge: I have a problem where I have an application written in Java that uses a class compiled from clojure that give an error that clojure core is not on the classpath

21:43 it seems to recognize that clojure.jar is on the classpath though

21:44 it seems to recognize clojure code, just not stuff that uses clojure core

21:45 hiredman: do you have clojure.jar on the classpath?

21:45 mudge: yes, i think it is because it is not giving me this error which occurs when clojure.jar is not on the classpath: java.lang.NoClassDefFoundError: clojure/lang/IFn

21:46 so i think clojure.jar is on the classpath, and is being recognized by java

21:46 hiredman: why not just look at the classpath?

21:46 what is on the classpath?

21:48 mudge: I can't see it for sure because my clojure code is loaded by an external Java application that I don't have access to

21:53 hiredman: mudge: if you don't know, then you can't fix

21:55 mudge: but I do know I am changing the classpath and I am pretty sure that clojure.jar is on the classpath

21:55 because I can change the configuration so that the java.lang.NoClassDefFoundError: clojure/lang/IFn error occurs

21:55 and then add in clojure.jar and that error goes away

21:56 and instead I get a clojare core error, that clojure core cannot be found on the classpath

21:56 so, is it possible that clojure.jar can be on the classpath without clojure core being on the classpath?

21:57 clojure core is in clojure.jar so it doesn't make sense to me

21:57 does clojure have its own class loader?

22:02 this is the exact error I'm getting: java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath

22:02 clojure.jar is on the classpath though

22:04 i'm thinking that my problem is similar to the problem here: http://stackoverflow.com/questions/2352242/how-can-i-embed-clojure-in-an-rcp-application

22:15 anyone seen this error: Could not locate clojure/core__init.class or clojure/core.clj on classpath

22:15 clojure.jar is in the classpath

22:17 itistoday: mudge: how are you running and what are you running?

22:20 mudge: I generate java classes from my clojure source code, which is one file, and put it in a jar. Then my jar and clojure.jar are sent to an external java application that tries to run my clojure code and spits out that error

22:20 my clojure program is a 3rd party module for an existing java program that uses java webstart

22:21 itistoday: mudge: you mean it tries to load them at runtime?

22:22 mudge: yes

22:22 itistoday: mudge: ah, well, i have zero experience with that, sorry, can't help :-\

22:23 mudge: okay, thanks for your willingness

22:24 itistoday: np

22:33 bortreb: mudge: in the worst case, you might consider unjaring all the clojure files from clojure.jar and repackaging them in your own jar

23:32 unlink: Are macros vogue for designing event-driven API libraries?

23:33 (defhandler client (event-one [x y z] blah) (event-two [] ...))

23:53 Bahman: Hi all!

Logging service provided by n01se.net