#clojure logs

2011-07-05

00:00seancorfieldthe new clojure contrib libs work with 1.2
00:00amalloyseancorfield: i know some of them do, but i'm a little surprised to hear that all of them do
00:01seancorfieldit's a requirement: new contrib must support clojure 1.2
00:01amalloycool
00:01semperosyeah, I had read that some featured compatibility with both, forgotten frankly
00:01seancorfieldi didn't know until i fell foul of it with c.j.j and accidentally made it 1.3 only :(
00:01seancorfieldthat nice mr bedra corrected me :)
00:02glitch83Hey everyone - I've got a quick test I've been trying to perform with clojure - I want to save a lambda for use later
00:02glitch83I 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
00:02sean_corfieldtime to move to the TV room and kick back
00:02glitch83any thoughts?
00:03semperossean_corfield: enjoy, thanks for your feedback
00:03technomancyglitch83: lambdas aren't serializable by default
00:03technomancyyou can cheat with this:
00:03technomancyclojurebot: serializable-fn
00:03clojurebotserializable-fn is a hack for preserving source of a compiled function: https://github.com/technomancy/serializable-fn
00:04technomancythat's somewhat half-baked though
00:04glitch83hm yeah I have thought about the limitations - it's not an easy problem but let me give this a shot
00:06glitch83This looks sufficient enough for some basics - now I'm thinking how to dynamically load clj files - I assume (load-file <filename>) ?
00:07technomancyglitch83: yup
00:07technomancyyou shouldn't use that for your project's source, but for arbitrary files on disk it's fine
00:07glitch83sweet - I think this is enough :-) thanks all!
00:09schnorrerhi, has anyone had troubles with "lein ring server" and Unicode on web pages (lots of "????????")?
00:09schnorrera war generated with "lein ring war" works fine if deployed on a 'standalone' jetty
00:11schnorrerlooks like it has something to do with misconfiguration of the embedded jetty, but I have no idea how to fix it
00:12tomojthe charset is UTF-8 in both cases?
00:12tomojbut one has garbage that's not actually utf-8?
00:12schnorrerwell, the data pulled from DB are definitely utf-8
00:12tomojI mean in the http response
00:13schnorrerah, yes
00:13tomojno clue then :(
00:13schnorrersighs
00:13tomojI don't think I've ever had any of that NOT use utf-8 without me asking
00:15hiredmanMacRoman is innocent
00:15technomancyyou're getting him confused with Bill Stickers
00:15technomancyhttp://www.snapbuzz.com/images/resized/Bill_Stickers_is_innocent6956.jpg
00:21schnorrertomoj: oh, my bad :( 'ring server' indeed returns ISO-8859-1 charset
00:22schnorrerhow can I explicitly set the charset anyway?
00:23amalloyschnorrer: add a Content-Encoding header?
00:23amalloythough i'd guess utf8 is the default anyway
00:25tomojI think you want to add '; charset=utf-8' to the end of your content-type header
00:25schnorreramalloy: somehow it's not
00:29schnorrernope, 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
00:30tomojare you rendering out that meta tag?
00:30tomojor actually setting the content-type header in your ring response, which somehow comes out as a meta tag instead of a header..?
00:30schnorrerwait
00:31schnorrerI'm rendering it
00:31schnorrerwith hiccup's [:meta {:http-equiv "Content-Type" :content "text/html; charset=UTF-8"}]
00:31schnorrerunsurprisingly, it doesn't work
00:32amalloyew. don't add http-equiv tags if you control the http transport
00:34tomojschnorrer: do you just return a string now?
00:35tomojlike, maybe you just the output from hiccup directly to ring?
00:35tomojs/just the/just return the/
00:36schnorrertomoj: I return hiccup output to ring
00:37tomojsee hello world in ring readme
00:37schnorrernot directly though (via compojure routes)
00:37tomojfor example of map to return with explicit http headers
00:38schnorrertomoj: uh-huh, got it
00:39tomojhmm.. is being able to return a string something compojure adds or is it in ring?
00:39tomojif in ring, is it a middleware that converts strings to response maps, I wonder..?
00:42amalloytomoj: i think it's probably compojure
00:43amalloylooks like it's in compojure.reponse$Renderable, at first glance
00:44tomojwhat is that $
00:44tomojoh found it
00:44tomojgood
00:44amalloywell, i meant to imply an inner class, but i think that was a wrong implication
00:45tomojkinda bothered me that that would be added to all ring handlers by default when it should be a middleware
00:45amalloyyes. given ring's minimalistic approach it would be very surprising if it included that
00:45schnorrerspeaking of compojure, the most straightforward way to set the response header I see is to wrap the (defroutes) handler in a middleware, right?
00:46amalloyschnorrer: yeah, just squeeze a middleware in there somewhere
00:46tomojsee ring.middleware.content-type/wrap-content-type
00:47tomojeh
00:47amalloyyou can't wrap the (defroutes) form, but you can wrap the var it produces, or (def my-rountes (wrap-content-type ... (routes ...)))
00:47tomojwrap-content-type doesn't add the charset bit, though, does it?
00:48amalloyno, you can't use the one from ring for that. it's only intended for serving static files
00:48tomojoh you need the extension
00:49amalloyyeah
00:49tomojwhat would it do, just add charset to specific detected content types?
00:50tomojlike some other middleware sets text/html, then something notices it and adds utf-8? or you just special case wrap text/html+utf-8
00:51amalloytoo many pronouns. none of those "it"s are clearly bound
00:51tomojfirst it is a hypothetical middleware to add utf-8 charset
00:51amalloyk
00:51tomojsecond it is text/html in :headers->"Content-Type"
00:52amalloyi'd probably special-case-wrap
00:52amalloybut that may not be a good solution *shrug*
00:58schnorrerI'm trying to figure out if it's possible to set embedded's jetty defaults, but the middleware workaround is fine too
00:58schnorrerthank you guys
01:07amalloyschnorrer: probably a good idea to use the middleware anyway rather than trying to configure jetty
01:08amalloyyou might want to deploy on tomcat sometime, for example
01:14schnorreramalloy: most likely, but in this case I'd rather choose the less invasive way
04:26schasiAre there latex templates for clojure presentations? :D
04:27hiredman( ) you can use these parens
05:13VinzentWill clojure.lang.IKeywordLookup be turned into a protocol in clojure 1.3?
05:16clgvVinzent: why do you ask? you can implement java interfaces within clojure easily as well
05:20Vinzentclgv, I have java classes which I can't inherit, so If IKeywordLookup was a protocol, it'd be much easier
05:21clgvVinzent: that conclusion is not clear to me. you have a concrete example why it would be easier? (protocol case vs interface case)
05:23Vinzentclgv, 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
05:24clgvyou can also implement interfaces in defrecord or deftype.
05:25clgvI enhanced one of my deftypes to support metadata by implementing withMeta and meta from clojure.lang.IObj
05:26Vinzentclgv, no, I need to make keyword lookup support in existing java classes
05:27clgvVinzent: so you have an existing java class that the evil programmer made final and you want it to implement IKeywordLookup?
05:27Vinzentclgv, exactly
05:27clgvVinzent: well, IKeywordLookup being a protocol wouldnt change that much afaik
05:28bsteuberclgv: yes it would :)
05:29Vinzentclgv, why? I'd just write (extend-protocol IKeywordLookup MyClass ...) and that'll do the job
05:29clgvah ok, so there is clojure dispatch via defprotocol in place then. point taken
05:30bsteuberVinzent: 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
05:31Vinzentbsteuber, so you was writing (get Bean :value)?
05:32bsteuberyes, but most of the time I need setters anyways
05:32bsteuberit#
05:32bsteubers for a swing wrapper
05:33clgvVinzent: is there more than one class that you need to support IKeywordLookup? if not proxy is not that worse as solution for now
05:33clgvs/worse/bad/
05:33sexpbot<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
05:33bsteuberso I made a function make that can be called like (make JButton :text "Foo" :on-click #(bar))
05:34Vinzentbsteuber, ok, I'm writing SWT wrapper :) but (get ...) thing isn't much better that (.getValue ...) and non-idiomatic anyway
05:34bsteuber^^
05:34bsteuberyes, true
05:34bsteuberfirst I used proxies to implement IDeref
05:35bsteuberthat looks much nicer, but I ran into weird bytecode incompability issues on some platforms
05:35Vinzentclgv, yes, there is a huge amount of classes...
05:35clgvVinzent: do they share a a common interface that is used for the lookup?
05:37Vinzentbsteuber, deref? and what it looks like? @(element :value)?
05:38bsteubermore like @my-combo-box which gives the selected value
05:38bsteuberbut of course sometimes there's more than one "value" connected to a widget"
05:38Vinzentclgv, hm, I don't think so, but let me sure...
05:40Vinzentbsteuber, oh, got it. But anyway it's very handy for such special cases, I need to implement it also!
05:40bsteuber^^
05:40bsteuberbut actually I think IDeref isn't meant to be implemented by "users"
05:41bsteuberbecause it implies some concurrency guarantees
05:41bsteuberI guess another, cumbersome thing you could do
05:41bsteuberwould be using one defrecord per class you want to wrap
05:42bsteuberoffering the clojure-interface and holding the actual widget
05:42bsteuberof course you'll need heavy macrology..
05:42bsteuberand reflection
05:43bsteuberwell maybe deftype, as you need your own ILookup implementation
05:44VinzentLooks like this is the only way...
05:48bsteuberor you could fork clojure and make ILookup etc. protocols xD
05:48bsteubermaybe I would even use your version :)
05:54VinzentThat could be more elegant solution :) But I believe there is some serious difficulties that prevented Rich to do it himself
05:56peteriserinsif I have a list as a string, say, "(a\n(b (c d)))", can I obtain a representation in clojure?
05:56tomoj$findfn "(a\n(b (c d)))" '(a (b (c d)))
05:56sexpbot[clojure.core/read-string]
05:57peteriserinsthanks
06:13bsteuberVinzent: I believe the main reason is performance - like for almost everything that happens or doesn't happen to clojure these days
06:16Vinzentbsteuber, but protocols have nearly the same perfomance characteristics as interfaces, isn't it?
06:18Vinzentwell, maybe not "nearly the same", but still good. And anyway a little perfomance penalty is a reasonable fee for the capabilities of protocols
06:18bsteuberI think some hotspot inlining doesn't kick in or so, but I really don'T have a clue how big the difference is
06:20bsteuberbut one should think that what's good enough for clojure libraries should be good enough for the clojure API, too
06:20schnorrertomoj: 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
06:21schnorrerthis could explain the weird behavior duality
06:21schnorrerring hello world app screws up unicode, too
06:22schnorrerseemingly for the same reason
06:22Vinzentyeah, that's true
06:34clgvhmm 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.
06:35clgv"clean project" is the one from eclipse and should only delete the content of bin folders. lein deps is not called
06:44peteriserins$findfn "([ ])" '("[" "]")
06:44sexpbot[]
07:06peteriserinsHow to put quotes around all [^ ()]+ in a string?
07:10peteriserinsnevermind, I think (.replaceAll (re-matcher #"([^ ()]+)" "(This is a (test))") "\"$0\"") does the trick
07:10clgvlets check: ##(.replaceAll (re-matcher #"([^ ()]+)" "(This is a (test))") "\"$0\"")
07:10sexpbot⟹ "(\"This\" \"is\" \"a\" (\"test\"))"
07:11bsteuber,(clojure.string/replace "([])" #"[^()]" #(str "\"" % "\""))
07:11clojurebotjava.lang.ClassNotFoundException: clojure.string
07:11bsteuber,(require 'clojure.string)
07:11clojurebotnil
07:11bsteuber,(clojure.string/replace "([])" #"[^()]" #(str "\"" % "\""))
07:11clojurebot"(\"[\"\"]\")"
07:12bsteuberah the + is missing
07:13bsteuberbut I guess clojure.string/replace is more idiomatic than using Java
07:15peteriserinsactually the regex needs fixing. [^()\s] I suppose
07:16peteriserins(with the +)
07:24peteriserinshow to properly include the replace function?
07:25peteriserinsI am using (:use [clojure.string :only (replace)]))
07:25peteriserinsin my ns declaration
07:26peteriserinsit gives me an illegal state exception as I reload it in the repl
07:28clgvpeteriserins: you might use (:require [clojure.string :as str]) and the use (str/replace ...)
07:28bsteuber(:use [clojure.string :only [replace]])
07:28bsteuberso square brackets
07:29bsteuberof course, require is possible, too
07:29clgvbsteuber: uh! what do these square brackets change concerned with :only?
07:30clgvI only knew the list version
07:31bsteuberclgv: hmm, doesn't seem to make a difference at all
07:31clgvbsteuber: lol. k;)
07:31bsteuberbut in general, always use () when the first element of the list is special
07:31bsteuberand [] if all are "same"
07:31bsteuberso :only (foo bar) is bad style
07:32ejacksonbsteuber: ha! that's a nice heuristic, thanks.
07:32bsteuberas well as (:use [clojure repl string]) - here "clojure" is special
07:33bsteuberso always write (:use (clojure repl string))
07:33clgvbsteuber: yes thats a different semantic. didn know it was supported until some weeks ago
07:35clgvbsteuber: 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
07:40bsteuber^^
07:40bsteuberclgv: I don't understand where the contradiction is
07:41bsteuber:use would allow both [] and () for this, but () is more idiomatic due to the heuristics
07:41clgvbsteuber: 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 ;)
07:42bsteuberbut :use defines the same semantics for () and [], so I do have a choice
07:43clgvbsteuber: oh right. my error. I wouldnt allow it, if I defined :use
07:44clgvin this case I would enforce the "() vs []" rule to be able to give more specific errors
07:45bsteuberyes, me too :)
07:45clgvI assumed they did so ;)
07:47bsteuberpeteriserins: btw, the illegalstateexception occurs when you already use'd the exact same var from your namespace
08:09peteriserinsbsteuber: what I am doing is, I am using a file and the REPL
08:09peteriserinsbsteuber: and I wrote a (reload) function to load-the-appropriate-file
08:12bsteuberpeteriserins: so probably restarting the repl will get rid of the problem
08:13bsteuberhuh, I can't call future when using leiningen 1.6.0
08:13bsteuberalways throws a RejectedExecutionException
08:13peteriserinsbsteuber: it doesn't
08:14bsteuberdid anyone else try lein 1.6.0 yet?
08:17bsteuberpeteriserins: maybe you should switch to an ide instead of loading files yourself from the repl
08:17bsteubernot sure how to do this correctly
08:18peteriserinsbsteuber: I'm using Vim
08:18bsteuberah good
08:18bsteuberthough I'm more an emacs guy :)
08:28clgvbsteuber: huh? I just considered upgrading lein... maybe I should wait a bit... :/
08:29bsteuberclgv: well, as long as noone confirms the same problem, it could be just some weirdness on my machine
08:29clgvI don't dare to try to confirm it ;)
08:29bsteuberthough java -jar clojure-1.2.1.jar works fine
08:29bsteuber^^
08:32clgvdid anyone try a clojure.walk-like implementation using multimethods?
09:14bsteuberclgv: I now downgraded to lein 1.5.2 and it works fine again
09:14bsteuberso probably good to be careful
09:16bsteuberdid that by symlinking to my lein checkout of tag 1.5.2
09:16clgvok, I didn't read of any improvement that encourages me to upgrade anyway. I just wanted to do it for maintenance ;)
09:17bsteuberI like the user.clj support for auto-using clojure.repl and clojure.java.javadoc in my user-ns
09:17bsteuberas I do that all the time
09:31clgvyou use lein repl?
09:38bsteuberno usally swank
09:40clgvhmm how do you profit from the user.clj then?
09:46jcromartieIt's sad that "build ___ with ZERO code!" is considered a great selling point in the .NET world
09:46jcromartieI rather like to code...
09:48bsteuberclgv: slime-connect also puts me in the user namespace
09:49clgvjcromartie: you mean click&drag GUIs?
09:49mlimottejcromartie: or complicated config files, which are like learning a new language
09:52clgvmlimotte: you mean XAML? that's in fact another language ;)
09:52clgvmlimotte: probably not turing complete, though ;)
09:57jcromartiemostly the drag-and-derp variety
09:58clgvjcromartie: 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:01jcromartiealso WTF is this http://stackoverflow.com/questions/6558083/best-way-to-convert-clojure-source-to-java-source-automatically
10:01jcromartielooks like someone used Clojure at work and now the boss needs to know how to turn it into Java
10:01ejacksonregression
10:02clgvwe can tell him that it's simple: just use a java decompiler :D
10:02clgv;)
10:03ejacksonhow about a 1 word answer to go the with the zero code answer: "don't".
10:04clgvejackson: that's two words counting strictly ;)
10:04jcromartieejackson: perfect answer
10:04ejackson:)
10:05jcromartieOK here's one more point for favoring "data" over "objects"
10:06jcromartiein 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:06jcromartiei.e. to a database or filesystem or another process
10:07clgvfor real?
10:07jcromartiebecause each object in the session needs to be specifically marked as serializable at compile time
10:07jcromartieand even if it's just a simple collection type, it can't just be simply serialized
10:09jcromartienow if only it was just a hash map
10:12ejacksoncrazy talk
10:15jcromartieOOP says "you don't have to worry about the implementation"
10:15jcromartiebut I do
10:15jcromartiebecause your stupid implementation broke my app
10:16clgvjcromartie: well I am pretty sure you do stupid implementations with and without OOP ;)
10:17jcromartieof course
10:17jcromartiebut you know what I mean
10:17clgvI have a glimpse ;)
10:22jcromartieand by "your" implementation I mean third party library vendors
10:22clgvyes, I also meant "them" with "you".
10:23clgvsometimes english is really imprecise
10:52cemerickfeedback and critiques most welcome: http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/
10:54hugodcemerick: gen-class can't define fields
10:56cemerickhugod: true enough; you're saying that should be noted as a key decision point?
10:57bsteubercemerick: maybe you might want to clarify "new methods" a little
10:57bsteuberlike "methods not in implemented interfaces"
10:57cemerickthat 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:59hugodnot sure - just pointing it out
10:59hugodalso the flow seems to prefer gen-class over def-type for aot - is that intentional?
10:59cemerickbsteuber: yeah, I'm not happy with that wording either
11:01cemerickhugod: of course :-)
11:02dnolencemerick: I note that you don't mention a plain map with :type metadata
11:02hugodcemerick: why? deftype is a lot easier to read (imho), and you can define multiple types in a single ns…
11:02clgvcemerick: 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:03cemerickdnolen: yeah, fogus just tagged me with that on twitter
11:04cemerickI was coming at this from a section in the book talking about interop, thus the class-generating-forms bias.
11:04dnolencemerick: I also don't really like the fact that the flowchart puts class/type together. deftype/record are not about interop.
11:05hugodmy 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:06dnolencemerick: flowchart would perhaps better titled "I need interop, now what?" vs "type/class" distinction.
11:07cemerickhugod: My "of course" was in response to your "just pointing it out" :-)
11:07cemerickhugod: but no, not intentional
11:08cemerickThe interop state of mind has obviously tinged the whole endeavor.
11:08cemerickclgv: good point
11:09cemerickThough, if I invert it, then I'll be asking "do you need a named class" twice
11:11clgvcemerick: yeah, you have to decide what's more important. I vote for "exntending a base class" ;)
11:12bsteuberclgv: hm I'd ask for anonymous first - just because reify and proxy seem closer to each other than the rest
11:13bsteuberwell just a matter of taste anyways :)
11:15clgvbsteuber: to show similarity ("being close") I would use something else for visualization. I would only ask what is more important for the developer.
11:16clgvI guess an objective criterion would be to minimize the average number of question until a decision is made
11:40cemerickdnolen: re: "deftype/record are not about interop": they are all about defining a host type, as is reify.
11:42dnolencemerick: "interop" means (to me) coordinating between Java and Clojure. deftype/record/protocols are not about that at all.
11:44cemerickyeah, we're just into semantics there :-)
11:47dnolencemerick: "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:49hugoddnolen: I couldn't see any published jars for core.logic…
11:50dnolenhugod: http://build.clojure.org/job/core.logic/lastBuild/ ?
11:50cemerickdnolen: "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:52hugoddnolen: was the staging repo ever closed and promoted?
11:54dnolenhugod: ?
11:54cemerickdnolen: there wasn't an actual release of core.logic, so artifacts never went to central
11:55hugoddnolen: 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:55dnolenhugod: ah so I need to get someone on core to do that?
11:56cemerickdnolen: see http://dev.clojure.org/display/design/How+to+Make+Releases
11:56cemerickthe release process is entirely automatic; twiddling the version number to be non-SNAPSHOT doesn't actually push releases through, tho
11:56cemerick(entire automatic, given a button-press in hudson, that is)
11:57clgvhumm why is it "core.logic" instead of "contrib.logic"?
11:57cemerickThat staging repo actually needs to get dropped to make room for the actual release.
11:57chousercemerick: 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:59chouserstarting 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:59dnolenclgv: in hopes that one day it might actually be good enough to live up to that name ? :)
11:59kephalechouser: are you the same chouser that does Gentoo stuff?
11:59clgvdnolen: ok, marketing reasons ;)
11:59chouserOr 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:00chouserkephale: wow, once upon a time, yes.
12:00kephalechouser: heh, cool, just curious
12:00chousersurely you haven't seen my name in anything gentoo related for years?
12:01kephaleactually your name is still all over gentoo docs
12:01dnolenhugod: hmm, don't think I have a hudson login
12:01chouserheh. wow. well, yeah, that's me. hi. :-)
12:01technomancybsteuber: for the record, it's fixed in git and will be released today or tomorrow
12:02chouserI used to use gentoo to control my computers. These days ubuntu lets me use them in certain, restricted, ways.
12:03kephaleyeah, i more or less quit gentoo after the developer split years ago and embraced my debianite tendencies
12:04cemerickdnolen: I can start the release for you if you like; I don't know what core's policy is on hudson logins.
12:05dnolencemerick: that'd be great, thanks! I sent a message about hudson login to the clojure-dev ML.
12:05cemerickdnolen: In any case, you'll need to back out the change to the version number in the POM.
12:06dnolencemerick: ah the new POM doesn't apply?
12:06hugodcemerick: can't you just promote the existing staging repo?
12:07cemerickdnolen: actually, it may not matter
12:07cemerickhugod: Yes, but then the release point isn't shown in hudson like it is in the histories of all the other projects. :-)
12:07cemerickdnolen: do you want me to release it now, or do you want to wait for a potential hudson login?
12:08dnolencemerick: a release now is ok.
12:10cemerickdnolen: Yup, need that version number rolled back to 0.6.1-SNAPSHOT. Sorry.
12:10dnolencemerick: so do I just need to back off the POM change?
12:11cemerickdnolen: yes, this one: 1338b70181953ab02da7cced12e1e8b836702d0d
12:11cemerickThe later one should be fine.
12:13hugodcemerick: can the hudson release plugin not release from a tag?
12:17cemerickhugod: not that I'm aware of.
12:20dnolencemerick: ? oh I backed out the POM change, why should I leave SNAPSHOT there?
12:22cemerickdnolen: the maven gods apparently demand that releases be cut from a SNAPSHOT
12:22dnolencemerick: ok
12:22chousercemerick: 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:23cemerickchouser: 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:24dnolencemerick: k, done.
12:27cemerickdnolen: done, should be in central in some couple of hours
12:27cemerickhugod: ^^
12:28dnolencemerick: thanks much!
12:28hugodcemerick, dnolen thanks
12:28cemericknp
12:34bsteubertechnomancy: thanks, should've tried master before reporting :)
12:34bsteubertechnomancy: btw swank works for me without updating swank-clojure
12:35bsteuberthat is, if it wasn't already done by lein deps if you pushed it
12:44dnolenBackType gets picked up by Twitter, wonder if that means no opensource Storm.
12:56bpris there a way to type the literal for ,(type (byte-array 0))
12:57bpr,(type (byte-array 0))
12:57clojurebot[B
12:57bpri would like to be able to check for it in a (case ...) form
12:57chouserbpr: excellent question!
12:58chouserI don't think there's an officially supported way, but I think I may have a solution for you. just a sec.
12:58hiredmanbpr: class literals don't work well in case
12:58bprcool! ty
12:58bprhiredman: yeah, it's a one-off though
12:58chouserhiredman: class literals in general have a problem?
12:59chouseroh. do they not work at all?
13:00jcromartie,(case java.lang.String java.lang.String :foo)
13:00clojurebotjava.lang.IllegalArgumentException: No matching clause: class java.lang.String
13:01bprhiredman: 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:01hiredmanbpr: that is more or less how you do it
13:01jcromartienote that docs say "All manner of constant expressions are acceptable in case"
13:01bpr,(case "" java.lang.Sting :foo)
13:01clojurebotjava.lang.IllegalArgumentException: No matching clause:
13:02amalloyjcromartie: and java.lang.String is a constant *symbol*, which is mapped in the current namespace to a class
13:02bpr,(case (type "") java.lang.Sting :foo)
13:02clojurebotjava.lang.IllegalArgumentException: No matching clause: class java.lang.String
13:02chouserbpr: this seems to work: #=(clojure.lang.RT/classForName "[B")
13:02bprchouser: oh nice
13:03amalloychouser: the weird uses for #= never end
13:03chouser,(case (type (byte-array 0)) #=(clojure.lang.RT/classForName "[B") :bytes)
13:03clojurebotEvalReader not allowed when *read-eval* is false.
13:03chouserheh. right.
13:03chouserbpr: #= is subject to change without warning, so use at your own risk.
13:04bprok, thanks for the heads up
13:04chouserand you didn't hear it from me. :-)
13:04amalloyi saw someone trying to use #= to force an "inner" macro to expand before the macro containing it
13:04bprhaha
13:04hiredman:(
13:04chouseramalloy: wow
13:04amalloy(deftype Foo #=(generate-my-deftype-body Foo))
13:04amalloyor something of that sort
13:05chouseryikes
13:05chouseryeah, that's the wrong way to do that.
13:05amalloyingenious but very wrong
13:05chouserhm, but does suggest another possible option for bpr's case
13:05amalloyi suppose it does
13:06hiredmana macro that expands case forms and resolves symbols that map to classes
13:06amalloysome 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:06jcromartiewhat is #=
13:07amalloy$google clojure evalreader
13:07sexpbotFirst out of 44 results is: defrecord improvements - Clojure Design - Clojure Development
13:07sexpbothttp://clojure02.managed.contegix.com/display/design/defrecord+improvements
13:07amalloyhm. no dice
13:07chouserhiredman: exactly
13:07chouser(defmacro mycase [& args] (cons `case (map #(get {:my/bytes (clojure.lang.RT/classForName "[B")} % %) args)))
13:08chouser(mycase (type (byte-array 0)) :my/bytes :foundbytes)
13:08chouserbpr: this is a better solution than #=()
13:08clojurebot'Sea, mhuise.
13:08bprchouser: ok
13:10amalloychouser: what's with using clojure.lang.RT there anyway? ##(Class/forName "[B") has got to be more readable
13:10sexpbot⟹ [B
13:11chouseramalloy: thats fine too
13:12bprthanks for the tips guys! very helpful
13:32clizzinif a java method takes multiple strings with foo(String... strs), how can i apply this method to a seq of strings?
13:33amalloyclizzin: you have to pass a String[]
13:33clizzinamalloy: great, thanks
13:34amalloyanyone know how to get format/printf to use a width not known at compile time, like C's %* specifier?
13:47chouseramalloy: docs are here: http://download.oracle.com/javase/1,5.0/docs/api/java/util/Formatter.html#syntax
13:48amalloychouser: yeah, i read em. can't find it, but am not willing to conclude it doesn't exist
13:48chouserheh
13:48chouserwell if the docs don't say, I'd look at the source next.
13:48amalloyi think it actually doesn't, and the excuse is that it's easier to concatenate string in java than in c
13:48hiredmanamalloy: you can generate the string used for format at runtime
13:48chouserjust use format to create the format string.
13:48amalloyso that you're supposed to cook up a format string yourself
14:03rindolfHi 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:03rindolfCan anyone help?
14:14technomancysomeone was saying last week they had to get it from upstream instead of using the version that came with their distro
14:23rindolftechnomancy: I got it from upstream.
14:31cemerickhugod, dnolen, chouser: updated flowchart, FWIW http://wp.me/p10OJi-9r
14:33hiredmanyou can also use defprotocol/definterface if you need to add methods
14:35cemerickYeah, we have an example of doing that, too.
14:36hiredmandeftype needs to support static fields
14:36chouserwhy?
14:36clojurebothttp://clojure.org/rationale
14:40hiredmanchouser: fns need static fields
14:40hiredmanfor constants
14:41cemerickhiredman: ^:const is coming
14:41hiredmanthat is not the same
14:41cemerick(maybe it's already here, living among us)
14:41hiredman:const doesn't replace static field support in deftype
14:42cemericknot fully, no, but it will for many uses
14:42hiredmannot really
14:42hiredmanstatic fields in fns are used to store things like the vars reference by the fn, etc
14:42cemerickIIUC, it will for any atomic Clojure value
14:43hiredmanno
14:45amalloyhiredman: do you object to making clojurebot forget "why"? it generates more noise than useful contributions
14:45cemerickI feel enlightened already.
14:47hiredmanamalloy: I will try and figure out how to do that
14:48hiredmancemerick: 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:49hiredmanthe clojure compiler turns constant references (not just ^:const, but things like 1 or :foo) into static fields
14:50hiredmanso 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:28pcavsIs 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:30amalloy&((fn [r c] (vec (repeat r (vec (repeat c nil))))) 3 3)
16:30sexpbot⟹ [[nil nil nil] [nil nil nil] [nil nil nil]]
16:31pcavsthanks
16:44cmbntr_hi all
16:46cmbntr_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:54dnolencmbntr_: should be fine far as I know.
16:54jonabbey&((fn [r c] (repeat r (repeat c nil))) 2 3)
16:54sexpbot⟹ ((nil nil nil) (nil nil nil))
16:55jonabbeyneat, sexpbot
16:55cmbntr_dnolen: jep, I checked over at the #jetty channel. jmcconnell confirmed
16:56cmbntr_safes some major request rewriting...
17:14ninjudd_am i just overreacting, or is this ridiculous? https://github.com/clojure/java.classpath/pull/2
17:16technomancy=(
17:20dnolenninjudd: 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:22amalloythat's...that's a lot of aleph
17:22dnolenninjudd: 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:22technomancythe fsf is famous for being paranoid about copyright assignment, but even they don't make a fuss about patches under 20 loc
17:22technomancyclaiming 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:23amalloytechnomancy: i thought ahead and took out a copyright on the empty string
17:24amalloygo ahead and write out an infinite number of them. pretty sure you used a lot of empty strings in that last message
17:25technomancydo you take bitcoins?
17:25amalloyhaha
17:56Raynesninjudd: It's fairly ridiculous, but whatchagonnado.
17:58ninjuddi think i may refuse to create a JIRA ticket in protest
17:59ninjuddoh. not necessary. abedra decided to just commit the fix
18:04Raynesninjudd: Yeah, I saw that. Nobody can resist the ninja.
18:17Crowb4rSo who else is excited for Clojure on Heroku?
18:18technomancyyesssss
18:18technomancyI am
18:22ibdknoxThe only problem is the cost
18:22ibdknoxcompared to EC2 it's quite expensive
18:22ibdknoxhard to beat the workflow though :)
18:24Ramblurranyone familiar with sandbar and its auth functions?
18:25Ramblurri have a question about the "authentication function"
18:33livingstonsome 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:35cemerickibdknox: lein-beanstalk is pretty slick, too FWIW https://github.com/weavejester/lein-beanstalk
18:36ibdknoxcemerick: yeah it is :D I updated noir to make it easy to work with that too now.
18:36cemerickMy only complaint is that the beanstalk-specific functionality is all tied up with lein instead of being broken up into its own lib
18:37ibdknoxis there something else you want to use it for?
18:37ibdknoxor rather, something else you want to use it with
18:37cemerickmaven builds
18:37cemerickI've got my own beanstalk lib, but it's not as complete as what lein-beanstalk has in it
18:38cemerickI'm debating whether to just rip out the lein bits or finish my own
18:39ibdknoxyou should talk to James
18:39ibdknoxsee his thoughts on it
18:39hiredmancemerick: perhaps the project object model will help?
18:41ibdknoxthe beanstalk part itself is fairly simple
18:41ibdknoxit seems like the war exporting is where all the work would be
18:51livingstonis there any future intent to keep the clojure contrib sub projects version-locked with clojure core?
18:51livingstonupon 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:52lucianlast time i checked, clojure bootstrap time was prohibitive on android. has that changed recently?
18:57technomancylucian: I don't think so
18:57lucianah, found http://dev.clojure.org/display/design/Android+Support. it seems the most up to date
18:57luciantechnomancy: thanks
19:00babilentechnomancy: 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:01technomancybabilen: sweet; thanks!
19:02gfrloghmmm...is clojure yelling at me because I want a 0-arg function in my protocol?
19:02gfrlogdo protocol method signatures include this?
19:04amalloygfrlog: yes
19:04amalloyanaphora are unhip
19:04gfrloganaphora am unhip.
19:05jsnikerisHow would you remove a given prefix from a string?
19:05amalloy&(doc clojure.string/replace)
19:05sexpbot⟹ "([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:06amalloy&(clojure.string/replace "the-test" #"^the-" "")
19:06sexpbot⟹ "test"
19:06gfrlogjsnikeris: if the prefix is fixed, you can just take a substring based on its length
19:06scottjhas the speculation on topic of next nyc clojure meeting already happened? consensus?
19:06jsnikeristhe prefix is a parameter
19:06amalloygfrlog: if the prefix is fixed *and* is known to be present in each string
19:06gfrlog(that also assumes you don't need to test that it's there)
19:07amalloyscottj: i speculate he'll announce oracle has purchased clojure
19:07jsnikerisis there a way to take a string and escape any regex-special characters?
19:07amalloy$google java util regex pattern quote
19:07gfrlogI knew that's where we were going next :)
19:07sexpbotFirst out of 2990 results is: Pattern (Java Platform SE 6)
19:07sexpbothttp://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
19:08amalloyjsnikeris: note i'm using regexes here just because it's easy to think of; it's probably not the cleanest solution
19:08amalloyhttp://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#quote(java.lang.String) is the specific link
19:08gfrlogyou could test the length-based-substring for equality...
19:08jsnikerisamalloy: yah, that's what I reached for right away too
19:09jsnikerisbut 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:09gfrlog(defn make-remover [prefix] (fn [s] (if (= prefix (.substring s 0 (count prefix))) (.substring s (count prefix)) s)))
19:09gfrlog^ untested
19:10jsnikerisgfrlog: I think I'll go with something like that. Thanks for the tips
19:10gfrlogno probalo
19:12gfrlogI think the only thing wrong with that version is it fails for strings shorter than the prefix
19:12gfrloger, crashes
19:13amalloyjust mention in the docs that the behavior is undefined in all cases
19:13gfrlog:)
19:13amalloyany apparent consistency is coincidence
19:13gfrlog(defn make-remover [prefix] {:pre false} ...)
19:13ibdknoxlol
19:14amalloynice
19:14ibdknoxI'm going to add that to all my functions now ;)
19:14wilfredhhi all
19:14gfrloghi wilfredh
19:14amalloygfrlog: i think the syntax is wrong though
19:14gfrlogamalloy: whycome?
19:14wilfredhI've just set up a test project (complete newbie) -- why doesn't this test fail?
19:14wilfredh(deftest test-my-add (is 3 (+ 1 1)))
19:14terom,(.startsWith "prefixed-string" "prefix")
19:14clojurebottrue
19:14amalloydon't you need :pre to map to a seq of tests, not just a single test-expr?
19:15ibdknox(is (= 3 (+ 1 1))
19:15gfrlog,(let [f (fn make-remover [prefix] {:pre false} :whut)] (f "okay"))
19:15amalloywilfredh: =
19:15clojurebot:whut
19:15ibdknoxyou're not testing for equality
19:15ibdknoxis simply asserts that the value is true
19:15gfrlogah probably
19:15gfrlog,(let [f (fn make-remover [prefix] {:pre [false]} :whut)] (f "okay"))
19:15clojurebotjava.lang.AssertionError: Assert failed: false
19:15gfrlogamalloy: good catch
19:15gfrlogibdknox: go back and fix the functions you've already changed
19:15clojurebotanonymous functions are functions with no names
19:15wilfredhargh, much clearer :) thanks
19:16ibdknoxgfrlog: damn. More work :p
19:16gfrlogthis is open source. correctness is not guaranteed.
19:16ibdknoxhaha
19:16amalloyclojurebot: thanks for the tip, bro
19:16clojurebotbartj: it's not broken. Unless you know the performance hit there is actually a problem, I'd recommend leaving it alone.
19:17gfrlogI feel like there's a good joke to be made for naming a function that has {:pre [false]}
19:19ibdknoxperhaps we need a lib for testing coincidental correctness.
19:19gfrlogreplace is with might-be?
19:19ibdknoxyes
19:19ibdknoxor is-possibly?
19:20gfrlogand how could such a test fail?
19:20amalloyibdknox: i like the coincidental correctness of sexpbot (sometimes) returning clojure.core/rand-nth for $findfn [1 2] 1
19:20gfrloghaha
19:20ibdknoxlol
19:20gfrlog$findfn [1 2] 1
19:20sexpbot[clojure.core/first]
19:20ibdknoxgfrlog: it can't? that's the value in it.
19:21gfrlogall of the coverage and none of the failures
19:21gfrlog$findfn [1 2] 1
19:21sexpbot[clojure.core/first clojure.core/rand-nth]
19:21ibdknoxexactly. That's infinitely better than normal unit tests ;)
19:21amalloyibdknox: 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:21ibdknoxlol
19:22gfrlogif they're all expected, does it still pass?
19:23ibdknoxthat is the CCC (Clojure Coincidental Correctness) paradox
19:28ibdknoxcompletely unrelated
19:28ibdknoxI wrote a clojure starter pack for the google ai challenge
19:28ibdknoxif anyone is interested
19:40scottjibdknox: url for new contest? http://ai-contest.com/ doesn't appear to have been updated
19:41ibdknoxscottj: the beta site is here: http://aichallengebeta.hypertriangle.com/index.php
19:41ibdknoxthe contest has not officially begun yet
19:41ibdknoxand 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:41scottjthe last one was pretty cool for spectators
19:41ibdknoxyou can, however, play locally :D
19:42ibdknoxbot is here: https://github.com/ibdknox/aichallenge/tree/epsilon/ants/dist/starter_bots/clojure
19:43carlo_auWhat'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:44hiredman:|
19:45cemerickibdknox: yeah, beanstalk isn't complex at all, it's just too bad the impl isn't reusable.
19:45cemerickibdknox: war exporting?
19:45ibdknoxyeah
19:46ibdknoxcemerick: 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:47cemerickheh
19:47ibdknoxwhich isn't a pretty problem to solve:
19:47ibdknoxhttps://github.com/weavejester/lein-ring/blob/master/src/leiningen/ring/war.clj
19:47cemerickbuild war files just can't be considered 'heavy lifting' :-)
19:47ibdknoxhaha
19:47ibdknoxwell none of this is too bad :-p
19:48ibdknoxbut relatively speaking, it does all the real work :)
19:48cemerickibdknox: that looks complicated because of the bizarre web.xml transliteration support that's going on
19:48ibdknoxyup
19:48ibdknoxas well as the default servlet stuff
19:49ibdknoxwhich 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:49ibdknoxhaha
19:50cemerickLots of good stuff in that nonsense
19:50ibdknoxcarlo_au: do you need to be able to do this at runtime?
19:51ibdknoxwhy not just write a python script that exports the data you need in a manageable format
19:51ibdknoxjson or something
19:51ibdknoxand then read that from clojure
19:51carlo_auibdknox: no, I just need to call a few functions
19:51carlo_auI also want to call some numpy and scipy code for curve fitting
19:52ibdknoxI would do this all before it ever touched clojure
19:53ibdknoxcemerick: such as?
19:54carlo_auI would too, but there's an existing code-base that I want to make use of.
19:55cemerickibdknox: default servlets for serving static assets, filters, declarative servlet configuration, container-managed session mgmt, etc…
19:57ibdknoxcemerick: 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:57ibdknoxand as somewhat of a testament to that, I've managed to avoid learning about them for now
19:57ibdknoxgood bad or indifferent
19:58cemerickibdknox: I don't think you grokked what I just described
19:58ibdknoxI see, what'd I miss?
19:58cemericke.g. ring standard practice seems to be to manually set up handlers for serving static assets
19:59cemerickI'd call that working "low in the stack"
19:59ibdknoxto be fair, I think Ring *is* low in the stack :)
19:59ibdknoxI get what you're saying though
20:00ibdknoxthere's a wealth of stuff already written for you there
20:01ibdknoxI'll look more into that, see if there's anything I can steal :D
20:02teromcarlo_au: maybe you could use Jython
20:03gfrlogah ha.
20:04gfrlogI cannot use (size) as a method name on a protocol :(
20:04ibdknoxreally?
20:04amalloygfrlog: bet you a dollar
20:04amalloyyou can't use it in a defrecord, though
20:04gfrlogyeah that's what I was inaccurately actually saying
20:04ibdknoxlol
20:05carlo_auterom: I just looked at that, and apparently numpy doesn't work in jython, so I'm stuck. Ah well.
20:05gfrlogit's funny because I had just verified that distinction experimentally before reporting it, and still said it wrong
20:05gfrlog%s/size/cardinality/g
20:05amalloygfrlog: just name it size-me-up
20:06gfrlogha
20:06ibdknoxhaha
20:06ibdknoxsounds good to me
20:33seancorfieldif 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:33seancorfieldi 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:34technomancyseancorfield: new "feature" in clojure 1.2 unfortunately
20:34hiredmanyes, defmulti behaves like defonce (ugh)
20:34hiredman(ns-unmap *ns* 'name) should clear it out
20:34seancorfieldouch... ok, at least i'm not going crazy
20:35seancorfieldns-unalias?
20:35hiredmanns-unmap
20:35technomancyduring development I'll just put (def mymulti nil) before my defmulti call
20:35technomancyso recompiling works
20:36seancorfieldah, nice trick!
20:37seancorfieldwith 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:39seancorfieldi guess i just need to make my dispatch function smarter...
20:39seancorfieldfirst time i've tried to use multi methods
20:40gfrlogseancorfield: 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:40gfrlogmaybe because I almost never use multimethods.
21:03bprtechnomancy: nice idea about (defvar mymulti nil)
21:03technomancywould be nicer still if it weren't needed
21:03bpryeah, totally agreed
21:08gfrlogI think I'm about to write an algorithm with three nested (loop)s :/
21:11amalloygfrlog: when i wrote a function with three (for)s and three (apply concat)s, i knew it was time to seek help
21:11gfrlogamalloy: is that the story of how mapcat was originally written?
21:11gfrlog,:-D
21:11clojurebot:-D
21:12brehautgfrlog: mapcat and for are isomorphic
21:13gfrlogI'm not seeing it
21:13brehautgfrlog: for is seq comprehensions which are sequence (list) monads with clean notation
21:13brehautin the list monad mapcat is bind
21:14derp__um, how does one go through a map blindly? like if you don't know the names of the items
21:14derp__is there a way to generate a list of keys?
21:14gfrlogderp__: keys
21:14derp__gfrlog: thanks!
21:14gfrlogI love questions that are hard to ask without including the answer in the question.
21:14clojurebotthe answer is 42
21:15gfrlogbrehaut: I don't know that I'm going to understand the monad formulation.
21:15brehautgfrlog: im writing the equivalent forms
21:15brehautgive me a moment
21:15gfrlog:)
21:17amalloyderp__: you usually want to just seq the map rather than using keys and then looking them each up
21:18amalloy&(for [[k v] {1 3 8 2}] (* k v))
21:18sexpbot⟹ (3 16)
21:18brehautgfrlog: ##(= (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:18sexpbot⟹ true
21:18brehaut(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:20gfrlogbrehaut: I take from that expression that a simple for is easily transformed into nested mapcats
21:20brehautcorrect
21:20brehaut:when and :let are also relatively trivial
21:21gfrlogThe part I was thinking about was going the other way, so let's do this example:
21:21gfrlog,(mapcat range (range 4))
21:21clojurebot(0 0 1 0 1 2)
21:21gfrlog,(for [a (range 4) b (range a)] b)
21:21clojurebot(0 0 1 0 1 2)
21:21gfrlogI guess that's how to do it, huh?
21:21brehautyeah
21:22gfrlogI have learned some. Thanks.
21:22brehautno problem
21:22brehautand now, back to work
21:22gfrlog:)
21:22gfrlog$findfn 7 3 [2 1]
21:22sexpbot[]
21:23gfrlog$findfn 7 3 [1 2]
21:23sexpbot[]
21:23hiredmanI'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:23amalloyEveryone, stand back! I know how to use monads! ;; brehaut darting in and out
21:24gfrlogwhat he said ended up making sense I think, but I still don't know anything further about monads
21:24amalloygfrlog: try (juxt quot rem)
21:24gfrlogamalloy: that's exactly what I want, but performant
21:24amalloythe jvm doesn't have it
21:24gfrlogamalloy: I'll probably end up using the bigint version; I'm using bigints anyhow.
21:24amalloymostly because java doesn't make it easy to deal with multiple return values, i suspect
21:25gfrlogthat is interesting to know that the jvm doesn't do it for primitives though. Do you know if typical CPUs support it?
21:25amalloyyes
21:26amalloymost CPUs are register architectures, where it's easy to say "the results of the division will be put into registers foo and bar"
21:26amalloythe jvm uses a stack instruction set, which makes that more awkward (though presumably not impossible)
21:26gfrlog,(let [[a b] (seq (.divideAndRemainder (bigint 7) (bigint 3)))] [a b])
21:26clojurebot[2 1]
21:27gfrlogcertainly not if you don't mind 2-element arrays
21:27hiredman(x86 barely has enough registers to count as being a register machine)
21:28hiredmanamalloy: it just means instructions can result in more than one value being pushed to the stack
21:28hiredmanI think john rose has a blog post
21:28amalloygfrlog: 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:28hiredmanhttp://blogs.oracle.com/jrose/entry/tuples_in_the_vm
21:29gfrlogamalloy: so do it both ways
21:30amalloyhiredman: do you happen to know how many bytes each opcode is?
21:31amalloyoh, neat blog. thanks for the ink
21:31amalloy*link
21:32hiredmanamalloy: 1
21:32hiredmanblegh
21:32amalloygfrlog: if the opcode is only a single byte, adding two new opcodes is probably pretty expensive
21:32hiredmanwell, 1 + some that take arguments
21:32gfrlogamalloy: well if we each chip in a dollar...
21:33amalloy$google jvm instruction set
21:33sexpbotFirst out of 28400 results is: VM Spec The Java Virtual Machine Instruction Set
21:33sexpbothttp://java.sun.com/docs/books/jvms/second_edition/html/Instructions.doc.html
21:33hiredmanhttp://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
21:34hiredmanif only rose was given a free hand
21:40hiredmanvalue types are way cool, but I still want tail calls
21:45jonabbeyhow much benefit will there be with java 7's dynamic calls?
21:46jonabbeyInvokeDynamic, that is
21:46dnolenjonabbey: what kind of benefit are you asking about?
21:46jonabbeythat'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:47jonabbeyi've been reading a couple of the clojure books, but i haven't gotten my toes wet with it yet
21:47jonabbeyi'm just sick of java the language
21:47jonabbeyand it's lack of higher order functions, closures, etc.
21:48jonabbeyso, asking out of ignorance
21:48hiredmanI don't think invokedynamic brings that much for clojure
21:48jonabbeythat's too bad
21:48jonabbeyalthough i understand clojure was designed for the jvm to begin with
21:48hiredmanpossibly it could be used to boost performance of non-inlined protocols
21:48hiredmanjonabbey: right
21:49dnolenjonabbey: 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:50seancorfielddefmethod doesn't accept a docstring??
21:50hiredmanseancorfield: how would that work?
21:50gfrlogseancorfield: the multimethod is one function to the caller, so it gets one docstring
21:50seancorfieldyeah, so i see having read thru the source code
21:51seancorfieldi'm just a bit surprised that it doesn't have a way to automatically accumulate the dispatch values and some associated docstring / metadata
21:52seancorfieldso that means if you add a method later, you have to go to the original defmulti to update the docstring :(
21:52pcavs,(meta (def ^{:key "val"} x 10))
21:52clojurebotDENIED
21:53pcavswhy doesn't that work?
21:53pcavsbesides the fact it won't let me def things
21:53gfrlog#^{:key "val"} is the syntax I think
21:53dnolenpcavs: you're putting metadata onto the symbol, but def returns the var.
21:54pcavsoh
21:54pcavsso how do I throw the metadata onto the var?
21:55pcavsdnolen: well (meta 'x) doesn't work either .... O.o
21:55pcavsoops, nevermind, (meta #'x) works
21:57jonabbey,(meta #'x)
21:57clojurebotjava.lang.Exception: Unable to resolve var: x in this context
21:57dnolenpcavs: actually, I'm totally wrong, your code works for me just fine on 1.2.0 and 1.3.0
21:57jonabbeyhow does clojurebot differ from sexpbot?
21:57gfrlogwell.
21:59dnolenhiredman: is there anything specific reason you really want tail calls? just cleaner code?
21:59gfrlogclojurebot 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:59hiredmandnolen: I won't have to use trampoline and letfn
21:59hiredmandnolen: I'd check again with regards to (meta #'x) on 1.2
22:00jonabbeyor loop/recur?
22:00amalloyseancorfield: if your multimethod needs a different docstring for each dispatch value, it's not providing a very good abstraction, it seems to me
22:00hiredmanjonabbey: doesn't work for functions that call each other
22:01gfrlog(inc amalloy)
22:01sexpbot⟹ 13
22:01dnolenhiredman: yeah, seems like the likelihood of it happening it soon is low these days ...
22:02jonabbeynice
22:02jonabbey(inc amalloy)
22:02sexpbot⟹ 14
22:02jonabbeyhm, no ampersand or double pound sign required?
22:02amalloyjonabbey: it's not a clojure expression
22:02amalloyjust a command that looks a lot like one
22:03jonabbeyah
22:03gfrlog&(inc amalloy)
22:03sexpbotjava.lang.Exception: Unable to resolve symbol: amalloy in this context
22:03seancorfieldamalloy: well, it was more having the documentation "near" the code it was documenting...
22:03jonabbey(help)
22:03hiredmanclojurebot's help covers more topics
22:03jonabbeythanks
22:03hiredmanhelp?
22:03clojurebothttp://www.khanacademy.org/
22:03gfrlogjonabbey: 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:03amalloyhaha
22:04jonabbeyi assume clojurebot and sexpbot know enough to ignore each other's output?
22:04seancorfieldi'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:04amalloy&(inc 1)
22:04sexpbot⟹ 2
22:04clojurebot⟹ "Returns the metadata of obj, returns nil if there is no metadata."
22:04gfrlog&(println ",(println \"Hey sexpbot\")")
22:04sexpbot⟹ ,(println "Hey sexpbot") nil
22:04seancorfieldso the multimethod gives me a nice clean state machine
22:04gfrlogwait dangit I did it in the wrong direction :(
22:04seancorfieldevent and email status record in; updated email status record out (which i then save back to the DB)
22:04amalloyjonabbey: sexpbot prefixes his output with ⟹ to avoid confusion
22:05jonabbeysmart
22:05gfrlogjonabbey: so if you did what I just did the other way round, sexpbot would respond
22:05gfrlogunless they've updated that
22:05jonabbey,(println "&(println \"Hey clojurebot\")")
22:05clojurebot&(println "Hey clojurebot")
22:05sexpbot⟹ Hey clojurebot nil
22:05jonabbeyheh
22:06jonabbeyso nice to be playing with a lisp again
22:07seancorfieldit's actually kinda nice that i can dispatch off just the event for some events and the event + status for others...
22:09seancorfieldalso 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:10seancorfieldi already loved clojure... but now i *really* love it :)
22:11amalloyhugod: 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:14dnolenseancorfield: nice.
22:17amalloyand lein ritz still depends on my having the sun/oracle jvm rather than openjdk. i can switch, but it seems wrong
22:18cemerickseancorfield: I figured you on the fence. ;-)
22:20hodapphelp... can't... stand... the... C++... any longer...
22:21seancorfieldcemerick: 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:21cemericklikewise :-)
22:22hodapphaving been exposed to Lisp at an early age, I now run into Greenspun's Tenth Rule all the time.
22:24seancorfieldmy first reaction to that was "nonsense!" but then i thought about some of the more complex pieces of software i've written... :|
22:27seancorfieldand 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:37pcavsis there a clojure function to return integer division, that rounds down?
22:43amalloy$findfn 11 5 2
22:43sexpbot[clojure.core/quot clojure.core/unchecked-divide]
22:43amalloypcavs: ^
22:44pcavsyeah, stackoverflowed it, thanks tho!
22:45amalloypcavs: the point is more that you can try $findfn in future. sometimes there's an answer you wouldn't have guessed
22:46pcavshow does it do that anyways? is very cool
22:46pcavsthanks btw
22:46pcavs$findfn 11 5 11/5
22:46sexpbot[clojure.core//]
22:47amalloypcavs: it just tries a bunch of functions
22:47cemerick&*clojure-version*
22:47sexpbot⟹ {:major 1, :minor 2, :incremental 0, :qualifier ""}
22:48cemerickboy, the bots need an upgrade
22:48amalloycemerick: 1.2.1, maybe. 1.3 is just no fun to upgrade to
22:48cemerickunchecked-divide doesn't exist in 1.3 :-)
22:48cemerickamalloy: problem areas?
22:48amalloymissing pieces in contrib, mostly
22:49cemerickyou mean bits from old contrib, right?
22:49amalloyyes
22:49cemerickThey're just waiting for someone to give them a nice home.
22:50hodappblargh, Eclipse is complaining about build path
22:51hodappwhat editors do you guys recommend for OS X?
22:51amalloycemerick: 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:51cemerickone of the least accounted-for side effects of old-contrib's packaging is that people didn't balance library usage against the dependency
22:51cemerickhodapp: Eclipse + ccw here. What problems are you having?
22:52cemerickamalloy: I know, it's a dead-zone over there in new contrib. 0_o
22:52cemerickThe old contrib stuff can just be spun out into a regular old library. It's EPL, have fun.
22:52hodappcemerick: One error is "The project cannot be built until build path errors are resolved"
22:52hodappother is "Unbound classpath container: 'Default System Library' in project 'firstClojureProject'"
22:53hodappwas following along in the "Getting Started" guide but I don't see "Clojure REPL" in the "Run as" menu either
22:53cemerickhodapp: what version of eclipse?
22:53hodappIndigo
22:54cemerickthat's the newest, right?
22:54hodappI believe so
22:55cemerickhodapp: 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:56hodappWell, I see "Default System Library (unbound)"
22:57cemerickThat (unbound) bit is bad. It sounds like Eclipse isn't finding your JDK's installation.
22:57hodappHrmmm.
22:58cemerickLook under Eclipse's main prefs, in Java > Installed JRE's
22:58amalloycemerick: 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:59hodapphuh, "The selected JRE does not support the current compiler compliance level of 1.4"
23:00hodappand it lists none
23:01cemerickhodapp: you're seeing that in the prefs panel?
23:01hodappYeah
23:02hodappThis is such a not-a-Clojure-issue, I shouldn't be here...
23:02cemerickhodapp: that should all Just Work
23:04cemerickamalloy: 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:04sritchieamalloy, 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:05sritchieI 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:05amalloysritchie: 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:05amalloyor. not "broke", but "changed in an incompatible way"
23:05dnolenhodapp: you might wanna try NetBeans 7.0 and Enclojure for the least hassle setup on OS X, IMO.
23:06amalloyi'm on develop, which works but has some extraneous warning messages at the moment
23:06hodappdnolen: noted.
23:06amalloymaybe ninjudd can fix the uncle thing?
23:06hodappI'm not a big fan of Eclipse when things don't Just Work(tm)
23:06sritchieI bet adding uncle to my project.clj would work for now (not long-term, of course)
23:06sritchieI'll try develop
23:07cemerickEnclojure is wanting for maintenance these days. Just FYI.
23:07hodappHrm.
23:07dnolenhodapp: I've tried pretty much everything, and pretty much everything has it's quirks.
23:07dnolencemerick: it works for me, something not work for you?
23:07cemerickdnolen: It has some issues on various NB versions, and Eric is tapped out.
23:08cemerickThere's some great stuff in enclojure, but no one's stepped up to give it the TLC is needs over the long haul.
23:08dnolencemerick: it works on NB 7 well enough to get started. All the Clojure IDE plugins have maintenance issues from what I've seen.
23:09dnolenEmacs being the stark exception.
23:09hodappWhat's the deal with Emacs?
23:09cemerickwha?
23:10technomancydnolen: if you think Emacs doesn't have maintenance issues you probably overestimate my understanding of swank. =)
23:10cemerickEmacs breaks every time the SLIME devs cough AFAICT.
23:10sritchieamalloy, yeah, I'm getting Caused by: java.lang.IllegalAccessError: reload! does not exist on develop
23:10cemerick(despite the deft stylings of technomancy, hugod, et al.)
23:10amalloysritchie: that's a weird one
23:10dnolencemerick: well that shows how much you follow Emacs dev :) we don't track SLIME
23:10technomancywell, these days it's frozen so it's only broken for people who want to use CL...
23:10technomancyand they totally deserve it =P
23:10hodappo_O
23:10sritchieat bake.reload$reload_project_files.invoke(reload.clj:47)
23:11amalloysritchie: cake deps -S maybe?
23:11cemerickah, see, I just get a gestalt from how many people come in with emacs/slime issues :-D
23:11dnolenhodapp: 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:11amalloywill fetch the dependencies using the stable version of cake
23:11technomancycemerick: it's because only the CL users complain
23:11technomancythese days anyway; things were certainly a lot worse ~6 months ago
23:11hodappdnolen: I'll give it a try, despite what I've heard about Netbeans.
23:11dnolenhodapp: JEdit works ok as well.
23:11technomancyor people who found outdated docs
23:12hodappdnolen: REPL?
23:12hodappor just editor?
23:12cemerickSee, hardly anyone comes in complaining about eclipse/ccw…
23:12sritchieamalloy: cool, that worked
23:12technomancybut the swank internals are still mostlty just a black box to me
23:12dnolenit has integrated editing and REPL.
23:12dnolencemerick: I haven't seen anything in it that's any more compelling than Netbeans + Enclojure.
23:13hodappdnolen: Cool, I will give that a try.
23:13cemerickdnolen: I was trolling for a "because no one uses eclipse+ccw" response ;-)
23:13hiredmanthat is an excellent point
23:14cemerickAnd, I agree, though I'm partial to ccw's REPL architecture. I left Enclojure because NetBeans started segfaulting on a daily basis.
23:14dnolenhodapp: 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:14technomancyenclojure has a wicked logo
23:15cemerickA thickey job, that.
23:15technomancyvery nice
23:15hiredmantechnomancy: an evil or morally wrong logo?
23:15dnolenhodapp: Emacs tools and Lein have the lion-share of commits from outsiders it seems to me.
23:15cemerickoutsiders?
23:16hiredmanpeople who didn't actually start the project?
23:16dnolen# people who aren't active maintainers who submit a patch.
23:16cemerickhrm, interesting metric
23:17hiredmanpart of that is technomancy will let you commit to lein if you sneeze loudly and he's in the room
23:17dnolenhiredman: heh true enuf.
23:17technomancyalso because I am secretly hoping to pawn off swank maintainership on anyone who displays interest.
23:17hiredman"you have a pulse, you should be able to commit bugfixes!"
23:17cemerickDoing a `git shortlog -s` on various open source projects is very interesting.
23:18cemericker, `git shortlog -s | wc`
23:18cemerickthe smattering of languages and large libraries I looked at all had < 100 contributors, which I found surprising.
23:18technomancycemerick: what languages?
23:19hiredman"Bagu is my name. Show my code to River Man" has 5 commits on lain
23:19hiredmanlein
23:19technomancyhehe
23:19technomancyhuh; factor is as old as the hills and only has 82 contributors
23:19technomancyFSVO hills
23:20cemerickyeah, that was one of them
23:20cemerickfactor, jruby, clojure, some scheme impl
23:20technomancy104 for jruby; that's surprisingly low.
23:20pcavs$findfn 5 6 false
23:20sexpbot[clojure.core/== clojure.core/identical? clojure.core/isa? clojure.core/= clojure.core/> clojure.core/>= clojure.core/contains? clojure.core/bit-test]
23:20pcavs$findfn 5 5 true
23:20sexpbot[clojure.core/== clojure.core/identical? clojure.core/isa? clojure.core/= clojure.core/>= clojure.core/<=]
23:20cemerickscala as well
23:20technomancy5 for lisp-flavoured-erlang =)
23:21cemerickI was shocked by the size of the scala git repo. Metric tonne of jars in there.
23:22technomancymirah let a couple sneak in too. =(
23:22cemerickA couple is one thing.
23:22cemerickScala has ~30MB for each release AFAICT.
23:22hiredman:(
23:23technomancyeep
23:24technomancyI remember trying to help some poor hadoop-based project get comfortable with git.
23:24technomancytried to attach a patch removing all their jars to a jira issue, and jira refused it because it was too big
23:24technomancythat's when I dropped everything and fled in the other direction
23:25cemerickI 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:26cemericknathanmarz: man of the hour! Congratulations. :-)
23:26nathanmarzcemerick: thanks :)
23:26nathanmarzgonna be rockin the clojure at twitter
23:27ibdknoxawesome :)
23:27cemericknathanmarz: so you'll continue to have free rein?
23:27dnolennathanmarz: wow
23:27cemerickI was wondering if they'd bring the scala hammer down on you or something.
23:27technomancy'bout time they did something to get their searches working right =)
23:27nathanmarznope, we're pretty much operating the same way
23:28nathanmarztotal autonomy with respect to engineering
23:28tbatchelli_woo hoo! Twitter uses clojure!
23:28tbatchelli_nathanmarz: congrats!
23:30pcavsnathanmarz: congrats indeed
23:31nathanmarzour team is still hiring, just in case you guys were wondering :)
23:32cemerickI'm guessing that that's not well-known
23:34amalloycemerick: are you kidding? he just told #clojure - it'll be all over the interwebs by dawn
23:34ibdknoxnathanmarz: If ReadyForZero hadn't scooped me up, I probably would've been knocking on your door :)
23:34technomancyanyone up for some last-minute testing of lein 1.6.1 before I push it out?
23:36amalloynathanmarz: 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:37nathanmarzamalloy: where'd you end up going?
23:37amalloynathanmarz: geni with ninjudd/lancepantz
23:38amalloy(in LA)
23:39technomancyLA felt like a wasteland for hackers when I was there
23:39technomancyI guess there's a Clojure group now?
23:39technomancyI remember driving 40 minutes with a friend to a Ruby meetup in a Starbucks where one other guy showed up.
23:39amalloytechnomancy: yeah, not as large as the sf group, but not way smaller
23:40amalloyhah, ouch
23:40amalloyit was probably a trap set by some python devs
23:40nathanmarzfactual (in LA) is using clojure quite a bit now afaik
23:41amalloynathanmarz: yeah, they host the meetup
23:41technomancywell you know what they say about LA... "There is no life east of PCH."
23:41technomancy(pacific coast highway)
23:42amalloywhich reminds me, i need to talk to ninjudd about giving a presentation on deftype on thursday
23:46pcavsmaybe I should move out to this famed "west coast"
23:46amalloypcavs: there's some good stuff in new york too, isn't there?
23:46nathanmarzcemerick: lol on tweeting that out right now
23:46pcavsamalloy: sadly I wouldn't know, I'm in Boston
23:47cemericknathanmarz: shoulda been a muckraker :-P
23:47technomancyboston has an awesome clojure group!
23:47pcavsbut 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:47pcavstechomancy: really? I should go, but there's nothing up on their meetup
23:48technomancypcavs: well, there have only been two meetings, and I ran one of them
23:48pcavshaha
23:48cemerickWe had ~30 people at a Clojure meetup here in sleepy Northampton, MA.
23:48technomancywow, nice
23:49amalloyi wonder if cemerick is in some parallel universe
23:49technomancyI 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:49cemerickThere's actually a pretty strong undercurrent of old lisp hackers + machine learning types around here. UMass, 5 colleges, etc.
23:49cemerickamalloy: ?
23:50cemericktechnomancy: that, and people are a little lazy ;-)
23:50amalloyit's just impossible that there should be that many clojure hackers in a town described as "sleepy"
23:50cemerickamalloy: not Clojure hackers — programmers of all stripes, interested in a modern, accessible Lisp
23:50technomancycemerick: just set aside a monthly hack night for your own purposes, and start inviting people to co-hack =)
23:50pcavscemerick: if you held a meet up even in Northhampton I'd drive out there
23:50zakwilsonI talked about Clojure to a meeting of a .NET users group.
23:51cemerickThough I know of ~6 local devs that have Clojure in production.
23:52cemericktechnomancy: Don't worry about me, I've been getting developer groups together for almost 10 years now.
23:52pcavsI'd love to host a meet up if I had space and expertise in Clojure besides my dabbling...hmm 0 for 2
23:52cemerickWe had some heavy hitters coming around when I had office space to hold big talks.
23:52technomancypcavs: we meet in a coffee shop
23:52technomancyhappens to be the biggest coffee shop I have ever seen in my life, but it's just a coffee shop. =)
23:53pcavstechnomancy: Haha, perhaps I will do the same
23:53cemerickpcavs: 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:53pcavsI 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:54pcavscemerick: I'm in Boston, but I'm desperate enough to get out there.
23:54ibdknoxspeaking of user groups, anyone going to the bay area clojure meetup thursday?
23:55cemerickpcavs: oh, surely there's stuff going on out there. Boston lispers at the very least?
23:55pcavscemerick: I'm probably not just tapped into the community as much as I could be
23:55tbatchelli_ibdknok: I am going
23:55cemerickpcavs: 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:55cemerick(e.g. *probably* me)
23:56pcavscemerick: yea I was looking forward to that
23:56cemerickThey 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.