#clojure log - Feb 14 2012

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

0:00 ibdknox: it just works ;)

0:00 lynaghk: heh

0:00 ibdknox: also, CLJS is a bit slow for animations without a lot of work :(

0:00 lynaghk: I try to stick with CSS transitions though, because they are much faster

0:00 especially on mobile devices.

0:00 ibdknox: also good ^

0:00 lynaghk: transformZ(0) FTW

0:01 jhowarth: Ah ok. I was messing around with ClojueScript One yesterday and I liked their approach to events/animations. Was wondering if that stuff was in a library somewhere.

0:01 justinlilly_home: how do you short circuit a return value in a clojure method?

0:01 ie: "If you invalidate <precondition> return X now"

0:02 lynaghk: ibdknox, what did you think about David's suggestion that CLJS requires stuff should be built into lein?

0:02 justinlilly_home: (if (not (cond)) nil) is roughly what I'd do in java, but nil just noops rather than returns.

0:02 ibdknox: lynaghk: the libs/externs stuff?

0:02 lynaghk: yeah

0:02 ibdknox: lynaghk: I think it's reasonable

0:02 with the latest cljsbuild using jayq is pretty darn simple

0:03 with some sort of manifest it really will "just work"

0:03 seems like a reasonable solution

0:03 lynaghk: I just forwarded you the email I sent him

0:03 because I hit "reply" instead of "reply all"

0:03 yeah, I just cut Cassowary CLJS into a JAR and everything seems to just work if you include the js path

0:03 tmciver: justinlilly_home: you mean you *don't* want to return nil if precondition fails?

0:04 ibdknox: lynaghk: yeah. I have no idea what foreign-libs is

0:04 also we shouldn't tell people to package libs with their apps

0:04 tmciver: justinlilly_home: if you do want to return nil, just wrap your function body in an if: (if (cond) ;; do stuff

0:04 ibdknox: if they're already widely CDN'd

0:04 technomancy: justinlilly_home: you can't do it without putting both the success and short-circuit clauses in the tail position

0:04 lynaghk: so, besides jQuery

0:04 ibdknox: google has a couple others, but yeah

0:05 justinlilly_home: ahh. interesting.

0:06 lynaghk: ibdknox; Eh, I think you might be biased as an excellent web practitioner. I'd rather err on the side of having things packaged so that libs just work.

0:06 People who are in a situation where using CDNs would matter already know about that, and can take the appropriate steps.

0:06 ibdknox: that's fair

0:07 lynaghk: But for people who just want to get the library and start playing around, I don't want them to get tripped up because they're offline or some such.

0:07 ibdknox: yeah

0:07 lynaghk: but yeah, it's about build tools---we've been using CLJS just by calling the compile function (no cljs-build), because it's incorporated into a different toolchain.

0:09 jhowarth: idbknox: Animations with jayq are pretty slow?

0:09 ibdknox: ^

0:10 ibdknox: jhowarth: no, they're very fast because they use jquery's JS :)

0:10 jhowarth: Cool I'll check it out.

0:11 lynaghk: ibdknox, did you ever get around to profiling ClojureScript when you were building out those animations?

0:11 technomancy: wow, golang straight up refuses to version dependencies

0:11 if you want an old version, you copy it into your codebase: https://groups.google.com/forum/#!msg/golang-nuts/tLsxO2S4yoQ/VUrYr5q4RUMJ

0:13 Scriptor: well, that's nuts

0:13 Raynes: technomancy: Excuse me?

0:13 lynaghk: ibdknox, the reason I ask is because I recall your gist showing how slow (doseq) is compared to a JS for loop. I was under the impression that loop/recur would be way faster, but that hasn't been my experience.

0:13 technomancy: "Conversely, if you find yourself in a situation where your code needs version 3.1 of a library and cannot work with newer versions, you need to make your own copy of that library: it's moved on without you."

0:14 Raynes: technomancy: Is this a joke?

0:14 ibdknox: lynaghk: monet has a "fast" loop

0:14 technomancy: it's always bugged me that golang's selling point is "it's static typing that you won't hate!" as if that's something new they're bringing to the table.

0:15 Raynes: technomancy: How do you feel about Rust? I really like it.

0:15 justinlilly_home: technomancy: imo, its typed python that's faster.

0:15 or perhaps "python for people who like pointers"

0:15 Raynes: Python is the comparison?

0:15 Scriptor: typed python?

0:15 justinlilly_home: Raynes: I meant golang, sorry.

0:15 Raynes: I know.

0:15 technomancy: Raynes: haven't bothered to give rust a glance

0:15 Raynes: Still, Python is the comparison?

0:15 technomancy: Go do it. You might be surprised.

0:16 technomancy: http://rust-lang.org/

0:16 technomancy: I think people compare it to python because that's often the only language they've used that hasn't filled them with rage.

0:17 Raynes: is that the mozilla one?

0:17 Raynes: I have to say, Ruby filled me with far more rage than Python did.

0:17 Yes.

0:17 Look at the feature rundown there. It's fairly interesting.

0:17 technomancy: "Compilation model batch, ahead-of-time, C/C++ compatible" <- is that code for "no repl"?

0:18 Raynes: Haha, I think so, yes.

0:18 technomancy: ok, not interested

0:18 lynaghk: ibdknox; the loop/recur on canvas.cljs#126?

0:18 Raynes: Still, there are interesting ideas there.

0:18 technomancy: if you don't have a repl you should at least have the decency to be embarrassed about the fact

0:19 not put it first on your features list

0:19 "Type inference yes, only local variables" <- double-yawn

0:19 at least go's inference can usually cross function boundaries

0:20 Raynes: "immutable by default, mutability is the special case"

0:20 technomancy: ^ If that doesn't set it apart from most 'systems' languages, I'm not sure anything ever could.

0:21 ibdknox: lynaghk: yeah

0:21 technomancy: meh; not when ocaml has had decades poured into its compilers

0:21 Raynes: Well then

0:21 I apologize for making you waste your time with this obviously utter garbage. ;)

0:21 technomancy: "Error handling: unrecoverable unwinding" <- seriously, I get the feeling they are not trying very hard on this feature list

0:21 "CL-style conditions? yeah, those are cool. we don't have them."

0:21 Raynes: Thanks for ruining my excitement. Dream killer.

0:21 technomancy: haha

0:22 Raynes: amalloy_: Want to go talk about death and paint our fingernails black now?

0:23 technomancy: http://images.wikia.com/scottpilgrim/images/8/8f/SP3_sex-bob-omb_id.jpg

0:23 Raynes: I remember that scene of the movie.

0:24 lynaghk: ibdknox: yeah, the slow looping burned us a little on an iPad visualization project we just shipped. We're about to start up a larger analytics project though, and I am definitely interested in figuring out where these performance issues are coming from

0:24 even in my own cljs code, so I can drop to JS if required.

0:25 but as it stands (as far as I'm aware) there isn't any metadata on the complied JS that'll point back to the cljs source to determine hotspots.

0:26 Raynes: technomancy: http://www.youtube.com/watch?v=mL-qx-Y_15M&feature=related

0:26 technomancy: handy link!

0:58 tylergillies: im studying lambda calculus and it defines zero as \sz.z does that mean that any function that takes two arguments and returns the second one is === zero?

1:06 Apage43: tylergillies: not as such

1:06 those are church numerals; http://en.wikipedia.org/wiki/Church_encoding

1:07 its a way of implementing arithmetic on top of lambda calculus

1:09 tylergillies: Apage43: thnx

1:47 devn: protocols support [x & xs] right?

1:47 amalloy: no

1:47 devn: haha, that makes more sense

1:47 amalloy: unless by that you mean three args: x, &, and xs

1:47 devn: :) no

1:47 thanks alan

1:49 amalloy: how's the clojuring?

1:49 Raynes: amalloy: I'm totally gonna use mustache for templates, I think.

1:49 Mustache has some cool things I didn't even know about.

1:49 devn: Clostache?

1:50 Raynes: Stencil.

1:50 devn: Raynes: im guessing you know about it already, but if you haven't seen it this seems to be under active development as well: https://github.com/fhd/clostache

1:51 Raynes: Yep, it's under active development because I shat on the lib on twitter because I didn't know he followed me. I'm pretty ashamed about it.

1:51 :p

1:51 It's spec compliant now, but stencil is still faster.

1:51 devn: :\

1:52 Raynes: Context: I thought he knew it wasn't spec compliant and was a little angry that he had them list his implementation on the official website. Turns out, he didn't even know there was a spec.

1:53 Shoulda seen me blushing.

1:53 ;)

1:53 devn: Raynes: either way, there's so much bitching in our communities

1:54 * Raynes bitches about Enlive for completeness.

1:54 devn: it makes it sort of amazing to me that people continue to contribute to open source when i see some of the flames people get

1:54 Raynes: not an enlive fan?

1:55 * devn dangles a carrot ;)

1:55 devn: Raynes: going to clojure/west?

1:55 how about euroclojure?

1:55 Raynes: Well, I didn't flame him.

1:56 tl;dr re: enlive: I found a bug. No one cares. Slightly annoyed, but meh, life goes on.

1:56 Can't afford clojure/west. Certainly can't afford euroclojure.

1:56 I'd love to go to Euroclojure

1:56 devn: submit a talk!

1:56 Raynes: I could have talked at c/w. I decided not to because I need to work on my book more than I need to go to conferences. It's sad, but true.

1:57 devn: i missed the CfP

1:57 :(

1:57 Raynes: EuroClojure is super duper tempting though.

1:57 devn: euroclojure has a sort of weird CfP IMO. maybe it's fairly normal, but i've never seen it.

1:58 you submit, they rate it, you resubmit to address how you will get it from their rating to a better rating, something like that

1:58 Raynes: The only way I could go to euroclojure is if they paid for my travel which would be an insane thing to even hope for. I don't even what to know what that plane ticket would cost.

1:58 devn: not that crazy, honestly.

1:58 i don't think they'll have 100 US clojure devs there

1:58 Raynes: I'd only do it if brehaut was going.

1:58 I'd do it just to meet him.

1:58 devn: :D

1:58 Raynes: Cool guy, that one.

1:59 devn: Raynes: i want to submit, but i am always hopping around about what i'd talk about

1:59 Raynes: I've got so many things I could talk about.

2:00 I'd like to do a talk about Clojure editors.

2:00 That'd be cool.

2:00 Do a demonstration of Emacs, Vim, IDEA, CCW, etc. Explain the benefits and disadvantages of all of them.

2:00 devn: i think the stuff i want to talk about has to do with community building

2:01 Raynes: Aaron Bedra's talk was close to that at the first conj.

2:01 It was well accepted, I think.

2:01 devn: i started a clojure meetup in Madison, WI a year and a half ago. no one showed up but my friends for a couple of months, but i made it my business to keep showing up. we've been getting spikes, but the average is now around ~10 people

2:02 i want to tell people: you live in sibera. who cares? put up a flyer and wait. if you build it, they will come.

2:02 Raynes: I don't think that applies where I live at the moment. :p

2:02 devn: i did no serious organizing. the only thing i've done is bought beer.

2:02 Raynes: The people who show up would be doing so to ask me what computers are. ;)

2:02 devn: Raynes: so start an online meetup group.

2:02 :)

2:03 unite! organize!

2:03 sCriptor: some place where all may gather and converse online

2:03 devn: sCriptor: this is not a meetup

2:03 Raynes: An online meting group? Isn't that called IRC? :p

2:04 devn: nah, there's so much to be gained from interacting with other meat bodied creatures

2:05 Raynes: That sounded kind of sexual.

2:05 devn: It was meant to be.

2:05 Raynes: Oh man.

2:05 devn: Oh boy.

2:05 So...uh...

2:05 Raynes: I've been an adult for less than two weeks and you're already hitting on me.

2:05 Have you no shame?

2:07 * devn denies everything

2:08 sCriptor: damn kids

2:11 devn: sCriptor: damn salt and papper neck beards

2:11 pepper*

2:11 Raynes: 'papper' has more of the effect you wanted. Sounds more oldmanish.

2:12 devn: *nod* -- good call

2:13 it's like "warshing machine"

2:13 papper, figs, warshin' dishes, etc.

2:14 Raynes: Wow, man. Mustache can do things I never knew.

2:14 I figured it'd be insane to use it for HTML templating, but I'm slowly being convinced otherwise.

2:15 Funfact: refheap will not load at all in IE 5.5

2:16 IE 6 destroys the rendering but the site is functional.

2:16 amalloy: try AOL 1.0

2:16 Raynes: amalloy: I can't :(

2:16 browserling doesn't have it

