2012-09-29
| 01:41 | mpan | technomancy: I seem to have stumbled upon a picture of you wearing keyboard pants |
| 01:41 | mpan | that's pretty impressive |
| 03:00 | kral | namaste |
| 03:01 | ThorZaINtedwisp | kral, do you play StarCraft? |
| 03:02 | kral | McChousuke: ehmmm... no. :) |
| 03:06 | mpan | What's the recommended way to encapsulate concurrent access to something mutable? e.g. instance of java.util.Random |
| 03:08 | augustl | mpan: locks afaik |
| 03:09 | mpan | like, the ones java has? |
| 03:09 | mpan | and use them through interop? |
| 03:13 | Apage43 | you may find locking useful; http://clojuredocs.org/clojure_core/clojure.core/locking |
| 03:15 | Apage43 | that is, if the caller actually needs the result. If you just need a thing to have stuff happen to it, but don't synchronously need an answer, and you want to serialize those requests, an agent wraps that up nicely |
| 03:30 | ChongLi | king in the north! |
| 07:28 | mindbender1 | ,(type {"set of members in #clojure}) |
| 07:28 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading string> |
| 07:28 | mindbender1 | ,(type {"set of members in #clojure"}) |
| 07:28 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Map literal must contain an even number of forms> |
| 07:28 | mindbender1 | ,(type #{"set of members in #clojure"}) |
| 07:28 | clojurebot | clojure.lang.PersistentHashSet |
| 09:58 | benny__ | is there any special magic involved when parsing xml with clojure data.xml? parsing the HN feed at http://news.ycombinator.com/rss just fails with aclaim that </link> is wrongly positioned |
| 09:58 | benny__ | its perfectly parsable with domdocument in php though for example |
| 10:10 | casion | benny__: I have been messing with clojure.data.xml all morning and most of last evening, and it seems to choke on a lot of stuff |
| 10:10 | casion | clojure.xml seems to parse most anything fine, clojure.xml/emit is a bit odd though |
| 10:10 | benny__ | casion, that sucks :( any alternative? there seems to be something clojure.xml/clojure.zip and clojure.zip-filter |
| 10:10 | casion | benny__: that's what I'm using |
| 10:11 | benny__ | is there a good introduction for cloojure.xml? i cant make sense out of clojuredocs.org - very unhelpful imho:( |
| 10:11 | casion | clojure.xml/parse, clojure.zip/xml-zip, then clojure.data.zip.xml/xml-> to navigate |
| 10:12 | casion | benny__: yeah, I had the same problem, foks here just sorted me out yesterday… maybe I can help you |
| 10:14 | casion | how I'm doing things right now is something like (def xml-zipper (clojure.zip/xml-zip (clojure.xml/parse some-input-stream))), then (clojure.data.zip.xml/xml-> xml-zipper :Sometag :someothertag (clojure.data.zip.xml/attr :attrname)) |
| 10:15 | benny__ | will check it out, thanks |
| 10:15 | casion | https://github.com/clojure/data.zip/ is the relevant info for clojure.data.zip |
| 10:15 | casion | and note, you don't have to navigate the root elemet when using xml->, that tripped me up and it seems to have been a stumbling block for some other people as well |
| 10:15 | clojurebot | min people is 5 |
| 10:16 | benny__ | what dependencies do i need in the project.clj? |
| 10:16 | casion | just [org.clojure/data.zip "0.1.1"] |
| 10:16 | casion | and whatever else is needed for the rest of your project |
| 10:18 | casion | I really don't get why clojure.data.xml won't parse some things, if I try stax directly most of them are parsed fine |
| 10:18 | casion | but it stilll fails on others that clojure.xml/parse works with |
| 10:24 | benny__ | i cant seem to find a single rss feed that can be parsed |
| 10:24 | benny__ | hn, cnn, spiegel.de, all throw errors |
| 10:25 | casion | give me a feed, I'll try one |
| 10:25 | benny__ | http://rss.cnn.com/rss/edition.rss |
| 10:26 | benny__ | my sample code is http://pastie.org/4860703 |
| 10:26 | benny__ | printing the xml, not sure it shows everything, maybe i dont read the full xml stream |
| 10:27 | benny__ | a feed def would be, (def feed {:id 1 :topic "http://rss.cnn.com/rss/edition.rss"}) |
| 10:28 | benny__ | i didnt think that xml parsing would be such a hard, when picking this for my "learn clojure" journey :p |
| 10:30 | benny__ | ah that waas it, (http/await resp) required |
| 10:30 | casion | works fine for me here |
| 10:30 | benny__ | i use the async http client and just stuff only a small percentage of the xml string into the parser |
| 10:30 | casion | but I just did (clojure.xml/parse (.openStream (java.net.URL. "http://rss.cnn.com/rss/edition.rss"))) |
| 10:30 | benny__ | stupid :) |
| 10:33 | benny__ | ok now it looks good |
| 10:33 | benny__ | casion, thanks for listending and trying :) |
| 10:33 | casion | sure :) |
| 10:37 | benny__ | its really annoying that the api changed so much, and you only find outdated examples on google :( |
| 10:37 | casion | I completely agree |
| 10:37 | casion | I'm going to write a blog post on how I dealt with this stuff once I feel I have a proper handle |
| 10:37 | casion | on it |
| 10:38 | casion | I have reading it down pretty well I think, but right now I'm struggling with writing valid xml now |
| 10:41 | benny__ | what are you using to print xml? |
| 10:41 | benny__ | prxml is deprecated? |
| 10:42 | casion | no clue yet |
| 10:42 | casion | I've yet to find something that works correctly |
| 10:42 | casion | clojure.xml/emit sort of works… sometimes |
| 10:46 | benny__ | ah it renders, ole :) |
| 10:46 | benny__ | maybe thats enough for me |
| 11:20 | dlitvak | hey guys, i have a noobish question |
| 11:20 | dlitvak | im creating a pet project for learning clojure... and i have something i want to refactor but i dont know how |
| 11:21 | dlitvak | i'm creating a little templating engine and i have something like the following |
| 11:21 | dlitvak | (tag "p" "some content" (list {:name "class" :value "foo"})) |
| 11:22 | dlitvak | which renders to: "<p class='foo'>some content</p> |
| 11:22 | dlitvak | " |
| 11:22 | dlitvak | that works good |
| 11:22 | dlitvak | but... i want to be able to change the attribute list to something like... |
| 11:23 | dlitvak | (tag "p" "some content" {:class "foo"}) |
| 11:23 | dlitvak | the following gist is the code im using for rendering |
| 11:24 | dlitvak | https://gist.github.com/bd3b8fe4bc3bfe905268 |
| 11:27 | dlitvak | how can i get the key-value pair? |
| 11:27 | edlothiol | ,(map (fn [[k v]] (str k "=" v)) {:class "foo" :id "bar"}) |
| 11:27 | clojurebot | (":class=foo" ":id=bar") |
| 11:27 | dlitvak | awesome! |
| 11:27 | dlitvak | thx |
| 11:28 | sunkencityryleh | If I use binding to bind some value in a function that then calls a bunch of other functions, is that binding on the stack or in the thread? |
| 11:29 | sunkencityryleh | hm, it's per thread I see now |
| 11:49 | djanatyn | I've been reading on lisp, and I really liked the first section on closures |
| 11:50 | djanatyn | in common lisp, we can do this, because of lexical binding: (let ((x 0)) (defun counter () x) (defun tick () (incf x))) |
| 11:50 | djanatyn | then we could get the value with (coutner) and increase the value with (tick). they hada their own tiny little shared state |
| 11:51 | djanatyn | I tried to do this is clojure: (let [x (atom 0)] (defn counter [] x) (defn tick [] (swap! x #(+ % 1)))) |
| 11:51 | djanatyn | but it looks like I can't call (counter) or (tick) outside of that let binding. |
| 11:52 | chouser | works for me |
| 11:52 | djanatyn | :O |
| 11:52 | djanatyn | d'oh -_- |
| 11:52 | djanatyn | in my REPL, I wasn't in the right namespace ;) |
| 11:52 | chouser | ah :-) |
| 11:52 | djanatyn | anyway, cool! I'm learning stuff from "On Lisp" that I can use when I'm writing clojure |
| 11:53 | chouser | btw, clojure has a fn named inc that you can use instead of #(+ % 1) |
| 11:53 | djanatyn | is there anything I should keep in mind about differences between common lisp's scope and clojure's scope? |
| 11:53 | djanatyn | oh, thank you. |
| 11:53 | chouser | I love "on lisp", and especially it's treatment of macros carries over pretty well |
| 11:56 | casion | chouser: since you seem to have written clojure.data.zip, how would you suggest rendering/writing the xml zipper after mutating it |
| 11:59 | casion | clojure.xml/emit seems to be not printing character entities correctly (e.g. " is printing as "), and clojure.data.xml seems to choke on most xml |
| 12:10 | chouser | djanatyn: the main difference of course is on lisp makes no attempt to avoid mutation |
| 12:13 | octagon | hi, i have a record type in cljs, say Foo. if x is an instance of Foo, is it generally correct to test for this by doing (= (type x) my-ns/Foo) |
| 12:13 | chouser | casion: that's the main weakness with data.zip |
| 12:14 | chouser | You can only update one of the results. If you update more than one, you'd have to merge them somehow -- probably not worth it. |
| 12:14 | casion | chouser: any suggestions on dealing with it? clojure.data.xml isn't throwing exceptions on most everything I try to emit :( |
| 12:15 | casion | with data that clojure.xml/emit returns fine, other than the aforementioned issue |
| 12:19 | chouser | I don't think I understand |
| 12:19 | chouser | you've got input data that clojure.xml/emit accpets, but you haven't yet figured out any way to get data.xml to use it? |
| 12:20 | casion | chouser: yes |
| 12:20 | TimMc | aaahhhhhhh wtf |
| 12:20 | TimMc | Clearly I don't understand Swing threads. |
| 12:20 | chouser | TimMc: the main thing to understand is that There can be only one. :-P |
| 12:22 | TimMc | chouser: Yeah, and I'm calling (SwingUtilities/invokeLater #(...)) from another thread, but it's just calling it right away! |
| 12:22 | TimMc | https://gist.github.com/3804489 |
| 12:22 | chouser | casion: data.xml has changed quite a bit since I last touched it. Looks like there are actual docs now. |
| 12:23 | TimMc | I suppose it is possible that the "Game loop" thread has called this fn before the AWT exists or has anything else on it... |
| 12:25 | chouser | casion: ignore what I said about mutation. I was thinking of a different lib (data.zip/xml) |
| 12:25 | casion | chouser: that comment was useful, since I'm running into an issue there too :| |
| 12:26 | chouser | casion: you're mimicking the examples at https://github.com/clojure/data.xml ? |
| 12:26 | casion | chouser: yes I am |
| 12:26 | chouser | And you're getting NPEs |
| 12:27 | chouser | heh, yeah, almost none of my code is left in there. Probably just the part that's breaking for you. |
| 12:28 | casion | the direct examples there work, but when I start working with my own xml that clojure.xml parses and emits fine, data.xml starts giving XMLStreamExceptions |
| 12:28 | chouser | the emit side is just a wrapper around XMLStreamWriter. |
| 12:28 | chouser | casion: I can probably look at a stack trace, if you have one, before I have to go. |
| 12:29 | casion | I don't have one at the moment |
| 12:29 | casion | but you've given me some insight |
| 12:29 | casion | thank you |
| 12:31 | unic0rn | i'm just learning when it comes to clojure, but i want to code a photo processing tool in it, and the question is, what should i be aware of when it comes to number crunching performance? which data structure will be the best for such thing, java arrays? |
| 12:33 | casion | unic0rn: you want to write it yourself? ImageJ is a very good library for such things |
| 12:33 | unic0rn | casion: yes, i want to write it myself. |
| 12:34 | unic0rn | custom thing entirely. local contrast enhancement, with my own tweaks. |
| 12:35 | casion | you'll be working with byte[] almost entirely, and in my experience it's best to stay there |
| 12:38 | sexpGirl | Wouldn't a Java wrapper around "the real thing" like ImageMagick or GraphicsMagick be better than the "pure Java" ImageJ? (GraphicsMagick is a fork of ImageMagick and is used by sites like Flickr so...) |
| 12:40 | casion | I found ij very easy to use from clojure |
| 12:40 | octagon | is there a way in cljs to have a type that can implement protocols, is immutable like defrecord, but does not provide a persistent map implementation? |
| 12:41 | sexpGirl | casion: looks convenient indeed seen that it's 100% Java (not external deps)... The wrappers around ImageMagick / GraphicsMagick are good too but you're "stuck" with the fact that it's non-native so you need to install non Java stuff ; ( |
| 12:41 | octagon | i am wanting to create a record but provide my own implementation of ICounted, for instance |
| 12:41 | casion | only issue was occasionally having to deal with type promotion |
| 12:42 | casion | which seems to be unavoidable when using java a/v libs from clojure :( |
| 12:42 | casion | unchecked-int everywhere! |
| 13:16 | bonega | So what is everybody using for painting in Clojurescript? Just plain gclosure? |
| 13:19 | prokii | Is anyone using the clojurescript one method for web development? |
| 13:27 | gfredericks | bonega: painting like canvas, not SVG? |
| 13:29 | jonasen | cemerick: Where's the best place to ask questions about sjacket? I assume cgrand is the only one who really know how it's suppposed to work.. but he's not on IRC. Maybe the clojure-tools mailing list? |
| 13:31 | cemerick | jonasen: Yeah, he's on there. |
| 13:32 | cemerick | jonasen: BTW, I've since discovered that it's possible to get cljx to emit the metadata associated with the munged forms, which includes line numbers. Unfortunately, that line number metadata is squashed by the reader :-x |
| 13:33 | cemerick | Working on a patch to Clojure now that will fix that, but 50/50 shot of it getting in probably. |
| 13:34 | xeqi | I'll take the under |
| 13:36 | bonega | gfredericks: canvas |
| 13:37 | gfredericks | I used one of the cljs libs for a bit; it was somewhat raw but better than gclosure maybe |
| 13:37 | gfredericks | I switched to SVG before too long because that's what I really needed anyhow |
| 13:38 | jonasen | cemerick: Which issue is that? JIRA link? I ran into http://dev.clojure.org/jira/browse/CLJ-916 while working on kibit which will be fixed in 1.5 |
| 13:39 | cemerick | jonasen: I haven't filed the ticket yet. In short: |
| 13:39 | cemerick | ,(meta (read (clojure.lang.LineNumberingPushbackReader. (java.io.StringReader. "^{:line 66} ()")))) |
| 13:39 | clojurebot | {:line 1} |
| 13:40 | cemerick | vs. |
| 13:40 | cemerick | ,(meta (read (java.io.PushbackReader. (java.io.StringReader. "^{:line 66} ()")))) |
| 13:40 | clojurebot | {:line 66} |
| 13:41 | bonega | gfredericks: ok, thanks |
| 13:42 | bonega | Thinking of doing it as html instead of fighting with gclosure canvas |
| 14:06 | TimMc | reiddraper, alex_baranosky,: I now have a working crosscram GUI! The board size, choice of bot, and who goes first are all hardcoded, but it's a start. |
| 14:06 | reiddraper | TimMc: ah, very cool |
| 14:07 | reiddraper | need to start playing with that again |
| 14:07 | TimMc | It's the gui-demo branch. |
| 14:07 | TimMc | I *may* rebase/squash that branch, so definitely don't build off of it. :-P |
| 14:13 | casion | just when I thought I had this xml thing licked… writing it seems to be another day of IRC log searching |
| 14:16 | ibdknox | is there a newer implementation of datalog available somewhere? I know datomic has one, but I assume that can't be used in isolation |
| 14:18 | jonasen | ibdknox: It can be used in-memory without the transactor running |
| 14:19 | ibdknox | jonasen: is it pretty lightweight that way? |
| 14:22 | jonasen | ibdknox: I believe there are quite a lot of dependencies.. but it's been lightweight enough for me to have a lot of fun with it |
| 14:22 | ibdknox | jonasen: what have you been doing? :) |
| 14:23 | jonasen | ibdknox: but I haven't used it for anything serious. |
| 14:23 | jonasen | ibdknox: https://github.com/jonase/scape |
| 14:23 | ibdknox | haha, that's also what I want to do with it ;) |
| 14:25 | jonasen | ibdknox: heh.. it works pretty well and I think there are a lot of interesting things you can still do with it |
| 14:29 | octagon | i'm looking at https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L184 what does #_(-entry-at ...) mean? |
| 14:29 | Bronsa | it is ignored |
| 14:30 | Sgeo__ | ,#_(blah blah blah) |
| 14:30 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 14:30 | Bronsa | ,#_foo (+ 1 2) |
| 14:30 | Sgeo__ | ,#_(blah)(+ 1 1) |
| 14:30 | clojurebot | 3 |
| 14:30 | clojurebot | 2 |
| 14:30 | Bronsa | dang. |
| 14:30 | octagon | Bronsa: thanks, so that's there just as a comment? |
| 14:30 | Bronsa | yeah |
| 14:30 | SegFaultAX | octagon: Check it http://clojure.org/reader |
| 14:30 | Bronsa | probably something that was needed in the early days of clojurescript and got commented out |
| 14:31 | octagon | ah ok, so it isn't important, then, af far as implementing the protocol goes |
| 14:31 | octagon | *as |
| 14:31 | octagon | thanks! |
| 14:31 | SegFaultAX | octagon: That page has a list of the different reader macros (like form commenting #_) |
| 14:32 | octagon | SegFaultAX: ah ok i see now. i read that page but i must have missed it |
| 14:33 | casion | is there any other way to read/write XML other than clojure.xml/clojure.data.xml ? |
| 14:34 | TimMc | casion: Sure, you can serialize it yourself. :-) |
| 14:34 | casion | that sounds awful :( |
| 14:35 | TimMc | The Java core libs provide some APIs as well. |
| 14:37 | michaelr525 | hello |
| 15:39 | Urthwhyte | Working with the REPL in your text editor is the greatest thing ever. So nice going back to interactive coding |
| 16:01 | octagon | does clojure have anything similar to scheme's define-values? like here: http://docs.racket-lang.org/reference/define.html#(form._((quote._~23~25kernel)._define-values)) |
| 16:03 | TimMc | reiddraper: Any objection to bumping crosscram to 1.4? I'm getting pissed off by RuntimeException-wrapping. |
| 16:04 | reiddraper | TimMc: np |
| 16:07 | ivan | how do I add a monospace/code block in a comment in JIRA? |
| 16:07 | ivan | I swear JIRA is designed to make me look like an idiot with its lying documentation |
| 16:19 | jcromartie | I took a Java REST API and rewrote it in Clojure to be 1/10 the LoC and 100X faster. |
| 16:19 | jcromartie | But they don't want me to use it because it would make somebody look bad. |
| 16:19 | jcromartie | and by "100X faster" I mean 100X more request/sec |
| 16:20 | octagon | jcromartie: you should use it anyway. you know they want it |
| 16:21 | jcromartie | I don't know they want it. It's a big enterprisey Gov't contractor on the other end, and they *want* to waste time, space, and money. |
| 16:21 | ivan | now you just need a Clojure program to replace politics |
| 16:21 | jcromartie | like, they've explicitly told me they want to use more time than necessary, more code than necessary, make mistakes, etc. |
| 16:21 | octagon | jcromartie: you should charge extra for that! |
| 16:22 | octagon | it's like an option you'd have that costs extra |
| 16:22 | jcromartie | what's "that"? |
| 16:22 | octagon | "i can guarantee worse running time for a small fee" |
| 16:22 | jcromartie | hah hah |
| 16:23 | octagon | you could have your REST thing mining bitcoins while it works |
| 16:23 | jcromartie | hah |
| 16:23 | octagon | another bonus for you |
| 16:23 | jcromartie | now that's a good use of public resources |
| 16:24 | octagon | or it could be folding proteins or something |
| 16:25 | Urthwhyte | jcromartie: time for (.sleep Time) |
| 16:26 | Urthwhyte | if I'm using clojure string's split func, can I just pass it a char to split on or must it be a regex |
| 16:26 | ivan | how about a macro that inserts sleeps everywhere? |
| 16:27 | ivan | defslowfn |
| 16:31 | octagon | or just (dotimes [n 100] (process request)) |
| 16:31 | jcromartie | (defn enterprisey [n f] (fn [& args] (Thread/sleep n) (apply f args))) |
| 16:31 | octagon | it could be a ring middleware or whatever |
| 16:31 | jcromartie | oh yeah! |
| 16:31 | octagon | dotimes has the added benefit of making the machine work harder |
| 16:32 | octagon | so you'd be spending more money on power and cooling |
| 16:32 | octagon | actually i recommend mining bitcoins and then deleting them automatically when you get one |
| 16:32 | ivan | running it 100 times increases reliability in the face of three cosmic rays hitting your bits at the same time |
| 16:33 | jcromartie | (defn wrap-enterprise [handler] (fn [req] (dorun (map str (range 10e8))) (handler req))) |
| 16:33 | octagon | throwing away bitcoins is a luxury the government systems need to have installed for sure |
| 16:33 | jcromartie | that's too long of course |
| 16:33 | jcromartie | 10e5 is enough |
| 16:33 | jcromartie | ,(time (dorun (map str (range 10e5)))) |
| 16:33 | clojurebot | "Elapsed time: 567.37274 msecs" |
| 16:33 | jcromartie | depends on the server I suppose |
| 16:34 | jcromartie | considering my requests take like 4ms |
| 16:34 | jcromartie | :P |
| 16:34 | octagon | you could compute something really difficult and add it to the response headers |
| 16:34 | jcromartie | hah |
| 16:34 | jcromartie | how about a bitcoin |
| 16:34 | jcromartie | :P |
| 16:35 | octagon | dude that's it |
| 16:35 | mpan | a full bitcoin? |
| 16:35 | octagon | you need to do this |
| 16:35 | mpan | how much computation does that cost these days? |
| 16:35 | octagon | every so many requests, a bitcoin is returned with the response |
| 16:35 | octagon | that's great |
| 16:35 | jcromartie | 24 hours |
| 16:35 | mpan | perhaps use a fractional bitcoin |
| 16:36 | jcromartie | oh yah, good idea |
| 16:36 | octagon | it's like the 100th customer at the car dealership gets a t shirt |
| 16:36 | jcromartie | "this API returns money" |
| 16:36 | jcromartie | X-Money: ... |
| 16:36 | octagon | undocumented, of course |
| 16:36 | mpan | it's a bit hard to "return a bitcoin", though |
| 16:36 | octagon | X-Alimony: 0x8723... |
| 16:36 | mpan | at best, you could make a wallet with just that amount and send out the private key |
| 16:37 | mpan | BUT that doesn't stop the service operator from spending it first |
| 16:38 | jcromartie | yeah a new wallet would be the way to go |
| 16:38 | jcromartie | or, let users specify their wallet |
| 16:38 | jcromartie | and just put money into it |
| 16:39 | mpan | or actually, just specifically say: we're giving you this wallet; move the funds out within X days or we're reclaiming it |
| 16:39 | mpan | that prevents some waste |
| 16:40 | octagon | mpan: he doesn't want to prevent waste hahaha |
| 16:40 | octagon | the more waste the better |
| 16:40 | octagon | this is luxury govt computing here |
| 16:41 | mpan | wait, I came in after the backstory |
| 16:41 | mpan | what did I miss? |
| 16:41 | octagon | a mechanism to slow down a clojure program that replaces a java program and is 100x faster |
| 16:42 | octagon | added bonus for wasting resources |
| 16:43 | mpan | wait, why? |
| 16:43 | mpan | added bonus for parameterizability, right? |
| 16:45 | jcromartie | mpan: I improved a Java API by rewriting it in Clojure using 1/10 the code, and it was 100X faster |
| 16:45 | jcromartie | mpan: but they don't want it |
| 16:46 | jcromartie | mpan: they would rather have more code, and spend more time |
| 16:46 | mpan | why? |
| 16:46 | clojurebot | Why is the ram gone is <reply>I blame UTF-16. http://www.tumblr.com/tagged/but-why-is-the-ram-gone |
| 16:47 | mpan | I mean, more time/code isn't the root cause, is it? |
| 16:47 | TimMc | clojurebot: lexical scope is <reply>out of scope, out of mind |
| 16:47 | clojurebot | Roger. |
| 16:47 | mpan | clojurebot: do you have like a command for your maintainer(s) to masquerade as you? |
| 16:47 | clojurebot | paredit commands is http://mumble.net/~campbell/emacs/paredit.html |
| 17:05 | Urthwhyte | Anyone with time to laugh at some horrible code? (and perhaps help a bit) |
| 17:07 | Urthwhyte | https://gist.github.com/8ec57d16837b2f326874 |
| 17:10 | Urthwhyte | My mistake, that last one was private: https://gist.github.com/3805186 |
| 17:11 | mpan | hm, just curious why you aren't using regular expressions if you're sure about the structure of it |
| 17:12 | mpan | as in, matching the whole string and pulling out captured groups |
| 17:14 | Urthwhyte | Mostly as I'm rather poorly porting it over from Python, so doing foo, bar = s[0:2], s[3:] was easier than /(w){2}(\d){4}/ |
| 17:15 | Urthwhyte | Just seemed easier at the time, it was a script I wrote in ~45 minutes, figured it would be a good first "real" clojure project |
| 17:16 | algernon | Urthwhyte: the problem is, that -> turns the parse-url call into (parse-url ShowUrl url), which is not what you want. (that is, -> doesn't do what you think it would) |
| 17:16 | Urthwhyte | Using macros you don't fully understand is usually a recipe for disaster |
| 17:16 | antoineB | into (parse-url rec url) |
| 17:26 | Urthwhyte | algernon: is there an alternative I can use - it's very unintuitive to me that -> would expand into that. I had expected it to execute the second arguments before applying? (my terminology is almost certainly all wrong) it to the record type |
| 17:27 | Urthwhyte | oh I see |
| 17:27 | mpan | why are you using -> when you have nothing to chain? |
| 17:27 | mpan | it's usually for when you have multiple forms you want to thread a result through |
| 17:28 | Urthwhyte | Largely cargo culting my way through here based off what I've read so far in Programming clojure. I've now checked the API docs and seen that -> feeds each expression as the first argument of the next |
| 17:28 | Urthwhyte | Which makes sense |
| 17:44 | ivan | http://blog.fogus.me/2012/09/29/adventures-in-tearing/ |
| 18:14 | Apage43 | Is there something around that would be useful for reading/printing numbers with SI prefixes? |
| 18:14 | Apage43 | er |
| 18:14 | Apage43 | suffixes |
| 18:14 | Apage43 | rather |
| 18:34 | ohpauleez | dnolen: I found another bug related to my hashbang adventures yesterday (http://dev.clojure.org/jira/browse/CLJS-385) - I'll have a ticket and a patch sometime this weekend |
| 19:18 | gjcourt | can anyone recommend a good resource for learning about agent error recovery |
| 19:20 | gjcourt | specifically, say i use (send-off a (fn [a f] (doto a (.upload f)))) and a fails, is there an idiomatic clojure solution? |
| 19:20 | gjcourt | for retrying that upload |
| 19:29 | Urthwhyte | So I solved the problem I was having earlier |
| 19:29 | Urthwhyte | Records API wasn't stable from 1.2->1.4, and I had the wrong one specified in my project.clj |
| 20:07 | nightfly_ | 34 |
| 20:07 | gfredericks | ,(rand-int 100) |
| 20:07 | clojurebot | 51 |
| 20:40 | cjfrisz | Too quiet in here |
| 20:40 | cjfrisz | What's up, folks? |
| 20:41 | alex_baranosky | what's up |
| 20:52 | mpan | bit of a weird question, but: how much control does oracle have over java as an ecosystem? how much does that affect clojure as a language? how likely is it to have something dramatic happen down the line? |
| 20:53 | cjfrisz | mpan: Interesting question which I'm probably not qualified to fully answer |
| 20:54 | cjfrisz | From my experience, Oracle makes at least a half-hearted attempt to support languages targeting the JVM |
| 20:55 | cjfrisz | They seem to be slow about doing things to *help* those languages, but they seem at least somewhat interested in not stifling them |
| 20:55 | mpan | what if they decide they want money down the line, like with android? |
| 20:55 | SegFaultAX | mpan: Money for what? Usage of the JVM? |
| 20:55 | Raynes | mpan: If they do that, then everybody is screwed. |
| 20:55 | Raynes | mpan: Not just Clojure. |
| 20:56 | dlitvak | you always have OpenJDK |
| 20:56 | Raynes | What if Rich Hickey decided he wanted to charge for parentheses? |
| 20:56 | SegFaultAX | mpan: Oracle has no rights to Clojure itself. |
| 20:56 | dlitvak | as java has an open standard for the JVM |
| 20:56 | dlitvak | Raynes: while clojure is under Eclipse Public License... that cant happen |
| 20:57 | SegFaultAX | Whoosh. |
| 20:58 | mpan | ok thanks |
| 20:58 | Raynes | dlitvak: http://en.wikipedia.org/wiki/Humor |
| 20:58 | xeqi | oh, does the epl have a non-commercial clause? |
| 20:58 | dlitvak | lol |
| 21:07 | SegFaultAX | I wonder how hard it would be to make something like Grape (Ruby) in Clojure... or if someone already has? |
| 21:28 | duck1123 | SegFaultAX: I have this. https://github.com/duck1123/ciste not quite the same |
| 21:29 | duck1123 | I need to write better documentation |
| 21:29 | cjfrisz | duck1123: Amen |
| 21:30 | cjfrisz | duck1123: Although it's hard to find someone without that problem |
| 21:30 | cjfrisz | I used to have good documentation. Then I continued writing code. |
| 21:30 | duck1123 | I sit down and try every now and then, but I find I'd rather actually be using it |
| 21:31 | cjfrisz | Yeah, I've got a project that I've been intending to take an evening to just go through and update the documentation/audit the code |
| 21:31 | cjfrisz | But it's so much more fun to add more functionality |
| 21:32 | duck1123 | I've been meaning to create a write-up on how to create an app with ciste, then I have a demo app I never finished |
| 21:57 | cjfrisz | Sometimes I realize that things are legal Clojure syntax and it makes me sad |
| 21:57 | cjfrisz | ,(fn) |
| 21:57 | clojurebot | #<sandbox$eval27$fn__28 sandbox$eval27$fn__28@4e78d10d> |
| 21:57 | gfredericks | ,((fn)) |
| 21:57 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: sandbox$eval55$fn> |
| 21:57 | gfredericks | ,((fn) :foo) |
| 21:57 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: sandbox$eval83$fn> |
| 21:58 | gfredericks | it's a function with no arities :) |
| 21:58 | cjfrisz | gfredericks: Exactly! |
| 21:58 | cjfrisz | gfredericks: What the hell does that mean?? |
| 21:58 | lazybot | cjfrisz: What are you, crazy? Of course not! |
| 21:58 | gfredericks | cjfrisz: it means you can't call it :P |
| 21:58 | cjfrisz | Then why is it legal syntax?? |
| 21:58 | lazybot | cjfrisz: What are you, crazy? Of course not! |
| 21:59 | gfredericks | cjfrisz: because there isn't a check against it |
| 21:59 | cjfrisz | I know... |
| 21:59 | gfredericks | ,(macroexpand '(fn)) |
| 21:59 | clojurebot | (fn*) |
| 21:59 | cjfrisz | So if one were to write a source-to-source compiler in Clojure, (s)he would have to handle that case |
| 22:00 | gfredericks | for some value of 'have to' |
| 22:00 | cjfrisz | Well, what's the point of writing a source-to-source compiler that rejects legal source code? |
| 22:01 | gfredericks | to have a source-to-source compiler that accepts all useful code? |
| 22:01 | cjfrisz | Just because the original compiler lets you do something stupid doesn't mean you should stop someone from doing it |
| 22:01 | gfredericks | I'm just saying you don't have to |
| 22:02 | gfredericks | a transpiler would be useful even if it doesn't handle pathological cases |
| 22:02 | xeqi | ,(seq (.getPublicMethods (class (fn)))) |
| 22:02 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: getPublicMethods for class java.lang.Class> |
| 22:02 | xeqi | ,(seq (.getDeclaredMethods (class (fn)))) |
| 22:02 | cjfrisz | Yeah... |
| 22:02 | clojurebot | nil |
| 22:02 | cjfrisz | I see your point, but it conflicts with my sensibilities |
| 22:02 | cjfrisz | Not saying that you're wrong; I think your opinion is quite valid |
| 22:03 | gfredericks | cjfrisz: wanna see a cool bug in the reader? |
| 22:03 | cjfrisz | gfredericks: Uh, yes. Of course |
| 22:03 | gfredericks | ,(#(+ %1 %2 #_ %3) 1 2) |
| 22:03 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: sandbox$eval196$fn> |
| 22:03 | cjfrisz | Oh weird |
| 22:05 | cjfrisz | That got weirder when I macroexpanded it |
| 22:05 | gfredericks | it just adds an extra arg no? |
| 22:05 | cjfrisz | ,(macroexpand '(#(+ %1 %2 #_ %3) 1 2)) |
| 22:05 | clojurebot | ((fn* [p1__224# p2__225# p3__226#] (+ p1__224# p2__225#)) 1 2) |
| 22:05 | gfredericks | cjfrisz: you could get basically the same thing with read-string |
| 22:05 | xeqi | ,(#(#_%&) 1 2 3) |
| 22:05 | clojurebot | () |
| 22:06 | cjfrisz | gfredericks: yikes |
| 22:07 | cjfrisz | That seems like a ghost story that you tell to your kids about the dangers of using that anonymous fn syntax irresponsibly |
| 22:07 | gfredericks | ha |
| 22:08 | cjfrisz | And then...the argument was gone!! |
| 22:08 | gfredericks | NOOOOO |
| 22:10 | gfredericks | cjfrisz: write me a clojure-syntax wrapper for haskell |
| 22:13 | cjfrisz | gfredericks: hmmm... |
| 22:13 | cjfrisz | I don't know why I'm the one to do that, particularly because I don't think I ever successfully wrote a Haskell app |
| 22:14 | cjfrisz | I always got fed up with the type-checker and ended up writing it in Scheme |
| 22:14 | gfredericks | I thought it would be fun to use metadata syntax for type annotations, but that won't work for strings and numbers and such |
| 22:15 | dnolen | cjfrisz: heh |
| 22:15 | gfredericks | though maybe those things get explicitely annotated infrequently enough that it could be a separate thing |
| 22:22 | dnolen | cjfrisz: so it sounds like some interesting things are happening to Chez ... |
| 22:23 | cjfrisz | dnolen: Oh? |
| 22:25 | dnolen | cjfrisz: well it sounds like Chez is now a Cisco product? |
| 22:26 | duck1123 | could you run clojure on haskell? (wise is a different question) |
| 22:27 | cjfrisz | dnolen: Hmm...I don't know. You'd have to ask Kent Dybvig about that. |
| 22:28 | xeqi | duck1123: as in build an interpreter in haskell? |
| 22:28 | dnolen | cjfrisz: ah ... yeah this impression is based on Rainer Joswig tweet and some mailing list posts I've seen. |
| 22:29 | dnolen | cjfrisz: been hoping that someone will finally put the super high performance free Scheme, related - Dan & Will said that Aziz has resurfaced |
| 22:29 | duck1123 | basically. like java, javascript, .net, python, etc. |
| 22:30 | dnolen | cjfrisz: well inexpensive, if not free is what I meant by the above as far as Chez. |
| 22:30 | cjfrisz | dnolen: right |
| 22:30 | duck1123 | I assume haskell let's you shoot yourself in the foot if you really try hard enough |
| 22:30 | cjfrisz | dnolen: I had heard that they got ahold of Aziz again in the Spring |
| 22:32 | cjfrisz | dnolen: I'm curious, do you have links for what you heard about Chez? |
| 22:32 | dnolen | cjfrisz: http://groups.google.com/forum/#!msg/comp.lang.scheme/4AlItE5baRg/Ono4F3ipY_oJ |
| 22:35 | cjfrisz | dnolen: Hmm...well I think Kent is the only one managing scheme.com, so that must have come from him |
| 22:36 | dnolen | cjfrisz: I'm assuming that's your day job these days - hacking on Chez. |
| 22:37 | gfredericks | duck1123: I'm not sure why being able to shoot yourself in the foot is even a requirement |
| 22:38 | gfredericks | you would probably have to implement everything within the IO monad I guess? :/ |
| 22:38 | cjfrisz | dnolen: I'm actually working on the CSO Advanced Development team |
| 22:38 | cjfrisz | dnolen: It's an arm of the part of Cisco responsible for acquiring other companies |
| 22:39 | cjfrisz | dnolen: We do speculative programming to assess the utility of other people's software and how to integrate it into our products |
| 22:39 | cjfrisz | dnolen: Though I'm not yet allowed to speak on the specifics of what I'm working on |
| 22:40 | dnolen | cjfrisz: but I'm assuming all Scheme :) Is there a decent sized team at Cisco doing Scheme work? |
| 22:41 | cjfrisz | dnolen: it kills me, but I can't really say what we're doing right now |
| 22:41 | dnolen | cjfrisz: no worries |
| 22:41 | cjfrisz | dnolen: someday I will excitedly tell you all about it |
| 22:43 | dnolen | cjfrisz: haha. You and all the people doing really cool stuff w/ core.logic that won't blog about ;) |
| 22:43 | cjfrisz | dnolen: I've got a couple ctco blog posts I need to write |
| 22:43 | muhoo | i'm glad you guys are using clojure for Important Stuff. me, i was jonesing for an excuse to use clojure, so i had to do this: http://restivo.org/zombies |
| 22:43 | cjfrisz | dnolen: If that's any consolation |
| 22:45 | dnolen | cjfrisz: looking forward to that! Still hoping we might be able to convince you to do ctco over the CLJS AST once it's sorted. |
| 22:45 | cjfrisz | dnolen: I'd be happy to! |
| 22:45 | cjfrisz | dnolen: it may be after Conj because I've got a lot of work on ctco I want to get done |
| 22:46 | cjfrisz | dnolen: Plus I'd like to have a little stand-alone compiler for TCO in Clojure that takes care of some whole-program analysis that the ctco macro can't cut |
| 22:49 | dnolen | cjfrisz: seeing an approach to whole-program analysis definitely interests me. pondering optimized miniKanren compilation more and more these days ... |
| 22:49 | cjfrisz | dnolen: I'm not even sure that what I have in mind is going to make a whole lot of difference |
| 22:49 | cjfrisz | dnolen: but it's a journey probably worth making |
| 22:55 | mpan | &(type (fn)) |
| 22:55 | lazybot | ⇒ sandbox7657$eval34390$fn__34391 |
| 22:56 | cjfrisz | Wait, was there more discussion of zero-arity fn expressions when I wasn't paying attention |
| 22:56 | cjfrisz | ? |
| 22:57 | cjfrisz | I probably should have asked this ages ago, but what's the difference between clojurebot and lazybot? |
| 22:57 | cjfrisz | ,(type (fn)) |
| 22:57 | clojurebot | sandbox$eval27$fn__28 |
| 22:58 | xeqi | cjfrisz: https://github.com/hiredman/clojurebot and https://github.com/flatland/lazybot |
| 22:59 | cjfrisz | xeqi: Thank you much |
| 23:19 | Raynes | cjfrisz: lazybot is a totally different project. |
| 23:19 | Raynes | It does more things than clojurebot and overlaps in some places like evaluation, but even the evaluation is entirely different, using a sandbox library that I and amalloy_ developed. |
| 23:19 | Raynes | Though xeqi keeps breaking it. |
| 23:19 | cjfrisz | Hehehe |
| 23:19 | Raynes | Because he is clever and such. |
| 23:20 | cjfrisz | Yeah, I saw that from the github page for lazybot |
| 23:20 | cjfrisz | Very cool stuff |
| 23:36 | cjfrisz | Ack...I'm very tempted to break my 80-character column rule |
| 23:36 | cjfrisz | Help me be strong |
| 23:37 | xeqi | surely thats more like a guideline |
| 23:38 | cjfrisz | xeqi: You're being the little devil on my left shoulder :-P |
| 23:38 | cjfrisz | I just have to remember that someday I will be working on a screen with less real estate and be very mad at myself |
| 23:49 | mpan | what screen will you use that has little width? |
| 23:49 | mpan | or are you one of those ssh over smartphone folks? |
| 23:50 | cjfrisz | mpan: I did a lot of coding on a netbook |
| 23:50 | cjfrisz | Though I don't anymore |
| 23:50 | cjfrisz | I upgraded to a big-boy 27" widescreen :-) |
| 23:50 | cjfrisz | Though I'm thinking of picking up a 14" laptop soon to do work on the go |
| 23:50 | mpan | even a netbook has >120 cols? |
| 23:53 | cjfrisz | mpan: 90% or more of the time I have my emacs buffer split vertically |
| 23:53 | mpan | ah |
| 23:53 | mpan | that explains it |
| 23:53 | cjfrisz | mpan: Indeed |
| 23:54 | cjfrisz | I think I could reliable do 72 characters before things got bad |
| 23:54 | cjfrisz | Some idiosyncrasies of Clojure syntax forced me to up that limit to 80 characters |
| 23:55 | mpan | how good is emacs at knowing how far to indent? |
| 23:56 | cjfrisz | Generally quite good |
| 23:56 | cjfrisz | And if it doesn't something I don't like I learned the incantation to poke the indent function to do what I want |
| 23:56 | cjfrisz | *does something I don't like |
| 23:57 | mpan | that second part sounds hard, though |
| 23:57 | cjfrisz | Eh, it's not too bad |
| 23:58 | mpan | also, is the rebind-capslock-to-control thing real? |