#clojure log - Jul 05 2011

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

0:00 seancorfield: the new clojure contrib libs work with 1.2

0:00 amalloy: seancorfield: i know some of them do, but i'm a little surprised to hear that all of them do

0:01 seancorfield: it's a requirement: new contrib must support clojure 1.2

0:01 amalloy: cool

0:01 semperos: yeah, I had read that some featured compatibility with both, forgotten frankly

0:01 seancorfield: i didn't know until i fell foul of it with c.j.j and accidentally made it 1.3 only :(

0:01 that nice mr bedra corrected me :)

0:02 glitch83: Hey everyone - I've got a quick test I've been trying to perform with clojure - I want to save a lambda for use later

0:02 I used the readObject / writeObject on the lambda to save it out but when I load it back in - it gives me a NO_SOURCE exception

0:02 sean_corfield: time to move to the TV room and kick back

0:02 glitch83: any thoughts?

0:03 semperos: sean_corfield: enjoy, thanks for your feedback

0:03 technomancy: glitch83: lambdas aren't serializable by default

0:03 you can cheat with this:

0:03 clojurebot: serializable-fn

0:03 clojurebot: serializable-fn is a hack for preserving source of a compiled function: https://github.com/technomancy/serializable-fn

0:04 technomancy: that's somewhat half-baked though

0:04 glitch83: hm yeah I have thought about the limitations - it's not an easy problem but let me give this a shot

0:06 This looks sufficient enough for some basics - now I'm thinking how to dynamically load clj files - I assume (load-file <filename>) ?

0:07 technomancy: glitch83: yup

0:07 you shouldn't use that for your project's source, but for arbitrary files on disk it's fine

0:07 glitch83: sweet - I think this is enough :-) thanks all!

0:09 schnorrer: hi, has anyone had troubles with "lein ring server" and Unicode on web pages (lots of "????????")?

0:09 a war generated with "lein ring war" works fine if deployed on a 'standalone' jetty

0:11 looks like it has something to do with misconfiguration of the embedded jetty, but I have no idea how to fix it

0:12 tomoj: the charset is UTF-8 in both cases?

0:12 but one has garbage that's not actually utf-8?

0:12 schnorrer: well, the data pulled from DB are definitely utf-8

0:12 tomoj: I mean in the http response

0:13 schnorrer: ah, yes

0:13 tomoj: no clue then :(

0:13 schnorrer: sighs

0:13 tomoj: I don't think I've ever had any of that NOT use utf-8 without me asking

0:14 * technomancy blames MacRoman

0:15 hiredman: MacRoman is innocent

0:15 technomancy: you're getting him confused with Bill Stickers

0:15 http://www.snapbuzz.com/images/resized/Bill_Stickers_is_innocent6956.jpg

0:21 schnorrer: tomoj: oh, my bad :( 'ring server' indeed returns ISO-8859-1 charset

0:22 how can I explicitly set the charset anyway?

0:23 amalloy: schnorrer: add a Content-Encoding header?

0:23 though i'd guess utf8 is the default anyway

0:25 tomoj: I think you want to add '; charset=utf-8' to the end of your content-type header

0:25 schnorrer: amalloy: somehow it's not

0:27 * amalloy can never keep content-{type,encoding} straight

0:29 schnorrer: nope, seems not working: I'm still getting a page with <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> but with ISO-8859-1 in the header

0:30 tomoj: are you rendering out that meta tag?

0:30 or actually setting the content-type header in your ring response, which somehow comes out as a meta tag instead of a header..?

0:30 schnorrer: wait

0:31 I'm rendering it

0:31 with hiccup's [:meta {:http-equiv "Content-Type" :content "text/html; charset=UTF-8"}]

0:31 unsurprisingly, it doesn't work

0:32 amalloy: ew. don't add http-equiv tags if you control the http transport

0:34 * amalloy tries to be an eclectic mix of opinionated and clueless

0:34 tomoj: schnorrer: do you just return a string now?

0:35 like, maybe you just the output from hiccup directly to ring?

0:35 s/just the/just return the/

0:36 schnorrer: tomoj: I return hiccup output to ring

0:37 tomoj: see hello world in ring readme

0:37 schnorrer: not directly though (via compojure routes)

0:37 tomoj: for example of map to return with explicit http headers

0:38 schnorrer: tomoj: uh-huh, got it

0:39 tomoj: hmm.. is being able to return a string something compojure adds or is it in ring?

0:39 if in ring, is it a middleware that converts strings to response maps, I wonder..?

0:42 amalloy: tomoj: i think it's probably compojure

0:43 looks like it's in compojure.reponse$Renderable, at first glance

0:44 tomoj: what is that $

0:44 oh found it

0:44 good

0:44 amalloy: well, i meant to imply an inner class, but i think that was a wrong implication

0:45 tomoj: kinda bothered me that that would be added to all ring handlers by default when it should be a middleware

0:45 amalloy: yes. given ring's minimalistic approach it would be very surprising if it included that

0:45 schnorrer: speaking of compojure, the most straightforward way to set the response header I see is to wrap the (defroutes) handler in a middleware, right?

0:46 amalloy: schnorrer: yeah, just squeeze a middleware in there somewhere

0:46 tomoj: see ring.middleware.content-type/wrap-content-type

0:47 eh

0:47 amalloy: you can't wrap the (defroutes) form, but you can wrap the var it produces, or (def my-rountes (wrap-content-type ... (routes ...)))

0:47 tomoj: wrap-content-type doesn't add the charset bit, though, does it?

0:48 amalloy: no, you can't use the one from ring for that. it's only intended for serving static files

0:48 tomoj: oh you need the extension

0:49 amalloy: yeah

0:49 tomoj: what would it do, just add charset to specific detected content types?

0:50 like some other middleware sets text/html, then something notices it and adds utf-8? or you just special case wrap text/html+utf-8

0:51 amalloy: too many pronouns. none of those "it"s are clearly bound

0:51 tomoj: first it is a hypothetical middleware to add utf-8 charset

0:51 amalloy: k

0:51 tomoj: second it is text/html in :headers->"Content-Type"

0:52 amalloy: i'd probably special-case-wrap

0:52 but that may not be a good solution *shrug*

0:58 schnorrer: I'm trying to figure out if it's possible to set embedded's jetty defaults, but the middleware workaround is fine too

0:58 thank you guys

1:07 amalloy: schnorrer: probably a good idea to use the middleware anyway rather than trying to configure jetty

1:08 you might want to deploy on tomcat sometime, for example

1:14 schnorrer: amalloy: most likely, but in this case I'd rather choose the less invasive way

4:26 schasi: Are there latex templates for clojure presentations? :D

4:27 hiredman: ( ) you can use these parens

5:13 Vinzent: Will clojure.lang.IKeywordLookup be turned into a protocol in clojure 1.3?

5:16 clgv: Vinzent: why do you ask? you can implement java interfaces within clojure easily as well

5:20 Vinzent: clgv, I have java classes which I can't inherit, so If IKeywordLookup was a protocol, it'd be much easier

5:21 clgv: Vinzent: that conclusion is not clear to me. you have a concrete example why it would be easier? (protocol case vs interface case)

5:23 Vinzent: clgv, I thought with interface I have to build proxy classes, am I wrong? And with protocols I can just extend it on the existing type

5:24 clgv: you can also implement interfaces in defrecord or deftype.

5:25 I enhanced one of my deftypes to support metadata by implementing withMeta and meta from clojure.lang.IObj

5:26 Vinzent: clgv, no, I need to make keyword lookup support in existing java classes

5:27 clgv: Vinzent: so you have an existing java class that the evil programmer made final and you want it to implement IKeywordLookup?

5:27 Vinzent: clgv, exactly

5:27 clgv: Vinzent: well, IKeywordLookup being a protocol wouldnt change that much afaik

5:28 bsteuber: clgv: yes it would :)

5:29 Vinzent: clgv, why? I'd just write (extend-protocol IKeywordLookup MyClass ...) and that'll do the job

5:29 clgv: ah ok, so there is clojure dispatch via defprotocol in place then. point taken

5:30 bsteuber: Vinzent: what I did in a similar case was write my own get and set multumethods that work with keywords and use reflection to call java getters/setters per default

5:31 Vinzent: bsteuber, so you was writing (get Bean :value)?

5:32 bsteuber: yes, but most of the time I need setters anyways

5:32 it#

5:32 s for a swing wrapper

5:33 clgv: Vinzent: is there more than one class that you need to support IKeywordLookup? if not proxy is not that worse as solution for now

5:33 s/worse/bad/

5:33 sexpbot: <clgv> Vinzent: is there more than one class that you need to support IKeywordLookup? if not proxy is not that bad as solution for now

5:33 bsteuber: so I made a function make that can be called like (make JButton :text "Foo" :on-click #(bar))

5:34 Vinzent: bsteuber, ok, I'm writing SWT wrapper :) but (get ...) thing isn't much better that (.getValue ...) and non-idiomatic anyway

5:34 bsteuber: ^^

5:34 yes, true

5:34 first I used proxies to implement IDeref

5:35 that looks much nicer, but I ran into weird bytecode incompability issues on some platforms

5:35 Vinzent: clgv, yes, there is a huge amount of classes...

5:35 clgv: Vinzent: do they share a a common interface that is used for the lookup?

5:37 Vinzent: bsteuber, deref? and what it looks like? @(element :value)?

5:38 bsteuber: more like @my-combo-box which gives the selected value

5:38 but of course sometimes there's more than one "value" connected to a widget"

5:38 Vinzent: clgv, hm, I don't think so, but let me sure...

5:40 bsteuber, oh, got it. But anyway it's very handy for such special cases, I need to implement it also!

5:40 bsteuber: ^^

5:40 but actually I think IDeref isn't meant to be implemented by "users"

5:41 because it implies some concurrency guarantees

5:41 I guess another, cumbersome thing you could do

5:41 would be using one defrecord per class you want to wrap

5:42 offering the clojure-interface and holding the actual widget

5:42 of course you'll need heavy macrology..

5:42 and reflection

5:43 well maybe deftype, as you need your own ILookup implementation

5:44 Vinzent: Looks like this is the only way...

5:48 bsteuber: or you could fork clojure and make ILookup etc. protocols xD

5:48 maybe I would even use your version :)

5:54 Vinzent: That could be more elegant solution :) But I believe there is some serious difficulties that prevented Rich to do it himself