2:17 RefHeap works in most browsers save for minor rendering quirks. BrowserID on the other hand supports only modern browsers. But that's perfectly fine for me, because I don't care if it even renders in IE9.

2:17 amalloy: for reference, http://www.reddit.com/r/funny/comments/o7bxs/reddit_isnt_working_for_me_in_internet_explorer/

2:18 Raynes: As long as it renders in ffx, chrome, safari, android browsers, and opera. All recent versions.

2:18 Well, screw opera.

2:18 Though it does render in it, I just don't care about opera.

2:18 amalloy: That's awesome.

2:29 Gertm: Hi. I installed clojure through my package manager and I have 1.3 now. But when I install clojure-swank through leiningen, it brings in a clojure 1.2 jar, won't that cause problems?

2:37 raek: Gertm: the clojure version you can install with your package managager isn't used by any tools, afaik

2:37 Gertm: you control the clojure version in the project.clj file of your project

2:37 Gertm: so,.. it's not a good idea to install it through the package manager?

2:38 raek: it's not very useful, no

2:39 Gertm: So what would be the best way of doing it?

2:39 devn: Raynes: we need a better haml-esque solution for clojure

2:39 raek: use leiningen

2:40 you don't install libraries you want to use in your code (Clojure counts as a "library"...), you just specify them in your project.clj and let Leiningen fetch them for you

2:40 Raynes: devn: That's kind of antiwhatiwant

2:40 raek: (leiningen plugins are often installed, though)

2:41 Raynes: devn: I want HTML templates. If I were going to use haml, I'd just use hiccup.

2:41 raek: (through leiningen)

2:41 devn: Raynes: tell that to your designer

2:41 Raynes: Not sure I follow

2:41 devn: designers don't write hiccup

2:41 Raynes: They don't write HAML either.

2:42 raek: Gertm: also, Leiningen will use Clojure 1.2 for its own process, but that doesn't affect you if you use Clojure 1.3 in your project

2:42 devn: Raynes: they almost certainly don't write hiccup whereas they might be willing to work with HAML

2:42 Raynes: I… guess.

2:43 Gertm: raek: but I want to use it with SLIME, won't it cause problems then?

2:43 Raynes: I'm not convinced I like HAML though. I'll have to look into it more.

2:43 devn: Raynes: ever use it?

2:43 Raynes: No, which is why I need to look into it more.

2:44 * ibdknox is not a fan of haml

2:44 * devn kicks you in the shin

2:44 ibdknox: lol

2:44 devn: look, i don't fucking *love* haml

2:44 but it's better than tinkering with straight HTML

2:44 raek: Gertm: no, swank will run in your project process, which will use whatever version of clojure you specify in the project.clj

2:45 devn: ibdknox: what don't you like about it?

2:45 raek: that Leiningen uses Clojure 1.2 under the hood is an implementation detail

2:45 Gertm: ok, I'll just give it a go and see what happens

2:45 raek: you only need to be aware of that if you are hacking on a leiningen plugin or leiningen itself

2:45 Raynes: devn: It seems like indentation-based HTML that is even more difficult to read.

2:46 Gertm: raek: not going to do either of those, so I should be fine :-)

2:46 raek: Gertm: be sure to follow the official tutorials. there are a lot of outdated howto blog posts

2:46 devn: Raynes: without qualifying that statement im going to call BS

2:46 Raynes: That's your basic human right.

2:46 devn: Raynes: even more difficult to read than what? why is it difficult to read?

2:46 raek: https://github.com/technomancy/leiningen

2:46 https://github.com/technomancy/swank-clojure

2:46 devn: sure it's not the lack of familiarity creeping up on you?

2:47 ibdknox: it's pretty hard to read

2:47 devn: compared to what?

2:47 ibdknox: and yes, I've used it

2:47 Raynes: Compared to HTMl.

2:47 HTML*

2:47 The tags are less obvious and it looks like indentation matters, maybe?

2:48 But hey, I've definitely never used it.

2:48 devn: indentation does matter. but why wouldn't i want a hierarchical document like HTML to be indentation-sensitive?

2:49 Raynes: Seems like it would be difficult to restructure a large document.

2:49 devn: that's a symptom of a different problem

2:49 Raynes: Bad editors?

2:50 devn: large document -- where are the modules? partials?

2:50 Raynes: Well, regardless -- it's pretty hideous.

2:50 devn: you know, people say that about lisp

2:50 so smug

2:50 ibdknox: lol

2:50 you're awfully dogmatic about this

2:50 Raynes: Compared to? HTML, XML, whatever. It's just ugly.

2:50 Well, maybe it's just me.

2:50 I'm certainly not going to be smug about it.

2:51 It isn't as simple as "Omg there are parentheses there."

2:51 devn: ibdknox: i find it equally ridiculous that it's okay to be dogmatic about syntax and what not

2:51 ibdknox: hm?

2:51 not sure I follow

2:51 devn: ibdknox: im not sure i formed a complete sentence

2:52 ibdknox: what i meant was: i read something like: "it's hideous" and I cringe

2:52 because it's superficial

2:52 ibdknox: I'm not sure I understand how that's superficial

2:52 while it may not be the most reasoned response, it hints at a number of very important things

2:53 Raynes: I don't understand.

2:53 devn: ibdknox: so what do you think about most peoples' reactions to parens in lisp?

2:53 Raynes: If syntax isn't important, than why not prefer HTML over HAML?

2:53 ibdknox: in CL? I completely agree

2:53 Raynes: Isn't the whole point of HAML to have a *better* syntax, regardless of how terrible I think it is?

2:53 devn: ha, now we're getting somewhere

2:53 ibdknox: how code reads is arguably one of the most important aspects of language

2:53 a language*

2:54 Raynes: Let's take Clojure and replace all parens with square brackets and all square brackets with parens and see how many people are interested in the result.

2:55 devn: i understand that's rhetorical

2:55 but i honestly don't know which side you're arguing for

2:55 Raynes: I don't think I was ever arguing for either side.

2:55 devn: that could reinforce an argument both for and against

2:55 Raynes: If I was, it wasn't intentional.

2:56 I think HAML is hideous. If you feel it necessary to invalidate my opinion because you feel syntax is superficial then that is definitely a personal choice.

2:56 devn: so it's a genuine question? as in: we should replace them and try and get a head count of who wants to use an inverted clojure?

2:56 Raynes: I don't care either way. :>

2:56 It'd be interesting.

2:56 The inverted Clojure experiment, I mean.

2:57 devn: Raynes: im not invalidating your opinion, but i've heard this complaint so often: SOAP sucks, XML sucks, and so on

2:58 ibdknox: they *do* suck

2:58 lol

2:59 Raynes: SOAP sucks *because* XML sucks, doesn't it?

2:59 *shrug*

2:59 Everything sucks.

2:59 devn: so what is the alternative?

2:59 JSON?

2:59 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack>

2:59 Raynes: A nice trollface, probably.

3:00 ibdknox: haha

3:00 Raynes: XML serves its purpose.

3:00 devn: Rich said it himself at Clojure conj: What does XML have that clojure data structures don't? The X.

3:00 Raynes: XML serves its purpose, but it's ugly.

3:01 Could I do it a better way and make it less ugly? No, probably not.

3:01 devn: yes but now you're just proving my point -- ugly < utility

3:02 Raynes: Bu...

3:02 what is this i dont even

3:02 devn: "i'm not even supposed to be here today"

3:06 ibdknox: Raynes: I want to be clear that I'm not saying HAML is the answer to our prayers or something, or that it isn't ugly. I just have a hard time hearing that it's "hideous" without anything to qualify that remark

3:06 Raynes: Okay.

3:07 * devn sighs

3:07 * devn is misunderstood

3:08 ibdknox: lol

3:08 Raynes: http://h.images.memegenerator.net/instances/500x/14567447.jpg

3:09 devn: bahaha

3:09 ibdknox: hahaha

3:09 well done :p

3:11 devn: http://memegenerator.net/instance/14567514

3:13 http://c.images.memegenerator.net/instances/500x/14567514.jpg

3:13 Raynes: Heh

3:13 devn: That website is like the best invention ever, btw.

3:14 devn: heh -- it's awesome until someone writes a bot to facilitate the generation of them in your company's private channel

3:15 i still get a kick out of a lot of them, but im dead to philosoraptor at this point :)

3:20 Raynes: ibdknox: Sorry if I over-reacted there. I live in Wisconsin and it's cold here. I hope I see you guys at Clojure/west.

3:20 Raynes: You'll certainly see ibdknox.

3:20 And no harm done.

3:20 $conditions 35554

3:20 lazybot: Last Updated on February 14, 2:02 AM CST; Mostly Cloudy; Dewpoint: 37 F (3 C); Precipitation today: 0.27 in (7 mm); Temperature: 38 F (3.3 C); Windchill: 35 F (2 C); Wind speed: 4mph; Wind gust: 6.0mph; URL: http://www.wunderground.com/US/AL/Eldridge.html.

3:20 devn: $conditions 53703

3:20 lazybot: Last Updated on February 14, 2:00 AM CST; Light Snow; Dewpoint: 27 F (-3 C); Precipitation today: 0.00 in (0 mm); Temperature: 28 F (-2.2 C); Windchill: 21 F (-6 C); Wind speed: 6mph; Wind gust: 6.0mph; URL: http://www.wunderground.com/US/WI/Madison.html.

3:20 Raynes: Not as bad as the 19F from last night.

3:21 devn: My Wind gust is bigger than your Wind gust.

3:21 Raynes: devn: You can give him $forecast and he'll give you NOTICEs about your forecast.

3:21 devn: $forecast

3:21 Raynes: Well, you need to give him a location. :p

3:21 devn: $forecast 53703

3:21 Raynes: Unfortunately I haven't planted my GPS chip on you yet.

3:22 devn: That seems like exactly the kind of thing someone would say if they *had* planted a chip on me.

3:22 Fossi: -2 celcius is not cold :>

3:22 Raynes: I've been had!

3:23 It's cold if you aren't a bloody eskimo. -.-

3:23 devn: Fossi: I guess what I meant by cold is: My winter anger is flaring up. I'm not meditating enough or something. Damned seasonal depression and all of that...

3:23 </overshare>

3:23 Raynes: I should meditate.

3:23 Unfortunately, I can't really sit still, ever.

3:23 Fossi: you should take vit D ;)

3:23 Raynes: Much less relax.

3:23 devn: Fossi: I do! :)

3:23 Fossi: excellent :)

3:24 devn: Raynes: If you're ever interested pick up Jon Kabat-Zinn's CDs, the first set. Also, check out his talk: http://www.youtube.com/watch?v=3nwwKbM_vJc

5:06 skady: Hi everybody. Is anybody actually reading or are all people just idling? ;-)

5:07 raek: skady: it's night in the US :-)

5:07 Raynes: I live in the US.

5:07 I'm also awake at this ungodly hour.

5:07 skady: Well, this does not mean that nobodys reading

5:08 vijaykiran: only bots .. no one's reading :)

5:08 skady: Last time I checked computer science guys loved to work at night ;-)

5:08 Raynes: Man, I have a job.

5:08 edoloughlin: Quiet down, please. I'm trying to get some sleep!

5:08 Raynes: It doesn't involve academia. I need my sleep.

5:08 I'm just busy being awesome and stuff.

5:09 skady: Stop being tired, be awesome instead! :-)

5:10 Anyway, I'm really interested in trying Clojure and would like to make use of it for a simple web app. But I'm lacking argumentation to defend this choice (part of bachelor thesis). My app involves a certain amount of concurrent tasks, so this a good reason to go for clojure as far as I read.

5:11 vijaykiran: is there any restriction which lang to use or something ?

5:11 skady: But other than that, I'm having a hard time finding further reasons to go for it (from a supervisors point who knows that I could just have done it with existing Java knowledge)

5:11 vijaykiran: No, not at all. Just want to have good reasons for my architecture :-)

5:11 but it's kinda hard to argue when you know so little about the language and ecosystem

5:11 vijaykiran: functional - lispy - concurrent - and JVM

5:12 and no bloated frameworky stuff

5:13 skady: Alright, so that's also what I have read only. Is there any reasons why so many people are actually getting interested in Clojure now? I mean, lisps have been around for quiet some time

5:13 online*

5:14 ejackson: skady - argue that you're a student, and as such need no justification for learning.

5:14 vijaykiran: apart from it is awesome - it is modern Lisp on JVM

5:15 that's why I'm interested in it though - different people might have different opinions

5:15 skady: ejackson: This would work for normal university projects, but this thesis is done in cooperation with a company whose employees might (probably not...) need to maintain it. Of course it is one argument for such an architecture decision.

