2012-04-10
| 00:12 | dnolen | brehaut: implementing the remote debugging protocol would be useful. |
| 00:12 | dnolen | alright haven't heard any bad news I'm gonna merge the ClJS optimizations |
| 00:12 | brehaut | dnolen: agreed; i must confess to being scared off by the thought of having to implement json-rpc first |
| 00:13 | dnolen | brehaut: I actually prototyped some stuff - it's pretty easy. |
| 00:13 | brehaut | dnolen: yeah, i dont imagine its too bad. it looks like it learnt from the xml-rpc debarcle |
| 00:14 | brehaut | dnolen: do you have a link? |
| 00:16 | dnolen | brehaut: hmm, I do not. I think I did that work locally - got wiped out from a HD failure. |
| 00:16 | brehaut | oh :/ |
| 00:16 | dnolen | brehaut: that said, it's just WebSockets I think it took me like 15 minutes to get something working. |
| 00:19 | emezeske | Is anyone aware of a way to create multiple midje prerequisites using something like (doseq [x coll] (provided (whatever x) => x)) ? |
| 00:19 | emezeske | I have tried using all kinds of things, but midje doesn't seem to like doseq or for or anything |
| 00:20 | amalloy | you probably have to write a macro that expands to multiple instances of `provided` |
| 00:20 | dnolen | already CLJS optimizations merged into master |
| 00:21 | dnolen | already -> alright |
| 00:23 | emezeske | amalloy: I think you're right. I've been having a hard time doing that. |
| 00:35 | emezeske | amalloy: Ah, I see why I'm having a hard time... All of the midje "provided" items have to be set up at compile time, not run time |
| 00:35 | emezeske | amalloy: I wanted to have add "provided"s based on runtime values. No can do! :) |
| 00:35 | arohner_ | emezeske: yeah, midje has a hard time with things it doesn't anticipate |
| 00:36 | arohner_ | emezeske: are you trying to stub, or spy? |
| 00:36 | emezeske | arohner_: stub |
| 00:36 | arohner_ | emezeske: then just use with-redefs |
| 00:36 | emezeske | arohner_: I was trying to set build a bunch of tests dynamically |
| 00:37 | emezeske | arohner_: Yeah, I guess I could do that; what would I lose? Just midje's nice error messages? |
| 00:37 | amalloy | i find it inconceivable that you want to write tests but you don't know what they are until runtime |
| 00:37 | arohner_ | amalloy: it doesn't have to be at runtime to want to use a loop |
| 00:37 | arohner_ | (for [i ["foo" "bar" "baz"] (assert xyz)) |
| 00:38 | emezeske | Yeah, the problem is looping over some data and making (provided ...) items based off that |
| 00:38 | amalloy | so? you can do that at macro time |
| 00:39 | amalloy | (defn get-assertions [] ["foo" "bar" "baz"]) ... (defmacro assert-the-things [] (cons `do (for [fact (get-assertions)] `(assert ~fact))) |
| 00:40 | amalloy | you have the entire language available to you while compiling - that's a big part of the power of macros |
| 00:40 | emezeske | amalloy: That works |
| 00:40 | emezeske | amalloy: I think I was getting tripped up on wanting to pass the (get-assertions) values into the macro as an arg |
| 00:40 | emezeske | amalloy: But that was doomed to failure, due to the arg being runtimey |
| 00:41 | amalloy | indeed. but you know at compile-time what the arg is, so you just need to reorganize things so that you *use* it at compile time |
| 00:41 | emezeske | Yeah |
| 00:41 | arohner_ | amalloy: macro expansion is weird in midje |
| 00:41 | arohner_ | as in, it has things that look like macros, but aren't |
| 00:41 | amalloy | i was about to say: i'm pretty sure that's not possible. but clojure.test does some pretty appalling things to macro expansions |
| 00:42 | amalloy | still, there's nothing midje can do to get in the way of: (defmacro create-my-tests [] (...)) (create-my-tests) |
| 00:46 | bloop | does there exist f such that (= x (reduce f x)) for all x? I'm pretty sure there does not, but I'm having trouble proving it to myself. (f is 'list for x of size 2, if that's useful) |
| 00:48 | emezeske | Hrm, I think arohner_ is right about things being weird |
| 00:48 | bloop | (this is not a homework question. I don't know why this suddenly fascinated me.) |
| 00:48 | emezeske | amalloy: Consider my macro: (defmacro my-provided [] `(~'provided (something 5) => 6)) |
| 00:48 | emezeske | amalloy: That expands to (provided (my.ns/something 5) midje.sweet/=> 6) |
| 00:49 | amalloy | that looks...obviously correct? not sure what's weird here, that's just how macros work |
| 00:49 | emezeske | amalloy: When I throw that into a (fact (something 5) => 6 (my-provided)), midje breaks |
| 00:49 | emezeske | amalloy: Yeah I know its correct, the problem is it doesn't work with midje |
| 00:50 | amalloy | macros don't nest in that direction |
| 00:50 | emezeske | So I have to use a macro to build my fact? |
| 00:50 | amalloy | yes. you can't expect midje's fact to somehow know that your my-provided is a macro it should expand |
| 00:50 | amalloy | it's entitled to think that it's the beginning of a new fact clause |
| 00:51 | amalloy | or whatever midje's syntax is |
| 00:51 | emezeske | Right, so basically it's very very much work to do a loop of provideds |
| 00:51 | amalloy | *nod* that's often the case with macros |
| 00:51 | amalloy | my understanding is that midje has a more-raw layer that involves functions passing around maps |
| 00:51 | emezeske | Yeah, I was looking at that a little |
| 00:52 | emezeske | I think that the code deduplication I was trying to do is not worth the madness |
| 00:53 | emezeske | Maybe I'll open a midje case -- it already supports (let) bindings inside facts; it doesn't seem ridiculous to support (for) as well |
| 00:54 | arohner_ | maybe the bug is that symbols have to be special cased |
| 00:54 | arohner_ | i.e. why do you need to open a bug to get (for) |
| 00:55 | emezeske | arohner_: I don't think midje evaluates most of the forms inside a fact |
| 00:56 | emezeske | arohner_: Inside a (fact ...) is definitely a DSL that may/may-not support things like for |
| 00:56 | amalloy | i don't think it would support a let-binding at the point you're trying to put your for |
| 00:56 | amalloy | (fact (let [...] (...))) - this would astonish me |
| 00:56 | emezeske | amalloy: It definitely supports that, happily |
| 00:57 | amalloy | or, sorry, i guess i don't know midje syntax |
| 00:57 | amalloy | maybe that makes total sense |
| 00:57 | emezeske | It allows it, but I get the idea that it was a lot of work to allow it :) |
| 00:57 | devn | mosh is so awesome. |
| 01:16 | muhoo | is there somewhere a documentation of all the options that can go into an ~/.lein/init.clj and what the right format is for them? |
| 01:21 | emezeske | amalloy, arohner_: Thanks, guys, for your help, by the way! |
| 01:26 | muhoo | also, is there a way to get a repl inside leiningen? in other words, not in the project but inside the build system itself? |
| 01:26 | emezeske | I guess what I learned today is that when your code is passed to a macro, you are at that macro's complete and total mercy. |
| 01:56 | muhoo | also, is there some way to override the groupid and artifactid in lein without having to move the structure of the files all around? |
| 02:05 | amalloy | muhoo: group and artifact IDs have no relation to file structure |
| 02:08 | muhoo | they do, according to lein |
| 02:08 | muhoo | they are generated from the file structure automatically. i need to override that |
| 02:10 | muhoo | in leiningen/core.clj defproject macro: :group ~(or (namespace project-name) (name project-name)) |
| 02:10 | amalloy | very sporting of you to find evidence supporting my claim; do you have any supporting yours? |
| 02:10 | muhoo | artifactId is (:name project), which is defined as ~(name project-name) |
| 02:11 | amalloy | just do (defproject mygroup/myid ...) |
| 02:11 | muhoo | hmm.... ok. |
| 02:11 | muhoo | oh ffs |
| 02:11 | muhoo | thanks. |
| 02:13 | muhoo | *sigh* so it's "lein new" that sets file structure to equal the defproject. i cannot believe i could have been so stupid. |
| 02:14 | muhoo | wait, no. i definitely can believe it. |
| 02:15 | muhoo | i think once i do get a clue, i owe you all a round of beers. or three. |
| 02:17 | ktsuji | ibdknox: hi, I'm using korma on oracle and have a question about limit |
| 03:05 | muhoo | hahahaw, this is silly. after going through all this work to try to write java classes in clj instead of having to deal with java, the resulting clojure code looks as verbose and ugly as java. |
| 03:05 | muhoo | fail |
| 03:07 | echo-area | muhoo: What's that? |
| 03:57 | muhoo | oh, i've got to deliver a java library, i figured i'd try to cheat by doing it in clojure instead. |
| 03:57 | muhoo | it's a lot more pleasant this way, but once i start to add all the java stuff, it gets really ugly. |
| 03:58 | muhoo | now the customer wants checked exceptions. |
| 03:58 | muhoo | and javadoc |
| 04:24 | muhoo | actually, generating javadoc from the AST's of clojure might be an interesting project, if i knew enough to be able to do it. |
| 04:25 | amalloy | you're probably better off with the "shoot self in head" idea |
| 05:21 | amalloy | seriously though muhoo, you must be better off writing a few interfaces in java, with javadocs, and providing an interface-based API. maybe a few static "factory" sorts of functions as well, if they want. trying to provide a looks-just-like-java(tm) facade from clojure-only is sometimes possible, but (a) often unpleasant, and (b) probably not what the customer wants anyway |
| 05:23 | amalloy | then you don't have to AOT everything, too, which would add more complications |
| 05:42 | muhoo | actually, i'm not thinking big enough. i need better customers :-) |
| 05:43 | muhoo | like, the guy who said, "i don't understand all that stuff, i'm game for whatever, just make it work ASAP." more of those will make me happy. |
| 05:46 | muhoo | amalloy_: i do like the idea of writing abstract interfaces in java, then implementing them in clj. that'd get me a long way on this project. |
| 08:29 | sanjoyd | What is the difference between [a b c] and (a b c)? Is [a b c] the same as '(a b c)? |
| 08:29 | gfredericks | sanjoyd: the first is a vector and the second is a list |
| 08:29 | gfredericks | they compare equal but they are different data structures |
| 08:30 | sanjoyd | So I get O(1) element access in the first? |
| 08:30 | gfredericks | O(log(n)), but mostly yeah |
| 08:30 | gfredericks | they also have different roles in source code |
| 08:30 | sanjoyd | Meaning? |
| 08:31 | gfredericks | well I assume you've seen code such as (let [foo (bar baz)] (bwam foo)) |
| 08:31 | sanjoyd | Yes. |
| 08:31 | sanjoyd | Is the [ ] there the same as the vector [ ]? |
| 08:31 | clgv | sanjoyd: O(log_32(n)) access which is almost O(1) on current machines |
| 08:32 | sanjoyd | (That is what prompted my question, actually.) |
| 08:32 | sanjoyd | Or is the [ ] in let / fn etc. something different? |
| 08:33 | gfredericks | sanjoyd: parens in code usually mean a function invocation or something similar |
| 08:33 | gfredericks | vectors are either data literals (as in (def my-vector [1 2 3])) |
| 08:33 | gfredericks | or play some special role in a macro, usually indicating bindings |
| 08:33 | gfredericks | as in let, loop, fn, defn, for, ... |
| 08:33 | clgv | sanjoyd: it is the same. but the vector in let is useed att compile time whilc the vector your data vectors live at runtime |
| 08:34 | wink | sanjoyd: The Joy of Clojure has a whole chapter dedicated to those semantics and differences, very insightful |
| 08:34 | clgv | typos... :/ |
| 08:34 | sanjoyd | Okay. |
| 09:00 | samaaron | ls |
| 09:00 | Iceland_jack | lol |
| 09:00 | fdaoud | file not found |
| 09:01 | fdaoud | general failure reading disk-- who the heck is general failure and why is he trying to read my disk? |
| 09:03 | Bronsa | lol |
| 09:03 | gfredericks | pwd |
| 09:03 | Bronsa | #clojure |
| 09:03 | gfredericks | echo $USER |
| 09:04 | TimMc | user |
| 09:04 | Iceland_jack | is this a Solaris? |
| 09:04 | Iceland_jack | killall |
| 09:05 | gfredericks | rm -rf /usr/share |
| 09:06 | rodnaph | :(){ :|:& };: |
| 09:06 | Iceland_jack | Why has no-one invented a spoon bomb? |
| 09:06 | Iceland_jack | #undef BADPUNS |
| 09:07 | fdaoud | cd /pub |
| 09:07 | fdaoud | more beer |
| 09:18 | sanjoyd | Suggestions for someone coming into Clojure from Haskell? |
| 09:18 | sanjoyd | (And a little bit of lisp.) |
| 09:19 | llasram | Have fun? |
| 09:19 | llasram | (In the positive, non-sarcastic sense) |
| 09:19 | llasram | What sort of suggestions are you looking for? |
| 09:20 | sanjoyd | Books, tutorials? |
| 09:20 | progo | The Joy of Clojure for you. |
| 09:20 | sanjoyd | Thanks! |
| 09:20 | llasram | +1 |
| 09:20 | llasram | One of the best programming-language-specific books I've ever read |
| 09:21 | TimMc | llasram: Still a good read for moderately advanced Clojure programmers? |
| 09:21 | jkdufair | +1. Intelligent and slightly snarky/clever. |
| 09:22 | 45PAAH33Y | sanjoyd: Free stuff first? Philosophical videos/interviews? |
| 09:22 | llasram | TimMc: Almost definitely. It does a great job of explaining the reasoning behind parts of the Clojure design. I actually read it twice, again after I'd been using Clojure for a bit, and got more on the second read-through |
| 09:23 | sanjoyd | 45PAAH33Y: suggest? |
| 09:23 | 45PAAH33Y | sanjoyd: philosphical + practical overview from creator -> http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/ |
| 09:23 | sanjoyd | 45PAAH33Y: thanks! |
| 09:24 | 45PAAH33Y | Mentions differences from haskell, too |
| 09:25 | 45PAAH33Y | Current newcomer books are Clojure Programming 2nd (the de facto first text), Programming Clojure (new kid, geared towards people coming from perl/python/ruby) |
| 09:26 | RickInGA | sanjoyd: this is another good intro to clojure video, this from Stuart Halloway: http://vimeo.com/10896148 |
| 09:26 | 45PAAH33Y | After that, Joy of Clojure. After that, On Lisp/Let Over Lamba... uhm... hehe |
| 09:27 | 45PAAH33Y | If you have java experience, there's videos around coming-from-java. Yeah, Halloway has some good ones |
| 09:27 | fdaoud | 45PAAH33Y: no Clojure in Action? |
| 09:27 | rodnaph | anyone know when the videos from clojurewest might be making it online? |
| 09:27 | 45PAAH33Y | fdaoud: That's true.. |
| 09:28 | 45PAAH33Y | fdaoud: release nov 2011. Missing some 1.3 details, but a solid read. I like the "in action" format... |
| 09:29 | 45PAAH33Y | rodnaph: dont hold your breath |
| 09:29 | fdaoud | 45PAAH33Y: I agree. |
| 09:29 | 45PAAH33Y | bah |
| 09:31 | 45PAAH33Y | fdaoud: Fan of the book? |
| 09:31 | fdaoud | 45PAAH33Y: I'm a computer book junkie. |
| 09:32 | cemerick | 45PAAH33Y: FYI, we don't talk about perl at all :-) |
| 09:32 | 45PAAH33Y | cemerick: speaking of which, WTH with the book pricing? $22 in beta, then jumps to $30+, and now $18? (with amazon kindle-only stuck at $28)... |
| 09:32 | 45PAAH33Y | cemerick: lol you appear out of nowhere :) |
| 09:33 | 45PAAH33Y | fdaoud: nice. so am I :) a bit of a neurosis sometimes.. |
| 09:33 | cemerick | I can hear someone talking about certain books from miles away. :-P |
| 09:33 | fdaoud | 45PAAH33Y: I'm just wondering. Say I've read those Clojure books, have written some Clojure apps, and I understand functions, higher-order functions, recursion, data structures, macros, etc. Not necessarily an expert, but I understand all those things. It is worth it to read On Lisp? What will it give me on top of all that? |
| 09:33 | cemerick | 45PAAH33Y: where is it $18? |
| 09:34 | cemerick | Not that I have any control over pricing. |
| 09:34 | sanjoyd | On Lisp is art. |
| 09:34 | sanjoyd | Not means to an end but an end in itself. |
| 09:34 | fdaoud | sanjoyd: ok you got my attention. please tell me more. |
| 09:35 | 45PAAH33Y | cemerick: I'm talking oreilly himself, homeboy -> http://shop.oreilly.com/product/0636920013754.do |
| 09:35 | sanjoyd | fdaoud: I don't know how much it'll apply to Clojure. |
| 09:35 | RickInGA | on lisp is available to read online: http://www.bookshelf.jp/texi/onlisp/onlisp_toc.html#SEC_Contents |
| 09:36 | 45PAAH33Y | fdaoud: practically, it's about macros |
| 09:36 | sanjoyd | Yes. |
| 09:36 | 45PAAH33Y | fdaoud: i think halloway did a clojure translation |
| 09:36 | cemerick | oh, ebook |
| 09:36 | fdaoud | 45PAAH33Y: it's called a "sale", publishers have them sometimes ;-) |
| 09:36 | llasram | fdaoud: I found it interesting. In my case, I "understood" macros before, but it increased my appreciation for how many contexts in which they can be useful |
| 09:36 | 45PAAH33Y | Let over lambda is already artful, intense book, but about Closures (not translation yet..) |
| 09:37 | fdaoud | I have many Manning books, not one bought at retail. They have half off ebooks all the time. |
| 09:37 | sanjoyd | fdaoud: one trick I picked up from On Lisp is writing macros like (when+ (open-file "foo") (print it)) |
| 09:37 | 45PAAH33Y | *is another artful |
| 09:37 | sanjoyd | Anamorphic macros, I think he calls them. |
| 09:37 | llasram | sanjoyd: Yeah... I'm not a fan of those :-) |
| 09:38 | sanjoyd | I've not written Lisp beyond toy programs, so I can't comment much on how useful they are in practice. |
| 09:38 | 45PAAH33Y | llasram: i think they're pretty cool looking. really concise and neat code... |
| 09:38 | sanjoyd | In fact, I intend to write some real-world lisp once I figure out clojure. |
| 09:38 | llasram | I prefer the Clojure convention of only using anaphoric macros with implicit positional anaphora. Less magical |
| 09:38 | cemerick | 45PAAH33Y: hilarious that we don't get notified of the sale. Without hearing of it here, I'd not have been able to tweet it, etc. |
| 09:38 | fdaoud | llasram, sanjoyd: interesting, I'll have a look |
| 09:38 | cemerick | fdaoud: meant the above for you, but whatever :-) |
| 09:39 | RickInGA | I have been slowly making my way through on lisp... reading lisp code makes me appreciate Clojure all the more |
| 09:39 | fdaoud | cemerick: it's all good :) |
| 09:39 | sanjoyd | Basically, you can s/On Lisp/Non-trivial program transformations using Common Lisp macros/ |
| 09:39 | 45PAAH33Y | cemerick: you'd think they be on top of these things. oreilly is more with the times than most, but not perfect... |
| 09:40 | 45PAAH33Y | RickInGA: hehe yeah. and do check out halloways translations |
| 09:40 | RickInGA | 45PAAH33Y: I know Fogus translated the first 5 chapters, I will look for Halloway's |
| 09:41 | 45PAAH33Y | fdaoud: Clojure in Action talks about anamorphic macros |
| 09:41 | fdaoud | 45PAAH33Y: ah, didn't know that. Haven't gotten to chapter 7 yet. Thanks for the heads up! |
| 09:42 | RickInGA | 45PAAH33Y: I see Halloway translated examples from Practical Common Lisp to Clojure. http://thinkrelevance.com/blog/2008/09/16/pcl-clojure |
| 09:43 | fdaoud | I don't (yet) know what an anamorphic macro is, so until I do, to me it's a macro that has an eating disorder. |
| 09:43 | 45PAAH33Y | RickInGA: I'm positive he did both.... *googling* |
| 09:43 | fdaoud | either that or a lacking in vitamin intake. |
| 09:44 | 45PAAH33Y | RickInGA: http://thinkrelevance.com/blog/2008/12/12/on-lisp-clojure |
| 09:44 | RickInGA | 45PAAH33Y cool, that will be useful. |
| 09:45 | Iceland_jack | fdaoud: anaPHOirc then? |
| 09:45 | Bronsa | fdaoud: http://en.wikipedia.org/wiki/Anaphoric_macro |
| 09:45 | 45PAAH33Y | fdaoud: I think you first learn something along the lines of (if (get-first-letter ["my words"]) upper-case it)... with *it* being the interesting part |
| 09:45 | 45PAAH33Y | lol sorry, phoric. not morphic |
| 09:45 | sanjoyd | Yeah, anaphoric. :P |
| 09:46 | 45PAAH33Y | If i start refering poetically to the human-like qualities of macros, then yes, anamophic :) |
| 09:46 | 45PAAH33Y | *morphic |
| 09:46 | Iceland_jack | anthropomorphic then surely? |
| 09:47 | 45PAAH33Y | Iceland_jack: lol yes.. |
| 09:47 | 45PAAH33Y | no sleep for many hours... need more coffee |
| 09:47 | Iceland_jack | anamorphic is just something that is not catamorphic |
| 09:47 | fdaoud | Bronsa: thanks |
| 09:47 | Bronsa | ITC greek words |
| 09:47 | fdaoud | Iceland_jack: right you are |
| 09:48 | Iceland_jack | anamorphic is also something that isn't green |
| 09:48 | 45PAAH33Y | Iceland_jack: if my macros come out in distorted dimensions... |
| 09:48 | fdaoud | 45PAAH33Y: what time is it for you? |
| 09:48 | sanjoyd | 45PAAH33Y: the c9 video is very nice! |
| 09:48 | 45PAAH33Y | fdaoud: almost 9AM |
| 09:49 | fdaoud | 45PAAH33Y: central US? |
| 09:49 | 45PAAH33Y | sanjoyd: my pleasure. but rhickey did all the work :) |
| 09:49 | 45PAAH33Y | fdaoud: that zone, but south of the border |
| 09:49 | fdaoud | 45PAAH33Y: south america? |
| 09:49 | 45PAAH33Y | fdaoud: too far south. Southern Mexico :) |
| 09:50 | fdaoud | 45PAAH33Y: ah ok, cool :) |
| 09:54 | TimMc | fdaoud: and not endomorphic, either |
| 09:54 | TimMc | which is a somatotype |
| 09:55 | fdaoud | TimMc: (inc (fdaoud :confusion)) |
| 09:55 | TimMc | fdaoud: That's the word you meant earlier. |
| 09:55 | Bronsa | ITC: complecting the english language with buzzwords. |
| 09:55 | TimMc | (update-in fdaoud [:confusion] (fnil inc 0)) |
| 09:55 | fdaoud | TimMc: indeed :D |
| 10:21 | jsabeaudry | What is the more convenient way of doing (take n (repeatedly f)) ? |
| 10:22 | fdaoud | jsabeaudry: (repeatedly n f) |
| 10:23 | clgv | jsabeaudry: it often pays to use 'doc ;) |
| 10:24 | jsabeaudry | heheheh thanks guys, what an embarasment ;) |
| 10:25 | fdaoud | clgv: true, but sometimes irc is an interactive doc/google :) |
| 10:40 | c4milo | time to give a try to clojure :) |
| 10:41 | c4milo | and test its community :P |
| 10:41 | Iceland_jack | oh-oh |
| 10:48 | llasram | Testing clojure.community |
| 10:48 | llasram | Ran 1 IRC channel containing 426 users. |
| 10:48 | llasram | 0 failures, 0 errors. |
| 10:48 | Fullmoon | That reminds me, what is a good unit test framework? |
| 10:49 | llasram | Fullmoon: clojure.test is definitely "good enough," and lein integrates with it out-of-the-box |
| 10:49 | llasram | Midje is more full-featured, and it also widely used |
| 10:50 | Fullmoon | llasram: Thanks, I will look into it, I don't really want something super-nice functional just yet, but I think learning clojure test-driven would be awesome |
| 10:54 | fdaoud | llasram: that's awesome :D |
| 10:55 | RickInGA | I went to hear Neal Ford talk about functional programming last night. He had nice things to say about the Clojure community |
| 10:55 | RickInGA | He said in the Ruby community, people will say "I really wish I had a program to control my tv, so I wrote this tv remote in ruby..." |
| 10:57 | RickInGA | He said in the Clojure community, you hear people say "I was reading this one PhD dissertation, and it occurred to me that a data structure from this other PhD dissertation. No one had combined the two yet, so here is my library combining them." |
| 10:58 | fdaoud | RickInGA: sounds interesting, link please? |
| 10:59 | RickInGA | fdaoud: no link to Neal Ford's talk. I don't think it was recorded, I think the specific example he was referring to was this talk from dnolen http://blip.tv/clojure/david-nolen-predicate-dispatch-5953889 |
| 11:00 | RickInGA | fdaoud if you are interested in Neal Ford talking about functional programming, he has a series he is writing http://www.ibm.com/developerworks/java/library/j-ft1/ |
| 11:00 | fdaoud | RickInGA: ah, you actually *went to* hear Neal Ford talk! For some reason I assumed you meant "went to" as in "in my browser" :) |
| 11:01 | fdaoud | RickInGA: thanks for the links |
| 11:01 | zerokarmaleft | RickInGA: atlanta software craftsmanship? |
| 11:01 | RickInGA | zerokarmaleft: yep. |
| 11:02 | RickInGA | zerokarmaleft: were you there? I was the guy who asked about similarities between datomic and cqrs (fat guy, glasses) |
| 11:02 | zerokarmaleft | didn't he give a similar talk at strangeloop '11? |
| 11:02 | zerokarmaleft | RickInGA: no, i just happened to be reading that same series from developerworks yesterday |
| 11:03 | RickInGA | zerokarmaleft: i don't know. I bet there are a lot of good presentations from Strange Loop. The only one I have watched so far is Simple Made Easy |
| 11:04 | zerokarmaleft | RickInGA: http://www.infoq.com/presentations/Functional-Thinking |
| 11:04 | fdaoud | loved that one. |
| 11:05 | RickInGA | zerokarmaleft just quick glance at some of his slides, it looks like the same talk |
| 11:06 | RickInGA | but last night thoughtworks provided pizza and beer. your link lacks both! :) |
| 11:08 | RickInGA | He also won't have mentioned datomic in the infoq link, just because of the timing. |
| 11:08 | RickInGA | He was really impressed with it, called it a "22nd Century Database" |
| 11:10 | autodidakt | zerokarmaleft: fdaoud, A blog post about those functional thinking talks -> http://blog.twonegatives.com/post/20182672074/functional-thinking-in-clojure-part-2 |
| 11:11 | fdaoud | autodidakt: nice! |
| 11:14 | zerokarmaleft | autodidakt: nice, thanks |
| 11:14 | dgrnbrg | technomancy: are you there? |
| 11:15 | autodidakt | dgrnbrg: technomancy is always with us |
| 11:16 | dgrnbrg | autodidakt: :) |
| 11:16 | dgrnbrg | I need help debugging an issue w/ my first released library & its corresponding lein plugin |
| 11:16 | dgrnbrg | The error is bizarre and incomprehensible to me |
| 11:17 | fdaoud | autodidakt: why the nick change to 64MAA73RA? |
| 11:18 | dgrnbrg | Here's the stack trace of the problem I'm having: https://gist.github.com/701aa6ef9fc54f58747b |
| 11:18 | dgrnbrg | it happens when I require a lib that I pushed to clojars in a plugin i'm writing |
| 11:18 | dgrnbrg | I can load the lib from the repl, though |
| 11:18 | dgrnbrg | it's my first time using clojars/maven and my first lein plugin, so i'm not sure where the issue lies |
| 11:20 | 64MAA73RA | fdaoud: fighting with nickserv, complaining in #freenode |
| 11:20 | fdaoud | 64MAA73RA: I see. |
| 11:23 | jaen | 64MAA73RA: actually does nickserv enforce anything at all? I regstered my nick but I never auth and I don't get kicked or anything. |
| 11:24 | TimMc | jaen: Did you tell your IRC client the password? It might auth for you. |
| 11:25 | jaen | I don't think so, I'm too lazy to check how to tell that to weechat after getting it to set urgency hint on highlight was so troublesome ; d |
| 11:26 | TimMc | dgrnbrg: Looks like it is missing some class? |
| 11:26 | dgrnbrg | TimMc: it's missing the lib I exported to clojars |
| 11:26 | dgrnbrg | but I added it to my project.clj |
| 11:26 | dgrnbrg | and did lein deps |
| 11:27 | TimMc | What does lein classpath show? |
| 11:27 | TimMc | That is, does it include it? |
| 11:27 | dgrnbrg | yes |
| 11:27 | dgrnbrg | it's got the jar on the classpath |
| 11:27 | dgrnbrg | I don't know if maybe I didn't do the clojars thing correctly |
| 11:28 | dgrnbrg | I just registered for clojars and did lein push |
| 11:28 | dgrnbrg | and nothing else as far as I can recall |
| 11:28 | dgrnbrg | do I need to create a manifest or something? |
| 11:29 | dgrnbrg | TimMc: is there something special I need to do to release on clojars? |
| 11:30 | TimMc | No, that sounds right. |
| 11:30 | TimMc | dgrnbrg: Can you gist a failing project.clj for me? |
| 11:30 | dgrnbrg | TimMc: i have the code on github (all 10 lines) |
| 11:31 | dgrnbrg | https://github.com/dgrnbrg/lein-guzheng |
| 11:31 | Wild_Cat | is there an event-driven network programming framework for Clojure (a Twisted equivalent, basically)? |
| 11:31 | TimMc | I might give that a try in a few minutes. |
| 11:32 | dgrnbrg | TimMc: the project.clj is there, as well |
| 11:32 | dgrnbrg | if anything sticks out to you... |
| 11:32 | zerokarmaleft | Wild_Cat: lamina |
| 11:32 | TimMc | dgrnbrg: Besides a :url field? No. :-) |
| 11:33 | zerokarmaleft | Wild_Cat: er aleph, which is built on lamina |
| 11:33 | Wild_Cat | zerokarmaleft: checking it out now, thanks |
| 11:34 | fdaoud | jaen: I'm not sure but I think it would only be an issue if there was a conflict between you and someone else for the same nick. |
| 11:34 | TimMc | fdaoud: How does NickServ know jaen isn't "someone else"? |
| 11:35 | jaen | Maybe probably then I would have to auth for reals or something. |
| 11:35 | jaen | Thoguh I find it pretty weird I don't have to right now anyway. |
| 11:36 | fdaoud | TimMc: because you auth yourself to nickserv with your password. |
| 11:39 | fdaoud | TimMc: you can force someone to change their nick if they are using yours and you are the one who has registered it. |
| 11:39 | devn | ghost |
| 11:40 | fdaoud | jaen: if you never auth, your registration may expire. |
| 11:41 | fdaoud | also, apparently some channels only allow registered nicks in. also apparently, some irc clients identify those you are using registered nicks. |
| 11:41 | Raynes | /message nickserv ghost yournick yourpass |
| 11:41 | Raynes | Er, /msg |
| 11:41 | jaen | Duh... I'll look how to get weechat to auth me. I hope it's not some obscure script I had to fish from google as it was case with the urgency hint |
| 11:41 | Raynes | Too early. |
| 11:43 | fdaoud | also to prevent the problem at all you can use /msg nickserv set enforce on |
| 11:43 | fdaoud | Raynes: that's also useful when it's you who is the ghost, you got disconnected somehow and when you rejoin, your "previous self" is a zombie |
| 11:44 | Raynes | Indeed. |
| 11:45 | TimMc | I think that's what "ghost" means. |
| 11:45 | fdaoud | TimMc: yeah. Really to boot someone you'd use /msg nickserv release TimMc <password> |
| 11:46 | TimMc | So, I'm under the impression that freenode's NickServ will boot anyone who doesn't auth in X seconds when using a registered nick. |
| 11:50 | devn | that's what i thought as well |
| 11:50 | S11001001 | TimMc: I doubt it, unless there's a non-default option |
| 11:51 | devn | on other networks the zombie problem is way more common |
| 11:51 | S11001001 | you do get booted for not ponging |
| 11:51 | fdaoud | TimMc: that is what /msg nickserv set enforce on does |
| 11:51 | fdaoud | you decide whether to enforce for your nick |
| 11:54 | TimMc | aha! |
| 11:54 | TimMc | I set my nick up so long ago, I must have forgotten setting that. |
| 11:58 | devn | i cannot get over how nice mosh is |
| 11:59 | gfredericks | in an aleph http server is it redundant to start up a new thread to handle the request? |
| 11:59 | devn | i want to shout it from the top of a mountain |
| 11:59 | fdaoud | devn: mosh? |
| 11:59 | devn | llasram: lol. ssh is fine. im still going to ssh -x, tunnel with it, etc. |
| 11:59 | devn | fdaoud: http://mosh.mit.edu/ |
| 12:00 | llasram | devn: I really should give it a try, but I'm not quite sure what it buys over ssh -t 'screen -x' |
| 12:01 | gfredericks | "On a bad connection, outstanding predictions are underlined so you won't be misled." |
| 12:01 | gfredericks | that is interesting |
| 12:01 | gfredericks | I wonder how they underline deletions |
| 12:03 | llasram | The un-derline them |
| 12:03 | llasram | s,The,They, |
| 12:04 | llasram | ~rimshot |
| 12:04 | clojurebot | Badum, *tish* |
| 12:11 | autodidakto | finally |
| 12:13 | autodidakto | devn: my understanding is the mosh wraps around ssh, providing some modern nicesties? |
| 12:14 | autodidakto | devn: I always assumed we learned a trick or two since the 1980s. Nice to finally be able to use them |
| 12:14 | autodidakto | devn: But what I want to know is: Is it 100% internet-hipster approved? |
| 12:15 | jaen | What sort of niceties one would need apart from tmux, because I'm squinting at this mosh page and can't figure what's so awesome in it ; < |
| 12:16 | autodidakto | jaen: it's not a screen/tmux replacement |
| 12:16 | offby1 | jaen: I just started using it. It works, but I can't say it "feels" any different from ssh. |
| 12:16 | offby1 | Supposedly there's less latency. |
| 12:16 | autodidakto | jaen: my vague understanding is that it wraps some UDP around your SSH TCP and it's fun for U 'n' Me |
| 12:17 | offby1 | Hey, you got your chocolate in my peanut butter. |
| 12:17 | jaen | That I figured already, but I'm too dumb to figure what sort nice it gives me from the page... |
| 12:17 | autodidakto | jaen ever play quake1? |
| 12:17 | autodidakto | or hl1 before the "new netcode" ? |
| 12:17 | offby1 | jaen: also, it'll automatically reconnect if you, say, move your laptop from one network to another. |
| 12:17 | jaen | Hahaha, too young for that, I didn't have internets back then |
| 12:18 | autodidakto | and you have you start shooting your M16 before going around the corner (in counter-strike) just in case? |
| 12:18 | jaen | But I can sort of get what yo're trying to say |
| 12:18 | jaen | It's just more stable on wacky connections? |
| 12:18 | autodidakto | my impress is, SSH with modern network code |
| 12:19 | autodidakto | not just more stable, but what offby1 said.. you can put your laptop to sleep and wake it up and you're "still" connected |
| 12:19 | autodidakto | jaen: you're grandfather's ssh can't do that |
| 12:20 | offby1 | of course if, like me, you only use ssh to connect to a long-running "screen" or "tmux" session, then it doesn't buy you much |
| 12:20 | autodidakto | offby1: i'd connect to your long-running screen session any day for free.... oh wait, is this still #emacs? |
| 12:21 | jaen | That explains why I don't see anything awesome in it. I hardly ever sleep my laptop, since linux and sandy bridge tend to not like eachother in ceratin aspects ; D |
| 12:21 | jaen | offby1: okay, that's pretty much what I figured |
| 12:21 | autodidakto | jaen: you got 56K modulate into your TCP/IPs over Pentium MMX emulation! |
| 12:21 | jaen | Was interested if it gives anything to ye old non-mobile programmer ; d |
| 12:21 | jaen | *ye olde |
| 12:22 | autodidakto | jaen: give it a try the next time you get a chance. maybe you'll like it. maybe it's not worth it. What do we IRC people know anyway? |
| 12:22 | jaen | Certainly more than me : D |
| 12:23 | autodidakto | jaen: you'd be surprised |
| 12:23 | offby1 | jaen: I've got to say, it's one of the slickest open-source packages I've used. The docs are good; the software was easily available on the two platforms on which I'd looked for it |
| 12:24 | offby1 | I get the impression they waited until they were done to announce it. |
| 12:24 | offby1 | Oh and there's a super-helpful #mosh channel on this very IRC network. |
| 12:24 | autodidakto | offby1: And did you see that website? Richard Stallman CSS bootstrap? No way |
| 12:24 | jaen | Maybe I'll take a look at it one of these days ; D |
| 12:29 | autodidakto | Raynes: Thou shalt pull what I request |
| 12:29 | Raynes | autodidakto: Oh, I forgot to get to that. |
| 12:29 | Raynes | autodidakto: I'm not sure that's what we're after though. |
| 12:29 | clojurebot | Gabh mo leithscéal? |
| 12:30 | Raynes | The idea was that the height would increase with the browser, not the code. |
| 12:31 | autodidakto | Raynes: but if the code isn't there, why have a bigger empty box? |
| 12:31 | autodidakto | you could do a bigger min-height, but I'd need to a add a media query |
| 12:31 | Raynes | Because it's better than a giant empty space surrounding the small empty box. |
| 12:32 | autodidakto | Raynes: if you're box is empty. type |
| 12:32 | autodidakto | lol i dont know either. hmm |
| 12:32 | Raynes | :p |
| 12:33 | autodidakto | So, a big box empty box that fills your screen, but one line of code is better than a smaller-ish box with one line of code? |
| 12:34 | Raynes | Apparently. |
| 12:34 | Raynes | Several people have requested it. |
| 12:34 | autodidakto | Either way you're getting a bunch of empty space if you dont put code in their and you have a big screen |
| 12:34 | Raynes | So I guess by popular demand... |
| 12:34 | autodidakto | you can have that big empty space be the bg-color (black), or the color of the empty box |
| 12:35 | Raynes | I say we just take the website down and call it a day. Can't take these damn decisions. |
| 12:35 | Raynes | ;p |
| 12:35 | autodidakto | Have that guy who was requesting the feature take a look. I think it is what he's looking for |
| 12:35 | autodidakto | I know. Lots of little annoying things to decide... |
| 12:36 | autodidakto | But hey, you asked for me. I just heard an interview with you last night and you said "check out my issues on refheap and help out!" and i spent the next hour or so doing that :) |
| 12:36 | Raynes | autodidakto: He has an issue there. Ping him. |
| 12:36 | autodidakto | *you ask for it |
| 12:36 | Raynes | huh |
| 12:36 | Raynes | Wait, was that the dictv thing? |
| 12:37 | autodidakto | Raynes: lol i dunno, some random goofy guy on ustream i found in a google search |
| 12:37 | Raynes | Bahaha, yeah, the dictv thing. It's pretty crazy that you found that. |
| 12:38 | autodidakto | That's the name dictv? The guy was a little out there, for my taste. Why is crazy that i found that? |
| 12:38 | Raynes | It is a weekly web show related to dreamincode.com |
| 12:39 | Raynes | They like crazy out there stuff. |
| 12:39 | Raynes | It's just that dictv is really highly isolated to dreamincode people. |
| 12:40 | Raynes | I wouldn't expect anyone not from there to have come across it. |
| 12:40 | autodidakto | "jeremyheiler" was the guy, right? he's participating the issue. I'll msg him. |
| 12:40 | Raynes | Yeah, that's him. |
| 12:41 | autodidakto | Raynes: Yeah I was googling your name/handle |
| 12:41 | Raynes | He seemed pretty opinionated about it, so if he is into this we'll probably go for it. |
| 12:41 | offby1 | that's pretty personal |
| 12:41 | autodidakto | offby1: that's how i like it |
| 12:41 | Raynes | Wow! My very own stalker! |
| 12:41 | offby1 | he's mine; hands off |
| 12:43 | autodidakto | Raynes: Haha well. Learning clojure and chatting in IRC at the same... There are many "hey wait a minute, I know that guy!" moments |
| 12:43 | autodidakto | *at the same time |
| 12:44 | Raynes | Heh |
| 12:44 | Raynes | I don't think you know me. |
| 12:44 | fdaoud | (inc (fdaoud :confusion)) |
| 12:44 | lazybot | ⇒ 1 |
| 12:44 | Raynes | Though you should. I'm pretty great. |
| 12:44 | babilen | Raynes: Just seen you being active, so I thought I just "bug" you here. -- I incorporated your suggestions regarding my pull request on fs. Is there anything else you would change? |
| 12:45 | Raynes | Oh man. I just forgot about it. |
| 12:45 | Raynes | I'm sorry! |
| 12:45 | autodidakto | Well, know = slightly interacted with him on irc... Haha. I believe it. Alabama charm. My step dad is from oklahoma. I really need to visit the area |
| 12:45 | babilen | Raynes: Don't worry -- Hence my ping :) |
| 12:49 | babilen | weavejester: Any comments on the changes to make clucy ready for lucene 3.5.0 ? (https://github.com/weavejester/clucy/pull/8) |
| 12:49 | Raynes | babilen: Okay, I see why I didn't pull this immediately. It's actually something silly that I could have fixed myself: you need to use the `file` function in fs.core and not clojure.java.io/file. They're generally the same, but the one in fs.core has some special cwd behavior. It's a three character change. If you could update that, I'll pull. Or you can just tell me to stop being lazy and do it myself. Whatever you want. :) |
| 12:50 | babilen | Raynes: I've changed that already and pushed the changes. It doesn't make sense to use it for absolute? though as this would cause *every* path to be absolute ;) |
| 12:51 | Raynes | Oh. Duh. |
| 12:51 | Raynes | Yeah, I mostly just scanned the diff for io/file and red lights started flashing in my skull. |
| 12:51 | Raynes | You're right. I'll merge this in a minute. |
| 12:52 | weavejester | babilen: Sorry, I haven't been keeping up with Lucene, so making sure the changes made are correct (because they delete a lot of things) is a pretty big effort for me. I haven't had the time to sort it out. |
| 12:52 | Raynes | Sorry it took so long. |
| 12:52 | babilen | Raynes: Most appreciated. Should have mentioned the absolute? case :) |
| 12:52 | babilen | weavejester: Alright -- Let me know if you need more information or if I could make it easier for you. |
| 12:53 | technomancy | dgrnbrg: what's up? |
| 12:54 | babilen | weavejester: The main difference is that calls to optimize() are strongly discouraged (and optimize() has been renamed to forceMerge() to reflect that) -- I therefore deleted all code that was needed to call optimize() in specific intervals. |
| 12:55 | weavejester | babilen: Hmm, okay, I see that... |
| 12:55 | babilen | weavejester: FWIW - I have used that code in production for a while now and haven't had problems with it. I still strongly encourage you to test it yourself. Just wanted to know if you need additional information. |
| 12:55 | weavejester | babilen: Oh, is there a reason you don't have a 1.3-lucene3 multi-dep? |
| 12:56 | babilen | weavejester: That is the default |
| 12:56 | weavejester | babilen: Ahh |
| 12:57 | babilen | :) |
| 12:57 | weavejester | babilen: I'll try and get it merged by this weekend. Now I look at it more closely, it appears a sensible change. |
| 12:57 | weavejester | babilen: Usually I merge things faster, but I haven't touched clucy in a while. Technomancy was the last to touch it :) |
| 12:58 | Raynes | babilen: You forgot to remove your join tests. |
| 12:58 | Raynes | Evil! |
| 12:58 | babilen | weavejester: Wonderful! Most appreciated. It just happened that I use clucy myself a bit these days in other code and just wanted to make sure that I don't stray too far from upstream. I am actually working on ways to programmatically construct queries, but that is not yet ready. |
| 12:58 | autodidakto | technomancy: dgrnbrg posted -> https://gist.github.com/701aa6ef9fc54f58747b . says he gets that when requiring a lib he push on clojars, in a plugin he's making |
| 12:59 | babilen | Raynes: Argh! Sorry! :( -- Should I push that change? |
| 12:59 | Raynes | babilen: Naw, I've got it. |
| 12:59 | autodidakto | but can load it in a repl |
| 12:59 | babilen | Raynes: Great -- Sorry :'-( |
| 12:59 | weavejester | babilen: You use Clucy a lot then? Hmmm... |
| 12:59 | Raynes | babilen: Your changed are pushed. |
| 13:00 | Raynes | I'm so sorry that took so long. |
| 13:00 | babilen | weavejester: Well - I use lucene to index text and write my program in Clojure -- Clucy was a sensible choice at the time and I "knew" it already due to its usage in leiningen. |
| 13:02 | weavejester | babilen: Okay, I'll merge in the changes, I think. If there are any problems, I'll point the pitchfork wielding mob in your direction. |
| 13:02 | babilen | hehe |
| 13:02 | babilen | (the tests pass!) |
| 13:02 | weavejester | That's responsible project management, right? :) |
| 13:03 | technomancy | dgrnbrg: hmmm; it works fine here. which leiningen version are you using? |
| 13:03 | babilen | Hmm, maybe we could convince technomancy to try leiningen with the proposed changes :-/ (There might be additional tests related to the search/index functionality) |
| 13:04 | technomancy | babilen: how about right after the preview3 release? |
| 13:04 | babilen | technomancy: Sure -- I just have no idea how else I could verify that clucy is still doing its thing. I have that impression, but would like to gather additional data points :) |
| 13:04 | dnolen | another massive speed boost for CLJS, direct invocation for known fns - it's now possible to write CLJS w/ identical perf to JS |
| 13:05 | technomancy | only 3 issues blocking preview3: https://github.com/technomancy/leiningen/issues?sort=created&direction=desc&state=open&page=1&milestone=2 |
| 13:06 | Na-Fiann | hi, I'm trying to install clojure from the instructions from here: http://riddell.us/ClojureOnUbuntu.html. However, when installing clojure-contrib, there is no file called clojure-contrib.jar generated after mvn install. Anyone know where it went? I'm on ubuntu 10.10 |
| 13:06 | lazybot | The riddell.us tutorials are much more highly-ranked on Google than they deserve to be. They're old and way too complicated. If you're trying to install Clojure...don't! Instead, install Leiningen (https://github.com/technomancy/leiningen/tree/stable) and let it manage Clojure for you.10.10 |
| 13:06 | jsabeaudry | partition can be seen as splitting the seq into rows assuming a row-major format, is there some kind of equivalent for column major format? Best I could find is (partition nrows (apply interleave (partition v ncols))) |
| 13:06 | Na-Fiann | lol wow, that's awesome :) |
| 13:06 | technomancy | lazybot: botsnack |
| 13:06 | lazybot | technomancy: Thanks! Om nom nom!! |
| 13:08 | weavejester | babilen: Okay, merged and released 0.3.0 |
| 13:08 | RickInGA | technomancy: just wanted to let you know what a powerful influence you have on the community.... I bought an aeropress last week. |
| 13:08 | babilen | weavejester: yay! |
| 13:08 | weavejester | babilen: Sorry again for the delay |
| 13:08 | technomancy | RickInGA: haha; excellent. |
| 13:08 | weavejester | babilen: Any more pull requests you have should be merged faster |
| 13:09 | technomancy | with some proper beans you'll be all set |
| 13:09 | autodidakto | technomancy: I dont get that thing... a single serving french press? |
| 13:09 | RickInGA | yeah, I am going to have to see what I can find |
| 13:09 | jsabeaudry | &(partition 2 (apply interleave (partition 4 [:1_1 :1_2 :1_3 :1_4 :2_1 :2_2 :2_3 :2_4]))) |
| 13:09 | lazybot | ⇒ ((:1_1 :2_1) (:1_2 :2_2) (:1_3 :2_3) (:1_4 :2_4)) |
| 13:10 | technomancy | autodidakto: sort of, but it has some advantages over a french press |
| 13:10 | weavejester | Huh, apparently I joined GitHub 18 days after it first went live. |
| 13:10 | technomancy | autodidakto: since it uses paper filters, you can use a much finer grind, which means you don't need to keep the water as hot |
| 13:10 | technomancy | so the end result is less bitter |
| 13:10 | technomancy | plus you don't get any grit in it, and it's easier to clean |
| 13:10 | autodidakto | technomancy: I see |
| 13:11 | fdaoud | keurig ftw |
| 13:12 | autodidakto | Raynes: We have a winner! -> I "applied" the patch directly in Chrome from refheap.com, and I most definitely approve of this. [https://github.com/Raynes/refheap/issues/45#issuecomment-5050785] |
| 13:12 | Raynes | I saw. |
| 13:12 | Raynes | I'm testing it out right now. |
| 13:12 | autodidakto | Hehe. just keeping you honest... |
| 13:12 | fdaoud | where is the pause button on this channel? |
| 13:13 | autodidakto | fdaoud: it's only got one gear: Go |
| 13:13 | fdaoud | ok then, |
| 13:13 | fdaoud | where is the record button on this channel? |
| 13:13 | TimMc | ~logs |
| 13:13 | clojurebot | logs is http://clojure-log.n01se.net/ |
| 13:13 | Raynes | autodidakto: Okay, I have one problem. |
| 13:14 | autodidakto | yeah? |
| 13:14 | Raynes | autodidakto: When I paste something long, I get slapped to the bottom of the page. |
| 13:14 | fdaoud | awesome. |
| 13:14 | Raynes | The paste button is at the top of the page. |
| 13:14 | Raynes | :( |
| 13:14 | autodidakto | not winning! let me check |
| 13:14 | fdaoud | TimMc: thanks |
| 13:17 | groovemonkey | I'm looking to collect values from nested loops...doseq returns nil, and I'm not sure how to yield values from inside them...can anyone help me out? |
| 13:17 | groovemonkey | i.e. |
| 13:17 | groovemonkey | (let [room (rand-nth [:bedroom :bathroom :living-room])] |
| 13:17 | groovemonkey | (doseq [furniture [:mirror :chair]] |
| 13:17 | groovemonkey | (let [type [:type1 :type2]] |
| 13:17 | groovemonkey | (list type)))) ;; what I want to return |
| 13:18 | autodidakto | Raynes: Oh i see. you paste, and now you got to scroll up |
| 13:18 | raek | groovemonkey: use for instead of doseq |
| 13:19 | raek | doseq is a variant of for that does not collect the results |
| 13:19 | groovemonkey | ahh so just use a for loop? |
| 13:19 | raek | (for [furniture [:mirror :chair]] ...) |
| 13:19 | groovemonkey | raek: thank you, didn't see your first answer |
| 13:19 | raek | it has the same syntax as doseq |
| 13:19 | groovemonkey | excellent, thank you! |
| 13:20 | autodidakto | Raynes: you really do want it all, don't you? :) Options -> 1) Paste button on bottom (as well, or only). 2) Ignore it, most pastes are short 3) uhm lemme think |
| 13:22 | autodidakto | 3) the hardcore paster without time to scroll up should be using the keyboard shortcuts [COMING SOON!] 4) Still thinking |
| 13:24 | jappy123 | (extend-type java.lang.String |
| 13:24 | jappy123 | java.lang.Runnable (run [_] (println "hello"))) |
| 13:25 | jappy123 | is there any way to have existing types dynamically implement interfaces like they can protocols? i.e. |
| 13:25 | jappy123 | sorry wrong order |
| 13:25 | Bronsa | not in clojure |
| 13:26 | jappy123 | I have existing objects I want to treat like IFn and ISeq but I dont want to have to implement those interfaces in java... and I dont want to have to wrap my objects |
| 13:27 | jappy123 | I dont understand why the protocols can't behave like real interfaces. |
| 13:28 | llasram | jappy123: Protocols were a later feature. Clojurescript implements those core interfaces as protocols. Hopefully Clojure will eventually too |
| 13:28 | technomancy | IFn can't be a protocol in Clojure. ಥ_ಥ |
| 13:29 | llasram | Yeah... That one would be a tad tricky |
| 13:29 | dnolen | jappy123: what you mean is why interfaces can't act like protocols. |
| 13:29 | jappy123 | right |
| 13:30 | dnolen | Clojure on the JVM is one giant epic battle against a VM designed for a static programming language. |
| 13:30 | jappy123 | looking at the extend code... it seems like it should be doable |
| 13:31 | hcumberdale | Hi ;) |
| 13:31 | jappy123 | has anyone ever implemented IFn... we should be able to decorate our types lazily too :p |
| 13:31 | hiredman | dnolen: well, it could have been the clr... |
| 13:31 | hcumberdale | I want to merge an incoming json request |
| 13:31 | jappy123 | I dont know... I still believe in magic |
| 13:31 | hcumberdale | but only the keys that exists in a map |
| 13:32 | mrb_bk | dnolen: woot thanks for the shouts |
| 13:32 | hcumberdale | is there a "merge-existing" for maps? |
| 13:32 | RickInGA | at the meetup group I went to last night, Neal Ford said that tail recursion was coming to a future version of java, and he said that higher order functions were going to be in java 1.8. do we know what version will have tco? |
| 13:32 | dnolen | mrb_bk: :) |
| 13:32 | TimMc | jappy123: I have, it wasn't pretty. |
| 13:34 | raek | hcumberdale: you can do something like (merge m1 (select-keys m2 (keys m1))) |
| 13:34 | jappy123 | Its great stuff when your code can behave like a persistent map, seq, vector, etc... and with all the talk I thought making your "collection'ish" types play well would be simple |
| 13:35 | hcumberdale | ,(merge {:x 1 :y 2 :badkey "3"} (select-keys {:x nil :y nil} (keys {:x 1 :y 2 :badkey "3"}))) |
| 13:35 | clojurebot | {:y nil, :x nil, :badkey "3"} |
| 13:36 | hcumberdale | raek: seems not to work ;( |
| 13:37 | Raynes | autodidakto: Not sure what to do about it either. |
| 13:37 | hcumberdale | ,(merge {:x 1 :y 2 :badkey "3"} (select-keys {:x 1 :y 2 :badkey "3"} (keys {:x nil :y nil}))) |
| 13:37 | clojurebot | {:y 2, :x 1, :badkey "3"} |
| 13:38 | hcumberdale | ??, .... |
| 13:38 | hcumberdale | ahh |
| 13:38 | hcumberdale | ,(merge {:x nil :y nil} (select-keys {:x 1 :y 2 :badkey "3"} (keys {:x nil :y nil}))) |
| 13:38 | clojurebot | {:y 2, :x 1} |
| 13:38 | raek | hcumberdale: I though of it like this: ##(let [defaults {:x nil, :y nil}, potentially-bad {:x 1, :z 3}] (merge good-keys (select-keys potentially-bad (keys defaults)))) |
| 13:38 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: good-keys in this context |
| 13:39 | raek | eh |
| 13:39 | hcumberdale | thx raek |
| 13:39 | raek | &(let [defaults {:x nil, :y nil}, potentially-bad {:x 1, :z 3}] (merge defaults (select-keys potentially-bad (keys defaults)))) |
| 13:39 | lazybot | ⇒ {:y nil, :x 1} |
| 13:39 | hcumberdale | yeah! |
| 13:41 | hcumberdale | I'll test the clojure blog the first time on heroku today :) |
| 13:42 | autodidakto | raek: ahh i see... using good keys, grab the good stuff from the bad hash, merge with the good hash |
| 13:45 | hcumberdale | autodidakto: nice nick |
| 13:46 | autodidakto | hcumberdale: thank you :) |
| 13:50 | dgrnbrg | TimMc: did you get a chance to look at that project.clj of my lein-guzheng projecT? |
| 13:55 | dnolen | oooh, we're on the verge 1.4.0? |
| 13:55 | gfredericks | we are? |
| 13:55 | gfredericks | 1.4: where all vars are dynamic by default and you have to specify ^:boring to get the formerly default behavior |
| 13:56 | autodidakto | dgrnbrg: did you see technomancy's messages? |
| 13:56 | dgrnbrg | autodidakto: I didn't, and then my scroll back made them die |
| 13:56 | dgrnbrg | i was at lunch, alas |
| 13:56 | dgrnbrg | :( |
| 13:56 | dgrnbrg | is there a log of this room? |
| 13:57 | llasram | dgrnbrg: http://clojure-log.n01se.net/ :-) |
| 13:57 | autodidakto | <technomancy> dgrnbrg: hmmm; it works fine here. which leiningen version are you using? |
| 13:57 | llasram | dgrnbrg: This gist was "Works for me. What lein version are you using" |
| 13:57 | llasram | Oh, there you go |
| 13:57 | autodidakto | :) |
| 13:58 | dgrnbrg | ah |
| 13:58 | dgrnbrg | I'm using Leiningen 1.6.2 on Java 1.7.0-ea OpenJDK 64-Bit Server VM |
| 13:58 | autodidakto | dgrnbrg: tried the latest? |
| 13:59 | muhoo | dgrnbrg: lein 1.7.1 is the most current stable IIRC. |
| 13:59 | dgrnbrg | is there a command to update? |
| 13:59 | muhoo | dgrnbrg: https://raw.github.com/technomancy/leiningen/stable/bin/lein |
| 13:59 | autodidakto | lein -h |
| 13:59 | autodidakto | try lein upgrade |
| 14:00 | muhoo | even better ^ |
| 14:00 | dgrnbrg | autodidakto: awesome :) |
| 14:00 | dgrnbrg | I kept trying lein update |
| 14:00 | dgrnbrg | rather, i tried it once, and it didn't work |
| 14:01 | autodidakto | download from github if that command doesnt work, i assume |
| 14:01 | dgrnbrg | the command worked |
| 14:01 | dgrnbrg | but lein guzheng still doesn't work |
| 14:02 | technomancy | dgrnbrg: oh, I thought you said you were going to target lein2 first |
| 14:03 | dgrnbrg | technomancy: I actually need lein 1 support, since I'm writing this to scratch an itch |
| 14:03 | dgrnbrg | and that itch is running on lein 1 for now |
| 14:03 | dgrnbrg | :/ |
| 14:03 | technomancy | oh, ok. I just tried it on lein 1.7.1 and it works fine for me to. |
| 14:03 | dgrnbrg | you don't get that class loader issue? |
| 14:03 | technomancy | no |
| 14:03 | hcumberdale | I will try lein2 out later :) |
| 14:04 | dgrnbrg | technomancy: is there some way I couldn't messed up my class path globally? |
| 14:04 | dgrnbrg | *could've |
| 14:04 | dgrnbrg | are you on mac or linux? |
| 14:04 | technomancy | in lein1 the only global classpath settings are the user plugins |
| 14:05 | technomancy | unless you've set the CLASSPATH env var, which you should basically never do |
| 14:05 | technomancy | so it could be something in ~/.lein/plugins interfering |
| 14:05 | technomancy | (this is not a problem in lein2) |
| 14:05 | dgrnbrg | nope, i have not done that |
| 14:06 | dgrnbrg | so, you can git clone lein-guzheng, and then run "lein guzheng" in that directory and it works? |
| 14:06 | technomancy | I did "lein1 plugin install lein-guzheng 0.1.0-SNAPSHOT", then "lein1 guzheng" and it works fine |
| 14:07 | oskarth_ | :q |
| 14:07 | technomancy | dgrnbrg: well, you have to call "lein guzheng" on a project that is not :eval-in-leiningen if you're using lein1 |
| 14:07 | dgrnbrg | technomancy: what's the workflow for testing my plugin? |
| 14:07 | hcumberdale | awwww |
| 14:08 | hcumberdale | lein ring server-headless 8080 << does not run clojure 1.3 !!! |
| 14:08 | hcumberdale | :dependencies [[org.clojure/clojure "1.3.0"] !! |
| 14:08 | technomancy | dgrnbrg: if you don't want to go through the install cycle every time, you can symlink your plugin's src/ dir into ~/.lein/plugins/lein-guzheng |
| 14:10 | hcumberdale | java -Xbootclasspath/a:/home/user/.m2/repository/org/clojure/clojure/1.2.1/clojure-1.2.1.jar << started by lein ring ,... |
| 14:10 | hcumberdale | technomancy: do you know what is going wrong? |
| 14:10 | technomancy | hcumberdale: you can't change the version of Clojure that Leiningen uses for itself, just the version used for your project |
| 14:11 | dgrnbrg | technomancy: so I'll have ~/.lein/plugins/lein-guzheng/leiningen/guzheng.clj |
| 14:11 | dgrnbrg | Do I also need to do a "lein plugin install …" |
| 14:11 | technomancy | not if you have that symlink |
| 14:12 | dgrnbrg | now when I run "lein guzheng" in another project, it says "that's not a task. (etc)" |
| 14:13 | hcumberdale | thx technomancy ! I've seen it |
| 14:13 | hcumberdale | The subprocess is running 1.3 ;) |
| 14:13 | technomancy | dgrnbrg: hmm... I guess you have to do "lein jar" in lein-guzheng |
| 14:14 | technomancy | and symlink that into ~/.lein/plugins instead |
| 14:14 | technomancy | so you have to do "lein jar" when you want to update it, but you can skip "lein plugin install" |
| 14:14 | dgrnbrg | technomancy: I don't see the lein-guzheng that I symlinked into the .lein/plugins directory on the classpath |
| 14:14 | dgrnbrg | ok |
| 14:15 | dgrnbrg | let me try that |
| 14:15 | technomancy | hard to keep this straight since I've been on lein2 for so long |
| 14:16 | dgrnbrg | technomancy: HOORAY! |
| 14:16 | dgrnbrg | it works |
| 14:16 | dgrnbrg | will this plugin also work on lein2, do you think? |
| 14:16 | cjfrisz | Is swank-clojure known to have problems with record definitions across multiple files implementing protocols in separate files? |
| 14:16 | cjfrisz | On the repl, specifically? |
| 14:16 | hiredman | records and protocols and deftypes have issues with code reloading |
| 14:17 | dgrnbrg | technomancy: thank you for your help--I had a deep misunderstanding of how this worked, but now I can finish the plugin and release it :) |
| 14:17 | technomancy | dgrnbrg: so far you don't have anything that would make it incompatible |
| 14:17 | cjfrisz | hiredman: I seem to running into that in spades, are there any specifics or known documentation on the problem? |
| 14:17 | hcumberdale | Anyone tryed this: http://blog.heroku.com/archives/2011/7/5/clojure_on_heroku/ ? |
| 14:17 | technomancy | hcumberdale: sure have; what's up? |
| 14:17 | Raynes | hcumberdale: tryclj.com runs on heroku |
| 14:17 | hiredman | cjfrisz: why are you using them? |
| 14:18 | hcumberdale | procfile: web: lein run -m demo.web |
| 14:18 | hcumberdale | should lein really run in such a heroku app? |
| 14:18 | cjfrisz | hiredman: why am I using records and protocols? |
| 14:18 | hiredman | yes |
| 14:18 | technomancy | hcumberdale: sure, but it's better to do "lein trampoline run -m demo.web" instead to save memory |
| 14:18 | cjfrisz | I'm messing with writing a CPSer with records, and I'm trying to do testing in the repl |
| 14:19 | cjfrisz | CPSer for Clojure, that is |
| 14:19 | hiredman | CPSer? |
| 14:19 | hcumberdale | can the app get started without lein ? |
| 14:19 | hiredman | sure, but what about that requireds records and protocols? |
| 14:19 | hcumberdale | why do they require a build tool installed on production servers? |
| 14:19 | hcumberdale | lein needs a own vm?! Think this is overhead?! |
| 14:20 | Raynes | I'm... not... |
| 14:20 | technomancy | hcumberdale: that's what the trampoline task is for |
| 14:20 | cjfrisz | hiredman: It makes it far easier to extend the CPSer |
| 14:20 | dnolen | cjfrisz: CPS any particular reason you didn't go w/ maps and multimethods here? |
| 14:20 | technomancy | hcumberdale: Leiningen calculates everything the app needs to run, then exits its VM, and the shell script launches the project |
| 14:20 | dnolen | cjfrisz: records and protocols are nice but are a real hassle on the JVM for interactive development. |
| 14:20 | hiredman | cjfrisz: protocols and records/types are a performance optimization |
| 14:21 | technomancy | if you like you can just put the appropriate call to /usr/bin/java or whatever in the Procfile, but "lein trampoline run" is a lot easier |
| 14:21 | Raynes | They don't 'require' you use a build tool. It's just that everybody uses lein to run their code/websites. |
| 14:21 | cjfrisz | dnolen hiredman: didn't know they were such a problem for interactive |
| 14:21 | cjfrisz | They seemed appropriate for what I wanted to do, but I may be wrong |
| 14:21 | Raynes | You can use whatever you want, but you still need lein to download your dependencies and stuff. |
| 14:22 | Raynes | Unless you want to fetch those manually too, which isn't remotely fun. |
| 14:22 | hcumberdale | Aaaahhh! ,... and writing ueberjar packages to heroku?! |
| 14:22 | technomancy | hcumberdale: Clojure itself is strictly a library; it doesn't come with what's needed to launch it from the command-line |
| 14:22 | hcumberdale | technomancy: and java -jar ... in the procfile? |
| 14:23 | TimMc | dgrnbrg: What was the solution? |
| 14:23 | dnolen | cjfrisz: they're really are intended for performance - but for a CPSer I think maps + multimethods would work fine and simpler. |
| 14:23 | technomancy | hcumberdale: you can do that if you get leiningen to create an uberjar at git push time |
| 14:24 | hcumberdale | what version of lein is installed on heroku? |
| 14:24 | cjfrisz | dnolen: I'll take a look at that, thanks |
| 14:24 | hcumberdale | technomancy: you work for heroku, right? |
| 14:24 | dnolen | cjfrisz: after looking the ClojureScript complier I really regret using records+protocols in core.match. |
| 14:24 | dnolen | looking at. |
| 14:24 | technomancy | hcumberdale: yeah. right now 1.7.1 is used by default, with 2.0.0-SNAPSHOT available if you request it |
| 14:24 | dgrnbrg | TimMc: well, i didn't understand how lein1 loads plugins. I needed to lein jar it and then symlink that jar into the .lein/plugins/ directory, and then I could use it. I think that it was because the plugin code had ":eval-in-project true" in the project.clj which caused me to be mislead into thinking that I could use the plugin from the project itself w/o doing any release steps |
| 14:25 | technomancy | hcumberdale: you can generate an uberjar at git push time if you like, but if your only concern is the overhead of the lein process then trampoline is a much simpler solution |
| 14:25 | technomancy | hcumberdale: details on the build process if you're curious: https://github.com/heroku/heroku-buildpack-clojure |
| 14:25 | hcumberdale | technomancy: why isn't trampoline used by default? |
| 14:25 | TimMc | dgrnbrg: You were trying to use the plugin on its own project? |
| 14:25 | dnolen | cjfrisz: that said, records+protocols are much less of a hassle in ClojureScript - they work fine for interactive development there. |
| 14:26 | cjfrisz | dnolen: I'm surprised by that. Besides the issues using them on the repl, I've found records and protocols to be quite nice. |
| 14:26 | dnolen | hiredman: ha! do I ever same "game changer" ? |
| 14:27 | technomancy | hcumberdale: it actually is by default now, it's just some of the documentation hasn't been updated |
| 14:27 | technomancy | I'll see about fixing that blog post |
| 14:27 | dgrnbrg | TimMc: yes, since I thought that was the only project I had where the plugin would be automatically found by lein |
| 14:27 | cjfrisz | I'm kind of a performance junkie, so I figured records+protocols were the way to go. |
| 14:27 | dgrnbrg | and it was, sort of, but not really |
| 14:28 | hiredman | dnolen: I have not performed any analysis of my logs |
| 14:28 | hcumberdale | thx technomancy , nice to see you here! |
| 14:29 | dnolen | cjfrisz: definitely not saying they aren't nice. other reason to use them is if you want something that works w/ the core abstractions. |
| 14:30 | hcumberdale | Caused by: java.lang.RuntimeException: Unable to resolve symbol: run-jetty in this context |
| 14:30 | hcumberdale | but I used: (:use [ring.adapter.netty] ... |
| 14:30 | hcumberdale | ahhh netty vs jetty... |
| 14:31 | cjfrisz | dnolen hiredman: That clears up a fair amount of frustration, thanks. |
| 14:35 | hcumberdale | Does anyone know how good/stable is https://github.com/datskos/ring-netty-adapter .... last update 2 years ago |
| 14:35 | TimMc | Maybe it is done. :-P |
| 14:37 | hcumberdale | ring-netty-adapter "0.0.3" << ! |
| 14:37 | mega` | This repo adds (experimental/alpha) Netty support to Ring |
| 14:37 | mega` | probebly not done |
| 14:38 | mega` | is netty an alternative to jetty? |
| 14:39 | hcumberdale | technomancy: how to add mongodb path? (connect-to-db!) << currently localhost |
| 14:40 | technomancy | hcumberdale: I don't use mongodb, but most configuration on heroku happens via environment variables |
| 14:40 | technomancy | (System/getenv "DATABASE_URL") is what I usually use |
| 14:42 | hcumberdale | https://devcenter.heroku.com/articles/mongohq << says MONGOHQ_URL |
| 14:46 | antares_ | hcumberdale: it depends on the exact cloud provider |
| 14:46 | antares_ | mega`: netty is an async I/O library, jetty is an embeddable HTTP server |
| 14:48 | hcumberdale | antares_: MONGOHQ_URL << can't find an example of it |
| 14:48 | hcumberdale | (monger.core/connect { :host \"db3.intranet.local\", :port 27787 }) |
| 14:48 | hcumberdale | needs host + port |
| 14:50 | antares_ | hcumberdale: monger does not yet support connecting with URLs |
| 14:50 | antares_ | although I can add it as soon as today |
| 14:50 | antares_ | just need to finish something |
| 14:51 | Fullmoon | Question about laziness: For this here: https://gist.github.com/2353622 |
| 14:52 | jondot_ | hello all. kinda in a dilemma about image processing with clojure. i need to count number of unique colors in an image (and other tests), which rinzelight doesn't have, and imagemagick has. however i don't want to shell out to imagemagick just yet (it'll block me using appengine) |
| 14:52 | Fullmoon | Why do I get the output "iterating." twice? |
| 14:52 | technomancy | Fullmoon: you probably want to call first on a vector |
| 14:52 | hcumblerdale2 | antares_: thank you very much ! |
| 14:52 | jondot_ | anyone else doing image processing with clojure ? mostly image identification and validation |
| 14:52 | technomancy | Fullmoon: also, hello; long time no see =) |
| 14:52 | Fullmoon | technomancy: Hey, funny! You here |
| 14:52 | antares_ | technomancy: so you think monger should support connecting via URIs, that's it, right? |
| 14:52 | Fullmoon | technomancy: Seems to be a natural progression for many Rubyists |
| 14:53 | technomancy | antares_: yeah, I'm a fan. I submitted that as a patch to java.jbdc; it's quite convenient. |
| 14:53 | antares_ | technomancy: ok |
| 14:53 | hcumblerdale2 | yeah! |
| 14:53 | hcumblerdale2 | so I'll get my app running on heroku |
| 14:53 | technomancy | Fullmoon: the brave ones at least =) |
| 14:53 | hiredman | jondot_: the jvm has some built in classes for doing image stuff (ImageIO), you might start there |
| 14:54 | autodidakto | Fullmoon: you mean clojure? totally agree :) |
| 14:55 | antares_ | oh, I see mongodb java driver already supports it |
| 14:55 | antares_ | although we need to provide a more convenient way in monger |
| 14:55 | antares_ | but still, good to know |
| 14:55 | Fullmoon | technomancy: Railsday '06 was fun |
| 14:55 | technomancy | Fullmoon: one of these days we'll have a Clojure equivalent |
| 14:55 | technomancy | "Clojure Challenge" |
| 14:56 | Fullmoon | technomancy: Oh fun, I am not sure that I should attend, with my 48 hours experience |
| 14:57 | technomancy | Fullmoon: oh, it won't be any time soon. plenty of time to get up to speed. |
| 15:02 | RickInGA | Fullmoon: I don't know how to make the replacement lazy, but I would change (first ((wait-a-bit) (wait-a-bit))) to (first [(wait-a-bit) (wait-a-bit)]) the list of lists was giving me an error |
| 15:02 | technomancy | RickInGA: well that won't be lazy either, which is what I think he's getting at |
| 15:03 | technomancy | laziness is a property of seqs |
| 15:03 | Fullmoon | RickInGA: I was under the impression that first only actually evaluates the car |
| 15:03 | technomancy | ((wait-a-bit) (wait-a-bit)) tries to call the wait-a-bit function, and then uses the return value of that call as a function to call |
| 15:04 | technomancy | Fullmoon: if you pass first a lazy seq, it will only evaluate the first element (unless it's a chunked seq), but that's not what you're doing here. |
| 15:04 | RickInGA | technomancy: yeah, replacing with vector is still eager, but stops giving error |
| 15:04 | technomancy | right |
| 15:05 | Fullmoon | technomancy: I shall now go and read into this, thanks. |
| 15:05 | technomancy | Fullmoon: lazy seqs generally come from calling things like map and for |
| 15:05 | RickInGA | technomancy: how do you rewrite to make it lazy? |
| 15:05 | technomancy | (first (map println '(0 1 2))) |
| 15:05 | technomancy | ,(first (map println '(0 1 2))) |
| 15:05 | clojurebot | 0 |
| 15:07 | antares_ | hcumblerdale2: can you please give me an example MONGOHQ_URL? |
| 15:07 | hcumblerdale2 | mongodb://fred:foobar@localhost/ |
| 15:07 | hcumblerdale2 | I tryed to... |
| 15:07 | hcumblerdale2 | ,(re-seq #"[\\/]{2}([^:]+):([^@]+)@([^/]+)" "mongodb://fred:foobar@localhost/") |
| 15:07 | clojurebot | (["//fred:foobar@localhost" "fred" "foobar" "localhost"]) |
| 15:08 | hcumblerdale2 | tried to :) |
| 15:09 | antares_ | hcumblerdale2: thanks! |
| 15:09 | technomancy | better to construct a java.net.URI with it |
| 15:09 | hcumblerdale2 | technomancy: sure? seems not to be a java.net.URI |
| 15:09 | antares_ | technomancy: mongodb java client has a URI parser |
| 15:10 | technomancy | it has its own parser? =( |
| 15:11 | antares_ | technomancy: yup |
| 15:11 | technomancy | oh mongo... |
| 15:12 | antares_ | technomancy: the client is written as if it was written by a bright sophomore CS student in a haste. It is not terrible but has many reinvented wheels and weird APIs. |
| 15:12 | antares_ | and _consistent method Naming() |
| 15:12 | antares_ | but that's good enough I guess |
| 15:15 | hcumblerdale2 | how to skip the first element of a seq? |
| 15:15 | scriptor | hcumblerdale2: in what context? |
| 15:16 | technomancy | hcumblerdale2: rest |
| 15:16 | hcumblerdale2 | thx technomancy |
| 15:17 | iwo | hi, can anyone tell me how to iterate over function parameters in clojure? been googling for ages but cannot find out how |
| 15:17 | iwo | is it possible? |
| 15:17 | llasram | iwo: Example? |
| 15:17 | iwo | i basically want to iterate over function args as if they were a sequence |
| 15:18 | hcumblerdale2 | antares_: ... |
| 15:18 | antares_ | iwo: (defn myfn [& xs] (for [p xs] …)) |
| 15:18 | hcumblerdale2 | ,(zipmap [:user :password :host] (rest (first (re-seq #"[\\/]{2}([^:]+):([^@]+)@([^/]+)" "mongodb://fred:foobar@localhost/")))) |
| 15:19 | clojurebot | {:host "localhost", :password "foobar", :user "fred"} |
| 15:19 | llasram | iwo: ##(let [f (fn [& args] (map #(str "like this? " %) args))] (f 1 2 3 :four "five" 6 :etc)) |
| 15:19 | lazybot | ⇒ ("like this? 1" "like this? 2" "like this? 3" "like this? :four" "like this? five" "like this? 6" "like this? :etc") |
| 15:19 | iwo | excellent, so it's the & here that's the bit i'm missing? |
| 15:19 | antares_ | hcumblerdale2: I will just reuse mongo driver's parser, I am tryign to figure out whether I want to add a new function or try to fit it into monger.core/connect (which will be either tricky or ugly) |
| 15:20 | llasram | Probably? That bundles up all subsequent arguments into a sequence for you. Works the same as in other destructuring forms |
| 15:20 | iwo | llasram: thank you, looks like exactly what i need |
| 15:21 | llasram | cool beans |
| 15:21 | iwo | thanks antares_ ! |
| 15:21 | kurtharriger | when using clojure-jack-in is there anyway to stdout *out* seems to be redirected to emacs but not System/out? |
| 15:21 | kurtharriger | +view stdout |
| 15:22 | kurtharriger | I used to use lein swank, and slime-connect but this no longer opens a repl in emacs for some reason |
| 15:24 | hcumblerdale2 | antares_: how to use authenticate instead of connect! ? |
| 15:24 | llasram | kurtharriger: The only solution I know of is to get a WriterOutputStream from somewhere (Apache Commons has one, for ex) and do something like: (System/setOut (java.io.PrintStream. (WriterOutputStream. *out*))) |
| 15:25 | llasram | THere's probably an easier way |
| 15:26 | llasram | Oooh, hmm |
| 15:27 | antares_ | hcumblerdale2: https://github.com/michaelklishin/monger/blob/master/test/monger/test/db.clj#L20 |
| 15:28 | antares_ | with mongodb, you authenticate after you connect, for each DB you need to use, only once (I know, I know; I haven't designed this stuff) |
| 15:28 | antares_ | if you try to authenticate twice, caboom! |
| 15:29 | hcumblerdale2 | antares_: so I can use connect! and authenticate? |
| 15:29 | kurtharriger | llasram: hmm didn't seme to work for me (System/setOut (java.io.PrintStream. (org.apache.commons.io.output.WriterOutputStream. *out*))) (.println System/out "test") |
| 15:30 | antares_ | hcumblerdale2: correct. With connect!, pass monger.core/*mongodb-database* for a database. |
| 15:30 | jsabeaudry | Is it possible to typehint what is inside a ref? |
| 15:30 | llasram | kurtharriger: Hmmm. I know I've done that trick before... |
| 15:30 | kurtharriger | although if I start clojure-jack-in, then lein swank, then slime-connect killing current connection the slime-repl now goes to swank |
| 15:31 | kurtharriger | got to be an easier way to open repl in emacs using slime-connect but I guess this works for now |
| 15:33 | hcumblerdale2 | can I call (monger.core/set-db! (monger.core/get-db "db")) before (authenticate *mongodb-database* (:host x) (:user x) (:password x))) ? |
| 15:37 | zenlike | what does it mean when things in a list start with a colon? |
| 15:38 | zenlike | i.e. '(:a :b :dog) |
| 15:38 | zenlike | do you know, yoklov? |
| 15:38 | antares_ | hcumblerdale2: please see that test I linked to |
| 15:38 | zenlike | what the : means? |
| 15:38 | zenlike | thanks |
| 15:38 | yoklov | zenlike: only saw "i.e. '(:a :b :dog)" |
| 15:38 | yoklov | oh |
| 15:38 | yoklov | the : is a keyword |
| 15:38 | yoklov | err, makes the word after it |
| 15:38 | antares_ | zenlike: they are keywords |
| 15:38 | zenlike | ? |
| 15:39 | zenlike | I guess I just don't understand what makes : based keywords different from strings |
| 15:39 | yoklov | zenlike: http://clojure.org/data_structures#Data Structures-Keywords |
| 15:39 | zenlike | nice, thanks |
| 15:39 | yoklov | keywords work as functions |
| 15:39 | yoklov | among other things, they're also interned |
| 15:40 | yoklov | so they compare by pointer equality |
| 15:40 | yoklov | so it's faster than iterating over the string and checking if each character is the same |
| 15:40 | llasram | kurtharriger: AH! Of course. You need to use one of the WriterOutputStream constructors which causes it to act unbuffered |
| 15:40 | yoklov | ,(:foo {:foo 3, :bar 7}) |
| 15:41 | clojurebot | 3 |
| 15:41 | llasram | kurtharriger: (System/setOut (java.io.PrintStream. (org.apache.commons.io.output.WriterOutputStream. *out* "UTF-8" 8192 true))) does it for me |
| 15:41 | Wild_Cat | ,("foo" {"foo" 3 "bar" 7}) |
| 15:41 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn> |
| 15:41 | kurtharriger | llasram: ah okay that makes sense! |
| 15:41 | Wild_Cat | aha. |
| 15:42 | kurtharriger | llasram: yep that works! thanks |
| 15:42 | yoklov | anyway, does anybody happen to know if you can change which version of cljs lein-cljsbuild is using? |
| 15:42 | zenlike | Another questions, why does |
| 15:42 | zenlike | (= 2 1/2) |
| 15:43 | zenlike | ,(= 2 1/2) |
| 15:43 | clojurebot | false |
| 15:43 | zenlike | hm. |
| 15:43 | yoklov | zenlike: use == for numbers |
| 15:43 | dnolen | yoklov: you can do that w/ the lein checkouts feature. make a checkouts directory - clone clojurescript into it. in your project.clj add :extra-classpath-dirs ["checkouts/clojurescript/src/clj"] |
| 15:43 | zenlike | ,(== 2 1/2) |
| 15:43 | clojurebot | false |
| 15:43 | zenlike | what is = used for? |
| 15:43 | yoklov | ,[(== 2 2.0), (= 2 2.0)] |
| 15:43 | clojurebot | [true false] |
| 15:43 | zenlike | and what is with the / construct, can you type fractions in clojure? |
| 15:43 | yoklov | dnolen: thanks |
| 15:44 | llasram | All of which actually does remind me -- is there a good way to hook in to get arbitrary code run when starting a swank session? The 'lein repl' init forms doen't seem to work :-/ |
| 15:44 | llasram | (I mean, they work just fine for 'lein repl', just no effect on swank sessions) |
| 15:45 | kurtharriger | llasram: I couldn't figure out how to do that either |
| 15:45 | dnolen | yoklov: would be nice if there was a way to specify HEAD, revision, or release but all good time I imagine. |
| 15:45 | yoklov | zenlike: = is equality, but since 2.0 and 2 have different types they aren't equal. you can type (doc =) in the repl to find out more |
| 15:45 | dnolen | all in |
| 15:46 | zenlike | yoklov: thank you! |
| 15:46 | llasram | kurtharriger: Maybe there's a way to get SLIME to chuck some forms over whenever it connects |
| 15:46 | kurtharriger | My emacs lisp skills are even worse than my clojure skillz :) |
| 15:48 | yoklov | dnolen: okay, and after I do that lein-cljsbuild will use the version in checkouts/clojurescript? |
| 15:48 | llasram | OH well. A project for some other day :-) |
| 15:49 | dnolen | yoklov: yes |
| 15:49 | dnolen | yoklov: going to try and build your code w/ master? :) |
| 15:49 | yoklov | yeah |
| 15:50 | yoklov | i'm quite excited, based on what you said on the mailing list, it seems to be quite an improvement |
| 15:50 | antares_ | hcumblerdale2: sorry, one more question. Can you point me to heroku's mongodb docs? |
| 15:50 | dnolen | yoklov: I'm curious if there's much of a speedup for apps in general - not sure there will be. |
| 15:50 | antares_ | hcumblerdale2: I am trying to understand, do they also provide DB name in it? if so, we will pretty much have to use a separate function in monger (largely thanks to oddities in MongoDB Java driver APIs) |
| 15:50 | dnolen | yoklov: if you rely on the current maps and updating them and things like that - I think that overhead will continue to dominate. |
| 15:51 | hcumblerdale2 | antares_: https://devcenter.heroku.com/articles/mongohq |
| 15:51 | antares_ | hcumblerdale2: thank you! |
| 15:51 | antares_ | :( DB db = mongoURI.connectDB(); |
| 15:51 | antares_ | why oh why a MongoURI class has a method named connectDB |
| 15:51 | yoklov | yeah, but i've been working on something lately where I avoided maps (as much as I could) |
| 15:52 | dnolen | yoklov: ah, interesting! Definitely want to know if you see any improvements. |
| 15:59 | hcumblerdale2 | antares_: mongodb://heroku:5f53d4812373db562f934f4ac91c0b21@flame.mongohq.com:27034/app3883424 |
| 16:09 | yoklov | Hm, nothing significant, actually. Slight speed boosts, but it was already running fine and they may just be in my head |
| 16:10 | dnolen | yoklov: yeah again - not very surprised. if you were already working around records I don't think you would see much of a difference. |
| 16:11 | yoklov | Most of my slowdown is accessing vectors |
| 16:12 | yoklov | and just numerical computation. |
| 16:12 | dnolen | yoklov: yes it might be worth inlining some stuff around vectors - but I haven't looked at it too closely. |
| 16:12 | dnolen | yoklov: numerical stuff should be very fast now - any low level JS stuff in general. |
| 16:12 | yoklov | yeah, this program runs quite quickly |
| 16:13 | yoklov | which is one of the reasons i think the speed boosts might just be in my head |
| 16:14 | yoklov | Though, the profiles look quite different. |
| 16:14 | dnolen | yoklov: how so? |
| 16:15 | yoklov | _truth isn't there anymore, for one, but generally it's functions i wrote or that i am certainly using, as opposed to before where there was a good amount of internal functions showing up in my profile |
| 16:16 | dnolen | yoklov: nice |
| 16:16 | dnolen | yoklov: I don't think _truth was that expensive in regular code - but it was killer in stuff like PersistentVector |
| 16:17 | yoklov | Heh, no, but it was consistently showing up around 5% in my profiles |
| 16:18 | yoklov | which was clearly not a huge issue, but it was ever-present |
| 16:18 | dnolen | yoklov: still, nice to hear your profiles are cleaned up. |
| 16:18 | dnolen | yoklov: is this project visible smoewhere? |
| 16:18 | yoklov | definitely |
| 16:19 | goodieboy | can someone tell me how to set a custom mime-type using ring/compojure ? |
| 16:19 | goodieboy | can someone tell me how to set a custom mime-type using ring/compojure? |
| 16:19 | goodieboy | oops |
| 16:20 | weavejester | goodieboy: Do you mean associate a mime-type with an extension, or return a mime-type for a particular route? |
| 16:20 | samaaron | dnolen: I just wanted to say that you're doing some awesome work with cljs |
| 16:20 | goodieboy | weavejester: associate a type with an extension |
| 16:21 | mfex | dnolen: I second the thanks for your clojurescript work |
| 16:21 | dnolen | nice according to Lazlo 3X boost to persistent vectors pre-optimizations. |
| 16:22 | weavejester | goodieboy: I just realised this isn't in the docstrings, but you can use: (route/resources "/" {:mime-types {"foo" "application/foo"}}) |
| 16:22 | weavejester | And then any "*.foo" resource would have a content type of "application/foo" |
| 16:22 | dnolen | mfex: samaaron: thx! should really thank rhickey and relevance for putting together such a clean code base. Optimization pass was pretty simple. |
| 16:22 | goodieboy | weavejester: oh ok, i was attempting to use (wrap-file-info {:foo "bar"}) in my middleware |
| 16:23 | eggsby | weavejester: is it at all aware of /etc/mime.types ? |
| 16:23 | dsantiago | dnolen: You're making it hard for me to stick to my decision to use plain JS. |
| 16:23 | samaaron | dnolen: w.r.t. the clean cljs code base, I was kinda surprised to see that the clojure-py guys weren't using it |
| 16:23 | weavejester | goodieboy: wrap-file-info works a similar way. (wrap-file-info handler {"foo" "application/foo"}) |
| 16:24 | weavejester | eggsby: Nope |
| 16:24 | aperiodic | samaaron: did you check out that gist i $mailed you about quil and that java lib? have any idea what might be going on there? |
| 16:24 | yoklov | dnolen: its not at the point where it's up anywhere (not quite up to my standards of code i put on the internet), but it probably will be pretty soon. |
| 16:24 | weavejester | eggsby: But it includes mappings for most common mimetypes. |
| 16:24 | technomancy | weavejester: is there one for sexps? =) |
| 16:24 | gfredericks | what's the fastest way for me to turn a query string into a map? |
| 16:24 | dnolen | yoklov: cool, looking forward to taking a look. |
| 16:24 | goodieboy | weavejester: thanks! |
| 16:24 | gfredericks | (I'm using aleph) |
| 16:25 | weavejester | gfredericks: Use the wrap-params middleware |
| 16:25 | dnolen | dsantiago: once we have source mapping I think ClojureScript will be a "game changer" for client-side development. |
| 16:25 | gfredericks | weavejester: use the ring middleware for aleph? |
| 16:25 | weavejester | technomancy: One for sexps? |
| 16:25 | technomancy | weavejester: a mime type |
| 16:25 | dsantiago | dnolen: Yeah, the debugging story is actually the bigger sticking point. |
| 16:26 | weavejester | technomancy: Ohhh :) |
| 16:26 | dsantiago | But that seems to be moving very quickly too |
| 16:26 | weavejester | technomancy: Um, no. |
| 16:26 | dnolen | samaaron: I haven't followed clojure-py closely. |
| 16:26 | mfex | dnolen: how does the arity dispatch work without using arguments (for cljs-137)? |
| 16:26 | dnolen | mfex: the compiler stores seen fn information - if it finds a matching arity it calls it directly. |
| 16:26 | weavejester | gfredericks: Sure. If you want to do something asynchronous, the Ring 1.1.0 beta has form-decode |
| 16:26 | samaaron | aperiodic: no, sorry - when did you send the mail? |
| 16:27 | weavejester | gfredericks: Which will decode a query string without any middleware. |
| 16:27 | gfredericks | weavejester: cool, thanks |
| 16:27 | dnolen | dsantiago: yep, soon as 1.4.0 goes out the door planning on pushing to see the column preserving reader patch make it into 1.5. |
| 16:27 | samaaron | dnolen: from a super cursory look, it appears that they're taking a similar approach to the CLR port |
| 16:27 | dsantiago | dnolen: Could that also have benefits for regular clojure? |
| 16:28 | dnolen | dsantiago: definitely, right now we just line information. column information can give us a particular s-expression. |
| 16:28 | antares_ | hcumblerdale2: lint.travis-ci.org https://github.com/michaelklishin/monger/blob/master/ChangeLog.md |
| 16:28 | antares_ | technomancy: does this look good to you? lint.travis-ci.org https://github.com/michaelklishin/monger/blob/master/ChangeLog.md |
| 16:28 | dnolen | samaaron: clojure-py is targetting pypy right? |
| 16:28 | dsantiago | dnolen Sounds wonderful. |
| 16:28 | aperiodic | samaaron: it's lazybot $mail. sent it sunday evening, it should have msgd you about it once you spoke up in here (i thought) |
| 16:28 | antares_ | hcumblerdale2: this stuff is already on clojars in 1.0.0-SNAPSHOT |
| 16:28 | aperiodic | samaaron: relevant gist is: https://gist.github.com/2341911 |
| 16:29 | samaaron | dnolen: they're targettign the python VM (is that pypy?) |
| 16:29 | technomancy | antares_: looks reasonable |
| 16:30 | samaaron | dnolen: perhaps i'm way off mark, but it seems that the clojurescript approach was to start off with protocols at base and build up from there |
| 16:30 | dnolen | samaaron: that's the idea yes. |
| 16:30 | samaaron | rather than building on top of a whole bunch of interop |
| 16:30 | samaaron | yeah, so I wonder why the clojure-py guys didn't do that |
| 16:31 | mfex | dnolen: nice and everything is in the clojure part of the compiler right? nothing as a compiler pass in the goog closure compiler? |
| 16:31 | samaaron | I would imagine that down the road, vanilla clojure will take a similar approach |
| 16:31 | hcumblerdale2 | 1 required artifact is missing. com.novemberain:monger:jar:1.0.0-beta4 |
| 16:31 | antares_ | hcumblerdale2: beta4? |
| 16:31 | antares_ | hcumblerdale2: beta3 is out, beta4 is not yet |
| 16:31 | antares_ | you need to use 1.0.0-SNAPSHOT |
| 16:32 | hcumblerdale2 | ahh ok |
| 16:33 | dnolen | mfex: all the optimizations are in the CLJS compiler - not goog closure. |
| 16:33 | samaaron | aperiodic: is this with Quil 1.0.0? |
| 16:33 | hcumblerdale2 | I do not need setdb getdb ... with connect-via-uri! , right antares_ ? |
| 16:34 | dnolen | samaaron: so did thread locals give some perf boosts to Quil? |
| 16:34 | kurtharriger | llasram: this is what I came up with to run clojure after clojure-jack-in, not sure if its the best way but seems to work: https://gist.github.com/2354236 |
| 16:34 | dnolen | samaaron: btw, pretty cool that Casey Reas tweeted Quil! |
| 16:34 | samaaron | dnolen: I think very minimal boosts to be honest |
| 16:34 | samaaron | we're still running about 75% of standard Processing |
| 16:35 | hcumblerdale2 | com.mongodb.CommandResult$CommandFailure: command failed [command failed [count] { "serverUsed" : "flame.mongohq.com:27034" , "assertion" : "unauthorized db:app3883424 lock type:-1 client:89.0.68.33" , "assertionCode" : 10057 , "errmsg" : "db assertion failure" , "ok" : 0.0} |
| 16:35 | samaaron | dnolen: prolly cos I emailed him ;-) |
| 16:35 | dnolen | samaaron: yeah, I think thread locals lose over passing the context around explicitly. |
| 16:35 | dnolen | samaaron: ha! |
| 16:35 | aperiodic | samaaron: it's the snapshot, not the release. are they different? |
| 16:35 | ibdknox | dnolen: the cljs analyzer is so much nicer than the JVM clojure one! |
| 16:35 | antares_ | hcumblerdale2: no, you don't need to use setdb or getdb, if database and credentials are in the URI, they will be used |
| 16:35 | dnolen | samaaron: but even 75% is pretty good! |
| 16:35 | samaaron | aperiodic: yeah, there are a few changes - try with the latest |
| 16:35 | dnolen | ibdknox: man, way dicer. |
| 16:35 | dnolen | nicer |
| 16:36 | samaaron | dnolen: yeah, it's good enough for me |
| 16:36 | samaaron | processing isn't about performance anyway |
| 16:36 | ibdknox | dnolen: do you know if there's a reason ambrose didn't start from that one with analyze? |
| 16:36 | dnolen | samaaron: and for most people I think. and yes processing isn't about perf, it's about usability. |
| 16:36 | samaaron | it's about getting runnign with graphic super easily |
| 16:36 | dnolen | ibdknox: ? he did as far as I know. |
| 16:36 | ibdknox | dnolen: seems like we could extract the analyzer out of the cljs codebase and have a very nice generic ast analyzer for all clojure impls |
| 16:37 | hcumblerdale2 | Exception in thread "main" java.lang.RuntimeException: No such var: m/connect-via-uri!, compiling:(cblog/core.clj:12) |
| 16:37 | dnolen | ibdknox: yes ambrose started with cljs analyzer - but I know he'd made many changes for his own use case. |
| 16:37 | aperiodic | hah, i've spent far too much time making performance tweaks in processing |
| 16:37 | hcumblerdale2 | antares_: heroku caches the .m2 repo. So I need a release to test it there |
| 16:37 | hcumblerdale2 | I can't delete ~/.m2.... cause it is on heroku ;( |
| 16:37 | aperiodic | i'm interested to see how some of my heavier processing sketches perform when ported over to quil |
| 16:37 | technomancy | hcumblerdale2: you can specify a numbered snapshot version |
| 16:38 | dnolen | aperiodic: heh, you can always use processing directly - or someone should do an "advanced" Quil. |
| 16:38 | hcumblerdale2 | But then 1.0.0-beta4 isn't found |
| 16:38 | hcumblerdale2 | or what do you mean? |
| 16:38 | ibdknox | dnolen: hm CLJS is not a dependency of analyze and it isn't required in the core ns: https://github.com/frenchy64/analyze/blob/master/src/analyze/core.clj |
| 16:39 | ibdknox | dnolen: the output is also very different |
| 16:39 | aperiodic | dnolen: well, in processing, i often just use JOGL directly |
| 16:39 | hcumblerdale2 | where can I get the number? |
| 16:39 | antares_ | hcumblerdale2: ahhh |
| 16:39 | dnolen | ibdknox: he just copied out the file and made many changes to analyze Clojure - it's also what makes Typed Clojure work as far as I know. |
| 16:40 | ibdknox | ah |
| 16:40 | antares_ | hcumblerdale2: hm, ok, I will issue beta4 now |
| 16:40 | samaaron | aperiodic: I'd *love* you to port some of your advanced processing sketches over to quil |
| 16:40 | samaaron | we need more tyre kicking |
| 16:41 | aperiodic | oh, i'm planning to... but i also have five other projects, and i'm pretty lazy |
| 16:41 | samaaron | shape up the laziness! |
| 16:41 | aperiodic | i'm trying! |
| 16:41 | samaaron | otherwise I'll send Bigelow after you... |
| 16:42 | aperiodic | thankfully, you don't know where I live |
| 16:42 | dnolen | ibdknox: but I totally agree, an a la carte analyzer would be fantastic. People are going to town with stuff like Esprima in the JS world - no reason we should let them get ahead of us :) |
| 16:42 | samaaron | aperiodic: with Quil 1.0.0 you just need to (:use quil.core) - need to pull in applet stuff now |
| 16:43 | ibdknox | dnolen: there's a decent chance I'll end up doing that |
| 16:43 | samaaron | aperiodic: oh wait, you're doing funky stuff with the applet itself |
| 16:43 | dnolen | ibdknox: cool! |
| 16:43 | aperiodic | samaaron: well, the java library is doing some pretty funky stuff to the applet |
| 16:44 | aperiodic | so, yeah, that's why i'm pulling in the current-applet function |
| 16:44 | ibdknox | it shouldn't be hard to factor out of the cljs compiler |
| 16:44 | ibdknox | and I see a lot of value in it :) |
| 16:44 | samaaron | aperiodic: yeah, that might cause issues with the bindings we were using before |
| 16:44 | samaaron | Zach shifted things over to thread locals |
| 16:44 | samaaron | it's worth giving it a shot with that |
| 16:45 | aperiodic | cool, i'll give it a shot this evening and let you know how it goes |
| 16:46 | samaaron | aperiodic: please do :-) |
| 16:46 | dnolen | ibdknox: should be very easy to extract. |
| 16:47 | hcumblerdale2 | antares_: It does not work: error message: Exception in thread "main" com.mongodb.CommandResult$CommandFailure: command failed [command failed [count] { "serverUsed" : "staff.mongohq.com:10008" , "assertion" : "unauthorized db:app3884761 lock type:-1 client:10.120.105.167" , "assertionCode" : 10057 , "errmsg" : "db assertion failure" , "ok" : 0.0} |
| 16:54 | ibdknox | dnolen: btw awesome work on the performance improvements! |
| 16:54 | ibdknox | dnolen: thanks for that work :) |
| 16:54 | dnolen | ibdknox: thx, have you had a chance to try it out? |
| 16:55 | antares_ | hcumblerdale2: I am not sure I understand that error message |
| 16:56 | antares_ | hcumblerdale2: if authentication fails, an IllegalArgumentException will be raised by monger itself |
| 16:56 | antares_ | hcumblerdale2: http://groups.google.com/group/mongodb-user/browse_thread/thread/31f9e39129129b6b |
| 16:56 | ibdknox | dnolen: some, it's definitely a lot faster. I'll try some more extensive stuff over the next few days (just got back in town) |
| 16:56 | dnolen | ibdknox: good to hear |
| 16:57 | ibdknox | less indirection too, which is nice :) |
| 16:57 | emezeske_ | dnolen: It seems like the direct function calls should make debugging a bit easier, too |
| 16:58 | emezeske_ | dnolen: Stacktraces will be more readable, at least |
| 16:58 | Fullmoon | What's the name of the supposedly "better" (deadline, etc) repl? |
| 16:59 | llasram | kurtharriger: (delayed, but) Oh, nice. That's very easy |
| 17:00 | dnolen | emezeske_: yeah direct fn call was last mile for closing gap between handwritten JS and CLJS |
| 17:02 | emezeske_ | dnolen: I'm excited to see less of "no method 'call' for undefined" and more of "some-func is not defined" |
| 17:02 | samaaron | dnolen: can you describe "direct fn call" in the context of cljs work? |
| 17:02 | dnolen | emezeske_: from here on out it's all chunked seqs, transients, pods, persistent data structures. |
| 17:02 | samaaron | I assume you've knocked out a bunch of indirection |
| 17:02 | dnolen | samaaron: fns in Clojure are objects, they implement invoke. |
| 17:02 | amalloy | samaaron: foo(1) instead of foo.call(null, 1), i think |
| 17:02 | emezeske_ | dnolen: epic. |
| 17:03 | amalloy | for the cases when it's known at compile-time that you're calling a real js function and not some clojure protocol thingy |
| 17:03 | samaaron | oh, awesome |
| 17:03 | dnolen | samaaron: amalloy: because we want objects to be callable - we call everything the same way - this way an object with a .call property could also act as a function. |
| 17:04 | samaaron | dnolen: but as js has first class fns - you use them directly where possible? |
| 17:04 | dnolen | samaaron: problem is that's a perf hit on the really fast JS engines like V8. so if we know we have a real fn - just call directly. |
| 17:04 | samaaron | ah ok - so this makes sense mostly for interop stuff? |
| 17:05 | dnolen | samaaron: no all CLJS functions got faster |
| 17:05 | samaaron | or do we also compile down to real js fns too? |
| 17:05 | samaaron | oh damn, nice :-) |
| 17:05 | dnolen | samaaron: CLJS just emits regular JS fns. |
| 17:05 | dnolen | samaaron: we used to call them in a weird way - now we don't. |
| 17:05 | dnolen | if we don't know the type - then use the .call convention |
| 17:06 | samaaron | righto - so you fall back to original behaviour |
| 17:06 | chouser | I haven't looked at your diffs yet, dnolen. Do we lose a bit of potential dynamism this way? |
| 17:06 | dnolen | chouser: only applies to top level fns. |
| 17:07 | chouser | as in (defn f [x] 5) (defn g [x] (f x)) (def f {1 6}) ... will (g 1) now return 5 or 6? |
| 17:08 | dnolen | chouser: 6 |
| 17:09 | chouser | cool. how do you get g to switch to using f's .call ? |
| 17:11 | dnolen | chouser: oops I didn't read you're example closely enough. Yes, we do lose a bit of dynamism - switching between fns and objects. |
| 17:12 | chouser | I imagine it's totally worth it. |
| 17:12 | amalloy | dnolen: so does it still return 5, or actually cause an error? |
| 17:13 | dnolen | chouser: good catch tho - I hadn't thought about that. Easy enough to switch the behavior back if people find it to be an issue. |
| 17:13 | dnolen | amalloy: error. |
| 17:13 | hcumblerdale2 | mhh |
| 17:13 | amalloy | yeah. 5 would be a pretty surprising result |
| 17:14 | gfredericks | $findfn 5 |
| 17:14 | lazybot | [] |
| 17:14 | gfredericks | why don't we have any clojure functions that return 5 |
| 17:14 | dnolen | chouser: the perf difference is nearly 2X - so it just depends on whether people are switching back and forth between objects and fns often. |
| 17:16 | hcumblerdale2 | antares_: MongoHQ support Chris Winslett: For our standard deployment, we use 2.0.4 |
| 17:16 | S11001001 | hmm |
| 17:16 | S11001001 | $findfn nil |
| 17:16 | lazybot | [clojure.core/cond clojure.core/dosync clojure.core/import clojure.core/prn clojure.core/refer-clojure clojure.core/print clojure.core/with-loading-context clojure.core/newline clojure.core/comment clojure.core/or clojure.core/load clojure.core/shutdown-agents cloju... https://refheap.com/paste/1980 |
| 17:16 | hcumblerdale2 | mongo on linux console works as well,... |
| 17:23 | antares_ | hcumblerdale2: is there a way for me try to this add-on w/o heroku billing me? |
| 17:23 | hcumblerdale2 | yes antares_ I can give you my credentials |
| 17:23 | hcumblerdale2 | >> my credit card is registered |
| 17:24 | antares_ | hcumblerdale2: hm, well, I'd prefer not having other people's credentials |
| 17:24 | hcumblerdale2 | antares_: I can change it,... build a new heroku instance or so |
| 17:27 | dnolen | chouser: perhaps another option would be to only do that optimization under advanced compilation ... |
| 17:29 | hcumblerdale2 | antares_: can you reproduce the problem? |
| 17:32 | antares_ | hcumblerdale2: I can now |
| 17:34 | lpetit | dnolen: Could it be under an advanced "aggressive optimizations" flag ? |
| 17:35 | lpetit | Which tools could decide to take on or off by default, but would be off out of the box? |
| 17:35 | dnolen | lpetit: advanced compilation is agressive - you cannot interactively develop against it. |
| 17:35 | lpetit | Indeed, but then it remains sememantically correct. Not certain with the one at hand. |
| 17:37 | dnolen | lpetit: what I mean is, the dynamism problem is only about interactive development. advanced compilation is all about whole program optimization. |
| 17:39 | lpetit | dnolen: I understand the high value for dynamism. But still, some programs could start to break if what chouser showed stays as is in the final code, for one reason or another |
| 17:40 | dnolen | lpetit: not sure how, in compiled code one version wins. the proper call will be emitted. |
| 17:40 | PPaul | anyone doing clojurescript here? |
| 17:41 | amalloy | ~anyone |
| 17:41 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 17:41 | PPaul | anyway, i notice that clojure is synchronous by design (prob because of jvm), is clojurescript async by design? |
| 17:42 | amalloy | technomancy: clojars frustrates me. apparently you have to scp the pom and the jar at the same time. i always forget the pom, and it silently accepts a jar but doesn't do anything with it. can we get it to complain if it gets just a jar, like it does if it gets just a pom? |
| 17:42 | technomancy | amalloy: probably, but if you were going to change that functionality you should just have it look in the jar for the pom |
| 17:42 | lpetit | dnolen: Are you sure? |
| 17:43 | dnolen | PPaul: not sure what you mean by async by design. |
| 17:43 | dnolen | lpetit: sure about what? |
| 17:43 | technomancy | amalloy: I'm much more interested in replacing scp than fixing it |
| 17:43 | dnolen | that one version will win - yes. |
| 17:43 | yoklov | can anybody think of a more elegant way to do something like (for [i (range (count coll)), j (range j (count coll))].... do stuff with (coll i) and (coll j)) |
| 17:43 | yoklov | e.g. get each unique pair of elements in coll |
| 17:44 | lpetit | dnolen: So you can only have functions definitions as top level forms? |
| 17:44 | PPaul | in clojure, if i want a function to be async i use (future)... like when i talk with a server i can do so without a callback |
| 17:45 | dnolen | lpetit: in CLJS yes, there no support in CLJS at all for def'ing non top levels. |
| 17:46 | PPaul | in clojurescript, do functions block that talk with servers, like they do in clojure? |
| 17:46 | dnolen | PPaul: CLJS is emits lowest common denominator JS - so JS rules apply. |
| 17:47 | lpetit | dnolen: What will (defn f [] 1) (println (f 1)) (defn f [] 2) (println (f 2)) produce ? |
| 17:47 | amalloy | yoklov: you might enjoy some of the answers to http://www.4clojure.com/problem/103 |
| 17:47 | PPaul | in that case, i guess clojurescript code that is async needs to be written differently from clojure code |
| 17:47 | dnolen | lpetit: 1 then 2. |
| 17:49 | chouser | PPaul: it's pretty hard to get javascript to block. |
| 17:49 | lpetit | dnolen: So why do you say chouser's example would behave differently in optimized and non optimized modes? |
| 17:49 | dnolen | lpetit: object vs. fn case |
| 17:49 | PPaul | i know it's hard, i'm a JS programmer |
| 17:50 | dnolen | lpetit: object calls look like, foo.call(...), fn calls look like, foo(...) |
| 17:50 | dnolen | lpetit: so if you switch between those two at the REPL w/ the current optimization you'll get errors. |
| 17:50 | chouser | I said two true things here today. I should stop while I'm ahead. |
| 17:51 | lpetit | He |
| 17:51 | PPaul | has anyone here used clojurescript with backbone or some JS/non-JS mvc? |
| 17:52 | PPaul | i would like to know about the experience of doing so |
| 17:52 | eggsby | PPaul: as I understand it that'd be redundant |
| 17:52 | PPaul | it would be? |
| 17:52 | PPaul | please enlighten me |
| 17:52 | lpetit | Dnolen: so in the optimized mode, both would still be compiled differently (clojurescript compilation happens before closure advanced minifier), and you'll also have the problem in production |
| 17:53 | eggsby | PPaul: since cljs uses google closure it'd make more sense to structure your app in terms of closure, rather than including jQuery and backbone/underscore as well |
| 17:53 | dnolen | lpetit: nope. the next definition side effects the type. |
| 17:53 | samaaron | dnolen: lpetit sounds like we need a test for this |
| 17:53 | PPaul | but i don't know closure |
| 17:53 | PPaul | i know backbone |
| 17:54 | PPaul | though, clojurescript may have something similar |
| 17:54 | PPaul | do you have some examples of setting up something like a tiny 1page app? |
| 17:54 | dnolen | PPaul: you can use BackBone, but expect BB.js payload plus at least 30K from CLJS. |
| 17:55 | PPaul | dnolen, that's tiny |
| 17:55 | PPaul | my JS apps are fucking huge now |
| 17:55 | PPaul | like, over 1 meg |
| 17:55 | eggsby | PPaul: https://github.com/addyosmani/todomvc/tree/master/architecture-examples/closure |
| 17:55 | PPaul | :D |
| 17:55 | PPaul | thanks |
| 17:55 | dnolen | PPaul: yeah, CLJS prevents big apps from getting bloated. GClosure is pretty awesome about that. |
| 17:55 | hcumblerdale2 | http://furious-fog-1667.herokuapp.com/ |
| 17:55 | hcumblerdale2 | it's running now :) |
| 17:55 | eggsby | PPaul: live version of that closure project: http://addyosmani.github.com/todomvc/architecture-examples/closure/index.html |
| 17:56 | PPaul | does clojurescript inforce immutability too? |
| 17:56 | dnolen | PPaul: there's no hard enforcement like there is on the JVM via final. But it's effectively immutable by default. |
| 17:57 | PPaul | awesome |
| 17:58 | eggsby | PPaul: i'm trying to figure out whether I want to leave coffeescript/backbone for cljs/closure myself |
| 17:58 | eggsby | closure just seems to have so much boilerplate |
| 17:59 | dnolen | lpetit: actually I do see what you mean. Yes, if we hit one def, references to it will be compiled one way. If later down the line you redef in the same source file, other code will be compiled differently. |
| 18:00 | PPaul | i do JS/backbone... i'm getting really good with backbone, which means i'm running into the limits of backbone a lot :( |
| 18:00 | PPaul | i also miss clojure |
| 18:01 | PPaul | underscore is not even close to a replacement :( |
| 18:02 | PPaul | i'm looking at some clojurescript MVCs, https://github.com/ibdknox/pinot/blob/master/examples/todo.cljs (pinot) pretty tiny todo example |
| 18:04 | dnolen | lpetit: I kind of like the idea of warning when switching a top level def from fn to anything else. |
| 18:04 | eggsby | ya pinot looks nice PPaul |
| 18:05 | hcumblerdale2 | If anyone is willing to help by reviewing sourcecode or building stuff, you are welcome: https://github.com/kremers/cblog |
| 18:05 | dnolen | PPaul: A while's off, but I'm really looking forward to some Datomic in CLJS |
| 18:05 | eggsby | heh |
| 18:06 | eggsby | do you think datomic will ever be packaged w/ clojure |
| 18:06 | PPaul | i'm still not sure what datomic is trying to be |
| 18:06 | eggsby | it's clojures datastore :p |
| 18:06 | PPaul | is it relational/doc/graph/something else? |
| 18:06 | dnolen | eggsby: well rhickey has mentioned they're close to exposing indexes - so you could consume those via core.logic on the server or more interestingly on clients. |
| 18:06 | PPaul | is it pure clojure? |
| 18:07 | PPaul | i can put clojure types in it? |
| 18:07 | PPaul | like a set? |
| 18:07 | dnolen | PPaul: the site is pretty informative. |
| 18:07 | PPaul | ^_^ |
| 18:07 | eggsby | dnolen: I haven't read the reasoned schemer and I'm not even familiar with constraint/logic based programming, but what could it offer in the clientside world? |
| 18:07 | dnolen | eggsby: sensible queries. |
| 18:08 | eggsby | I saw the talk where they demo'd minikanren on chez scheme which looked insanely powerful, but how could that crunching be simpl-- oh |
| 18:09 | PPaul | http://datomic.com doesn't tell me much |
| 18:09 | dnolen | PPaul: whitepaper + videos + try it out. |
| 18:09 | PPaul | videos!Q |
| 18:09 | PPaul | i love videos |
| 18:10 | eggsby | PPaul: you can watch rhickeys interview about it |
| 18:10 | lpetit | dnolen: But is it the only problem? What will (def a 1) (defn f[] a) (def a 2) (defn g [] a) (f) (g) produce before and after your optimization? |
| 18:10 | eggsby | but he's got a talk too that should be popping up sometime soon |
| 18:11 | dnolen | lpetit: 2 2. |
| 18:12 | dnolen | lpetit: just like Clojure on the JVM. |
| 18:12 | lpetit | dnolen: Oh yeah sorry, your optimization is for fans only, bad example |
| 18:12 | lpetit | S/fans/fns/ |
| 18:12 | dnolen | lpetit: and only if you're *switching* between *objects* and *fn* |
| 18:12 | dnolen | so we'd warn on that. |
| 18:13 | lpetit | dnolen: Ok understood |
| 18:14 | dnolen | lpetit: but yes, excellent observation. |
| 18:15 | lpetit | dnolen: noob question now: does it change somerhing if f is a dynamic var which is rebound? |
| 18:17 | dnolen | lpetit: probably a good argument for making ^:dynamic a requirement in CLJS |
| 18:18 | lpetit | dnolen: On |
| 18:18 | hiredman | dnolen: ^:dynamic as a requirement for being able to re-def things? |
| 18:19 | dnolen | hiredman: no for using something w/ binding. |
| 18:19 | lpetit | s/on/ok (damn spell checker) |
| 18:20 | dnolen | if someone dynamic binds a fn to an object you'll run into trouble. so if a var is declared dynamic we won't optimize it. |
| 19:29 | konr | Any idea on how the GSoC selection process is taking place? No comments on my proposal so far :( |
| 19:30 | yoklov | same |
| 19:32 | aperiodic | when i did it, it was pretty opaque |
| 19:32 | aperiodic | submitted a proposal, got an acceptance email a week or two later; didn't hear anything in between |
| 19:33 | aperiodic | but that might be a function of the organization |
| 19:34 | yoklov | yeah i figured |
| 19:34 | yoklov | (but i also figured if someone else was asking i'd ask too) |
| 19:59 | cjfrisz | Just discovered M-. in Clojure Emacs mode pulling up the definition of the expression at the point. |
| 19:59 | cjfrisz | Definitely a "Whoa..." moment. |
| 20:02 | PPaul | datomic is sorta hard to understand |
| 20:11 | gfredericks | is there any reason `lein run` would hang when run as root? |
| 20:11 | gfredericks | nm I didn't read |
| 20:12 | technomancy | the trojan plugin you accidentally installed is busy erasing your filesystem |
| 20:13 | autodidakt | cemerick: just bought the book. normally 30$, on sale for 17, -40% coupon code for new users, $11 :) |
| 20:14 | sattvik | konr, yoklov: You'll find out if you're accepted when Google notifies you. It's going to be tough. Clojure, as a new org, will most likely only get to have 1 or 2 students. |
| 20:15 | konr | sattvik: crossing my fingers ;) |
| 20:16 | autodidakt | Just in case I haven't spammed everyone already -> Every should buy Clojure Programming [http://shop.oreilly.com/product/0636920013754.do] |
| 20:17 | autodidakt | recently released, by Chas Emerick, Brian Carper, Christophe Grand |
| 20:18 | autodidakt | book description at [http://www.clojurebook.com/]. it's geared towards people coming from Java/ruby/python |
| 20:18 | autodidakt | gfredericks: Projamming Clolog |
| 20:19 | gfredericks | I can't argue with that |
| 20:22 | guns | I'm confused about the readline integration in nrepl. Some (not all) my keybindings from ~/.inputrc work in `lein2 repl` |
| 20:22 | guns | and my multibye macros display incorrectly, but are correctly parsed |
| 20:22 | guns | where can I investigate this? tools.nrepl and leiningen don't mention the GNU readline lib |
| 20:23 | technomancy | guns: it uses jline2 rather than readline |
| 20:23 | guns | technomancy: jline reads ~/.inputrc? |
| 20:24 | technomancy | guns: I think it honors some subset of it? not sure |
| 20:24 | cemerick | autodidakt: good timing! :-D |
| 20:24 | guns | technomancy: I see. It's frustratingly close to what I like in readline |
| 20:24 | guns | ty |
| 20:30 | Frozenlock | I exported a file with newlines in it "\n", but don't see them when I open it in notepad. Is it because of the different newline for linux/windows? |
| 20:32 | langmartin | Frozenlock: that's pretty likely |
| 20:38 | emezeske_ | Frozenlock: I think windows likes \r\n |
| 20:38 | Frozenlock | Yup, that was it. I added "\r" before and now everything is fine. |
| 20:38 | Frozenlock | emezeske_: Thanks :p |
| 20:38 | Frozenlock | I just hope my functions won't choke on it when the time comes to read the file back... |
| 21:04 | gfredericks | is clj-http 0.2.3 not configurable to not process cookies? |
| 21:06 | muhoo | i'm pretty sure it's based on apache http libraries |
| 21:06 | dakrone | gfredericks: define "process cookies"? |
| 21:07 | gfredericks | dakrone: using the clj-http.cookies/wrap-cookies function |
| 21:07 | gfredericks | I'd like to turn that off |
| 21:07 | gfredericks | can upgrade clj-http if that helps |
| 21:07 | gfredericks | I'm using the clj-http.client/request method, so maybe I'm using the wrong interface? |
| 21:07 | dakrone | gfredericks: well, upgrading is always nice :) but you could also take a look at clj-http.client/request, and wrap it with your own stuff |
| 21:08 | gfredericks | maybe I'm wrong about what I'm using |
| 21:08 | dakrone | I mean clj-http.core/request |
| 21:08 | dakrone | is the basic one, no addons |
| 21:08 | dakrone | then you can define your own like clj-http.client/request does |
| 21:08 | gfredericks | okay, I'll go it that way; not too hard. thanks |
| 21:08 | dakrone | np |
| 21:08 | gfredericks | do it that way also |
| 21:10 | dakrone | gfredericks: but upgrade also if you can :) |
| 21:14 | gfredericks | dakrone: of course |
| 21:23 | dgrnbrg | ,(str "foo" "\n" "bar") |
| 21:23 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: Could not initialize class clojure.lang.RT> |
| 21:23 | y3di | oh man this is the best: http://imgs.xkcd.com/comics/lisp.jpg |
| 21:23 | dgrnbrg | why does str escape the \n? |
| 21:24 | gfredericks | &(str "foo" "\n" "bar") |
| 21:24 | lazybot | ⇒ "foo\nbar" |
| 21:25 | gfredericks | dgrnbrg: that's the string being printed; there's a real newline in that string |
| 21:25 | gfredericks | dgrnbrg: try (println (str "foo" "\n" "bar")) |
| 21:25 | dgrnbrg | gfredericks: oh, i see, thanks! |
| 21:26 | gfredericks | also interesting is ##(seq (str "foo" "\n" "bar")) |
| 21:26 | lazybot | ⇒ (\f \o \o \newline \b \a \r) |
| 21:27 | dgrnbrg | I know about that one |
| 21:27 | dgrnbrg | I didn't realize that it was printing readable strs |
| 21:27 | gfredericks | I guess newlines themselves are readable too.... |
| 21:28 | dgrnbrg | that's what most other languages I know print |
| 21:28 | dgrnbrg | but this is good too |
| 21:28 | dgrnbrg | I just needed to know |
| 21:28 | dgrnbrg | I have been mostly doing symbolic manipulation in clojure |
| 21:28 | dgrnbrg | but now i'm writing a code generator that spits out asm |
| 21:29 | dgrnbrg | (not dcpu16) |
| 21:32 | Frozenlock | I think I broke something.... When I try seesaw, I get this error: |
| 21:32 | Frozenlock | java/awt/Window$Type |
| 21:32 | Frozenlock | [Thrown class java.lang.NoClassDefFoundError] |
| 21:32 | Frozenlock | But I know it works, I have already used it earlier this week... |
| 21:32 | Frozenlock | Any idea on what I might have done? |
| 21:35 | hobbyist | Anyone happy to tell the difference between pr-str, prn-str and print-str? |
| 21:35 | gfredericks | there are 8 print functions |
| 21:36 | gfredericks | based on 3 properties |
| 21:36 | gfredericks | the -str ones return a string instead of printing to *out* |
| 21:36 | gfredericks | the ones with an extra 'n' in the name include a newline |
| 21:36 | gfredericks | and the ones with 'pr' instead of 'print' will print readably |
| 21:36 | aperiodic | (inc gfredericks) |
| 21:37 | aperiodic | is that in the docs somewhere? i've never seen that explanation before, unfortunately |
| 21:37 | hobbyist | much obliged |
| 21:37 | gfredericks | no idea |
| 21:37 | gfredericks | I'm not even 100% sure that all 8 combinations exist |
| 21:38 | gfredericks | ,[pr prn print println pr-str prn-str print-str println-str] |
| 21:38 | clojurebot | [#<core$pr clojure.core$pr@2638d0> #<core$prn clojure.core$prn@11dc32c> #<core$print clojure.core$print@520fa4> #<core$println clojure.core$println@116d7bd> #<core$pr_str clojure.core$pr_str@4dd658> ...] |
| 21:38 | gfredericks | guess so |
| 21:46 | gfredericks | &(for [base ["pr" "print"], mod ["" (if (= "pr" base) "n" "ln")], str ["" "-str"]] (str base mod str)) |
| 21:46 | lazybot | java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn |
| 21:47 | gfredericks | &(for [base ["pr" "print"], mod ["" (if (= "pr" base) "n" "ln")], str ["" "-str"]] (clojure.core/str base mod str)) |
| 21:47 | lazybot | ⇒ ("pr" "pr-str" "prn" "prn-str" "print" "print-str" "println" "println-str") |
| 21:50 | ivan | writing Python code where things are "almost" values is pretty horrible after learning some Clojure |
| 21:52 | guns | and the commas. So many commas |
| 21:52 | gfredericks | ,,,,,,,,,:foo,,,,,,,,,, |
| 21:52 | clojurebot | :foo |
| 21:54 | ivan | guns: yes, that also makes me go a little crazy |
| 21:54 | ivan | funny how it never bothers you until you are unshackled |
| 21:55 | guns | it's pretty superficial, but now my ruby keeps turning up with syntax errors |
| 21:55 | gfredericks | guns: how bout all them hash rockets? |
| 21:55 | guns | lol. I have that bound to a key anyway |
| 21:56 | gfredericks | {:foo => "bar", :baz => "bang"} --> {:foo "bar" :baz "bang"} |
| 21:56 | ivan | big_list = [['stuff', 'stuff'] |
| 21:56 | ivan | ['more', 'stuff']] |
| 21:56 | gfredericks | it's kinda crazy when you see them side by side |
| 21:56 | ivan | what happen!? |
| 21:57 | autodidakto | gfredericks: you mean foo: "bar", baz: "bang" |
| 21:57 | gfredericks | autodidakto: in ruby or clojure? |
| 21:57 | ivan | dict(foo="bar", baz="bang") is almost tolerable |
| 21:57 | guns | I hate the 1.9 hash syntax |
| 21:57 | autodidakto | gfredericks: oh sorry. i got confused, i thought you were comparing 1.8 to 1.9 |
| 21:58 | gfredericks | if you have a problem, the answer is always more syntax |
| 21:58 | guns | that's the ruby way for sure |
| 21:58 | autodidakto | blame perl :) |
| 21:58 | guns | I like the perlisms actually |
| 21:59 | guns | %w[foo bar baz] # no commas |
| 21:59 | autodidakto | i agree. if you're gonna have syntax, ruby's aint bad.. it's the inconsistancies mostly |
| 22:00 | autodidakto | guns: but no way to do common less hashes, directly.. |
| 22:00 | guns | If ruby had persistent data structures, I might not have made it to clojure |
| 22:00 | guns | but the pervasive mutability is a real headache in larger apps |
| 22:01 | ivan | but my 200 line script works fine and I have no idea what you are talking about lalala |
| 22:01 | ivan | (it does bother me that no one seems to have the problems I have in the Python world) |
| 22:01 | autodidakto | guns: if you're gonna have a mixed language, you could find worse things than Lisp + Perl + Smalltalk |
| 22:02 | guns | Well, wn retrospect, python has a lot more discipline than ruby |
| 22:03 | autodidakto | guns: and that always frustrated me... I want the no-holds-barred of ruby, but not the "wth is this?" that comes along with it |
| 22:03 | alex_baranosky | immutability at the language level just eliminates an entire level of comlexity |
| 22:03 | alex_baranosky | I find it makes reading the code so much more effortless |
| 22:04 | autodidakto | alex_baranosky: we agree of course :) |
| 22:04 | alex_baranosky | reading most other languages I always need to set aside a portion of my brain for what-ifs and mutability gotchas |
| 22:05 | autodidakto | and how much you gotta keep... no, juggle, in your head |
| 22:05 | alex_baranosky | also Clojure's regular syntax is so comforting |
| 22:05 | autodidakto | maybe plate spinning is a better metaphor... |
| 22:05 | alex_baranosky | my goodness -- if you do a lot of SCala you'll know what I mean |
| 22:05 | gfredericks | and most of the metaprogramming happens once at compile-time |
| 22:06 | alex_baranosky | and the metaprogramming is immutable metaprogramming |
| 22:06 | alex_baranosky | meaning it is just functions that run... at compile time (macros) |
| 22:06 | guns | yeah, localized monkey patches were rejected for ruby 2.0 |
| 22:07 | gfredericks | they were? |
| 22:07 | guns | would've been a great step |
| 22:07 | gfredericks | I forgot what those were called |
| 22:07 | guns | matz said too slow |
| 22:07 | guns | refinements |
| 22:07 | gfredericks | ah right |
| 22:07 | guns | ? |
| 22:07 | alex_baranosky | what a great way to take the path most often taken |
| 22:07 | guns | haha |
| 22:07 | wkmanire | Howdy folks. |
| 22:08 | autodidakto | wkmanire: howdy pa'ner |
| 22:09 | alex_baranosky | howdy wkmanire |
| 22:09 | alex_baranosky | what's new? |
| 22:09 | wkmanire | I'm reading through the information available on the website. |
| 22:09 | alex_baranosky | I'm bored |
| 22:09 | wkmanire | I was referred to clojure by somebody in Python. |
| 22:09 | gfredericks | alex_baranosky: work on reconstitutible lazy seqs |
| 22:09 | wkmanire | #python |
| 22:09 | wkmanire | bleh |
| 22:10 | alex_baranosky | re-what-able ? |
| 22:10 | wkmanire | I'm going to have a whole bunch of newb questions. |
| 22:10 | alex_baranosky | I'm in a non-programming mood |
| 22:10 | gfredericks | oh definitely never mind then |
| 22:10 | alex_baranosky | this is a pretty good spot for noob Q's |
| 22:11 | gfredericks | my last comment was to alex_baranosky not wkmanire |
| 22:11 | wkmanire | I'm a strictly imperative programmer and have done my work almost exclusively using OOP. |
| 22:11 | wkmanire | But... I want to learn functional programming. |
| 22:11 | guns | <applause> |
| 22:11 | wkmanire | Does clojure have a web developement framework? |
| 22:11 | alex_baranosky | wkmanire, Clojure is amazing -- that's all you need to know :) |
| 22:11 | autodidakto | Short answer, yes |
| 22:12 | gfredericks | clojure on clails |
| 22:12 | autodidakto | Long answer, yes but better |
| 22:12 | alex_baranosky | it has multiple web libraries |
| 22:12 | guns | gfredericks: lol |
| 22:12 | wkmanire | gfredericks: I hope that was a joke. |
| 22:12 | wkmanire | :D |
| 22:12 | gfredericks | I hope so too, I haven't googled yet |
| 22:12 | guns | clojure libs do tend to have awkward names |
| 22:12 | alex_baranosky | Clojure on Clams ? |
| 22:12 | alex_baranosky | Clojure on Classic Cars? |
| 22:12 | autodidakto | guns: everybody loves their puns. we're still not as bad as ruby though |
| 22:12 | gfredericks | I spent a lot of effort at the first conj trying to come up with an interesting name |
| 22:13 | wkmanire | I see that you can target javascript with clojure too. |
| 22:13 | wkmanire | So, as a webdev that is pretty interesting to me. |
| 22:13 | guns | god I'm still laughing |
| 22:13 | autodidakto | wkmanire: very much so. same language both server and client... and *not* js |
| 22:16 | wkmanire | A seq is essentially a cons cell correct? |
| 22:16 | amalloy | no |
| 22:17 | autodidakto | wkmanire: what do you know about lisp? |
| 22:17 | wkmanire | autodidakto: I do most of my hacking with emacs. So I've hacked a bit of elisp. |
| 22:17 | wkmanire | autodidakto: Don't take that seriously. |
| 22:17 | autodidakto | wkmanire: what's great about seqs is that they are an abstraction. |
| 22:18 | wkmanire | autodidakto: That's what I'm reading. |
| 22:18 | autodidakto | cons are... uhm... real things... anything that conforms to first/rest/i-forget can be a seq |
| 22:18 | autodidakto | however they may be implemented |
| 22:18 | autodidakto | conforms to = understands/implements |
| 22:19 | wkmanire | The article http://clojure.org/functional_programming here states that seq is an interface defining a thing which has first and rest. |
| 22:19 | autodidakto | ugh, im tripping all over my myself... *whatever they're implementation details, as long as they understand first/rest/something |
| 22:19 | autodidakto | *their... man i need sleep... |
| 22:20 | autodidakto | wkmanire: right right, so, that's one example of clojures... new lispy power modern power |
| 22:20 | alex_baranosky | wkmanire, lots of interfaces in Clojure under the hood |
| 22:20 | alex_baranosky | there's a whole lot of Java going on down there |
| 22:20 | autodidakto | wkmanire: are you coming from java? |
| 22:20 | autodidakto | wkmanire: ruby? perl? fortran? Sassl?! |
| 22:21 | gfredericks | quick someone add an even more ridiculous example |
| 22:21 | aperiodic | forth! |
| 22:21 | wkmanire | autodidakto: I've been living in Brazil for the last two months. My English are not too good right now also too. |
| 22:21 | autodidakto | aperiodic: respect the concatenation |
| 22:21 | xeqi | dcpu16? |
| 22:21 | wkmanire | autodidakto: I make my living with .Net. I hack a lot of python and Javascript. |
| 22:22 | wkmanire | I'm trying to make my escape from the windows platform. |
| 22:22 | autodidakto | wkmanire: gotcha |
| 22:22 | wkmanire | Also, trying to hold back on my questions until I've read up on at least the basics of Clojure. |
| 22:23 | autodidakto | wkmanire: philosophical questions are fine. but as for the beginner tutorial stuff, there are good resources |
| 22:23 | wkmanire | Immediately I'm thinking things like, how do you keep down on namespace complexity when you are constantly making functions. |
| 22:23 | wkmanire | How does the stack not get eaten' alive by recursion. |
| 22:23 | autodidakto | wkmanire: tryclj.com can be your repl for now, too |
| 22:23 | alex_baranosky | loop recur |
| 22:23 | alex_baranosky | or just plain recur |
| 22:23 | autodidakto | wkmanire: namespaces :) |
| 22:24 | wkmanire | 100 functions one data structure? |
| 22:24 | wkmanire | owie. |
| 22:24 | alex_baranosky | more like POW! |
| 22:24 | autodidakto | no no. 100 functions, whatever you're data structure |
| 22:24 | alex_baranosky | BAM |
| 22:24 | autodidakto | *turns on 70s batman music* |
| 22:24 | alex_baranosky | Clojure leans heavily on seqs and maps |
| 22:24 | wkmanire | ooh, thanks for the live REPL. |
| 22:24 | autodidakto | alex_baranosky: jimmy jillikers baranosky! the OOP joker is at again! |
| 22:24 | alex_baranosky | so the core library functions become used very heavily |
| 22:25 | wkmanire | Very convenient. |
| 22:25 | wkmanire | I hope this site is written with clojure both client and server. |
| 22:25 | autodidakto | wkmanire: it's on github :) |
| 22:25 | wkmanire | Nope, client is using jquery. very old jquery. |
| 22:26 | gfredericks | we clojure developers only use the most vintage of jay queries |
| 22:27 | wkmanire | New jQueries are generally better. They haven't added that much functionality but they keep improving the internal code. |
| 22:27 | technomancy | wkmanire: the main difference between seqs and cons cells is that cons cells allow for "improper lists" (dotted pairs) while seqs always have either a seq or nil in their cdr |
| 22:27 | wkmanire | I believe Resig is a functional programming fan too., |
| 22:27 | wkmanire | technomancy: Lost me with dotted pairs. |
| 22:27 | technomancy | wkmanire: you can call (cons 1 2) that has 2 as the cdr |
| 22:28 | technomancy | that's not legal in clojure |
| 22:28 | technomancy | you'd just use a vector for that |
| 22:28 | amalloy | wkmanire: a cons cell is typically a "pair" of any two things. when the second thing is also a cons cell, lispers interpret that as a list. clojure doesn't have cons cells, it has seqs |
| 22:28 | wkmanire | I see. |
| 22:28 | wkmanire | Because 2 is not a seq, that is invalid. |
| 22:28 | wkmanire | understood. |
| 22:28 | wkmanire | So how is (cons 1 2) represented? |
| 22:29 | wkmanire | (1 (2 nil))? |
| 22:29 | gfredericks | (cons 1 (cons 2 nil)) |
| 22:29 | gfredericks | wait I don't know what we're talking about |
| 22:29 | wkmanire | pardon my crappy syntax, but I think I was more or less correct. |
| 22:29 | wkmanire | he he he |
| 22:30 | wkmanire | Well, this looks like this is going to be fun. I'm going to force myself to finish reading this website and actually hack a little clojure. I'll write down my questions and come back with the ones I can't answer on my own. |
| 22:30 | wkmanire | Thanks for the support folks. |
| 22:31 | guns | gl hf |
| 22:31 | autodidakto | ,(apply str (interpose "!" ["all" "your" "jays" "are" "belong" "to" "us"])) |
| 22:31 | Frozenlock | Noir users: I want to provide a link to download a file generated on the fly. Is there a function for this? I think I need (((noir.request/ring-request) :headers) "application/octet-stream"), but that's a far as I got :( |
| 22:31 | clojurebot | "all!your!jays!are!belong!to!us" |
| 22:31 | autodidakto | wkmanire: -> http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/ |
| 22:32 | wkmanire | autodidakto: Sweet. That will be video number 2 on my list. |
| 22:32 | wkmanire | autodidakto: A fella in #python linked me this http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey |
| 22:33 | guns | wkmanire: This is the Hickey talk that pulled me in: |
| 22:33 | guns | http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey |
| 22:34 | wkmanire | I have a feeling I'm going to spend a lot of time reading what this guy wrote and listening to him talk. |
| 22:34 | ivan | so, who's gonna port Meteor to ClojureScript? ;) |
| 22:34 | autodidakto | wkmanire: also, now is the time to buy cemerick's Clojure Programming -> "http://www.clojurebook.com/" ... just came out, 50% sale, + 40% off with coupon code :) |
| 22:34 | wkmanire | Does he ever frequent the channel? |
| 22:34 | wkmanire | autodidakto: Going to be hard to get in Brazil. |
| 22:34 | wkmanire | I hope I can get it on my kindle. |
| 22:34 | autodidakto | wkmanire: You'll notice the clojurians are more philosophical than average, as well |
| 22:35 | autodidakto | wkmanire: PDF/Mobi/Epub/Daisy |
| 22:35 | autodidakto | you don't even need eyes (with Diasy format), hehe |
| 22:35 | autodidakto | wkmanire: rhickey is usually too busy being awesome, but yes he comes in... was doing a poll about naming an new function... |
| 22:35 | autodidakto | $seen rhickey |
| 22:35 | lazybot | rhickey was last seen joining on clojure 1 day and 14 hours ago. |
| 22:36 | wkmanire | Seems like a pretty fart smeller. |
| 22:36 | wkmanire | he he he |
| 22:37 | offby1 | I cannot believe I've never heard that before, but ... there you are |
| 22:37 | autodidakto | offby1: must be brazilian thing |
| 22:37 | wkmanire | I'm a gringo. |
| 22:37 | wkmanire | I'm just living here. |
| 22:37 | wkmanire | Home is Las Vegas, Nevada. |
| 22:38 | gfredericks | oh goodness I think I've somehow misused core.match again |
| 22:38 | chrisr | How do I test if two records in vars x and y are of the same type? I have tried (def x (Foo. :a)) (def y (Foo. :b)) then (= (type x) (type y)) => nil |
| 22:39 | autodidakto | 2 months in brazil and it's already ruined your english, you said? |
| 22:40 | gfredericks | chrisr: gives true for me |
| 22:41 | wkmanire | autodidakto: I was here for a month between december and January too. I just don't speak English while I'm here. |
| 22:41 | wkmanire | Only with my fellow irc patrons. |
| 22:41 | wkmanire | autodidakto: I'm looking forward to learning Clojure though. |
| 22:41 | wkmanire | Looks like a fun language to speak. |
| 22:42 | autodidakto | wkmanire: cool. I know how it is.... Yeah. enjoy. |
| 22:44 | wkmanire | Ahhh, that answers my question. |
| 22:44 | wkmanire | About stack space. |
| 22:45 | wkmanire | tail call optimization. |
| 22:45 | chrisr | gfredericks: oooops I had redefined = in that namespace |
| 22:45 | autodidakto | wkmanire: it's either not an issue (usually isn't) or tail call optimized (converted to something like an imperative loop) |
| 22:52 | wkmanire | autodidakto: http://clojure.org/runtime_polymorphism |
| 22:52 | wkmanire | this article is attempting to sell me that multifunctions are a form of polymorphism |
| 22:52 | wkmanire | and the example sort of behaves like a class and its member functions. |
| 22:53 | wkmanire | But I'm really just seeing function overloading. |
| 22:53 | wkmanire | Am I missing something? |
| 22:53 | wkmanire | Pardon my grammar, I know these imperative terms really don't apply for the most part. |
| 22:54 | emezeske_ | wkmanire: Function overloading == a form of polymorphism |
| 22:54 | gfredericks | multimethods let you use a type hierarchy as well |
| 22:54 | cemerick | wkmanire: the point is that multimethods can dispatch on arbitrary values, not just the class of the first argument. |
| 22:55 | wkmanire | So encounter takes anything which is a :Species then the "submethods" define what happens when various species meet. |
| 22:55 | wkmanire | is that correct? |
| 22:55 | wkmanire | Rather, encounter takes two things which are :Species |
| 22:56 | cemerick | it takes two things which have :Species entries |
| 22:56 | wkmanire | cemerick: Yes, please correct my grammar. I really want to know how form my questions correctly. |
| 22:56 | cemerick | That's not a class, it's just a key in the example maps. |
| 22:57 | wkmanire | So what happens if encounter is called and passed two things which haven't been specified with defmethod? |
| 22:57 | autodidakto | wkmanire: :default |
| 22:57 | cemerick | for which there is no method defined, therefore an error is raised |
| 22:58 | wkmanire | Got it. |
| 22:58 | wkmanire | Are those entries defined "on the fly"? |
| 22:58 | autodidakto | wkmanire: so you're used to polymorphism based on class, or based on number of argumends... in clojure, you based it on the result of a given function... that is, _anything you want_ |
| 22:58 | wkmanire | That is :Species began to exist because of its usage in the definiton of encounter? |
| 22:59 | cemerick | wkmanire: no, it's just a key; no special initialization or anything |
| 22:59 | chrisr | this video was helpful to me regarding protocols and multimethods, http://www.infoq.com/presentations/Clojure-Expression-Problem |
| 22:59 | autodidakto | see the "(fn [x y] [(:Species x) (:Species y)])" ? that's the function that... prepares (my words), the, uhm, dispatch |
| 23:00 | cemerick | autodidakto: called a dispatch function :-) |
| 23:00 | autodidakto | it in this case, it pulls out the species key of the x hash, and the same with y... the defmetho |
| 23:00 | autodidakto | one of the defmethods is going to catch the return value of that function |
| 23:00 | wkmanire | duck typing. |
| 23:01 | autodidakto | but not just "do you respond to this?" |
| 23:01 | cemerick | wkmanire: no, that's based on methods that are called on objects |
| 23:01 | cemerick | multimethods exist entirely separate from the values they are applied to |
| 23:02 | autodidakto | if could easily have been :species of x + the string "heck yah!", and the right defmethod would be called |
| 23:02 | wkmanire | cemerick: I think I understand you but don't bother to clarify that just yet. I'm probably not ready for the answer. |
| 23:02 | mutinyonthebay | I've noticed that a lot of the features of the meteor framework just released (real-time updating from code changes, server-client code sharing, etc.) seems very reminiscent of clojurescript... is it theoretically possible to run one in the context of the other? |
| 23:03 | autodidakto | wkmanire: the bigger theme is this -> there are a lot of aspects to OOP... clojure doesn't entirely reject them... it just applies them a la carte |
| 23:03 | autodidakto | you asked about namespaces, about polymorphism... we use them too, but we don't smash it all together like sitting on your sandwich |
| 23:04 | wkmanire | sitting on your sandwhich? |
| 23:04 | autodidakto | lol i dunno i just made that up |
| 23:04 | cemerick | wkmanire: Perhaps. :-) Consider: you could define a multimethod whose dispatch values vary depending on the time of day. |
| 23:04 | wkmanire | sandwich* |
| 23:04 | wkmanire | I'm used to Namespace -> Class -> one of N different things |
| 23:04 | wkmanire | Or, Module -> Class or Variable Or Function |
| 23:04 | cemerick | Protocols are more aligned with that kind of classification. |
| 23:05 | wkmanire | Or in the case of Javascript, Everything -> Everything -> Everything -> loop |
| 23:05 | wkmanire | :D |
| 23:05 | autodidakto | But if you're worried about php style "everything called from anywhere". dont worry, we use namespaces |
| 23:05 | wkmanire | cemerick: Now thats interesting |
| 23:06 | wkmanire | cemerick: So you could schedule different behaviors appropriately to the clock. |
| 23:07 | autodidakto | wkmanire: you could do anything you want :) |
| 23:07 | cemerick | wkmanire: sure, or the current size of a queue, or a characteristic of the *last* set of arguments to the multimethod, or… |
| 23:07 | wkmanire | autodidakto: At zombo.com |
| 23:08 | xumingmingv | can we do a step-by-step in clojure like what we do in java using eclipse? |
| 23:09 | xumingmingv | can we do a step-by-step debug in clojure like what we do in java using eclipse? |
| 23:09 | wkmanire | Going to be AFK a bit. |
| 23:10 | cemerick | xumingmingv: yes, debugging in eclipse (as long as you have counterclockwise installed) works pretty well; it's a little rougher around the edges still, but stepping works. |
| 23:10 | autodidakto | *grumbles something about CL/Shen/Smalltalk debuggers* |
| 23:11 | chrisr | shen has a good debugger? |
| 23:11 | chrisr | or you mean that CL/smalltalk dont? |
| 23:11 | yoklov | smalltalk has an amazing one |
| 23:11 | autodidakto | shen has a CL style debugger |
| 23:11 | yoklov | from what i've heard |
| 23:12 | autodidakto | smalltalk is the best they say, yeah |
| 23:14 | chrisr | i have been meaning to try to shen clojure port for awhile now, just no time |
| 23:15 | amalloy | stepping debuggers are a little less obvious in a pure language, since most of what you use a debugger for (in my experience) was checking out what the state of the program was when running code X |
| 23:15 | amalloy | i'd definitely like a better one for clojure though; i never got ritz to work |
| 23:15 | autodidakto | chrisr: i think it's still a little rough is my guess. might as well just play with shen :) |
| 23:15 | TimMc | amalloy: As long as it can inspect return values, it gets my vote. |
| 23:16 | gfredericks | um. hello. alert anybody? |
| 23:16 | ferd | I'll give an informal Clojure training to my team mates ("brown-bag" session)... Ideas to awe to audience? |
| 23:16 | xumingmingv | cemerick thanks, but if i remember it correctly, counterclockwise is very slow |
| 23:16 | autodidakto | chrisr: i think of shen as if clojure had said "screw the jvm, open source, and hey haskell is pretty cool" |
| 23:16 | xumingmingv | i am using emacs for now |
| 23:17 | hugod | amalloy: sorry to here that - lein-ritz is getting easier to set up (with lein2) |
| 23:17 | amalloy | hugod: the only time i tried was in the early days; it's hard to fault you for it |
| 23:17 | autodidakto | amalloy: TimMc: agreed. A debugger/inspector/whatever makes things smooth |
| 23:17 | chrisr | autodidakto: thats somewhat my impression, however it seems to lack greatly in anything concurrent |
| 23:17 | ivan | ferd: sit back and let Hickey do the explaining |
| 23:17 | autodidakto | hugod: link :) |
| 23:17 | ferd | my idea is to show a few basic concepts, and then jump into small cool things to "entice" people to look further |
| 23:17 | ferd | ivan: #-) |
| 23:17 | amalloy | but in so doing i messed up my existing swank setup and now i'm afraid to try again |
| 23:18 | cemerick | xumingmingv: really? I use it all day. |
| 23:18 | hugod | autodidakto: https://github.com/pallet/ritz |
| 23:18 | cemerick | You might want to give it another shot, in any cause. |
| 23:18 | cemerick | s/cause/case |
| 23:18 | autodidakto | "The whole language available to you, all the time"... Except when you're debugging. Put printf statements.." |
| 23:18 | ferd | my objective is to spark interest in Clojure... not to "teach" it (you cannot teach any language in 1hr) |
| 23:19 | cemerick | autodidakto: not true; there's the debug-repl |
| 23:19 | cemerick | We're hoping to get it into counterclockwise soon… |
| 23:20 | autodidakto | cemerick: Awesome. I got some projects to check it then. |
| 23:20 | autodidakto | cemerick: Got your book in virtual desktop 12 btw. Just finished the preface and i'm already blown away. |
| 23:21 | cemerick | Well, I'm glad the preface is so good. ;-) |
| 23:24 | cemerick | actually, I'm surprised anyone reads the preface to begin with! |
| 23:24 | mutinyonthebay | I read the preface. Breathtaking. |
| 23:24 | autodidakto | I think it gives a feeling of what's to come |
| 23:24 | mutinyonthebay | I joke, but it was a good preface :). |
| 23:24 | cemerick | mutinyonthebay: I knew I was being trolled on that one :-) |
| 23:25 | autodidakto | it's like, the guy is openning the car door for you. Does he just throw you in? Open the door slowly with white gloves on? Can you trust him? Where am I going with this ridiculous metaphor? |
| 23:25 | mutinyonthebay | cemerick: In actuality, the book is very good. I'm incredibly new to clojure, and only have a wee bit of CL in my background, and I'm finding everything very clear and approachable. |
| 23:27 | autodidakto | cemerick: Programming Clojure is like the kind but tough professor. Clojure Programming is the fun loving tutor. |
| 23:27 | cemerick | hah |
| 23:27 | autodidakto | well at least the preface :) I'll finish the book and come back with more analogies |
| 23:28 | gfredericks | autodidakto: but both can be rearranged to spell "Armoring Clog Jumper" |
| 23:28 | autodidakto | lol analogies not anagrams! |
| 23:29 | autodidakto | gfredericks: but the fact that both of them arrange the same... coicidence? |
| 23:29 | gfredericks | "Grim Nuclear Jog-Romp" |
| 23:29 | alex_baranosky | has anyone used Jark? |
| 23:30 | cemerick | autodidakto, mutinyonthebay: anyway, thanks for the kind words. I hope you find the rest of the book to be useful and as pleasant. |
| 23:31 | mutinyonthebay | I'm looking forward to it :) |
| 23:32 | autodidakto | hugod: the readme, under "experimental jack in support" repeats the instructions for lein1 plugin install.. does that mean it doesnt work in lein2? |
| 23:33 | autodidakto | cemerick: I shall |
| 23:33 | hugod | autodidakto: it should work with lein2 |
| 23:34 | hugod | you will need to add lein-ritz to your :user profile |
| 23:34 | autodidakto | hugod: mind if i fork and clearify that in the README? |
| 23:35 | hugod | the jack-in support has seen only light testing, as I don't use it myself... |
| 23:35 | hugod | autodidakto: please do :) |
| 23:35 | ppppaul | datom is the new document db? |
| 23:35 | autodidakto | hugod: and github markdown bonked your install code... the ```language line is broke (happened on my README too.. don't know why) |
| 23:38 | autodidakto | i'll clean that up too though. Ok off I go...! |
| 23:38 | jdp | this may be a very silly question but, on osx 10.7 with lein2, hitting enter at the repl does nothing. has anyone else encountered this? |
| 23:38 | jdp | ctrl+d will quit the repl though |
| 23:41 | budu | hi |
| 23:42 | wkmanire | back |
| 23:42 | budu | i'm trying to create a package for the new Meteor web framework to be able to use the clojurescript compiler but i'm stuck on a semmingly simple issue |
| 23:43 | budu | meteor listen for file change using node's fs.watch and i'm calling cljsc on the whole source directory in the callback |
| 23:44 | budu | but then it seems to get into a loop, where the cljs files trigger a change notification when the compiler run |
| 23:45 | budu | so i'm wondering if cljsc is modifying the original files in some way during compilation? |
| 23:46 | wkmanire | Using Clojure with swing seems a bit contrary doesn't it? |
| 23:47 | wkmanire | In the example, clojure calls .setText of a JLabel. |
| 23:48 | emezeske_ | wkmanire: Your program has to do *something* other than heat up the CPU! ^_^ |
| 23:49 | ppppaul | my programs heat my room |
| 23:49 | emezeske_ | I guess there is FRP for more functional GUIs, but I'm not sure anyone has done anything big with that yet |
| 23:50 | wkmanire | So in order to utilize existing libraries a certain amount of mutability is acceptable. |
| 23:51 | ppppaul | you need to mutate some thigns |
| 23:51 | ppppaul | just not EVERYTHING |
| 23:51 | ppppaul | every god damned thing |
| 23:51 | ppppaul | my whole program just mutated into something i don't understand |
| 23:52 | emezeske_ | Yeah, a certain amount of mutability is present in every program |
| 23:52 | ppppaul | also, constants are easier to name |
| 23:52 | emezeske_ | Clojure just encourages you to isolate and minimize the mutability |
| 23:53 | wkmanire | Otherwise you'd have to recreate your entire UI each time the mouse moved... I may be exaggerating but technically you'd need to create a new instance of your application where the mouse is now located one more pixel to the right. |
| 23:54 | amalloy | wkmanire: that's really not such a big deal with structural sharing |
| 23:55 | amalloy | not that i'm saying you shouldn't use mutability for your UI |
| 23:56 | amalloy | but "OMG you'd have to copy your whole program state" is the wrong thing to worry about |
| 23:56 | wkmanire | I'm not "OMG"ing. |
| 23:56 | ppppaul | i am |
| 23:56 | wkmanire | Just making naive statements to illustrate my curiosity with all of this. |
| 23:57 | ppppaul | when clojure is doing stuff with java, you are outside of sanity |
| 23:57 | amalloy | well, don't take me too seriously when it sounds like i'm being critical (fyi) |
| 23:57 | wkmanire | :) |
| 23:57 | emezeske_ | wkmanire: To feed your curiousity, copying your whole program state to account for one tiny thing changing is a pretty common FP idiom |
| 23:57 | amalloy | are you familiar with the idea of structural sharing? |
| 23:57 | wkmanire | Do you guys constantly debate where to draw the line? |
| 23:57 | wkmanire | I mean, internally/ |
| 23:58 | amalloy | well, constantly is a strong word |
| 23:58 | wkmanire | Does it occur each time you are working on your UI? |
| 23:58 | amalloy | but it's a thing to worry about |
| 23:58 | wkmanire | Or with the file systme |
| 23:58 | wkmanire | or a database |
| 23:58 | wkmanire | Or anything else that naturally represents a mutable state. |
| 23:58 | amalloy | "naturally" |
| 23:59 | amalloy | there's no particular reason why a database has to be mutable; elephantdb and datomic show that |