0:04 JAS415: what are you looking to do?
0:05 hiredman: parse sublists out of a list
0:16 JAS415: ,(def positions)
0:16 clojurebot: DENIED
0:16 JAS415: ,clojure-contrib.seq-utils/positions
0:16 clojurebot: java.lang.ClassNotFoundException: clojure-contrib.seq-utils
0:17 JAS415: that's strange
0:17 hiredman: JAS415: clojure.contrib
0:21 JAS415: ah
0:25 hmm need to update my contrib
0:36 lisppaste8: JAS415 annotated #90883 "little updated" at http://
0:38 JAS415: is shorter anyway
0:57 qed: JAS415: nice
0:58 JAS415: efficiency or not, that is way cleaner
1:04 JAS415: yeah, clojure-contrib is both huge and awesome
2:58 technomancy: anyone else noticing ns metadata disappearing for AOT'd namespaces?
2:58 (except clojure.core, since it adds in metadata after the fact with alter-meta!)
3:22 kzar: How can I access the three values of something like this? #<Color java.awt.Color[r=255,g=255,b=255]>
3:24 hiredman: kzar: thats from the .toString method of Color
3:24 _ato: (.getRed color)
3:24 hiredman: I would call bean on it and see what you get
3:24 _ato: kzar: http://
3:26 kzar: cool beans, I like that bean command
3:26 thanks everyone
3:26 ,(:red (bean (new Color 250 251 252)))
3:26 clojurebot: java.lang.IllegalArgumentException: Unable to resolve classname: Color
3:30 kzar: so that page said there's a contructor that takes an alpha channel parameter, a float between 0 and 1. It is OK if I pass 0 or 1 but if I pass something like 0.2 I get an error "No matching ctor found for class java.awt.Color"
3:40 oh I think I see
3:41 sorry that was dumb, the constructor either took all floats or all ints, I tried to pass mostly ints but a float alpha channel. So there wasn't a matching constructor.. ctor stands for contructor
4:05 technomancy: browsing the github clojure projects... I am really curious what this one does: http://
4:06 _ato: ha, google translate says "Multi-swing for datakoda and fayloobmennikov local dsvload.net."
4:06 that's just as meaningless as the russian
4:08 kzar: seems to be a scraper downloader for some site "data.cod.ru"?
4:11 hiredman_: looks like some kind of client for http://
4:13 hiredman: clojurebot: translate from ru leica
4:13 clojurebot: leica
4:14 hiredman: clojurebot: translate from ru Лейка
4:14 clojurebot: Lake
4:14 hiredman: code be a pun
4:14 cod and lake
4:15 but I think cod are a salt water fish
4:15 could
4:22 Figs: Hi
4:24 I'm trying to do a bit of string processing work in clojure, but I'd rather like to keep my algorithms generic since I expect I will want to use them on lists at a later point; after I perform an operation like (drop 3 "hello"), I wind up with a result like (\l \o). How can I convert this back to a string from a lazyseq for printing or other use?
4:25 kzar: ,(apply str (drop 3 "hello"))
4:25 clojurebot: "lo"
4:26 Figs: Why does (apply str ...) give the correct result, but (str ...) does not?
4:26 Does it change the order of evaluation?
4:27 hiredman: because str on a single object just calls .toString on that object
4:27 ,(str '(\a \b \c))
4:27 clojurebot: "(\\a \\b \\c)"
4:27 twbray: Figs: apply de-listifies a list and feeds it to a function as args
4:27 hiredman: ,(.toString '(\a \b \c))
4:27 clojurebot: "(\\a \\b \\c)"
4:27 kzar: I think it's because it does something like (str (str \l) \o)
4:27 hiredman: nope
4:27 kzar: ok whoops
4:27 so what does it do?
4:28 hiredman: str on multiple objects uses a StringBuilder
4:28 ~def str
4:28 twbray: ,(str '("foo" "bar" "baz"))
4:28 clojurebot: "(\"foo\" \"bar\" \"baz\")"
4:28 twbray: ,(apply str '("foo" "bar" "baz"))
4:28 clojurebot: "foobarbaz"
4:29 hiredman: ,(.toString '("foo" "bar" "baz"))
4:29 clojurebot: "(\"foo\" \"bar\" \"baz\")"
4:30 kzar: so (apply str (drop 3 "hello")) is like doing (str \l \o) ?
4:30 _ato: yep
4:30 kzar: gotya ok
4:30 Figs: ,(str \l \o)
4:30 clojurebot: "lo"
4:30 Figs: ah, I see.
4:30 twbray: ,(. "hello" substr 3)
4:30 clojurebot: java.lang.IllegalArgumentException: No matching method found: substr for class java.lang.String
4:31 twbray: ,(. "hello" substring 3)
4:31 clojurebot: "lo"
4:31 hiredman: :(
4:31 (.substring "hello" 3)
4:32 twbray: hiredman: I prefer my flavor, but tastes vary.
4:32 hiredman: twbray: .substring is the prefered syntax
4:32 twbray: hiredman: Not disputing your right to prefer it :)
4:33 Figs: There's a parsec-like library for clojure, as I recall... does it handle processing lists as well as strings?
4:33 twbray: I'm coming from Java & Ruby, so I think like "foo".substring 3, that O-O stuff infects your brain after a while
4:34 Figs: I can't remember the name of it
4:35 Oh, nevermind. I found it. It's just called parser.
4:36 hiredman: twbray: the naked . syntax doesn't distinguish between static and instance methods
4:36 twbray: hiredman: Well, it's visually obvious
4:37 ,(. java.nio.charset.Charset forName "UTF-8")
4:37 clojurebot: #<UTF_8 UTF-8>
4:39 twbray: hiredman: I'm only a Clojure n00b, but as a person coming from javaland, the naked . gives me a mechanical pattern for transforming back & forth between Java & clojure calls with things being in the same order
4:40 so it feels comfy. But once again, I'm just getting started here.
4:44 hiredman: *sigh*
4:45 I don't understand how "I'm just getting started" is an acceptable response to "this is a better way to do it"
4:48 Figs: I'm having an extremely hard time in general debugging clojure programs and handling errors. What is the recommended way of dealing with exceptions and debugging with regards to clojure?
4:50 hiredman: don't do things that cause exceptions
4:50 if you do do something that might cause an exception, handle it as close to the possible source as possible
4:51 read the stack trace, it contains useful information
4:51 and be liberal with with the printlns
4:51 Figs: I need exceptions, or an exception-like mechanism for indicating parsing errors, and possibly trying different alternatives in certain cases.
4:52 _ato: keep your functions small and develop them interactively
4:52 hiredman: Figs: sounds like you want to use exceptions for flow control. :(
4:53 Figs: I would like a way to tell which parser failed.
4:53 Exceptions were the first thing that came to mind
4:53 maacl: hiredman: its a acceptable response when you answer newbie questions by knocking their non-ideomatic style instead of trying to help them with their actual problem
4:53 _ato: Figs: there's a couple of libraries in contrib for dealing with errors
4:53 http://
4:54 http://
4:55 hiredman: maacl: style helps other people read your code, and as a newbie, if you have a problem, you might want someone else to take a look at your code and be able to read it
4:56 Figs: The alternative to exceptions in my case would be to pass along an error result.
4:56 Or use a library, I think ;)
4:57 hiredman: is it actually an exceptional situation for a parsing strategy to fail?
4:58 Figs: Possibly, since more functions may be provided by a user later.
4:58 maacl: hiredman: sure style is important, but addressing the question first would be more helpful. Adding a "and btw you might want to consider..." after helping out would be much more effective
4:59 hiredman: putting style first is like trying to teach yoga breathing techniques to a drowning person
4:59 hiredman: *snort*
4:59 _ato: ,[)
4:59 clojurebot: Unmatched delimiter: )
4:59 _ato: ^ parse failure, exception
4:59 seems a reasonable usage to me
5:00 hiredman: _ato: but there is only one parser in this case
5:00 it sounds like he has multiple parsers and if one fails to fall over to another
5:01 putting style first is like requiring people use proper spelling before you review their english paper
5:01 Figs: There are several cases that can occur; one of which is exceptions during development (which I am currently dealing with), one of which is parser-failure after consuming input which should usually, but not always exit the parser to a handler at some point -- it is possible that an alternative parsing strategy is specifiable for back-tracking; this is something I am still experimenting with.
5:02 chr`: hiredman: You used the term "yak shaving" yesterday?
5:03 hiredman: ~yak shaving
5:03 clojurebot: fastest sheers on IRC
5:05 hiredman: sometimes people have a problem, and they pastebin code, and it's formated like C, every ( or ) on its own line, I call up the paste, because I plan to have a look and see if I can help, but I just won't make the effort to try and read lisp formatted like C
5:10 …
5:25 maacl: hiredman: fair enough, but that type of thing is to be expected from newbs...
5:26 hiredman: recommendable that you want to helpful, but knocking style even though you clearly do it to help, might be worse than no help at all
6:02 Figs: When should I use a :kw instead of a 'symbol ?
6:06 Chousuke: Figs: I'd rather ask the other way around
6:09 the most common use of keywords is as map keys, and unless you need to attach metadata to the keys themselves, there's usually no reason to use symbols for that purpose.
6:13 Figs: So, use keywords unless I'm doing something funky with metadata?
6:15 Chousuke: Figs: generally, yes.
7:40 gerry`: hello
8:23 i'm reading docs for golang, i find go abit like clojure, especially go struct vs clojure deftype, go interface vs clojure protocol
8:25 both not oop
8:45 djork: hmm, clojure doesn't seem to be well-suited to printing cycles on the repl :P
9:01 the-kenny: djork: hm?
9:04 djork: self-referential structures
9:04 print forever
9:06 the-kenny: djork: There's *print-limit*. I think that would help
9:52 jmorrison: Hi clojure folks. I want to read the Java code of Clojure but right now I'm seeing tree, tree - not "forest". Can someone recommend a reading order?
9:52 the-kenny: Are the slides for the Presentations (especially clojure concurrency) available somewhere?
9:53 jmorrison: and what is the distinction between IThing ATHing and Thing - which sort of code goes where?
9:53 Bjering_: the-kenny: http://
9:53 the-kenny: Bjering_: Awesome, thank you.
9:54 Bjering_: the-kenny: If you watch it at blip.tv this link is below the view windown, in light grey text.
9:54 the-kenny: Bjering_: Ahhh I didn't see this
9:54 Bjering_: np, same thing happend to me, I didnt see it either until after I had seen it all
9:55 rhickey: jmorrison: I recommend looking at: http://
9:56 jmorrison: at around slide 33 begins a breakdown of the many abstractions of Clojure, serves as a roadmap to the Java side
9:56 should help with everything except the compiler
9:57 jmorrison: rhickey, thanks immensely, I am looking at that now
10:28 Kjellski: Hi all =)
10:29 I was just wondering how extreme the difference between (last (map #(+ 1 %) (range 20000000))) and (last (pmap #(+ 1 %) (range 20000000))) is... the pmap just makes sense when calculation function dominates the whole procedure right?
10:45 cark: Kjellski : yes
10:48 Kjellski: cark I was just wondering how extreme the difference on my Dualcore is... Have you tried that?
10:49 Anyone with a good and performing example of a map and pmap comparison on a dualcore, just to show the performance?
10:49 cark: that's very dependant on your function, there is not much sense in benchmarking this
10:50 but yes it works !
10:53 mhh for instance i made this toy test doing genetic programming a while back, the fitness function was very slow, pmap got me a 6x increase in performances on 8 cores. But i couldn't assert the slowdown was due to pmap limitations or some other ocntention in my program
10:54 or was it 4x increase ... i can't remember now =/
10:54 anyways it works
11:23 Kjellski: cark : hmm... but everything that shows pmap helps is a bit complicated for just showing it... right?
11:40 tmountain: if I get a sharp-quoted symbol back from ns-resolve, can someone tell me how to retrieve the associated value?
11:41 (ns-resolve 'my-namespace 'my-var) => #'my-namespace/my-var
11:42 with a regular symbol, I can just eval, but I'm thinking there's probably a better way?
11:47 ah, nm, var-get seems to work
12:07 jweiss: anyone here use emacs/paredit? it doesn't work right w clojure for me. (map inc |[1 2 3]) and run paredit-wrap-round gives (map inc ([1 ) 2 3])
12:12 ogrisel: hello all, I am new to clojure and I have a question regarding the parsing of large XML files: I can use the xml-zip API to lazily parse the interesting tag content of wikipedia XML dump file: http://
12:13 however the API is keeping references to the root node (I guess) and hence the GC cannot collect the parse tree, even though it is of no usee to me
12:14 is there a way to scan through a potentially infinite XML stream without such a memory exhaustion problem?
12:16 tomoj: maybe I'm misunderstanding the question
12:16 but, if you're building a zipper out of it, you'll need to keep it all around
12:18 ogrisel: yes, you are right, I used the zipper because of the nice XPATH like syntax, but I guess I can do something similar directly with the lazy-xml seq
12:18 tomoj: hmm, I guess components in your zipper could be lazy leqs
12:18 er, seqs
12:22 do you run out of heap space when calling zip/xml-zip?
12:23 lazy-xml supposedly works well with zip-filter.xml.. hmm
12:23 ogrisel: I get the GC taking 100% of CPU time for nothing
12:24 I mean the CPU can no longer be used to do something
12:24 and the used heap is reaching to the max heap (1GB)
12:27 chouser: yeah, lazy-xml makes no attempt to let go of the root of the tree
12:31 Anniepoo: anybody know why this page ends rendering abruptly at remove-ns ?
12:31 ogrisel: ok thx chouser for confirming this
12:32 chouser: ogrisel: I just saw a blog post in the last couple days of someone using a third-party cml parser along with xpath strings to work with xml files larger than memory
12:32 Anniepoo: the html source doesn;'t show anything obvious
12:32 ogrisel: chouser: I am really interested :)
12:34 tomoj: would using the pull parser help?
12:35 chouser: neither sax nor a pull parser holds the whole stream
12:36 the problem with lazy-xml here is it produces a tree compatible with what clojure.xml produces
12:36 as a tree, it allows you to walk it in any direction
12:37 it's lazy in that it doesn't parse content before you need it, but once it's parsed it stays in the tree
12:38 this article (which I'm having trouble finding) worked for certain kinds of xml content and used the knowledge that the this kind of document is essentially a long list of elements
12:38 that allows it to know which "root" nodes you won't need again, and which are items you're iterating past.
12:41 ogrisel: chouser: I am thinking of building the zipper below the root, do you think that could help?
12:41 by skiping explicitly the root
12:41 yes you are right
12:42 the pattern you describe looks exactly like what I am looking for
12:44 haha I was googling and I thought I found it but found that instead: http://
12:44 google stackoverflow
12:44 #fail
12:45 vy: rhickey: As BILFP user group, we would like to be listed in the Clojure user groups page. I sent a mail (http://
12:50 ogrisel: hum, even (count (:content (lxml/parse-trim "/path/to/enwiki-20090902-pages-articles.xml"))) fails with a heap space error
12:50 Anniepoo: I want a (functional ) macro that evaluates it's arguments but doesn't allow any (clojure world) side effects
12:50 That is, when it returns there are no changes in clojure'
12:50 any mutable clojure structure.
12:55 ogrisel: chouser: I think i found it: http://
12:59 rhickey: vy: ok, you are all set on: http://
13:02 vy: rhickey: Thanks.
13:03 aravind: hi
13:03 chouser: ogrisel: that's it!
13:04 ogrisel: I wonder why it's not based on a modern XPP though
13:04 but at least it will give me guidance
13:05 aravind: whats the right way to implement a lookup table (or map) in any kind of functional program? Say I wanted to build a lookup table t, but elements in t depend on other elements in t.. none of the lisps give you an easy way to change an entry. Its always return a new entry leaving the old one intact.
13:05 ogrisel: thx for your help chouser and tomoj
13:06 aravind: why don't you use the default map implementation of clojure?
13:06 durka42: what's the easiest way to get apache to execute a clojure script in response to an http request?
13:07 aravind: ogrisel: umm how, the map just specifies the collection once, and you are done.
13:07 you can't go back and change it in the map
13:08 ogrisel: you can "add" a new element that gives you a new map that shares most of it's content with the previous instance
13:08 aravind: right, so do you just have to keep calling def on the map over and over again?
13:09 ogrisel: http://
13:09 Anniepoo: This should be simple, but I'm on about my third day looking for it
13:09 aravind: ogrisel: I know about assoc, but like I said it just gives you a new map. Doesn't change entries in the original map.
13:10 ogrisel: do you really need it to be mutable? if so use a java HashMap
13:11 aravind: ogrisel: well.. I am more like trying to figure out how folks do things like that in functional programs..
13:11 Anniepoo: @durka42 http://
13:11 ogrisel: they prefer to use immutable maps I guess :)
13:12 aravind: and from the looks of it, it appears that they don't, hehe
13:12 hoeck1: aravind: use a ref or atom to keep an updated version of the map
13:12 ogrisel: in scala you have mutable maps in the language but then you leave the functional realm of scala
13:13 durka42: Anniepoo: i suppose. i was hoping i could just do it from apache
13:13 Anniepoo: google webjure or compojure
13:14 or you could use cgi
13:14 aravind: hoeck1: you would have to do that, to build any sort of changing table/map, right?
13:15 jweiss: aravind, do you really need it to be mutable? it's not like clojure reallocates memory each time you create a new map from and old one (say, with assoc)
13:15 hoeck1: aravind: yes, at least if you want to get the concurrency benefits of clojure
13:16 aravind: jweiss: well, if you don't do that.. how do you build a lookup table (and one where you have to refer back to random elements in the table) to build new ones?
13:16 hoeck1: aravind: you may also use a plain java hashmap, but then you are in charge of enforcing the concurrency policy
13:17 aravind: hoeck1: I am trying to digest basic functional programming, so I am not worried about concurrency right now.
13:17 jweiss: aravind: i'm not sure what the difference is between a lookup table, and clojure map
13:17 aravind: jweiss: same thing.
13:18 jweiss: aravind: perhaps you're wanting to not pass the map around to different functions? you want each function to just have a reference to the map?
13:18 then it's not really functional programming, but yeah, then use an atom
13:19 qed: ive accidentally done this a couple of times -- either in clojure mode or in the slime repl ive hit something where it takes me to the documentation for a function, so if im at the end of when-not_, it will take me to that spot in the clojure core code
13:19 anyone know what that is?
13:20 hoeck1: qed: maybe slime-edit-definition, m-. ?
13:20 qed: woohoo! thanks hoeck1
13:21 aravind: jweiss: yeah, something like that (okay, I will look it up)
13:21 thanks for the help folks.
13:23 the-kenny: Why is it sooo hard to get swank-clojure running with clojure.jar in ~/Development/clojure/? It was hard with an old version, but almost impossible with the newest from git... (I don't want to use elpa)
13:39 ah.. finally got it working.
13:39 (A bit hacky, tough...)
13:40 Okay, I've to do some homework now..
13:45 hm... swank-clojure-project isn't working for me.
13:48 Ah, looks better now.
13:48 It should be mentioned that ido.el is required
13:58 lispnik: is it possible to use gen-class to create classes with static fields?
14:01 kzar: So I'm reading about functional programming, I had a question though. Supposing you write some computer game, would the game loop be recursive? I thought you could have a game-loop function that when called with no args made some up and then called itself again. Then each time you could call on the loop's variablles but instead of changing them just pass the return value to the the next call to game-loop?
14:02 whoops I meant "you could call the game logic function on the loops variables"
14:07 krumholt__: kzar you could do that. there is also while in clojure
14:08 ,(doc while)
14:08 clojurebot: "([test & body]); Repeatedly executes body while test expression is true. Presumes some side-effect will cause test to become false/nil. Returns nil"
14:09 kzar: krumholt__: But supposing you needed to change some of the tiles on the world, normally I would have a global 2d array for the world and in the game-loop I could call all the logic functions which could change the world when needed.
14:10 krumholt__: but if you're trying to avoid doing it that way I'm not sure how you could use a while loop?
14:11 rlb`: kzar: you might want to check out rhickey's "ant demo" video. Though that's particularly focused on fine-grained parallelism (w/o locks).
14:11 kzar: it does maintain a "world array", etc.
14:12 krumholt__: kzar, ok i think i understand. you could make your game loop a function that as an argument takes the 2d field and will recursivly call itself with a changed 2d field
14:15 rlb: kzar: note that in clojure, you'll need to use loop/recur or you may run out of stack.
14:15 kzar: ok I'll have another look at that ants code and try and understand it
14:15 rlb: kzar: if I recall correctly, it maintains an array of ant agents -- that may be more than you'd need.
14:16 tomoj: anyone have an idea about how to take a clojure.test test function and make it bail out on failure?
14:16 maybe make a special version of is which throws an exception on failure, and catch that up above? :/
14:18 I wrote a macro that takes a body like (foo) (bar) (baz) and rewrites it to (when (foo) (when (bar) (baz))), but that will break if one of the body forms is not an is assertion
14:18 (and returns false/nil)
14:29 technomancy: I'm working on my JRuby adapter for Clojure and running into some odd exceptions.
14:30 http://
14:30 works with 2 threads, blows up with 3
14:31 (I'm giving a lightning talk about this at ~3pm PST at JRubyConf)
14:34 I'm getting NativeException: clojure.lang.LockingTransaction$RetryEx: null when I run a simple alter inc on an integer ref in more than 2 threads at a time.
14:34 (where my inc is implemented in Ruby, but whatever.)
14:35 rhickey: technomancy: if JRuby is getting in the way of exception flow that will mess up transactions, which use exceptions for retries
14:36 technomancy: I see; it's probably wrapping them in a Ruby exception type.
14:36 rsynnott: technomancy: What is your adapter going to do, exactly?
14:37 technomancy: seems likely since commute works fine with ten threads
14:37 rhickey: LockingTransaction$RetryEx is definitely a retry exception (i.e. not an error)
14:38 but if it gets wrapped, it will not be detected as a retry in the transaction loop, and will flow out
14:39 kzar: rlb: So I was reading about agents and how that ant demo works. I like them but I was thinking is it the right model for tetris? I wasn't sure if having a new agent for every tile would really be the right approach?
14:45 rlb: Ah, I didn't realize that's what you're working on, and no, I wouldn't be likely to pick fine-grained agents for that.
14:47 technoma`: conference wifi; sorry
14:47 rlb: I'm not sure you need much concurrency wrt tetris, though, do you?
14:47 kzar: I got the basic game working, the pieces move down and turn and they stack together blah blah but not I'm trying to re-jig the code so that it's more functional
14:48 rlb: Well I don't need concurrency but I don't need tetris either
14:50 I'm just making it as a way to learn about clojure really. I figured I should make it more functional than was confortable for me
14:50 rlb: kzar: I mostly mentioned the demo because (iirc) it manages a 2-d world state, but the rest may not be relevant to you.
14:51 Anyway, passing the world via loop/recur should work fine
14:52 kzar: yea I think you're right, I'm going to give it a shot
15:03 krumholt__: what happens to clojurebot if i eval a recursive function that loops endlessly?
15:03 the-kenny: krumholt__: Just try it
15:03 :D
15:03 krumholt__: the-kenny, i don't wan't to break something
15:04 the-kenny: hm... I'm sure hiredman has programmed some timeouts or so.
15:04 technomancy: rsynnott: so with what I've got you can use JRuby blocks and lambdas in transactions as well as access to the persistent data structures
15:05 rhickey: luckily headius is here at the conf and interested in what I'm doing, so with that in mind I will see if I can get some hints from him about how to deal with the wrapping. =) thanks.
15:05 Hunner: Any idea what colorscheme this is? http://
15:12 jweiss: Hunner: i asked the same question a couple days ago. I've been waiting for that guy to show up here so i can ask him, but meanwhile i gave up on vim-clojure and moved to emacs
15:12 his nick is kotarak
15:13 still i like that color scheme a lot
15:13 * Hunner doesn't think he could move to emacs. All my friends would make fun of me :)
15:14 * Scriptor just realize vimclojure doesn't have built-in syntax highlighting
15:14 Scriptor: *realized
15:14 jweiss: i hated emacs since college, but now that i'm giving it a 2nd chance, i see the beauty of it
15:14 Hunner: Scriptor: syntax/clojure.vim
15:14 it's in vimclojure
15:15 Scriptor: or not
15:15 the-kenny: Hunner: Just show the how awesome slime is :)
15:15 Or org-mode, or artist-mode
15:15 Hunner: yeah, I haven't compared slime and slimv yet
15:15 the-kenny: don't start :)
15:15 the-kenny: :p
15:16 Scriptor: hmm, I still don't seem to be able to get good syntax highlighting with vimclojure
15:16 jweiss: Scriptor: it was working for me, although a bit nonsensical. i got at least 4 different colors for various fns, not sure what the rhyme or reason was
15:17 Scriptor: I don't get any colors for defn
15:17 and for some reason 'return' gets highlighted
15:17 jweiss: Scriptor: worked for me when i followed the instrux here: http://
15:17 _ato: I like zenburn for both emacs and vim (though I chane the background to be a bit darker) http://
15:18 Scriptor: jweiss: right, that's what I did as well
15:18 jweiss: Scriptor: maybe you have to enable 256 color mode for your terminal
15:18 Scriptor: I think it's mistakingly using another language's syntax
15:19 it should use vimclojure for any .clj files, right?
15:19 other languages work fine
15:19 rlb: Any thoughts about how to structure a clojure app that needs to communicate bidirectionally over a socket, where there may be multiple "senders" in the app? Note that there isn't a tight coupling between socket input and output.
15:20 Could have an agent to manage the outgoing socket, or a transaction protected "outgoing" queue and a thread to manage the output.
15:20 the-kenny: rlb: I think I would do it exactly like that. (But I'm not very experienced...)
15:21 ha.. If I think what a pain in the *ss something like this would be in C++ or so..
15:21 rlb: Hmm -- though it might consume more threads, the agent might be easier. Otherwise I'd have to arrange for the sender thread to block when the outgoing queue was empty, etc.
15:24 _ato: the-kenny: re scriptjure + couchdb: yeah it worked pretty well. I ended up switch to the Clutch lib rather than clojure-couchdb, I got fed up with all the exception throwing clojure-couchdb does. The great thing about Clutch is implements a view server so you can actually just use native clojure code instead of translating to javascript
15:26 the-kenny: _ato: Yeah, Clutch is cool too, but I like the simplicity of clojure-couchdb.
15:26 _ato: hehe, Clojure has kind of spoiled me I much prefer (get-document) to return nil when there's no doc instead of blowing up :)
15:29 technomancy: _ato: wait, clutch is a view server _and_ a client?
15:30 rlb: Hmm, not sure clojure even has that kind of blocking (block until changed)?
15:31 _ato: technomancy: yeah
15:34 technomancy: just add [query_servers] clojure = java -jar .../clutch-standalone.jar to couchdb config and suddenly you cuse clojure views. It's really nice
15:35 danlarkin: _ato: does that keep the jvm running between requests?
15:36 _ato: danlarkin: yes
15:38 danlarkin: that's pretty neat
15:45 qed: Hmmm I didn't expect that to happen...
15:45 (in-ns 'myapp)
15:45 (clojure.core/use 'clojure.core)
15:45 _ato: you could even use nailgun so that it shared the same JVM as your app, reducing memory usage and also allowing sharing state between the views and the reset if your app if you wanted to
15:45 qed: hangs my slime repl
15:46 Is that weird?
15:50 Anyone have this problem?
15:50 spuz: Is there a way to tell whether or not a function returns a primitive type or not?
15:51 Calling class on an int appears to autobox it into an Integer
15:51 ,(class (int 0))
15:51 clojurebot: java.lang.Integer
15:53 _ato: qed: works for me :\
15:54 qed: weird
15:54 hiredman: spuz: functions cannot return a primitive
15:54 * qed restarts emacs and tries again
15:54 hiredman: int supperficially looks like a function, but it is a cast
15:55 qed: it hangs me again
15:55 spuz: hmm
15:55 qed: _ato: any ideas on troubleshooting this? Are you running 1.1.0?
15:55 spuz: what if I say (let [x (inc (int 0))] ...) is x still a primitive after it gets incremented?
15:55 hiredman: qed: use refer, not use
15:55 qed: why does that fix it?
15:59 hiredman: qed: not sure, but use will load a namespace and then refer it, but core is already loaded
16:03 qed: hiredman: ah, so im trying to load 'clojure.core from 'clojure.core, which is screwing it up?
16:05 ordnungs`: re
16:06 _ato: qed: is there a reason you need to (use 'clojure.core) or a re you just experimenting with the namespace functions?
16:06 qed: experimenting with namespaces
16:06 hiredman: qed: I don't know the exact mechanics
16:06 qed: per S. Halloway's book
16:07 p65 has this example of (in-ns 'myapp), he then goes on to explain that we automatically get access to Java, but not to clojure, so we need to load it manually by doing (clojure.core/use 'clojure.core)
16:09 _ato: qed: oh and yeah I am on clojure 1.1
16:10 qed: that's really weird, maybe it's our version of swank-clojure or slime that's making the difference
16:11 im bleeding edge on all of it
16:18 defn: How do I edit my SLIME prompt?
16:46 hiredman: clojurebot: FAQ #1?
16:46 clojurebot: Excuse me?
17:02 ordnungswidrig: anybody using a macbook pro for java/clojure development. Does the ssd make a difference?
17:05 qed: ordnungswidrig: the ssd is going to make a noticeable difference for all sorts of stuff
17:05 im not sure why you're asking specifically about clojure
17:07 _ato: ordnungswidrig: I'm using a regular macbook (2nd gen) with an SSD and it makes a huge difference, particularly to startup-times for large applications and the OS itself
17:07 ordnungswidrig: qed: I meant the typical clojure dev workflow: no fat ide like eclipse/intellij but a litte aquamacs and repl in a terminal lurking around.
17:08 defn: i use a T61P laptop that my work provided, my setup is fine
17:08 _ato: for emacs it's not going make that much difference as emacs is pretty fast normally anyway
17:08 defn: even with a fat IDE, a new MBP should be fine
17:08 if you want to run Microsoft Word, on the other hand
17:08 better get that SSD
17:09 ordnungswidrig: defn: whoo, I think I might be forced to use that. Or openoffice. Don't know if a ssd matters for openoffice.
17:10 defn: I'd say yes. But the 270€ on top could be invested for other nice things as well.
17:11 rys: The T61p is the best laptop I've ever owned
17:11 * ordnungswidrig didn't want to start a notebook war.
17:13 ordnungswidrig: better go to bed, now. Thanks for you comments.
17:14 defn: rys: it's a great laptop yeah
17:15 rys: The only thing that bugs me is the battery life, even with a 9-cell
17:15 defn: i got lucky, the time i started this job meant getting the shiny t61p and not the crappy t60
17:15 yeah my battery just died and i had to order a new one, those 9 cells are junk
17:17 rlb: So wrt clojure libs, are prefix names or generic names (which rely on the namespace) preferable? i.e. for a mpd lib, would you expect (mpd-foo bar) or just (foo bar)?
17:19 tomoj: I would expect just foo
17:20 because I can do (mpd/foo bar) if I want
17:26 jweiss: anyone here use emacs/paredit? it doesn't work right w clojure for me. (map inc |[1 2 3]) and run paredit-wrap-round gives (map inc ([1 ) 2 3])
17:27 opqdonut: looks like paredit isn
17:27 't aware of []
17:27 try looking at the customizeable vars it has
17:27 i've only used paredit with common lisp
17:31 jweiss: opqdonut: what customizable vars
17:32 mrSpec: Could you help me with Macro? I dont know why this one is not working:
17:32 lisppaste8: mrSpec pasted "Macro - ActionListener" at http://
17:33 opqdonut: jweiss: M-x customize
17:34 jweiss: opqdonut: forgive my emacs newbness. i get a list of categories, which one would paredit be under
17:35 hiredman: mrSpec: maybe unquote height and width
17:35 qed: http://
17:35 hiredman: ~'.addActionListener
17:35 clojurebot: It's greek to me.
17:35 hiredman: er
17:35 ~'.addActionListener can just be .addActionListener
17:35 clojurebot: Titim gan éirí ort.
17:36 hiredman: clojurebot: buzz off
17:36 clojurebot: excusez-moi
17:36 mrSpec: ok I'll try
17:36 hiredman: gpanel should be unquoted too
17:37 mrSpec: unquoted? could you tell something more? there is no quote before g-panel :S
17:38 hiredman: the whole doto form is quote
17:38 quoted
17:38 syntex-quoted to be exact
17:38 syntax
17:38 `(doto …)
17:38 qed: mrSpec: `() is a syntax quote
17:38 mrSpec: ah
17:39 qed: mrSpec: in syntax quoted things you'll find ~ and ~@ generally
17:40 hiredman: http://
17:40 qed: like `(a ~b (~@c))
17:40 mrSpec: ah, so I should add ~ before gpanel?
17:40 qed: maybe.... i didnt see your code
17:40 mrSpec: hiredman: thanks
17:41 qed: ~ defers the evaluation of the thing it's appended to
17:41 clojurebot: Huh?
17:41 hiredman: qed: woa, no
17:41 unquoting does the opposite of defer
17:41 qed: err it specifically evaluates what it applies to
17:42 hehe, just learned this yesterday so bear with me :)
17:43 mrSpec: http://
17:45 mrSpec: qed: thx, I'll take a look
17:47 qed: mrSpec: for my own edification ill re-write some of what _ato showed me
17:48 ,'(foo (+ 1 2))
17:48 clojurebot: (foo (+ 1 2))
17:48 qed: ,`(foo ~(+ 1 2))
17:48 clojurebot: (sandbox/foo 3)
17:48 qed: ,`[1 2 3 4 ~(+ 2 3) 6 7]
17:48 clojurebot: [1 2 3 4 5 6 7]
17:49 qed: (defmacro m3 [x] `(foo ~@x))
17:50 (m3 [1 2 3]) => (foo 1 2 3)
17:50 anyway, ill quit for the time being, but seeing those helped me quite a bit
17:51 mrSpec: ok, thx ;)
17:51 qed: this one was particularly fun to think about:
17:52 ,'`(evil (~test ~@fish))
17:52 clojurebot: (clojure.core/seq (clojure.core/concat (clojure.core/list (quote sandbox/evil)) (clojure.core/list (clojure.core/seq (clojure.core/concat (clojure.core/list test) fish)))))
17:52 qed: _ato++
17:55 Drakeson: Do you know a pretty way to provide remote clojure calls to command line utilities? The invokation could look like this: $ clojure-run "(+ 1 2 3)"
17:56 mrSpec: hah I've found another bug... I cant have button "button1" and macro "button1" in Clojure?
17:56 hiredman: what do you mean?
17:56 _ato: Drakeson: alias clojure-run="java -server -jar .../clojure.jar -e"
17:57 mrSpec: (defmacro button ...) and (let [button (new Jbutton )] (button button)) Something like that
17:58 hiredman: …
17:59 Drakeson: _ato: nah! note that I want *remote* calls. I don't want to run a new instance of jvm.
17:59 cark: mrSpec : that's not a bug, clojure is a lisp1
17:59 look it up
17:59 mrSpec: cark: bug in my program ;)
17:59 hiredman: actually, depending on details of clojure's compilation model that I am not familar with, that might work
17:59 technomancy: Drakeson: you want nailgun
17:59 mrSpec: I've just read that clojure is a lisp1 :/
17:59 hiredman: not entirely sure how macro's work with lexical scope issues
17:59 Drakeson: technomancy: please, no!
17:59 _ato: Drakeson: yeah, setup nailgun and then: alias clojure-run="ng clojure.main -e"
18:01 joshua-choi: Hey, how can you get the name of a Var?
18:02 _ato: ,(:name (meta #'inc))
18:02 clojurebot: inc
18:02 joshua-choi: Excellent, thank you.
18:02 _ato: joshua-choi: ^
18:02 :)
18:02 Drakeson: apt-cache search nailgun --> nil. (debian unstable).
18:04 (I know about http://
18:05 _ato: Drakeson: wget http://
18:05 err
18:05 unzip not tar
18:06 hiredman: freebsd's tar handles zip files :P
18:51 mitkok: Hey, guys. Anyone using slime under Ubuntu, but installed from source, no *.deb package.
18:51 technomancy: mitkok: slime upstream broke a few things on us; best to install via elpa: http://
18:53 mitkok: technomancy: ok, thanks
19:04 technomancy: I've just installed clojure, clojure-mode, swank-slojure, slime, slime-mode via elpa, but now when I execute slime it gives me an error : Could not find the main class: clojure.main. Program will exit.
19:19 technomancy: mitkok: with M-x slime? are there jars in the ~/.swank-clojure dir?
19:20 mitkok: technomancy: actually, I clojure was not installed, but only the modes through elpa package manager. I ran clojure-install and everything works fine :)
19:21 joshua-choi: Quick question: how do you get the name of a namespace? (I'm trying to get the namespace-qualified symbol of a Var.)
19:22 hiredman: joshua-choi: vars have two public fields, ns and sym
19:22 ,(.ns (var +))
19:22 clojurebot: #<Namespace clojure.core>
19:22 technomancy: ,(meta (the-ns 'clojure.core))
19:22 clojurebot: {:doc "Fundamental library of the Clojure language"}
19:22 hiredman: ,(.sym (var +))
19:22 clojurebot: +
19:22 hiredman: ,(.ns (var +))
19:22 clojurebot: #<Namespace clojure.core>
19:22 hiredman: ,(name (.ns (var +)))
19:22 clojurebot: java.lang.ClassCastException: clojure.lang.Namespace cannot be cast to clojure.lang.Named
19:22 hiredman: :|
19:23 ,(symbol (str (.ns (var +))) (.sym (var +)))
19:23 clojurebot: java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to java.lang.String
19:23 hiredman: ,(symbol (str (.ns (var +))) (name (.sym (var +))))
19:23 clojurebot: clojure.core/+
19:23 hiredman: ,(resolve (.ns (var +)) (.sym (var +)))
19:23 clojurebot: java.lang.IllegalArgumentException: Wrong number of args passed to: core$resolve
19:24 hiredman: :|
19:24 anyway
19:24 joshua-choi: That's what I need
19:24 Thanks a lot
19:25 chouser: (
19:25 ,(ns-name *ns*)
19:25 clojurebot: sandbox
19:25 hiredman: ah
19:25 chouser: but that doesn't really help
19:26 hiredman: anyway, it would be great if namespaces where Named
19:26 chouser: vars too
19:26 hiredman: hmmm
19:26 joshua-choi: Yeah, it would
19:26 hiredman: I suppose
19:26 joshua-choi: But ns-name is better than str, so thanks too
19:26 hiredman: and return nil if unamed?
19:26 chouser: I'd be happy to have 'name' work on most vars and return nil for unnamed ones
19:26 yeah
19:27 what's named now. just keywords and symbols?
19:27 hiredman: I believe so
19:28 yes
19:28 chouser: both already support unqualified names. I guess "no name at all" stretches that a bit further
19:28 hiredman: huh
19:28 this thing that implements Named is not named...
19:29 chouser: yeah, I think that's why rhickey has resisted so far.
19:29 hiredman: IMightHaveAName
19:37 clojurebot: naked dot is <reply>http://
19:37 clojurebot: Ok.
19:49 defn: ,(doc drop-last)
19:50 clojurebot: "([s] [n s]); Return a lazy sequence of all but the last n (default 1) items in coll"
21:43 zaphar_ps: does clojure-contrib have a foldl and foldr implementation?
21:45 _ato: foldl is just reduce isn't it?
21:45 not sure if there's a foldr
21:46 defn: You could make one
21:46 zaphar_ps: _ato: yeah actually it is :-)
21:47 hadn't quite triggered that.
21:47 defn: I did actually
21:47 defn: http://
21:47 zaphar_ps: it's an easy fn to write
21:47 defn: There's another one if you like :)
21:48 JAS415: couldn't you just reverse and then do the reduce
21:49 defn: foldr isn't lazy
21:49 in the above implementation
21:49 JAS415: isn't tail recursive either i dont think
21:49 zaphar_ps: correct on both accounts
21:52 defn: How do you do something like (Random. nextInt 10) in one line?
21:52 zaphar_ps: defn: that looks like one line to me
21:52 defn: not working for me for some odd reasno
21:52 might just be my repl
21:52 JAS415: what does that produce?
21:53 defn: an exception
21:53 JAS415: ,(Random/nextInt 10)
21:53 clojurebot: java.lang.Exception: No such namespace: Random
21:53 zaphar_ps: I get IllegalARgumentException
21:53 JAS415: ,(rand-int 10)
21:53 clojurebot: 2
21:53 defn: You need to (import '(java.util.Random))
21:53 JAS415: ,(rand-int 10)
21:53 clojurebot: 0
21:53 hiredman: (import '(java.util Random))
21:53 defn: err ty
21:54 _ato: ,(.nextInt (java.util.Random.) 10)
21:54 clojurebot: 9
21:54 zaphar_ps: even with import I still get Illegal Argument
21:54 defn: _ato: so you would just do:
21:54 zaphar_ps: hrmm
21:54 defn: ,(.nextInt (Random.) 10)
21:54 clojurebot: java.lang.IllegalArgumentException: Unable to resolve classname: Random
21:55 _ato: ,(import 'java.util.Random)
21:55 clojurebot: java.util.Random
21:55 JAS415: whats the difference between that and rand-int?
21:55 defn: ,(.nextInt (Random.) 10)
21:55 clojurebot: 7
21:55 defn: there we are
21:56 _ato: ~def rand-int
21:56 JAS415: ,(Random/nextInt 10)
21:56 clojurebot: java.lang.IllegalArgumentException: No matching method: nextInt
21:56 JAS415: ah i see
21:57 * zaphar_ps thinks vimclojure may be the most well written and easiest to use vim plugin he has ever used
21:59 defn: If you think that's good, wait til you try slime ;)
21:59 zaphar_ps: heh
21:59 I did try slime but emacs just doesn't fit me very well
22:00 thus my pleasure concerning vimclojure
22:02 JAS415: emacs has a steep learning curve, but i had emacs running compojure and i was refreshing my browser from inside emacs
22:03 which was a big efficiency boost over clicking refresh
22:03 and that's all because of the scripting aspect i guess
22:03 zaphar_ps: JAS415: alt-tab ctrl-r
22:04 JAS415: i was just doing ctrl-x p
22:04 i guess that works too though
22:04 zaphar_ps: not sure the difference in keystrokes is all that noticeable
22:05 but yeah I already have years invested in vim and just don't feel like tackling the emacs learning curve
22:05 JAS415: yeah
22:05 zaphar_ps: despite my enjoyment of list and clojure
22:05 JAS415: if you are already good with what you have use it
22:43 efarrar: hello, anybody using the latest vim-clojure with gorilla?
22:44 hi yacin
22:51 zaphar_ps: efarrar: define latest version?
22:52 head won't even compile for me
22:52 efarrar: eh, any version will do i guess
22:52 zaphar_ps: but that last release tag does
22:52 what did you want to know?
22:52 efarrar: i can type \sr all day long but no gorilla
22:52 filetype sets correctly
22:52 zaphar_ps: does \ef work
22:53 efarrar: yes
22:53 zaphar_ps: and I assume you started your nailgun server
22:53 if ef works then of course you did
22:53 efarrar: yes
22:53 zaphar_ps: does it give any error message?
22:53 efarrar: oh really?
22:53 no it just catches the "s" key
22:54 zaphar_ps: thats weird
22:54 efarrar: and deletes a character and enters insert
22:54 zaphar_ps: I've never had it partially work
22:54 I've had it fail totally or not fail at all but never a single command
22:54 efarrar: oh wait
22:55 ef does not work, it does whatever \e does
22:55 zaphar_ps: ahhh ok
22:55 efarrar: or rather, "e"
22:56 zaphar_ps: then what has happened is the plugin hasn't actually loaded
22:56 efarrar: ok
22:56 zaphar_ps: if you look in the .vim/autoload/vimclojure.vim file you'll see a bunch of commands
22:57 if you try to execute any of them they probably will give you an error that it cant' find them
22:57 for some reason it hasn't actually loaded the plugin file.
22:57 As for why I'm not sure what the reason is.
22:58 I had an error in mine that caused it
22:58 efarrar: i'll read back through the install
22:58 zaphar_ps: the other reason might be because it can't find the nailgun server also
22:58 hope that helps
22:59 efarrar: if you have to try putting some echomsg lines in the initbuffer function in the vimclojure.vim file
22:59 that will at least tell you if it's trying to load but can't find the namespace of the file because of a nailgun server error
23:00 defn: Good god I am blowing through this Clojure book
23:00 This is the first time in my entire life I've actually read an entire programming book
23:00 as in cover to cover
23:00 zaphar_ps: defn: heh
23:01 the only programming book I've ever read cover to cover was the camel book
23:01 and that was a long long time ago
23:01 catfishlar: defn: I have not read it. Is it well written or is it just beacsue clojure is interesting
23:01 defn: The thing that has me reading so closely is all the Java interop stuff, and there seems to be so many little nuggets of goodness buried in some of the sections
23:02 catfishlar: I'd say both
23:02 The layout so far has me really into it -- it starts like most programming books with boring examples about writing hello world, etc., but once he gets into the Java interop stuff it gets really interesting
23:02 catfishlar: I just got finished watching Rich's keynote from Nov 12 and I was taking notes like a mad man. The guy is so Lucid about his message.
23:03 defn: the performance stuff in the Clojure book has been some of the stuff I've been missing
23:03 and that was laid out really nicely
23:04 Part of it with this book I think also has a lot to do with the fact that there is ONLY ONE clojure book on the market
23:04 with other established languages it's easy to jump around the web finding this and that
23:05 This is partially true for clojure, but not to the extent of say Ruby
23:05 so having a sort of guide book is really nice and relaxing in a way
23:08 JAS415: i think in a couple years it will be better
23:08 defn: Clojure or the book?
23:08 JAS415: i think there is at least one more clojure book coming out soon
23:08 oh sorry, just the size of library and information
23:09 defn: oh sure
23:09 it takes time
23:09 and yeah there's a book coming out from Apress
23:09 but this is a great book, FWIW
23:10 JAS415: clojure looks like it will just continue to get better as well, fwiw
23:12 defn: yeah for sure
23:12 I'm excited for the future :)
23:13 I'm done reading for the day -- I just got to Creating Java Proxies and am suddenly bored
23:15 chouser: and two from Manning