5:16 Raynes: skady: Clojure is the first new and unique Lisp that has emerged in a while. It became popular because it is an extremely well-designed language and is backed by the JVM which means libraries and infrastructure galore.

5:16 ejackson: you're not an employee, you're a student, ergo: department of somebody else's problem.

5:16 * ejackson notices he's unusually strident today

5:16 skady: like that one :)

5:17 Raynes: Thank you, guess I can use some of this information.

5:18 lucian: skady: a big reason people tend to like clojure is the data structures, and the literals

5:18 ejackson: skady: in seriousness, just argue that Clojure provides all the upside of java in production, combined with significant clarity and ease of use improvements.

5:19 lucian: scheme is very clean and nice but small, and common lisp is practical but horrible. clojure tends to be in the middle

5:19 skady: If you would have to choose some simple webframework for clojure, what would you go for? Note: I don't need a full-blown web stack, but merely a simple web frontend for my application. I also need to have thread control (so that webframework should discourage it).

5:20 Should not discourage..

5:20 vijaykiran: noir seems to be recommended a lot

5:20 I just pick the libraries on my own - enlive, moustache etc.

5:21 Raynes: I've learned to love mustache tonight.

5:21 skady: lucian & ejackson: Guess I can go with this. Thanks a lot :)

5:21 ejackson: Clojure FTW, baby.

5:21 skady: Are you refering to the templating system mustache?

5:21 vijaykiran: no, the routes DSL

5:22 enlive is the templating system I like

5:22 moustache: https://github.com/cgrand/moustache

5:23 ejackson: i use ring and enlive

5:23 Raynes: I'm a big fan of the templating system.

5:23 As of tonight, I'm a much bigger fan of it than Enlive.

5:23 At least for what I'm using it for.

5:24 raek: skady: It could be worth checking this out: (noir builds on top of many of these libs) http://brehaut.net/blog/2011/ring_introduction

5:24 skady: raek: Thank you

5:25 So ring seems to provide basic HTTP routing.

5:25 Guess ring + some tempate mechanism would suffice for the moment :-).

5:25 vijaykiran: ring provides HTTP "abstraction" layer

5:26 I guess you need either compojure/moustache to make your life easier

5:26 to define the routing

5:27 skady: Oh, the compojure example looks very simple.

5:28 ejackson: cemerick: Delorean monster truck !!! LMFAO

5:28 cemerick: seriously

5:28 skady: Well, I guess this all helps a lot. Thank you all very much for your help. Will try too learn more about clojure first and then experiment with a few of these technologies.

5:28 ejackson: my day is complete, i'm going back to bed.

5:30 Raynes: cemerick: So I read the mustache manual tonight.

5:30 cemerick: Turns out, it's about a 1000 times better than Enlive for what I was doing anyways.

5:31 cemerick: you should use that, then :-)

5:31 Raynes: I totally am. It's why I'm up at 4:30AM.

5:32 cemerick: I figured you were just in a particular cycle of your sleep schedule rotation or something. :-P

5:32 * cemerick tries to minimize the number of templating languages he uses/remembers

5:32 cemerick: Still waiting for the One True Templating Solution.

6:29 Gertm: Let me repeat the question for after the netsplit :)

6:29 Versions differ: 2012-01-06 (slime) vs. 20100404 (swank). Continue? (y or n) <- is this a problem?

6:32 Arafangion: Gertm: "the" netsplit?

6:33 Raynes: Gertm: Does hitting 'n' make it work?

6:33 Gertm: Arafangion: yes, didn't you hear? It was legen.. wait for it..

6:33 Raynes: Gertm: Does hitting 'n' make it work?

6:33 Gertm: Lemme try.

6:34 Ah, found the problem. Emacs was loading the quicklisp slime.

6:35 Probably best to move my common lisp setup to a different file if I'm doing clojure.

6:36 Raynes: I was going to be snarky and say "Well, there's your answer." if you had told me it worked.

6:36 But yes, the CL setup is not compatible with the Clojure setup in almost every situation.

6:36 Gertm: Now I have to ask, why is this using such an old version of slime?

6:37 Raynes: Your best bet is to completely separate the configurations.

6:37 Because the SLIME guys never release anything and like making breaking changes every half a second.

6:37 Gertm: Can't argue with that.

6:38 Raynes: :p

6:38 Gertm: :)

6:39 Raynes: But yeah, it's just a really fast moving target and it's generally impossible to follow the development and still work reliably. At least, that's what I've heard. I don't actually work on that stuff.

6:39 Gertm: Ok, now I'm set up, let's start learning this language, shall we? :)

6:39 Raynes: Woot

6:40 Gertm: I'm a little scared though.

6:41 Raynes: You can do it.

6:41 Be a man.

6:41 Gertm: It's the jvm that scares me tbh.

6:42 I know nothing about it.

6:42 Raynes: The JVM is over there and you're over here. Just don't look it directly in the eyes and you should be just fine.

6:42 Man, my analogies must have scared cemerick away.

6:42 Gertm: Sounds like a plan!

6:47 Raynes: Oh man.

6:47 These mustache templates + Clojure are so elegant. I need a towel.

6:48 This was worth staying up until 6AM to do.

6:48 Everything you CTCP me, God kills a kitten.

6:49 * Gertm ctcps everything to Raynes

7:00 tsdh: I have some print-method defmethods for some classes, instances of those classes are now printed as I like them to have. Well, except for objects that are not printed but (implicitly) str-ed first, like in (format "%s" foo). Is there a way to have print-method activated also for stringifying objects except for invoking print-method myself with a StringWriter or so?

7:00 Raynes: http://d.images.memegenerator.net/instances/500x/14571907.jpg

7:01 Goodnight fellow Clojurians

7:01 ejackson: goodnight Mr Raynes.

7:06 tsdh: Ah, print-str is my friend.

7:12 Gertm: Doing (doc doc) in the slime repl throws a stacktrace at me, is this normal?

7:12 cemerick: don't know about SLIME, but (doc doc) should work

7:12 ,(doc doc)

7:12 clojurebot: "([name]); Prints documentation for a var or special form given its name"

7:13 Gertm: When I do it at the command line it works fine.

7:15 cemerick: yup, it should always work

7:15 Gertm: you've been using SLIME with other lisps?

7:15 Gertm: I have, but I disabled the configuration.

7:15 It works fine for everything else.

7:16 cemerick: OK. I don't use SLIME, but everything I've heard is that you should be prepared to be SOL if you use it with multiple lisps.

7:16 Gertm: SOL?

7:16 cemerick: shit outta luck

7:17 Gertm: hmpf, lemme clean up my .emacs a bit more

7:17 ejackson: Gertm: have you done (use 'clojure.repl) ?

7:17 Gertm: ejackson: in the slime repl? no

7:17 cemerick: ejackson: should that be necessary? It's implicit in clojure.main/repl…

7:18 Gertm: ejackson: well that solves it, thanks a lot! :)

7:18 ejackson: yeah, you need to do that to get doc, it hung me out for a while too :)

7:18 cemerick: yup, necessary.

7:18 Gertm: As long as there is a solution to the problems, all is well.

7:18 cemerick: That's really suprising.

7:19 Gertm: Can I make slime execute that on startup?

7:19 dEPyWork: hey guys

7:19 I was doing 4clojure and I'm stuck at flattening...

7:20 Is there a better option than going trough all elements and adding them to result list?

7:20 ejackson: cemerick: yeah, it was so surprising that I submitted a bug report on leiningen... oopsie :)

8:08 jsabeaudry: Is there a facility for evaluating a form with a timeout?

8:09 Ah, too early to ask questions like that!

8:10 ;)

8:10 osa1: how can I create a function with an optional parameter?

8:10 Fossi: osa [foo & body]

8:10 if you want variable param count

8:11 cemerick: jsabeaudry: you want evaluation to halt if the evaluation goes past the timeout?

8:11 kmicu: jsabeaudry: can you give an example?

8:11 Fossi: if fixed just (defn ([] (print 1)) ([a] (print a)))

8:11 jsabeaudry: cemerick, I want to throw a TimeOutException

8:13 osa1: I'm trying to list files in a folder, (. (File. path) (listDir)) doesn't return me a clojure data structure, is there a way to do this with just clojure functions?

8:13 jsabeaudry: kmicu, sure, I want to provide a repl in my webapp (but not sandboxed, I understand the risks) however if I compute something too long by mistake I would like it to timeout

8:13 cemerick: jsabeaudry: The short answer is that you can execute code via a future and deref it with some timeout, but that future will continue to process even if the deref timeout expires.

8:14 jsabeaudry: The long answer is that you want something like the interruptible-eval in nREPL. https://github.com/clojure/tools.nrepl

8:15 jsabeaudry: cemerick, The short answer is something like this? http://osdir.com/ml/clojure/2010-02/msg00913.html

8:16 cemerick: jsabeaudry: Yup; but again, evaluation will continue past the timeout.

8:16 the timeout only applies to the attempt to deref the future, not the evaluation

8:17 jsabeaudry: cemerick, Ok, I understand, thank you very much, I'll study interruptible-eval

8:19 cemerick: jsabeaudry: FYI, I'll be releasing an HTTP Ring handler/transport for nREPL soonish.

8:38 jheander: good morning!

8:40 I've just upgraded to leiningen 1.7.0 and now have problems that lein jar and lein deploy first cleans my working directory and re-runs lein deps. This clears out the "classes" dir that contains compiled protobuf files which are then missing from the jar. How can I solve this? Should I add some hook to the project.clj?

8:41 using clojure-protobuf 0.6.0-beta7 to compile the protobuf definitions...

8:42 kmicu: jheander: Good morning at 3 pm :)!

8:43 jheander: isn't it always morning on the internet? :)

8:43 lucian: of course it is

8:44 dunib: kmicu: good morning at 11:47pm!

8:45 I think it's easier just to say "good day", even if it's night time, it's wishing you a good tomorrow.

8:45 Goodmorrow is an option, but it sounds far too old-timey

8:45 jheander: :)

8:46 lucian: i believe the convention is to always function on local time

8:46 kmicu: lucian: Clojure docs not specify that.

8:46 lucian: so if i join a channel and it's morning, i'll say good morning

8:46 kmicu: irc-tiquette does :)

8:47 kmicu: lucian: give me the source :)

8:47 jheander: kmicu: http://thinkmoult.com/ugt.html

8:48 kmicu: mea culpa! ;]

8:48 * lucian thanks jheander

8:48 lucian: see, it works

8:48 we've just spent that time explaining UGT instead

8:49 jheander: haha! :)

8:51 so anyone know how to work with hooks in leiningen 1.7.0? The clojure-protobuf code contains a nice (add-hook) but it doesn't seem like its invoked. Either because it hookes on a target that I don't run or because the hook is never loaded. Tried adding :hooks [leiningen.protobuf] to project.clj, but it does not make a difference...

8:54 or, actually: adding :hooks makes the hook trigger correctly when running "lein javac", but it seems "lein javac" is not run during "lein jar"...weird :)

9:08 samaaron: afternoon all

9:08 ckirkendall: well not all its morning here :)

9:09 samaaron: ah, but there's only one true time: GMT ;-)

9:10 but if you want to pretend it's morning, then fine :-p

9:12 osa1: what are differences between binding and let?

9:12 * cemerick is all for eliminating timezones and going to UTC

9:12 ejackson: hello samaaron

9:13 samaaron: ejackson: howdy goodly sire

9:14 cemerick: osa1: let establishes named locals, binding establishes thread-local bindings for vars

9:15 kmicu: osa1: http://clojuredocs.org/clojure_core/clojure.core/binding

9:23 samaaron: does anyone have any experience using native libs using more recent versions of lein?

9:24 i've been using cake for the last year or so for this task - but i'm looking to move back to lein

10:06 octe: is there a way of checking if a variable is something iterable, like a vector/seq?

10:07 TimMc: octe: coll?

10:07 octe: thanks

10:07 TimMc: octe: It's a little complicated, actually.

10:08 You can "iterate" over nil, and if you call seq on certain things you get back soemthing iterable

10:08 octe: TimMc, well, yes, but i want to know is if i can pass it to apply

10:09 TimMc: &(apply str "hello")

10:09 lazybot: ⇒ "hello"

10:09 TimMc: octe: What you really want to know is, "Does seq accept this?"

10:09 and there's not currently a clean way of finding out.

10:20 octe: TimMc, ah.

10:21 &(seq? "hello")

10:21 lazybot: ⇒ false

10:21 octe: &(coll? "hello")

10:21 lazybot: ⇒ false

