#clojure log - Jan 24 2011

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

0:14 Raynes: mefesto: pong

0:25 mefesto: hey

0:25 i have some basics of an interactive tutorial in there.

0:26 i can push to my fork or is there some other preferred method?

1:04 Raynes: mefesto: Damn it.

1:05 mefesto: You ping me while I'm gone, I ping you while your gone, rinse, repeat.

1:05 mefesto: Raynes: still on?

1:06 Raynes: Yessir.

1:06 You can push to your fork and then issue a pull request when you think it's ready to go into tryclj. If you just want me to take a look, I'll check it out in your fork.

1:07 mefesto: ok one sec.

1:11 ok should be there: http://github.com/mefesto/tryclojure

1:11 i changed the handler so that it would return the evaluation results as a json object.

1:12 this way from the javascript side the tutorial can compare the expression and results then determine if the user should move on to the next page

1:15 Raynes: mefesto: Looks like you put quite a bit of work into this. :o

1:15 brehaut: ive forgotten how to use fnil again.

1:15 mefesto: Raynes: had some spare time today :)

1:19 Raynes: mefesto: This looks really cool.

1:20 mefesto: along the lines of what you wanted?

1:20 just as an example you can type 'back' if you got a page or two into the tutorial

1:20 Raynes: mefesto: Precisely. It would be nice to be able to see a list of the 'lessons' and be able to switch between them somehow. Other than that, this looks great.

1:20 Oh.

1:21 Sorry, I judged the Javascript merely on length. Didn't actually pay much attention to it. ;)

1:22 mefesto: heh. I _think_ the lesson setup (similar to tryhaskell's) should work. But I only got that 3 page thing going so far.

1:22 Raynes: mefesto: Could you make examples clickable like the old tutorial examples were?

1:23 One problem with jquery-console is that it doesn't allow pasting. Apparently, purposely, thus not likely to change any time soon.

1:23 Other than that, this looks pretty solid.

1:23 I like it.

1:23 This is the one thing that tryclojure is missing.

1:24 mefesto: ok that shouldn't be too hard. so clicking on a code block will add that to the console and eval it?

1:24 Raynes: Just add it, not eval it.

1:24 mefesto: Also, /j #sexpbot

2:03 brehaut: i wrote a special form to do a more general if-let with better error handling and its cleaned up the ugliest piece of code in my xml-rpc lib

2:03 https://github.com/brehaut/necessary-evil/commit/a225d2026c3e5b6e223597ab796a85768a6948a3#L0R23

2:06 amalloy: brehaut: just got caught up with the #clojure backlog. still care about fnil?

2:09 if so, a semi-canonical example: ##(reduce #(update-in %1 (fnil inc 0) [%2]) {:a 1 :b 4} [:b :c])

2:09 sexpbot: java.lang.UnsupportedOperationException: nth not supported on this type: core$fnil$fn__5593

2:11 amalloy: &(reduce #(update-in %1 [%2] (fnil inc 0)) {:a 1 :b 4} [:b :c])

2:11 sexpbot: ⟹ {:c 1, :a 1, :b 5}

2:13 brehaut: amalloy: sorted my self out, but cheers

2:13 clojuredocs saved me :)

2:16 amalloy: i spent a while trying to work out how to use it in an -> but in the end realised that a) i was using it wrong and b) 'or' worked better

2:16 amalloy: heh

2:23 brehaut: where is -?> defined?

2:25 amalloy: brehaut: clojure.contrib.core

2:25 brehaut: amalloy: cheers

2:38 amalloy: did anyone submit your macro writing macros page to hn?

2:38 amalloy: brehaut: no idea

2:38 clojurebot: Cool story bro.

2:38 amalloy: i'm barely informed enough about social-y sites to know whether i've made it to twitter :P

2:39 brehaut: http://www.backtype.com/page/hubpages.com%2Fhub%2FClojure-macro-writing-macros

2:39 two tweets and no HN :)

2:40 amalloy: brehaut: that

2:40 s handy

2:40 brehaut: yeah

2:40 and clojure powered :)

2:41 amalloy: hubpages has something similar built in: we track referrer domains for you so i can see if twitter is getting me much traffic, but directly seeing if it's been mentioned at all is neat

2:42 brehaut: thats pretty cool

2:42 amalloy: brehaut: wow, and i'm actually getting google traffic, apparently. what on earth are people searching for

2:42 brehaut: i used to use google analytics on my site but it doesnt really give me much useful info

2:42 people search for the strangest things

2:43 amalloy: yeah, if i get interested enough i'll hijack the corporate GA account to see how my hubs are doing :P

2:44 brehaut: ah, apparently it's my first hub getting more "reputable" over time

2:44 brehaut: curious. is that a feature of hubpages?

2:45 amalloy: brehaut: an artifact of google's pageranking, i think

2:45 brehaut: oh right

2:54 xkb: hi

2:55 Is it possible to mock out a static Java method call using clojure.contrib.mock?

2:55 trying it gives me lookup errors

2:55 "unable to resolve var"

3:00 amalloy: xkb: i don't think so. i don't use mock, but i think it's basically changing the var root, which won't work if there's no var

3:01 you can instead write a pure-clojure function that calls out to that static method, and mock/stub the function

3:03 xkb: ah.. I thought so. The error was indeed a lookup to a var

3:03 no binding possible without one

3:03 amalloy: thanks

3:12 amalloy: blugh, night all. why am i even still awake

3:12 brehaut: night

3:48 Licenser: morning

3:50 brehaut: evening +1300

3:52 LauJensen: clojurebot: UGT?

3:52 clojurebot: ugt is Universal Greeting Time: http://www.total-knowledge.com/~ilya/mips/ugt.html

3:52 brehaut: thats awesome

3:53 i particularly like the note at the end

3:55 Licenser: UGT is hard to explain

3:55 LauJensen: Licenser: You're the only guy we've ever had problems explaining it to :)

3:55 brehaut: Licenser: clearly you understand it well enough to use it correctly

3:55 Licenser: LauJensen: that is because i'm special!

3:56 LauJensen: Licenser: Thats right, like your momma always told you :)

3:56 Licenser: exactly and my momma is the best!

3:57 LauJensen: btw, awesome article on the clojure redit clone

3:57 LauJensen: Licenser: Thanks!

3:58 Licenser: So you could put in a warning that putting a reload hook on the core file is a bad idea :P

3:59 Then again I'm propably the only person having trouble with that

3:59 LauJensen: haha... Yea I hope so :)

4:00 sandGorgon: LauJensen, same sentiment here: awesome articlt - please keep on adding to it (like Sandbar support). I think its now the go-to place for web app development with clojure

4:00 LauJensen: sandGorgon: I'll never use Sandbar, but I'd be happy to extend it further

4:00 sandGorgon: LauJensen, oh.. any reason why ? or is there an alternative ?

4:01 LauJensen: sandGorgon: Firstly, sandbar seemed custom made for Compojure and secondly I just wasnt happy with the design when I went over it. I think I might release my own 'dunebar' which is more in tune with Moustache

4:02 brehaut: there needs to be a library called Dali that works with moustache

4:02 sandGorgon: LauJensen, awesome. I think auth was one of the critiques about your article .

4:02 LauJensen: sandGorgon: Why the hate though? I showed how to build your own security middleware, thats much more valuable than seeing me pull in sandbar

4:04 sandGorgon: LauJensen, not so much as hate - I think people (which includes me) are wary of anything that touches security. I mean given the choice between writing raw SQL and rolling my own auth, I would take SQL anyday. I know that I am naive enough that I want to seek out and build upon other people's efforts.

4:05 LauJensen: In most cases I agree. In this case, I think I should just hurry up and write Candybar

4:06 sandGorgon: dunebar or candybar - choices, choices .. )

4:07 LauJensen: Or Twinky

4:09 Licenser: hmm is there a way to tell ring to allow path's like /edit/42 where 42 is a ID?

4:10 brehaut: Licenser: thats higher level than ring is concerned with isnt it??

4:11 Licenser: not sure

4:11 brehaut: Licenser: im only a noob, but that sounds like routing (ie moustache or compojure) to me

