2011-07-05
| 00:00 | seancorfield | the new clojure contrib libs work with 1.2 |
| 00:00 | amalloy | seancorfield: i know some of them do, but i'm a little surprised to hear that all of them do |
| 00:01 | seancorfield | it's a requirement: new contrib must support clojure 1.2 |
| 00:01 | amalloy | cool |
| 00:01 | semperos | yeah, I had read that some featured compatibility with both, forgotten frankly |
| 00:01 | seancorfield | i didn't know until i fell foul of it with c.j.j and accidentally made it 1.3 only :( |
| 00:01 | seancorfield | that nice mr bedra corrected me :) |
| 00: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 |
| 00:02 | glitch83 | 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 |
| 00:02 | sean_corfield | time to move to the TV room and kick back |
| 00:02 | glitch83 | any thoughts? |
| 00:03 | semperos | sean_corfield: enjoy, thanks for your feedback |
| 00:03 | technomancy | glitch83: lambdas aren't serializable by default |
| 00:03 | technomancy | you can cheat with this: |
| 00:03 | technomancy | clojurebot: serializable-fn |
| 00:03 | clojurebot | serializable-fn is a hack for preserving source of a compiled function: https://github.com/technomancy/serializable-fn |
| 00:04 | technomancy | that's somewhat half-baked though |
| 00:04 | glitch83 | hm yeah I have thought about the limitations - it's not an easy problem but let me give this a shot |
| 00:06 | glitch83 | This looks sufficient enough for some basics - now I'm thinking how to dynamically load clj files - I assume (load-file <filename>) ? |
| 00:07 | technomancy | glitch83: yup |
| 00:07 | technomancy | you shouldn't use that for your project's source, but for arbitrary files on disk it's fine |
| 00:07 | glitch83 | sweet - I think this is enough :-) thanks all! |
| 00:09 | schnorrer | hi, has anyone had troubles with "lein ring server" and Unicode on web pages (lots of "????????")? |
| 00:09 | schnorrer | a war generated with "lein ring war" works fine if deployed on a 'standalone' jetty |
| 00:11 | schnorrer | looks like it has something to do with misconfiguration of the embedded jetty, but I have no idea how to fix it |
| 00:12 | tomoj | the charset is UTF-8 in both cases? |
| 00:12 | tomoj | but one has garbage that's not actually utf-8? |
| 00:12 | schnorrer | well, the data pulled from DB are definitely utf-8 |
| 00:12 | tomoj | I mean in the http response |
| 00:13 | schnorrer | ah, yes |
| 00:13 | tomoj | no clue then :( |
| 00:13 | schnorrer | sighs |
| 00:13 | tomoj | I don't think I've ever had any of that NOT use utf-8 without me asking |
| 00:15 | hiredman | MacRoman is innocent |
| 00:15 | technomancy | you're getting him confused with Bill Stickers |
| 00:15 | technomancy | http://www.snapbuzz.com/images/resized/Bill_Stickers_is_innocent6956.jpg |
| 00:21 | schnorrer | tomoj: oh, my bad :( 'ring server' indeed returns ISO-8859-1 charset |
| 00:22 | schnorrer | how can I explicitly set the charset anyway? |
| 00:23 | amalloy | schnorrer: add a Content-Encoding header? |
| 00:23 | amalloy | though i'd guess utf8 is the default anyway |
| 00:25 | tomoj | I think you want to add '; charset=utf-8' to the end of your content-type header |
| 00:25 | schnorrer | amalloy: somehow it's not |
| 00: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 |
| 00:30 | tomoj | are you rendering out that meta tag? |
| 00:30 | tomoj | or actually setting the content-type header in your ring response, which somehow comes out as a meta tag instead of a header..? |
| 00:30 | schnorrer | wait |
| 00:31 | schnorrer | I'm rendering it |
| 00:31 | schnorrer | with hiccup's [:meta {:http-equiv "Content-Type" :content "text/html; charset=UTF-8"}] |
| 00:31 | schnorrer | unsurprisingly, it doesn't work |
| 00:32 | amalloy | ew. don't add http-equiv tags if you control the http transport |
| 00:34 | tomoj | schnorrer: do you just return a string now? |
| 00:35 | tomoj | like, maybe you just the output from hiccup directly to ring? |
| 00:35 | tomoj | s/just the/just return the/ |
| 00:36 | schnorrer | tomoj: I return hiccup output to ring |
| 00:37 | tomoj | see hello world in ring readme |
| 00:37 | schnorrer | not directly though (via compojure routes) |
| 00:37 | tomoj | for example of map to return with explicit http headers |
| 00:38 | schnorrer | tomoj: uh-huh, got it |
| 00:39 | tomoj | hmm.. is being able to return a string something compojure adds or is it in ring? |
| 00:39 | tomoj | if in ring, is it a middleware that converts strings to response maps, I wonder..? |
| 00:42 | amalloy | tomoj: i think it's probably compojure |
| 00:43 | amalloy | looks like it's in compojure.reponse$Renderable, at first glance |
| 00:44 | tomoj | what is that $ |
| 00:44 | tomoj | oh found it |
| 00:44 | tomoj | good |
| 00:44 | amalloy | well, i meant to imply an inner class, but i think that was a wrong implication |
| 00:45 | tomoj | kinda bothered me that that would be added to all ring handlers by default when it should be a middleware |
| 00:45 | amalloy | yes. given ring's minimalistic approach it would be very surprising if it included that |
| 00: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? |
| 00:46 | amalloy | schnorrer: yeah, just squeeze a middleware in there somewhere |
| 00:46 | tomoj | see ring.middleware.content-type/wrap-content-type |
| 00:47 | tomoj | eh |
| 00: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 ...))) |
| 00:47 | tomoj | wrap-content-type doesn't add the charset bit, though, does it? |
| 00:48 | amalloy | no, you can't use the one from ring for that. it's only intended for serving static files |
| 00:48 | tomoj | oh you need the extension |
| 00:49 | amalloy | yeah |
| 00:49 | tomoj | what would it do, just add charset to specific detected content types? |
| 00:50 | tomoj | 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 |
| 00:51 | amalloy | too many pronouns. none of those "it"s are clearly bound |
| 00:51 | tomoj | first it is a hypothetical middleware to add utf-8 charset |
| 00:51 | amalloy | k |
| 00:51 | tomoj | second it is text/html in :headers->"Content-Type" |
| 00:52 | amalloy | i'd probably special-case-wrap |
| 00:52 | amalloy | but that may not be a good solution *shrug* |
| 00: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 |
| 00:58 | schnorrer | thank you guys |
| 01:07 | amalloy | schnorrer: probably a good idea to use the middleware anyway rather than trying to configure jetty |
| 01:08 | amalloy | you might want to deploy on tomcat sometime, for example |
| 01:14 | schnorrer | amalloy: most likely, but in this case I'd rather choose the less invasive way |
| 04:26 | schasi | Are there latex templates for clojure presentations? :D |
| 04:27 | hiredman | ( ) you can use these parens |
| 05:13 | Vinzent | Will clojure.lang.IKeywordLookup be turned into a protocol in clojure 1.3? |
| 05:16 | clgv | Vinzent: why do you ask? you can implement java interfaces within clojure easily as well |
| 05:20 | Vinzent | clgv, I have java classes which I can't inherit, so If IKeywordLookup was a protocol, it'd be much easier |
| 05: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) |
| 05: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 |
| 05:24 | clgv | you can also implement interfaces in defrecord or deftype. |
| 05:25 | clgv | I enhanced one of my deftypes to support metadata by implementing withMeta and meta from clojure.lang.IObj |
| 05:26 | Vinzent | clgv, no, I need to make keyword lookup support in existing java classes |
| 05:27 | clgv | Vinzent: so you have an existing java class that the evil programmer made final and you want it to implement IKeywordLookup? |
| 05:27 | Vinzent | clgv, exactly |
| 05:27 | clgv | Vinzent: well, IKeywordLookup being a protocol wouldnt change that much afaik |
| 05:28 | bsteuber | clgv: yes it would :) |
| 05:29 | Vinzent | clgv, why? I'd just write (extend-protocol IKeywordLookup MyClass ...) and that'll do the job |
| 05:29 | clgv | ah ok, so there is clojure dispatch via defprotocol in place then. point taken |
| 05: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 |
| 05:31 | Vinzent | bsteuber, so you was writing (get Bean :value)? |
| 05:32 | bsteuber | yes, but most of the time I need setters anyways |
| 05:32 | bsteuber | it# |
| 05:32 | bsteuber | s for a swing wrapper |
| 05: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 |
| 05:33 | clgv | s/worse/bad/ |
| 05: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 |
| 05:33 | bsteuber | so I made a function make that can be called like (make JButton :text "Foo" :on-click #(bar)) |
| 05:34 | Vinzent | bsteuber, ok, I'm writing SWT wrapper :) but (get ...) thing isn't much better that (.getValue ...) and non-idiomatic anyway |
| 05:34 | bsteuber | ^^ |
| 05:34 | bsteuber | yes, true |
| 05:34 | bsteuber | first I used proxies to implement IDeref |
| 05:35 | bsteuber | that looks much nicer, but I ran into weird bytecode incompability issues on some platforms |
| 05:35 | Vinzent | clgv, yes, there is a huge amount of classes... |
| 05:35 | clgv | Vinzent: do they share a a common interface that is used for the lookup? |
| 05:37 | Vinzent | bsteuber, deref? and what it looks like? @(element :value)? |
| 05:38 | bsteuber | more like @my-combo-box which gives the selected value |
| 05:38 | bsteuber | but of course sometimes there's more than one "value" connected to a widget" |
| 05:38 | Vinzent | clgv, hm, I don't think so, but let me sure... |
| 05:40 | Vinzent | bsteuber, oh, got it. But anyway it's very handy for such special cases, I need to implement it also! |
| 05:40 | bsteuber | ^^ |
| 05:40 | bsteuber | but actually I think IDeref isn't meant to be implemented by "users" |
| 05:41 | bsteuber | because it implies some concurrency guarantees |
| 05:41 | bsteuber | I guess another, cumbersome thing you could do |
| 05:41 | bsteuber | would be using one defrecord per class you want to wrap |
| 05:42 | bsteuber | offering the clojure-interface and holding the actual widget |
| 05:42 | bsteuber | of course you'll need heavy macrology.. |
| 05:42 | bsteuber | and reflection |
| 05:43 | bsteuber | well maybe deftype, as you need your own ILookup implementation |
| 05:44 | Vinzent | Looks like this is the only way... |
| 05:48 | bsteuber | or you could fork clojure and make ILookup etc. protocols xD |
| 05:48 | bsteuber | maybe I would even use your version :) |
| 05:54 | Vinzent | That could be more elegant solution :) But I believe there is some serious difficulties that prevented Rich to do it himself |
| 05:56 | peteriserins | if I have a list as a string, say, "(a\n(b (c d)))", can I obtain a representation in clojure? |
| 05:56 | tomoj | $findfn "(a\n(b (c d)))" '(a (b (c d))) |
| 05:56 | sexpbot | [clojure.core/read-string] |
| 05:57 | peteriserins | thanks |
| 06:13 | bsteuber | Vinzent: I believe the main reason is performance - like for almost everything that happens or doesn't happen to clojure these days |
| 06:16 | Vinzent | bsteuber, but protocols have nearly the same perfomance characteristics as interfaces, isn't it? |
| 06:18 | Vinzent | well, maybe not "nearly the same", but still good. And anyway a little perfomance penalty is a reasonable fee for the capabilities of protocols |
| 06: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 |
| 06:20 | bsteuber | but one should think that what's good enough for clojure libraries should be good enough for the clojure API, too |
| 06: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 |
| 06:21 | schnorrer | this could explain the weird behavior duality |
| 06:21 | schnorrer | ring hello world app screws up unicode, too |
| 06:22 | schnorrer | seemingly for the same reason |
| 06:22 | Vinzent | yeah, that's true |
| 06: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. |
| 06:35 | clgv | "clean project" is the one from eclipse and should only delete the content of bin folders. lein deps is not called |
| 06:44 | peteriserins | $findfn "([ ])" '("[" "]") |
| 06:44 | sexpbot | [] |
| 07:06 | peteriserins | How to put quotes around all [^ ()]+ in a string? |
| 07:10 | peteriserins | nevermind, I think (.replaceAll (re-matcher #"([^ ()]+)" "(This is a (test))") "\"$0\"") does the trick |
| 07:10 | clgv | lets check: ##(.replaceAll (re-matcher #"([^ ()]+)" "(This is a (test))") "\"$0\"") |
| 07:10 | sexpbot | ⟹ "(\"This\" \"is\" \"a\" (\"test\"))" |
| 07:11 | bsteuber | ,(clojure.string/replace "([])" #"[^()]" #(str "\"" % "\"")) |
| 07:11 | clojurebot | java.lang.ClassNotFoundException: clojure.string |
| 07:11 | bsteuber | ,(require 'clojure.string) |
| 07:11 | clojurebot | nil |
| 07:11 | bsteuber | ,(clojure.string/replace "([])" #"[^()]" #(str "\"" % "\"")) |
| 07:11 | clojurebot | "(\"[\"\"]\")" |
| 07:12 | bsteuber | ah the + is missing |
| 07:13 | bsteuber | but I guess clojure.string/replace is more idiomatic than using Java |
| 07:15 | peteriserins | actually the regex needs fixing. [^()\s] I suppose |
| 07:16 | peteriserins | (with the +) |
| 07:24 | peteriserins | how to properly include the replace function? |
| 07:25 | peteriserins | I am using (:use [clojure.string :only (replace)])) |
| 07:25 | peteriserins | in my ns declaration |
| 07:26 | peteriserins | it gives me an illegal state exception as I reload it in the repl |
| 07:28 | clgv | peteriserins: you might use (:require [clojure.string :as str]) and the use (str/replace ...) |
| 07:28 | bsteuber | (:use [clojure.string :only [replace]]) |
| 07:28 | bsteuber | so square brackets |
| 07:29 | bsteuber | of course, require is possible, too |
| 07:29 | clgv | bsteuber: uh! what do these square brackets change concerned with :only? |
| 07:30 | clgv | I only knew the list version |
| 07:31 | bsteuber | clgv: hmm, doesn't seem to make a difference at all |
| 07:31 | clgv | bsteuber: lol. k;) |
| 07:31 | bsteuber | but in general, always use () when the first element of the list is special |
| 07:31 | bsteuber | and [] if all are "same" |
| 07:31 | bsteuber | so :only (foo bar) is bad style |
| 07:32 | ejackson | bsteuber: ha! that's a nice heuristic, thanks. |
| 07:32 | bsteuber | as well as (:use [clojure repl string]) - here "clojure" is special |
| 07:33 | bsteuber | so always write (:use (clojure repl string)) |
| 07:33 | clgv | bsteuber: yes thats a different semantic. didn know it was supported until some weeks ago |
| 07:35 | clgv | 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 |
| 07:40 | bsteuber | ^^ |
| 07:40 | bsteuber | clgv: I don't understand where the contradiction is |
| 07:41 | bsteuber | :use would allow both [] and () for this, but () is more idiomatic due to the heuristics |
| 07: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 ;) |
| 07:42 | bsteuber | but :use defines the same semantics for () and [], so I do have a choice |
| 07:43 | clgv | bsteuber: oh right. my error. I wouldnt allow it, if I defined :use |
| 07:44 | clgv | in this case I would enforce the "() vs []" rule to be able to give more specific errors |
| 07:45 | bsteuber | yes, me too :) |
| 07:45 | clgv | I assumed they did so ;) |
| 07:47 | bsteuber | peteriserins: btw, the illegalstateexception occurs when you already use'd the exact same var from your namespace |
| 08:09 | peteriserins | bsteuber: what I am doing is, I am using a file and the REPL |
| 08:09 | peteriserins | bsteuber: and I wrote a (reload) function to load-the-appropriate-file |
| 08:12 | bsteuber | peteriserins: so probably restarting the repl will get rid of the problem |
| 08:13 | bsteuber | huh, I can't call future when using leiningen 1.6.0 |
| 08:13 | bsteuber | always throws a RejectedExecutionException |
| 08:13 | peteriserins | bsteuber: it doesn't |
| 08:14 | bsteuber | did anyone else try lein 1.6.0 yet? |
| 08:17 | bsteuber | peteriserins: maybe you should switch to an ide instead of loading files yourself from the repl |
| 08:17 | bsteuber | not sure how to do this correctly |
| 08:18 | peteriserins | bsteuber: I'm using Vim |
| 08:18 | bsteuber | ah good |
| 08:18 | bsteuber | though I'm more an emacs guy :) |
| 08:28 | clgv | bsteuber: huh? I just considered upgrading lein... maybe I should wait a bit... :/ |
| 08:29 | bsteuber | clgv: well, as long as noone confirms the same problem, it could be just some weirdness on my machine |
| 08:29 | clgv | I don't dare to try to confirm it ;) |
| 08:29 | bsteuber | though java -jar clojure-1.2.1.jar works fine |
| 08:29 | bsteuber | ^^ |
| 08:32 | clgv | did anyone try a clojure.walk-like implementation using multimethods? |
| 09:14 | bsteuber | clgv: I now downgraded to lein 1.5.2 and it works fine again |
| 09:14 | bsteuber | so probably good to be careful |
| 09:16 | bsteuber | did that by symlinking to my lein checkout of tag 1.5.2 |
| 09:16 | clgv | ok, I didn't read of any improvement that encourages me to upgrade anyway. I just wanted to do it for maintenance ;) |
| 09:17 | bsteuber | I like the user.clj support for auto-using clojure.repl and clojure.java.javadoc in my user-ns |
| 09:17 | bsteuber | as I do that all the time |
| 09:31 | clgv | you use lein repl? |
| 09:38 | bsteuber | no usally swank |
| 09:40 | clgv | hmm how do you profit from the user.clj then? |
| 09:46 | jcromartie | It's sad that "build ___ with ZERO code!" is considered a great selling point in the .NET world |
| 09:46 | jcromartie | I rather like to code... |
| 09:48 | bsteuber | clgv: slime-connect also puts me in the user namespace |
| 09:49 | clgv | jcromartie: you mean click&drag GUIs? |
| 09:49 | mlimotte | jcromartie: or complicated config files, which are like learning a new language |
| 09:52 | clgv | mlimotte: you mean XAML? that's in fact another language ;) |
| 09:52 | clgv | mlimotte: probably not turing complete, though ;) |
| 09:57 | jcromartie | mostly the drag-and-derp variety |
| 09: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 | jcromartie | 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 | clgv | ;) |
| 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 | jcromartie | 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 | jcromartie | 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 | jcromartie | and even if it's just a simple collection type, it can't just be simply serialized |
| 10:09 | jcromartie | 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 | jcromartie | but I do |
| 10:15 | jcromartie | 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 | jcromartie | 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 | clgv | 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 | bsteuber | 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 | hugod | 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 | cemerick | 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 | cemerick | 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 | cemerick | hugod: but no, not intentional |
| 11:08 | cemerick | The interop state of mind has obviously tinged the whole endeavor. |
| 11:08 | cemerick | clgv: good point |
| 11:09 | cemerick | 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 | bsteuber | 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 | clgv | 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 | cemerick | the release process is entirely automatic; twiddling the version number to be non-SNAPSHOT doesn't actually push releases through, tho |
| 11:56 | cemerick | (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 | 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 | chouser | 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 | chouser | 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 | cemerick | 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 | cemerick | 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 | cemerick | 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 | cemerick | 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 | bsteuber | technomancy: btw swank works for me without updating swank-clojure |
| 12:35 | bsteuber | 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 | bpr | ,(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 | chouser | 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 | bpr | hiredman: yeah, it's a one-off though |
| 12:58 | chouser | hiredman: class literals in general have a problem? |
| 12:59 | chouser | 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 | chouser | 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 | amalloy | or something of that sort |
| 13:05 | chouser | yikes |
| 13:05 | chouser | 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 | sexpbot | http://clojure02.managed.contegix.com/display/design/defrecord+improvements |
| 13:07 | amalloy | hm. no dice |
| 13:07 | chouser | hiredman: exactly |
| 13:07 | chouser | (defmacro mycase [& args] (cons `case (map #(get {:my/bytes (clojure.lang.RT/classForName "[B")} % %) args))) |
| 13:08 | chouser | (mycase (type (byte-array 0)) :my/bytes :foundbytes) |
| 13:08 | chouser | 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 | chouser | 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 | rindolf | 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 | hiredman | 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 | hiredman | 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 | hiredman | 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 | hiredman | the clojure compiler turns constant references (not just ^:const, but things like 1 or :foo) into static fields |
| 14:50 | hiredman | 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 | cmbntr_ | 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 | cmbntr_ | 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 | technomancy | 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 | 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: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 | technomancy | I am |
| 18:22 | ibdknox | The only problem is the cost |
| 18:22 | ibdknox | compared to EC2 it's quite expensive |
| 18:22 | ibdknox | hard to beat the workflow though :) |
| 18:24 | Ramblurr | anyone familiar with sandbar and its auth functions? |
| 18:25 | Ramblurr | 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 | ibdknox | or rather, something else you want to use it with |
| 18:37 | cemerick | maven builds |
| 18:37 | cemerick | I've got my own beanstalk lib, but it's not as complete as what lein-beanstalk has in it |
| 18:38 | cemerick | 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 | ibdknox | 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 | ibdknox | 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 | livingston | 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 | lucian | 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 | gfrlog | do protocol method signatures include this? |
| 19:04 | amalloy | gfrlog: yes |
| 19:04 | amalloy | 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 | sexpbot | 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 | amalloy | 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 | jsnikeris | 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 | gfrlog | ^ 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 | gfrlog | I think the only thing wrong with that version is it fails for strings shorter than the prefix |
| 19:12 | gfrlog | 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 | wilfredh | (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 | ibdknox | is simply asserts that the value is true |
| 19:15 | gfrlog | ah probably |
| 19:15 | gfrlog | ,(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 | gfrlog | 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 | ibdknox | 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 | gfrlog | $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 | ibdknox | completely unrelated |
| 19:28 | ibdknox | I wrote a clojure starter pack for the google ai challenge |
| 19:28 | ibdknox | 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 | ibdknox | the contest has not officially begun yet |
| 19:41 | ibdknox | 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 | ibdknox | 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 | cemerick | ibdknox: war exporting? |
| 19:45 | ibdknox | yeah |
| 19:46 | ibdknox | 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 | ibdknox | 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 | ibdknox | well none of this is too bad :-p |
| 19:48 | ibdknox | 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 | ibdknox | as well as the default servlet stuff |
| 19:49 | ibdknox | 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 | ibdknox | 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 | ibdknox | why not just write a python script that exports the data you need in a manageable format |
| 19:51 | ibdknox | json or something |
| 19:51 | ibdknox | and then read that from clojure |
| 19:51 | carlo_au | ibdknox: no, I just need to call a few functions |
| 19:51 | carlo_au | 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 | ibdknox | 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 | ibdknox | and as somewhat of a testament to that, I've managed to avoid learning about them for now |
| 19:57 | ibdknox | 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 | cemerick | 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 | ibdknox | I get what you're saying though |
| 20:00 | ibdknox | there's a wealth of stuff already written for you there |
| 20:01 | ibdknox | 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 | gfrlog | 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 | amalloy | 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 | gfrlog | %s/size/cardinality/g |
| 20:05 | amalloy | gfrlog: just name it size-me-up |
| 20:06 | gfrlog | ha |
| 20:06 | ibdknox | haha |
| 20:06 | ibdknox | 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 | seancorfield | 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 | hiredman | (ns-unmap *ns* 'name) should clear it out |
| 20:34 | seancorfield | ouch... ok, at least i'm not going crazy |
| 20:35 | seancorfield | 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 | technomancy | so recompiling works |
| 20:36 | seancorfield | ah, nice trick! |
| 20:37 | seancorfield | 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 | seancorfield | i guess i just need to make my dispatch function smarter... |
| 20:39 | seancorfield | 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 | gfrlog | 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 | gfrlog | ,:-D |
| 21:11 | clojurebot | :-D |
| 21:12 | brehaut | gfrlog: mapcat and for are isomorphic |
| 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 | brehaut | 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 | derp__ | 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 | brehaut | 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 | amalloy | &(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 | brehaut | :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 | gfrlog | ,(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 | brehaut | and now, back to work |
| 21:22 | gfrlog | :) |
| 21:22 | gfrlog | $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 | amalloy | 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 | amalloy | 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 | hiredman | amalloy: it just means instructions can result in more than one value being pushed to the stack |
| 21:28 | hiredman | 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 | amalloy | oh, neat blog. thanks for the ink |
| 21:31 | amalloy | *link |
| 21:32 | hiredman | amalloy: 1 |
| 21:32 | hiredman | 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 | sexpbot | 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 | hiredman | if only rose was given a free hand |
| 21:40 | hiredman | 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 | jonabbey | 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 | jonabbey | i've been reading a couple of the clojure books, but i haven't gotten my toes wet with it yet |
| 21:47 | jonabbey | i'm just sick of java the language |
| 21:47 | jonabbey | and it's lack of higher order functions, closures, etc. |
| 21:48 | jonabbey | 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 | jonabbey | 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 | hiredman | 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 | seancorfield | 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 | seancorfield | 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 | pcavs | 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 | pcavs | so how do I throw the metadata onto the var? |
| 21:55 | pcavs | dnolen: well (meta 'x) doesn't work either .... O.o |
| 21:55 | pcavs | 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 | hiredman | 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:02 | jonabbey | nice |
| 22:02 | jonabbey | (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 | amalloy | 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 | 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 | gfrlog | 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 | jonabbey | 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 | seancorfield | 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 | seancorfield | 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 | seancorfield | 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 | pcavs | thanks btw |
| 22:46 | pcavs | $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 | cemerick | 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 | hodapp | 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 | cemerick | hodapp: Eclipse + ccw here. What problems are you having? |
| 22:52 | cemerick | amalloy: I know, it's a dead-zone over there in new contrib. 0_o |
| 22:52 | cemerick | 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 | hodapp | other is "Unbound classpath container: 'Default System Library' in project 'firstClojureProject'" |
| 22:53 | hodapp | 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: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 | hodapp | and it lists none |
| 23:01 | cemerick | hodapp: you're seeing that in the prefs panel? |
| 23:01 | hodapp | Yeah |
| 23:02 | hodapp | This is such a not-a-Clojure-issue, I shouldn't be here... |
| 23:02 | cemerick | hodapp: that should all Just Work |
| 23:04 | cemerick | 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 | sritchie | 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 | amalloy | 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 | sritchie | 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 | dnolen | 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 | cemerick | 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 | dnolen | 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 | technomancy | 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 | technomancy | these days anyway; things were certainly a lot worse ~6 months ago |
| 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 | hodapp | or just editor? |
| 23:12 | cemerick | See, hardly anyone comes in complaining about eclipse/ccw… |
| 23:12 | sritchie | amalloy: cool, that worked |
| 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 | dnolen | 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 | cemerick | er, `git shortlog -s | wc` |
| 23:18 | cemerick | 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 | hiredman | lein |
| 23:19 | technomancy | hehe |
| 23:19 | technomancy | huh; factor is as old as the hills and only has 82 contributors |
| 23:19 | technomancy | FSVO hills |
| 23:20 | cemerick | yeah, that was one of them |
| 23:20 | cemerick | 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 | cemerick | Scala has ~30MB for each release AFAICT. |
| 23:22 | hiredman | :( |
| 23:23 | technomancy | eep |
| 23:24 | technomancy | I remember trying to help some poor hadoop-based project get comfortable with git. |
| 23:24 | technomancy | tried to attach a patch removing all their jars to a jira issue, and jira refused it because it was too big |
| 23:24 | technomancy | 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 | cemerick | nathanmarz: man of the hour! Congratulations. :-) |
| 23:26 | nathanmarz | cemerick: thanks :) |
| 23:26 | nathanmarz | 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 | nathanmarz | total autonomy with respect to engineering |
| 23:28 | tbatchelli_ | woo hoo! Twitter uses clojure! |
| 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 | amalloy | (in LA) |
| 23:39 | technomancy | LA felt like a wasteland for hackers when I was there |
| 23:39 | technomancy | I guess there's a Clojure group now? |
| 23:39 | technomancy | 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 | amalloy | hah, ouch |
| 23:40 | amalloy | 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 | technomancy | (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 | pcavs | 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 | 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 | cemerick | amalloy: ? |
| 23:50 | cemerick | 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 | cemerick | 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 | technomancy | 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 | pcavs | 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 | cemerick | (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. |