10:21 octe: mhm, afer thinking about it, i do want to know if it's some kind of collection and can be used with apply

10:21 coll? seems to work for my use

10:27 kmicu: &(ancestors (class "hello"))

10:27 lazybot: ⇒ #{java.lang.Object java.io.Serializable java.lang.Comparable java.lang.CharSequence}

10:34 kmicu: octe: &(source coll?)

11:00 raf_: hello, I have what might be a stupid question. I want to read in a map from a file and bind it to a var. What is the easiest way to do that.

11:01 ejackson: raf_: define it in the clj file

11:02 (def my-var {:a 1 :b 2}) in my-data.clj. Then (use 'my-data.clj)

11:02 TimMc: raf_: Is this for a config file?

11:02 raf_: yes its config with db credentials

11:02 TimMc: You can (read-string (slurp "file.clj"))

11:03 and (binding [*read-eval* false] ...) around that if you don't trust the file.

11:03 jsabeaudry: Is it possible to have a security.policy file to be usable from both the uberjar and a source tree?

11:03 raf_: ok so does read-string eval the stirng?

11:03 bc i tried just slurp

11:03 TimMc: raf_: No, but see (doc *read-eval*)

11:03 ejackson: TimMc: that's cute.

11:03 raf_: ok thanks guys!

11:04 TimMc: ejackson: That's what she said.

11:04 ejackson: _)

11:06 jsabeaudry: Let me put it another way, is there a way to reference a file that is in the jar when specifying jvm-opts ?

11:06 raf_: awesome, it all works now. Thanks TimMc and ejackson

11:07 TimMc: jsabeaudry: I believe in Java-land there is a convention for that, like path/to.jar!path/inside.file

11:07 s/convention/syntax/

11:08 jsabeaudry: TimMc, Are you aware of a way to "embed" jvm opts "in" an uberjar ?

11:09 TimMc: jsabeaudry: beyond catting a file to the fornt, no.

11:09 *front

11:09 You might look at Manifest.mf specs

11:11 jsabeaudry: TimMc, Alright, I'll check that out, thanks!

11:21 TimMc: jsabeaudry: Can you do something sneaky like have a jar inside a jar and trampoline into that?

11:22 jsabeaudry: And there's this, but I don't know enough about Java security to tell whether it is what you want: http://www.javakb.com/Uwe/Forum.aspx/java-security/606/Policy-file-in-a-Jar

11:24 jsabeaudry: TimMc, I guess that kind of trickery could possibly work but as of now it was more a matter of convenience than requirement. I'm taking note of that link though in a low priority issue :) good find!

11:53 * ejackson can't imagine how he coded without -?>

11:54 ejackson: its so great !

11:54 seanm: what is it? Don't think I've seen that before

11:56 ejackson: aah, its the coolest

11:56 its -> but as soon as anything returns nil, the whole thing stops and returns nil

11:56 achengs: short circuiting -> on nil

11:56 seanm: oh that is hot

11:56 ejackson: i don't want to say its a monad.... only it is.

11:57 in effect

11:57 cemerick: it's not

11:57 ejackson: but I don't want to get battered by smart people, so I'm not going to stick to those guns

11:57 cemerick: :-P

11:57 ejackson: ^^^

11:57 seanm: haha

11:57 I'm with ya there

11:57 cemerick: ejackson: see http://blog.fogus.me/2010/09/28/thrush-in-clojure-redux/

11:58 achengs: side question: what's the basic reason a domonad doesn't show up in a stack trace? it must be simple but I don't get it yet

11:58 cemerick: also, see fnil for an oft-ignored nil-related fn

11:58 ejackson: fnil !

11:58 something new

11:58 achengs: is domonad a macro ?

11:58 achengs: yes

11:59 ejackson: cemerick: that's highly useful, thanks.

12:00 achengs: if I bind symbol foo to the result of a state-m domonad, isn't foo bound to a fn that takes a state and returns [value new-state]?

12:04 ejackson: achengs: FWIW: I'm not good with this stuff and I don't have the particulars to hand, but a macro gets evaluated at read-time, so probably won't be around when the stacktrace is thrown. That will be on the code it outputs.

12:05 seanm: I think that's correct, it probably shows up in a stack as gensym's depending on how the macro's written

12:05 achengs: ejackson: yes. so I was thinking foo never sees the domonad macro, but instead sees the fn left behind... and then gets bound like in an ordinary defn so when I call foo I thought I should see foo in the stack trace

12:06 ejackson: i got nothing

12:06 achengs: I see m_bind's instead which are all on the same line (where the monad was defined) which is less useful.

12:07 seanm: I have pretty much 0 experience with stack traces in binds unfortunately

12:07 maybe I should start messing with that

12:18 jsabeaudry: Regarding clojail, I granted java.security.AllPermissions but I am still getting FilePermission exceptions? Anyone encountered that problem?

12:23 jimduey_: acheng: You've got it right. Stack traces with domonad are pretty hard to trace through.

12:24 Bronsa: i wonder why fnil isn't implemented like this https://gist.github.com/1828382

12:26 jimduey_: ejackson: -?> is very similar to (domonad maybe-m ...) in effect. Except maybe-m lets you bind the results of the various stages to symbols for use later. Similar to a nested series of when-let's.

12:27 achengs: jimduey: it might dissuade me from using monads for my current use case (framework for maintainers of tests which fail often due to dev work)... I guess the answer is this: a domonad leaves behind a do statement with m_bind's and m_results... and since this is not a fn, then binding foo to this and calling foo won't cause foo to show up in the trace

12:27 ejackson: jimduey_: that's what I was intimating earlier, but knew there were brickbats about :)

12:27 jimduey_: :)

12:28 ejackson: the unwary inaccuracy is fatal in this town

12:28 achengs: ejackson: and I'm guessing a proper monad can be combined or transformed as expected vs -?>

12:28 ejackson: zakly

13:07 dEPy: any1 can help me with my compress function? http://pastie.org/3382433

13:07 it's for http://www.4clojure.com/problem/30

13:07 And I get OK result except the first item is not there in the final list

14:09 technomancy: weird; monitor-enter and monitor-exit are special forms

14:09 never noticed that before

14:10 robinkraft: I'd like to create a comma-separated string by joining a few integers with a vector. the following works, but I know I'm missing some simple combination of map/reduce/apply that would make this more elegant.

14:10 (let [lat 90

14:10 lon -180

14:10 series [1 2 3]

14:10 j (partial join ",")]

14:10 (j [lat (j [lon (j series)])]))

14:11 (let [lat 90

14:11 crap, sorry about the line breaks

14:12 emezeske: In case anyone needs another example of why package signing is a good thing: http://dev.horde.org/h/jonah/stories/view.php?channel_id=1&id=155

14:12 robinkraft: gist here: https://gist.github.com/1829381

14:12 TimMc: robinkraft: You want to turn [1 2 3] into "1, 2, 3" ?

14:12 robinkraft: Ultimately I'd like "90, -180,1,2,3"

14:13 ibdknox: (join "," (concat [lat lon] series))

14:14 TimMc: robinkraft: Wait, *sometimes* with spaces?

14:14 robinkraft: that should do it!

14:14 TimMc: emezeske: https://github.com/technomancy/leiningen/issues/31 :-(

14:14 robinkraft: no, never with spaces

14:14 clojurebot: I don't understand.

14:15 robinkraft: ibdknox: thanks!

14:15 technomancy: TimMc: regular maven signing just involves uploading a .asc file alongside your jar

14:15 it doesn't necessarily mean placing any new files inside the jar from what I gather

14:15 emezeske: TimMc: That's pretty cool.

14:16 technomancy: emezeske: we're considering having the next-gen clojars accept signed uploads only for releases.

14:16 assuming we can make the signing process seamless

14:17 (FSVO seamless)

14:17 TimMc: technomancy: Oh, nice!

14:17 technomancy: TimMc: seems like issue 31 is pretty easy to solve just by adding more entries to :uberjar-exclusions, right?

14:18 TimMc: technomancy: You already accepted a patch for that, silly.

14:18 emezeske: technomancy: That's great. I had seen some arguments against that in here, but I think it is a very very good idea.

14:18 technomancy: TimMc: yeah, but the comments have someone mentioning a new issue

14:18 TimMc: emezeske: Yeah, signed jars as dependencies were annoying the hell out of me. I don't know if there's a good story for signed deps in uberjars...

14:18 Oh, really?

14:19 technomancy: TimMc: I asked for more clarification, just ignoring it till I hear more

14:19 since the workaround is easy

14:19 ritre: robinkraft: You can use list* instead of concat.

14:19 technomancy: emezeske: mind if I ping you once I pick up the signing issue? sounds like you've got some opinions on it. =)

14:19 ritre: &(clojure.string/join "," (list* 90 -190 [1 2 3]))

14:19 lazybot: ⇒ "90,-190,1,2,3"

14:19 TimMc: robinkraft: Your example output had sapces. *shrug*

14:20 emezeske: technomancy: Sure! Not sure how much help I'll be though. :)

14:20 robinkraft: TimMc: sry bout that, I didn't notice. thanks for looking though

14:22 ritre: appreciate the hint - that's exactly the level of generality I need

14:28 jkdufair: technomancy: jack_in.clj breaks in cygwin due to win/unix path issues and the use of (System/getProperty "user.home"). i'd love to fork and fix it. any ideas on how to even approach this?

14:29 technomancy: jkdufair: hm; not really, I haven't used cygwin.

14:30 I know cygwin's inconsistency regarding home has caused a lot of issues in Leiningen itself

14:31 jkdufair: is it worth having an abstraction for that?

14:32 * jkdufair can't afford a mac right now

14:32 technomancy: unix doesn't have to cost money =)

14:32 foodoo: (Linux)

14:32 jkdufair: and can't afford a machine that can run a decent vm

14:32 for linux

14:32 technomancy: "No one should be denied access to unix because of lack of funds."

14:33 sounds like a human rights declaration or something

14:33 jkdufair: of course, there's dual boot. bleh

14:33 technomancy: happy to take a patch, I just don't know enough about the problem to advise.

14:33 jkdufair: ok thx

14:36 emezeske: jkdufair: Yeah, dual boot is no fun. It's annoying knowing that there is a Windows partition next to your real OS.

14:36 TimMc: :-)

14:36 emezeske: :P

14:36 jkdufair: yeah cygwin works so well but alas there's no java for cygwin

14:36 * technomancy dual-boots Debian and Emacs

14:37 TimMc: haha

14:37 jkdufair: EmacsOS. Now we're talking.

14:37 didn't that used to exist at some point?

14:37 TimMc: emezeske: I don't mind too much, but then... the Windows partition on my laptop is actually a honeypot for thieves.

14:37 ibdknox: not nearly as efficient as vimOS ;)

14:37 emezeske: TimMc: hahaha

14:37 technomancy: TimMc: thieves and border-crossing agents

14:37 I guess it's more like dual-booting Emacs and Mozilla

14:42 TimMc: technomancy: Correct.

14:42 And hopefully they don't notice the big ol' encrypted Linux partition.

14:44 alexyk: given a dec and a sequence of indices, how do I most elegantly get the seq of the elements of dec at those indices?

14:45 technomancy: a vec?

14:45 TimMc: "dec"?

14:45 deque?

14:45 technomancy: (map my-vec [0 24 95 255])

14:46 ibdknox: (map my-vec (map dec indices))

14:46 all possible interpretations of that question :)

14:46 * technomancy interprets vague questions as however results in the simplest answer

14:47 emezeske: ibdknox: Have you had a chance to glance at https://github.com/ibdknox/crate/pull/1 yet?

14:47 ibdknox: emezeske: yep, seems reasonable

14:47 TimMc: technomancy: "You can't." :-P

14:47 alexyk: (dec …) what's wrong with you people! :)

14:47 lazybot: ⇒ -1

14:47 alexyk: vec

14:47 Lion is evil

14:47 emezeske: ibdknox: Cool. I'm already using a bunch of that stuff in my closed-source project, and it's great

14:48 ibdknox: emezeske: there are a couple other improvements I want to make at the same time

14:48 TimMc: alexyk: Oh, you should have mentioned you had a writing impediment!

14:48 emezeske: ibdknox: Ah, nice

14:48 alexyk: TimMc: Lion has it, it's getting serious

14:48 technomancy: alexyk: "It looks like you're trying to chat on IRC. Would you like me to replace what you type with nonsense?"

14:48 TimMc: We would have been more sensitive.

14:48 technomancy: the return of clippy!

14:48 ibdknox: so I'll merge that in and add those at the same time and release 0.2.0

