#clojure log - Jan 11 2009

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

0:38 hiredman: 1d8

0:39 mfredrickson: hiredman: 6

0:39 you slay the elf

0:39 hiredman: 1d8

0:39 clojurebot: 6

0:40 mfredrickson: jinks!

0:51 arohner: 1d8

0:51 clojurebot: 3

0:54 hiredman: man, clojurebot totally needs to do markov chains generated from channel logs

1:34 vogelrn: 1d8

1:34 clojurebot: 8

1:34 vogelrn: 1d10

1:34 clojurebot: 6

1:34 vogelrn: 1d1000000000000000000000000000

1:34 hmmmm

1:34 unfortunate :P

1:38 hiredman: hmm

1:39 vogelrn: I was expecting intmax

1:39 not silence

2:44 hiredman: is there a prefered mimtype for clj files?

2:50 application/x-clojure it is

4:38 rryan: Hi -- does clojure have call/cc?

4:39 hiredman: nope

4:40 rryan: alright.. google didn't turn up anything useful so I assumed not. Any workaround? Any reason why?

4:44 kotarak: rryan: }:-) Why should it have call/cc?

4:45 rryan: :)

4:45 kotarak: rryan: I suspect that this is not easy to implement, things Clojure allows easy calls to Java.

4:45 s/things/since/

4:45 rryan: yea -- the more I think about it, it sounds hard

4:46 For fun, I was going to rewrite CONSPIRE (a scheme time sharing system) in clojure.

4:46 kotarak: You'll need either you own call stack or other means to implement it, which makes interop hard, or you have to do bad things like copying stack in C and such.... (Which I don't even know whether it's possible in Java or not)

4:46 rryan: and it relies pretty heavily on call/cc

4:49 kotarak: that's not the right thing I guess. ;) :conspire: a conspiracy theory generator, for the conspiracy theorist in a hurry

4:49 hiredman: rhickey has said on the google group that "Clojure is not going to provide continuations

4:49 any time soon"

4:50 rryan: gotcha

4:50 hiredman: but I don't see him giving a reason

4:50 but I would suspect that kotarak is right

6:17 asbjxrn: Is there a way of getting "unchecked-add" behaviour for floats?

6:19 Lau_of_DK: Good afternoon everyone =)

6:19 kotarak: Hi Lau.

6:43 asbjxrn: Tip: (+ (float 0.1) (float 0.1) (float 0.1)) is about 9 times slower than (+ (float 0.1) (+ (float 0.1) (float 0.1)))

6:57 Chousuke: the last float probably gets reboxed or something as IIRC + uses reduce for more than 2 arguments.

8:34 rfgpfeiffer: '#=(symbol "test symbol")

8:35 i think i found a bug

8:35 kotarak: symbol does not validate the string, in case that's what you want to say.

8:36 rfgpfeiffer: #=(keyword "key word")

8:36 this works as expexted

8:40 symbol just creates a symbol with the name "test symbol", the problem is somewhere else

8:43 (symbol "test symbol") works fine also

8:44 kotarak: It's somehow the combination of ' and #=.

8:44 Chouser: #= isn't meant to be used directly

8:45 rfgpfeiffer: it seems like symbols are parsed again after read time

8:48 Chousuke: calling symbol with arguments that would result in unreadable symbols is unsupported anyway, as far as I know

8:50 kotarak: I think it's on the issue list to implement validators.

8:50 Chousuke: yeah

8:53 I figured out the following: symbols must not contain whitespace, must not start with numbers , # or /; must not end with / (exception: just '/ is allowed), can't contain ', or the comma (since it's whitespace).

8:54 anything missing there? :/

8:54 kotarak: maybe ()? What does the reader do here: foo(+ 1 2)

8:54 Chousuke: symbols containing / among other valid characters are allowed but cause problems.

8:54 ah, true

8:55 also must not start with : since that's for keywords

8:56 keywords have similar rules but are a bit less restricted because they always start with :, so the "must not start with" rules can be ignored

8:57 rfgpfeiffer: what about ^, @,%, and ~?

