#clojure log - Jun 17 2008

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

2:22 jcrites: what class should I run to run a file rather than epl?

4:48 StartsWithK: how would I do multimethod dispatch based on type?

5:11 cgrand: jcrites: clojure.lang.SCript

5:13 StartsWithK: if you want to dispatch on parent class or interfaces, you can't

5:18 StartsWithK: hi

5:20 well i am not sure do i need this at all

5:20 but i think i would like to dispatch on [float float float] or [double double double]

5:20 or something like that

5:21 is something like that posible?

5:22 cgrand: [float float float] => your mutimethods take 3 args and they are all floats?

5:22 StartsWithK: (defmulti fun (fn [x y] [(class x) (class y)]))

5:22 something like that

5:23 is something like that right way to do it?

5:23 cgrand: it could work as long as you are dispatching on the actual type

5:24 StartsWithK: is there maybe some better way to do it?

5:24 cgrand: none that I'm aware of

5:26 StartsWithK: i was planing to wrap parts of jogl, and for instance there are vertex[234][fdis..] functions

5:26 and i would like to have just one vertex function in my code

5:27 is this smart way to go about it?

5:27 cgrand: hmm I'm afraid that wrapping with multimethods is going to kill perfs

5:27 StartsWithK: i think so to

5:28 but maybe it won't be that bad

5:28 its just i cant think of any other way to do it at all

5:29 cgrand: macro or inline may be a better way

5:30 StartsWithK: well if i use macro or definline for (defn color [r g b a] (. gl (glColor4? r g b a))

5:31 so ? has to be i, f, d..

5:31 i guess i could declare them all floats :)

5:32 cgrand: you're right: macro or inline won't cut (my OpenGL is getting old)

5:33 StartsWithK: i blame jogl for having two places with type info for its arguments

5:53 cgrand: a java helper class can allow you to get rid of the type suffixes, allowing you to use inlines (and the helper class methods would get inlined at runtime) but it requires writing some java :-(

6:42 StartsWithK: colud i generate them with genclass?

6:42 i didn't look to much into genclass lib but it soudls like it could be used for something like this

8:45 asbjxrn: rhickey, Hi, there was a commute question here yesterday about how it differs from eg. alter.

8:45 rhickey: alter is a read-modify-write operation, so if another transaction does the same, one will roll back...

8:46 asbjxrn: Am I right that if two sync blocks each do an alter on the same ref one (or both) ro....

8:46 rigt.

8:46 but commute does not roll back?

8:46 rhickey: commute presumes the fn is commutative, so applies the fn to the current value of the ref at commit time, if another transaction does the same, it just lines up to do so, no rollback

8:47 so transactions that just inc counters or unconditionally add to maps need not have read-modify-write characteristics

8:47 asbjxrn: Ok, but for that to be safe commute must be atomic, or am I wrong?

8:48 rhickey: it is atomic, part of transaction commit

8:49 asbjxrn: ? I thought a transaction commit only happened at the end of the sync?

8:50 rhickey: right, your transaction will see a value for commit while running that might not be the value at transaction end, i.e. the commute will be done twice, once on the transaction temp value and finally on the ref during commit

8:51 so it can proceed seeing a non-zero counter or a map containing the added value

8:51 all sets are done to transaction temps until commit

8:52 asbjxrn: What I mean, if I do a (commute foo fun1 23) and while fun1 is running I do a (commute foo fun2 23) and fun2 finishes updataing foo before fun1 finishes.

8:52 rhickey: these are separate transactions?

8:52 asbjxrn: yes.

8:52 rhickey: then they don't see each other

8:53 they will commit in an order and the commutes will happen in that order

8:53 asbjxrn: Yes, I think I understand now. Both are using the temp value seen at the start of the transaction...

8:53 rhickey: plus their own mods to it

8:53 including commutes

8:54 asbjxrn: Right, I was thinking one commute would update the ref in all the refs in all the transactions. Didn't occur to me that it could be postponed until the end of the transaction.

8:55 rhickey: nothing shared changes until commit

8:59 asbjxrn: Clojure really force me to think about variables in a different way from what I'm used to.

8:59 Takes some time to get all the concepts lined up in my mind.

9:05 rhickey: commute is definitely different, actually an old database thing called field calls:

9:05 http://books.google.com/books?id=S_yHERPRZScC&pg=PA431&lpg=PA431&dq=database+%22field+calls%22&source=web&ots=JJluVOMDxm&sig=Pw2OK3MnzamxuUcCNEBHuRuGY6c&hl=en&sa=X&oi=book_result&resnum=5&ct=result

9:07 asbjxrn: Heh, I wonder what your reference database looks like, you seem to throw links like that out all the time.

9:07 rhickey: :) that's a great book, highly recommended