14:49 alexyk: technomancy: so I need selection of a vector at given indices. Will your map still apply?

14:49 ibdknox: I must not have that magical lion setting

14:49 emezeske: Sounds good. I'll be happy to iterate on that stuff if you have any concerns.

14:49 technomancy: alexyk: sure

14:49 ibdknox: my text does not get autocorrected

14:49 technomancy: magical lion setting sounds like an RPG quest

14:49 TimMc: &(map (vec (range 10 20)) [1 5 9])

14:49 lazybot: ⇒ (11 15 19)

14:52 jsabeaudry: ibdknox, emezeske, Is there any project that serves as an example of hiccup, crate and cljs-build crossovers?

14:53 not separately but in synergy

14:53 emezeske: jsabeaudry: my closed-source project :( :(

14:53 ibdknox: I haven't had a use for crossovers yet

14:54 emezeske: I use crossovers for a few things, my favorite of which is a macro that defs html IDs and their selectors at one time

14:54 So my server-side hiccup code uses the ID and my client-side stuff uses the selector

14:55 No more typo-ed mismatches! :)

14:55 ibdknox: I find that most of my errors in Clojure stem from typo'd keywords

14:55 :/

14:55 technomancy: so ur/web actually uses the compiler to ensure that every link within the webapp goes to an existing handler

14:55 it's actually able to guarantee no 404s

14:56 emezeske: yeah, I actually do also share my url-building code with crossovers

14:56 I dunno about guaranteeing no 404s ;), but less maybe

14:57 augustl: is there a document I can read to grok repositories and all that jazz in leiningen? Never used maven, java, etc. https://github.com/twall/jna seems to assume I already know how to do it.

14:57 technomancy: augustl: try "lein help tutorial"

14:58 augustl: thanks

15:05 technomancy: hmm, I can't seem to find any relevant information there

15:06 I still don't understand what I need to do in order to add jna to my project.

15:06 the jna readme mentions no repositories, does that mean it's probably not in any repository?

15:08 technomancy: lein search might tell you

15:09 if they've published it on clojars or central then it would be reasonable not to mention it in the readme, but it's also possible they've simply neglected to publish it if they aren't expecting anyone to use it

15:09 jsabeaudry: augustl, You want want to check how clojure-jna did it https://github.com/Chouser/clojure-jna

15:10 augustl: can I somehow tell leiningen to use https://github.com/downloads/twall/jna/jna.jar?

15:11 and not look for it in a repo

15:12 odd, clojure-jna has no package.clj

15:12 technomancy: clojurebot: repeatability?

15:12 clojurebot: repeatability is crucial for builds, see https://github.com/technomancy/leiningen/wiki/Repeatability

15:12 technomancy: augustl: see "Free-Floating jars" at the link above

15:12 augustl: ah thanks

15:12 dEPy: ,(concat 1 2)

15:12 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long>

15:13 augustl: technomancy: so I'll have to write my own shell script and use curl, or something like that?

15:14 I've no problem trusting the github link

15:15 technomancy: augustl: like it says, if you need it to work on more than one machine, you need to put it into a repository; otherwise use lein-localrepo

15:17 augustl: also report a bug with the project

15:18 augustl: it seems lein-localrepo is just an util for fetching etc, I can't add the URL to the jar in my project.clj, correct?

15:19 Apage43: these are all wrappers around Maven. If you want to be able to depend on it in a project.clj it has to live in a Maven repo somewhere.

15:19 augustl: hmm, it is here http://repo2.maven.org/maven2/net/java/dev/jna/jna/3.4.0/

15:20 as net.java.dev.jna, instead of com.sun.jna

15:20 sould I use that one then?

15:21 then there's http://search.maven.org/#browse|-2700344 but that's a very old version

15:21 Apage43: http://search.maven.org/#search|ga|1|jna

15:21 technomancy: depends on the project

15:22 augustl: Apage43: 3.0.9 is very old

15:22 Apage43: the net.java.dev.jna on maven central was uploaded on 21 Dec

15:22 it's 3.4.0

15:22 http://search.maven.org/#artifactdetails|net.java.dev.jna|platform|3.4.0|jar

15:22 augustl: yeah, but is it the same package? Who knows..

15:22 Apage43: github.com/twall/jna is the URL listed in the pom

15:23 augustl: hmm, maven can't find the artifact with "[net.java.dev.jna "3.4.0"]" in my project.clj

15:24 this is hard :)

15:24 TimMc: wrong spec

15:24 [net.java.dev.jna/platform "3.4.0"]

15:24 augustl: ^

15:25 augustl: ah, there's an artifact id there too

15:25 thanks

15:25 Apage43: er

15:25 you prolly want [net.java.dev.jna/jna]

15:25 http://search.maven.org/#artifactdetails|net.java.dev.jna|jna|3.4.0|jar

15:25 i linked to the wrong thing

15:26 augustl: ah, that seems to work

15:35 clj_newb: Regular expressions define regular languages over unicode characters. Now, I want to define a regular language over arbitrary objects. Is there a library for this? [I have a vector of objects, and I want to know if it matches a certain abstract pattern.]

15:36 TimMc: I think I've seena lib for this in Java.

15:36 foodoo: clj_newb: out of curiosity: What kind of things do you want to check? Something like vec[0].foo=4 && vec[1].bar=9 ?

15:37 clj_newb: I'm pattern matching keystrokes

15:37 amalloy: you should invest in learning fnparse. it's more powerful than regexes (it's a full parser), and it lets you use anything as your tokens

15:37 clj_newb: so I have this WYSIWYG editor, and I need a way to define key bindings

15:38 and I want to describe key bindings as regexes over key events (basically modifiers + characters)

15:38 amalloy: does it parse CFGs?

15:38 TimMc: It's a full parser.

15:38 amalloy: it probably parses contextual grammars as well

15:38 clj_newb: hmm, EBNFs are equiv to CFGs right?

15:39 TimMc: I don't see why not.

15:40 foodoo: clj_newb: I wonder if you approach the problem in a too complex way. Won't maps also work with the key symbols being the map-keys?

15:41 clj_newb: or do you plan to implement something as complex as Emacs or Vim bindings?

15:42 clj_newb: I'm going for something as complicated as emacs/vim

15:42 foodoo: clj_newb: so we will soon have a new contestant for the best editor of all times :D

15:43 clj_newb: more like another editor with 1 user

15:43 TimMc: clj_newb: SO use Emacs' or vim's command algorithms.

15:44 Multics Emacs, for instance, has recursive lookup tables.

15:44 clj_newb: TimMc: besides the source code, are their algorithms documented anywhere?

15:45 actually, why don't I define my key short cuts

15:45 as a stack laguage

15:45 like a miniforth

15:45 TimMc: Finite State Machines

15:46 clj_newb: Probably? I read about it somewhere...

15:50 jaimef: so I remove all references to clojure*jar, and run lein and it bombs on "main" java.io.FileNotFoundException: Could not locate leiningen/core/main__init.class

15:56 TimMc: jaimef: Whoa, back up.

15:56 Raynes: Hahaha

15:57 https://refheap.com/paste/750 Immortalized.

15:58 TimMc: Raynes: You need a new hobby.

15:58 Raynes: It's true.

16:04 superjudge: Question: I am looking at ways to create a sort of REST "transit" thingy, i.e. something that offers a REST API to the "outside", and makes calls to another REST API on the "inside". The purpose is wrap the inside interface to present a simpler interface to the outside, and to make some transformations of the results obtained from the inside interface. I am fairly new to doing "real" stuff in Clojure, and it has been a while since

16:04 did any Java work, but I seem to remember that servlets are not very suitable for making outbound HTTP calls. I have been looking at compojure, compojure-rest, and Noir, and they all seem very nice for creating "terminating" services, but it is not obvious to me if there is a reasonable way of doing "transits". Any pointers would be highly appreciated.

16:05 In this particular case it is actually an instance of elasticsearch that sits on the "inside", and I wish to offer a simpler interface and mangle the query results somewhat.

16:05 cemerick: superjudge: You want a decent HTTP client. Try https://github.com/dakrone/clj-http

16:06 * dakrone uses clj-http to talk to elasticsearch for work

16:08 superjudge: cemerick: Yeah, I actually played with that, but will it play nicely to just make outbound HTTP calls in a "handler" (I don't know the correct term here, but I mean making outbound calls from something that I assume is essentially a Java servlet)? It won't wreak havoc with threading models and whatnot?

16:09 cemerick: superjudge: well, whether you make a call synchronous with the handling of the inbound request depends on a lot of factors that are hard to generalize without knowing the semantics of the HTTP apis involved.

16:10 You can certainly call out and block on the response to the API you're wrapping if need be.

16:10 i.e. it's not going to break anything; will certainly be more resource-intensive than performing calls asynchronously, but it might be the only correct way to do things.

16:11 superjudge: cemerick: Yes, I assume that would be what would happen if I do not take any other measure than just do, say, an outbound "get" or "put" with clj-http?

16:12 cemerick: superjudge: you may have no choice if you need to ensure certain semantics.

16:13 If the operations involved were idempotent, then you could fire and forget, but otherwise…

16:15 superjudge: cemerick: yeah, but I guess also in the case where I actually want to get a response back, transform it, and then send the transformed response back as the response of the original, incoming request, there is some fairly involved stuff to map things together in an async model, I guess. And I guess it also depends a lot of the actual network and "dispatching" model of the underlying servlet container.

16:17 hiredman: superjudge: have you seen drewrs elasticsearch client?

16:17 https://github.com/drewr/esperanto

16:17 superjudge: cemerick: but anyway, cool, I'll do some more tests with clj-http tomorrow, and I shall also dig a little bit in the documentation of Tomcat and Jetty

16:18 hiredman: no, that one I haven't seen, I'll certainly check it out! Thanks!

16:18 cemerick: superjudge: I wouldn't worry too much about tomcat or jetty; I'd expect them to be a non-factor (or, they should be).

16:23 superjudge: cemerick: yeah, I was just thinking from the perspective of whether you could actually do outbound calls non-blocking and hook into the network handling code of e.g. Tomcat or Jetty. But maybe I am way off from how they are actually implemented? It is obviously much simpler to just make blocking outbound calls, I am just curious on what alternatives there could be.

16:24 Also, I have done some Node.js coding lately, which has obviously twisted my mind in strange and unforeseen ways...

16:24 cemerick: superjudge: "network handling code"?

16:25 Tomcat and Jetty likely have no infrastructure for making outgoing HTTP calls.

16:26 yazirian: sounds more like http server push

16:26 cemerick: oh, I see

16:26 yazirian: which i know nginx has modules for, probably others do too

16:26 cemerick: They both support asynchronous response, a la comet IIRC

16:26 ibdknox: why not just use netty?

16:26 non-blocking from the ground up

16:27 cemerick: That doesn't really save you anything resource-wise though; you're still going to be chewing up a thread making the external HTTP call.

16:27 ibdknox: as in making an http call out of the app?

16:27 yazirian: depends on the implementation, those calls can be aggregated into something nio-based

16:27 ibdknox: that can be done nio too

16:28 netty is a generic networking platform

16:28 superjudge: ibdknox: is netty also a servlet container? Does it work with things like composure? Sorry, as I said, I have been away from the Java world for quite some time...

16:28 lucian: is it like twisted in scope?

16:28 yazirian: certainly doesn't need to be 1:1 ratio of threads to back-end requests

16:28 ibdknox: superjudge: compojure you mean? Yes, I have examples of Noir on netty

16:29 superjudge: ibdknox: Oh, that sounds interesting!

16:29 ibdknox: yeah, you can think of it as a much more mature node.js

16:31 jaimef: TimMc: back up?

16:31 superjudge: So, what I am basically driving at is just this, i.e. is it possible to both have these pretty nice frameworks like compojure AND the efficiency of non-blocking network layer, but without all the nasty callback stuff of Node.js (and a much nicer language, like, say, Clojure).

16:32 I'll absolutely have a look at netty then.

16:35 ibdknox: superjudge: you should check out Noir :)

16:37 superjudge: ibdknox: Yes, I've actually played with that as well, and it is really nice!

16:38 I still haven't figured out fully on what different levels the popular "framework" operate on, and how much I need for just doing REST stuff, but I already did some simple REST things on Noir, which actually worked very well and was very simple.

16:39 ibdknox: superjudge: Noir is built on compojure and is just a very thin abstraction to make it easier to organize and deal with writing stuff in compojure

16:41 if you don't use any of the other stuff Noir provides, it's basically at the same level just with a slightly more flexible syntax :)

