#clojure log - Jul 06 2011

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

0:02 dnolen: cemerick: Racket folk don't seem to really have much against Clojure from what I can tell. Lots of possibilities for idea cross-pollination there.

0:03 cemerick: I agree. Schemers have always seemed to be friendly, level-headed people.

0:03 dnolen: cemerick: Racket, not Scheme :) Schemers I'm not so sure about :D

0:03 * cemerick swears by stereotypes

0:03 cemerick: yeah, yeah :-)

0:04 I never did catch up on the full Racket/Scheme "split".

0:04 dnolen: cemerick: it's significant. Racket has basically moving on doing it's own thing.

0:05 Scheme is still obssessed w/ the minimalism that makes it crippled for real programming.

0:05 cemerick: dnolen: looks like it's R6RS+++++?

0:06 dnolen: cemerick: nah, to me Racket is the Haskell of Lisps. Very academic, filled w/ cool ideas people should steal into their own langs.

0:07 pcavs: dnolen: Wouldn't scheme be the Haskell of Lisps?

0:07 Racket has a lot of pragmatic features I thought? That's what made it so appealing

0:07 C-M-% made makes

0:08 dnolen: pcavs: no, Haskell is a crazy hack, no standard, practical bits but still academic. Racket seems similar to me.

0:09 Scheme is all about standardization, some truly beautiful ideal which will never be attained and will most likely become obsolete (like Standard ML)

0:09 pcavs: dnolen: interesting, I haven't played around much with Haskell, closest I've come to it is SML-NJ

0:10 dnolen: Scheme is much more like SML-NJ

0:10 sean_corfield: today has been a very happy clojure day :)

0:10 pcavs: dnolen: I really liked SML-NJ, it was a lot of un

0:11 dnolen: pcavs: oh yeah it totally rules, just pointing at that standardization kills languages.

0:11 again and again.

0:12 pcavs: dnolen: I dislike that there isn't as much as an advantage to a business for devs to be writing clean beautiful code, rather than 80% working code faster...worse is better

0:13 hiredman: getting agreement to what is beautiful for a practical program from a team is almost impossible

0:14 pcavs: hiredman: true...

0:14 dnolen: pcavs: yeah but the problem is the Worse Is Better / Better is Better isn't something that stands still. What was Better before is not Better now.

0:14 pcavs: hiredman: I was just reading teach yourself scheme in fixnum days, and the call/cc examples with tree-gen and amb operator are just beautiful

0:15 hiredman: pcavs: ok, what real world problem will it solve?

0:15 does it log each step, is it transactional, etc, etc

0:16 how robust is the error handling?

0:16 pcavs: hiredman: Absolutely None! But boy is it sexy. Maybe it should be called code porn

0:16 hiredman: does it

0:16 erp

0:16 pcavs: it's like code golf, in that it isn't practical, but it's sure fun

0:16 sean_corfield: dnolen: as someone who spent eight years on the ANSI C++ Standards Committee, i'm a bit put out that you think so poorly of standardization...

0:18 dnolen: sean_corfield: ah, for lower level systems programming languages no I don't think so poorly of standardization. Though it's not like C++, C ever really delivered on the run everywhere promise ever.

0:19 it's like JavaScript, death by a million paper cuts.

0:19 sean_corfield: ECMA...

0:19 ok, i'm (somewhat) mollified :)

0:23 cemerick: 'course, it's hard to not notice that the most entrenched languages with the widest distribution are those that have been aggressively standardized, with an obsession with backwards compatibility

0:30 Raynes: Did dnolen say that Haskell isn't standardized?

0:31 I'm pretty sure it is.

0:31 And damn if wikipedia doesn't agree with me.

0:31 I'm kind of sad that he isn't here for me to correct him. I hate it when someone is wrong on the internet.

0:34 amalloy: Raynes: i think sexpbot has a $mail feature

0:34 Raynes: That would be rude.

0:38 pcavs: Raynes: Thinking of this? http://xkcd.com/386/

0:38 technomancy: someone with a facebook page want to tell me what this is all about? http://www.facebook.com/pages/Leiningen-Versus-the-Ants/103110463062611

0:38 *facebook account

0:39 hiredman: it's just a page about the short story

0:39 technomancy: "about"?

0:39 this isn't wikipedia

0:39 hiredman: like the wikipedia page but somehow part of facebook's "social graph" or something

0:40 infact

0:40 technomancy: like for people to announce that they are fans of certain works of short fiction?

0:40 hiredman: the bottom of the page as a footer:

0:40 pcavs: techomancy: Facebook's endgame is the same as AOL's

0:40 hiredman: Description above from the Wikipedia article Leiningen Versus the Ants, licensed under CC-BY-SA full list of contributors here. Community Pages are not affiliated with, or endorsed by, anyone associated with the topic.

0:40 s/as/has/

0:40 technomancy: hah

0:40 hiredman: yes, exactly that

0:40 technomancy: and this story has no fans? what is wrong with kids these days?

0:41 oh wait, it does have fans

0:41 I just can't see them because I'm not logged in or something. whew.

0:41 excellent. carry on, Internet.

0:42 hiredman: 28 people

1:16 pcavs: is there a letmacro ?

1:16 for a scoped macro?

1:22 cemerick: like symbol-macrolet?

1:23 if so, no

1:38 technomancy: I wonder if it's still worth mentioning inf-lisp on the Getting Started with Emacs in confluence

1:38 sritchie: is it considered bad form to write a function like (defn illegal-args [str] (throw (IllegalArgumentException. str))) ?

1:38 since the error's thrown from this new function

1:39 hiredman: sritchie: depends, not everyone nows how to read a stacktrace

1:40 symbol-macrolet seems more like a scoped version of ^:const

1:42 well, sort of

1:44 cemerick: I'm afraid I never got that far into CL.

1:46 amalloy: pcavs: clojure.contrib.macro-utils has [symbol-]macrolet

1:46 pcavs: amalloy: cool thanks

1:49 amalloy: pcavs: and amalloy-utils has anon-macro, for if you don't even want to name the macro :P

1:49 pcavs: haha, nice

2:19 sritchie: is there a function like split-with that checks all items in a coll?

2:19 (unweave odd? [1 2 3 4]) => ((1 3) (2 4))

2:20 amalloy: (juxt filter remove)

2:20 sritchie: ah, thanks

2:27 zakwilson: I didn't know Clojure had symbol macros or a way to fake them.

2:28 hiredman: well you just need the ablity to define macros, then you can create a macro that expands its arguments and walks and replaces

2:29 amalloy: zakwilson: ^ is what symbol-macrolet in fact does

2:29 zakwilson: Oh... I should have figured that out. It would be hard to have define-symbol-macro, but symbol-macrolet is obvious now.

2:30 * zakwilson once used symbol-macrolet in production code just beacuse it was there.

8:06 pyr_: hi

8:06 is there any chance a call to an agent within a transaction might get resent ?

8:13 bsteuber: pyr_: no, it's guaranteed to be sent only once

8:20 pyr_: bsteuber: thx!

8:27 bsteuber: how can I make paredit 22 correctly recognize [] and {} when used in the slime-repl?