5:56 peteriserins: if I have a list as a string, say, "(a\n(b (c d)))", can I obtain a representation in clojure?

5:56 tomoj: $findfn "(a\n(b (c d)))" '(a (b (c d)))

5:56 sexpbot: [clojure.core/read-string]

5:57 peteriserins: thanks

6:13 bsteuber: Vinzent: I believe the main reason is performance - like for almost everything that happens or doesn't happen to clojure these days

6:16 Vinzent: bsteuber, but protocols have nearly the same perfomance characteristics as interfaces, isn't it?

6:18 well, maybe not "nearly the same", but still good. And anyway a little perfomance penalty is a reasonable fee for the capabilities of protocols

6:18 bsteuber: I think some hotspot inlining doesn't kick in or so, but I really don'T have a clue how big the difference is

6:20 but one should think that what's good enough for clojure libraries should be good enough for the clojure API, too

6:20 schnorrer: tomoj: hmm, character encoding is set explicitly to UTF-8 in ring.util.servlet (https://github.com/mmcgrana/ring/blob/master/ring-servlet/src/ring/util/servlet.clj#L119) which, as far as I can see, is not the case with ring.jetty.adapter

6:21 this could explain the weird behavior duality

6:21 ring hello world app screws up unicode, too

6:22 seemingly for the same reason

6:22 Vinzent: yeah, that's true

6:34 clgv: hmm got the same "strange behavior" again. after doing a "clean project" I get reflection warnings that I did not have before (even from some dependencies). I did not manually set *warn-on-reflection* in any of my sources. I had this a while ago. Then it didn't happen anymore until now.

6:35 "clean project" is the one from eclipse and should only delete the content of bin folders. lein deps is not called

6:44 peteriserins: $findfn "([ ])" '("[" "]")

6:44 sexpbot: []

7:06 peteriserins: How to put quotes around all [^ ()]+ in a string?

7:10 nevermind, I think (.replaceAll (re-matcher #"([^ ()]+)" "(This is a (test))") "\"$0\"") does the trick

7:10 clgv: lets check: ##(.replaceAll (re-matcher #"([^ ()]+)" "(This is a (test))") "\"$0\"")

7:10 sexpbot: ⟹ "(\"This\" \"is\" \"a\" (\"test\"))"

7:11 bsteuber: ,(clojure.string/replace "([])" #"[^()]" #(str "\"" % "\""))

7:11 clojurebot: java.lang.ClassNotFoundException: clojure.string

7:11 bsteuber: ,(require 'clojure.string)

7:11 clojurebot: nil

7:11 bsteuber: ,(clojure.string/replace "([])" #"[^()]" #(str "\"" % "\""))

7:11 clojurebot: "(\"[\"\"]\")"

7:12 bsteuber: ah the + is missing

7:13 but I guess clojure.string/replace is more idiomatic than using Java

7:15 peteriserins: actually the regex needs fixing. [^()\s] I suppose

7:16 (with the +)

7:24 how to properly include the replace function?

7:25 I am using (:use [clojure.string :only (replace)]))

7:25 in my ns declaration

7:26 it gives me an illegal state exception as I reload it in the repl

7:28 clgv: peteriserins: you might use (:require [clojure.string :as str]) and the use (str/replace ...)

7:28 bsteuber: (:use [clojure.string :only [replace]])

7:28 so square brackets

7:29 of course, require is possible, too

7:29 clgv: bsteuber: uh! what do these square brackets change concerned with :only?

7:30 I only knew the list version

7:31 bsteuber: clgv: hmm, doesn't seem to make a difference at all

7:31 clgv: bsteuber: lol. k;)

7:31 bsteuber: but in general, always use () when the first element of the list is special

7:31 and [] if all are "same"

7:31 so :only (foo bar) is bad style

7:32 ejackson: bsteuber: ha! that's a nice heuristic, thanks.

7:32 bsteuber: as well as (:use [clojure repl string]) - here "clojure" is special

7:33 so always write (:use (clojure repl string))

7:33 clgv: bsteuber: yes thats a different semantic. didn know it was supported until some weeks ago

7:35 bsteuber: but I wouldnt take that as example for the heuristic since it's contract for the :use form: the first one is specifying full namespaces and the second one specifies a namespace prefix under which the following "partial" namespaces are found

7:37 * ejackson quietly wishes that (foo *) would be supported in these forms, especially for java packages.

7:40 bsteuber: ^^

7:40 clgv: I don't understand where the contradiction is

7:41 :use would allow both [] and () for this, but () is more idiomatic due to the heuristics

7:41 clgv: bsteuber: the semantic of (:use [clojure repl string]) is already defined. so the user has no choice there. the one implementing :use/use had the choice though ;)

7:42 bsteuber: but :use defines the same semantics for () and [], so I do have a choice

7:43 clgv: bsteuber: oh right. my error. I wouldnt allow it, if I defined :use

7:44 in this case I would enforce the "() vs []" rule to be able to give more specific errors

7:45 bsteuber: yes, me too :)

7:45 clgv: I assumed they did so ;)

7:47 bsteuber: peteriserins: btw, the illegalstateexception occurs when you already use'd the exact same var from your namespace

8:09 peteriserins: bsteuber: what I am doing is, I am using a file and the REPL

8:09 bsteuber: and I wrote a (reload) function to load-the-appropriate-file

8:12 bsteuber: peteriserins: so probably restarting the repl will get rid of the problem

8:13 huh, I can't call future when using leiningen 1.6.0

8:13 always throws a RejectedExecutionException

8:13 peteriserins: bsteuber: it doesn't

8:14 bsteuber: did anyone else try lein 1.6.0 yet?

8:17 peteriserins: maybe you should switch to an ide instead of loading files yourself from the repl

8:17 not sure how to do this correctly

8:18 peteriserins: bsteuber: I'm using Vim

8:18 bsteuber: ah good

8:18 though I'm more an emacs guy :)

8:28 clgv: bsteuber: huh? I just considered upgrading lein... maybe I should wait a bit... :/

8:29 bsteuber: clgv: well, as long as noone confirms the same problem, it could be just some weirdness on my machine

8:29 clgv: I don't dare to try to confirm it ;)

8:29 bsteuber: though java -jar clojure-1.2.1.jar works fine

8:29 ^^

8:32 clgv: did anyone try a clojure.walk-like implementation using multimethods?

9:14 bsteuber: clgv: I now downgraded to lein 1.5.2 and it works fine again

9:14 so probably good to be careful

9:16 did that by symlinking to my lein checkout of tag 1.5.2

9:16 clgv: ok, I didn't read of any improvement that encourages me to upgrade anyway. I just wanted to do it for maintenance ;)

9:17 bsteuber: I like the user.clj support for auto-using clojure.repl and clojure.java.javadoc in my user-ns

9:17 as I do that all the time

9:31 clgv: you use lein repl?

9:38 bsteuber: no usally swank

9:40 clgv: hmm how do you profit from the user.clj then?

9:46 jcromartie: It's sad that "build ___ with ZERO code!" is considered a great selling point in the .NET world

9:46 I rather like to code...

9:48 bsteuber: clgv: slime-connect also puts me in the user namespace

9:49 clgv: jcromartie: you mean click&drag GUIs?

9:49 mlimotte: jcromartie: or complicated config files, which are like learning a new language

9:52 clgv: mlimotte: you mean XAML? that's in fact another language ;)

9:52 mlimotte: probably not turing complete, though ;)

9:57 jcromartie: mostly the drag-and-derp variety

9:58 clgv: jcromartie: well you can only sell it to managers with that. real developers know that there is no such thing as "zero code" for building software ;)

10:01 jcromartie: also WTF is this http://stackoverflow.com/questions/6558083/best-way-to-convert-clojure-source-to-java-source-automatically

10:01 looks like someone used Clojure at work and now the boss needs to know how to turn it into Java

10:01 ejackson: regression

10:02 clgv: we can tell him that it's simple: just use a java decompiler :D

10:02 ;)

10:03 ejackson: how about a 1 word answer to go the with the zero code answer: "don't".

10:04 clgv: ejackson: that's two words counting strictly ;)

10:04 jcromartie: ejackson: perfect answer

10:04 ejackson: :)

10:05 jcromartie: OK here's one more point for favoring "data" over "objects"

10:06 in this .NET reporting library ("build reports with ZERO code!") you can't store a web app's session data outside of the web app process itself

10:06 i.e. to a database or filesystem or another process

10:07 clgv: for real?

10:07 jcromartie: because each object in the session needs to be specifically marked as serializable at compile time

10:07 and even if it's just a simple collection type, it can't just be simply serialized

10:09 now if only it was just a hash map

10:12 ejackson: crazy talk

10:15 jcromartie: OOP says "you don't have to worry about the implementation"

10:15 but I do

10:15 because your stupid implementation broke my app

10:16 clgv: jcromartie: well I am pretty sure you do stupid implementations with and without OOP ;)

10:17 jcromartie: of course

10:17 but you know what I mean

10:17 clgv: I have a glimpse ;)

10:22 jcromartie: and by "your" implementation I mean third party library vendors

10:22 clgv: yes, I also meant "them" with "you".

10:23 sometimes english is really imprecise

10:52 cemerick: feedback and critiques most welcome: http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

10:54 hugod: cemerick: gen-class can't define fields

10:56 cemerick: hugod: true enough; you're saying that should be noted as a key decision point?

10:57 bsteuber: cemerick: maybe you might want to clarify "new methods" a little