16:41 brehaut: superjudge: if you dont mind me pimping my own stuff: http://brehaut.net/blog/2011/ring_introduction

16:41 (it doesnt cover noir (sorry chris))

16:41 ibdknox: brehaut: I cry at night on the days I see this ;)

16:42 brehaut: ibdknox: its on the list of things to do!

16:42 ibdknox: it's a great rundown of it. superjudge it's worth the read

16:42 brehaut: honest

16:42 superjudge: brehaut: he, he, I actually just found that blog entry like 10 minutes ago or so! Seems very good, I am reading it now...

16:43 Got to go put the kids to bed now, but thanks a lot everyone, I now have some new leads to follow!

16:43 brehaut: superjudge: the code *should* all work with clojure 1.3 and the more recent versions of all the libraries but i havent completed testing all that yet

16:45 superjudge: brehaut: sounds great, I'll continue going through it tomorrow. I'll let you know if I find anything not working!

16:45 brehaut: thanks

16:47 seancorfield: brehaut: if you do decide to update that blog post, maybe you could refer to clojure.java.jdbc instead of clojure.contrib.sql?

16:47 brehaut: seancorfield: oh right. very good point

16:48 seancorfield: i'll do that right now so as not to forget

16:50 seancorfield: i'll overlook the lack of FW/1 coverage there, but like ibdknox, i too cry at night about it :)

16:51 ibdknox: Noir was out when he wrote it :p though it was a baby then :)

16:51 brehaut: seancorfield: FW/1 didnt even exist for clojure when i wrote that did it? noir i actually chose to omit

16:51 seancorfield: brehaut: i'm just teasing :) yeah, the article predates the clojure port of FW/1...

16:53 brehaut: :)

16:53 seancorfield: i started it in late may '11 but got stuck trying to work with enlive in early june and put it aside until after the conj

16:53 ibdknox: brehaut: out of curiosity, why *did* you omit it? Just because it was so new?

16:54 brehaut: ibdknox: newness and the article was also already monsterously long

16:54 ibdknox: true that

16:54 brehaut: id been working on it for about 4 months when i decided to just post the damn thing

16:54 Raynes: brehaut: 4 months?

16:54 brehaut: Dude, I write all my blog posts in one or two days.

16:55 You need discipline.

16:55 seancorfield: heh, i have blog posts partly written that have laid around for months

16:55 brehaut: yeah. i started it in feb, and posted it in june?

16:55 ibdknox: lol

16:56 seancorfield: i just looked at the FW/1 commit history - i had that convo with cemerick at Strange Loop and "re-launched" FW/1 a few days before the Conj, it seems...

16:56 one day i'll actually get ppl using it :(

16:56 maybe i can bring some of my FW/1 CFML communit over to Clojure with it :)

16:56 ibdknox: more Clojurians! :D

16:57 seancorfield: the original CFML version is widely used... and the most watched / most forked CFML project on github (or it was last time i looked)... which is a bit sad really...

16:57 * technomancy is all for more gateway drugs

16:57 technomancy: having just written lein-scalac

17:10 mi6_x3m: hello

17:10 I am an enterprise Java dev

17:10 sick of writing down every data type

17:10 since I am also a scientific research guy I though id give clojure a try

17:10 will it help me overcome my rage?

17:11 amro: you must search deep inside yourself for that

17:11 foodoo: mi6_x3m: That partly depends on yourself

17:11 technomancy: it will help you channel your rage in productive ways

17:11 mi6_x3m: well I am working with F# and it helps me a lot, I expect the same from clojure

17:12 alexyk: how do you concatenate a bunch of strings adding "\n" in between?

17:12 technomancy: clojure.string/join

17:12 foodoo: mi6_x3m: Maybe you should start playing around on http://4clojure.com The first puzzles are pretty simple even for non-Clojorians

17:14 mi6_x3m: Id rather know if I can easily interface with existing Java libs

17:14 Hybernate, say

17:14 log4j etc.

17:14 i.e. how "practical" is clojure

17:15 foodoo: mi6_x3m: http://clojure.org/java_interop

17:15 mi6_x3m: that's how you can work with practically every Java lib

17:16 brehaut: seancorfield: http://brehaut.net/blog/2011/ring_introduction fixed

17:16 mi6_x3m: foodoo: thank you!

17:16 seems to be the right thing to learn then

17:17 alexyk: given a list of words, what's the idiomatic way to get a map of word counts?

17:18 amalloy: &(dor frequencies)

17:18 lazybot: java.lang.RuntimeException: Unable to resolve symbol: dor in this context

17:18 amalloy: &(doc frequencies)

17:18 lazybot: ⇒ "([coll]); Returns a map from distinct items in coll to the number of times they appear."

17:20 chewbranca: mi6_x3m: I highly recommend watching some of the clojure videos, such as http://blip.tv/clojure/clojure-for-java-programmers-1-of-2-989128

17:20 mi6_x3m: chewbranca: I got a nice book to read :)

17:20 or do they talk about something eles than a language introduction

17:20 seancorfield: mi6_x3m: at work we use Clojure as a general purpose dynamic scripting language for the back end of our Internet dating platform

17:21 mi6_x3m: seancorfield: cool

17:21 seancorfield: so we're doing a lot of practical stuff with it - persistence, html email generation, xml, json, logging, log file analysis, interacting with 3rd party rest apis etc

17:22 mi6_x3m: sweet than I am definetely starting with it

17:22 foodoo: seancorfield: do you have a blog about this stuff?

17:22 seancorfield: you can read about some that here: http://corfield.org/search/real+world+clojure

17:22 chewbranca: mi6_x3m: the design and pragmatic decisions made in clojure greatly influenced my interest in the language, a lot of thought went into the features of the language itself, so its interesting to hear it straight from Rich Hickey's mouth

17:23 seancorfield: foodoo: yeah, i blog about clojure a lot :)

17:23 foodoo: seancorfield: bookmarked

17:23 seancorfield: the clojure stuff is all here: http://corfield.org/cat/clojure

17:40 dnolen: hmmm ... seems like there's some real interest in ClojureScript from the various JS communities

17:42 ibdknox: dnolen: oh?

17:45 TimMc: jaimef: Yes, there was no context in your question, it was impossible to tell what you meant by "removing clojure*jar". I'm heading out to dinner right now though, so I probably won't see your response.

17:46 &(let [] (require '[clojure.string :as s2]) s2/join)

17:46 lazybot: java.lang.RuntimeException: No such namespace: s2

17:46 TimMc: &(do (require '[clojure.string :as s2]) s2/join)

17:46 lazybot: ⇒ #<string$join clojure.string$join@548695>

17:46 TimMc: &(do (require '[clojure.string :as s3]) s3/join) ;; just to make sure...

17:46 lazybot: ⇒ #<string$join clojure.string$join@548695>

17:47 amalloy: subforms of 'do forms at the top level are treated as separate top-level forms

17:47 TimMc: ^ Is that behavior because a top-level do's subforms are independently read and eval'd...

17:47 OK, thanks. :-)

17:51 technomancy: TimMc: aka the gilardi scenario

17:58 scgilardi-: I happened to be looking up progn in the common lisp hyperspec today. I smiled when I saw "If progn appears as a top level form, then all forms within that progn are considered by the compiler to be top level forms." (precedent for something like the special handling done by clojure's do when it's top level)

17:58 robinkraft: Can anyone recommend particularly good tutorials/readings on recursion in Clojure? I can follow along in examples, but I have a lot of trouble modifying them or rolling my own.

17:58 I need to make a collection monotonically increasing. (mono-inc [3 1 5]) ==> [3 3 5]. This seems ripe for loop/recur, but per my earlier question I'm still having trouble wrapping my head around that form.

17:59 I thought something like (apply max (partition 2 1 [3 1 5])) might work, except that this throws an error (probably for obvious reasons for a non-newb): clojure.lang.LazySeq cannot be cast to java.lang.Numberclojure.lang.LazySeq cannot be cast to java.lang.Number

17:59 It's also incomplete - I need to retain the max, and so I can use it to compare with the next value in the vector. So it's sort of a moving maximum with replacement.

18:00 I could really use suggestions on how to approach this

18:01 arohner: robinkraft: what do you want mono-inc to do? I don't understand the example

18:01 aperiodic: well, (apply max (partition 2 1 [3 1 5])) fails because partition returns a list of lists, so applying max to that fails because max doesn't accept lists as args

18:02 robinkraft: arohner: if I have a series of integers [1 5 4 3 2 6 7], I want to build a vector of the maximum of a moving window of 2 elements. So compare 1 and 5, keep 5, compare 5 and 4, keep 5 again, etc. The result would be [5 5 5 5 6 7]. I'll deal with the 1 at the beginning elsewhere

18:03 arohner: robinkraft: that sounds like a job for reduce

18:04 brehaut: (defn mono-inc [s] (second (reduce (fn [[max v] i] (let [new-max (Math/max max i)] [new-max (conj v new-max)])) [(first s) []] s)))

18:04 robinkraft: aperiodic: thanks. how would you recast the result of partition so apply max doesn't throw an error?

18:05 brehaut: i think i might have misread the problem though

18:05 jkkramer: ,(rest (reductions max [1 5 4 3 2 6 7]))

18:05 clojurebot: (5 5 5 5 6 ...)

18:05 robinkraft: brehaut: that worked. Still reading through it though

18:05 arohner: jkkramer: wow!

18:05 robinkraft: arohner: seriously!

18:06 jkkramer: nice!

18:06 jkkramer: :)

18:06 robinkraft: holy cow that blows my mind.

18:06 jkkramer: basically a translation of his description: "compare 1 and 5, keep 5, compare 5 and 4, keep 5 again, etc."

18:06 hagna: after thinking it over I'm going to get the joy of clojure just in case anyone cares :)

18:06 brehaut: jkkramer: oh, nice :)

18:06 * aperiodic slow claps

18:07 brehaut: i always forget about reductions

18:07 robinkraft: ok, so I'm glad to have dodged loop/recur again, but I could still use some schooling on that. any favorite blog posts, book chapters, etc.?

18:07 hagna: robinkraft: maybe the joy of clojure has it

18:08 aperiodic: robinkraft: well, you could map (apply max %) over the result of parititons

18:10 robinkraft: hagna: thanks, I'll check it out

18:10 Apage43: it would still be broken for the actual problem though

18:11 robinkraft: aperiodic: thanks, that indeed is the way to go

18:11 Apage43: righto, but at least it does something! I'd rather it do unexpected things than give me errors

18:11 brehaut: ,(let [s [1 5 4 3 2 6 7]] (map max s (rest s)))

18:11 arohner: robinkraft: recur goes back to the top of fn, calling the fn with the arguments supplied to recur

18:11 clojurebot: (5 5 4 3 6 ...)

18:12 arohner: 'loop' is exactly like let, except that if there's a recur inside the loop, it goes to the loop rather than the top of the fn

18:12 Apage43: right. loop is a let you can recur to.

18:13 brehaut: ,(let [s [1 5 4 3 2 6 7]] ((comp (partial apply map max) (juxt identity rest)) s))

18:13 clojurebot: (5 5 4 3 6 ...)

18:13 hagna: robinkraft: yeah me too

18:13 ,(println "what's a coma for?")

18:13 clojurebot: what's a coma for?

18:14 robinkraft: ok, the fog is beginning to burn off. so the loop [] form defines which arguments need to be supplied in the recur form

18:14 hagna: ,(println "s/coma/comma")

18:14 clojurebot: s/coma/comma

18:14 Apage43: robinkraft: right. And their values the first time through.

18:14 brehaut: ,((comp (partial apply map max) (juxt identity rest)) [1 5 4 3 2 6 7])

18:14 clojurebot: (5 5 4 3 6 ...)

18:14 brehaut: finally

18:17 robinkraft: HA!

18:17 (loop [myvec [1 2 3]

18:17 outint 0]

18:17 (if (= 0 (count myvec))

18:17 outint

18:17 (recur (rest myvec) (inc outint))))

18:17 ,(loop [myvec [1 2 3] outint 0] (if (= 0 (count myvec)) outint (recur (rest myvec) (inc outint))))

18:18 clojurebot: 3

18:18 robinkraft: awesome! thanks gang.

18:18 I'll do useful things in the future :)

18:25 alexyk: how do I sort tuples [[1 2] [2 3]] first by 2nd and then by 1st position?

18:28 i.e. making keyfn for sort-by?

18:32 brehaut: ,(sort (fn [[a1 a2] [b1 b2]] (compare [a2 a1] [b2 b1])) [[1 2] [2 1]]) ; alexyk

18:32 clojurebot: ([2 1] [1 2])

18:33 brehaut: whoa there colloquay

18:33 alexyk: do descending in 2nd?

18:33 brehaut: alexyk: ?

18:34 do you mean you want the order reversed?

18:34 alexyk: how do we invert order in a given position?

18:34 yes

18:34 brehaut: ,(sort (fn [[a1 a2] [b1 b2]] (* -1 (compare [a2 a1] [b2 b1]))) [[1 2] [2 1]])

18:34 clojurebot: ([1 2] [2 1])

18:34 brehaut: thats reversing all of it

18:34 alexyk: only the sorting order in the 2nd position pls :)

18:34 brehaut: i guess you could also flip the arguments to compare

18:35 alexyk: or 1st, breaking the ties

18:35 brehaut: ,(sort (fn [[a1 a2] [b1 b2]] (compare [a2 b1] [b2 a1])) [[1 2] [2 1]]) ; ?

18:35 clojurebot: ([2 1] [1 2])

18:35 alexyk: first by 2nd asc, then 1st desc

18:35 brehaut: sorry ive screwed that up

18:35 alexyk: np trying to figure the idion

18:35 brehaut: i meant to put b first

18:36 alexyk: idiom

18:36 brehaut: alexyk: basicly, sequence shaped things are an equality partition (timmc, wheres that chart?)

18:36 and vectors are in that equality partition

18:37 so you can put things into vectors in the order you want them to have sort preference

18:37 alexyk: yes

18:37 brehaut: i think what you want is ##(sort (fn [[a1 a2] [b1 b2]] (compare [b2 a1] [a2 b1])) [[1 2] [2 3]])

18:37 lazybot: ⇒ ([2 3] [1 2])

18:38 alexyk: I wonder how this can be done in sort-by

18:38 or sort is easier like this

18:38 brehaut: you want to control the comparison rather than the key

18:38 (you can control both with sort-by 3-ary overload)

18:39 alexyk: yeah

18:39 ibdknox: ,(doc sort-by)

18:39 clojurebot: "([keyfn coll] [keyfn comp coll]); Returns a sorted sequence of the items in coll, where the sort order is determined by comparing (keyfn item). If no comparator is supplied, uses compare. comparator must implement java.util.Comparator."

18:40 brehaut: alexyk: if you just wanted then to be second elem then first you could do ##(sort-by (comp vec rseq) [[1 2] [2 1]])

18:40 lazybot: ⇒ ([2 1] [1 2])

18:40 brehaut: but if you want the individual elements to be tested differently you'll need a full comparitor

18:55 mrBliss: ,(sort-by (juxt second first) [[1 3] [2 1]])

18:55 clojurebot: ([2 1] [1 3])

19:10 alandipert: seancorfield: i ran 'PORT=8888 lein run' per your jayq/fw1 tutorial post, and get 'no :main found' - any idea what i'm doing wrong? thanks!

19:11 ibdknox: alandipert: sounds like you need to add a :main key to your project.clj

19:12 pointing to whatever starts the server

19:12 alandipert: ibdknox: which is something in fw1-template i'm guessing?

19:12 * alandipert digs

19:13 ibdknox: should be proj-name.main based on the template that I see here

19:13 maybe you nuked that key when you copied the cljs-build args into project.clj? :)

19:13 because it *should* be there by default

19:14 alandipert: hm, i don't think so, i'm a paredit *master* ;-)