9:01 rhickey: http:/clojure.org/reader says "Symbols begin with a non-numeric character and can contain alphanumeric characters and *, +, !, -, _, and ? "

9:01 http://clojure.org/reader

9:04 the problem with '#=(symbol "test symbol") is that it tries to embed the symbol with the name "test symbol" as a constant in the compiled code. Constants are stored readably, and symbols using just their print representation, so in restoring the constant one object is read in from the string "test symbol" is read, yielding the symbol test

9:05 rfgpfeiffer: okay

9:05 Chousuke: rhickey: can you clarify if / should be allowed in symbol names other than '/? Allowing it seems to cause problems. :/

9:08 rfgpfeiffer: perhaps (.toString (symbol "this symbol")) should return |this symbol|

9:08 Chousuke: (namespace 'a/a/b) returns a/a but a namespace like that won't work; even if you create it and def the b var, trying to evaluate a/a/b says that the namespace a/a does not exist

9:22 Lau_of_DK: (doc interleave)

9:22 clojurebot: Returns a lazy seq of the first item in each coll, then the second etc.; arglists ([& colls])

10:21 asbjxrn: So I've spent a good chunk of the weekend translating http://www.dgp.toronto.edu/people/stam/reality/Research/pdf/GDC03.pdf to Clojure. (Fluid dynamics for games.)

10:21 And I only get 1 frame/sec for a 100x100 grid...

10:22 Chousuke: :/

10:23 asbjxrn: Hardly convincing smoke effects at that pace.. (Very small movements from frame to frame as well.)

10:24 Chousuke: have you gotten rid of all reflection in your app already?

10:24 asbjxrn: Anyone feel like giving it a shot?

10:25 Chousuke: but that kind of stuff looks like it might be easier to use java to write the parts that need speed and then tie it all together with clojure.

10:25 asbjxrn: Not all. I'm not sure hot to get rid of the last parts. Tried using YourKit to figure out where the time went, but...

10:27 I agree. Not what I would expect Clojure to excel at, but I would have hoped it would be reasonably fast.

10:27 I'm also not using idiomatic clojure, I guess. I'm using java arrays for the data.

10:29 Chousuke: do you have the code on github or something?

10:29 karmazilla: idea: what if PersistentStructMap$Def implemented IFn and calling it would yield an instance of that struct with the parsed arguments as values?

10:31 Chousuke: karmazilla: you mean (defstruct foo ...) and then (foo ...) -> structmap?

10:31 asbjxrn: It's real ugly, do they have anonymous accounts? :)

10:32 Chousuke: asbjxrn: gist.github.com

10:32 karmazilla: Chousuke: yes

10:32 Chousuke: asbjxrn: the best pastebin I know :D

10:32 asbjxrn: because even the pastes are git repos

10:33 you can fork them and import their history into a real git project if the gist ends up growing into a real app

10:36 asbjxrn: It's a bit too late here now. I'm off to bed. I'll check it out tomorrow.

10:40 bOR_: how would you solve this? I've a regex matcher, and when I call (.find mymatcher) it will return true until it can no longer find any matches in the string, and then it starts returning false.

10:40 I want the number of trues.

10:40 take-while pred coll seemed nice, but warns me not to use a pred that has side-effects.

10:40 and I toyed a bit with trying to turn (.find mymatcher) into a lazy-cons

10:41 Chousuke: isn't there a re function that returns a seq of matches

10:41 call count on that.

10:41 bOR_: its not the standard java regex engine.

10:41 brics automaton.

10:42 (unless I misunderstood your answer)

10:44 Chousuke: ah. hmm

10:44 bOR_: ah.

10:44 got the lazy-cons to work

10:44 that seems to be it

10:44 (defn lazy-find

10:45 [matcher]

10:45 (lazy-cons (.find match) (lazy-find matcher)))

10:45 .

10:45 a take 10 on that works nicely

10:45 so now I might be able to tag on a (count (take-while true (lazy-find match)))

10:46 victory :)