10:57 like "methods not in implemented interfaces"

10:57 cemerick: that is, there are lots of subtle issues that might throw one towards using gen-class, or one of defrecord v. deftype — trying to account for them all would result in quite the bird's nest of a flowchart

10:59 hugod: not sure - just pointing it out

10:59 also the flow seems to prefer gen-class over def-type for aot - is that intentional?

10:59 cemerick: bsteuber: yeah, I'm not happy with that wording either

11:01 hugod: of course :-)

11:02 dnolen: cemerick: I note that you don't mention a plain map with :type metadata

11:02 hugod: cemerick: why? deftype is a lot easier to read (imho), and you can define multiple types in a single ns…

11:02 clgv: cemerick: is extending from a base class an important aspect for you? then I would ask it as first question instead of dispatching two times with this question

11:03 cemerick: dnolen: yeah, fogus just tagged me with that on twitter

11:04 I was coming at this from a section in the book talking about interop, thus the class-generating-forms bias.

11:04 dnolen: cemerick: I also don't really like the fact that the flowchart puts class/type together. deftype/record are not about interop.

11:05 hugod: my current use case would like to extend a base class, but can't because I need to specify fields for interop, so have to use deftype

11:06 dnolen: cemerick: flowchart would perhaps better titled "I need interop, now what?" vs "type/class" distinction.

11:07 cemerick: hugod: My "of course" was in response to your "just pointing it out" :-)

11:07 hugod: but no, not intentional

11:08 The interop state of mind has obviously tinged the whole endeavor.

11:08 clgv: good point

11:09 Though, if I invert it, then I'll be asking "do you need a named class" twice

11:11 clgv: cemerick: yeah, you have to decide what's more important. I vote for "exntending a base class" ;)

11:12 bsteuber: clgv: hm I'd ask for anonymous first - just because reify and proxy seem closer to each other than the rest

11:13 well just a matter of taste anyways :)

11:15 clgv: bsteuber: to show similarity ("being close") I would use something else for visualization. I would only ask what is more important for the developer.

11:16 I guess an objective criterion would be to minimize the average number of question until a decision is made

11:40 cemerick: dnolen: re: "deftype/record are not about interop": they are all about defining a host type, as is reify.

11:42 dnolen: cemerick: "interop" means (to me) coordinating between Java and Clojure. deftype/record/protocols are not about that at all.

11:44 cemerick: yeah, we're just into semantics there :-)

11:47 dnolen: cemerick: "The intent is that, unless interop forces one to go beyond their circumscribed scope, one need not leave Clojure to get the highest-performing data structures possible on the platform." http://clojure.org/datatypes

11:49 hugod: dnolen: I couldn't see any published jars for core.logic…

11:50 dnolen: hugod: http://build.clojure.org/job/core.logic/lastBuild/ ?

11:50 cemerick: dnolen: "A datatype provides a host type…" ibid. I see what you're saying, but a lot of what we understand about the semantics of deftype (for example) rely on our understanding of classes, fields, etc.

11:52 hugod: dnolen: was the staging repo ever closed and promoted?

11:54 dnolen: hugod: ?

11:54 cemerick: dnolen: there wasn't an actual release of core.logic, so artifacts never went to central

11:55 hugod: dnolen: the build log shows the jar being uploaded to sonatype staging - to actually get it into the releases repo it needs to be closed and promoted through the oss sonatype nexus instance

11:55 dnolen: hugod: ah so I need to get someone on core to do that?

11:56 cemerick: dnolen: see http://dev.clojure.org/display/design/How+to+Make+Releases

11:56 the release process is entirely automatic; twiddling the version number to be non-SNAPSHOT doesn't actually push releases through, tho

11:56 (entire automatic, given a button-press in hudson, that is)

11:57 clgv: humm why is it "core.logic" instead of "contrib.logic"?

11:57 * hugod prefers command line deploys

11:57 cemerick: That staging repo actually needs to get dropped to make room for the actual release.

11:57 chouser: cemerick: I like the flowchart. I think my primary point of concern would be that someone without sufficient familiarity with functional programming might think they know the answers to many of the questions, and yet be wrong, ending up in gen-class when they shouldn't be.

11:59 starting with the first one. I'm an OO programmer. I have a few pieces of related data I need to use together. Therefore I think I need a class, when in fact all I need is a map or vector.

11:59 dnolen: clgv: in hopes that one day it might actually be good enough to live up to that name ? :)

11:59 kephale: chouser: are you the same chouser that does Gentoo stuff?

11:59 clgv: dnolen: ok, marketing reasons ;)

11:59 chouser: Or I think I need new methods when helper functions would suffice, or that I need a ctor when a factory fn would be better, etc.

12:00 kephale: wow, once upon a time, yes.

12:00 kephale: chouser: heh, cool, just curious

12:00 chouser: surely you haven't seen my name in anything gentoo related for years?

12:01 kephale: actually your name is still all over gentoo docs

12:01 dnolen: hugod: hmm, don't think I have a hudson login

12:01 chouser: heh. wow. well, yeah, that's me. hi. :-)

12:01 technomancy: bsteuber: for the record, it's fixed in git and will be released today or tomorrow

12:02 chouser: I used to use gentoo to control my computers. These days ubuntu lets me use them in certain, restricted, ways.

12:03 kephale: yeah, i more or less quit gentoo after the developer split years ago and embraced my debianite tendencies

12:04 cemerick: dnolen: I can start the release for you if you like; I don't know what core's policy is on hudson logins.

12:05 dnolen: cemerick: that'd be great, thanks! I sent a message about hudson login to the clojure-dev ML.

12:05 cemerick: dnolen: In any case, you'll need to back out the change to the version number in the POM.

12:06 dnolen: cemerick: ah the new POM doesn't apply?

12:06 hugod: cemerick: can't you just promote the existing staging repo?

12:07 cemerick: dnolen: actually, it may not matter

12:07 hugod: Yes, but then the release point isn't shown in hudson like it is in the histories of all the other projects. :-)

12:07 dnolen: do you want me to release it now, or do you want to wait for a potential hudson login?

12:08 dnolen: cemerick: a release now is ok.

12:10 cemerick: dnolen: Yup, need that version number rolled back to 0.6.1-SNAPSHOT. Sorry.

12:10 dnolen: cemerick: so do I just need to back off the POM change?

12:11 cemerick: dnolen: yes, this one: 1338b70181953ab02da7cced12e1e8b836702d0d

12:11 The later one should be fine.

12:13 hugod: cemerick: can the hudson release plugin not release from a tag?

12:17 cemerick: hugod: not that I'm aware of.

12:20 dnolen: cemerick: ? oh I backed out the POM change, why should I leave SNAPSHOT there?

12:22 cemerick: dnolen: the maven gods apparently demand that releases be cut from a SNAPSHOT

12:22 dnolen: cemerick: ok

12:22 chouser: cemerick: of course no flowchart could be expected to deliver that kind of subtlety, so I suppose as long as it's accompanied by sufficient explanation for each question, it might be very handy.

12:23 cemerick: chouser: sorry, missed your prior msgs. The flowchart has a number of issues, as have been raised here and elsewhere. It's definitely intended to be an accompanyment to other more detailed materials, so maybe that helps with the scope.

12:24 dnolen: cemerick: k, done.

12:27 cemerick: dnolen: done, should be in central in some couple of hours

12:27 hugod: ^^

12:28 dnolen: cemerick: thanks much!

12:28 hugod: cemerick, dnolen thanks

12:28 cemerick: np

12:34 bsteuber: technomancy: thanks, should've tried master before reporting :)

12:34 technomancy: btw swank works for me without updating swank-clojure

12:35 that is, if it wasn't already done by lein deps if you pushed it

12:44 dnolen: BackType gets picked up by Twitter, wonder if that means no opensource Storm.

12:56 bpr: is there a way to type the literal for ,(type (byte-array 0))

12:57 ,(type (byte-array 0))