19:14 ibdknox: hehe

19:14 alandipert: i don't see any jetty related code in the stuff it generated

19:14 ibdknox: there's a fw1/start function

19:14 (I know nothing, I'm just looking at the template)

19:15 https://github.com/seancorfield/fw1-template/blob/master/src/leiningen/new/fw1/main.clj

19:18 alandipert: ibdknox: hm, yes, none of the stuff in the template ended up in my project

19:18 ibdknox: alandipert: haha that would make it hard

19:25 octe: hmm

19:35 Squee-D: Looking for someone from the Upper North Island who is competent with clojure to come and do a meetup in auckland.. I know theres at least one person in here from Hamilton.. Please ping me if you are that person :D

19:35 or know who it is :D

19:35 err Yeah NZ Upper North Island..

19:35 ibdknox: brehaut is from somewhere around there I thought

19:36 talios: brehaut is in Hamiltion, I'm in Auckland

19:37 Squee-D - we were just discussing the clojure auck meetup session for the next JUG

19:37 we've been planning on doing one for ages.

19:37 Squee-D - you're at visfleet? thought you guys were a ruby shop?

19:37 Squee-D: talios you've seen the Java meetup group are trying to find someone to take one?

19:38 thats more one eyed than it probably sounds to you :D

19:38 talios: Squee-D - I corun the Java Meetup. Both of us organizers are clojure-ish peeps

19:38 Squee-D: Talios did i meet you half an hour ago?

19:38 talios: Squee-D - you probably did :)

19:39 Squee-D: I was the noisy fellow who wants proof that we're not restful

19:39 talios: Oh - I'm the REST Nazi whose hanging in #rest ;)

19:39 Squee-D: I really want to push the clojure agenda, i'm fascinated, i think it's the one language that might put me off ruby.

19:39 talios: arbscht was also there

19:39 Squee-D: sweet i assumed so

19:40 talios: Squee-D - restful != REST

19:40 Squee-D: that ok with me :D

19:40 i'l lalso join #restful

19:40 oh look it redirects to #rails

19:40 ;)

19:42 talios: muhahaha

19:42 Squee-D: I have some realtime processing requirements that I think clojure would be more natural for than say, node.js or EM

19:43 I'd rather no one need think too hard about threads and thread safety, mutablity, etc.

19:44 talios: erlang!

19:45 brehaut: Squee-D: ping

19:46 Squee-D: sup brehaut, wanting to make the clojure intro happen

19:46 talios i think i prefer clojure - i THINK.. i don't know.

19:47 talios: brehaut should also come up and guest on the podcast :)

19:47 brehaut: Squee-D: something could be fun. im not sure if count as competant though

19:47 talios: that could be fun

19:47 Squee-D: but i have considered erlang based on it's existing uses and track record. I'm still exceptionally green when it comes to functional languages

19:47 technomancy: most of the software for which erlang is a good fit has already been written =)

19:47 brehaut: technomancy: zing!

19:47 ibdknox: haha

19:48 tmciver: Anyone know where clojure.contrib.seq-utils/separate lives now?

19:48 ibdknox: ~contrib

19:48 clojurebot: Monolithic clojure.contrib has been split up in favor of smaller, actually-maintained libs. Transition notes here: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go

19:49 ibdknox: not on the list!

19:49 amalloy: tmciver: the blackest pits of hell. just use (juxt filter remove)

19:49 tmciver: I just checked... a quick search for seq-utils turned up nuttin

19:49 amalloy: how did I know you would suggest juxt?

19:49 ibdknox: amalloy: what was in it?

19:49 amalloy: ibdknox: in what?

19:49 tmciver: amalloy: ;) thanks.

19:50 amalloy: seq-utils? i dunno. some of it might have been marginally useful

19:50 ibdknox: yeah

19:50 weavejester: Would partition-by work the same way?

19:50 tmciver: Nope

19:50 amalloy: but most of it is like: (defn separate [pred coll] [(filter pred coll) (remove pred coll])) ;;whoops forgot juxt (defn find-first [pred coll] (first (filter pred coll))) ;; whoops forgot comp

19:51 ibdknox: haha

19:51 weavejester: ,(partition-by even? (range 10))

19:51 clojurebot: ((0) (1) (2) (3) (4) ...)

19:51 weavejester: Ah, it doesn't group

19:51 ibdknox: ,(doc partition-by)

19:51 clojurebot: "([f coll]); Applies f to each value in coll, splitting it each time f returns a new value. Returns a lazy seq of partitions."

19:52 weavejester: ,(->> (range 10) (sort-by even?) (partition-by even?))

19:52 clojurebot: ((1 3 5 7 9) (0 2 4 6 8))

19:52 ibdknox: haha

19:52 weavejester: Of course, that's worse than using juxt :)

19:52 tmciver: cheater

19:54 I was surprised to not see seq-utils listed at the "where did clojure contrib go?" link.

19:54 ibdknox: you should add it with the "to the blackest pits of hell" bit

19:55 amalloy: i miss str-utils2

19:56 or no, i liked c.c.string

19:56 brehaut: amalloy: you havent ported your favorites to useful?

19:57 amalloy: nah. most of it was silly stuff i shouldn't have been doing anyway

19:57 brehaut: lol

19:57 amalloy: like (defn drop [n s] ...) to make it look like sequences and cooperate with ->>

20:05 weavejester: ,(vals (group-by even? (range 10))

20:05 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading>

20:05 weavejester: ,(vals (group-by even? (range 10)))

20:05 clojurebot: ([0 2 4 6 8] [1 3 5 7 9])

20:06 weavejester: I just recalled that group-by is probably closest to separate.

20:07 tmciver: Hmm, not bad.

20:10 jweiss: anyone know a good way to make clojure data/code pretty in html? not sure if i should leave everything up to pprint. would be nice if i could add extra indentation, but *current-level* that controls it is private.

20:10 technomancy: jweiss: iirc there's some more customization coming in the next pprint for code dispatch

20:22 TimMc: brehaut: http://www.brainonfire.net/files/seqs-and-colls/main.html#tbl-eqpart

20:23 brehaut: alexyk: ^

20:28 dnlcttr: any clojurescript one experts in the room?

20:28 brehaut: ~anyone

20:28 clojurebot: Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..."

20:29 dnlcttr: the repl is hanging

20:30 i followed the instructions on this page (https://github.com/brentonashworth/one/wiki/Getting-started) and none of the commands at the bottom of the page get any response

20:30 but there's no error message either

20:30 just... silence

20:37 arbscht: Squee-D: hi

20:37 talios: 'lo arbscht

20:37 Squee-D: holas

20:38 seancorfield: alandipert: sorry, was busy... just noticed your problem with fw1-template... did you get it resolved?

20:38 Squee-D: so wait. OOCSS, how dya deal with a:hover ?

20:38 seancorfield: i just tried lein new fw1 alan and it has :main alan.main in the generated project.clj

20:38 talios: Squee-D: I was just remembering ages ago talking to Brendon about getting your devteam and ours together for a session on dev practises

20:38 arbscht: Squee-D: you're looking for a clojure person for a meetup? as in to present something?

20:39 talios: arbscht - didn't we nominate you :)

20:39 Squee-D: arbscht yeah this was without realising you two miscreants were in this chan already

20:39 arbscht: oh right :)

20:40 talios: Squee-D: you use maven for your clojure don't you. *looks stern and angry like*

20:40 I should do a new release actually.

20:42 Squee-D: I dont clojure much at all

20:43 I'm no fan of maven, because i really despise xml, it's worse than yaml. :)

20:44 i'm sure someone is working on a clojure wrapper for maven config as we speak

20:45 technomancy: hehe

20:45 talios: Squee-D: well I did the original implementation of polyglot-maven for clojure about 2 or so years ago, worked well, but also kinda fell over with things like the release plugin

20:45 round-tripping a pom rewrite didn't quite….. work so well when you have programatic poms.

20:46 Squee-D: yeah i can see that

20:46 technomancy: there's talk of a lossless reader that could make it easier

20:46 well, talk of the need of one; I don't know if there's talk of anybody writing one

20:46 talios: lein for the win for clojure-only projects.

20:46 Squee-D: did you just do elipsis -space- . -space- . ?

20:47 technomancy: talios: https://github.com/technomancy/lein-scalac <- mwahahaa

20:47 talios: Squee-D - stupid osx autocorrection :)

20:47 technomancy: i saw that.

20:47 Squee-D: oh ok, i thought you were being a thorough dork :D

20:47 technomancy: not that I recommend using it in its present state

20:47 TimMc: On my work computer, all those ellipses show up as question marks (because my terminal encoding is fucked.)

20:48 At one point? I thought some was using question marks? all the time?

20:48 talios: technomancy: the problem was more how polyglot maven read the clj into an internal POM Model ( it works via reader/writer classes ). The writer writes out the expanded/interpreted model.

20:48 brehaut: TimMc: ‽ …

20:48 talios: TimMc: I often have that problem with smily faces everywhere :)

20:48 technomancy: oh yeah, that's way trickier.

20:48 talios: :)

20:48 TimMc: But now I'm on my laptop, where everything is sunshine and unicorn and interrobangs.

20:48 brehaut: technomancy: does lein-scalac exist just to let fogus right parts of his programs in basic?

20:49 s/right/write/

20:49 technomancy: brehaut: oh man, that's like ... a 2-in-1 plugin

20:49 excellent