10:46 achim_p: bOR_: you might be able to use repeatedly (count (take-while identity (repeatedly #(.find ...)))) - didn't test that though

10:47 bOR_: (take-while #(= true %) (lazy-find match)) did work

10:47 but violates the 'pred cant have side-effects rule though'

10:47 not sure how much I should worry about that.

10:47 I'll look at repeatedly.

10:48 achim_p: not sure about side-effects and take-while either, but repeatedly does allow them explicitly

10:48 bOR_: (take 10 (repeatedly (fn [] (.find match))))

10:48 noticed.

10:48 that works.

10:49 thanks!

10:49 getting tired. not sure if it works :)

10:49 but thanks for pointing out repeatedly.

10:50 asbjxrn: http://gist.github.com/45724 <- Ugly, slow, broken code.

10:52 achim_p: bOR_: you're welcome. just looked up the code for repeatedly - looks like a generalized version of lazy-find :)

10:53 bOR_: gracias.

10:53 man. I'll summarize the mess I went through on the forum one of these days :).

10:53 but it seems all is working out eventually.

10:54 (was working on a bottleneck in a simulation model in clojure)

10:58 achim_p: bOR_: thanks for pointing me to brics automaton, i've been looking for a regex engine with complement support!

10:59 bOR_: nice :).

11:00 what does complement mean in regard to regex engines?

11:00 saw that function, couldn't figure out what it did from the description?

11:01 I am using the union function though, which can merge my regexs before I let it getfinitestrings

11:01 (whenever I can't calculate getfinitestrings in an easier way)

11:02 achim_p: non-occurence of patterns - most regex engines can't express that

11:05 bOR_: ah. cool, so basically the opposite of the sequence space that can be presented.

11:05 hmm. opposite.. better is to say the rest of the sequence space.

11:11 achim_p: i knew their mona tool a little and that it was good in minimizing state machines, but wasn't aware there was a java regex implementation with that built in. pretty cool

12:43 jacky: Hi - I have a question about the threadlocal semantics of vars

12:43 (def k 10)

12:44 now, k is bound to the value 10.

12:44 (.start (Thread. (fn [] (def k 5)(println k)))) -- this should bound k to the value of 5 only within the thread.

12:44 hiredman: no

12:44 def is global

12:44 jacky: But when I check for the value of k in repl, it shows 5

12:44 kotarak: (doc binding)

12:44 clojurebot: binding => var-symbol init-expr Creates new bindings for the (already-existing) vars, with the supplied initial values, executes the exprs in an implicit do, then re-establishes the bindings that existed before.; arglists ([bindings & body])

12:45 jacky: I see.. The threadlocal semantics apply on if you use binding?

12:45 kotarak: And there is with-local-vars, but I never used that one up to now.

12:46 hiredman: (doc with-local-vars)

12:46 clojurebot: varbinding=> symbol init-expr Executes the exprs in a context in which the symbols are bound to vars with per-thread bindings to the init-exprs. The symbols refer to the var objects themselves, and must be accessed with var-get and var-set; arglists ([name-vals-vec & body])

12:48 jacky: so, to create a threadlocal binding, we should use binding

12:48 kotarak: binding worked very well for me up to now.

15:05 dreish: ,(#(identical? (rest %) (rest %)) [1 2 3])

15:05 clojurebot: false

15:10 hiredman: ,(#(identical? (rest %) (rest %)) (seq [1 2 3]))

15:10 hmmm

15:11 ,(#(identical? (rest %) (rest %)) (seq [1 2 3]))

15:11 clojurebot: false

15:13 eyeris: Using Maven2 Jetty plugin, where do I put my clojureql.jar file? I've tried specifying -Djetty.class.path="/full/path/to/clojureql.jar" but I still get a classnotfound exception.

15:14 (this is for use with Webjure, btw)

15:38 Chouser: ,(#(identical? (rest %) (rest %)) (map identity [1 2 3]))

15:38 clojurebot: true

15:42 danlarkin: So in an object-oriented language I would be saying like, you have to pass me an object here that has at least one of these 4 methods. Would a reasonable analog in clojure be saying you have to pass me a namespace that has one of these 4 functions named in a specific way?

15:43 or should I use gen-interface and make them use proxy

15:44 hiredman: pass me a hash that has at least one of these four keys

15:46 hoeck: danlarkin: or pass a function that does one of these 4 things

15:46 hiredman: hoeck: but how would you know which of the four the function does?

15:46 danlarkin: hoeck: well the 4 different functions get executed at different times... like pre_ and post_ hooks etc

15:47 Chouser: hash-map of functions?

15:47 hiredman: ^-

15:47 danlarkin: yeah, the hash of functions might be a good way

15:48 hiredman: and you can do all that fun hash destructuring

15:48 Chouser: that's essentially what irefs do now. (agent foo :validator fn)

15:49 I think passing a namespace would be pretty rough on both producer and consumer

15:49 clojure.zip uses a data object with several functions attached as metadata

15:53 danlarkin: yeah I think a good way to do this will be have them pass in a hashmap of functions, thanks hiredman and Chouser

15:56 lsantha: hello

15:57 I'm testing clojure on an experimenta java platform

15:58 and I noticed that the bytecode generated by clojure contains dead code which makes it fail in this env

15:59 is it possible to fix this problem? Where shold I post a bugreport?

16:03 Chouser: lsantha: post it to the google group

16:04 lsantha: ok, thanks

16:04 cpfr: hey how easy is it to use Clojure for mobile phone apps?

16:04 since i kinda hate coding in java

16:05 hiredman: s know

16:05 er

16:06 be the first to do it, and let us know

16:07 Chouser: cpfr: it's now working for applets and android, so you have a fighting chance at getting j2me working.

16:07 cpfr: Chouser, awesome!

16:08 hiredman, i barely know how to do it with java, but will do

16:40 lsantha: Chouser: I postgred it but not showing up, is waiting in a moderation queue?

16:41 * I posted it ...

16:41 Chouser: lsantha: yeah, if it's your first post, it'll be held (to prevent spam)

16:41 lsantha: ok

16:41 Chouser: which may work to your advantage, because it means rhickey will have to see it.

16:41 :-)

16:42 lsantha: :-)

16:43 I also tried a sort of a fix which fixed one part of the problem

16:43 maybe it's not so hard to fix it for the authors

16:44 and for mobile platforms such things maybe be important even if for Java SE they go unnoticed

16:44 rhickey: lsantha: what's JNode?

16:44 lsantha: it's an experimental OS written in Java

16:44 http://www.jnode.org/

16:46 rhickey: I think it should be tolerant of dead bytecode

16:46 lsantha: I think you are right

16:47 rhickey: Clojure definitely relies on the VMs to do last-mile optimization

16:48 lsantha: that's one place for fixing the bug, but also posted it to you just in case you are interested

16:50 rhickey: lsantha: thanks. If you want, you can create an issue for it so it won't get lost, bit not a top priority right now

17:06 Lau_of_DK: How do I debug a "No matching clause" ?

17:07 karmazilla: Chouser: textjure future?

17:07 Chouser: Lau_of_DK: that's from a condp?

17:07 Lau_of_DK: Chouser: No, its from my run macro, or somewhere after it

17:09 Chouser: Lau_of_DK: I think condp is the only form that throws that exception.

17:09 Lau_of_DK: Then you've answered my question, thanks CHous' :)

17:10 Chouser: karmazilla: hopefully textjure has more future than it does past.

17:11 rhickey: poll: Clojure supports CL-style nil-punning, how much would you miss it if it didn't?

17:11 Chouser: like (cons :foo nil) ?

17:11 and we'd have to say (cons :foo ()) instead?

17:11 rhickey: Chouser: no, like (if (rest x)...), using seqs fns as predicates etc

17:12 Lau_of_DK: rhickey: Counter-question: What would I gain if I lost nil-punning?

17:12 karmazilla: Chouser: hehe, that's a way to put it :) I fiddled with it a bit and sort of got it to save the one file you opened with it

17:12 rhickey: Lau_of_DK: one poll at a time :)

17:12 Lau_of_DK: hehe, alright

17:12 danlarkin: rhickey: so (rest [1]) would be what

17:12 Chouser: so we'd have to say (if (series? (rest x)) ...) instead?

17:12 rhickey: danlarkin: opaque, seq would work on it

17:12 Lau_of_DK: Then I cant answer due to lack of polls, I think I'd miss it

17:13 rhickey: Chouser: (if (seq (rest x)) ...)

17:14 hiredman: :(

17:14 rhickey: danlarkin: (seq (rest [1])) -> nil

17:14 Chouser: I suppose (rest x) would then evaluate to something true in cases where it currently is nil?

17:14 rhickey: Chouser: yep

17:15 Lau_of_DK: Now I know I'd miss it

17:15 hiredman: :(

17:15 danlarkin: yeah I'm -1

17:15 Chouser: I think that'd break a lot of my code.

17:15 rhickey: hiredman: no voting twice :)

17:16 hiredman: running a markov chain deal on the irc logs a channel where people paste code does not get you english output

17:16 Chousuke: rhickey: so what would this change enable?

17:16 rhickey: Chouser: one possibility, for rest, if for rest to be defined as (seq (tail x)) where tail is the new rest

17:16 Chouser: I suppose I could get used to it. "Public" api functions already have to use (seq x) generally to allow empty containers to work right...

17:16 rhickey: Chouser: exactly, mush code already does (seq coll)

17:17 much

17:17 There are basically two ways to support streams

17:18 first is bifurcation, a second set of all seq fns for streams, both can be generated from a single definition

17:18 since: (def map (comp seq map-stream))

17:19 second method is change to seq semantics, rest would return a logical coll, not an ISeq/nil

17:19 seq still returns ISeq/nil

17:19 first is the same

17:20 then seq/stream fns can return either seqs/streams or other things

17:20 one set of fns

17:20 the new seq model can support fully-lazy seqs, not possible now

17:20 Chouser: other functions might need 'seq' around them too, though, right? filter, map, etc. if you want to test for empty result.

17:20 rhickey: since Delay could implement Seqable, you could write seq fns returning delays

17:21 Chouser: yep

17:22 Chouser: especially without having a sense of what benefit I'd get from interacting directly with streams instead of seqs, the first way sounds better.

17:22 my existing code works, new code doesn't need more (seq ...) sprinkled everywhere, and I can use map-stream if I know I want it.

17:22 rhickey: stream versions of fns likely to be 2-4x faster

17:23 Lau_of_DK: hmmm :)

17:23 rhickey: if everyone chooses the stream verions all the time they'll have seq calls when needed anyway

17:23 Lau_of_DK: And there's no way to obtain that speed increase with this re-design ?

17:23 Chouser: clojure's already too fast for me.

17:23 rhickey: heh

17:24 Lau_of_DK: speed is due to essential difference between seqs and streams

17:24 this is just an api thing

17:24 Lau_of_DK: oh... I think thats a very heavy argument

17:24 rhickey: IO likely to be exposed only as streams

17:24 ditto queues

17:25 Lau_of_DK: I want to change my vote

17:25 rhickey: bifurcation: +compatible -no-full-lazy-seqs -two-verions-of-every-fn

17:26 unified model: -breaking +fully-lazy-seqs +more-elegant-api -no-punning

17:26 danlarkin: two versions of every fn should count as two minuses

17:27 but so should no punning, gah!

17:27 rhickey: danlarkin: there will be (defstream map ...) generating map and map*

17:27 Chouser: it's more than just compatible, it's also more succinct for any seq users, isn't it?

17:27 though rather less succinct for stream users.

17:28 "it" being bifurcation in both the above

17:28 karmazilla: could an ILogical interface make "empty seqs" become logical false, or is that going too far for too little?

17:28 Chouser: empty streams

17:28 rhickey: karmazilla: its not the interface, it's the eagerness of determining emptiness

17:29 Chouser: hmmm.

17:29 rhickey: nil punning is fundamentally in conflict with full laziness, and other indirections

17:29 karmazilla: ah, I see now

17:29 rhickey: I've come to conclude

17:29 much to my chagrin

17:29 Chouser: was my post incorrect that dug into exactly how existing seqs are already fully lazy?

17:30 rhickey: Chouser: which one?

17:31 the way I've implemented streams, you can chain them and then just seq the end, yielding great perf + easy consumption, caching etc

17:31 there is a one-time threadsafe transition of a stream into a seq

17:32 note I like nil punning quite a bit, as I did in CL, why I made it work in Clojure

17:34 and have pushed back against the even/odd laziness arguments, arguing for lazy-except-for-first being a reasonable compromise

17:34 Chouser: http://groups.google.com/group/clojure/msg/cfa89c8265a33f2c

17:34 rhickey: but it is interesting that the same thing is needed for both full laziness and stream/seq transparency

17:37 Chouser: right, so only first and rest can be lazy, but not the work needed to determine if there is a first, which often needs to get the first of some other seq

17:37 Chouser: basically, 'first' being lazy allows you to split the determination of "if there's more" from "what the next value"

17:43 rhickey: basically rest returning nil means at least some work (that required to determine if there is any more) cannot be lazy

17:44 danlarkin: that makes sense, makes me sad though :'(

17:45 rhickey: as Chouser's post indicated, it i not really a problem in practice very often. Certainly this change would not be justified by full-laziness only

17:47 if rest returned something opaque, it could be a Delay

17:47 Chouser: I'm still not quite following. The only work 'rest' ever has to do is determine if there's more. To find out what that more is, the also-lazy 'first' can then be computed. How much more split up can the work be?

17:49 rhickey: Chouser: (defn foo [] ... (rest x))

17:49 if the consumer never uses it, this does too much work

17:50 it's more where the split lies, but there are three distinct things: the seq itself, the first value, the rest value

17:50 right now the seq itself is always eager

17:50 if you could delay the seq, then most likely you would delay seq+first together, and rest

17:50 still two delays, but at different points

17:52 most seq fns would look like (defn aseqfn [] (delay #( ... (lazy-rest-only-cons x (cal-rest)))))

17:56 a simple example is drop, must do most of its work in all cases

17:57 and the work of producing the dropped items of the seq it's manipulating

17:57 not fully lazy

18:06 Chouser: you'd still force the 'first's in order to cache, even when just dropping, as LazyCons does now?

18:07 rhickey: Chouser: yes, seqs are still persistent

18:10 the difference is drop would do no work until you called seq/first on what it returned

18:24 Chouser: ok, the drop example helps me, thanks.

18:24 The cutover pain is going to be real, but I'm in favor of removing the wart that nil punning requires.

18:27 rhickey: Chouser: thanks for the considered feedback

18:30 I still haven't made a decision, one thing I'll be doing is an audit of the changes required by Clojure itself - I use a good bit of nil punning

18:30 also, there is a secondary issue regarding code that relies on the type of the return values of seq fns, like the compiler!

19:22 hmm... that conversation seemed to scare everyone off :)

19:22 Chousuke: heh

19:24 rhickey: while you're still here: http://code.google.com/p/clojure/issues/detail?id=41

19:26 rhickey: ok

19:56 knapr: how can I interact with C++ code from Clojure?

19:57 hiredman: jni?

19:57 knapr: im writing my own Matrix-lib for a huge-ass sparse matrix and I want to write the highlevel code in lisp not C++.

19:57 ok

19:57 Chousuke: hm

19:57 knapr: and how is the overhead? is it worth it?

19:58 or it will then be like i wrote it in Java?

19:58 Chousuke: do you need to write your own lib?

19:58 knapr: maybe I should use python instead?

19:58 Chousuke: I mean, there are java matrix libraries.

19:58 knapr: maybe I cant use the JVM

19:58 actually

19:58 i need special-purpose superpacked

19:59 Chousuke: but no, the overhead of JNI shouldn't be much more than what overhead generally is for such things.

19:59 I don't know for sure, but I've never heard of anyone complaining about JNI overhead :/

20:04 knapr: = java native interface?

20:06 luxanctus: I hear crickets chirping.

20:06 Was it me?

20:06 Welcome back.

20:09 Bye.

21:37 durka: is there any way

21:37 whoops

21:37 is there any way to have clojure attempt to eval some code without actually doing anything

21:38 in other words, i want the exceptions that would be thrown during load

21:38 danlarkin: (doc read)

21:38 clojurebot: Reads the next object from stream, which must be an instance of java.io.PushbackReader or some derivee. stream defaults to the current value of *in* .; arglists ([] [stream] [stream eof-error? eof-value] [stream eof-error? eof-value recursive?])

21:41 durka: but does that resolve symbols

21:41 danlarkin: yeah

21:41 there's a request for a non resolving reader, I'm pretty sure?

21:42 not sure what the priority is

21:43 Chouser: I don't think 'read' resolves symbols.

21:44 ,(namespace (read-string "filter"))

21:44 clojurebot: nil

21:46 durka: ,(read-string "(WildlyInvalidCode.)")

21:46 clojurebot: (WildlyInvalidCode.)

21:47 durka: but i would want an exception there

21:47 Chouser: ,(read-string "(invalid(syntax")

21:47 clojurebot: java.lang.RuntimeException: java.lang.Exception: EOF while reading

21:49 durka: i'm reading valid syntax but looking for unresolvable symbols

21:51 Chouser: (clojure.lang.Compiler/analyze clojure.lang.Compiler$C/STATEMENT (read-string "filter"))

21:54 ,(clojure.lang.Compiler/analyze clojure.lang.Compiler$C/STATEMENT (read-string "filter"))

21:54 clojurebot: #<VarExpr clojure.lang.Compiler$VarExpr@510dc2>

21:55 Chouser: ,(clojure.lang.Compiler/analyze clojure.lang.Compiler$C/STATEMENT (read-string "(java.util.Date.)"))

21:55 clojurebot: #<NewExpr clojure.lang.Compiler$NewExpr@1033450>

21:55 Chouser: ,(clojure.lang.Compiler/analyze clojure.lang.Compiler$C/STATEMENT (read-string "(java.util.Date. 55)"))

21:55 clojurebot: #<NewExpr clojure.lang.Compiler$NewExpr@5b6d00>

21:56 lisppaste8: durka pasted "looks like we have a winner" at http://paste.lisp.org/display/73458

21:59 Chouser: I don't know how stable that API will be, but ClojureScript uses it, so you've got a fighting chance.

22:04 durka: cool

22:04 thanks Chouser

22:06 Chouser: note that #=() expressions are evaluated. I haven't found any way that those are dangerous, but I'm not completely sure.

22:09 oh, scratch that. #=(java.lang.System/exit 0) does what it does.

22:11 clojurebot: feeling lucky?

22:11 clojurebot: I don't understand.

22:11 Chouser: ,#=(java.lang.System/exit 0)

22:11 clojurebot: still here?

22:11 clojurebot: It's greek to me.

22:12 Chouser: hm!

22:13 durka: evaluated but still subject to the JVM security policies, yes?

22:14 Chouser: I would assume so.

22:14 oh, you mean why clojurebot didn't kick it. yes, I'm sur eyou're right.

22:19 arohner: is the command line behavior of clojure.lang.Repl / clojure.lang.Main documented anywhere?

22:19 clojure.org is empty on that page

22:20 mmcgrana: (doc clojure.main/main)

22:20 clojurebot: Pardon?

22:21 mmcgrana: well yeah chech out the docs for clojure.main/main, either at the repl or in the main.clj source file

22:21 arohner: mmcgrana: thanks

22:21 mmcgrana: np

23:34 danlei: hi! i've got a problem running slime, everything is up to date, i haven't changed my configuration (which worked), but i'm getting "java.lang.NoClassDefFoundError: clojure/main" when i try to start slime. my classpath seems to be set correctly in .emacs though ... any ideas?

23:35 (if my whole configuration would help, i'll paste it at lisppaste)

23:36 durka: are you sure clojure is up to date?

23:36 danlei: well, i ran svn up a few minutes ago and mvn installed it

23:36 so ... yes

23:37 r1162

23:38 durka: aha

23:38 danlei: running via command line works fine

23:38 durka: are you using the google code repository

23:38 current revision is 1207

23:38 danlei: no, sourceforge

23:38 did that change?

23:38 durka: that is abandoned

23:38 yes

23:38 danlei: oh

23:38 thank you!

23:38 durka: http://code.google.com/p/clojure/

23:39 danlei: thanks

Logging service provided by n01se.net