4:11 Licenser: I'd not have a problem to pick the stuff apart myself, but I didn't even managed to make a edit/* thingy

4:12 LauJensen: Licenser: I think I demo that in the post you just mentioned actually

4:12 But its a quality of Moustache or Compojure, not Ring

4:13 Licenser: hmm might have missed it

4:14 ah yes true :) missed that grrrrr evil me

4:14 LauJensen: (app ["user" id] (delegate do-user id)) ... (defn do-user [req id] ..)

4:14 brehaut: Licenser: ring is really simple from a code consumer point of view; it worries about different http servers and converting an incoming request into a map, calling your handler with that map as an argument, and taking the map you return and converting it back into the stuff that particular server wants for a response

4:15 Licenser: *nods*

4:15 brehaut: Licenser: your handler function is a black box to ring

4:16 moustache is basicly a (excuse the term) DSL for bundling a bunch of handlers together as a single handler

4:16 with routing and middleware rules

4:17 i cant speak for what compojure does these days because i havent used it since 0.3

4:19 bah. apparently i have a brain disease. im wondering if moustache is a monad

4:22 i think it is

4:24 thats a sure sign i need to go to bed

4:24 gnite

4:41 LauJensen: Since nobody really knows what a monad is, I guess it could be a monad :)

4:44 Licenser: for nobody knowing what it is there is many talks about monads

4:44 ejackson: morning all :)

4:45 Licenser: morning ejackson

4:49 mduerksen: greetings. monads were discussed on HN not long ago (i haven't invested the time to digest it): http://news.ycombinator.com/item?id=1997341

5:14 ejackson: I just put up a blog post with the word 'monad' in it :) Feeling very manly.

5:31 LauJensen: :(

5:34 ejackson: Don't be sad Lau, its Monday.

5:35 LauJensen: Good job on the post though

5:37 ejackson: thanks, you were right that i'd been a bit lazy on that front

5:39 LauJensen: (doall ejackson)

5:39 ejackson: well, I spent last week trying to snowboard on ice, so, not really.

5:43 TobiasRaeder: morning :)

5:44 anybody using a tweaked zenburn around here?

5:47 LauJensen: TobiasRaeder: I was, then I inevitably went back to charcoal-black

5:49 TobiasRaeder: @LauJensen interesting, never heard of it. were the tweaks in your blog? i thought so wasn't able to find them with a quick google tho

5:51 LauJensen: No I never commented on zenburn, didnt use it long, didnt like it too much

5:51 ;(setq zenburn-bg "#1f1f1f")

5:51 That was the tweak

5:53 TobiasRaeder: ^

5:53 TobiasRaeder: @LauJensen ah, thanks

5:54 @LauJensen but ill checkout charcoal-black i guess

5:54 LauJensen: Its in the standard color-theme library, M-x color-theme-charcoal-black

5:55 TobiasRaeder: http://bestinclass.dk/index.clj/2009/09/layout-emacs-etc.html

5:58 TobiasRaeder: ill give it a try, thanks :)

6:00 raek: in addition, this is awesome: http://alexpogosyan.com/color-theme-creator/

6:06 LauJensen: wow, that is pretty epic

7:19 TobiasRaeder: yeah, that is really awesome, thanks

7:19 and lau, the charcoal doesn't look bad at all :D

8:35 timvisher: hi all

8:36 is anyone using elein?

8:37 TobiasRaeder: never actually heard of it

8:37 what exactly is it?

8:38 timvisher: it's a set of emacs wrappers around lein so that you can interact with lein via M-x commands

8:38 https://github.com/remvee/elein

8:38 TobiasRaeder: ah nice

8:39 timvisher: it does indeed look quite nice

8:39 TobiasRaeder: i just tried durendal a bit which seems to do the same on first glance

8:39 timvisher: although i'm not quite clear as to what advantages it offers me over just executing lein commands via M-!

8:40 TobiasRaeder: autocompletion i guess?

8:40 apart from that im not sure either

8:40 timvisher: problem is that I'm having trouble getting it to work on my mac

8:40 i was hoping for a guru to magically appar in the ether. ;)

8:41 TobiasRaeder: hehe what problems exactly?

8:41 timvisher: I can't get the swank server to run

8:41 TobiasRaeder: ill give it a try real quick

8:41 not using os x tho

8:41 timvisher: in the source I read that 'elein-standalone-swank-command "~/.lein/bin/swank-clojure"' is how it tries to execute swank, maybe

8:42 but I'm not sure how to set that up

8:42 I'm fairly new to both lein and elein so I don't really grok it's structure yet

8:42 TobiasRaeder: interesting, i dont even have a bin folder in ~/.lein

8:43 timvisher: exactly

8:43 I don't either

8:43 TobiasRaeder: so it's probably something custom the author wrote (would be my guess atleast)

8:43 timvisher: and the post I was reading about getting it set up (http://blog.gaz-jones.com/post/2486737162/setting-up-clojure-development-on-osx-using-emacs-and) doesn't mention anything about creating it.

8:44 I'm assuming the same

8:45 aha

8:45 TobiasRaeder: mhm?

8:46 timvisher: interestingly, I had forgotten to include swank-clojure in the project.el file

8:46 TobiasRaeder: oh you need a project.el for elein aswell?

8:46 mhm

8:46 timvisher: doing that and then running lein deps (via M-!) and then running elein-swank leaves me with 'error in process filter: Symbol's function definition is void: slime-set-inferior-process'

8:47 TobiasRaeder: do you have slime and slime-repl setup?

8:47 timvisher: yeah

8:47 that all works fine

8:47 at least as far as I've been able to tell

8:47 I was mostly doing dev with inferior lisp until about a week ago

8:47 TobiasRaeder: well if you can do lein swank in a shell and slime-connect it should be alright ;)

8:48 timvisher: that's true. I'm just intrigued by elein and I'm trying to follow this tutorial just for fun (http://blog.gaz-jones.com/post/2501842155/interactive-clojure-development-in-emacs-with-leiningen)

8:49 TobiasRaeder: yeah

8:49 well what seems a bit 'weird' to me right now is that you apparently have to create and maintain a project.el aswell?

8:49 which seems a bit unneeded atleast for me right now

8:50 timvisher: the idea at the moment seems to be that once you're in a lein project, created via `lein new` I suppose, you can use elein to transparently communicate with it.

8:50 seems to be being more trouble than it's worth at this point.

8:50 TobiasRaeder: yeah

8:50 right now it does

8:50 you might wanna try durendal tho, no support yet for most lein commands but starting a swank server, connecting to it etc works just fine

8:51 and the deps etc should be fairly easy to implement yourself really

8:51 and it doesn't require you to keep track of project.el etc

8:51 https://github.com/technomancy/durendal/ if you care

8:51 timvisher: i've actually installed that via elpa

8:51 haven't messed with it yet thouugh

8:52 the only reason I'm checking out elein is because of the tutorial

8:52 TobiasRaeder: ah okay :)

8:52 timvisher: I'm used to switching to the Terminal to interact with my build tool so the rest would just be icing

8:52 TobiasRaeder: whats really nice (atleast i like it) is the durendal-sort-ns

8:52 timvisher: annoying icing at this point. ;)

8:52 TobiasRaeder: ;)

8:53 timvisher: that does read like a nice addition

8:53 well we shall continue to explore... ^_^

8:56 TobiasRaeder: :D

8:57 if you wanna have something like elein-deps https://gist.github.com/793238

8:57 it's really badly hacked together but it works for now ;)

9:14 AWizzArd: http://www.skuro.tk/2011/01/24/performance-boost-in-clojure-1-3/

9:16 tonyl: thanks for the share, I'll take a look

9:16 * tonyl can't remember the last time a saw a .tk address

9:20 LauJensen: tonyl: It was like 2 minutes ago. AWizzArd posted on in here, old chap

9:23 tonyl: LauJensen: hehe yes, thanks for the logic, I guess I meant before AWizzArd posting it. Brings back memories

9:26 LauJensen: I know - Was making a joke :(

9:29 tonyl: I am poor at understanding jokes by text :S something I haven't get used to

9:40 LauJensen: tonyl: Its a common thing. Usually when I make a joke in one of my blogposts, HackerNews is consumed by rage for about 12 hours at a time because they dont see the humor in it :)

9:40 I cant be annoyed though, since its just more hits for me :)

9:41 fliebel: LauJensen: I missed the first bit. You said something controversial again? :)

9:42 LauJensen: fliebel: I just said that its a common thing that people dont get my jokes

9:42 fliebel: Oh, right.

9:49 jweiss_: looking for a little advice writing an error handling lib similar to clojure.contrib.condition - i want to avoid any unnecessary overhead of setting up error handling when no error is actually thrown. would it be more efficient to just store the handler function *forms* at the start, and only evaluate them if an error occurs?

9:50 i somehow envision getting bitten by that

9:50 Chousuke: that sounds complicated

9:51 jweiss_: you think the performance boost might not be worth it?

9:51 Chousuke: Can't you just have the handlers be functions and call them only when an error occurs?

9:52 jweiss_: Chousuke: yes, that's what i am doing now. but since my with-handlers macro doesn't HAVE to even create those function objects at the start, i thougt maybe it shouldn't.

9:52 Chousuke: jweiss_: the function objects are created at compile time, they're pretty much free.

9:53 jweiss_: ah that's right

9:53 Chousuke: probably more memory-efficient than storing the forms, too.

9:54 jweiss_: ok good then i am done :) thanks Chousuke

9:58 fogus`: Have I lost my mind, or are these needed/missing from Clojure? https://gist.github.com/790187

10:00 opqdonut: yeah they're missing

10:01 fogus`: Maybe there is an obvious way to get the same that I am missing?

10:03 chouser: fogus`: I suspect they're missing more because they've not been needed much rather than because there's a tidy way to write them when they are needed.

10:05 fogus`: chouser: Do you know of a tidier way in any case?

10:06 chouser: haven't thought of one in the last 5 minutes. :-)

10:07 fogus`: I'll take that as a win. ;-)

10:07 timvisher: In Java, i'm used to declaring pretty much all of my functions as private and then bumping their visibility when that becomes a problem. I like how my public contract sort of emerges that way. Is it non-idiomatic to do similar things in clojure i.e. declaring all of my functions with defn- and only bumping them to def when I need access to them outside the namespace?

10:08 fogus`: chouser: Think it's worth pitching as inclusions to 1.3?

10:08 chouser: fogus`: the normal route used to be to put such things in contrib first and let demand build from there.

10:09 I dunno if that's still the best route or not, with new contrib.

10:09 fogus`: chouser: Hmmm. I'm a little foggy on how to get things into the new contrib :-(

10:10 Although, I assume the pitch is the same, but with contrib as the target (duh)

10:10 arkh: if anybody has time to glance at this, I've been unable to get this exception handling to work : / https://gist.github.com/793340

10:11 chouser: yeah. certainly worth a pitch somewhere. I don't see even an old contrib namespace that looks terribly appropriate, though.

10:11 seq-utils might be the closest, except of course there are no seqs involved so it's a pretty poor fit. :-P

10:13 fogus`: Maybe wherever things like curry/uncurry go? Actually, I am not sure if they even exist in contrib either. :-(

10:13 LauJensen: Why was http.agent deprecated from contrib?

10:15 Was it because chouser tried to stuff it in seq-utils again?

10:17 chouser: (and (every? pos? coll) (every? even? coll)) meh

10:20 shortlord: I quite often have the problem that I need to manipulate certain vars in through methods and don't want to pass these vars (e.g. I have defined a board and want to perform actions on this board from other namespaces without always having to pass the board as an argument). But that would mean that I'd constrain function reusability, right?

10:20 is there any good way to do this or do I have to define 2 functions every time, one generic and one who wraps the other and passes some predefined arguments?

10:25 LauJensen: Could we please get some more votes on http://dev.clojure.org/jira/browse/CLJ-714 ?

10:29 Fossi: shortlord: how did you define your vars? globally?

10:29 chouser: is there a way to un-vote?

10:32 fogus`: hear hear

10:34 shortlord: Fossi: yes, they are globally defined in one namespace (the board namespace), not I'd like to call something like 'change-board' from another namespace without always specifying the board

10:35 LauJensen: fogus`: ?

10:36 Fossi: sounds like it's breaking the functional programming idea quite a bit and will be ugly in testing etc anyway

10:37 but, yeah, i guess defining 2 functions would be the way to go

10:37 at least you can at least write a with-board or such for testing

10:37 -at least

10:39 shortlord: Fossi: how would I write the whole thing without breaking functional paradigms?

10:40 devn: maybe im missing something, but why are you averse to passing around a var?

10:44 mefesto: does leiningen have a :repl-init-script but for lein swank ?

10:44 shortlord: devn: that would mean that every single time I want to place something on the board, I'd need to pass the board as an argument

10:45 devn: worse, the board is only one of the things that need to be passed as arguments, there is also a list of buildings, a placement of a special token, the inventory of players. there are methods who need all of these as arguments, it would be quite clunky to call them always directly with all the arguments

10:46 chouser: shortlord: you might consider putting all those things together in a single value, such as a map or record.

10:46 shortlord: devn: but I guess the right way to do it would be to turn all these functions into closures and pass them the value once and then use the closure to avoid passing these things again, right?

10:46 chouser: then it's easy to pass them as a single arg, and as a bonus you have a single value that descibes the state of your system.

10:47 Fossi: yeah, generally, you *want* to pass all those all the time, so that your code is stateless/functional

10:47 shortlord: chouser: the board is already a rather complicated map, the same is true for the player inventory and the list of buildings. I had planned to use the namespace as some sort of capsulation for these things instead of putting them all into an even bigger map

10:48 Fossi: if you have to pass all the stuff all the time chances are that your design is flawed somewhere

10:48 fogus`: LauJensen: I don't care too much for #| ... |#

10:48 LauJensen: fogus`: why not?

10:49 Fossi: for example for a game loop i have written, i don't modify the data directly, but create an array of modification operations

10:49 fogus`: I think it goes about solving that problem in the wrong way

10:50 LauJensen: fogus`: What would be the right way ?

10:51 fogus`: We already have #_ so might it be better to modify that to completely ignore the internal form?

10:51 (btw, I don't know the right answer... I'm soliciting advice)

10:51 shortlord: Fossi: well, this kind of "modify indirectly" could be done through closures, right? So that I have a generic build function and then generate a more specific build function that is bound to a specific board, that is passed exactly once

10:52 LauJensen: fogus`: Thats a good idea

10:53 Fossi: well, most of the time you want to avoid to carry around state somewhere where it's not so visible

10:54 stateful global vars are gonna bite you in the behind sooner or later

10:55 i tried to keep the modifying of state out of the 'business logic' by passing in an immutable state and the 'events' and returning said modifying operations

10:55 then in another pass i go over the objects and apply those

10:56 wjlroe: I have a problem using clojure.string/replace and running a test against it. When I test equality in the repl using (= ... it works, but using a deftest, I get this error:

10:56 expected: (= "faxes" (apply-sxz ["fax"]))

10:56 Fossi: makes for easy debugging

10:56 wjlroe: actual: (not (= "faxes" "[\"fax\"]es"))

10:56 fogus`: LauJensen: Great... I'm glad to know that I'm not totally out of my mind. Think it would help if I added a similar comment to the case?

10:56 shortlord: Fossi: wow, that's quite a nice idea

10:56 LauJensen: fogus`: I think so, yes

10:59 shortlord: is it not possible to use 'nil' as a test-statement in a case expr?

11:02 fogus`: LauJensen: Added

11:05 mrBliss: shortlord: http://dev.clojure.org/jira/browse/CLJ-702

11:06 jweiss_: anyone have an opinion on this - i have a macro where in practical use, the first arg will be the same 99% of the time (the kw :type) I could create another tiny macro for convenience but giving it a meaningful name would end up as more typing for the programmer than just specifying the argument every time. on the other hand, an extra macro seems like better documented code.

11:10 ordnungswidrig1: hi, how can I empty (truncate) the simple repl buffer?

11:10 robonobo: jweiss: make the macro without the :type kw the one with the longer name?

11:10 ordnungswidrig: do you mean clear it? put the prompt at the top?

11:11 ordnungswidrig: robonobo: yes, there a currently 78k lines which make my emacs slow

11:12 robonobo: ah, in emacs

11:14 i've been looking to do that as well, not because it makes emacs faster, but because i'm ocd about having my prompt at the top

11:15 with the lein repl it's just Ctrl-L, like in bash

11:16 ordnungswidrig: I forgot how to do that. I know there was a command

11:17 robonobo: the trouble is that in slime, C-l doesn't do what you'd expect.

11:18 mrBliss: ordnungswidrig: try C-c M-o or C-c C-o for the last output

11:19 ordnungswidrig: mrBliss: ah, nice. thank you!

11:22 LauJensen: Am I correct in saying that the Apache Commons Http Client PUT method can only send a file OR a string but not both as POST can ?

11:29 robonobo: mrBliss: yes! finally!

11:32 AWizzArd: Does Clojure use Red-Black trees to implement sorted sets and maps? Are these "ordinary" RBTs or are they left-leaning RBTs?

11:33 chouser: AWizzArd: yes. I don't know.

11:33 leafw: AWizzArd: the source code would tell you right?

11:33 AWizzArd: LauJensen: while we are at it: how can I add a body for DELETEs?

11:33 chouser: oki thanks, so they are RBTs.

11:35 LauJensen: for HttpPut/HttpPost 'm' I can do a .setEntity. Example: (.setEntity ^HttpEntityEnclosingRequestBase m (StringEntity. body "UTF-8"))

11:36 robonobo: should a JPanel agent that is sent messages to have it draw something on itself behave like normal? the draw-function calls fillRect on the graphics of the panel and then returns panel unchanged.

11:47 LauJensen: AWizzArd: I think (hope) that both PostMethod and PutMethod can accept an array of parameters, which can be both FilePart and StringPart

11:47 It works well for PostMethod

11:56 technomancy: mefesto: :repl-init-script works for swank too in recent versions

11:56 ordnungswidrig: AWizzArd: I don't think a DELETE request body is encouraged by the spec

11:59 AWizzArd: "The DELETE method requests that the origin server delete the resource identified by the Request-URI." says RFC2616. I don't see what a request body can add to this

12:00 shortlord: can you recommend any books that teach functional programming principles? It doesn't need to be for any particular language (although clojure/lisp/haskell would be fine), but it should contain a detailed description of the ideads behind functional programming like closures and currying and so forth

12:00 mefesto: technomancy: i'm keeping my init.clj script under test, is that not good?

12:01 technomancy: in project.clj i have :repl-init-script "test/init.clj"

12:01 technomancy: mefesto: yeah, that makes sense

12:01 mefesto: technomancy: lein repl works find but when i do a lein swank and connect from emacs it doesn't seem to load

12:01 work *fine

12:01 Raynes: chouser: Aw, you don't support the multiline comment proposal. :<

12:01 technomancy: mefesto: maybe an old swank?

12:02 mefesto: technomancy: swank-clojure 1.2.1

12:03 technomancy: try 1.3.0-SNAPSHOT

12:04 robonobo: Raynes: where might i find this proposal?

12:04 Raynes: http://dev.clojure.org/jira/browse/CLJ-714

12:04 mefesto: technomancy: that was it. thanks.

12:06 Raynes: The only reason not having them feels reasonable is if #_ works like fogus proposed in comments. I know this adds complexity, but it's a comment form. I'm not sure how complex you can get with that.

12:09 robonobo: why not stick with the common list syntax for comments?

12:10 Raynes: I'm not sure I follow.

12:10 robonobo: s/list/lisp

12:10 sexpbot: <robonobo> why not stick with the common lisp syntax for comments?

12:10 Raynes: The syntax that patch adds *is* the Common Lisp syntax for comments, I believe.

12:14 robonobo: Raynes: I think I got the names in Jira vs irc mixed up

12:14 Raynes: I don't really expect it to be accepted. #_ is 'close', it's just that 'close' but no cigar irks the hell out of me.

12:16 robonobo: I don't really get the syntax complexity argument, when it's been in CL since the dawn of man

12:17 Raynes: robonobo: Admittedly, CL isn't the pinnacle of marginal complexity. ;)

12:18 robonobo: yes, of course

12:18 but it would be a nice addition for those coming from there

12:20 is it a stated goal of clojure's to adhere to the lisp syntax as much as possible?

12:21 devn: Raynes: I like your comment on the literate programming tools

12:21 Raynes: Not really. Clojure tries to relieve itself of painful Lisp syntax in a lot of cases.

12:21 devn: I'm not sure if this would actually be helpful, but it feels like it would.

12:22 technomancy: robonobo: if you are talking about Common Lisp you should use its full name. calling it "lisp" is confusing.

12:22 devn: Reading down the comment list, I agree with chouser && fogus

12:22 The additional syntax is unecessary

12:22 Raynes: I don't think it's the syntax that is the problem here as much as it is the *addition* of syntax, and I can understand the desire to keep such things out. But it is a missing feature.

12:23 It's a free country.

12:23 msappler: hey is there some automated way of renaming a namespace across multiple files

12:23 amalloy: msappler: perl :P

12:23 Raynes: Perl.

12:23 amalloy: o/

12:23 devn: msappler: someone wrote something like that, his github handle starts with a b

12:23 that's all the info I have :D

12:24 Raynes: amalloy and I actually did use perl to do that in sexpbot once.

12:24 It worked surprisingly well.

12:24 amalloy: msappler: $ find . | xargs perl -pi -e 's/foo\.bar/foo.baz/g', but don't quote me on it

12:24 devn: I think I have a script lying around somewhere that does it actually

12:24 amalloy: won't work if, eg, you're doing stuff like (use (foo bar sam))

12:25 msappler: or is there a way to do that in clojure? Edit files on the form-level not string level maybe?

12:25 Raynes: devn: I'm tempted to agree with fogus as well. If #_ worked the way he proposed, it would be fine.

12:25 amalloy: Raynes: i just added a comment replying to fogus; i don't think that's possible really

12:25 ohpauleez: For simple find and replace/rename, I'd just use sed

12:26 msappler: well its not simple ... because it depends on the package

12:26 Raynes: amalloy: Regardless, *if* it worked that way, I wouldn't mind.

12:26 amalloy: Raynes: that's probably fair

12:26 msappler: i want to reuse my game.utils.misc to game.utils.core and there are other namespaces called misc

12:26 *reuse -> rename

12:27 amalloy: msappler: try my perl thingy at the bash prompt?

12:27 msappler: nope I have no perl ;) and dont understand it ^^

12:28 ohpauleez: msappler: sed should easily do that for you

12:28 msappler: what is sed?

12:28 ohpauleez: are you on a *nix OS?

12:28 msappler: nope windows ^^

12:28 ohpauleez: hmm, nvm then

12:28 sed is a stream editor

12:29 it performs a macro edit on all files you pass to it as a stream

12:29 much like how the perl was working up above

12:30 msappler: i read a lot of developers use linux instead of windows ... someone can explain the advantages ?

12:30 something i missed maybe ? ^^

12:31 ohpauleez: msappler: Unix and unix-like operating systems are basically just a big ol' tool chest for developers

12:31 robonobo: msappler: lots of devtools (like sed)

12:32 fliebel: msappler: You don't have sed, nor GCC. and I heard emacs is a pain on Windows.

12:32 ohpauleez: the philosophy of how tools can be linked together, piped, combined, is a very similar philosophy to how functions are written and applied in Clojure

12:32 robonobo: make, gcc, all major scriping languages out of the box, emacs,

12:33 ohpauleez: additionally, accessing and monitoring the raw resources and interfaces on your computer are much easier

12:33 msappler: is there some place where I can start reading about linux and the advantages/tools that is gives me as a developer

12:33 ohpauleez: for example, I can "cat" (read) the stream of data from my mouse to the console/command-line

12:35 amalloy: ohpauleez: i could probably use a lot less perl in my life if i knew how to use sed

12:36 ohpauleez: msappler: I'd just thumb through the RSS streams for Linux Journal and Linux Magazine. If you like books, there's an older book called The Practice of programming by Rob Pike

12:36 fliebel: amalloy: have you tried 'cake filter'?

12:36 ohpauleez: amalloy: Yeah, sed rocks pretty hard. I rarely use perl for substitutions like that

12:37 robonobo: amalloy: sed is nice for onliners, but a complete pain to use for anything complicated

12:37 tonyl: awk

12:37 ohpauleez: amalloy: This is very true ^

12:37 robonobo: tonyl: yes. much better

12:37 fliebel: tonyl: Thanks! I was lookign for the name...

12:37 amalloy: ohpauleez: tbh though i'm pretty comfortable with perl and don't care about the extra...what, 20 characters it takes over sed?

12:37 fliebel: cake filter is neat. i forgot all about it

12:38 ohpauleez: I have yet to really get any sort of mastery with awk. If it's more than a one-liner, I fall back to Python or Perl

12:38 tonyl: although I don't use it that often, but oh it saves me precious time when needed

12:38 ohpauleez: msappler: Also take a look at Rob Pike's "The Unix Programming Environment"

12:39 Raynes: ohpauleez: I wrote a shell script in Clojure to compile the sources of my book to a PDF for me.

12:39 ohpauleez: again, these books are dated, but the philosophy is still there

12:39 Raynes: :D

12:39 ohpauleez: Raynes: Out. of. control.

12:39 haha

12:39 msappler: thanks very much i will look into that

12:40 ohpauleez: msappler: I'm happy to help

12:43 fogus`: amalloy: I responded to your comment, but as a summary I would just say "so be it." ;-)

12:48 devn: sed + awk, the original

12:48 ohpauleez: yes

12:48 the combo really is the trick

12:52 Raynes: Does anyone know if *current* swt jars are kept in any maven repository somewhere?

12:53 jweiss_: anyone have any experience publishing to their own (on a corporate network) maven repo? afaict, leiningen doesn't seem to do this

12:54 i know a maven repo is just a filesystem, but it's not exactly trivial to create the right directory structure.

12:54 amalloy: jweiss_: lein install

12:55 installs it locally, then you can just tar/untar in the other repo

12:56 jweiss_: amalloy: yeah, but i don't want to tar/untar the entire repo, just the thing i just installed

12:56 how can i even tell where it went?

12:56 i mean, i could browse the repo myself, but i want to grab it programmatically

12:57 amalloy: jweiss_: you could check out the source of cake's "release" task

12:57 which pushes to clojars specifically, i think

12:58 technomancy: jweiss_: 1.5.0-SNAPSHOT has a lein deploy task for pushing to archiva and friends.

12:59 amalloy: and it looks like cake deploy is designed to push to whatever server that supports ssh, if you pass it the right options. i'm not sure how hard it would be to supply those options

13:00 jweiss_: clojars lets you push with scp without having to specify where everything needs to go

13:00 maybe i should just run clojars myself

13:01 i was trying to avoid adding another piece of software

13:01 technomancy: jweiss_: archiva is a lot easier to set up than clojars, plus it does proxy caching

13:03 jweiss_: hm, i guess i can't get away with just a plain filesystem

13:03 i'll have to add tomcat to the mix

13:04 technomancy: you mentioned somewhere a while back that it wasn't that hard to get hudson to publish to my own maven repo - i looked around but i couldn't figure it out

13:05 http://stackoverflow.com/questions/3468461/push-to-nexus-using-leiningen

13:06 i already have a hudson server running

13:07 technomancy: sure, you can just have your hudson task execute "lein install" as the last step, then use nginx or whatever to serve hudson's ~/.m2/repository over static HTTP. archiva is nice for other reasons, but hudson+static is simplest.

13:07 jweiss_: technomancy: the problem with that is, ~/.m2 is on the hudson slave, not on the master hudson server.

13:08 and we have many slaves, it's nondeterministic which one will do the build

13:08 technomancy: ok, in that case you'll need to use lein deploy.

13:08 jweiss_: technomancy: ok thanks

13:14 mattmitchell: could someone point me in the right direction for simply connecting to mysql and selecting etc.?

13:15 LauJensen: mattmitchell: http://clojureql.org

13:15 (use 'clojureql.core) @(table db :users) will run SELECT * FROM users on the connection 'db'

13:15 mattmitchell: LauJensen: you prefer that over clojure.contrib.sql ?

13:15 LauJensen: mattmitchell: definitely

13:15 mattmitchell: LauJensen: ok i'll have a look. thanks!

13:16 LauJensen: np :)

13:31 melipone: what does DSL mean in the context of clojure? I read about building DSL but I don't know what that means

13:31 semperos: Domain Specific Language, more than likely

13:32 building in abstractions unique to your problem that make coding the application feel more "domain specific" than default Clojure

13:32 melipone: semperos: thanks

13:32 semperos: np

13:32 melipone: ok, I guess that's what Lisp and now Clojure do well

13:33 semperos: technically, Clojure is a Lisp, and yep, Lisp's facilitate it very well

13:40 mattmitchell: LauJensen: OK trying clojureql now, but keep getting this error: java.sql.SQLException: No suitable driver found for jdbc:mysql:// (db.clj:15)

13:40 amalloy: mattmitchell: you need to install a jdbc driver. i think clojureql tells you how to do that somewhere

13:41 but basically it's just a one-line addition to project.clj

13:41 mattmitchell: amalloy: ok great thanks!

13:43 LauJensen: mattmitchell: Use this for MySQL [mysql/mysql-connector-java "5.1.6"]

13:43 I think its the most recent

13:43 mattmitchell: LauJensen: excellent thank you

13:44 LauJensen: awesome, working :)

13:45 LauJensen: Great - If you have any questions feel free to shoot here or join us in #clojureql

13:46 mattmitchell: LauJensen: cool just getting ready to go there now

13:46 LauJensen: But as you can see, ClojureQL is so elegantly designed that even amalloy can figure out how to use it

13:46 * amalloy has never used clojureql

13:48 LauJensen: amalloy: still waiting for the PHP version? :)

13:57 amalloy: LauJensen: you bet

14:03 Scriptor: a PHP version of clojureql, you say?

14:04 amalloy: Scriptor: yeah, php has HOFs and parentheses, it should be a trivial port

14:04 for someone of LauJensen's calibre

14:05 LauJensen: Scriptor: I was just messing with amalloy who's a leading authority on PHP

14:06 Scriptor: I figured :) I should look more into relational algebra anyway

14:08 LauJensen: Yea its pretty sweet

14:24 Licenser: aloa

14:48 devn: aloha

14:49 raek: Introducing my new blog: http://blog.raek.se/2011/01/24/executors-in-clojure/

14:51 LauJensen: looks a little boring, especially I find the blogroll lacking ... :(

14:52 fliebel: raek: At least it's not twentyten...

14:57 raek: Do you mind if I steal the read eval blog loop for a command line blogging client? :) But I think I will use another reading function. (are you blogging Clojure forms?)

14:57 chouser: raek: I like the clean presentation.

14:57 raek: typo: taks

14:57 fliebel: chouser: It's Automattic.

14:58 raek: LauJensen: lacking a certain blog from Scandinavia? ;-)

14:58 don't worry. I added you.

14:58 LauJensen: raek: oh yea now that you mention it :)

15:00 raek: chouser: thanks!

15:01 to bad WP-Footnote does not support nested footnotes...

15:01 LauJensen: raek: Nice read - Look forward to seeing more from you

15:03 fliebel: http://blog.raek.se/wp-content/themes/thematic/readme.html doh, I should stop doing that...

15:05 raek: You should consider this to spice up your blogroll :) http://wordpress.org/extend/plugins/rss-blogroll/

15:33 timvisher: Sorry for the stupid easy question, but how can I turn `(:width

15:33 "1024" :height "1024")` into `{:width "1024" :height "1024"}`?

15:33 I've tried `(into {}...` and `(apply map...` but I'm missing

15:33 something obvious

15:33 technomancy: apply hash-map

15:34 timvisher: technomancy: brilliant. :)

15:34 wow

15:34 I was about to ask "is there even a map function" and just realized that I was trying to use map i.e. map/reduce...

15:34 I'm an idiot...

15:34 ^_^

15:35 ah well, all in the name of project

15:35 progress*

15:35 technomancy: there are only so many English words out there

15:43 Raynes: LauJensen: ping

15:48 melipone: okay, now I have my functions working in a .clj file. I put (myfunction args) at the end of the file. How do I execute that now in batch?

15:49 raek: melipone: with or without cake/lein?

15:50 technomancy: melipone: move (myfunction args) into the -main function, then use "lein run" or create an uberjar depending on how you want to launch it.

15:51 top-level forms that don't start with "(def ..." are almost always not what you want

15:51 melipone: Is it possible to run it without lein?

15:52 technomancy: possible but probably not worth the effort

15:52 melipone: I don't understand what "move (myfunction args) into the -main function" means

15:52 technomancy: unless you're talking about distributing to users; that's what uberjar is for

15:52 tonyl: http://www.glenstampoultzis.net/blog/2010/06/01/self-running-clojure-batch-file/

15:55 melipone: does that mean that I give my .clj as an argument to clojure.main?

15:56 tonyl: moving it to main like (defn main [args] (myfunction my-args)) has the same special case as the main function in a java class

15:57 melipone: I didn't know that, thanks.

15:57 tonyl: if you want to keep it simple use lein or cake or a similar program to run the clojure code

15:57 raek: aren't the args passed as separate parameters? i.e. (defn -main [& args] ...)

15:57 tonyl: or java -cp clojure.jar clojure.main myfunction.clj

15:58 raek: you might be right

15:58 double checked and raek is right on that one

15:58 Raynes: tonyl: It's -main, with the hyphen, and there aren't any special cases. it just so happens that if you name a function -main and then gen-class it, a Java class with a main method corresponding to your -main function is created.

15:59 tonyl: thank Raynes for clarifying :)

16:00 technomancy: there is a special case actually: java -cp [...] clojure.main -m my.namespace targets my.namespace/-main without AOT involved

16:00 melipone: do i still need to do that when passing it as an argument to clojure.main?

16:00 Raynes: technomancy: In what version of Clojure?

16:00 melipone: technomancy: that answered my question

16:00 1.2.0

16:01 technomancy: Raynes: new in 1.3.0

16:01 Raynes: technomancy: So your patch got accepted? Cool.

16:01 technomancy: even though the patch was written aaaages ago =\

16:01 Raynes: technomancy: Shhhh, or this will end up on Hacker News. ;)

16:04 fliebel: tonyl: The hyphen is the prefix for AOT'ing methods, by the way. So It's just main compiled to a method, nothing special on the Clojure side.

16:05 tonyl: so instead of creating a class out of -myfun it compiles to a java method?

16:05 amalloy: anyone have suggested syntax-highlighting colors for clojure?

16:06 * fliebel frowns at amalloy

16:07 amalloy: fliebel: i'm adding clojure-oriented css to something and my colors are always ugly

16:07 LauJensen: Raynes: pong

16:07 Raynes: LauJensen: Never mind.

16:08 fliebel: amalloy: I like browns, greens and purples, not to bright. What is the CSS for?

16:08 LauJensen: amalloy: Just follow the lead of charcoal black

16:08 fliebel: LauJensen: Does ClojureQL do transactions?

16:08 LauJensen: fliebel: Right now you can use contribs transaction macro, but Im putting in my own soon

16:09 amalloy: fliebel: i've started writing bloggish things like http://hubpages.com/hub/What-is-Clojure, and the syntax-highlighting module doesn't have any lispy-languages yet

16:09 LauJensen: Thats a problem most people run in to. One solution is htmlize

16:10 fliebel: … or Gist

16:10 amalloy: fliebel: would if i could

16:10 fliebel: amalloy: what prevents you?

16:10 amalloy: hubpages only gives authors limited control over the html

16:10 fliebel: ah, no JS and stuff...

16:10 amalloy: right

16:10 Raynes: fliebel: I used gist once, and about 5 seconds after I hit 'publish', Github had a major database catastrophe.

16:11 amalloy: i work there so i can add some backend highlighting support for any code marked as "clojure"

16:11 Raynes: Never again.

16:11 amalloy: but i can't let users in general do it

16:11 fliebel: Raynes: I'm on Posterous, and they do horrible things to your code if you paste it in an email.

16:12 Raynes: fliebel: So does Wordpress if you use the visual editor. Which is why I wish Raynes would get off his ass and write that offline blogging client he talks about so much.

16:12 fliebel: But the stupid thing is that they do horrible things to your whole post if you try to export and go to Wordpress, or something else...

16:13 Raynes: I havn't heard you about it. Tell me more :)

16:13 tonyl: fliebel: don't you just post the link to the gist and posterous formats it for you?

16:13 Raynes: fliebel: All blogging clients suck. My wont. Explanation complete.

16:14 fliebel: tonyl: They just embed the gist basically, but for feeds, they do render a static version, which never looks like it is supposed to, with tables and missaligning line numbers...

16:14 Raynes: Mine*

16:15 fliebel: Raynes: But is it a baker?

16:15 Raynes: Baker?

16:15 fliebel: Static site generator. Basically Markdown in, HTML out, end of story.

16:16 Raynes: I haven't actually figured out how I plan to do it. In any case, there wont be a 'visual editor', because those things are nothing but trouble. Markdown is a nice idea.

16:16 fliebel: I attempted one with devn… twice. It still lives at https://github.com/pepijndevos/utterson

16:19 It work much like an automated version of me, maintaining a static website. When I edit the Markdown, it uses Enlive to *edit* the website. So editing the HTML structure can be done on the site itself, and using Enlive to replicate the changes to the other files.

16:20 It would be cool to make it based on the lenses principle, so that editing the content updates the markdown files as well :)

16:20 Raynes: I think there are Markdown editors for Wordpress around...

16:22 http://michelf.com/projects/php-markdown/

16:26 LauJensen: fliebel: There's also an extended PHP markdown, which is much better

16:52 brehaut: morning (UGT)

16:53 tonyl: greetings

16:58 tibbe: Anyone have insight why PersistentHashMap2 is better than PersistentHashMap? My guess is that it's either faster, smaller or both but I'd be curious about the insights that led to the new design. Anyone knows?

17:01 chouser: tibbe: where are you seeing that?

17:01 hiredman: cgrand has a clojure fork with a leafless branch

17:01 chouser: ah

17:01 tibbe: chouser: in the GitHub repo e.g. https://github.com/clojure/clojure/commit/eedcf35479737ab1136e3b8a00b2759190a73fdb

17:02 hiredman: the current version looks leafless to me. do you have a link to that particular repo, maybe the commit messages have more info

17:02 nickik: i guess is black magic

17:02 hiredman: possibly I am confused

17:03 chouser: wow, a lot less code

17:04 fliebel: What is new about this second coming of the PersistentHashmap?

17:04 chouser: oh, nm, I misread the patch

17:04 this is from 2009

17:04 tibbe: @seen cgrand

17:05 hiredman: the license change from bsd back to epl

17:05 tibbe: fliebel: it might not be that new

17:05 chouser: that sounds like it was circa transients

17:05 tonyl: $seen cgrand

17:05 sexpbot: cgrand was last seen quitting 1 week and 2 days ago.

17:05 chouser: hm, maybe not that either.

17:06 hiredman: interesting to look at the history of a single file

17:06 I wasn't aware it was ever bsd licensed

17:09 chouser: that may have been done to allow the standalone java project and/or porting to use with Scala

17:09 tibbe: seems like the leafless version is a bit faster, especially in the transient case

17:09 hiredman: right, but then the change back?

17:13 fliebel: hiredman: That change was reverted? Or do you mean the license?

17:15 chouser: I think I saw someone ask if the license change back to EPL was intentional and if it would stay that way, and Rich said "yes"

17:15 though I'm not finding that now.

17:16 ah, here it is: http://groups.google.com/group/clojure-dev/msg/92e068cd2c5bbed7

17:21 mattmitchell: what's the recommended json library for clojure?

17:21 i've seen clj-json

17:22 oh i guess there's one in contrib

17:22 ohpauleez: mattmitchell: I'd use clj-json

17:22 it's much faster than the contrib lib

17:22 mattmitchell: ohpauleez: oh really? cool thanks.

17:22 ohpauleez: it uses Jackson under the hood

17:39 djpowell: anyone online with clojure-dev@googlegroups admin abilities?

17:42 phenom_: can someone help me out with this error when binding a function to something new? http://pastie.org/1494322

17:43 amalloy: phenom_: you must be using clojure 1.3

17:43 vars aren't automatically rebindable as of 1.3; you want (defn ^:dynamic with-log [...] ...), i believe

18:19 shortlord: when should '!' be used in function names? whenever they have side effects?

18:21 ohpauleez: shortlord: Yes

18:22 anytime manipulation/descruction happens (ie: there are side effects), you should append a ! to the function name

18:22 destruction*

18:23 shortlord: ohpauleez: so why have so few of clojures built-in functions the exclamation mark? ref-set or println for example

18:24 ohpauleez: shortlord: those happen in a transaction

18:24 so the do-sync is sort of liek one big !

18:24 dosync*

18:26 shortlord: ohpauleez: ah, makes sense (except for the println ;)) thx :)

18:26 ohpauleez: shortlord: np, glad I could help

19:03 shortlord: what are good books to get a deeper understanding of functional programming? On Lisp? (does not necessarily have to be about Lisps)

19:06 brehaut: shortlord: The Little Schemer, Real World Haskell, SICP

19:07 the second two are available on the net for free

19:10 shortlord: brehaut: thx :)

19:14 brehaut: whenever i see the 'fs' library mentioned, i expect it to contain (def fs (repeat \f))

19:14 i have no idea what it really is

19:15 pdk: file system?

19:15 peregrine81: this may be off-topic but does anyone have experience using screen over ssh and screen is black and white but the term is colored?

19:15 brehaut: oh. of course

19:16 peregrine81: ssh has options to send terminal settings to the host machine, maybe the wrong ones are getting sent (or not sent)

19:17 i cant tell you waht they are because ive completely forgotten it all

19:18 peregrine81: brehaut: i'm using my cr-48. when I ssh in the base ubuntu terminal is colored. but when I use screen its black and white. Everything within screen is greyscale everything detached is colored

19:19 brehaut: peregrine81: im out of my depth sorry

19:20 peregrine81: brehaut: ha, thanks, more help then i got from #ubuntu... most of that channel is "my youtube doesn't work"

19:21 brehaut: peregrine81: thats depressing

19:21 #screen perhaps?

19:21 peregrine81: good idea!

19:34 chouser: !who

19:34 er, sorry

20:17 devn: peregrine81: i'd make sure your TERM and TERMCAP are correct

20:52 Scriptor: in Clojure/other functional languages, how common is it that you have to iterate through a map, as opposed to just fetching items?

20:55 amalloy: Scriptor: pretty common, i should think

20:56 tomoj: surely common in clojure

20:58 Scriptor: thought so, trying to figure out how clojure optimizes it now

20:59 brehaut: they just implement seq like everything else

21:00 tomoj: for hash maps, order doesn't matter, so the seq can just wrap over internal arrays

21:01 amalloy: and sorted maps are pretty easy to iterate over too

21:01 tomoj: huh, that doesn't look very optimized though

21:01 Scriptor: hmm, going through the source and it doesn't seem like Persistentmap implements Seq, though I'm probably just not finding it

21:01 it does implement Iterable

21:02 amalloy: &(supers (class {}))

21:02 tomoj: ISeq

21:02 sexpbot: ⟹ #{clojure.lang.IPersistentCollection java.lang.Object clojure.lang.IFn java.lang.Runnable java.io.Serializable clojure.lang.AFn clojure.lang.Associative clojure.lang.IMeta clojure.lang.IObj java.lang.Iterable clojure.lang.MapEquivalence clojure.lang.IPersistentMap cl... http://gist.github.com/794381

21:02 tomoj: ignore Iterable

21:02 see the seq() implementation

21:02 amalloy: tomoj: it doesn't implement ISeq either

21:02 it implements Seqable

21:03 tomoj: oh, yes, ISeq is the return value

21:04 amalloy: right

21:04 Scriptor: that just means it can be converted to a Seq, but it's not how iteration is done, right?

21:04 tomoj: the ISeq implementation is also in PersistentHashMap.java

21:04 amalloy: Scriptor: that is how iteration is done, yeah

21:05 &(for [[k v] {1 2 3 4}] (+ k v))

21:05 sexpbot: ⟹ (3 7)

21:05 amalloy: &(for [[k v] (seq {1 2 3 4})] (+ k v))

21:05 sexpbot: ⟹ (3 7)

21:06 amalloy: many, many of clojure.core's functions turn their argument into a seq and then iterate over that; anything Seqable can be worked with

21:06 chouser: And even some things that are not Seqable, such as Java arrays, Strings, etc.

21:06 tomoj: seqs from maps don't appear to be chunked

21:06 Scriptor: ah, so it's still converting it, but it's just done without you directly noticing it

21:06 amalloy: it's just often implicit; the seq call itself is hidden within some macro (like for) or function

21:07 Scriptor: right, that makes sense

21:07 tomoj: or are they, somewhere else? hmm

21:07 chouser: tomoj: no, none of the map seqs are chunked

21:07 amalloy: tomoj: there would be no point

21:08 tomoj: really?

21:08 chouser: tomoj: vectors and range are -- I'm not sure if anything else is currently.

21:08 amalloy: you can't "realize" an element of a seq that comes from a map, because maps are not lazy and all the data is in memory already

21:09 tomoj: why would vectors be chunked, then?

21:09 chouser: amalloy: I'm not sure it would be pointless.

21:09 amalloy: tomoj: that's a good point. maybe it's not pointless

21:09 tomoj: my intuition was that for large maps it would speed up iteration

21:09 avoiding creating a new NodeSeq every step

21:10 or at least unfolding some of the loop onto the internal arrays somehow.. not sure how it would actually work

21:10 chouser: but I think there's still the possibility that pods may obviate chunked seqs

21:10 tomoj: I still have no clue what pods are :1

21:11 * amalloy was about to go home, but now has to stick around in case chouser tells us about pods

21:11 chouser: nah, I go nuthin'

21:11 got

21:11 amalloy: chouser: boooo. okay, ta-ta then

21:12 tomoj: I know that when the idea is ready it will be easy to learn about

21:12 semperos: wasn't there a brief mention?

21:12 http://p.hagelb.org/pod.jpg

21:12 or is this something different?

21:12 Scriptor: is a chunked seq simply when it lazily gets the values for several items at a time, instead of one at a time?

21:13 semperos: and this http://www.infoq.com/interviews/hickey-clojure-protocols

21:14 hiredman: more or less

21:14 semperos: there's a link that jumps to the part about pods

21:15 Scriptor: ah, nvm, found a pdf about chunked seqs

21:28 arkh: Scriptor: could you share the link to the pdf?

21:29 Scriptor: arkh: http://goo.gl/nISD7 is the PDF, though http://www.infoq.com/news/2009/12/clojure-11-rc1-transients has more text

21:33 arkh: Scriptor: thank you

21:33 Scriptor: no problem

22:03 mefesto: Raynes: ping

22:03 Raynes: mefesto: pong

22:04 mefesto: Raynes: hey, i added that clickable code block thing as well as a little fading effect on page transition

22:04 Raynes: Nice!

22:04 mefesto: Raynes: i forget was there something else on the list?

22:05 Raynes: Being able to jump to 'lessons' and a way to view a list of all the lessons is all that I can think of.

22:06 mefesto: Ok, well I think that'll be doable with how it is now. Do you have some pre-written lessons somewhere?

22:07 Raynes: mefesto: The ones in tutorial.clj are all that's been written. Once this is done, I'm going to start from scratch.

22:07 mefesto: Raynes: ok well i'll check that out

22:10 Raynes: good stuff. i'll put all this in the javascript thing and commit later tonight (hopefully).

22:16 accel: is there a variant of clojure that provides compile time type checking?

22:16 (pehraps written as a macro system or something)

22:17 amalloy: accel: that would be a huge effort

22:18 (map str [1 4 6])

22:18 even that simple example will be hard to do "right" with static typing. what are the return and argument types of map?

22:19 tomoj: in the case where the collection type is mixed, you're screwed I guess

22:19 but str is tagged with String

22:19 accel: well, haskell can do mixed types

22:19 as can ocaml

22:19 tomoj: but this isn't haskell or ocaml :)

22:20 huh

22:20 accel: yeah; but clojure is powerful

22:20 tomoj: map doesn't look particularly easy to analyze, anyway

22:20 accel: and i'm trying to figure out what can easily be done in clojure

22:21 brehaut: accel: what do you mean by 'easily be done in clojure'

22:22 tomoj: that would maybe be easier after there is a clojure compiler written in clojure?

22:22 accel: well, it'd be a clojure DSL

22:22 that had milner typing

22:22 it wouldn't be hacked into clojure's compiler,

22:22 amalloy: tomoj, accel: this quickly turns into just ugly java: public <In,Out> List<Out> map(List<In> coll, Function<In,Out> f) {...}

22:22 accel: it'd be a DSL on top of clojure

22:22 amalloy: and that's ignoring the multiple arities of map

22:22 accel: amalloy: I don't understand what your example proves

22:22 plus, map exists in haskell & ocaml

22:22 brehaut: accel: subtypes make one hell of a mess of HM typing

22:23 tomoj: oh, you mean you'd have to infect (if you will) _all_ the clojure you want type-checked with this new typed language?

22:23 amalloy: tomoj: either that or not gain anything

22:23 if you have to cast all the time to go back and forth from "real" clojure to "typed" clojure...

22:24 Scriptor: accel: what would the DSL look like, a macro that goes through everything and tries to typecheck it?

22:24 tomoj: well, a clojure program could certainly look at normal clojure code and detect _some_ type errors

22:24 accel: not necessairly a macro

22:24 you'd write sexps still

22:24 tomoj: but you wouldn't gain much, sure

22:24 accel: err the macro/DSl would then take the sexp, type check it

22:25 and then report potential errors

22:25 Scriptor: so like (type-check (map str [1 2 3])) ?

22:27 amalloy: tomoj: sure. (map (comp inc str) [1 2 3]) you could probably catch with just the existing type-hints

22:27 accel: Scriptor: why not?

22:28 Scriptor: accel: cool, just wanted to make sure I understood clearly

22:29 amalloy: actually i guess not. comp would have to be parameterized<In, Out> for that to work

22:31 i guess i should learn haskell. static-typed functional languages seem like a tremendous pain, but i understand it's not an issue there

22:32 Scriptor: I've only briefly looked at it, but it's pretty nice

22:32 brehaut: amalloy: the static typing in haskell is actually pretty managable 90% of the time

22:32 Scriptor: typeclasses and type variables (or whatever they're called in the signatures) make things very nice

22:32 brehaut: i think the hardest part of haskell is the terminology

22:33 and the heavy use of operators

22:43 amalloy: if you do look at haskell, real world haskell and the typeclassopedia are good sources of information

22:44 Scriptor: learn you a haskell isn't bad either, but it's especially helpful in teaching the mindset of functional programming

22:44 which probably isn't necessary here :)

22:46 brehaut: Scriptor: the additional text around some of the more abstract abstraction still wouldnt go amiss

23:02 Scriptor: amalloy: so since we were joking about clojureql in PHP earlier, I thought this might be relevant

23:03 I'm working on a lisp to php compiler, it's kinda like clojure, so maybe its possible to implement it there?

23:05 amalloy: Scriptor: an interesting project

23:06 i think clojure would be an excellent language for that, even if what you want to translate is actually CL

23:07 i'm not sure it's worthwhile though since you'd have a terrible time trying to get halfway legible/idiomatic php

23:07 so it's not useful for humans; and computers can do just fine with clojure

23:07 Scriptor: it's more similar to clojure actually, at least in the sense that I know it better

23:09 true, the PHP emitted is more or less legible, or at least tries to be, and things might be better with some debugging support added

23:26 brehaut: has anyone here submitted the contributor aggrement?

23:27 replaca: I have, why?

23:27 brehaut: what happens once you put it in the mail?

23:27 replaca: the postman takes it to rich, assuming you've put a stamp on it :)

23:28 brehaut: yeah thats the theory

23:28 Raynes: brehaut: Once it's been Richified, you'll be added to the contributor list.

23:28 brehaut: does he email you or anything

23:28 hiredman: post person

23:28 brehaut: ok cool

23:28 replaca: then the government puts you on a list of potential subversives who are undermining the capitalist system by making free software

23:28 brehaut: haha

23:29 your government or mine?

23:29 replaca: it's all really a trick - before you know it, you're packed off to the gulag

23:29 brehaut: crap

23:29 replaca: probably mine. They seem to be most everywhere

23:29 neilcj: this explains my lack of productivity: survival instinct

23:29 replaca: you didn't really send it in, did you?

23:30 brehaut: better hope the international mail system is as bad as its reputation

23:30 replaca: :)

23:30 Scriptor: yep, only the procrastinating programmers have survived the generations

23:30 replaca: no really, he just puts your name up on the list on the site

23:30 and that's how you know

23:30 brehaut: ok cool

23:31 replaca: you can just annotate your first patch submission or whatever with the "I've sent my CA in and Rich should have it"

23:31 if he hasn't gotten around to it

23:32 brehaut: thats good to know

23:32 assuming he can read my chicken scratch handwriting :/

23:33 replaca: well, if it never got there, I assume you can just do it again

23:33 brehaut: cheers for the info anyway

23:33 replaca: though, I notice that this is a hurdle that cause a lot of people real problems

23:35 brehaut: the hand writing bit?

23:35 amalloy: submitting a CA and waiting, i would assume

23:35 brehaut: sure

23:37 replaca: amalloy: something about snail mail and the written document rubs some folks the wrong way. Too high a bar.

23:37 amalloy: replaca: i didn't like it either

23:38 * dnolen likes it

23:38 Scriptor: isn't the signature required for some legal purposee?

23:38 brehaut: Scriptor: yes; ensures rich has certain controls over your contributions

23:39 for example he can relicense without requiring he tracks down everyone who has contributed

23:39 the part i dont like is having to trust at least two mail services

23:44 rt: Anyone mind recommending one of the Clojure books for someone with previous lisp experience?

23:45 no previous lisp experience*

23:46 dnolen: rt: Funtional Programming experience?

23:46 rt: Some, yes, just not any lisps

23:46 amalloy: (nb: Functional Programming doesn't mean programming with functions, like C. i thought it did for a long time)

23:46 rt: No, I've worked with scala (as a fp) and some erlang

23:47 brehaut: rt ive found joy of clojure (pdf beta thing) to be a good book

23:49 rt: Thanks for the advice, I'll check it out

23:51 dnolen: rt: if you know/like Scala and Erlang, you should feel at home in Clojure. Clojure is an interesting dynamic lang - it's dynamic type classes are really a killer feature IMO.

23:53 rt: I'm def. intrigued. Having never worked with lisp, it's a little intimidating, hence the desire for a good book to help me understand how to wrap my head around it.

23:54 brehaut: rt, what are you finding intimidating?

23:54 rt: hmm, hard to say honestly. For starters, it's just hard to read for me. I'm sure that will go away with experience, but initially it's a challenge

23:55 brehaut: rt what editor are you using?

23:56 rt: basic vi right now…might look for a clojure bundle for textmate or look at getting vi more configured for it

23:56 brehaut: textmate's clojure story is lagging behind the other major editors

23:56 i use textmate for everything but clojure

23:57 i understand that the vi mode is good though

23:57 dnolen (i think) might be able to give you a better status on textmate support

23:58 rt: Honestly, I've more been playing with the repl than working with an editor to this point

23:58 dnolen: brehaut: sweet! I've totally dropped the ball on that, busy with work, and in my free time, Logos.

23:58 brehaut: dnolen, sweet?

23:58 dnolen: brehaut: I interpreted you as saying that you might be working on textmate stuff :)

23:59 brehaut: no sorry

23:59 i have been dabbling with logos though ;)

23:59 dnolen: brehaut: cool! :D

Logging service provided by n01se.net