20:49 talios: technomancy: worked fine for the yaml/json poms which were static representations, but when you bring in functions and a dsl problems strike

20:49 technomancy: no, that was just me screwing around with the heroku scala maintainer over lunch

20:50 brehaut: that would make more sense

20:50 jweiss: is there any example of custom pprint dispatch out there? I'm starting to think i need one.

20:50 technomancy: fun fact: the scalac ant task has a bug where the classpath attribute isn't discoverable via reflection

20:50 so lancet hates it

20:51 arohner1: with midje, is it possible to mock defs (as opposed to defns)?

20:57 brehaut: k

21:06 TimMc: technomancy: I see now that the Gilardi Scenario is precisely why I was having trouble making an in-sandbox-ns macro -- require and import statements in the body of the expansion have to execute in the outer namespace because the whole form is eval'd at once.

21:11 amalloy: Does this import+ syntax seem more reasonable to you? https://refheap.com/paste/738 [] around packages, () around classes as needed.

21:12 tmciver: ^

21:12 I'm still concerned about whether splitting up java.awt.geom into java.awt and geom is "grep-poison", but since :require already does that with packages...

21:13 amalloy: require actually doesn't do that, quite

21:13 TimMc: Yeah, it is limited.

21:13 amalloy: ask technomancy, he'll probably murder you for supporting any nesting at all. dude loves to grep

21:15 TimMc: Hmm, I don't know if :require allows arbitrary levels, or if it just supports at most 2.

21:15 Looks like the deepest nesting is prefix-list + libspecs, period.

21:16 technomancy: https://refheap.com/paste/738, is the subpackage nesting murder-worthy?

21:21 tmciver: TimMc: it looks better to me but I'd like to hear why nesting is bad.

21:25 alandipert: seancorfield: np, but no, as of yet unresolved

21:26 seancorfield: you have lein-newnew installed? which version?

21:26 i have 0.2.2 of newnew

21:30 citizenparker: emezeske: Any chance you're around? n00b question about lein-cljsbuild

21:35 TimMc: tmciver: If I grep the codebase for "java.awt.geom" (knowing that some classes in there are used), I wouldn't be able to find that import statement.

21:35 I'd have to know to only search for "java.awt", which is unlikely.

21:40 brehaut: TimMc: would it be possible to attach metadata to the NS to describe what (fully qualified) java classes have been imported?

21:41 TimMc: brehaut: Sure, but that doesn't help a developer using grep on .clj files.

21:41 brehaut: TimMc: indeed; but perhaps working at a level higher than text is worth it?

21:42 TimMc: I'm not sure what you're suggesting.

21:43 To get this information, one would have to eval the CLJ files.

21:43 brehaut: thats true, but then, i dont see whats wrong with that ;)

21:43 TimMc: ...because that's not how one searches a codebase?

21:44 brehaut: only due to historical accident

21:44 TimMc: I literally have no idea what you are trying to argue here.

21:44 brehaut: i think that grepping text files of programs is a horribly archaic way to find things

21:44 when you could introspect structured data

21:45 TimMc: Sure.

21:45 This isn't structured source, this is runtime values.

21:45 brehaut: its still structured data though

21:45 TimMc: sure...

21:45 Do you have a tool to replace grep?

21:46 If not, I should probably design (or at least document) with grep in mind.

21:46 brehaut: not for this specific instance, but apropos is similar

21:55 TimMc: (defn find-imports [fqn] (keep (fn [ns] (when (-> ns meta :imports (or #{}) (contains? fqn)) (.getName ns))) (all-ns))) – point being, its like it would be hard to write the apropriate tooling

21:56 and important not is missing from the above english

22:02 tmciver: TimMc: the current import implementation suffers from this problem.

22:02 But I agree with brehaut; I'm not sure if it's that big a deal.

22:03 You could always just grep for 'java.awt'...

22:03 TimMc: if you know to

22:03 Someone unfamiliar with the codebase would not.

22:03 tmciver: clojure.core/import doesn't allow package splitting

22:04 tmciver: If they're familiar with import they would.

22:04 clojurebot: Excuse me?

22:04 tmciver: clojurebot: you're not excused.

22:04 clojurebot: I don't understand.

22:04 TimMc: Not according to the documentation, leastways.

22:06 tmciver: But you can do things like (:import (java.io InputStreamReader); you'd have to know not to grep for java.io.InputStreamReader

22:07 TimMc: That's different from splitting the package name itself.

22:07 tmciver: perhaps no.

22:07 TimMc: No Java or Clojure developer would expect to necessarily see the fully-resolved classname.

22:08 How about we just leave package splitting out for the moment and make sure there is room for that syntax later?

22:09 tmciver: Yeah, that's what I was just thinking. So for the user to write java.awt and java.awt.geom separately.

22:10 TimMc: For now, yeah.

22:12 tmciver: I think it makes sense to let something like this evolve over time.

22:14 brehaut: is there an emacs key binding thats the cycles through windows in the reverse order to C-x o ?

22:15 oh, C-x O

22:16 TimMc: C-u -1 C-x o

22:16 :-P

22:16 C-x o and C-x O are the same for me, I think.

22:17 brehaut: TimMc: i cannot tell if thats serious or a joke

22:17 TimMc: The C-u -1 thing works, but is ridiculous.

22:17 the o vs. O thing is serious

22:19 brehaut: TimMc: can you explain the ridiculous one?

22:20 TimMc: brehaut: M-x other-window takes an optional count of how many windows to skip.

22:21 brehaut: TimMc: oh right, so C-u provides an argument to the next command?

22:21 TimMc: yep

22:22 brehaut: emacs magic frightens me a little

22:22 s/little/lot/

22:23 TimMc: brehaut: Would you mind doing C-h k C-x O

22:23 I want to know what it's bound to for you. (Are you using Emacs 24? I'm on 23.)

22:23 brehaut: im on 24

22:23 (lambda nil (interactive) (other-window -1))

22:23 TimMc: hah!

22:24 brehaut: so basicly exactly what you suggested but with less magic?

22:24 TimMc: yup

22:25 brehaut: what does (interactive) mean?

22:26 ive clearly not mastered any of the built in help features of emacs

22:30 TimMc: I'm not sure.

22:32 Frozenlock: brehaut: Interactive is for commands: functions available to the user with M-x.

22:34 brehaut: Frozenlock: thanks

22:34 Frozenlock: np

22:37 brehaut: carefull with emacs, you will be spending most of your day in it before you realize :P

22:37 brehaut: Frozenlock: thats exactly why i gave up using it years ago :P

22:38 talios, Squee-D: perhaps if you are wanting to do a clojure intro at the UG, waiting until the technomancy gets a preview of lein 2 out the door might be smart? the repl-y integration alone is probably worth the wait.

22:38 Squee-D: i don't know what that is

22:39 brehaut: Squee-D: its a better repl for clojure http://github.com/trptcolin/reply

22:39 Squee-D: i know roughly what lein is, but i was far more interested in clojure the language and functional composition

22:39 oh

22:39 brehaut: Squee-D: lein is the defacto standard front end to clojure; clojure the language doesnt really come with a user interface

22:39 lein provides all that

22:40 Squee-D: i use Clojure Repl on my Samsung s2 mostly :P

22:40 but i have run up an app or two using lein

22:41 and the local repl.. intellij's built in repl console also adds some of the reply stuff, especially navigation

22:41 and completion iirc

22:42 brehaut: theres lots of good repl options for clojure, especially now that nREPL is coming together. the advantage with lein is that its probably the path of lowest resistants to getting new users up and running

22:42 Squee-D: yeah understood

22:42 talios: Squee-D - iClojure for the console gives full completion and stuff

22:42 very wicked and full of awesome

22:43 brehaut: Squee-D: unfortunately the bog standard repl that comes with clojure/lein 1.x is a bit crap

22:43 talios: https://github.com/cosmin/IClojure

22:43 maven clojure plugin now supports that if its in the class path, need to release that version tho

22:43 Squee-D: I'm looking forward to some tiem with the clojure way book as soon as i get a holiday :P

22:44 cool nice link

22:45 talios: the whole lisp syntax remains a love/hate relationship with me. i hate my flip-flopping mind

22:45 brehaut: talios: does your editor of choice support paredit?

22:46 talios: brehaut - not sure actually ( Sublime Text 2 )

22:47 brehaut: talios: ah. i suspect not then. paredit makes life a lot better

22:48 talios: i switched away from textmate because of the lack there. ive settled on emacs for now, but eclipse with ccw looks very promising too

22:57 Squee-D: paredit?

22:57 sounds like something i could plug into sublime

23:05 brehaut: if you use structural editing for a while you wonder how you ever achieved anything without it

23:08 bbloom: I'm a big-time vim guy, but haven't tried paredit.vim yet… anyone use it? as good as emac's? vim-esque enough to tolerate?

23:08 fryguy: do people in here typically use gui emacs or terminal emacs?

23:10 brehaut: fryguy: i cant speak for others but i use a mix

23:10 (and forcing myself to use terminal emacs made me learn a lot more of the keyboard navigation)

23:11 fryguy: i'm trying to convert from vim, and i'm so used to just running vim remotely in a terminal to do editing in development sandboxes. Seems like there's not a great solution for this in emacs. I mean, I guess I could just do the same thing, and run emacs -nw remotely.

23:12 ibdknox: why not just use VIM?

23:12 :)

23:12 fryguy: but then I see things like auctex that make me want to have gui support. I guess I could just do a mix and run it in local gui mode when I need it

23:12 ibdknox: seems like slime + swank is going to be better in the long run than vimclojure + nailgun

23:12 brehaut: fryguy: im pretty sure you can tunnel remote emacs sessions to a local client

23:13 not that i understand how though

23:13 jlf: fryguy: to run gui emacs on the remote system, you can just tunnel x over ssh

23:14 fryguy: jlf: sure, using someting like NX I guess. which seems possibly viable, but then it means I need to get X installed remotely, and that's not feasible for all of the things I'm going to be connecting to

23:14 jlf: you can also use tramp or sshfs to run it locally and edit remote files, or set up a local emacsclient to connect to a remote emacs server over tcp

23:15 fryguy: i'm trying to figure out how to deal with the "sane vim setup available everywhere" in emacs-land

23:15 jlf: no nx necessary, just x11

23:15 fryguy: jlf: sure, but x11 forwarding tends to be slow

23:15 jlf: the point being, timtowtdi

23:15 amalloy: tramp is a good choice IMO, but of course jlf carries a bit more weight than i do on this

23:16 jlf: heh, i tend to use sshfs myself but don't tell #emacs :)

23:16 fryguy: sshfs is horribly slow for doing any sort of directory traversal in my experience (for example, ctags).

23:17 nfs is maybe more viable, but again, it's something that's not available everywhere

23:18 jlf: ime x11 forwarding is plenty fast for emacs if it's tuned a bit, but i tend not to work over large network distances

23:19 fryguy: I'm thinking that maybe the right thing to do is to just figure out how to make tramp mode do what I want, and just run emacs locally. or at least that's a reasonable first iteration.

23:20 amalloy: i'd be interested in what tuning you did, jlf - my experience has been pretty awful

23:20 fryguy: I'm trying to avoid a situation where I have something like "to edit files on these 5 servers I have to do steps a,b,c, and d. And then to edit files on THESE OTHER 5 servers I have to do steps e,f,g, and h because something isn't available" I want a consistent cross machine experience when the machines are things i may or may not have sysadmin control over

23:20 jlf: iirc eshell understands tramp somehow so it will execute programs on remote machines if the cwd is remote

23:21 fryguy: jlf: yah, I was just reading about that, which seems like it might be the key for some of my hangups for things (remote debuggers, remote ctags, running unit tests, etc)

23:21 * jlf nods

23:22 jlf: amalloy: it's been a while since i messed with it but let me take a look...

23:23 fryguy: i wonder how tag jumping for remote files works...

23:32 MenTaLguY: so I'm trying to extend leiningen's deps command with some code that requires one of the deps jars before it can run

23:33 it's simple enough to run the code *after* the normal deps task in the hook

23:33 but the problem is that the classloader won't look at the downloaded jar if it wasn't already present at startup time (it appears)

23:33 recursively re-invoking leiningen in a new VM might be one option

23:34 though I'm not sure how to do that

23:44 talios: MenTaLguY - you could create your own class loader instance and load the classes

23:44 into the same vm

23:44 thats kinda getting lower level into the JVM than you might want tho

23:45 MenTaLguY: yeah ... I was kind of hoping that eval-in-project would accomplish that actually

23:45 but it doesn't seem to help

Logging service provided by n01se.net