12:57 clojurebot: [B

12:57 bpr: i would like to be able to check for it in a (case ...) form

12:57 chouser: bpr: excellent question!

12:58 I don't think there's an officially supported way, but I think I may have a solution for you. just a sec.

12:58 hiredman: bpr: class literals don't work well in case

12:58 bpr: cool! ty

12:58 hiredman: yeah, it's a one-off though

12:58 chouser: hiredman: class literals in general have a problem?

12:59 oh. do they not work at all?

13:00 jcromartie: ,(case java.lang.String java.lang.String :foo)

13:00 clojurebot: java.lang.IllegalArgumentException: No matching clause: class java.lang.String

13:01 bpr: hiredman: i guess i could make a multimethod, but i think i'd still be faced with trying to indicate (type (byte-array 0)) somehow

13:01 hiredman: bpr: that is more or less how you do it

13:01 jcromartie: note that docs say "All manner of constant expressions are acceptable in case"

13:01 bpr: ,(case "" java.lang.Sting :foo)

13:01 clojurebot: java.lang.IllegalArgumentException: No matching clause:

13:02 amalloy: jcromartie: and java.lang.String is a constant *symbol*, which is mapped in the current namespace to a class

13:02 bpr: ,(case (type "") java.lang.Sting :foo)

13:02 clojurebot: java.lang.IllegalArgumentException: No matching clause: class java.lang.String

13:02 chouser: bpr: this seems to work: #=(clojure.lang.RT/classForName "[B")

13:02 bpr: chouser: oh nice

13:03 amalloy: chouser: the weird uses for #= never end

13:03 chouser: ,(case (type (byte-array 0)) #=(clojure.lang.RT/classForName "[B") :bytes)

13:03 clojurebot: EvalReader not allowed when *read-eval* is false.

13:03 chouser: heh. right.

13:03 bpr: #= is subject to change without warning, so use at your own risk.

13:04 bpr: ok, thanks for the heads up

13:04 chouser: and you didn't hear it from me. :-)

13:04 amalloy: i saw someone trying to use #= to force an "inner" macro to expand before the macro containing it

13:04 bpr: haha

13:04 hiredman: :(

13:04 chouser: amalloy: wow

13:04 amalloy: (deftype Foo #=(generate-my-deftype-body Foo))

13:04 or something of that sort

13:05 chouser: yikes

13:05 yeah, that's the wrong way to do that.

13:05 amalloy: ingenious but very wrong

13:05 chouser: hm, but does suggest another possible option for bpr's case

13:05 amalloy: i suppose it does

13:06 hiredman: a macro that expands case forms and resolves symbols that map to classes

13:06 amalloy: some kind of case+ macro that checks to see if its clause resolves to a Class, and if so replaces the symbol with the class in its expansion?

13:06 jcromartie: what is #=

13:07 amalloy: $google clojure evalreader

13:07 sexpbot: First out of 44 results is: defrecord improvements - Clojure Design - Clojure Development

13:07 http://clojure02.managed.contegix.com/display/design/defrecord+improvements

13:07 amalloy: hm. no dice

13:07 chouser: hiredman: exactly

13:07 (defmacro mycase [& args] (cons `case (map #(get {:my/bytes (clojure.lang.RT/classForName "[B")} % %) args)))

13:08 (mycase (type (byte-array 0)) :my/bytes :foundbytes)

13:08 bpr: this is a better solution than #=()

13:08 clojurebot: 'Sea, mhuise.

13:08 bpr: chouser: ok

13:10 amalloy: chouser: what's with using clojure.lang.RT there anyway? ##(Class/forName "[B") has got to be more readable

13:10 sexpbot: ⟹ [B

13:11 chouser: amalloy: thats fine too

13:12 bpr: thanks for the tips guys! very helpful

13:32 clizzin: if a java method takes multiple strings with foo(String... strs), how can i apply this method to a seq of strings?

13:33 amalloy: clizzin: you have to pass a String[]

13:33 clizzin: amalloy: great, thanks

13:34 amalloy: anyone know how to get format/printf to use a width not known at compile time, like C's %* specifier?

13:47 chouser: amalloy: docs are here: http://download.oracle.com/javase/1,5.0/docs/api/java/util/Formatter.html#syntax

13:48 amalloy: chouser: yeah, i read em. can't find it, but am not willing to conclude it doesn't exist

13:48 chouser: heh

13:48 well if the docs don't say, I'd look at the source next.

13:48 amalloy: i think it actually doesn't, and the excuse is that it's easier to concatenate string in java than in c

13:48 hiredman: amalloy: you can generate the string used for format at runtime

13:48 chouser: just use format to create the format string.

13:48 amalloy: so that you're supposed to cook up a format string yourself

14:03 rindolf: Hi all. After I've followed http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+Counterclockwise with the latest Eclipse build on Mageia Linux Cauldron the *.clj file does not appear under src.

14:03 Can anyone help?

14:14 technomancy: someone was saying last week they had to get it from upstream instead of using the version that came with their distro

14:23 rindolf: technomancy: I got it from upstream.

14:31 cemerick: hugod, dnolen, chouser: updated flowchart, FWIW http://wp.me/p10OJi-9r

14:33 hiredman: you can also use defprotocol/definterface if you need to add methods

14:35 cemerick: Yeah, we have an example of doing that, too.

14:36 hiredman: deftype needs to support static fields

14:36 chouser: why?

14:36 clojurebot: http://clojure.org/rationale

14:40 hiredman: chouser: fns need static fields

14:40 for constants

14:41 cemerick: hiredman: ^:const is coming

14:41 hiredman: that is not the same

14:41 cemerick: (maybe it's already here, living among us)

14:41 hiredman: :const doesn't replace static field support in deftype

14:42 cemerick: not fully, no, but it will for many uses

14:42 hiredman: not really

14:42 static fields in fns are used to store things like the vars reference by the fn, etc

14:42 cemerick: IIUC, it will for any atomic Clojure value

14:43 hiredman: no

14:45 amalloy: hiredman: do you object to making clojurebot forget "why"? it generates more noise than useful contributions

14:45 cemerick: I feel enlightened already.

14:47 hiredman: amalloy: I will try and figure out how to do that

14:48 cemerick: I am not overly familiar with ^:const but I am pretty sure it just copies the value as a constant where it is referenced

14:49 the clojure compiler turns constant references (not just ^:const, but things like 1 or :foo) into static fields

14:50 so if you were say, writing a clojure compiler that wanted to avoid dealing with fns altogether and just translated everything into deftypes, deftype would need to support static fields

16:28 pcavs: Is there a function that takes two ints representing [rows cols] and returns a vector of row number of vectors of column number of elements?

16:30 amalloy: &((fn [r c] (vec (repeat r (vec (repeat c nil))))) 3 3)

16:30 sexpbot: ⟹ [[nil nil nil] [nil nil nil] [nil nil nil]]

16:31 pcavs: thanks

16:44 cmbntr_: hi all

16:46 ring/jetty specific question: is it safe to fire up multiple jetty servers (on differnt ports) within a single jvm via ring.adapter.jetty/run-server ?

16:54 dnolen: cmbntr_: should be fine far as I know.

16:54 jonabbey: &((fn [r c] (repeat r (repeat c nil))) 2 3)

16:54 sexpbot: ⟹ ((nil nil nil) (nil nil nil))

16:55 jonabbey: neat, sexpbot

16:55 cmbntr_: dnolen: jep, I checked over at the #jetty channel. jmcconnell confirmed

16:56 safes some major request rewriting...

17:14 ninjudd_: am i just overreacting, or is this ridiculous? https://github.com/clojure/java.classpath/pull/2

17:16 technomancy: =(

17:20 dnolen: ninjudd: Clojure won't take any pull requests, but from what I understand contrib devs can push to any (contrib?) repo. Of course it would be rude to push to a repo w/o first asking the author.

17:22 amalloy: that's...that's a lot of aleph

17:22 dnolen: ninjudd: but yeah, creating a JIRA ticket just to remove *warn-on-reflection* seems like a lot of overhead. I would just tell stuartsierra directly.

17:22 technomancy: the fsf is famous for being paranoid about copyright assignment, but even they don't make a fuss about patches under 20 loc

17:22 claiming you assign copyright on that patch to anyone would be disingenuous though, since you don't have copyright on it in the first place.

17:23 amalloy: technomancy: i thought ahead and took out a copyright on the empty string

17:24 * technomancy fills out a royalty check

17:24 amalloy: go ahead and write out an infinite number of them. pretty sure you used a lot of empty strings in that last message

17:25 technomancy: do you take bitcoins?

17:25 amalloy: haha

17:56 Raynes: ninjudd: It's fairly ridiculous, but whatchagonnado.

17:58 ninjudd: i think i may refuse to create a JIRA ticket in protest

17:58 * jao would do the same

17:59 ninjudd: oh. not necessary. abedra decided to just commit the fix

18:04 Raynes: ninjudd: Yeah, I saw that. Nobody can resist the ninja.

18:17 Crowb4r: So who else is excited for Clojure on Heroku?

18:18 technomancy: yesssss

18:18 I am

18:22 ibdknox: The only problem is the cost

18:22 compared to EC2 it's quite expensive

18:22 hard to beat the workflow though :)

18:24 Ramblurr: anyone familiar with sandbar and its auth functions?

18:25 i have a question about the "authentication function"

18:33 livingston: some of my collaborators bumped a project to 1.3 .. now I'm really missing what was clojure.contrib.repl-utils/show where is that now?

18:35 cemerick: ibdknox: lein-beanstalk is pretty slick, too FWIW https://github.com/weavejester/lein-beanstalk

18:36 ibdknox: cemerick: yeah it is :D I updated noir to make it easy to work with that too now.

18:36 cemerick: My only complaint is that the beanstalk-specific functionality is all tied up with lein instead of being broken up into its own lib

18:37 ibdknox: is there something else you want to use it for?

18:37 or rather, something else you want to use it with

18:37 cemerick: maven builds

18:37 I've got my own beanstalk lib, but it's not as complete as what lein-beanstalk has in it

18:38 I'm debating whether to just rip out the lein bits or finish my own

18:39 ibdknox: you should talk to James

18:39 see his thoughts on it

18:39 hiredman: cemerick: perhaps the project object model will help?

18:41 ibdknox: the beanstalk part itself is fairly simple

18:41 it seems like the war exporting is where all the work would be

18:51 livingston: is there any future intent to keep the clojure contrib sub projects version-locked with clojure core?

18:51 upon upgrading it's kinda a pain to hunt through the contrib libs to find the current version (whereas previously it was in synch with core)

18:52 lucian: last time i checked, clojure bootstrap time was prohibitive on android. has that changed recently?

18:57 technomancy: lucian: I don't think so

18:57 lucian: ah, found http://dev.clojure.org/display/design/Android+Support. it seems the most up to date

18:57 technomancy: thanks

19:00 babilen: technomancy: Hei. I've tested clucy 0.2.2 and that worked fine so far. I'll probably get the rest done tomorrow. PM ok (re: maintainership, clojure group, leiningen)

19:01 technomancy: babilen: sweet; thanks!

19:02 gfrlog: hmmm...is clojure yelling at me because I want a 0-arg function in my protocol?

19:02 do protocol method signatures include this?

19:04 amalloy: gfrlog: yes

19:04 anaphora are unhip

19:04 gfrlog: anaphora am unhip.

19:05 jsnikeris: How would you remove a given prefix from a string?

19:05 amalloy: &(doc clojure.string/replace)

19:05 sexpbot: ⟹ "([s match replacement]); Replaces all instance of match with replacement in s. match/replacement can be: string / string char / char pattern / (string or function of match). See also replace-first."

19:06 amalloy: &(clojure.string/replace "the-test" #"^the-" "")

19:06 sexpbot: ⟹ "test"

19:06 gfrlog: jsnikeris: if the prefix is fixed, you can just take a substring based on its length

19:06 scottj: has the speculation on topic of next nyc clojure meeting already happened? consensus?

19:06 jsnikeris: the prefix is a parameter

19:06 amalloy: gfrlog: if the prefix is fixed *and* is known to be present in each string

19:06 gfrlog: (that also assumes you don't need to test that it's there)

19:07 amalloy: scottj: i speculate he'll announce oracle has purchased clojure

19:07 jsnikeris: is there a way to take a string and escape any regex-special characters?

19:07 amalloy: $google java util regex pattern quote

19:07 gfrlog: I knew that's where we were going next :)

19:07 sexpbot: First out of 2990 results is: Pattern (Java Platform SE 6)

19:07 http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

19:08 amalloy: jsnikeris: note i'm using regexes here just because it's easy to think of; it's probably not the cleanest solution

19:08 http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#quote(java.lang.String) is the specific link

19:08 gfrlog: you could test the length-based-substring for equality...

19:08 jsnikeris: amalloy: yah, that's what I reached for right away too

19:09 but as gfrlog is saying, maybe it's better to just check if the string starts with the given prefix, and if it does, remove that many characters

19:09 gfrlog: (defn make-remover [prefix] (fn [s] (if (= prefix (.substring s 0 (count prefix))) (.substring s (count prefix)) s)))

19:09 ^ untested

19:10 jsnikeris: gfrlog: I think I'll go with something like that. Thanks for the tips

19:10 gfrlog: no probalo

19:12 I think the only thing wrong with that version is it fails for strings shorter than the prefix

19:12 er, crashes

19:13 amalloy: just mention in the docs that the behavior is undefined in all cases

19:13 gfrlog: :)

19:13 amalloy: any apparent consistency is coincidence

19:13 gfrlog: (defn make-remover [prefix] {:pre false} ...)

19:13 ibdknox: lol

19:14 amalloy: nice

19:14 ibdknox: I'm going to add that to all my functions now ;)

19:14 wilfredh: hi all

19:14 gfrlog: hi wilfredh

19:14 amalloy: gfrlog: i think the syntax is wrong though

19:14 gfrlog: amalloy: whycome?

19:14 wilfredh: I've just set up a test project (complete newbie) -- why doesn't this test fail?

19:14 (deftest test-my-add (is 3 (+ 1 1)))

19:14 terom: ,(.startsWith "prefixed-string" "prefix")

19:14 clojurebot: true

19:14 amalloy: don't you need :pre to map to a seq of tests, not just a single test-expr?

19:15 ibdknox: (is (= 3 (+ 1 1))

19:15 gfrlog: ,(let [f (fn make-remover [prefix] {:pre false} :whut)] (f "okay"))

19:15 amalloy: wilfredh: =

19:15 clojurebot: :whut

19:15 ibdknox: you're not testing for equality

19:15 is simply asserts that the value is true

19:15 gfrlog: ah probably

19:15 ,(let [f (fn make-remover [prefix] {:pre [false]} :whut)] (f "okay"))

19:15 clojurebot: java.lang.AssertionError: Assert failed: false

19:15 gfrlog: amalloy: good catch

19:15 ibdknox: go back and fix the functions you've already changed

19:15 clojurebot: anonymous functions are functions with no names

19:15 wilfredh: argh, much clearer :) thanks

19:16 ibdknox: gfrlog: damn. More work :p

19:16 gfrlog: this is open source. correctness is not guaranteed.

19:16 ibdknox: haha

19:16 amalloy: clojurebot: thanks for the tip, bro

19:16 clojurebot: bartj: it's not broken. Unless you know the performance hit there is actually a problem, I'd recommend leaving it alone.

19:17 gfrlog: I feel like there's a good joke to be made for naming a function that has {:pre [false]}

19:19 ibdknox: perhaps we need a lib for testing coincidental correctness.

19:19 gfrlog: replace is with might-be?

19:19 ibdknox: yes

19:19 or is-possibly?

19:20 gfrlog: and how could such a test fail?

19:20 amalloy: ibdknox: i like the coincidental correctness of sexpbot (sometimes) returning clojure.core/rand-nth for $findfn [1 2] 1

19:20 gfrlog: haha

19:20 ibdknox: lol

19:20 gfrlog: $findfn [1 2] 1

19:20 sexpbot: [clojure.core/first]

19:20 ibdknox: gfrlog: it can't? that's the value in it.

19:21 gfrlog: all of the coverage and none of the failures

19:21 $findfn [1 2] 1

19:21 sexpbot: [clojure.core/first clojure.core/rand-nth]

19:21 ibdknox: exactly. That's infinitely better than normal unit tests ;)

19:21 amalloy: ibdknox: of course it could. just call the function with all possible states of the universe, and see if any of them return the expected values

19:21 ibdknox: lol

19:22 gfrlog: if they're all expected, does it still pass?

19:23 ibdknox: that is the CCC (Clojure Coincidental Correctness) paradox

19:28 completely unrelated

19:28 I wrote a clojure starter pack for the google ai challenge

19:28 if anyone is interested

19:40 scottj: ibdknox: url for new contest? http://ai-contest.com/ doesn't appear to have been updated

19:41 ibdknox: scottj: the beta site is here: http://aichallengebeta.hypertriangle.com/index.php

19:41 the contest has not officially begun yet

19:41 and you won't be able to use my starter bot on the comp website until they merge my change to fix the clojure support

19:41 scottj: the last one was pretty cool for spectators

19:41 ibdknox: you can, however, play locally :D

19:42 bot is here: https://github.com/ibdknox/aichallenge/tree/epsilon/ants/dist/starter_bots/clojure

19:43 carlo_au: What's the easiest way to call Python from Clojure? I'd like to use Python's load to un-pickle some vectors of floats and then work with them in Clojure.

19:44 hiredman: :|

19:45 cemerick: ibdknox: yeah, beanstalk isn't complex at all, it's just too bad the impl isn't reusable.

19:45 ibdknox: war exporting?

19:45 ibdknox: yeah

19:46 cemerick: if you look at the implementation of lein-beanstalk, it relies on lein-ring to do most of the heavy lifting, namely generating a war that will work on EB

19:47 cemerick: heh

19:47 ibdknox: which isn't a pretty problem to solve:

19:47 https://github.com/weavejester/lein-ring/blob/master/src/leiningen/ring/war.clj

19:47 cemerick: build war files just can't be considered 'heavy lifting' :-)

19:47 ibdknox: haha

19:47 well none of this is too bad :-p

19:48 but relatively speaking, it does all the real work :)

19:48 cemerick: ibdknox: that looks complicated because of the bizarre web.xml transliteration support that's going on

19:48 ibdknox: yup

19:48 as well as the default servlet stuff

19:49 which if you knew much about Java web servlets problem isn't that complicated, but I try to keep away from that nonsense as much as possible ;)

19:49 haha

19:50 cemerick: Lots of good stuff in that nonsense

19:50 ibdknox: carlo_au: do you need to be able to do this at runtime?

19:51 why not just write a python script that exports the data you need in a manageable format

19:51 json or something

19:51 and then read that from clojure

19:51 carlo_au: ibdknox: no, I just need to call a few functions

19:51 I also want to call some numpy and scipy code for curve fitting

19:52 ibdknox: I would do this all before it ever touched clojure

19:53 cemerick: such as?

19:54 carlo_au: I would too, but there's an existing code-base that I want to make use of.

19:55 cemerick: ibdknox: default servlets for serving static assets, filters, declarative servlet configuration, container-managed session mgmt, etc…

19:57 ibdknox: cemerick: yeah, the foundation for serving content. I didn't mean to belittle their importance, just their level of abstraction. In most cases, I don't think you need to work that low in the stack.

19:57 and as somewhat of a testament to that, I've managed to avoid learning about them for now

19:57 good bad or indifferent

19:58 cemerick: ibdknox: I don't think you grokked what I just described

19:58 ibdknox: I see, what'd I miss?

19:58 cemerick: e.g. ring standard practice seems to be to manually set up handlers for serving static assets

19:59 I'd call that working "low in the stack"

19:59 ibdknox: to be fair, I think Ring *is* low in the stack :)

19:59 I get what you're saying though

20:00 there's a wealth of stuff already written for you there

20:01 I'll look more into that, see if there's anything I can steal :D

20:02 terom: carlo_au: maybe you could use Jython

20:03 gfrlog: ah ha.

20:04 I cannot use (size) as a method name on a protocol :(

20:04 ibdknox: really?

20:04 amalloy: gfrlog: bet you a dollar

20:04 you can't use it in a defrecord, though

20:04 gfrlog: yeah that's what I was inaccurately actually saying

20:04 ibdknox: lol

20:05 carlo_au: terom: I just looked at that, and apparently numpy doesn't work in jython, so I'm stuck. Ah well.

20:05 gfrlog: it's funny because I had just verified that distinction experimentally before reporting it, and still said it wrong

20:05 %s/size/cardinality/g

20:05 amalloy: gfrlog: just name it size-me-up

20:06 gfrlog: ha

20:06 ibdknox: haha

20:06 sounds good to me

20:33 seancorfield: if i use defmulti in the REPL and then decide to define it differently, should i need to do something specific to make the REPL 'forget' the previous definition?

20:33 i defined it one way, realized it wouldn't work so i defined it another way, but the repl behaved as if the original version was still in effect...

20:34 technomancy: seancorfield: new "feature" in clojure 1.2 unfortunately

20:34 hiredman: yes, defmulti behaves like defonce (ugh)

20:34 (ns-unmap *ns* 'name) should clear it out

20:34 seancorfield: ouch... ok, at least i'm not going crazy

20:35 ns-unalias?

20:35 hiredman: ns-unmap

20:35 technomancy: during development I'll just put (def mymulti nil) before my defmulti call

20:35 so recompiling works

20:36 seancorfield: ah, nice trick!

20:37 with defmethod, if you dispatch on two values, is there a way to say "don't care" about just one of them? i couldn't find any examples

20:39 i guess i just need to make my dispatch function smarter...

20:39 first time i've tried to use multi methods

20:40 gfrlog: seancorfield: I had that exact problem like a year or two ago when first learning clojure, and ended up writing two multimethods instead. I still don't know of a better way.

20:40 maybe because I almost never use multimethods.

21:03 bpr: technomancy: nice idea about (defvar mymulti nil)

21:03 technomancy: would be nicer still if it weren't needed

21:03 bpr: yeah, totally agreed

21:08 gfrlog: I think I'm about to write an algorithm with three nested (loop)s :/

21:11 amalloy: gfrlog: when i wrote a function with three (for)s and three (apply concat)s, i knew it was time to seek help

21:11 gfrlog: amalloy: is that the story of how mapcat was originally written?

21:11 * amalloy grumbles about (for) not having a concat option

21:11 gfrlog: ,:-D

21:11 clojurebot: :-D

21:12 brehaut: gfrlog: mapcat and for are isomorphic

21:13 * gfrlog stares and thinks

21:13 gfrlog: I'm not seeing it

21:13 brehaut: gfrlog: for is seq comprehensions which are sequence (list) monads with clean notation

21:13 in the list monad mapcat is bind

21:14 derp__: um, how does one go through a map blindly? like if you don't know the names of the items

21:14 is there a way to generate a list of keys?

21:14 gfrlog: derp__: keys

21:14 derp__: gfrlog: thanks!

21:14 gfrlog: I love questions that are hard to ask without including the answer in the question.

21:14 clojurebot: the answer is 42

21:15 gfrlog: brehaut: I don't know that I'm going to understand the monad formulation.

21:15 brehaut: gfrlog: im writing the equivalent forms

21:15 give me a moment

21:15 gfrlog: :)

21:17 amalloy: derp__: you usually want to just seq the map rather than using keys and then looking them each up

21:18 &(for [[k v] {1 3 8 2}] (* k v))

21:18 sexpbot: ⟹ (3 16)

21:18 brehaut: gfrlog: ##(= (mapcat (fn [a] (mapcat (fn [b] [[a b]]) [:a :b :c])) [1 2 3]) (for [a [1 2 3] b [:a :b :c]] [a b]))

21:18 sexpbot: ⟹ true

21:18 brehaut: (the monad form is roughly (bind [1 2 3] (fn [a] (bind [:a :b :c] (fn [b] [[a b]])))) because bind and mapcat have their arguments in a flipped in clj)

21:20 gfrlog: brehaut: I take from that expression that a simple for is easily transformed into nested mapcats

21:20 brehaut: correct

21:20 :when and :let are also relatively trivial

21:21 gfrlog: The part I was thinking about was going the other way, so let's do this example:

21:21 ,(mapcat range (range 4))

21:21 clojurebot: (0 0 1 0 1 2)

21:21 gfrlog: ,(for [a (range 4) b (range a)] b)

21:21 clojurebot: (0 0 1 0 1 2)

21:21 gfrlog: I guess that's how to do it, huh?

21:21 brehaut: yeah

21:22 gfrlog: I have learned some. Thanks.

21:22 brehaut: no problem

21:22 and now, back to work

21:22 gfrlog: :)

21:22 $findfn 7 3 [2 1]

21:22 sexpbot: []

21:23 gfrlog: $findfn 7 3 [1 2]

21:23 sexpbot: []

21:23 hiredman: I've often wished for had a flag or something to apply concat to the result like mapcat does, you can kind of fake it, but meh

21:23 amalloy: Everyone, stand back! I know how to use monads! ;; brehaut darting in and out

21:24 gfrlog: what he said ended up making sense I think, but I still don't know anything further about monads

21:24 amalloy: gfrlog: try (juxt quot rem)

21:24 gfrlog: amalloy: that's exactly what I want, but performant

21:24 amalloy: the jvm doesn't have it

21:24 gfrlog: amalloy: I'll probably end up using the bigint version; I'm using bigints anyhow.

21:24 amalloy: mostly because java doesn't make it easy to deal with multiple return values, i suspect

21:25 gfrlog: that is interesting to know that the jvm doesn't do it for primitives though. Do you know if typical CPUs support it?

21:25 amalloy: yes

21:26 most CPUs are register architectures, where it's easy to say "the results of the division will be put into registers foo and bar"

21:26 the jvm uses a stack instruction set, which makes that more awkward (though presumably not impossible)

21:26 gfrlog: ,(let [[a b] (seq (.divideAndRemainder (bigint 7) (bigint 3)))] [a b])

21:26 clojurebot: [2 1]

21:27 gfrlog: certainly not if you don't mind 2-element arrays

21:27 hiredman: (x86 barely has enough registers to count as being a register machine)

21:28 amalloy: it just means instructions can result in more than one value being pushed to the stack

21:28 I think john rose has a blog post

21:28 amalloy: gfrlog: making an asm instruction return a freshly-allocated array? the performance nuts will want to make you pass in an array to be filled with the result of the division

21:28 hiredman: http://blogs.oracle.com/jrose/entry/tuples_in_the_vm

21:29 gfrlog: amalloy: so do it both ways

21:30 amalloy: hiredman: do you happen to know how many bytes each opcode is?

21:31 oh, neat blog. thanks for the ink

21:31 *link

21:32 hiredman: amalloy: 1

21:32 blegh

21:32 amalloy: gfrlog: if the opcode is only a single byte, adding two new opcodes is probably pretty expensive

21:32 hiredman: well, 1 + some that take arguments

21:32 gfrlog: amalloy: well if we each chip in a dollar...

21:33 amalloy: $google jvm instruction set

21:33 sexpbot: First out of 28400 results is: VM Spec The Java Virtual Machine Instruction Set

21:33 http://java.sun.com/docs/books/jvms/second_edition/html/Instructions.doc.html

21:33 hiredman: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

21:34 if only rose was given a free hand

21:40 value types are way cool, but I still want tail calls

21:45 jonabbey: how much benefit will there be with java 7's dynamic calls?

21:46 InvokeDynamic, that is

21:46 dnolen: jonabbey: what kind of benefit are you asking about?

21:46 jonabbey: that's.. a good question. ;-) i was wondering if clojure would see any benefit from it, but i don't actually know enough to know what dimensions it might improve upon

21:47 i've been reading a couple of the clojure books, but i haven't gotten my toes wet with it yet

21:47 i'm just sick of java the language

21:47 and it's lack of higher order functions, closures, etc.

21:48 so, asking out of ignorance

21:48 hiredman: I don't think invokedynamic brings that much for clojure

21:48 jonabbey: that's too bad

21:48 although i understand clojure was designed for the jvm to begin with

21:48 hiredman: possibly it could be used to boost performance of non-inlined protocols

21:48 jonabbey: right

21:49 dnolen: jonabbey: without invokeDynamic won't bring the dramatic perf benefits that the other dyn langs on the JVM are seeing because Clojure is already ridiculously fast for a dynamic language on the JVM.

21:50 seancorfield: defmethod doesn't accept a docstring??

21:50 hiredman: seancorfield: how would that work?

21:50 gfrlog: seancorfield: the multimethod is one function to the caller, so it gets one docstring

21:50 seancorfield: yeah, so i see having read thru the source code

21:51 i'm just a bit surprised that it doesn't have a way to automatically accumulate the dispatch values and some associated docstring / metadata

21:52 so that means if you add a method later, you have to go to the original defmulti to update the docstring :(

21:52 pcavs: ,(meta (def ^{:key "val"} x 10))

21:52 clojurebot: DENIED

21:53 pcavs: why doesn't that work?

21:53 besides the fact it won't let me def things

21:53 gfrlog: #^{:key "val"} is the syntax I think

21:53 dnolen: pcavs: you're putting metadata onto the symbol, but def returns the var.

21:54 pcavs: oh

21:54 so how do I throw the metadata onto the var?

21:55 dnolen: well (meta 'x) doesn't work either .... O.o

21:55 oops, nevermind, (meta #'x) works

21:57 jonabbey: ,(meta #'x)

21:57 clojurebot: java.lang.Exception: Unable to resolve var: x in this context

21:57 dnolen: pcavs: actually, I'm totally wrong, your code works for me just fine on 1.2.0 and 1.3.0

21:57 jonabbey: how does clojurebot differ from sexpbot?

21:57 gfrlog: well.

21:59 dnolen: hiredman: is there anything specific reason you really want tail calls? just cleaner code?

21:59 gfrlog: clojurebot evaluates expressions prefixed by a comma, and sexpbot evaluates expressions prefixed by an ampersand. Sexpbot can also evaluate expressions inline when prefixed by two pound-signs. Both bots have lots of other auxiliary features, and hiredman has sexpbot on ignore.

21:59 hiredman: dnolen: I won't have to use trampoline and letfn

21:59 dnolen: I'd check again with regards to (meta #'x) on 1.2

22:00 jonabbey: or loop/recur?

22:00 amalloy: seancorfield: if your multimethod needs a different docstring for each dispatch value, it's not providing a very good abstraction, it seems to me

22:00 hiredman: jonabbey: doesn't work for functions that call each other

22:01 gfrlog: (inc amalloy)

22:01 sexpbot: ⟹ 13

22:01 dnolen: hiredman: yeah, seems like the likelihood of it happening it soon is low these days ...

22:01 * gfrlog simultaneously expresses an opinion and demonstrates a feature

22:02 jonabbey: nice

22:02 (inc amalloy)

22:02 sexpbot: ⟹ 14

22:02 jonabbey: hm, no ampersand or double pound sign required?

22:02 amalloy: jonabbey: it's not a clojure expression

22:02 just a command that looks a lot like one

22:03 jonabbey: ah

22:03 gfrlog: &(inc amalloy)

22:03 sexpbot: java.lang.Exception: Unable to resolve symbol: amalloy in this context

22:03 seancorfield: amalloy: well, it was more having the documentation "near" the code it was documenting...

22:03 jonabbey: (help)

22:03 * jonabbey shrugs

22:03 hiredman: clojurebot's help covers more topics

22:03 jonabbey: thanks

22:03 hiredman: help?

22:03 clojurebot: http://www.khanacademy.org/

22:03 gfrlog: jonabbey: I don't think either bot would respond to something as general as an s-expression, except in the special case of inc/dec

22:03 amalloy: haha

22:04 jonabbey: i assume clojurebot and sexpbot know enough to ignore each other's output?

22:04 seancorfield: i'm processing PowerMTA accounting files and generating email bounce events (validation and update events come in from elsewhere) so i'm dispatching on the event and, in the case of bounces, the current email status

22:04 amalloy: &(inc 1)

22:04 sexpbot: ⟹ 2

22:04 clojurebot: ⟹ "Returns the metadata of obj, returns nil if there is no metadata."

22:04 gfrlog: &(println ",(println \"Hey sexpbot\")")

22:04 sexpbot: ⟹ ,(println "Hey sexpbot") nil

22:04 seancorfield: so the multimethod gives me a nice clean state machine

22:04 gfrlog: wait dangit I did it in the wrong direction :(

22:04 seancorfield: event and email status record in; updated email status record out (which i then save back to the DB)

22:04 amalloy: jonabbey: sexpbot prefixes his output with ⟹ to avoid confusion

22:05 jonabbey: smart

22:05 gfrlog: jonabbey: so if you did what I just did the other way round, sexpbot would respond

22:05 unless they've updated that

22:05 jonabbey: ,(println "&(println \"Hey clojurebot\")")

22:05 clojurebot: &(println "Hey clojurebot")

22:05 sexpbot: ⟹ Hey clojurebot nil

22:05 jonabbey: heh

22:06 so nice to be playing with a lisp again

22:07 seancorfield: it's actually kinda nice that i can dispatch off just the event for some events and the event + status for others...

22:09 also kind of amazing that the entire code - including copious docstrings and comments - is still only 139 lines of clojure... and it processes a 450,000 line CSV file to extract 46,000 bounced email events, logs them all and updates the email status in the DB... all in less than 90 seconds!

22:10 i already loved clojure... but now i *really* love it :)

22:11 amalloy: hugod: you around? i've gotten far enough that M-x slime-connect knows about ritz, but it displays "Symbol's value as variable is void: slime-ritz"

22:14 dnolen: seancorfield: nice.

22:17 amalloy: and lein ritz still depends on my having the sun/oracle jvm rather than openjdk. i can switch, but it seems wrong

22:18 cemerick: seancorfield: I figured you on the fence. ;-)

22:20 hodapp: help... can't... stand... the... C++... any longer...

22:21 seancorfield: cemerick: heh, after all the languages i've used over the years (and that's a LOT), i think i'm happier using clojure than anything else

22:21 cemerick: likewise :-)

22:22 hodapp: having been exposed to Lisp at an early age, I now run into Greenspun's Tenth Rule all the time.

22:24 seancorfield: my first reaction to that was "nonsense!" but then i thought about some of the more complex pieces of software i've written... :|

22:27 and back in the mid-80's i wrote a lispkit interpreter (peter henderson et al) to use as the basis of some research into language expressiveness (and garbage collection) - the latter actually being more interesting to me then, but the former was more interesting to my professor at the time...

22:37 pcavs: is there a clojure function to return integer division, that rounds down?

22:43 amalloy: $findfn 11 5 2

22:43 sexpbot: [clojure.core/quot clojure.core/unchecked-divide]

22:43 amalloy: pcavs: ^

22:44 pcavs: yeah, stackoverflowed it, thanks tho!

22:45 amalloy: pcavs: the point is more that you can try $findfn in future. sometimes there's an answer you wouldn't have guessed

22:46 pcavs: how does it do that anyways? is very cool

22:46 thanks btw

22:46 $findfn 11 5 11/5

22:46 sexpbot: [clojure.core//]

22:47 amalloy: pcavs: it just tries a bunch of functions

22:47 cemerick: &*clojure-version*

22:47 sexpbot: ⟹ {:major 1, :minor 2, :incremental 0, :qualifier ""}

22:48 cemerick: boy, the bots need an upgrade

22:48 amalloy: cemerick: 1.2.1, maybe. 1.3 is just no fun to upgrade to

22:48 cemerick: unchecked-divide doesn't exist in 1.3 :-)

22:48 amalloy: problem areas?

22:48 amalloy: missing pieces in contrib, mostly

22:49 cemerick: you mean bits from old contrib, right?

22:49 amalloy: yes

22:49 cemerick: They're just waiting for someone to give them a nice home.

22:50 hodapp: blargh, Eclipse is complaining about build path

22:51 what editors do you guys recommend for OS X?

22:51 amalloy: cemerick: if only it were so easy. i updated the prxml code for 1.3, but clojure's CA and JIRA and stuff make it just too hard to figure out how to *do* anything

22:51 cemerick: one of the least accounted-for side effects of old-contrib's packaging is that people didn't balance library usage against the dependency

22:51 hodapp: Eclipse + ccw here. What problems are you having?

22:52 amalloy: I know, it's a dead-zone over there in new contrib. 0_o

22:52 The old contrib stuff can just be spun out into a regular old library. It's EPL, have fun.

22:52 hodapp: cemerick: One error is "The project cannot be built until build path errors are resolved"

22:52 other is "Unbound classpath container: 'Default System Library' in project 'firstClojureProject'"

22:53 was following along in the "Getting Started" guide but I don't see "Clojure REPL" in the "Run as" menu either

22:53 cemerick: hodapp: what version of eclipse?

22:53 hodapp: Indigo

22:54 cemerick: that's the newest, right?

22:54 hodapp: I believe so

22:54 * cemerick hopes there aren't ccw incompatibilities there

22:55 cemerick: hodapp: That second error does not sound friendly at all. If you open up the project's build path, what do you see under the "libraries" tab?

22:56 hodapp: Well, I see "Default System Library (unbound)"

22:57 cemerick: That (unbound) bit is bad. It sounds like Eclipse isn't finding your JDK's installation.

22:57 hodapp: Hrmmm.

22:58 cemerick: Look under Eclipse's main prefs, in Java > Installed JRE's

22:58 amalloy: cemerick: can you tell me how i would go about moving prxml to new-contrib? i'm happy to do the drudge-work for several contrib libraries but don't know the mechanics

22:59 hodapp: huh, "The selected JRE does not support the current compiler compliance level of 1.4"

23:00 and it lists none

23:01 cemerick: hodapp: you're seeing that in the prefs panel?

23:01 hodapp: Yeah

23:02 This is such a not-a-Clojure-issue, I shouldn't be here...

23:02 cemerick: hodapp: that should all Just Work

23:04 amalloy: The first thing to do would be to start a thread on clojure-dev suggesting a transition of prxml to new contrib and volunteering to maintain it.

23:04 sritchie: amalloy, quick cake question -- I've just pulled from the github repository, and now running "cake" gives me "Unable to resolve symbol: make in this context"

23:05 I see that make comes from uncle, but I'm not sure how to get the git version of cake to pull this dependency and rely on it when using the command line tool

23:05 amalloy: sritchie: i'm not sure about that but i saw it too. i think one of cake's dependencies broke, resulting in cake master breaking

23:05 or. not "broke", but "changed in an incompatible way"

23:05 dnolen: hodapp: you might wanna try NetBeans 7.0 and Enclojure for the least hassle setup on OS X, IMO.

23:06 amalloy: i'm on develop, which works but has some extraneous warning messages at the moment

23:06 hodapp: dnolen: noted.

23:06 amalloy: maybe ninjudd can fix the uncle thing?

23:06 hodapp: I'm not a big fan of Eclipse when things don't Just Work(tm)

23:06 sritchie: I bet adding uncle to my project.clj would work for now (not long-term, of course)

23:06 I'll try develop

23:07 cemerick: Enclojure is wanting for maintenance these days. Just FYI.

23:07 hodapp: Hrm.

23:07 dnolen: hodapp: I've tried pretty much everything, and pretty much everything has it's quirks.

23:07 cemerick: it works for me, something not work for you?

23:07 cemerick: dnolen: It has some issues on various NB versions, and Eric is tapped out.

23:08 There's some great stuff in enclojure, but no one's stepped up to give it the TLC is needs over the long haul.

23:08 dnolen: cemerick: it works on NB 7 well enough to get started. All the Clojure IDE plugins have maintenance issues from what I've seen.

23:09 Emacs being the stark exception.

23:09 hodapp: What's the deal with Emacs?

23:09 cemerick: wha?

23:10 technomancy: dnolen: if you think Emacs doesn't have maintenance issues you probably overestimate my understanding of swank. =)

23:10 cemerick: Emacs breaks every time the SLIME devs cough AFAICT.

23:10 sritchie: amalloy, yeah, I'm getting Caused by: java.lang.IllegalAccessError: reload! does not exist on develop

23:10 cemerick: (despite the deft stylings of technomancy, hugod, et al.)

23:10 amalloy: sritchie: that's a weird one

23:10 dnolen: cemerick: well that shows how much you follow Emacs dev :) we don't track SLIME

23:10 technomancy: well, these days it's frozen so it's only broken for people who want to use CL...

23:10 and they totally deserve it =P

23:10 hodapp: o_O

23:10 sritchie: at bake.reload$reload_project_files.invoke(reload.clj:47)

23:11 amalloy: sritchie: cake deps -S maybe?

23:11 cemerick: ah, see, I just get a gestalt from how many people come in with emacs/slime issues :-D

23:11 dnolen: hodapp: anyways, Enclojure works as a starting environment. Eventually you'll want something else, but you can edit code and the REPL works just fine.

23:11 amalloy: will fetch the dependencies using the stable version of cake

23:11 technomancy: cemerick: it's because only the CL users complain

23:11 these days anyway; things were certainly a lot worse ~6 months ago

23:11 * cemerick *nods*

23:11 hodapp: dnolen: I'll give it a try, despite what I've heard about Netbeans.

23:11 dnolen: hodapp: JEdit works ok as well.

23:11 technomancy: or people who found outdated docs

23:12 hodapp: dnolen: REPL?

23:12 or just editor?

23:12 cemerick: See, hardly anyone comes in complaining about eclipse/ccw…

23:12 sritchie: amalloy: cool, that worked

23:12 * cemerick waits for it…

23:12 technomancy: but the swank internals are still mostlty just a black box to me

23:12 dnolen: it has integrated editing and REPL.

23:12 cemerick: I haven't seen anything in it that's any more compelling than Netbeans + Enclojure.

23:13 hodapp: dnolen: Cool, I will give that a try.

23:13 cemerick: dnolen: I was trolling for a "because no one uses eclipse+ccw" response ;-)

23:13 hiredman: that is an excellent point

23:14 cemerick: And, I agree, though I'm partial to ccw's REPL architecture. I left Enclojure because NetBeans started segfaulting on a daily basis.

23:14 dnolen: hodapp: as you can see the tooling story isn't completely solved largely because what tools people want to use is ridiculously varied. So there's not a focused effort on making any one thing really great.

23:14 technomancy: enclojure has a wicked logo

23:15 cemerick: A thickey job, that.

23:15 technomancy: very nice

23:15 hiredman: technomancy: an evil or morally wrong logo?

23:15 dnolen: hodapp: Emacs tools and Lein have the lion-share of commits from outsiders it seems to me.

23:15 cemerick: outsiders?

23:16 hiredman: people who didn't actually start the project?

23:16 dnolen: # people who aren't active maintainers who submit a patch.

23:16 cemerick: hrm, interesting metric

23:17 hiredman: part of that is technomancy will let you commit to lein if you sneeze loudly and he's in the room

23:17 dnolen: hiredman: heh true enuf.

23:17 technomancy: also because I am secretly hoping to pawn off swank maintainership on anyone who displays interest.

23:17 hiredman: "you have a pulse, you should be able to commit bugfixes!"

23:17 cemerick: Doing a `git shortlog -s` on various open source projects is very interesting.

23:18 er, `git shortlog -s | wc`

23:18 the smattering of languages and large libraries I looked at all had < 100 contributors, which I found surprising.

23:18 technomancy: cemerick: what languages?

23:19 hiredman: "Bagu is my name. Show my code to River Man" has 5 commits on lain

23:19 lein

23:19 technomancy: hehe

23:19 huh; factor is as old as the hills and only has 82 contributors

23:19 FSVO hills

23:20 cemerick: yeah, that was one of them

23:20 factor, jruby, clojure, some scheme impl

23:20 technomancy: 104 for jruby; that's surprisingly low.

23:20 pcavs: $findfn 5 6 false

23:20 sexpbot: [clojure.core/== clojure.core/identical? clojure.core/isa? clojure.core/= clojure.core/> clojure.core/>= clojure.core/contains? clojure.core/bit-test]

23:20 pcavs: $findfn 5 5 true

23:20 sexpbot: [clojure.core/== clojure.core/identical? clojure.core/isa? clojure.core/= clojure.core/>= clojure.core/<=]

23:20 cemerick: scala as well

23:20 technomancy: 5 for lisp-flavoured-erlang =)

23:21 cemerick: I was shocked by the size of the scala git repo. Metric tonne of jars in there.

23:22 technomancy: mirah let a couple sneak in too. =(

23:22 cemerick: A couple is one thing.

23:22 Scala has ~30MB for each release AFAICT.

23:22 hiredman: :(

23:23 technomancy: eep

23:24 I remember trying to help some poor hadoop-based project get comfortable with git.

23:24 tried to attach a patch removing all their jars to a jira issue, and jira refused it because it was too big

23:24 that's when I dropped everything and fled in the other direction

23:25 cemerick: I remember it taking me a solid week to scrub all the libraries from my newly-converted svn repos. filter-branch is *not* straightforward to use.

23:26 nathanmarz: man of the hour! Congratulations. :-)

23:26 nathanmarz: cemerick: thanks :)

23:26 gonna be rockin the clojure at twitter

23:27 ibdknox: awesome :)

23:27 cemerick: nathanmarz: so you'll continue to have free rein?

23:27 dnolen: nathanmarz: wow

23:27 cemerick: I was wondering if they'd bring the scala hammer down on you or something.

23:27 technomancy: 'bout time they did something to get their searches working right =)

23:27 nathanmarz: nope, we're pretty much operating the same way

23:28 total autonomy with respect to engineering

23:28 tbatchelli_: woo hoo! Twitter uses clojure!

23:28 * cemerick runs to twitter :-P

23:28 tbatchelli_: nathanmarz: congrats!

23:30 pcavs: nathanmarz: congrats indeed

23:31 nathanmarz: our team is still hiring, just in case you guys were wondering :)

23:32 cemerick: I'm guessing that that's not well-known

23:34 amalloy: cemerick: are you kidding? he just told #clojure - it'll be all over the interwebs by dawn

23:34 ibdknox: nathanmarz: If ReadyForZero hadn't scooped me up, I probably would've been knocking on your door :)

23:34 technomancy: anyone up for some last-minute testing of lein 1.6.1 before I push it out?

23:36 amalloy: nathanmarz: i would've included you guys in my tour of clojure companies a couple months ago if i'd known. certainly would be more convenient to stay in sf

23:37 nathanmarz: amalloy: where'd you end up going?

23:37 amalloy: nathanmarz: geni with ninjudd/lancepantz

23:38 (in LA)

23:39 technomancy: LA felt like a wasteland for hackers when I was there

23:39 I guess there's a Clojure group now?

23:39 I remember driving 40 minutes with a friend to a Ruby meetup in a Starbucks where one other guy showed up.

23:39 amalloy: technomancy: yeah, not as large as the sf group, but not way smaller

23:40 hah, ouch

23:40 it was probably a trap set by some python devs

23:40 nathanmarz: factual (in LA) is using clojure quite a bit now afaik

23:41 amalloy: nathanmarz: yeah, they host the meetup

23:41 technomancy: well you know what they say about LA... "There is no life east of PCH."

23:41 (pacific coast highway)

23:42 amalloy: which reminds me, i need to talk to ninjudd about giving a presentation on deftype on thursday

23:46 pcavs: maybe I should move out to this famed "west coast"

23:46 amalloy: pcavs: there's some good stuff in new york too, isn't there?

23:46 nathanmarz: cemerick: lol on tweeting that out right now

23:46 pcavs: amalloy: sadly I wouldn't know, I'm in Boston

23:47 cemerick: nathanmarz: shoulda been a muckraker :-P

23:47 technomancy: boston has an awesome clojure group!

23:47 pcavs: but yes, I've heard some pretty good things about NYC, although I fear a lot of it is soul-less financial based fast paced arbitrage =\

23:47 techomancy: really? I should go, but there's nothing up on their meetup

23:48 technomancy: pcavs: well, there have only been two meetings, and I ran one of them

23:48 pcavs: haha

23:48 cemerick: We had ~30 people at a Clojure meetup here in sleepy Northampton, MA.

23:48 * cemerick should start a regular one

23:48 technomancy: wow, nice

23:49 amalloy: i wonder if cemerick is in some parallel universe

23:49 technomancy: I think part of the thing that intimidates people from starting groups is the idea that you have to have presentations and speakers. that stuff doesn't scale.

23:49 cemerick: There's actually a pretty strong undercurrent of old lisp hackers + machine learning types around here. UMass, 5 colleges, etc.

23:49 amalloy: ?

23:50 technomancy: that, and people are a little lazy ;-)

23:50 amalloy: it's just impossible that there should be that many clojure hackers in a town described as "sleepy"

23:50 cemerick: amalloy: not Clojure hackers — programmers of all stripes, interested in a modern, accessible Lisp

23:50 technomancy: cemerick: just set aside a monthly hack night for your own purposes, and start inviting people to co-hack =)

23:50 pcavs: cemerick: if you held a meet up even in Northhampton I'd drive out there

23:50 zakwilson: I talked about Clojure to a meeting of a .NET users group.

23:51 cemerick: Though I know of ~6 local devs that have Clojure in production.

23:52 technomancy: Don't worry about me, I've been getting developer groups together for almost 10 years now.

23:52 pcavs: I'd love to host a meet up if I had space and expertise in Clojure besides my dabbling...hmm 0 for 2

23:52 cemerick: We had some heavy hitters coming around when I had office space to hold big talks.

23:52 technomancy: pcavs: we meet in a coffee shop

23:52 happens to be the biggest coffee shop I have ever seen in my life, but it's just a coffee shop. =)

23:53 pcavs: technomancy: Haha, perhaps I will do the same

23:53 cemerick: pcavs: Where are you? If you're in the area, join http://groups.google.com/group/wmassdevs/ and you'll know when stuff is going on

23:53 pcavs: I need to get off of this terrible netbook. Even using it to ssh to my beefy desktop is a little rough. I see a MacBook Pro in my future.

23:54 cemerick: I'm in Boston, but I'm desperate enough to get out there.

23:54 ibdknox: speaking of user groups, anyone going to the bay area clojure meetup thursday?

23:55 cemerick: pcavs: oh, surely there's stuff going on out there. Boston lispers at the very least?

23:55 pcavs: cemerick: I'm probably not just tapped into the community as much as I could be

23:55 tbatchelli_: ibdknok: I am going

23:55 cemerick: pcavs: FWIW, racket con is happening this month — it's free, and I'm sure some Clojure people will be there. http://con.racket-lang.org/

23:55 (e.g. *probably* me)

23:56 pcavs: cemerick: yea I was looking forward to that

23:56 cemerick: They say you don't have to be a schemer to go, but I wonder what they'd do if they were swarmed by Clojure devs.

Logging service provided by n01se.net