9:09 cemerick: is anyone aware of anyone working on generating javadoc-esque documentation from clojure source?

9:09 Chouser: rhickey: thanks for explaining commute. I should have realized it was just deeper magic than I was allowing for.

9:09 rhickey: Chouser: sure, sorry I missed it yesterday, was in a rare (for me) meeting

9:10 cemerick: the API page of the docs is generated from the source

9:10 Chouser: rhickey: np. nothing urgent about it. I suppose I could have tried to read the source.

9:11 rhickey: Chouser: seems a shortcoming of the docs if it wasn't clear

9:11 Chouser: are the "for Java Programmers" slides up anywhere? Mind if I steal a few?

9:11 blackdog: would it be useful to have a javadocs thing with @author etc interpreted and xrefs? could be a good project

9:12 asbjxrn: I tried... But the (commute ref fun args) just became (commute fun args) :) I guess the magic was in the java source which really is magic to me.

9:13 blackdog: rhickey, or would that be better left to metadata?

9:14 rhickey: blackdog: metadata

9:14 blackdog: ok

9:14 cemerick: rhickey: Yeah, I figured. I'm turning around various documentation ideas. Perhaps it'd be more reasonable to generate javadoc stuff from gen-class output...

9:15 rhickey: gen-class could have more gen definitely, including Clojure stubs

9:15 blackdog: cemerick, the enclojure plugin for netbeans has code which generates it all in a tree for you

9:15 and it's a stand alone swing jpanel

9:16 cljNamespaceBrowser.clj

9:16 StartsWithK: rhickey, is something like this http://pastebin.com/d3b2658f6 a bad idea?

9:16 blackdog: if you run that you get most of what you're looking for

9:16 rhickey: Chouser: http://groups.google.com/group/clojure/web/clojureforjava.pdf

9:17 Chouser: thanks

9:18 blackdog: rhickey, have you defined standard meta tags then ? for author etc, or documented them so we all use the sasme

9:18 keys

9:19 Chouser: pretty tedious to tag every var in a file with the same author string

9:19 rhickey: blackdog: just by usage, if using your own, use a ns prefix.

9:19 blackdog: yes but for 3rd party tools

9:20 so docs could be cross referenced etc

9:20 rhickey: metadata for namespaces has been requested