8:42 ejackson: bsteuber: I use technomancy's durendal which handles it: https://github.com/technomancy/durendal/blob/master/durendal.el

8:42 i think L154 is where it all gets defined

8:44 bsteuber: ejackson: thanks, durendal looks nice

9:37 babilen: Hi, I have a licensing question. Clojure and quite a bunch of libraries are licensed under EPL-1.0, which is incompatible with anything else. Does this essentially mean that I have to license *my* work under EPL-1.0 as well? I'd like to license my work under GPL or BSD, but am not sure about the legal ramifications. And EPL seems to be incompatible with both of them.

9:38 I guess I'll have to license every change to EPL licensed work under EPL, but can incorporate those in BSD/GPL licensed code under GPLs linking exception, or?

9:39 Or does it basically boil down to: If you work with Clojure and use a single EPL lib, I'll have to license my work under EPL too?

9:40 rlb: I'm not sure, but I'd be a bit surprised if you have to license your code (assuming it's not going in to clojure itself) under the EPL.

9:43 babilen: GPL seems to be out of the question, but *I* don't want to license my work under EPL as I find problems like this inherently bad. If I am forced to use EPL as soon as I use any other clojure library (which might just be EPL licensed) I'd probably have to think about the language choice. (citation: http://www.eclipse.org/legal/eplfaq.php#USEINANOTHER)

9:43 clgv: babilen: afair you have to license derivative work under EPL. If you only use EPL licensed libs unchanged you only have to mention you are using them (and maybe how they are licensed) and your software can have a different license

9:44 but if there is money involved you should recheck that and maybe consult a lawyer.

9:45 babilen: it's a bit odd that you fear being forced to use EPL when you want to use GPL which indeed forces lincencees to use GPL... ;)

9:46 babilen: clgv: I basically favour BSD, but work in GPL environments too.

9:46 clgv: Ok, and if I change some of the libs I'll license those changes under EPL and my own work as BSD/GPL and am fine?

9:46 clgv: babilen: I read the EPL stuff and some FAQs last week since I considered using some clojure code unchanged in a commercial product

9:47 babilen: And no, there is no money involved.

9:47 clgv: babilen: yes you have to license the change licensed lib und EPL and provide the source to them, but the rest of your project can be any license - even a commercial one

9:48 s/und/under/

9:48 sexpbot: <clgv> babilen: yes you have to license the change licensed lib under EPL and provide the source to them, but the rest of your project can be any license - even a commercial one

9:49 babilen: I guess that the majority of people working with Clojure just license their work under EPL. This license is a bummer :)

9:49 clgv: hmm I think the EPL is more relaxed than the GPL

9:50 In general I hate this license stuff because you can never be entirely sure without consulting a lawyer

9:50 babilen: It is, but unfortunately incompatible. What I dislike is that it is also incompatible with BSD (or any other license) ... but meh

9:51 xmux: How is the EPL incompatible with BSD?

9:51 babilen: xmux: http://www.eclipse.org/legal/eplfaq.php#USEINANOTHER (I have no other opinion on that)

9:53 xmux: It'll just mean that I have to work with two licenses for the rest of my Clojure life or give in and just use EPL if that becomes to cumbersome.

9:53 xmux: I think that just means you can't take EPL licensed code and release it under a different license. That's the same as *any* other license

9:55 EPL is weakly copyleft so it has some of the same 'disadvantages' as the GPL

9:55 but I believe the intention is to allow you to *link* EPL components/libraries to applications which have any license you want

9:57 babilen: xmux: Ok, but as I know myself I'll soon contribute to projects I am using. That work has to be licensed under EPL in that case. Is most of the stuff on clojars EPL? (I have no numbers about that)

10:01 Thanks for the clarification, i'll read up on it, but wanted some views from the community too.

10:03 dnolen: babilen: my take - EPL for things you think you want to contribute to Clojure, otherwise use whatever you want.

10:04 timvisher: hey all

10:04 what're people using for json at this point?

10:04 I count no less than 3 options at the clojure toolbox

10:04 they all look to be roughly equally maintained

10:06 cheshire seems to have the best docs and the biggest promises. :)

10:27 eliantor: hi everyone

10:31 i get a RejectedExecutionException trying to run futures

10:31 https://gist.github.com/1067356

10:32 and agents never complete submitted actions

10:33 bsteuber: eliantor: leiningen 1.6.0?

10:34 eliantor: bsteuber: yes

10:34 bsteuber: it's fixed in github and should be released soon

10:35 so in the meantime use 1.5.2 or the master version of lein

10:35 eliantor: ok thanks, i didn't know of this bug

10:36 bsteuber: I guess that's the reason why the stable branch got reset to 1.5.2

