0:03 sleepynate: ugh.. classpaths. anyone use vimclojure? i'm trying to get the AOT compile of the pretty print thing in clojure-contrib
0:17 technomancy: sleepynate: if you can at all avoid it, don't compile contrib yourself
0:17 sleepynate: technomancy: you're telling me :D
0:17 i always forget exactly how i get it working
0:17 then i need to set it up again
0:17 technomancy: why do you need to set it up?
0:18 sleepynate: http://
0:18 but for now i just pipe it to a jline repl in tmux
0:18 technomancy: sleepynate: do you know about http://
0:19 sleepynate: technomancy: i don't.. but that doesn't have this pretty printer mod, does it?
0:19 technomancy: oh, you're trying to add your own modifications to contrib
0:19 gotcha; that is one of the few legitimate reasons to build it yourself
0:20 most people complaining about contrib build issues have no good reason to be trying in the first place.
0:20 sleepynate: Could not locate clojure/contrib/pprint__init.class or clojure/contrib/pprint.clj on classpath:
0:20 this is the actual one i'm getting
0:20 and i know i've fixed it before :)
0:21 ahh well.. i'll stick with my tmux pipe for now
0:21 just nice to get slime-like functionality in a *cough*decent*cough* editor
0:21 technomancy: tmux pwns
0:23 sleepynate: ya
0:24 technomancy: well, if you use vim, check out tslime :)
0:24 it ferries stuff back and forth to tmux
0:24 it's just not form/s-expression aware
0:26 technomancy: thanks but no thanks.
0:42 Bahman: Hi all!
1:02 replaca: sleepynate: what are your plans for pprint, out of curiousity
1:02 ?
1:05 sleepynate: replaca: none specifically, just vimclojure wants the one from contrib compiled
1:06 replaca: sleepynate: ahh, that's probably cause vimclojure is using an old version of contrib
1:06 sleepynate: pprint used to require compilation in 1.1
1:06 sleepynate: oh poop
1:07 i'm using 1.2 snap
1:07 replaca: so maybe you just want to grab a 1.1 contrib for vimclojure
1:07 sleepynate: git pull didn't yield anything new
1:07 fair enough
1:07 replaca: in what sense? There were a bunch of changes.
1:08 sleepynate: replaca: no no, no changes since i last compiled :D
1:08 replaca: but in 1.2, they should really be using clojure.pprint which is the new version
1:08 sleepynate: sure
1:08 replaca: not too many changes from c.c.pprint, though
1:09 sleepynate: maybe later i'll look at the build script
1:09 fix it for him :D
1:10 but that makes sense why i could before but not now
1:10 replaca: cool. good luck!
1:11 sleepynate: heh. thanks? :)
1:12 hmm, what's the clojure equiv of "all" in haskell
1:12 true if all in collection meet conditions of predicate
1:13 tomoj: every?
1:13 clojurebot: everybody looks good in a sheinhardt
1:13 sleepynate: (all? (zero? %) (0 0 0 0 0 0 0 0 0 ))
1:13 tomoj: ,(every? zero? [0 0 0])
1:13 clojurebot: true
1:13 sleepynate: tomoj: thanks
1:13 tomoj: i knew it was something not far off :D
1:19 rdeshpande: hi all
1:23 rubydiamond: technomancy: hey
1:23 what mode do you use for rhtml ?
1:23 rdeshpande: hey
1:24 which city ?
2:56 LauJensen: Good morning all
2:59 Raynes: Morning.
3:03 LauJensen: Raynes: What are you working on these days?
3:22 Raynes: LauJensen: Mostly sexpbot lately. That and Irclj.
3:22 LauJensen: Alright
3:22 Raynes: I have a little toy web development project that I've been neglecting, but plan to get back to soon.
3:23 LauJensen: Whats it about?
3:23 Raynes: Pastebin-like thingy.
3:24 It's mostly a learning thing.
3:24 LauJensen: Ah so you're doing some syntax highlighting? :)
3:24 Raynes: Try-clojure isn't really something I can cut my teeth on. I want to make it better, but I need experience for that.
3:25 LauJensen: Pretty hefty project for your first web app
3:25 Raynes: Actually, I've been considering that. I planned on highlighting with syntaxhighlighter, at least at first.
3:25 LauJensen: But it turned out okay
3:25 Raynes: Thanks to you.
3:25 :p
3:25 LauJensen: ha
4:21 jave: I have a little compojure project, that starts a jetty server in the background. when I reload the ns, the jetty is still running so it cant get the port and I get errors
4:22 is there some idiomatic way of handling this? I thought maybe using a global singleton
4:22 bobo_: jave: defonce instead of def i think solves that.
4:22 jave: ah
4:22 bobo_: on the jetty calling method
4:24 Raynes: jave: Yeah, defonce, or just put the code to run the jetty server in another ns.
4:24 LauJensen: usually it makes sense to have core/main start the server, and server/start-server to actually boot it
4:25 jave: hmm ok
4:25 something like this should work at leas then? (defonce dummyserver (future (run-jetty (var unibet-dispatch-routes) {:port 9090})))
4:28 Raynes: -> (letfn [(U [f] (f f))] ((U (fn [f] (fn [n] (if (= 0 n) 1 (* n ((f f) (- n 1))))))) 5))
4:28 sexpbot: => 120
4:28 Raynes: _fogus_: ^ Lovely monstrosity you got htere.
4:28 there*
4:28 esj: you can also use atoms: http://
4:28 Raynes: Makes me want a roast beef sandwich.
4:32 esj: Raynes: where on earth did you excavate that ?
4:32 Raynes: esj: Twitter. It's fogus'
4:32 esj: you been messing with necromancy again ?
4:32 oh, then its correct ;)
4:34 although his partner is crime did try to destroy the universe yesterday...
4:41 raek: jave: don't forget to specify the handler function as "#'handler" and not "handler"
4:42 the latter takes the value that the #'handler var had at that time, and remembers that
4:42 the former lets the server remember the var itself
4:43 LauJensen: ie. so you can redefine it at runtime
4:43 raek: (vars when used as functions do a deref on themselves and call that)
4:44 jave: (defonce dummyserver (future (run-jetty (var #'unibet-dispatch-routes) {:port 9090}))) ?
4:45 hmm or not even the (var .. )
4:45 raek: exactly.
4:45 oh
4:45 #'foo = (var foo)
4:46 ,(var (var inc))
4:46 clojurebot: java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol
5:00 jave: whats the idiomatic way of writing a config file? a java properties file? a separate ~/app.clj file outside the uberjar?
5:01 Raynes: I usually do something similar to the latter. Most of my configuration is just a map in a file that I read-string in the application.
5:01 kumarshantanu: jave: perhaps an external appconfig.clj and do an eval to get the properties?
5:01 LauJensen: jave: That comes up a lot, and it usually comes down to whatever makes the most sense for your ready
5:01 bobo_: i think lein does it nice?
5:01 LauJensen: s/ready/reader/
5:01 sexpbot: jave: That comes up a lot, and it usually comes down to whatever makes the most sense for your reader
5:02 LauJensen: Raynes: That function should append the (name) of the one who said it for quicker reads
5:03 Raynes: LauJensen: Like <LauJensen> message here?
5:03 That makes sense.
5:03 LauJensen: yea
5:03 Raynes: Good idea.
5:04 fliebel: do you guys keep logs of this channel somewhere?
5:04 LauJensen: Thanks
5:04 Raynes: fliebel: Yessir.
5:04 LauJensen: clojure-log.n01se.net
5:04 clojurebot: where are the logs?
5:04 clojurebot: make a note of http://
5:04 LauJensen: clojurebot: where is the log?
5:04 clojurebot: reverse psychology is even less rigorous than forward psychology
5:05 LauJensen: clojurebot: the log is at http://
5:05 clojurebot: Alles klar
5:05 LauJensen: clojurebot: where is the log?
5:05 clojurebot: logs is http://
5:05 LauJensen: good boy
5:06 Raynes: I really need to set up my bouncer. ._.
5:07 $learn clojure-logs clojure-log.n01se.net
5:07 sexpbot: My memory is more powerful than M-x butterfly. I wont forget it.
5:26 kumarshantanu: rql looks interesting -- http://
5:32 Chousuke: I don't like the bang functions.
5:32 they seem to be doing nothing more than (alter theref non-bang-fn args)
5:32 (in a dosync)
5:41 LauJensen: Chousuke: which bang fns are you refering to ?
5:42 Chousuke: the ones in the rql library
5:42 LauJensen: oh ok- I thought you wanted swap! reset! etc to be removed :)
5:43 Chousuke: heh, nah. those have no trivial replacement :P
5:43 I just think hiding alters and especially dosyncs in trivial functions is unidiomatic in Clojure :P
5:43 LauJensen: no, but Im sure Rich would remove them right away if you werent comfortable with them :)
5:44 Chousuke: yes, I'm sure :P
5:48 raek: bangs for functions that are safe to use in transactions?
5:51 Chousuke: yeah, that too :P
5:51 LauJensen: Has anybody had this issue with Miglayout? http://
5:52 Chousuke: gab? not gap?
5:52 tomoj: seems a bit weird that the bang fns are called "persistent variants"
5:54 LauJensen: Chousuke: Its a pleasure to have you on board, thanks for catching my typo :p
5:54 Chousuke: LauJensen: you need more coffee :P
5:54 LauJensen: Haha!
5:54 cruel...
5:55 fliebel: LauJensen: Coffee diet?
5:55 LauJensen: http://
5:55 (for odd reasons, my most popular blogpost yet)
5:56 Even beating my Tribute to Steve Ballmer I think :)
5:56 fliebel: (not so odd at all…)
5:56 LauJensen: Well, I wrote it because I had promised to do so, I was feeling more inspired to blog about Clojure, so it felt like 'work' doing it, where many of the others have been pure fun
5:57 raek: Clojure is all about pure fn for me ;)
5:59 fliebel: LauJensen: You read those articles about digg mafia and vote rings? It's all about getting the first 5 votes fast, which happened to you by accident by the kind people of #clojure. I'm sure that if you manage to get some other posts on the frontpage of HN, they'll be just as popular.
6:00 LauJensen: fliebel: Naah I haven't heard about them
6:00 But yea, it was definitely lifted by #clojure
6:01 fliebel: raek: defnitely!
6:09 jave: load-file doesnt seem to be very good in a program, why is that?
6:09 I wanted to load and eval a config file
6:13 Raynes: (doc load-file)
6:13 clojurebot: "([name]); Sequentially read and evaluate the set of forms contained in the file."
6:13 Raynes: It seems to do the trick.
6:14 LauJensen: As long as a hacker cant get to the config file, otherwise you're in a lot of trouble
6:15 Raynes: LauJensen: Couldn't a hacker just as easily modify the code of the Clojure application itself, assuming it isn't AOT compiled?
6:16 LauJensen: 'assume'
6:17 Raynes: People rarely AOT compile their code. At least, I thought.
6:17 If you say 'thought', I'll come to Denmark and hunt you down.
6:17 LauJensen: 'hunt'
6:17 Raynes: :-)
6:17 LauJensen: On some projects, its not an option to deploy with the source
6:18 Raynes: Fair enough.
6:18 esj: and some java interop requires AOT
6:18 Raynes: It still isn't that common.
6:18 esj: yeh - izza pain in the bum
6:19 Raynes: Most of what I've seen AOT used for in open source projects is for a main class for executable jars.
6:19 There is a ticket to add a parameter to clojure.main to do something similar without AOT.
6:20 I was hoping it would get into 1.2.
6:20 LauJensen: Raynes: You can do it yourself with Cake
6:21 Raynes: I'm not surprised.
6:21 Cake is pretty impressive.
6:22 LauJensen: Yes Im thorougly impressed by it myself
6:22 And I dont even think I can spell that
6:22 Raynes: throughly?
6:23 LauJensen: yea
6:23 esj: i missed cake - that looks truly nice
6:23 Raynes: I've been using it for a while.
6:23 LauJensen: esj: The way it handles task dependencies is übercool
6:23 Raynes: I was actually supposed to work on lowering memory usage in that thing a bit tonight. I forgot about it. ._.
6:23 LauJensen: So you can extend 'compile', 'uberjar' etc
6:23 Raynes: Just buy more RAM
6:24 esj: that's really nice.
6:24 Raynes: LauJensen: RAM is costly on VPSs.
6:24 esj: I'm currently committed to learning Maven properly. One build tool at a time :)
6:24 Raynes: They're going to switch to Ivy in cake soon.
6:25 LauJensen: esj: After that you should really learn QBasic as well, that another outdated technology
6:25 And then maybe... maybe try Pascal, the DOS version
6:25 Thats awesome too
6:25 esj: LauJensen: this is a fair point
6:25 Raynes: LauJensen: What about FORTRAN?
6:25 LauJensen: True, you cant learn Maven and not Fortran
6:25 bobo_: except, maven isnt awesome
6:25 * esj actually has some consulting work in Fortran currently. No jokes
6:26 esj: maven is nice because it has an ecosystem
6:26 bobo_: indeed
6:26 esj: so i can get a lot done with it chop-chop
6:26 LauJensen: esj: like a sweathy shoe after a good work-out, it also has a little ecosystem :)
6:26 esj: yummmmmmmm
6:30 noidi: there must be something wrong with me, but I actually quite like maven :)
6:31 I bit the bullet and tried it after reading this article, and after the steep learning curve it's been just fine http://
6:31 esj: noidi: yup, me too.
6:32 LauJensen: Hmm. nice, so you actually get over the 10k lines of XML ?
6:32 noidi: hehe, it's not that bad with nxml-mode :)
6:32 bobo_: my question is just why?
6:32 leinigen is so easy, so much less text
6:33 one good thing with maven is, that you can open the project in netbeans/eclipse/idea, but thats about it
6:33 LauJensen: bobo_: Dont compare with lein, compare with cake
6:34 fliebel: cake?
6:34 clojurebot: cheesecake is delicious.
6:34 LauJensen: I would say Maven would have been my choice for a cross platform build if Cake wasn't around
6:34 bobo_: oh, cake can cross platform?
6:34 LauJensen: fliebel: http://
6:34 bobo_: yea, amazingly simple
6:34 bobo_: i need to stop working, so i have time for everything
6:34 esj: currently I use it because it plays nicely with my CI, repositories etc
6:34 LauJensen: And I have one customer, who requires the build to run on a Windows server, so cake saved me from the XML
6:34 http://
6:35 noidi: well, maven has plugins for pretty much everything
6:35 LauJensen: noidi: cake lets me do tasks in clojure, so I dont need your plugins
6:35 esj: (by repositories, I mean a local binary artifact repo)
6:36 LauJensen: esj: cake is no different, you can also install local artifacts
6:36 noidi: maven vs make-like systems (where you write your own tasks) is like word vs latex
6:36 LauJensen: with a single command, and you dont need to spend 5 minutes writing up the xml documentation afterwards
6:36 noidi: please dont bring MS products into this
6:37 esj: LauJensen: I phrased that poorly, twice. Up late last night. I'm trying to say, Nexus.
6:37 LauJensen: Anyway, if you guys like your XML and you can actually find people who are happy to see you sit there and write out <start></stop> tags all day, Im happy for you, but if you get fed up, try Cake :)
6:38 fliebel: LauJensen: So Cake is like Nailgun for Leiningen? (they should add that to the thisisforthat site)
6:38 esj: LauJensen: I absolutely will, of course. But Maven does currently scratch my itches.
6:38 LauJensen: fliebel: thats part of it
6:39 Another big part is the gem based install, another is their unique way to handle tasks and dependencies
6:39 noidi: I pretty much only modify my pom.xml manually when adding a new dependency
6:39 LauJensen: But ready the github page, they did a good job of documenting
6:39 noidi: and even then I copy and paste the <dependency> tag from a web page, so it's really not painful
6:39 LauJensen: -y
6:39 fliebel: LauJensen: Strange thing to write a Clojure package manager in Ruby...
6:40 LauJensen: fliebel: Not strange at all. Its an expressive cross platform language
6:40 Makes a lot more sense than bash
6:40 fliebel: LauJensen: How about another nice language called Clojure? :P
6:40 LauJensen: fliebel: Most of it is written in Clojure
6:41 its the bootstrap and install stuff thats in ruby
6:41 noidi: I was just about to say that dismissing Maven for XML is like dismissing Cake for being written in Ruby ;D
6:41 LauJensen: the same stuff thats in bash for lein
6:41 fliebel: LauJensen: Make sense… Ruby is strange though, tried to learn it yesterday…
6:41 LauJensen: strange? its like python just with more syntax :)
6:42 python is like PHP, just with less dollar signs :)
6:42 PHP is like a ... a free ride when you're already late? :)
6:42 noidi: the biggest difference between Python and Ruby are the cultures
6:42 fliebel: Clojure is like Ruby, only with more parens, and IMMUTABLE stuff!
6:42 noidi: I prefer Ruby as a language but Python as a development cultrue :)
6:44 fliebel: Actually, Clojure is the anti-Ruby, is Armageddon nearby?
6:44 LauJensen: Ive always found Python to be the most clean language of the two
6:44 mrBliss: Clojure is also a ****load faster than Ruby and Python
6:44 LauJensen: mrBliss: Naah, I dont think we can keep up with Python
6:44 noidi: mrBliss, for long running tasks yes, but for things like the cake launcher, the startup cost of the JVM is prohibitive
6:45 LauJensen: noidi: not even for long running things, Python is blazing
6:45 fliebel: Nailgun?
6:45 LauJensen: and mutating is a lot faster than path copying
6:45 mrBliss: show me some benchmarks
6:45 LauJensen: http://
6:45 noidi: well, start a hello world in python and clojure
6:45 :)
6:45 mrBliss: but without the startup time
6:45 LauJensen: At the bottom, someone contributed a very nice Python solution, which blew all the other languages out of the water
6:46 I saw several attempts in F#, but ultimately nobody could produce a working program
6:46 noidi: + Ruby and Python have loads of modules to make shell scripting type of stuff easy
6:47 I think Ruby is just about the best choice for writing the launcher for a cross-platform Clojure build tool
6:47 AWizzArd: It seems python and ruby are supported natively on Android.
6:47 LauJensen: noidi: agreed
6:48 noidi: it would be a with Python, but the default Ruby install comes with Gems and Python's Setuptools need a separate install :)
6:48 AWizzArd: While Clojure can be introduced through some other ways. But it will run without jit and might not be very fast. Hopefully this will change soon.
6:48 noidi: *would be a tie
6:49 cemerick, I just linked to your article about building Clojure projects with Maven. Thanks for writing it, I've been a happy Maven user since reading it 5 months ago :)
6:50 cemerick: glad to hear it :-)
6:50 mrBliss: I'm not talking about the best choice for a build tool, but Clojure is faster than Python.
6:50 http://
6:50 You could say clojure is 1.5~3x slower than Java
6:51 noidi: I think the more relevant question is "is this language fast enough for my use case"
6:51 and 90% of the time any language will do
6:52 mrBliss: noidi: you're right
6:52 cemerick: alioth numbers are here, so all our questions are answered :-P
6:53 mrBliss: it's only *a* benchmark, but still ;-)
6:54 * AWizzArd thinks that languages can not be fast.
6:54 * esj taps his hat to AWizzArd's clear thinking
6:55 LauJensen: mrBliss: Why do you keep saying that Clojure is faster than Python?
6:56 AWizzArd: LauJensen: he is talking about specific implementations of those langs, not the langs themselves
6:56 LauJensen: Ok
6:56 mrBliss: Is Python interpreted?
6:57 noidi: yes
6:57 mrBliss: so it is slower than Clojure IMO
6:57 (not talking about the aptness as a build tool)
6:57 esj: no, as LauJensen points out, things like mutabality trump that.
6:58 LauJensen: hehe
6:58 AWizzArd: Tho there are trillions of mutable containers for Clojure too.
6:58 esj: LauJensen: see, sometimes I can agree with you :)
6:59 LauJensen: esj: I know - Every time you're right about something :)
6:59 esj: took the keystrokes right off my fingertips....
6:59 fliebel: So, my super reliable benchmakr says Python is faster than clojure with printing hello world 1000000 times.
6:59 mrBliss: btw Python has the GIL
6:59 fliebel: that's true
6:59 LauJensen: mrBliss: 1) Its being fixed rapidly, 2) You dont have to use it
7:00 fliebel: Python: 4.7540531158447266 Clojure: 32294.985
7:00 Why this huge difference?
7:00 mrBliss: JVM startup time
7:00 AWizzArd: fliebel: depends on how you measured
7:01 fliebel: Python: timeit.Timer('print "hello world"').timeit() Clojure: (time (dotimes [n 1000000] (println "hello world")))
7:02 LauJensen: The benchmark on my site is good, because you see both numerical crunching, IO and multithreading
7:03 mrBliss: What I'm trying to say is: Java and also Clojure are closer to C/C++ in speed than Python/Ruby/Perl
7:03 LauJensen: I'll try to come up with a faster Clojure version ;-)
7:03 AWizzArd: fliebel: was this really your test? If yes then I don’t understand why this python code writes one mio hello worlds
7:03 LauJensen: mrBliss: Thats just silly
7:03 fliebel: mrBliss: So how do you explain things like JRuby?
7:03 LauJensen: You cant compare the performance of Ruby with Python, they are completely different beasts
7:03 Python is much closer to C++ than Clojure
7:04 mrBliss: JRuby is something different
7:04 fliebel: AWizzArd: timeit defaults to that value.
7:04 mrBliss: LauJensen: Python also closer to C++ than Java?
7:05 LauJensen: mrBliss: In some cases - There's no one answer fits all with benchmarking
7:05 Sometimes Java is faster than C++
7:05 fliebel: LauJensen: Where's the benchmark on your site?
7:05 LauJensen: http://
7:06 AWizzArd: fliebel: what needs to be imported so that I can try your example?
7:06 fliebel: AWizzArd: improt timeit
7:06 *improt
7:06 *i-m-p-o-r-t
7:06 AWizzArd: and for you this runs in 4.75 milliseconds?
7:07 LauJensen: http://
7:07 fliebel: AWizzArd: seconds
7:07 LauJensen: Any idea what these Bevels are that they are using ?
7:18 esj: What do you fine gentlemen use for grids on webpages ? I'm currently use this: http://
7:20 AWizzArd: fliebel: one reason I could think of: does the Python version flush after each print?
7:20 For me (time (dotimes [i 10000] (println "hello world"))) and (time (dotimes [i 10000] (println "hello world") (flush))) take the same amount of time.
7:21 mrBliss: printing to stdout involves interrupts
7:24 noidi: esj, years ago, when I still did web stuff, our designers used this http://
7:25 esj: noidi: merci.
7:25 noidi: ack, ignore that
7:25 I didn't check your link before pasting mine
7:26 I thought you meant this http://
7:26 LauJensen: Does anybody have an exhaustive list of Swing Components with pictures?
7:26 cemerick: esj: I found http://
7:27 noidi: phew, I wasn't the only one who made the same mistake ;)
7:28 cemerick: esj: hah, sorry :-) I don't think of tables as "grids".
7:28 esj: cemerick: :)
7:29 cemerick: esj: In that case, http://
7:29 alienscience: esj: I used the ExtJs grid about a year ago and wasn't impressed
7:29 esj: alienscience: thanks.
7:30 cemerick: Datatables' API is not pleasant, but it's jquery interop makes up for it.
7:30 LauJensen: Thanks for nothing : http://
7:38 AWizzArd: fliebel: Can you please import sys and see if timeit.Timer('print "hello world"; sys.stdout.flush()').timeit() makes any difference?
7:42 fliebel: AWizzArd: sure
7:43 5.3126370906829834
7:44 AWizzArd: ok, so only a mild difference
7:44 fliebel: AWizzArd: I did notice that Python prints one line at a time, while Clojure seems to print random(and smaller?) chunks
7:45 defn: fliebel: I just got your email and wrote a short response
7:45 fliebel: I've been /really/ busy this week, my last week of work at this job, moving to a new apartment, and starting school
7:46 Raynes: Does requiring namespaces with the :reload option have a tendency to build up memory?
7:46 defn: if you give me until Sunday I can respond on basecamp and we'll get started
7:46 fliebel: defn: great :)
7:46 defn: Take as mutch time as you need, but just let me know what's up :)
7:46 defn: I'm excited to have some time to finally commit to it -- this job has been draining me :)
7:46 fliebel: will do! now, time to move a couch!
7:47 fliebel: *gives defn a CouchDB*
7:47 defn: {:couch_location "other apartment"}
7:52 AWizzArd: fliebel: I think this comes from the Buffer that println uses. It contains, say, 1024 bytes, and then flushes, even if one line is not fully written.
7:53 fliebel: AWizzArd: So would it be faster to use other java output functions?
7:55 AWizzArd: I am not sure. If printing is really important one could use a StringBuilder into which one writes the hello worlds and then outputs that one.
7:56 Licenser: morgen
7:56 fliebel: Licenser: Moguh
7:57 Licenser: morgen fliebel
7:57 AWizzArd: fliebel: Probably Javas print methods do a good bit more extra work under the hood, but with some low level optimizations one should be able to reduce the time.
7:58 fliebel: (Licenser: Where are you from?)
7:58 Licenser: fliebel: germany
7:59 fliebel: AWizzArd: Let's focus on more interesting things...
8:00 Licenser: Ah, I was hoping I had found another Dutch Clojurer. Well, it's at least the same continent.
8:01 Licenser: Ah you're not that far away fliebel ;)
8:01 mrBliss: fliebel: I'm from Belgium!
8:02 * AWizzArd lives very close to the Netherlands (Maastricht) and Belgium (Liège)
8:02 fliebel: mrBliss: Even closer, language-wise :)
8:02 mrBliss: inderdaad
8:03 fliebel: *having thoughts about Clojure conferences and stuff*
8:05 Licenser: the conference is too far away :(
8:05 even so I'd love to go
8:05 fliebel: where is it?
8:05 citizen428: and i'm from austria. we should have a clojure conf somewhere around here :-)
8:06 fliebel: yea...
8:06 Licenser: fliebel: in the US
8:06 fliebel: Okay, lets do an EU conference! :)
8:07 Licenser: that I'm all for, we thought about doing something in germany already
8:07 lets come all to berlin :P it's a nice place
8:09 fliebel: Sure :)
8:10 Or how about Loenen? It's a bit small, but I know a school we could use :)
8:11 bobo_: we all know stockholm is the best place in europe
8:11 fliebel: uh… oh… really? Well, fine with me :)
8:11 Licenser: bobo_: berlin is!
8:12 bobo_: :-p
8:12 noidi: berlin's awesome :)
8:12 bobo_: berlin is probably the only town in germany i havent been in
8:13 fliebel: bobo_: So how can you teel stockholm is better?
8:13 bobo_: i live here?
8:14 fliebel: then Loenen is equally good, if not better, because I live here and we have the highest waterfall of the whole netherlands, which is a good laugh.
8:14 bobo_: how big is it? =)
8:15 fliebel: bobo_: I think I'm the only Clojure programmer who lives here, and the same is probably true for a lot of things.
8:15 But thuse I'm also the best Clojure programmer in town :)
8:15 Licenser: fliebel: 2 meters?
8:15 and I thought rick lives in the US
8:16 fliebel: Licenser: I'm about to fin out… we have NBS to keep track of those things.
8:16 Licenser: NBS?
8:16 Netherland Broadcasting Service?
8:17 fliebel: CBS… Central office for statistics
8:17 Licenser: Oh
8:18 well but yes we should do it in Loenen, might be the last chance before it gets flooded :P
8:18 so on the other hand, yes we should really do a european clojure conference
8:19 fliebel: There's 8000 people in Loenen I think.
8:19 Licenser: Yea, we should :)
8:19 Licenser: yes but it is in the netherlands, you all will get flooded
8:20 fliebel: Licenser: Not in Loenen, we're on top of a hill, at least 4m above sea :D
8:20 Licenser: Oh cool, then we might not have to do it there and can stay in Berlin :P
8:23 fliebel: Licenser: Okay… Will you organize everything?
8:23 Licenser: given it happens when I am actually in Berlin I'd be glad to help :)
8:24 bobo_: i could most likely help asweel, whatever i can do from sunny sweden that is
8:24 raek: count me in too!
8:24 (+ what bobo_ said)
8:24 fliebel: bobo_: That sunny part sounds good, maybe we should do it in sweden? Only rain down here...
8:24 Licenser: wow sweedish clojurans
8:25 bobo_: Licenser: there are loads of sweedish clojurans!
8:25 fliebel: I only know sweedish cooks :)
8:25 Licenser: *snickers*
8:25 bobo_: about 15-20 people attending the stockholm clojure user group!
8:25 Licenser: I envie you bobo
8:26 AWizzArd: Licenser: soon we will manage this in Germany too :)
8:26 Licenser: AWizzArd: I hope
8:28 fliebel: Awesoe, didn't know that..: http://
8:29 But yea, I also want to help + what bobo_ said
8:30 krl: Licenser: there's been some berlin lisp meetings with clojure involved
8:31 Licenser: I know there was one but I wasn't aware they were frequent
8:31 krl: well. they're not very frequent :)
8:31 Licenser: krl: you're from berlin?
8:31 krl: yeah
8:32 or, i live there rather :)
8:32 Licenser: wooh a neighbour
8:32 same thing, once you arrive here you get assimilated
8:32 krl: Licenser: http://
8:33 a bit dead
8:33 Licenser: nice thanks :)
8:33 berlin also has a erlang community I learned recently
8:34 krl: next meet should be 7th sep
8:34 fliebel: So, krl, Licenser, When's the first EU Clojure Conj?
8:35 alienscience: An EU Clojure conj would be supercool - I'm in Nuernberg
8:35 Licenser: good question, I'd say after the US one, we should not bundle them too tightly ^^
8:36 raek: is it ok to use a -jure name if you came up with it before technomancy's leiningen patch that prohibits it? :-)
8:36 fliebel: Good :)
8:38 Licenser: raek: you can stil do them just o lein new blajxre and then rename it :P
8:39 fliebel: Licenser: Or we do it at the exact same time, so we can have live video from one continent to the other, :D
8:39 Licenser: nah that would be taking away people to go to the US not sure if that is good
8:39 fliebel: okay
8:40 raek: I know... but will people get angry if I do it? :-7
8:41 alienscience: raek: I think it would be cool. From what I understand the jure thing wasn't done in that much seriousness.
8:42 If you really wanted some fun you could right a newjure plugin for leiningen
8:42 s/right/write/
8:42 sexpbot: <alienscience> If you really wanted some fun you could write a newjure plugin for leiningen
8:43 Raynes: Or use cake.
8:46 esj: Raynes: wait ! I know the answer to this one :)
8:55 cemerick: technomancy: I'd be interested to hear what you have to say on this topic: http://
8:56 raek: is there anything like clojure.string/blank? that uses Character/isSpaceChar instead of Character/isWhitespace?
8:57 raek: focus on the *real* problem. there isn't time to be a Unicode perfectionist all the time...
10:44 pdk: ,(/ 1280 720)
10:44 clojurebot: 16/9
10:45 pdk: ,(/ 384 224)
10:45 clojurebot: 12/7
10:52 _na_ka_na_: hey guys I have a question regarding clojure transactions.. suppose i have.. (dosync (when (= val @aref) (alter aref ...))) .. will clojure hold the lock on aref even if (not (= val @aref)) ?
10:53 I want compare-and-swap kind of semantic for aref
10:53 it has to be ref only . .can't use atom ..
10:55 kumarshantanu: any counterclockwise user here? I need to understand how auto-reload works
10:56 _na_ka_na_: i am
10:57 kumarshantanu: _na_ka_na_: the auto-reload feature is new in 0.62, which I don't understand how to use: http://
10:57 lpetit: Hi there
10:57 _na_ka_na_: Maybe I can help
10:57 _na_ka_na_: ofc lpetit :)
10:57 lpetit: what's the question exactly ?
10:58 _na_ka_na_: i'm still at 0.0.60 ..
10:58 kumarshantanu: lpetit: how can I run a file with auto-reload ON?
10:58 I am doing some web developoment using compojure, and need auto-reload to be ON
10:58 lpetit: you cannot
10:58 you must start the Clojure JVM from the project's node.
10:59 kumarshantanu: lpetit: when I run (use 'my.ns) in the repl, it works
10:59 lpetit: You should see the builder do its stuff in the background, and all your namespaces will have been loaded for you in the Clojure VM
10:59 kumarshantanu: lpetit: ah okay
10:59 _na_ka_na_: lpetit: are you not making release announcements anymore? i didn't even get a 0.0.60 release notice
11:00 lpetit: I've set the defaults along this rationale: you start the CVM (Clojure VM) from the project's node = you are in "project mode" => auto reload is ON. You start from anything else (specific file, specific editor) => auto reload is OFF.
11:01 kumarshantanu: lpetit: so, do I need to (use 'my.ns) in the REPL to actually run my project?
11:01 lpetit: _na_ka_na_: you're right. 0.0.60 was shipped ~ 10 minutes before I went to holidays => quick release, no announcement. And 0.0.62 (I skipped by error a version number) was lazily shipped without release announcement. but I'll start again with good habits, I promise
11:02 kumarshantanu: if you're doing "select the project node" > trigger the contextual menu > Run as Project Clojure VM, then no
11:03 _na_ka_na_: lpetit: okay - i stumbled upon 0.0.60 by mistake .. when installing ccw on my friend's m/c ..
11:03 lpetit: kumarshantanu: if you're doing "select myproject/src/my/ns.clj" > trigger the contextual menu > Run as Clojure VM with specified file loaded, then no. (but then you won't have auto-reload)
11:03 kumarshantanu: lpetit: I got it, thanks
11:04 lpetit: it's awesome
11:04 lpetit: kumarshantanu: if what I said above doesn't work for you, then there's a bug somewhere :)
11:05 kumarshantanu: lpetit: it's working fine (project mode)
11:05 lpetit: feww :)
11:06 kumarshantanu: lpetit: I understand the project mode loads all namespaces (and keeps reloading)...is that right?
11:06 lpetit: yes
11:06 from the project > you want to load the project. And auto-load makes sense since you wanted to load everything at startup
11:06 _na_ka_na_: ooh 0.0.62 has cntl+click .. nice .. i've to check it out!
11:07 lpetit: from the file > you want to load the file, but just the file. auto-load as a default makes less sense, so it's off.
11:07 kumarshantanu: lpetit: that's terrific for interactive development -- I am using compojure and ring-jetty-adapter and I can add routes dynamically and do whatever and it gets reflected on the browser
11:08 lpetit: kumarshantanu: you're on the side of people who like to save and forget -as I generally do- :)
11:08 _na_ka_na_: and "documentation hover" is around the corner, 75% done locally :)
11:09 _na_ka_na_: ctrl+click is pretty young feature, please test and report issues :-)
11:10 _na_ka_na_: lpetit: even though i would love to help with development of ccw .. i only have 24 hours in a day :( ... why don't you make a way so people can donate for ccw!
11:11 lpetit: _na_ka_na_: mmm, let's me think about it :)
11:13 _na_ka_na_: lpetit: btw i'm 'ka' who responds on ccw google groups (if you remember)
11:14 lpetit: oh yes, ok. If you change your nicks for every channel, it'll be difficult to follow :)
11:14 kumarshantanu: lpetit: with all these features the CCW version can be easily bumped to 0.1 (if not higher) :-)
11:15 _na_ka_na_: kumarshantanu: maybe lpetit wants to remain modest :P
11:15 kumarshantanu: 0.0.62 is injustice to the current CCW feature set
11:16 _na_ka_na_: do you know any people who think - oh its not even 0.1 ? i wont use it ?
11:17 kumarshantanu: _na_ka_na_: not really; even I have been using CCW since its early clojure-dev days
11:18 lpetit: kumarshantanu: I'm currently following the simple idea of correctly identifying versions. And since I do not intend to have several maintenance branches, it works just well. Insisting on just growing one number tries to make it clear that the number for itself means is nothing more than an identifier.
11:19 But you're right, someday I'll switch to the classical 0.65.0 so that it's easier to spot bugfix-only releases from feature(+possibly bugfix) releases
11:19 _na_ka_na_: lpetit: one suggestion .. can we have indent whole block .. i.e. I select a block and press tab or cntl+I .... it would be really useful
11:20 currently it works only line by line
11:20 lpetit: _na_ka_na_: I know that :)
11:20 _na_ka_na_: it's in my head already. If you want to add it as a separate entry in the issue tracker, you're welcome
11:22 _na_ka_na_: lpetit: its coz my project partner uses emacs with some wierd config ... which messes up the whole indentation for me (introduces tabs etc.) .. but it looks just ok on his emacs .. then i have to do it line by line
11:22 i like that ccw has a single policy .. only 2 space config by default
11:22 lpetit: i'll add to issue tracker
11:23 lpetit: _na_ka_na_: it's as it is partly because it's opinionated, partly because of lack of time for making it configurable :-p
11:23 _na_ka_na_: lpetit: that's ok, but the default shouldn't change from 2 spaces .. :)
11:25 kumarshantanu: lpetit: _na_ka_na_ wants <Ctrl+Shift+F> (under "Source" menu in Java files) implemented it seems ;-)
11:25 for Clojure that is
11:26 lpetit: huh ? I thought I had disabled this feature ...
11:26 _na_ka_na_: lpetit: he means similar to the java one
11:26 lpetit: no it won't be "format block", but probably "reindent block"
11:26 at least in a first release
11:26 _na_ka_na_: ya I want re-indent block
11:26 simard: what should I use as an array in clojure ? say I want to code... conway's game of life..
11:27 lpetit: So it will be Ctrl+Shift+I I guess
11:28 _na_ka_na_: lpetit: I would also like code formatters like present for java projects :)
11:28 lpetit: But I intend to make "indent line" more powerful first: it will not indent the line, but also all the children of the first form of the line, and also all the following siblings (and recursively the children of the siblings ...)
11:30 _na_ka_na_: lpetit: I'm not sure if that's a good thing .. coz some people might like to indent only one line ..
11:30 lpetit: I'm getting ... Project Hosting is currently READ-ONLY for network maintenance.
11:31 lpetit: maybe you can keep separate shortcuts .. tab/cntl+I for one line .. cntl+shift+I for a form
11:32 lpetit: _na_ka_na_: interesting, cntl+shift+I with no selection could have the above described behavior , indeed
11:33 _na_ka_na_: yup
11:33 lpetit: _na_ka_na_: I was in fact more thinking about auto-indent when adding a newline. I then almost always wish that it reindents correctly the sibling forms
11:34 _na_ka_na_: lpetit: maybe this .. keep separate shortcuts cntl+I (one line), cntl+shift+I (form) ... and make tab configurable either ident off or cntl+I or cntl+shift+I .. :D
11:40 anyone answer my aref question from above?
11:42 lpetit: _na_ka_na_: it's sometimes pleasant to be able to be the person with the final choices in his hands :-)
11:42 _na_ka_na_: :)
11:43 lpetit: only sometimes though :)
11:43 lpetit: :)
11:44 _na_ka_na_: one of the ted video is about this, I'm forgetting which one
11:56 arkh: is the syntax to dereference something in a defrecord '(deref (:thing record)))' ?
11:58 lpetit: arkh: sure. Think incrementally: record -> (:thing record) -> and if it is a ref, then just call deref / @
11:59 arkh: so this is ok too? @(:thing record)
12:01 ,(let [sth {:keyword (atom true)}] (prn @(:keyword sth)))
12:01 clojurebot: true
12:01 arkh: I guess I just hadn't seen that syntax before. lpetit: thanks
12:02 _na_ka_na_: lpetit: any remote chance your team works on #134 next ?
12:03 lpetit: Now is time to explain me what exactly #134 means. I'm not totally sure to know what the command does (I have several conflicting ideas in my mind)
12:04 OK, I've got it.
12:04 Little chance for it to be next
12:05 _na_ka_na_: hmm
12:05 lpetit: sorry :-(
12:05 _na_ka_na_: no prob .. I'll just keep on searching for the var in the project till then
12:06 lpetit: maybe you can answer my aref question from above, noone else seems to be around
12:07 lpetit: _na_ka_na_: I didn't see it, maybe you posted id before I connected
12:07 _na_ka_na_: suppose i have.. (dosync (when (= val @aref) (alter aref ...))) .. will clojure hold the lock on aref even if (not (= val @aref)) ?
12:07 yes i did
12:07 technomancy: cemerick: specifically about alt. swank clients? it was discussed and decided against in the past because swank-clojure was GPL'd, but I relicensed it to EPL, so it's an option. the gain would be iffy though if you're porting slime.el anyway; I wouldn't be surprised if it were easier to start from scratch.
12:07 _na_ka_na_: I want compare-and-swap kind of semantic for aref
12:08 technomancy: there's lots of baggage in the slime protocol; just steal the interesting bits from swank-clojure without taking the whole protocol with it
12:09 cemerick: technomancy: Thanks. That's basically where I've landed as well.
12:09 hiredman: _na_ka_na_: the stm is implemented using locks, but they are transactions
12:09 don't worry about locks being held
12:10 they are not some thin facade over locks
12:10 cemerick: I'd fundamentally like to see *all* Clojure environments using the same REPL backend, but that probably won't gain a lot of traction with the emacs crowd. :-)
12:10 _na_ka_na_: hiredman: that's right, I'm only asking if my code from above has compare-and-swap sematics
12:10 hiredman: no, you asked if a lock was held
12:10 technomancy: cemerick: I'm no fan of maintaining swank-clojure myself... but it's slightly easier than writing a bunch of brand-new elisp.
12:10 _na_ka_na_: hiredman: ok sorry I put my question wrongly
12:11 hiredman: transactions as a whole are compare and swap
12:11 technomancy: cemerick: once emacs is a clojure compilation target we can talk.
12:11 cemerick: heh
12:11 technomancy: surely there are the requisite hooks in slime to swap out the underlying protocol being used?
12:11 hiredman: if the value of a ref touched by the transaction has changed by the commit point of the transaction the transaction is retried
12:12 technomancy: cemerick: I doubt it, though it would probably be feasible to lift certain portions of UI code wholesale.
12:13 elisp doesn't really have a strong engineering culture to say the least; there's no notion of modularity or componentization.
12:13 cemerick: heh, yeah, I figured that one out ;-)
12:14 technomancy: kind of like JS in that regard; it's mostly just used for building UIs and talking to things that are smarter than it is.
12:14 cemerick: In any case, my current goal is to make sure that at least ccw and enclojure are using the same REPL library.
12:14 Even that is turning into more of a project than I thought though :-)
12:15 At the moment, I'm tempted to chuck it all and just have every server running on top of jetty.
12:15 technomancy: what's the draw of HTTP apart from being able to get around firewalls?
12:16 I don't really see myself using anything but SSH for remote repls.
12:18 cemerick: managing protocols is a crummy way to spend one's time. With HTTP, at least the wire is taken care of for us.
12:19 arkh: any recommendations on a simple db for use with clojure? I know there's quite a few options out there. My goal is fast implementation. K/V store vs. SQL doesn't matter. Performance is secondary right now.
12:20 cemerick: That said, basic auth + SSL so that ssh could be avoided for many things would be very convenient.
12:20 hiredman: arkh: http://
12:20 arohner: arkh: mongodb, congomongo
12:20 cemerick: Using HTTP introduces nontrivial dependencies though, which will be a problem for people.
12:20 Anyway, we'll hopefully come to some agreement over the weekend, etc.
12:21 _na_ka_na_: hiredman: suppose the when part of code is running in one thread (T1) with val=15, it derefs aref and gets 10 .. now it starts making comparison .. at exactly the same time parallelly in another thread value of aref is updated to 15 (committed) .. in this case the transaction in T1 wont get re-started
12:21 lpetit: cemerick: plain socket. ssh tunneling with keys for people wanting to do so
12:21 mrBliss: _na_ka_na_: look at (doc ensure)
12:21 cemerick: lpetit: Sure, ssh isn't always a problem, but when it's a problem, it's a *big* problem.
12:21 hiredman: _na_ka_na_: it will be if the ref is ever written to or as mrBliss suggests ensured
12:22 cemerick: In any case, avoiding ssh is hardly my tenth reason to be considering HTTP. *shrug*
12:22 _na_ka_na_: mrBliss: that's exactly my question is ensure necessary for compare-and-swap semantics for ref?
12:23 lpetit: cemerick: do you imagine things other than clojure clients connecting to the future repl server ?
12:23 _na_ka_na_: (dosync (when (= val (ensure aref)) (alter aref ...)))
12:23 is this necessary?
12:24 lpetit: cemerick: if not, then "HTTP the standard" does not buy a lot if along with the serverrepl a full clojure IDE-free dependency free client is shipped.
12:24 cemerick: lpetit: Who knows? Not requiring Clojure on the client side wouldn't be a horrible thing, certainly. Consider ajaxy calls into a sandboxed REPL server running over HTTP...
12:24 lpetit: cemerick: any clojure implementation from dot net to javascript .. would then be able to connect to your server, and "HTTP the standard" becomes an implementation detail again.
12:24 mrBliss: _na_ka_na_: I think so, or you could use alter
12:24 clojurebot: alter is always correct
12:25 lpetit: cemerick: you're right
12:25 cemerick: lpetit: There's no such thing as a "pure clojure" implementation of a wire protocol. You're always going to be touching the host for stuff like DataOutputStream et al.
12:25 lpetit: how did I miss that one
12:26 cemerick: That's probably reason #2 for HTTP IMO. :-)
12:26 Everything with an HTTP client API can play.
12:29 lpetit: let's introduce some engineering in it: split the server code so that the serving protocol is interchangeable. HTTP when the project affords to add jetty dependency or even servlet-based service, something simple based on sockets.
12:29 cemerick ^^
12:30 hiredman: if you are doing that you may as well just use the socket version and have a jetty based client
12:31 cemerick: lpetit: just to avoid the dependency?
12:31 hiredman: a jetty-based *client*?
12:31 i.e. invert things like X does?
12:31 KirinDave: cemerick: I had a crazy idea last night in the gym shower. Rest easy, it did not involve anatomy.
12:32 cemerick: What if we...
12:32 cemerick: *wait for it*
12:32 hiredman: cemerick: the socket server for everyone and a client for the socket server that translates it to http
12:32 KirinDave: cemerick: Used thread locals and exceptions and some additional syntax to implement conditions and restarts?
12:32 lpetit: cemerick: it's probably not hard to create a protocol agnostic interface for a message-based "abstract" protocol. Then all the intelligent feature is behind the interface, and the real server part is configurable
12:33 cemerick: KirinDave: as in, error-kit?
12:33 KirinDave: cemerick: Does error-kit go all the way though?
12:33 And register them?
12:33 cemerick: oh, you mean with slime? No idea, I don't do emacs. :-)
12:34 KirinDave: No
12:34 I mean internally
12:34 Yeah I don't think error-kit is quite where I wanted to go.
12:34 Anyways, I'll POC after my wedding and show it to you.
12:34 i think we can do everything
12:35 lpetit: cemerick: I've thought about inverting things and make ccw the server and the remote VM the client. But I don't believe in it.
12:35 SirNick: What happens if you put a (defmacro) inside a (defn) and call the defined function? Wouldn't that require macro expansion and compilation at runtime?
12:36 lpetit: cemerick: Not sure why I came to that conclusion, though. Maybe something to do with the fact that then remote VM has the responsibility to maintain the connection.
12:36 cemerick: and it seems "silly" to expect some google app engine based application try to connect to my eclipse inside my enterprise :)
12:37 cemerick: hiredman: I think you just took all the usefulness of HTTP out of the mix :-)
12:37 SirNick: (hopefully that didn't send multiple times. I was having some connections problems)
12:37 cemerick: feh, stupid wifi
12:37 hiredman: I think you just took all the usefulness of HTTP out of the mix
12:37 (not sure if that one got through)
12:38 lpetit: it did
12:38 arohner: does anyone have slime-tramp working, so you can C-c C-l files on a remote box?
12:38 lpetit: SirNick: it won't
12:39 SirNick: lpetit: It wont require macro expansion and compilation, or it wont work?
12:39 cemerick: lpetit: the handy thing about jetty as far as ccw is concerned is that it's already in eclipse :-)
12:40 lpetit: SirNick: not totally sure about the details, but it will macro expand, evaluate. During evaluation, fns are compiled. Calls to def are immediately emitted
12:40 cemerick: which Eclipse :)
12:41 cemerick: lpetit: in mine, anyway :-) I thought it came with the platform all the time?
12:42 lpetit: cemerick: maybe, I don't know. I wanted to spot that it may be an internal detail of Eclipse.
12:47 cemerick: while I understand your wish to use HTTP, I would really like to keep it optional and have most simple protocol socket based . e.g. the command is one clojure sexp as a string (of course!), doubled by the length of the string. This can translate easily to an HTTP POST later. And the rest of the server code does not know about this and just receives the clojure sexp. I have made the server response in serverrepl.clj a litt
12:49 oh, we lost cemerick
12:52 cemerick: did you see my last message ?
12:52 cemerick: while I understand your wish to use HTTP, I would really like to keep it optional and have most simple protocol socket based . e.g. the command is one clojure sexp as a string (of course!), doubled by the length of the string. This can translate easily to an HTTP POST later. And the rest of the server code does not know about this and just receives the clojure sexp. I have made the server response in serverrepl.clj a litt
12:52 jfields: is there anything in clojure like: (defn +? [& more]
12:52 (apply + (remove nil? more)))
12:53 i keep encountering this situation where I want to (update-in m [k1 k2] + 14) and it always fails if there is no current value.
12:53 lpetit: (doc fnil)
12:53 clojurebot: "([f x] [f x y] [f x y z]); Takes a function f, and returns a function that calls f, replacing a nil first argument to f with the supplied value x. Higher arity versions can replace arguments in the second and third positions (y, z). Note that the function f can take any number of arguments, not just the one(s) being nil-patched."
12:54 lpetit: ,(update-in [] (fnil + 0) 14)
12:54 clojurebot: java.lang.UnsupportedOperationException: nth not supported on this type: core$fnil$fn__5585