9:20 Chouser: you could put file-level stuff in per-namespace map. foo/*meta* or something

9:20 rhickey: StartsWithK: what is your goal with that?

9:21 StartsWithK: i would like to wrap parts of jogl

9:21 so there woudn't be color3f color4f color3d color4d...

9:21 rhickey: ugh

9:21 StartsWithK: just one color, normal, vetex etc.. function

9:22 rhickey: they letters at the end are types?

9:22 StartsWithK: yes

9:22 rhickey: that is goofy for a Java lib

9:22 StartsWithK: function[number-of-args][arg-type]

9:22 asbjxrn: Standard openGL naming.

9:22 StartsWithK: yes, just wrapped opengl

9:22 rhickey: are the args of uniform type, e.g. 3 floats or 3 doubles?

9:22 StartsWithK: yes

9:23 rhickey: you can just dispatch on the type of the first then

9:23 save some overhead

9:23 StartsWithK: but you have color3f color3d and color4f color4d

9:24 rhickey: right, still arity overloaded

9:24 StartsWithK: yes :/

9:25 another suggestion was i write thin java wrapper to remove types from names..

9:25 rhickey: if you do that, you can combine it with definline or macros for optimal speed

9:26 StartsWithK: and i was looking at genclass to use it instead of java

9:26 but i can't figure out how it should be used

9:26 asbjxrn: If you're writing a wrapper for parts of openGL, would it be acceptable for you to just select one type and stick with that?

9:26 rhickey: genclass is not for from-scratch Java class implementation

9:27 it's for class/interface extension/implementation

9:27 pjb3: hey, the website looks great!

9:27 StartsWithK: asbjxrn, it would work i guess..

9:27 rhickey: else it would have to have all the cruft of Java, field types, access modifiers etc

9:27 StartsWithK: i see

9:27 rhickey: pjb3: thanks, my brother Tom did it

9:28 StartsWithK: then java + definline would work the best i guess

9:28 rhickey: StartsWithK: yes

9:28 StartsWithK: thanks

9:29 rhickey: StartsWithK: but what about asbjxrn's suggestion, just use one type?

9:31 StartsWithK: rhickey, i have something like that right now, but i call dem colorf colord and then i can just (def color colorf) if floats will be used

9:33 asbjxrn: I haven't used openGL enough to understand the tradeoffs between the different typed functions. Can you explain? (if it can be done in a concise manner.)

9:34 (kinda off-topic here, I guess.)

9:35 StartsWithK: i wish i could explain, but i just started with opengl, so just wanted to duplicante the api without messing something up with my assumptions

9:36 asbjxrn: Ok, never mind. I was just curious.

9:36 pjb3: Where is load-file defined?

9:37 rhickey: pjb3: RT.java

9:39 pjb3: rhickey: Why not in boot.clj?

9:40 asbjxrn: Sounds like you would be ok just going with floats: "OpenGL uses floats internally, an using anything other than the single-precision floating-point functions adds a performance bottleneck because the values are converted to floats anyhow before being processed by OpenGL"

9:40 rhickey: pjb3: what would load boot.clj?

9:40 asbjxrn: Makes you wonder why they added the other typed functions..

9:40 yrb: asbjxrn: I belive it comes from the "performance" crowd, memory space vs precision trade offs mainly

9:40 pjb3: ah

9:41 I knew there would be a good reason :)

9:41 asbjxrn: That quote is from OpenGL SuperBible. (I had a plan of learning openGL once..)

9:43 yrb: asbjxrn: I am porting a couple of the examles and doing a port of ants.clj, but man is jogl ugly

9:44 asbjxrn: looks like a c library but worse because they have shoehorned bits into classes

9:44 asbjxrn: Obviously StartsWithK is then responsible for making a edible wrapper.

9:45 StartsWithK: asbjxrn, thanks, so i guess ill just create it with floats only

9:47 yrb: I have ditched it all for maps of "floats" basically is my little wrapper

9:48 I don't think the way I am heading is going to preform all that well, but I am mainly aiming for it being good for toys

9:55 asbjxrn: Even toys might be hampered with bad performance. My graphic toy lib lags on my once top-of-the-line 667 Mhz powerbook if I'm not careful.

10:09 cemerick: would I be better off using building enclojure from svn head, instead of using the current public build?

10:41 StartsWithK: hg clone http://freehg.org/u/kresimir/neman/

10:42 you will need lib.clj from clojure-contrib

10:42 and there is simle-jogl that show how it will look one day :)

10:42 and jogl in classpath

10:56 yrb: looks good :)

10:56 A

10:57 StartsWithK: ill try to do rest soon, and if you wish just browse the source http://freehg.org/u/kresimir/neman/

10:58 yrb: have you looked at java3d

10:58 StartsWithK: yrb, how did you deal with arrays? i now get te same problem with vertex3v and vertex4v variations..

10:59 yrb, i did a little, but it looked to complicated

11:01 yrb: I used a small map for my vecs

11:05 using a map instead of a vector is very convenient

11:06 rhickey_: yrb: how so?

11:09 yrb: well if i call Vertex2 it just pulls out the :x and :y keys and can us the :or to provide defaults, so if you call Vertex3 with an map that only has :x, :y it can default :z

11:09 use*

11:10 rhickey_: ok

11:18 yrb: and the (:key map) syntax is very nice :)

11:19 rhickey_: yrb: if you are going to have a lot of those, consider using a StructMap

11:21 pjb3: Can you have a function that has keyword parameters?

11:22 so you can call it like (it :foo 1 :bar 2) or (it :bar 1 :bang 2)

11:22 yrb: I have a StructMap for points, what are the performance characteristics of additional keys like

11:23 rhickey_: yrb: like map's generally

11:24 pjb3: I take a rest arg (&) of key val key val..., then apply hash-

11:24 map to it and destructure in the body, e.g. see refer or gen-class.

11:24 pjb3: ok, that

11:24 's what I thought

11:43 drewr: rhickey_: I implemented a function similar to FILTER which takes a sequence and returns a lazy seq.

11:43 I found that the (when (seq coll) ...) form was needed to read in the seq lazily.

11:43 I don't understand why.

11:44 You're not storing the value of the SEQ call. How does it affect coll?

11:44 rhickey_: that's a test to see if there's anything to do

11:44 drewr: Yes, but without it, my function would blow the heap.

11:45 It would try to consume the whole coll.

11:45 rhickey_: want to paste it?

11:45 drewr: Sure.

11:46 lisppaste8: drewr pasted "LAZY-CONS in WHEN SEQ" at http://paste.lisp.org/display/62376

11:47 drewr: If I don't wrap the LAZY-CONS in that WHEN, the function works, but it tries to consume all the messages (at least, that's my perception because it runs out of heap space).

11:48 rhickey_: your fn is same as (partial map attach-message-details)

11:49 drewr: Thanks, I figured there was a built-in way to do something in the middle of the stream.

11:49 rhickey_: be careful testing on long inputs right in the repl, as your args are on the repl's stack (i.e. it keeps the head), unless you wrap with (let [] ...) or times

11:49 drewr: Hm. They're coming from a database.

11:50 I created a function which runs a query in batches and returns the rows as lazy stream.

11:50 rhickey_: when has nothing to do with the laziness, just tells you when you're done, maybe an infinite loop caused heap exhaustion?

11:51 i.e. without when, how will it stop?

11:51 drewr: I figured the seq coming in would let it know. :-)

11:51 That's probably what it was then.

11:52 I knew the SEQ didn't have side effects so I wasn't sure what was happening.

12:05 yrb: StartsWithK: Misread your question before...(too much api exposure) I have chosen not to really deal with arrays yet, since I didn't need them for the particle rendering I was going

12:11 StartsWithK: yrb, thats ok, i was just trying for a while to picture how i should do that :) i'll skip them too for now

12:11 yrb: There are 2040 constants for GL ...

12:11 2640*

12:14 StartsWithK: I thinking of moving over to j3d over jogl

12:16 StartsWithK: yrb, maybe you should check out http://www.jmonkeyengine.com/ too

12:17 i never used it, but it looks like it has everything j3d

12:20 yrb: hrmmm, I am mainly looking to do visualisation

12:22 though it looks very cool

12:24 man j3d still exposes you to the the whole blah{2,3,4}{d,f}

12:31 Javamonkey looks quite sane however

12:33 JMonkey Engine*

13:01 StartsWithK: I really like the pattern matching dispatch :)

14:44 Lau_of_DK: Is there any documentation on Swing Eventlistners vs. Clojure ?

14:47 mainPanel.addMouseListener(new java.awt.event.MouseAdapter() {

14:47 public void mouseClicked(java.awt.event.MouseEvent evt) {

14:47 onPanelClick(evt);

14:47 }

14:47 });

14:47 There curlies are throwing me a bit off, is there a clever way to implement this in Clojure ?

14:50 cgrand: proxy?

14:50 Lau_of_DK: I dont think that you proxy listners, Im not trying to override something like I would with Paint for instance

14:52 wait

14:52 I think you're right

14:52 cemerick: I think proxy is the way to go.

14:52 Lau_of_DK: lemme think this through

14:53 cemerick: Lau_of_DK: Note the "simple example gui application" here: http://en.wikibooks.org/wiki/Clojure_Programming

14:54 I think I saw a sample somewhere that used a macro that allowed you to pass a fn instead of explicitly using proxy, and the macro would line the fn up with the interface to be implemented

14:54 Of course that'd only work for an interface that has a single function.

14:55 Lau_of_DK: (def *panel* (doto

14:55 (JPanel. (MigLayout.))

14:55 (addmouseEventListener

14:55 (proxy [MouseAdapter] []

14:55 (on-click)))))

14:56 This works, but I need to ship some MouseArgs to MouseAdapter, but any args added causes an Unable to Resolve Symbol error... why? :)

14:59 I dont fully understand the syntax, but this works

14:59 (def *panel* (doto

14:59 (JPanel. (MigLayout.))

14:59 (addMouseListener

14:59 (proxy [MouseAdapter] []

14:59 (on-click [evt])))))

14:59 Nevertheless, it does not seem to fire (on-click) when I click the panel

15:04 cgrand: I presume you defined a on-click function and expect it to be called?

15:04 Lau_of_DK: yes sir

15:04 (defn on-click

15:04 [g]

15:04 (println "Click"))

15:05 cgrand: (mouseClicked [evt] (your) (code) (here)))))) instead of (on-click [evt])))))

15:07 Lau_of_DK: That compiles as well, but nothing is firing

15:11 cgrand, does it fire in your camp ?

15:24 cgrand: yes: (def f (javax.swing.JFrame.)) (.show f) (.addMouseListener f (proxy [java.awt.event.MouseAdapter] [] (mouseClicked [e] (println "Click") (flush))))

15:29 Lau_of_DK: That works, thanks alot cgrand

15:49 rhickey_: anyone got a regex that I can use to remove non-double newlines? For the generated API docs I'd like to get rid of single newlines so it flows better.

15:51 drewr: rhickey_: #"[^\n]\n[^\n]"

15:51 Or..

15:51 #"[^\n]\w*?\n\w*?[^\n]"

15:52 Perhaps. Depends on how predictable the input is.

15:52 * rhickey_ hates regex

15:53 Chouser: Java and emacs do regex very poorly, worse even than sed

15:53 drewr: You could do it with a DFA, but that would be a little overkill.

15:54 Chouser: #"(?<!\\n)\\n(?!\\n)"

15:54 but you want to remove them? re-seq does the opposite of what you want.

15:55 rhickey_: String.replaceAll ?

15:56 Chouser: hm, takes a String, not a Pattern.

15:57 rhickey_: docs for it say:

15:57 An invocation of this method of the form str.replaceAll(regex, repl) yields exactly the same result as the expression

15:57 Pattern.compile(regex).matcher(str).replaceAll(repl)

15:57 so I could do that

15:58 drewr: If the docs are generated, why not fix whatever's generating the single newlines?

15:58 rhickey_: the newlines work in the source, and for the doc function

15:58 drewr: So you are munging the docstring as you output it.

15:59 rhickey_: yup

15:59 Chouser: yeah, that looks good: (.replaceAll (.matcher #"(?<!\\n)\\n(?!\\n)" text) "")

15:59 rhickey_: thanks all

15:59 Chouser: or drewr's regex of course would be fine too.

16:03 drewr: If I've got something long-running that I'd like to kick off, but still have control of my REPL, is the best technique to accomplish that manually creating a Java thread for the function to run in?

16:03 Chouser: you could use send-off

16:05 rhickey_: FYI, API page in docs now has anchors: http://clojure.org/API#map

16:05 drewr: Chouser: Ah yes, I remember that from ants.clj. Thanks.

16:05 rhickey_: Very nice. I like the new site a lot.

16:07 Chouser: rhickey_: thanks, that'll be useful.

16:08 partition won't generate a short list at the end. Is that intentional?

16:09 (partition 2 [1 2 3 4 5]) => ((1 2) (3 4)) not ((1 2) (3 4) (5))

16:09 rhickey_: yes, because it now takes steps as well

16:10 Chouser: ah!

16:11 rhickey_: user=> (partition 3 2 (range 10))

16:11 ((0 1 2) (2 3 4) (4 5 6) (6 7 8))

16:11 Chouser: yeah, I saw the step, but here's what I thought I wanted:

16:12 (map first (partition 2 (range 5))) from which I wanted (0 2 4)

16:13 but (map first (partition 1 2 (range 5))) gets it

16:13 (apply str (map first (partition 1 2 (re-split #"(?<!\\n)\\n(?!\\n)" text))))

16:13 heh. ok, anyway...

16:14 rhickey_: partition mimics Mathematica's partition, for these simple cases

16:15 (range 0 5 2)

16:15 Chouser: Oh, Mathematica! right!

16:15 hm, tone of voice doesn't carry very well over IRC.

16:16 rhickey_: Mathematica is very cool

16:16 Every programmer should see it, just as they should a good Common Lisp environment

16:17 see how the other half lives :)

16:18 Chouser: Back when I still did math more complicated than flubbed attempts to apply the Rule of Cosines (college, in other words), I took a run at Mathematica.

16:18 But it was a short run, and I lost. I don't think I had good use case.

16:18 rhickey_: it's really a Lisp, with great data visualization tools

16:20 Chouser: so -> is a port of //

16:20 rhickey_: I can't grok their syntax, so use long names

16:21 * rhickey_ only has Mathematica on his desktops so can't look it up now

16:21 Chouser: I don't know what I'm talking about. I just had a vague recollection of Mathematica being postfix.

16:21 Apparently I'm wrong in the general case, but it provides a//b as a form of b[a]

16:22 rhickey_: #(%1 %2) is Mathematica-esque, %& being my addition

16:22 Chouser: just like (-> a b) is (b a)

16:22 rhickey_: -> is most like Mathematica Thread, IIRC

16:24 * drewr hasn't used Mathematica since 1995!

16:28 Chouser: surely visualiztion functions could be dropped into clojure

16:29 rhickey_: I would hope so, given all the graphics options available to Java

16:33 Lau_of_DK: How is an Unsupported Operation Exception ?

16:33 How = What

16:34 (. *frame*

16:34 (addPropertyChangeListener

16:34 (proxy [PropertyChangeListener] []

16:34 (propertyChangeEvent [evt]

16:34 (println evt)))))

16:34 This for instance - Will throw one such

16:35 rhickey_: with proxies, chances are you are failing to implement a method that the consumer of the proxy calls

16:36 Lau_of_DK: k

16:37 yea, you're right rhickey, it expected propertyChange()

16:47 drewr: Where does *agent* come from in ants.clj?

16:47 It doesn't get defined anywhere, only used in SEND-OFF a couple times.

16:48 Chouser: It's bound to the current agent.

17:00 http://clojure-log.n01se.net/date/2008-04-05.html

17:04 drewr: Heh, thanks.

18:05 rhickey_: I've added experimental static member access classname/member, work for fields with no parens Math/PI, or static method invocations (Math/sqrt 42)

18:10 drewr: Sweet. Consistent with package naming.

18:11 rhickey_: feels right, so far

18:11 pjb3: Can you add jars to the classpath after the JVM has started?

18:12 rhickey_: pjb3: http://clojure.org/API#add-classpath

18:12 pjb3: excellent

18:12 rhickey_: but if it's something you'll use often, best to add it to your real classpath at some point

18:14 pjb3: Can you say "put all the jars in this directory" on the classpath, or you do you have to list them individually when you start the JVM?

18:28 drewr: lisppaste8: url

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

18:28 pjb3: When I do (add-classpath "file:///Users/pbarry/projects/clojure/mysql-connector-java-5.1.6.bin.jar")

18:28 then (.newInstance (.forName Class "com.mysql.jdbc.Driver"))

18:28 I get class not found

18:29 lisppaste8: drewr pasted "partial function with side effect" at http://paste.lisp.org/display/62396

18:30 drewr: rhickey_: I'm trying to interject a function in the middle of a stream to increment a ref, but it doesn't increment, and the messages don't come out the other side. Any thoughts?

18:35 rhickey_: pjb3: add-classpath won't work for JDBC drivers, which need to be visible to System Classloader

18:35 drewr: rhickey_: Actually, scratch that. Those functions seem to work. I think my problem lay elsewhere.

18:35 Although, is that invocation of PARTIAL what you had in mind earlier?

18:36 pjb3: rhickey_: Ok, so I have to specify those with -cp when I start the JVM?

18:37 drewr: No, I needed to return the message in INC-MESSAGE-COUNT.

18:37 rhickey_: drewr: no the partial call shouldn't include all args, and I don't think you need it here at all, make sure you force the evaluation of the lazy map call with doall or dorun

18:37 drewr: rhickey_: Can I keep it lazy as it passes through?

18:38 I don't want it to consume the seq. I need to chain more stuff to it.

18:58 OK, my PARTIAL solution works; I just have to make sure to return the object from the seq in my mapped function.

19:04 shizzy0: Hello

19:05 I'm getting familiar with Clojure, and I was curious about what the '#' means.

19:08 [Finds it.] Ok, so #'x means (var x). How similar is this to Common Lisp's use of #'function?

19:35 rhickey_: shizzy0: it means something totally different, as Clojure is a Lisp-1, and the use it almost the opposite, where in CL you'd use #' to get the function value, in Clojure you use #' to avoid getting the value, getting the containing var instead

21:03 mnestic: is there a chat log of #clojure anywhere?

21:07 Ycros: mnestic: I think there is because a google search of mine once hit one

21:10 mnestic: Ycros: ahh, found it

22:03 shizzy0: thanks, rhickey_ for the response (a few hours ago).

Logging service provided by n01se.net