11:48 shanmu: hi this code errors after printing the first value to the file:(with-open [w (io/writer "t.txt")] (doseq [i '(1 2 3 4) ] (spit w i))) with a file closed error

11:54 timvisher: shanmu: you've run into a laziness issue

11:54 actually, there are a number of issues

11:54 for one, you don't need the whole with-open construct using spit

11:54 spit opens and closes the file stream for you

11:55 are you trying to write 1 2 3 4 on separate lines to t.txt?

11:59 shanmu: timvisher: yes...

11:59 when I tried with .write on writer, it wrote binary data :(

12:05 timvisher: shanmu: ok, what you want is something along the lines of (with-open [w (io/writer "path")] (binding [*out* w] (dorun (map #(prn %) [1 2 3 4] ))))

12:06 read up on *out*, binding, and dorun especially

12:06 Raynes: shanmu: (doseq [i '(1 2 3 4)] (spit "t.txt" (str i "\n") :append true)) ; Untested, but should do what you want.

12:06 timvisher: Raynes: wasn't aware of :append!

12:06 that's neat

12:07 Raynes: dnolen: Haskell is too standardized.

12:07 timvisher: Yeah, it isn't in-your-face apparent.

12:07 timvisher: if you use my solution you'll also need to require clojure.java.io as io

12:10 technomancy: eliantor: lein upgrade and you'll get the fixed version

12:10 1.6.1 is released

12:11 shanmu: Raynes: timvisher: Thanks!

12:12 dnolen: Rayes: sure with 12 years gaps in between and everybody just using the inbetween thing.

12:17 jcromartie: have you all seen the latest PragProg magazine? It's Clojureific

12:26 http://pragprog.com/magazines/2011-07/content

12:28 kryft: Hmm, growing a DSL looks interesting (from a noob's perspective)

12:28 cemerick: Perfect storm of PR these days…

12:34 pyr_: cemerick: indeed

12:36 ejackson: woah - wall to wall clojure.

12:51 bdesham: I'm trying to transpose a matrix (a vector of vectors), but I get this weird assertion error: https://gist.github.com/1067736

12:52 any idea... am I just using assertions wrong?

12:59 Vinzent: bdesham_, I've tried to move :pre to the one-arg body and it works, I think that's the problem

13:00 dnolen: bdesham_: that seems like a bug to me.

13:01 Vinzent: it works with (constantly true)

13:02 (prn mat) in :pre returns [[1 2 3] [4 5 6] [7 8 9]]...

13:03 dnolen: bdesham_: ah silly me not a bug. Your 2nd arity is recursive

13:03 (() ()) is not a square matrix

13:03 the assert will be called on each iteration

13:03 Vinzent: ah! :)

13:03 bdesham: dnolen: oh, silly me!

13:04 so I should put the condition on the one-argument version, since that will be used by all outside callers anyway

13:05 dnolen: bdesham: I would probably use loop/recur in your second arity so you can validate both arities.

13:05 bdesham: ok

13:06 although if I use loop/recur I don't even need more than one arity

13:06 so that's even better! :)

13:09 this works fine now: https://gist.github.com/1067736

13:26 mprentice: anyone familiar with using xml structures, zips, and zip-filters care to help me out? i have a graphml file parsed into an xml struct-map, and i want to update all targets that are currently "t1" to be "t2" instead

13:27 (a graphml edge has a source attribute and a target attribute)

13:40 timvisher: mprentice: maybe you could post to gist?

13:40 feel like i'd need more details to help you out

13:40 i'm not directly familiar with what you're doing, but it should be a simple call to `map`.

13:40 amalloy: sritchie: cake master is fixed now if you want to go back to it

13:41 sritchie: awesome, thanks

13:41 * amalloy accepts all the credit for watching over ninjudd's shoulder

13:42 mprentice: timvisher: sure, i'll come up with a small example

13:48 jaskirat: bdesham_: you could just do #(apply map vector %) to transpose matrices

13:52 chouser: mprentice: zip-filter's unfortunately not much good at changing things. It can be used if you only want to make a single change, but changing all x to y is beyond it's capabilities.

13:52 derp__: I have a map that's basically a configuration file, it's made up of smaller maps that declare the function name and source file. But how do I load a specified function outside of the namespace declaration?

13:53 mprentice: chouser:

13:53 chouser: ah, ok

13:54 timvisher: https://gist.github.com/1067874

13:55 chouser: so i guess what i want is a looping structure? find edge such that attribute target='n3', assoc target to 'n4', pass new xml to next stage of loop, repeat until there are no target 'n3'

13:57 i've been looking for a good tutorial on how to jump around an xml zipper like that, but i have come up short

14:05 chouser: mprentice: you might consider clojure.walk instead of zippers

14:06 derp__: um, how do you handle dynamically loading functions based on a config file?

14:07 chouser: derp__: not sure what you mean. "based on" how?

14:08 edw: Using Compojure, what's the proper way to handle "connection reset by peer" exceptions?

14:08 chouser: (doc clojure.walk/postwalk)

14:08 clojurebot: "([f form]); Performs a depth-first, post-order traversal of form. Calls f on each sub-form, uses f's return value in place of the original. Recognizes all Clojure data structures except sorted-map-by. Consumes seqs as with doall."

14:08 chouser: mprentice: ^^^

14:08 mprentice: chouser: oh, that looks nice

14:08 thanks!

14:09 derp__: chouser: basically I want to have a file that tells my clojure script which functions to load out of which files

14:11 bryanl: any suggestions on a clojure book for casual learning?

14:13 chouser: derp__: you want to list individual function names and skip over loading any that aren't listed? sounds tricky.

14:14 mprentice: chouser: aha, that works perfectly

14:14 chouser: bryanl: I recommend Joy of Clojure to everyone in every circumstance. :-)

14:14 mprentice: chouser: i had looked at clojure.walk before but couldn't figure out how to apply it. postwalk was what i wanted

14:14 chouser: mprentice: great!

14:15 bryanl: It's got a friendly drunk guy on the cover -- what more could you want? http://joyofclojure.com/

14:16 bryanl: chouser: did you write it?

14:16 chouser: bryanl: helped, yes.

14:16 bryanl: cool

14:16 i will check it out

14:17 technomancy: clojurebot: tell bryanl about the peepcode

14:17 clojurebot: peepcode is a commercial screencast series; see the Clojure one at http://peepcode.com/products/functional-programming-with-clojure by technomancy

14:17 chouser: If you want *really* casual and aren't targetting Clojure too specifically, you might like Land of Lisp. ...which I have nothing to do with.

14:17 bryanl: technomancy: I watched that

14:17 technomancy: bryanl: awesome =)

14:18 bryanl: i just wanted to learn a new language

14:18 in my spare time

14:26 i do have a problem that i plan on solving in clojure this evening. scanning gigs of log files for interesting data

14:35 ohpauleez: bryanl: That will be a blast in clojure

14:36 (it's my favorite kind of task to do in the language: Large data analysis, stream processing, etc)

14:36 bryanl: i wrote the first version in ruby. it made me sad

14:37 derp__: I am looking at this: http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips#Using_the_.28ns.29_macro

14:37 and it talks about the :require and :as options for the ns macro

14:37 edw: Anyone using Compojure/Ring/Noir around?

14:38 derp__: is there a way to run something like (str-utils/"str-join" "," ["foo" "bar"])

14:38 so that the "str-join" part is not hard-coded

14:39 e.g. name of function turns into an actual function call?

14:39 ohpauleez: edw: I've never used noir, but I'm familiar with it (I've used the other pieces)

14:40 derp__: lol, I meant i.e.

14:40 edw: ohpauleez: How do you catch "connection reset by peer" IOExceptions?

14:43 ohpauleez: I've never seen that happen in any app I've rolled (that I recall), but if you know where the exception is being generated from, you can wrap it in a (try (catch))

14:43 you can also use Contrib's condition lib

14:43 or checkout the discussions here: http://dev.clojure.org/display/design/Error+Handling

14:43 edw: ohpauleez: Right. It's running in a different thread, so I don't believe I can catch it.

14:43 technomancy: don't use c.c.Condition; use slingshot instead

14:44 edw: If you take your web app and Command-R/Control-R the crap out of it in your web browser, you *will* suffer a connection reset.

14:44 ohpauleez: edw: It just means the server thread is generating it, but it's happening on an action that's being done in that thread, no?

14:44 sure

14:45 and you just don't want to see that in the logs?

14:45 edw: Which causes the server to fall over. Not a good thing.

14:45 chouser: derp__: resolve

14:45 ,(resolve "map")

14:45 clojurebot: java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.Symbol

14:46 chouser: ,(resolve (name "map"))

14:46 clojurebot: java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.Symbol

14:46 chouser: heh

14:46 sorry

14:46 ,(resolve (symbol "map"))

14:46 clojurebot: #'clojure.core/map

14:46 ohpauleez: oh weird, I've never had that happen to me (to where it fell over).

14:46 Let me try that

14:46 chouser: derp__: the var that resolve returns is callable

14:47 edw: This happens using 'heroku foreman', 'lein run -m blah.core', and inside the Heroku cloud.

14:47 chouser: ,((resolve (symbol "map")) vector [1 2 3])

14:47 clojurebot: ([1] [2] [3])

14:48 jcromartie: I just had an interviewee that said Lisp was probably his least favorite language

14:48 ohpauleez: edw: I see the connection reset by peer in the logs (even on the prod systems)

14:48 but the server doesn't come down

14:48 jcromartie: I'm not sure what to do with that

14:48 ohpauleez: I even held ctrl/cmd-r down

14:49 to be fair, they were logging warnings, from netty

14:49 edw: Hmm. I wonder why my code is dying. Maybebecause I'm joining on the RUN-JETTY.

14:49 ohpauleez: that sounds likely now

14:49 I was just about to try a jetty system

14:50 edw: I just switching things up and am trying :join false now.

14:50 jcromartie: look at the first version of emit-bash-form here http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure

14:51 it uses (case (class a) java.lang.String ...)

14:51 and it doesn't seem to work in my REPL, but the REPL in the article shows the proper output

14:51 ohpauleez: edw: What's the result?

14:51 jcromartie: I know people were just talking about case and class literals the other day

14:52 edw: Hmm. Same thing. It's not hard to get the thing pitting out endless IOExceptions.

14:55 ohpauleez: but is the server failing too?

14:55 or just logging all that noise

14:56 and wrapping the run-jetty call in a try catch doesn't help?

14:58 bdesham: jaskirat: oh, nice, thanks! (regarding #(apply map vector %))

14:59 edw: ohpauleez: wrapping the run-jetty does nothing.

15:01 ohpauleez: I removed the wrap-reload or whatever it's called and the problem went away.

15:01 Or I can't get the connection to reset, at least.

15:01 ohpauleez: Oh weird, that's good to know

15:02 edw: Yeah.

15:09 lpetit: Hi

15:10 chouser: lpetit!

15:11 lpetit: Hello !

15:11 's been a while, isn't it ?

15:11 chouser: I guess so. Been busy / distracted.

15:13 lpetit: Talking 'bout you, or me ? :)

15:13 chouser: heh. It's been a while since *we* talked. *I've* been distracted.

15:13 lpetit: Been very busy, but also working with cgrand on improving perfs of the ccw editor, by means of helping him debug / perf test his parsley library

15:13 ataggart: lpetit: log2logger committed

15:14 chouser: lpetit: ooh, cool!

15:14 lpetit: ataggart: awesome, thx

15:15 ataggart: Now I'm going to pull all the impl stuff out of the clojure.tools.logging namespace

15:20 lpetit: attagart: great, so people requiring the main namespace with some "log" alias will only see code completion for the vars of interest, cool

15:20 ataggart: ^^ (inverted t & g)

15:21 ataggart: yes, the protocols are for implementations, not consumers, so I'll move them into clojure.tools.logging.impl

15:22 and then lib-specific stuff will be in its own ns, e.g., clojure.tools.logging.log4j. That also gives a place to hang any future implementation-specific functionality.

15:22 though for now each will just have a single load-factory function

15:23 sound reasonable?

15:25 lpetit: ataggart: yes

15:34 dnolen: lpetit: parsley's really coming along.

15:35 lpetit: dnolen: I would not speak for cgrand, but really coming soon

15:36 (a version of which will be hopefully packaged by me for use in ccw tomorrow)

15:36 dnolen: lpetit: yeah he sent a couple of emails. Within 3X of Clojure's parser, and whole incremental thing is pretty amazing.

15:36 hiredman: really? does it have docs yet?

15:37 dnolen: hiredman: no but soon I think.

15:38 no lex/parse dichotomy. All in all I think it's gonna be a real nice lib.

15:38 lpetit: hiredman: not yet. Christophe's been busy with the book recently. I've been pulling him off-path to work on parsley for the greater good of it and of ccw, but right now it's not much documented.

15:39 dnolen: a potential to be a killer lib in its area, mind you ! :-D

15:39 dnolen: lpetit: I totally, totally agree.

15:40 dsantiago: I know more about Clojure stuff than Java... what is it about the ScheduledThreadPoolExecutor in Aaron Bedra's PragProg article that makes it a unix service? If anything?

15:40 lpetit: And it's a tiny library, with no dep but clojure jar

15:42 The current state of paredit.clj's clojure grammar is horrible, but anyway, this will give you a sense of how you define the grammar for a language in parsley : https://github.com/laurentpetit/paredit.clj/blob/master/src/paredit/parser.clj#L73

15:45 amalloy: dsantiago: link?

15:46 dsantiago: amalloy: http://pragprog.com/magazines/2011-07/create-unix-services-with-clojure

15:46 hiredman: lpetit: I don't see the advantage over fnparse (which even though it is being constantly rewritten) which is documented and comes with examples?

15:46 amalloy: hm. he misspelled "leinigen" :P

15:48 lpetit: hiredman: well, I don't know fnparse well, so I'm not really well placed, but here are some hints: parsley generates a parser, and I guess a really optimized one. How much time would it take for a (decently written) clojure grammar written with fnparse to parse clojure's core.clj (6kloc) file ?

15:48 amalloy: dsantiago: i think he just means he's reimplementing cron in clojure

15:49 kephale: i'm playing around with org.eclipse.swt, i'd like to have my project be multi-platform but the SWT dependencies are system specific. is there a simple way to have leiningen auto-discover the correct dependency to use?

15:49 dsantiago: amalloy, yeah, I thought maybe I was reading too much unix into it, but I thought maybe there was something about it.

15:49 hiredman: lpetit: no idea, but how long would it take to write? fnparse has docs, parsley doesn't

15:49 amalloy: although not a very general cron

15:49 lpetit: hiredman: parsley will output an abstract tree. You plug into it custom make-node / make-leaf functions to get a concrete parse tree. Or whatever you want to make out of the abstract parse tree, really.

15:49 hiredman: parsley can be super fast, but if there are no docs

15:50 lpetit: sounds like a great feature, when I am interested in parsing something, how can I find out about parsley's great features?

15:50 lpetit: hiredman: I'm not announcing parsley publicly here, for general consumption. Just reporting progress, and enthousiasm of an early adopter (for ccw)

15:50 hiredman: when ready, cgrand will announce it broadly

15:51 dnolen: lpetit: I'm looking forward to hooking it up to core.logic pronto soon as he does ;)

15:52 lpetit: hiredman: and so, a unique feature of parsley is its use in conjunction with an incremental buffer, which lets him reuse as much as possible of the existing abstract parse-tree (and all the derivative concrete values from your custom make-node / make-leaf functions, which are memoized with the abstract parse-tree nodes)

15:53 dnolen: now parsley is working. It's not a "Christmas promise" anymore :). It's up to Christophe to say if he's happy enough with its public API for general consumption or not.

15:55 dnolen: which means editing then updating the parse tree on a large file like core.clj takes ms.

15:56 thorwil: hmm, how do i wrap a ring handler with both wrap-params and assoc-param?

15:58 lpetit: dnolen: exactly

15:58 dnolen: there are still some worst cases, though, to be improved upon over time. But having all this done generically is damn awesome

16:20 technomancy: I like the latest pragprog issue, but i'm confused why the article on a simple sh compiler uses the term "dsl" instead of compiler

16:20 is it because it's targeted towards ruby programmers?

16:21 jcromartie: technomancy: because compilers are scary?

16:21 pjstadig: technomancy: you're saying it is not a domain specific language?

16:21 bsteuber: because dsl are is a buzzword

16:21 -are

16:21 jcromartie: yeah, DSL is a bit of a stretch

16:22 technomancy: pjstadig: I'm saying that's a meaningless term. how many defmacros do you need to define before you've created a new "language"?

16:22 jcromartie: and I emailed the author about the use of case with class literals

16:22 it just doesn't work

16:22 pjstadig: technomancy: 7

16:22 jcromartie: I think ClojureQL counts

16:22 technomancy: jcromartie: also the use of (fn [form] (class form)) instead of class bugged me, but whatever.

16:22 jcromartie: heh

16:24 technomancy: rubyist: "hey look, I'm writing a DSL" / lisper: "oh, we call that 'programming' where I'm from."

16:24 pjstadig: i guess DSL is fuzzy as a term, but to me it means a way to manipulate nouns and verbs in the domain you're writing for

16:26 lpetit: internal DSL, external DSL ...

16:27 jcromartie: i think it's a good goal to develop a "language" in which to work in the domain

16:28 but an inherent problem in any domain-specific language is that it's not really useful outside of that domain

16:28 bah

16:28 lpetit: interesting thought: create a ns where you refer to clojure.core as alias core, carefully :use some namespaces full of vars relevant to your domain, carefully :require :as some other namespaces related to your domain. Use it in a text editor/IDE with proper completion, and you've customised a "generic" Clojure editor for your "internal DSL"

16:28 jcromartie: I can't use that term with a straight face anymore

16:29 hiredman: a dsl should really be nothing but a on ramp to the full language

16:29 jcromartie: yup

16:29 hiredman: eh?

16:29 I don't think a DSL should be "easy"

16:29 it should be focused

16:29 hiredman: easy?

16:30 jcromartie: you say it should be an on-ramp to the "full" language

16:30 that sounds like "training wheels" or something

16:30 lpetit: jcromatie: thus my thought above ^^^ for the "focus" part of it

16:30 hiredman: they are more or less

16:30 you create a restricted language, domain specific

16:31 means it is cut off from other domains, which you will eventually need in any real application so you will need the full language

16:31 jcromartie: maybe

16:32 I thought the presentation by Naughty Dog about their scripting language for Uncharted 2 was really cool. It used Scheme to build a "DSL" for doing asynchronous game event scripting.

16:32 It was pretty much self-contained.

16:32 once you were writing the state scripts, thati s

16:32 that is

16:33 hiredman: jcromartie: yeah, but has it been used anywhere else? is it really useful outside of uncharted 2?

16:33 jonabbey: Naughty Dog did their PS2 games entirely in a Lisp based system, actually.. they switched to using C++ for their framework on the PS3 so other Sony studios would be able to work with their code. ;-/

16:33 technomancy: isn't that pretty much the only way to write good extensible software?

16:33 I mean unless your main host language is flexible enough

16:33 jcromartie: no that's the point hiredman

16:33 technomancy: that's the same model as mozilla and emacs, the only large programs I can stand using on a daily basis.

16:33 jcromartie: jonabbey: but they're back to Scheme

16:33 jonabbey: smart

16:34 lots of folks are using Lua for that sort of thing.. Civ 4 was done with Python

16:34 jcromartie: PLT (Racket) hosted in C++

16:34 yeah I worked in Lua full time for a while... it's not almost too loose I think

16:34 s/not//

16:34 sexpbot: <jcromartie> yeah I worked in Lua full time for a while... it's almost too loose I think

16:34 * jonabbey laughs at sexpbot

16:35 technomancy: there are really only three ways to write large programs: use a host language that's both flexible and fast enough, embed a flexible language in a fast one, or write software that isn't flexible

16:35 jonabbey: that's awefully nice

16:35 s/we/w/

16:35 sexpbot: <jonabbey> that's awfully nice

16:35 technomancy: but that's not really relevant to the question of what defines a dsl

16:36 edw: A DSL is a language that's specific to a domain.

16:36 jonabbey: i'm investigating clojure for precisely that reason. i've got a reasonably large Java system I've been working on for the last fifteen years, and it's gotten ridiculous, trying to code the business logic in Java

16:37 ibdknox: edw: or, in other words, at the point at which the primary nouns in use are no longer that of the core language, you have a dsl

16:37 jonabbey: doing it declaratively in Clojure and then having a modest constraint evaluation engine is going to be so much better

16:37 pjstadig: technomancy: ambrose is supposedly from your user group

16:38 edw: ibdknox: I think my main point is -- and it may not be quite explicit -- is that some people, specifically Ruby people, overthink DSLs.

16:38 lpetit: "fluent APIs" in java are the closest thing I would call "java internal DSLs"

16:38 pjstadig: but then his bio says he's from western australia?

16:38 ibdknox: edw: agreed.

16:39 technomancy: pjstadig: yeah, I have no idea who he is

16:40 made me feel bad like, "oh, man I suck at remembering peoples' names" but then it was like "ah; vindicated."

16:41 edw: I think Pike and Kernighan call them "little languages" in Practice of Programming. Insecure people, however, regularly couch ideas in terms most obscure.

16:44 * jonabbey orders a copy of The Reasoned Schemer

16:46 dnolen: jonabbey: excellent tough little book.

16:46 ataggart: has anyone recently used autodoc to update a new-contrib lib?

16:46 jonabbey: i read your recommendation for it on the core.logic page

16:47 i did just a bit of prolog back in school, but i haven't touched it in 20 years. i'm looking forward to getting reacquainted.

16:51 dnolen: jonabbey: I'm still sorting through its insights 8 months later. I recommend pairing it with a proper Prolog book since TRS is a bit abstract at times.

16:51 jonabbey: have any recommendations?

16:53 dnolen: jonabbey: The Art of Prolog, Prolog for Artificial Intelligence Programming seem highly recommended. I have the later and like it.

16:54 amalloy: ibdknox: i'm reading over the ai challenge stuff. looks really neat. any idea when the clojure support and starter package are liable to get included?

16:55 (that was you who put together the starter package, right?)

16:55 ibdknox: it was

16:55 I'm not sure

16:55 I submitted a pull request

16:55 but I haven't heard anything back yet

16:55 fwiw you can play locally

16:55 which is worthwhile

16:55 edw: I liked the Art of Prolog. Beautiful too.

16:55 ibdknox: since there's quite a lot to do before you'd even have a chance being competitiv

16:55 e

16:56 amalloy: ibdknox: to do that, i clone your fork of the repo? i don't see any evidence of local-play options on the actual site

16:56 ibdknox: for example, the starter packs are not supposed to track individual ants (per their request)

16:56 ssideris: hello, I find myself writing this very often (apply hash-map (apply-concat (map (fn ...) a-hash-map))), where the fn returns a 2-member vector

16:57 is there a shorther way to express this?

16:57 ibdknox: amalloy: you need the tools, sec I'll get you a link

16:57 ssideris: (I could define it myself I suppose)

16:57 amalloy: ssideris: ##(into {} '[[a b] [c d]])

16:57 sexpbot: ⟹ {a b, c d}

16:57 jonabbey: looks like Prolog for AI 4th edition comes out 12 August.

16:57 dnolen: jonabbey: I just started looking over this, http://www.mtome.com/Publications/PNLA/prolog-digital.pdf, seems quite good as well even if you're not interested in natural language analysis.

16:57 ibdknox: amalloy: http://aichallengebeta.hypertriangle.com/using_the_tools.php

16:58 ssideris: amalloy: thanks, that's very handy

16:58 ibdknox: amalloy: note that you'll need to change the paths inside of the play_one_game command, for some reason they're pointing to a slightly wrong location

16:58 jonabbey: thanks, dnolen

16:59 rimmjob_: I'm a novice with just a few months of python experience and i want to learn lisp, should i start with SICP or just start learning clojure?

16:59 edw: Or there's merge, amalloy (& ssideris), correct?

16:59 pjstadig: ,(into {} (map (fn [[k v]] [k (inc v)]) {:a 1 :b 2}))

16:59 clojurebot: {:a 2, :b 3}

16:59 pjstadig: ssideris: ^

17:00 oh my bad

17:00 i'm too late

17:00 amalloy: pjstadig: feh. for is nicer there

17:00 ibdknox: rimmjob_: I think it depends on why you want to learn lisp

17:00 amalloy: &(into {} (for [[k v] {:a 1 :b 2}] [k (inc v)]))

17:00 sexpbot: ⟹ {:a 2, :b 3}

17:00 pjstadig: amalloy: sure was just writing something quick and literal

17:01 ssideris: thanks pjstadig and amalloy, my code just got a little shorter

17:01 amalloy: edw: yeah, maybe so. ##(apply merge {} [[:a 1] [:b 2]])

17:01 sexpbot: ⟹ {:b 2, :a 1}

17:01 dnolen: rimmjob_: if you want to learn Clojure, get a Clojure book or just start hacking away. SICP is a long and roundabout (tho rewarding) trip.

17:02 rimmjob_: ok ty

17:02 edw: rimmjob_: I heartily second the advice of dnolen.

17:06 amalloy: ibdknox: play_one_game looks right to me

17:06 ibdknox: maybe they fixed it then :)

17:10 amalloy: to run a bot exactly the way the server will you would do: ./play_one_game.sh "java -Xmx500m -cp /usr/share/java/clojure.jar:. clojure.main MyBot.clj"

17:11 amalloy: note that all paths in that need to be absolute, a ~/ won't work

17:12 amalloy: ibdknox: i understand what you mean, but ~/ *is* an absolute path: it's equivalent to /home/foo/

17:12 ibdknox: amalloy: fair enough, it won't get expanded :-p

17:12 amalloy: (the shell does that expansion, rather than the kernel, but ~ is absolute and . isn't)

17:13 jonabbey: found a copy of The Art of Prolog through Amazon, yay

17:14 ibdknox: amalloy: ah, my mistake

17:16 amalloy: ibdknox: it looks like this is all still in beta, but i can't find any timeframes mentioned. any idea when the competition officially starts or ends?

17:17 ibdknox: none has been given, though it seems to be ramping up some

17:18 it's fun to just play around with though

17:20 amalloy: my asking on their IRC channel has yielded me no valid results

17:33 amalloy: ibdknox: and what's the deal with https://github.com/ibdknox/aichallenge/commit/a31a04d96964ba3cb4f0b34e717fd2d5293ced37#diff-2 ? their toolkit supports clojure, but you added a fix to the classpath?

17:34 ibdknox: amalloy: it doesn't include the current directory

17:34 so the inclusion of ants.clj doesn't work

17:34 amalloy: right. so in theory i could submit a clojure bot to them now, but i'd have to put it all in one file?

17:34 ibdknox: in theory, yeah

17:34 amalloy: k

17:39 hiredman: speaking of single file bots

17:39 https://gist.github.com/27733 my first gist

17:46 ejackson: just read about backtype, woah !

17:46 those guys are amazing

17:46 and now they are aquired !

17:46 i (very selfishly) hope they still release Storm.

17:49 dnolen: ejackson: sounds like that's the plan.

17:53 ohpauleez: yeah, that was awesome news about BackType

17:53 dnolen: I'll be moving back to NYC in September, so I look forward to seeing you at user groups!

17:55 tufflax: hiredman about your randth, there is rand-nth already if im not mistaken

17:56 brehaut: tufflax: that gist is from 2008 isnt it?

17:57 tufflax: oh didnt realize

17:57 amalloy: i was thinking the stone age

17:57 having a five-digit gist is like owning mike@aol.com

17:57 tufflax: hehe

18:08 seancorfield: reading the docs for agents... send and send-off sound suspiciously similar... can someone provide a simple explanation of their real differences?

18:08 both return the agent immediately according to the docs

18:08 amalloy: seancorfield: send-off doesn't use the threadpool

18:08 seancorfield: send runs in a thread from a thread pool; send-off runs in a separate thread

18:09 amalloy: yes, but i'm missing the subtlety of what that really means

18:09 amalloy: consider two uses for agents. (1) serializing access to a log file, (2) incrementing an "event counter"

18:09 seancorfield: both run "subsequently", both return the agent immediately...

18:09 'k... keep going...

18:10 amalloy: if you used threadpool threads for (1), the threadpool would get exhausted as a bunch of threads block on IO

18:10 and adding new tasks would block

18:10 if you created a whole new thread for each action in (2), you'd drown your operating system in threads

18:10 seancorfield: ah, so the threads available to send are limited but the threads available to send-off are not?

18:10 amalloy: indeed

18:10 seancorfield: gotcha... thanx...

18:11 what about pmap? it doesn't say whether it uses separate threads or the threadpool...

18:11 ohpauleez: it uses the threadpool

18:12 seancorfield: thanx

18:12 ohpauleez: np

19:11 seancorfield: if i just want to fire off an async process and forget it, what's the most idiomatic way

19:11 i could use an agent... but that seems a bit wrong if i don't care about its value...

19:11 hiredman: (future ...) is used a lot

19:12 seancorfield: hmm, that says it caches the value... isn't that... wasteful?

19:13 i probably want to fire off tens of thousands of processes over a period of a few minutes

19:13 hiredman: *shrug* it's an object, it'll get gc'ed

19:14 seancorfield: if you use your own threadpool (which is not a bad thing to know about, excutors, threadpools, and futures) what you get back when you submit a job is a Future

19:14 and a clojure future is a java Future

19:16 seancorfield: ah, ok... good to know

19:16 hiredman: if you are doing 10's of thousands of jobs you may want to instead look at queueing up jobs and having some fixed number of threads consuming from the work queue

19:20 seancorfield: interesting... the thread name reported by a log event in a future is clojure-agent-send-off-pool-24 :)

19:21 doesn't 'pool' indicate a thread pool is being used there?

19:21 hiredman: the futures are backed by the same threadpool that send-off uses

19:21 correct

19:21 seancorfield: but that threadpool can grow unlimited amounts?

19:21 hiredman: but it is not a fixed size threadpool

19:21 correct

19:21 seancorfield: cool

19:22 hiredman: but I doubt you'll want 10's of thousands of threads

19:22 seancorfield: indeed

19:22 so i might use an agent and send for now to keep things under control

19:23 hiredman: :(

19:23 I hate it when people use agents for that

19:23 seancorfield: don't worry, i'll go look at threadpool, executors and so on later

19:23 i just want a proof of concept to test my ideas without spending too much time on implementation details

19:23 i didn't want to use agents in the first place

19:24 hiredman: look, for a poorman's executor just use a linkedblockingqueue+(future (while true (do-something (.take lbq))))

19:33 seancorfield: thanx hiredman that does look nice and simple and after reading the docs, easy to use

19:33 you'd rather i did something better tho' right?

19:34 hiredman: an lbq+future is acceptable

19:34 the 'Please stand firm against Steve Yegge's "yes language" push' thread on the mailing list really needs to die

19:35 technomancy: hiredman: time to start a "Please stand firm against 'Please stand firm against Steve Yegge's "yes language" push' thread" thread.

19:35 hiredman: I haven't read any of it

19:35 technomancy: wish I could say the same

19:36 hiredman: I just have to keep deleting it

19:36 technomancy: sounds like you need a better mail client

19:36 hiredman: well you can already tell it is going to be all noise no signal just from the subject

19:37 just people writing essays about nothing at all, no code or any other useful artifacts to show for it

19:38 technomancy: "clojure is what you feel in your heaaaaaaaaart" 𝅘𝅥𝅮

19:38 hiredman: yes

19:38 I mean, correct me if I am wrong (since tl;dr)

19:39 "When Your Heart Finds Clojure: The Rich Hickey Story"

19:42 seancorfield: at least i finally got james keats to say in one sentence what he was writing essays about... and it appears it is just "noise" and no real signal

19:42 so you were right there hiredman :)

19:44 hiredman: see, and I didn't have to read the thread to figure that out

19:45 Tcepsa: How can I tell whether I'm using Marmalade as a package repository for ELPA in Emacs?

19:45 (I promise this is relevant to Clojure; I'm trying to get clojure-jack-in working; right now it says there's no match when I try to use it)

19:46 technomancy: Tcepsa: C-h v package-archives should show you if it's configured as a source

19:47 Tcepsa: you may need to do M-x package-refresh-contents and reinstall if you upgraded from an old package.el

19:47 Tcepsa: technomancy: No match for that variable, so I'm guessing... no. I'll try adding it to my init.el (I'm using the Emacs Starter Kit from a year or so ago, so I'm guessing it wasn't part of it back then)

19:49 technomancy: Tcepsa: http://bit.ly/pkg-el23 is the latest package.el that works with emacs 23

19:49 Tcepsa: technomancy: Thanks, I'll give that a shot

19:54 technomancy: ok, I really don't want to be a dick, but http://groups.google.com/group/clojure/msg/7c6195e926ee142a

20:01 amalloy: technomancy: but most of those threads were started in the last couple weeks, *after* this "stand firm" thread started! i conclude that there is a causal relationship

20:02 dnolen_: technomancy: that post is just offensive.

20:02 technomancy: $kill it

20:02 sexpbot: KILL IT WITH FIRE!

20:03 dnolen_: technomancy: not you, I mean the person you're responding to of course.

20:03 technomancy: dnolen: heh; of course. =)

20:03 amalloy: i am happy to contemn people who use words like contemning

20:07 Tcepsa: I for one appreciate the reminder of the nifty stuff that continues to be added ^_^

20:09 technomancy: I left out slingshot because apparently it hasn't been announced on the mailing list yet, wonder what scgilardi's master plan for that is.

20:09 oh, he's not here. subtle ping plan foiled.

20:10 amalloy: technomancy: practice makes perfect. you'll get someone's attention someday

20:10 technomancy: hehe

20:10 Tcepsa: Switching to the newer version of package.el made the clojure-jack-in command show up in Emacs, but apparently I'm missing lein jack-in. Searching the Web has not yielded info on where to find it; is it supposed to be included in leiningen 1.6.1?

20:11 hiredman: Tcepsa: it actually comes from swank-clojure

20:11 technomancy: Tcepsa: "lein plugin swank-clojure 1.4.0-SNAPSHOT" should get it, but it could get confused if you use it in a project that has an older swank in project.clj

20:11 Tcepsa: hiredman: I'm using swank-clojure 1.3.1. D'oh!

20:12 technomancy: Tcepsa: actually that should do it. where is it installed?

20:13 Tcepsa: technomancy: Wherever `lein plugin install swank-clojure 1.3.1` put it? (Will try to get you more helpful response, but that's how I got it)

20:13 * Tcepsa searches

20:14 technomancy: no, that's fine. "lein help" doesn't show jack-in?

20:15 Tcepsa: It's in ~/.lein/plugins

20:15 "lein help" doesn't show jack-in

20:16 ("lein version" says 1.6.1)

20:16 seancorfield: if i did lein plugin install ... to add a plugin, is there a command to uninstall it?

20:17 or do i just go delete some files?

20:17 technomancy: seancorfield: I think there is an uninstall, but I always just use rm

20:17 Tcepsa: that is... bizarre.

20:17 Tcepsa: Oh wait, maybe it's because the project I'm trying to use it with is using an old version, like you said about 20 lines ago /facepalm

20:18 * Tcepsa updates project.clj

20:18 technomancy: just nix it out of project.clj and re-run deps

20:19 seancorfield: technomancy: yup plugin uninstall exists and works :)

20:19 Tcepsa: Got it. So if it's in .lein/plugins it's automatically included for all projects?

20:19 technomancy: Tcepsa: ja

20:21 IMO swank-clojure doesn't belong in project.clj any more now that there are user-level plugins

20:21 :dev-dependencies are for things that are necessary to make the tests pass, not things you use for your own convenience.

20:21 Tcepsa: technomancy: Shiny!

20:24 Oh that's weird. The jack-in task runs, but it looks like I have issues with... clojure.pprint?

20:24 (run-hooks 'slime-load-hook)

20:24 Exception in thread "main" java.lang.VerifyError: class clojure.pprint$loading__4410__auto__ overrides final method meta.()Lclojure/lang/IPersistentMap; (pprint.clj:4)


20:25 technomancy: that looks like an AOT version mismatch issue

20:25 can you require clojure.pprint from a repl?

20:26 Tcepsa: Can't start REPL with lein repl (Exception in thread "main" java.lang.VerifyError: class clojure.java.shell$loading__4410__auto__ overrides final method meta.()Lclojure/lang/IPersistentMap; (NO_SOURCE_FILE:1))

20:26 Attempting raw Clojure repl

20:27 technomancy: gist project.clj?

20:27 Tcepsa: Ack, nevermind, I'm using clojure-1.1.0.jar in this project

20:28 Upgrading might help with the issue?

20:28 technomancy: yeah... I haven't officially dropped support for 1.1 yet, but there's really no good reason to stick with it as far as I know.

20:29 gfrlog`: technomancy: 11 is a prime?

20:30 technomancy: compelling

20:30 arohner: Class clojure.lang.Compiler$NewExpr can not access a member of class Foo with modifiers "public"

20:30 what does that mean?

20:31 Tcepsa: technomancy: Woo hoo! Hacks and glory await! XD

20:31 amalloy: arohner: i'd guess that you're trying to access Foo/bar when bar is a public non-static member of class Foo, rather than a public static?

20:32 arohner: amalloy: I'm trying to call the constructor, hence the newExpr

20:33 hiredman: my bet would be something like a non-public constructor

20:33 Tcepsa: technomancy: Thanks for all your help ^_^ Now I'm going to give slamhound a try; it also looks fantastic!

20:33 hiredman: the 'with modifiers "public"' bit just being there to confuse things

20:33 technomancy: Tcepsa: sure

20:33 arohner: eyeballing the source, and the output of (show) both that the constructor is public

20:33 I'm doing (Foo. "a string" 5)

20:34 hiredman: and where is Foo? does it extendthing, what does the constructor do?

20:36 extend anything

20:36 arohner: foo is in a jar in lib/. it extends nothing, it doesn't do anything unusual

20:37 the one weird thing about it is it didn't have dots in a java package

20:37 i.e. it's just Foo, not com.bar.Foo

20:38 hiredman: and you are doing this at the repl?

20:38 arohner: yeah

20:43 Tcepsa: arohner: Just out of curiosity, how did you import it? (i.e. How do you import something without a package? Or would that be with a nil package?)

20:43 arohner: Tcepsa: I did (import 'Foo), and it didn't throw an exception

20:44 now I can do (show Foo), and see what I expect

20:44 hiredman: ick, that is a class in the anonymous package

20:44 Tcepsa: Ah, got it. (Lisp may not have syntax, but its macros sure do)

20:44 hiredman: throw it back

20:44 amalloy: hiredman: the default package

20:45 hiredman: default

20:45 right

20:45 amalloy: but yeah, that is seriously gross. all kinds of shit will break on that

20:45 hiredman: disgusting

20:46 arohner: ok, I'll try moving it into a sane package format

20:46 thanks

21:08 Tcepsa: technomancy: Regarding your earlier comments about "things in dev-dependencies are to make tests pass" would it probably be better to do "lein plugin install slamhound 1.1.1" rather than include it in project.clj as a dev-dependency? (Is this something that would have been more appropriate for me to put in as a GitHub issue? Or should I clone the project, change the README, and submit a pull request?)

21:09 * Tcepsa attempts to clamber a little higher up the being-a-good-open-source-contributor learning curve

21:36 amalloy: ,`[! & a]

21:36 clojurebot: [sandbox/! & sandbox/a]

21:36 amalloy: anyone know where the code is that causes & to not get namespace-qualified there?

21:36 hiredman: in the reader

21:36 syntax quote is all in the reader

21:37 and it is ugly

21:37 amalloy: hiredman: yeah, i've been looking through syntazQuote but i can't find the relevant bit

21:37 * gfrlog likes syntazQuote

21:38 arohner: it would be so awesome if clojure could load .java files directly

21:38 would that be possible as a special classloader?

21:38 hiredman: arohner: no

21:39 you would need to turn .java into bytecode first

21:40 arohner: hiredman: well yes. but what if your classloader ran javac and spat out the bytes? that seems possible in theory

21:41 hiredman: arohner: the classloader is spitting out bytes? why?

21:41 arohner: sorry, bytecode

21:41 hiredman: why is it spitting out bytecode?

21:41 Tcepsa: Sounds like a job for JIT compilation!

21:41 arohner: isn't that the interface? I thought the classloader's job was to convert a classname into a stream of bytecode

21:41 hiredman: classloaders generally load bytecode from somewhere (hence "loader") they don't write them anywhere

21:42 arohner: so the interface on classloader is essentially, return the stream of bytecode for a given class, given its name

21:43 it seems possible to write a classloader that looks for a file with the same name under src/, run javac on it, and return that stream of bytecode

21:44 amalloy: certainly that is possible

21:44 gfrlog: I would expect an IDE written in/for java would want similar capabilities

21:44 amalloy: all things are possible

21:45 arohner: amalloy: yes, but how much work is it? does the naive implementation work?

21:46 amalloy: probably not

21:51 arohner: http://www.ibm.com/developerworks/java/library/j-jcomp/index.html

21:58 chouser: I think it's been done. Java source REPL type things

21:58 arohner: chouser: I'm sure it has. I just want clojure to have it

22:02 chouser: why would it be worth anyone's time to create such a thing?

22:03 arohner: chouser: to avoid the compilation overhead when modifying a project that contains clojure and java code

22:03 chouser: If someone else insists on creating java, I hope they are nice to me and provide a tidy bytecode .jar with appropriately declared dependencies.

22:03 arohner: chouser: me too, but it doesn't always work that way

22:15 Tcepsa: chouser: Say I'm working in a Java-only shop, but I'm using Clojure (and the REPL) to do some prototyping and experiment with a Java class that I'm trying a new technique with. It'd be nice to be able to pull changes I make to the class directly into the REPL rather than having to exit the REPL, run ant, fire the REPL back up, and restore my environment.

23:20 dnolen_: so lein 1.6.1 doesn't work w/ 1.3.0-beta1 ?

23:23 ^^: im getting a nullpointer exception and i dont get why. could someone please look at the code: http://pastebin.com/4v3CkpCv ? if i call the verts function inside the let, i get a nullpointerexception and when i call the outside function, i dont

23:23 (i know the code is still incorrect even without that problem)

23:24 hiredman: ,(macroexpand '#(1))

23:24 clojurebot: (fn* [] (1))

23:24 ^^: oh right

23:25 thanks... :S

23:25 dnolen_: what's the easiest way to downgrade lein?

23:30 hiredman: dnolen_: get the patch http://dev.clojure.org/jira/browse/CLJ-673 applied to clojure!

23:32 if you remove the -Xbootclasspath bit from the lein script it will work

23:36 dnolen_: hiredman: I removed that still borked.

23:36 hiredman: stacktrace?

23:37 dnolen_: https://gist.github.com/1068860

23:37 hiredman: the bootclasspath is actually only an issue if lein itself is running on 1.3 (which it isn't) so a failure on a project running 1.3 is interesting

23:38 this is from running lein deps?

23:38 dnolen_: hiredman: yup

23:38 but none of the tasks seem to work, same trace

23:39 hiredman: huh

23:39 dnolen_: lein help is also garbled, https://gist.github.com/651a36bce975869b4fc0

23:39 hiredman: 1.6.0?

23:39 dnolen_: 1.6.1

23:41 hiredman: what jvm?

23:41 dnolen_: OpenJDK 7, looking at switching it to 6

23:41 hiredman: on osx right?

23:42 (thought I fixed this already)

23:42 dnolen_: upgrading to latest 7, work on system JDK 6

23:42 s/work/works

23:42 sexpbot: <dnolen_> upgrading to latest 7, works on system JDK 6

23:43 hiredman: actually just what are the values for (System/getProperty "os.name") and (System/getProperty "os.arch")

23:43 dnolen_: "Mac OS X" "x86_64"

23:44 hiredman: lein is most likely missing them, I had a similar problem, the openjdk 7 build I have reports "Darwin" as the osx, and that was missing

23:44 huh

23:44 thats there

23:44 dnolen_: trying latest 7

23:45 works

23:45 I was OpenJDK 7 from May I think.

23:45 hiredman: weird

23:45 different values for the system properties?

23:46 dnolen_: no

23:46 hiredman: fuh

23:46 dunno

Logging service provided by n01se.net