2013-03-10
| 00:03 | anildigital | Hi.. I installed clojure-mode in emacs but I don't have Mx clojure-jack-in |
| 00:04 | tomoj | is there a really good reason you can't extend one protocol to another? |
| 00:05 | tomoj | (extend-protocol CollReduce Object (coll-reduce ([coll f] (seq-reduce coll f)) ...)) |
| 00:06 | Raynes | devn: I don't think API docs are really more useful than just looking at the source. |
| 00:07 | Raynes | You still have no way of knowing if what you want is there without looking through everything, and the source code is well organized so you don't have to look through *everything*, just everything in the category of the thing you need. |
| 00:07 | technomancy | inc |
| 00:07 | arrdem | anildigital: it's nrepl-jack-in from package nrepl |
| 00:07 | Raynes | devn: As for inclusive-range, ask amalloy. |
| 00:07 | anildigital | arrdem: there is no clojure-jack-in present now |
| 00:08 | arrdem | anildigital: that's provided by swank-clojure |
| 00:08 | arrdem | anildigital: which is deprecated for nrep.el |
| 00:08 | anildigital | arrdem: what package should I install for swank-clojure |
| 00:08 | anildigital | arrdem: so you say nrepl is new |
| 00:08 | arrdem | anildigital: https://github.com/kingtim/nrepl.el |
| 00:09 | technomancy | anildigital: if you want clojure-mode to help you with swank, you would need an older version (1.x) |
| 00:10 | anildigital | technomancy: hmm ..can I know latest steps to play with clojure from emacs |
| 00:10 | technomancy | sure: http://clojure-doc.org/articles/tutorials/emacs.html |
| 00:13 | anildigital | technomancy: I created a project .. and done nrepl-jack-in .. it says "error in process sentinel: Leiningen 2.x is required by nREPL.el" |
| 00:13 | anildigital | I have upgraded my lein just now |
| 00:15 | anildigital | looks like this issue http://stackoverflow.com/questions/13243048/mac-osx-emacs-24-2-and-nrepl-el-not-working |
| 00:17 | anildigital | technomancy: it worked when I ran this from command line /Applications/Emacs.app/Contents/MacOS/Emacs project.clj |
| 00:17 | anildigital | any setting that I can do so that I don't have to run emacs with command line |
| 00:17 | anildigital | thanks |
| 00:18 | technomancy | yeah, the $PATH on OS X is really ridiculous |
| 00:18 | technomancy | I don't know off the top of my head how to fix it, but it involves editing a plist.xml file |
| 00:18 | technomancy | if you need to launch it from the GUI anyway |
| 00:19 | anildigital | technomancy: okay thanks |
| 00:19 | technomancy | sure |
| 00:37 | dcolish | yeah theres a .MacOS folder in your home dir you need to set the path in |
| 00:55 | anildigital | technomancy: https://github.com/purcell/exec-path-from-shell was the answer .. spread the word |
| 00:56 | technomancy | gross =\ |
| 00:56 | technomancy | but yeah, for those that have the misfortune to run into that problem it's probably better than editing XML files |
| 00:58 | thm_prover | (clojure.core.typed/check-ns) <-- does this hang for anyone else? |
| 00:58 | thm_prover | has anyone managed to use typed in production code? |
| 00:59 | anildigital | technomancy: :) |
| 00:59 | anildigital | technomancy: would you suggest any good book to start learning clojure? |
| 01:00 | thm_prover | technomancy: what have you used core.typed for? |
| 01:00 | technomancy | anildigital: http://clojurebook.com is a great place to start |
| 01:00 | Raynes | anildigital: That seems like a whole lot of code. |
| 01:00 | anildigital | technomancy: thanks.. |
| 01:00 | technomancy | thm_prover: I'm not really interested in static typing without an inference engine |
| 01:00 | anildigital | Raynes: yeah.. but it helped.. |
| 01:01 | thm_prover | technomancy: I like inference engines too. In fact, I like theorem provers like isabelle/coq. |
| 01:02 | technomancy | hopefully some day typed clojure will provide that, but it sounds like it's a long way away |
| 01:04 | thm_prover | technomancy: http://cljbin.com/paste/513c22c8e4b03285d2084c90 <-- any idea why check-ns infinite loops or how I should start debuggint this? |
| 01:06 | amalloy | maybe it's not infinite. wait till the end of the universe, just in case |
| 01:07 | arrdem | amalloy: could even be O(1) where C is the heat death of the universe... |
| 01:07 | amalloy | certainly your annotation for add is bogus |
| 01:07 | thm_prover | yeah, why did it accept it? |
| 01:07 | arrdem | thm_prover: thanks for linking that project |
| 01:07 | thm_prover | it should be Integer -> Integer -> Integer |
| 01:08 | thm_prover | it's so frustrating using experimental projects by people smarter than me; I can't bash them for being stupid since I can't implement it myself |
| 01:09 | dnolen | a response to Mark's LP is overrated blog post - http://swannodette.github.com/2013/03/09/logic-programming-is-underrated/ |
| 01:13 | Raynes | dnolen: I really enjoyed the other guy's blog post. |
| 01:14 | dnolen | Raynes: heh, I didn't mostly because of the inaccuracies. But I certainly won't argue w/ the point that list comprehensions can be used to do the same thing for small problems. |
| 01:15 | Raynes | dnolen: I'd probably like core.logic more if it weren't for there being 'o' at the end of every thing. I hate reading that. |
| 01:15 | Raynes | It's likely just OCD, but it makes me want to break my laptop. |
| 01:15 | dnolen | Raynes: then don't write that in your own code. |
| 01:15 | Raynes | And 'conde' |
| 01:15 | Raynes | "What, you're using ghandi in your code?" |
| 01:16 | dnolen | Raynes: I don't use conde much |
| 01:16 | alandipert | dnolen: nice |
| 01:17 | Raynes | dnolen: I don't actually have anything against core.logic or anything though. I haven't had a reason to use it but I'm sure I will one day. I'm mostly just waiting for a Conj where there are less than 5 core.logic talks. :p |
| 01:17 | Raynes | Not to put anyone who has done core.logic talks down or anything. |
| 01:17 | Raynes | Just that I, in particular, have seen the topics covered enough times that it becomes yawn inducing after a while. |
| 01:18 | Raynes | But I, as it turns out, am not the only person in the world, so *shrug*. |
| 01:18 | dnolen | Raynes: heh, I think there's only one core.logic talk at Clojure/West? |
| 01:18 | Raynes | Doesn't help me because I'm not going to clojure.west. :p |
| 01:19 | Raynes | Everyone will make up for it with 4 extra logic talks at conj 2013! |
| 01:19 | dnolen | Raynes: haha, I doubt it - I'm looking forward to the "core.logic in my codebse? no big deal ..." future |
| 01:20 | dnolen | er, codebase |
| 01:24 | scottj | dnolen: do you have a list of what you'd call the core.logic core functions if it weren't for minikanren? |
| 01:27 | dnolen | scottj: I should probably be more consistent ... buuut ... most things with a docstring are intended to be used by users. |
| 01:27 | dnolen | scottj: we're slowing moving away from the miniKanren / TRS stuff - too much emphasis on lists |
| 01:27 | scottj | dnolen: I see now how my question is confusing :) have you come up with alternative names for the core functions, like names you think are better than the minikanren ones? |
| 01:28 | dnolen | scottj: not really, my point is mK is really list centric. Which is pretty jarring for Clojure programmers. |
| 01:28 | dnolen | scottj: I'm on a mission this year to change to that story. |
| 01:29 | dnolen | scottj: so core.logic suffers a bit currently from adopting some of the list centric stuff, ideally we'd have polymorphic goals/constraints in proper Clojure style. |
| 01:35 | dnolen | scottj: maybe that isn't answering your question, are there some mK goal names you have in mind? |
| 01:36 | scottj | dnolen: I actually don't know core.logic well, but even names like run, run*, fresh, conde, didn't sound like the names someone would give these functions if they were designed by a clojure programmer with no minikanren history |
| 01:37 | scottj | dnolen: I realize why you kept them, to make learning and using reasoned schemer easier, but I wondered if you'd thought up alternative more clojure-like names |
| 01:38 | dnolen | scottj: primitive operators like run/run*/fresh/conde are unlikely to change |
| 01:40 | dnolen | scottj: and I'm not sure there are better names for those and conde ideally used less often than defne/matche |
| 03:33 | danneu | eclipse + ccw + vrapper is pretty nice |
| 03:34 | Raynes | I have a box of facts here. |
| 03:34 | Raynes | I'll put that in it. |
| 03:36 | danneu | that's right. i don't have opinions, just facts |
| 03:37 | danneu | i just mean i've been using vim since i started programming (ruby) and never needed to use an ide before. |
| 03:40 | alandipert | Raynes: lol |
| 03:43 | Raynes | danneu: I was just being silly. :) |
| 04:12 | devn | alandipert: oh hello |
| 04:13 | devn | Raynes: yo |
| 04:13 | Raynes | devn: sup |
| 04:13 | devn | Raynes: meh, a little water logged and trying to figure out what's broken |
| 04:13 | Raynes | Well, it sounds like a pipe is broken. |
| 04:14 | devn | Raynes: heh |
| 04:15 | devn | Raynes: i copy and pasted too much from your code on refheap |
| 04:15 | Raynes | My code is broken or you don't understand my code and thus your code is broken and you can't figure out why? :p |
| 04:15 | devn | im trying to figure out why :user is always nil when I query for all the sexps saved with {:user "foo"} |
| 04:15 | devn | Raynes: likely the latter because i threw it together |
| 04:15 | devn | https://github.com/devn/getclojure/blob/master/src/getclojure/models/sexp.clj |
| 04:16 | devn | also, don't judge me for that "make-connection!" thing |
| 04:16 | devn | it's litter and it needs to be picked up |
| 04:16 | Raynes | I didn't plan on it. REPL development is a pain in the ass with monger/mongodb connections. |
| 04:17 | devn | that's why it's littered :) |
| 04:17 | devn | exactly |
| 04:17 | devn | i should probably just with-connection-ize it |
| 04:17 | devn | and use that pattern |
| 04:18 | Raynes | devn: You've looked into the DB and made sure these things are, in fact, not nil? |
| 04:18 | devn | Raynes: nono, they're quite nil |
| 04:18 | devn | but im not sure why |
| 04:18 | devn | because it's late and im getting lazy |
| 04:18 | devn | this is a cry for code review |
| 04:19 | Raynes | lol |
| 04:19 | Raynes | devn: Do you have all of your current code in this repo? |
| 04:19 | Raynes | If so, I'll take a look. |
| 04:19 | devn | Raynes: yeah this is it |
| 04:19 | Raynes | Okay. |
| 04:20 | Raynes | Give me 10 minutes and I'll have this fixed for you. |
| 04:20 | devn | haha, <3 |
| 04:20 | Raynes | Also know that I can't make the above promise. |
| 04:20 | Raynes | :p |
| 04:20 | devn | Raynes: are you going to clojure/west? |
| 04:20 | Raynes | Nope. |
| 04:20 | devn | shit |
| 04:20 | Raynes | We're all hoping to get to go to the conj though. |
| 04:20 | devn | i reallllly want to make it to west |
| 04:20 | devn | but im not sure if i can |
| 04:21 | devn | mainly i just want to see alandipert invert people's brains with what he's been working on |
| 04:33 | devn | Raynes: the seed task is hint |
| 04:33 | devn | err the seed.clj -main |
| 04:34 | Raynes | devn: Why did you set this crazy ass mongodb port? |
| 04:34 | devn | I don't think I set a port? |
| 04:35 | Raynes | hrm |
| 04:35 | Raynes | Attempting to connect to elastic search... |
| 04:35 | Raynes | The elastic search endpoint is http://127.0.0.1:9200 |
| 04:35 | devn | Where do you mean? |
| 04:35 | Raynes | Did elastic search set this port? |
| 04:35 | devn | that's elasticsearch |
| 04:35 | clojurebot | Titim gan éirí ort. |
| 04:35 | Raynes | It is trying to connect to mongodb on this port. |
| 04:35 | Raynes | It makes no sense. This isn't the default port. |
| 04:35 | devn | wha? really? |
| 04:35 | devn | what version of mongo and what version of ES? |
| 04:35 | devn | that's...just strange |
| 04:36 | devn | im not having that issue |
| 04:36 | Raynes | Elastic search is something else you have to run? |
| 04:36 | Raynes | I guess so. |
| 04:36 | devn | Raynes: yeah sorry for the super shitty docs |
| 04:36 | Raynes | Did not know this. |
| 04:36 | devn | man, now i feel bad |
| 04:36 | Raynes | Well, it isn't your fault I didn't know what elasticsearch is. |
| 04:37 | devn | yes, you need elastic-search running. i just `brew install elasticsearch` and then run it in the foreground like: elastic-up='elasticsearch -f -D es.config=/usr/local/Cellar/elasticsearch/0.20.4/config/elasticsearch.yml' |
| 04:38 | devn | im using a heroku addon for elastic |
| 04:38 | devn | (in prod) |
| 04:43 | devn | Raynes: are you still looking at it? im close to bed time |
| 04:44 | devn | actually i'm way past, but it would be cool to get this figured out before bed |
| 04:44 | Raynes | devn: Yep. I'll pull request you if I figure out the problem, or at least open an issue or something if I can't fix it tonight. |
| 04:46 | devn | Raynes: thanks for taking a look. if you go to getclojure.org right now you can see sort of the direction im going in, but the idea is: search is great, but the relevance of results is way wrong: a search for "juxt" will give you a result near the first page of results like: (juxt juxt juxt juxt juxt juxt juxt juxt juxt juxt) |
| 04:46 | devn | which is useless, so I'd like to bring the idea of ratings on sexps into the equation |
| 04:46 | Raynes | lol |
| 04:46 | devn | allow people to login, rate things, and then make that part of the "score" of an sexp in the db |
| 04:46 | Raynes | juxt juxt juxt juxt |
| 04:47 | devn | yeah, unfortunately i think a useful search engine for this kind of info requires some human intervention |
| 04:48 | devn | there are 32k sexps to rate -- i figure if i do something like clojuredocs and have a leaderboard or something, i might be able to get all of them rated |
| 04:48 | Raynes | I pictured you sitting handling requests and selecting only queries you personally think are relevant to serve. |
| 04:48 | Raynes | Slowest web service ever. |
| 04:48 | devn | hahaha yeah, well, i could write skynet, or i could rate 32k results by hand |
| 04:48 | devn | whether anyone likes it or not, i think the latter might be the best bet |
| 04:49 | Raynes | devn: Whooooa |
| 04:49 | Raynes | devn: Is it seeding 32k things? |
| 04:49 | Raynes | Because this is majorly slow. |
| 04:49 | devn | yes |
| 04:49 | clojurebot | 'Sea, mhuise. |
| 04:49 | devn | Raynes: welcome to shelling out to pygments :) |
| 04:49 | Raynes | In that case, I might have to look at this tomorrow because it'll be 7 years before this is finished. |
| 04:49 | Raynes | Is it necessary to seed the whole thing in order to do things? |
| 04:49 | devn | Raynes: just seed it with (take 10 ...) |
| 04:49 | devn | Raynes: nah, that seed task is just something i've been running after i deploy to heroku |
| 04:49 | Raynes | I just stopped the seed stuff. It should have the 108 I seeded. |
| 04:50 | devn | Raynes: you should be able to mc/find-as-maps "sexps" |
| 04:50 | devn | and see those 108 |
| 04:50 | Raynes | Got the site running. |
| 04:50 | devn | you'll notice that all of the :user keys on those maps have a value of nil |
| 04:50 | devn | and that's what im trying to figure out |
| 04:51 | Raynes | You've got the king of debugging stupid shit on your side. |
| 04:51 | devn | i just want to seed the initial set of queries as belonging to the user "admin" |
| 04:51 | Raynes | We'll have this figured out in no time. |
| 04:52 | devn | I think I might be messing up :_id and :id at some point, or I'm getting an empty map back or? Grr... Needs more eyes. Thanks for looking. |
| 05:00 | Raynes | devn: Well, your problem is that :id isn't a thing. |
| 05:01 | Raynes | devn: Are you still awake? |
| 05:20 | devn | Raynes: barely. i need to go to bed like now. it's really late here. can we chat tomorrow? |
| 05:21 | devn | hopefully the answer is yes because im literally falling asleep |
| 05:21 | Raynes | devn: I sent you a pull req. |
| 05:21 | devn | woohoo! ill look in the morning |
| 05:21 | devn | thanks for the help buddy |
| 05:21 | Raynes | np |
| 05:21 | devn | gnight |
| 05:21 | Raynes | night |
| 06:09 | tomoj | (assert (satisfies? clojure.core.protocols/CollReduce 42)) |
| 06:10 | tomoj | (inc default protocol impls) |
| 06:10 | lazybot | ⇒ 1 |
| 06:13 | tomoj | hmm |
| 06:13 | tomoj | is there any good way to try to get the next element of a lazy seq but with a timeout? |
| 06:14 | tomoj | basically IBlockingDeref for the hidden delay |
| 06:14 | Raynes | tomoj: Well, you could use a blocking queue. |
| 06:15 | tomoj | seque? |
| 06:15 | Raynes | tomoj: seque wont work because there is no timeout. |
| 06:16 | Raynes | You can pass it a blocking queue indeed, but you can't make it use a timeout arg when polling that queue. |
| 06:17 | Raynes | That said, it isn't too hard to write something like it yourself. |
| 06:18 | Raynes | Actually, what you said is kinda weird and may not be what I was solving here. |
| 06:18 | tomoj | https://www.refheap.com/paste/e10b0d030f1fa49bc87f32a4c |
| 06:18 | Raynes | tomoj: So your lazy seq is produced via something that causes side effects and may take a long time, or? |
| 06:18 | tomoj | well |
| 06:19 | tomoj | I realized I don't actually want IBlockingDeref, I just don't want to block at all, because it's cljs |
| 06:19 | tomoj | I was thinking I wanted to detect whether first would block, but you wouldn't write a blocking lazy seq in cljs anyway |
| 06:19 | Raynes | Yeah, I'm useless for cljs. |
| 06:20 | tomoj | still interesting to me that if lazy seq's delay were exposed as a deref, IBlockingDeref could be there |
| 06:43 | tomoj | so default impls with closed dispatch for one or a few core types in the language are OK, but protocol impl inheritance is evil? :( |
| 06:47 | tomoj | cljs could use it to define CollReduce for all ISeq, or there's Diff |
| 06:47 | tomoj | but because someone could use it to build crazy hierarchies of impl inheritance, it can't be allowed? |
| 06:49 | ragge | anyone up for some AOT related troubleshooting? |
| 06:50 | ambrosebs | tomoj: That doesn't sound like a fair comparison. Rich is using Java idioms to write Java, and there are no alternatives there. We can always write macros in Clojure. |
| 06:50 | ragge | it's an exciting issue, promise |
| 06:50 | OscarZ | many of you have probably read SICP (structure and interpretation of computer programs) .. would you recommend it or is there some better book on the same topic ? |
| 06:51 | tomoj | write macros? |
| 06:51 | tomoj | you mean like adapt-protocol? |
| 06:51 | tomoj | I'm not lamenting the dust in the core bootstrap |
| 06:52 | tomoj | I'm trying to decide if protocols have a problem |
| 06:54 | tomoj | https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/data.cljs#L105-108 |
| 06:54 | tomoj | I wrote that, so I think I'm being fair :) |
| 06:55 | tomoj | and no java in the way |
| 06:55 | borkdude | I see as-> expands to let* |
| 06:55 | borkdude | what's the difference between let and let* |
| 06:55 | borkdude | in clojure, not in elisp, etc |
| 06:55 | tomoj | the body of the let macro: `(let* ~(destructure bindings) ~@body) |
| 06:56 | tomoj | lmM-.tfy |
| 06:56 | borkdude | let* is a lower level let without checks? |
| 06:56 | tomoj | without destructuring |
| 06:57 | borkdude | ah |
| 06:57 | borkdude | I was typing something about the threading macro's. Like: you can do (let [x 10 x (inc x) x (inc x)] x) but this isn't idiomatic. Clojure has threading macro's for this, blablablablabla... |
| 06:58 | borkdude | and then I looked at the expansion of as-> :) |
| 07:02 | ambrosebs | tomoj: sorry I thought you meant core Clojure JVM |
| 07:10 | tomoj | well, that too |
| 07:10 | tomoj | but it's actually better there |
| 07:10 | tomoj | because you can extend to an interface |
| 07:11 | tomoj | I still can't extend to my protocol, but I don't have many types, so it's OK :) |
| 07:17 | Guest46648 | do you guys know of any good graph based Databstorage besides neo4j. I noticed that I can only use the free version of neo4j in non-commercial settings. Any ideas of what would work good with a clojure stack? |
| 07:21 | squidz | do you guys know of any good graph based Databstorage besides neo4j. I noticed that I can only use the free version of neo4j in non-commercial settings. Any ideas of what would work good with a clojure stack? |
| 07:22 | vijaykiran | squidz: did you try titan? |
| 07:22 | squidz | no Ive never heard of it |
| 07:22 | squidz | is it clojure specific= |
| 07:22 | squidz | ? |
| 07:22 | vijaykiran | no not really - it is a graphdb based on cassandra |
| 07:23 | squidz | okay now I see. Is it pretty standard among clojurists? |
| 07:23 | scottj | squidz: clojure wrapper for titan https://github.com/gameclosure/hermes |
| 07:23 | squidz | I see that the last source update was 9 months ago |
| 07:23 | vijaykiran | https://github.com/thinkaurelius/titan |
| 07:23 | vijaykiran | there are atleast two clojure-titan libraries |
| 07:23 | vijaykiran | hermes and another one from clojurewerkz |
| 07:23 | squidz | it looks really nice to use though |
| 07:24 | vijaykiran | I think titan has a friendlier license |
| 07:24 | vijaykiran | than neo4j |
| 07:24 | scottj | squidz: last source update 16 hours ago at repo vijaykiran posted |
| 07:24 | squidz | scottj: for titan-clj? |
| 07:24 | scottj | squidz: titan itself |
| 07:25 | squidz | oh okay, I meant the wrapper |
| 07:25 | squidz | so between the titan-clj and the clojurewerkz what is used more'ß |
| 07:27 | squidz | okay it seems like titanium is more active |
| 07:27 | scottj | squidz: no clue, in case you didn't notice there are 3 clojure titan wrappers though (hermes, which looks to have the most forks but readme says its young) |
| 07:28 | squidz | scottj: oh thanks I didnt notice. Ill take a look at how it is with all three. Thanks for the tips. Yall gave me exactly what I was looking for |
| 07:33 | WormJuice | squidz, I'm the best programmer in the world second only to the Microsoft Chief Software Architect |
| 07:33 | squidz | WormJuice: lol okay |
| 07:34 | WormJuice | squidz, serve me well, and I shall let you live. |
| 07:34 | WormJuice | Fail me, and you shall meet a swift death |
| 07:35 | squidz | okay this is out of nowhere. Are you going somewhere with this? |
| 07:37 | WormJuice | squidz, yes, with your cunning and my skills, the world shall be at our bidding. |
| 07:37 | WormJuice | Join me and we wil rule this wretched planet |
| 07:39 | squidz | ... |
| 07:42 | squidz | WormJuice: do I know you? |
| 07:43 | WormJuice | squidz, not yet, but my name shall soon be engraved into your memory as we take over the world. |
| 07:43 | WormJuice | Join me |
| 07:44 | squidz | Join you with what? |
| 07:44 | WormJuice | With our bid for world domination my friend. |
| 07:44 | WormJuice | squidz, https://lh6.googleusercontent.com/--KCN_CX7NCQ/UTxpxq7XMxI/AAAAAAAABUo/1-n4pmV_w3I/s0/Terrain%2520146.jpg |
| 07:45 | squidz | starcraft? |
| 07:47 | WormJuice | squidz, you play? |
| 07:48 | squidz | not really. Ive played a couple of times why? |
| 07:48 | WormJuice | Just wondering if you do, a lot of people here seem to. |
| 07:49 | squidz | I thought you were going to make a programming proposal |
| 07:49 | squidz | to join you in a clojure quest |
| 07:49 | squidz | only to be let down |
| 09:01 | ambrosebs | Is the Rhino REPL *the* way of working on CLJS, or are there more popular methods? |
| 09:01 | ambrosebs | My core.typed port will probably require using it, hopefully that's no hassle. I'm out of the loop here. |
| 09:04 | Bodil | ambrosebs: I'd recommend https://github.com/bodil/cljs-noderepl unless you really enjoy slow JS engines. :) |
| 09:06 | ambrosebs | Bodil: Right now I plug in to the Java implementation of core.typed via :require-macros. Is this still possible? |
| 09:07 | Bodil | ambrosebs: As long as the macros don't generate any JDK specific code, then yeah. |
| 09:08 | ambrosebs | Ok. I need to actually run Java code during macroexpansion :/ |
| 09:09 | ambrosebs | Is that possible? |
| 09:09 | edw | ambrosebs: Let's assume it's possible. Are you discerning things about the JVM? Because the macroexpanding VM might not be the evaluating VM. |
| 09:10 | edw | Think `lein uberjar`. Also `gen-class`. |
| 09:11 | ambrosebs | Currently I'm using Rhino, and it seems to just work. |
| 09:12 | edw | CLJS? |
| 09:12 | Bodil | ambrosebs: That still works. The only problem is if the code that comes out of the macro expansion doesn't run on Cljs. |
| 09:13 | ambrosebs | Bodil: ok. g2g tho, thanks! |
| 10:06 | dimovich | given the reorganized clojure contrib ecosystem, where can I find the re-gsub function? |
| 10:06 | borkdude | hmm, looks like the clojure entry here can use some work: http://hyperpolyglot.org/lisp |
| 10:37 | gfredericks | is there any reason to prefer (alter-var-root #'foo (constantly val)) over (def foo val)? |
| 10:37 | gfredericks | I guess it's an explicit update? :/ |
| 10:41 | gfredericks | dimovich: does clojure.string/replace not do what you want? |
| 11:03 | lispy_ | hey guys |
| 11:03 | lispy_ | whats the current best practice way to do a recursive directory delete ? |
| 11:06 | lispy_ | I'm seeing a 'delete-file' function but no mention of recursive delete in clojure.java.io ? |
| 11:07 | edw | lispy_, do you want to delete a directory or are you looking for some idiomatic sample code? If the former, why not just shell out to the OS and "rm -rf ..."? |
| 11:07 | lispy_ | edw: I just wanted to know how directory delete is done in clojure land |
| 11:08 | lispy_ | I just thought it was curious that there is a delete file but no delete directory |
| 11:10 | edw | lispy_: ah. |
| 11:10 | lispy_ | edw: just use (.delete (File. "some-directory")) ? |
| 11:11 | edw | No, that doesn't recursively delete either. You need to depth-first delete all files. |
| 11:11 | edw | Apache's commons-io FileUtils has something for you. |
| 11:11 | lispy_ | edw: nuts… thought this would be handled in a library somewhere :-) |
| 11:11 | lispy_ | ah cool |
| 11:11 | lispy_ | thanks! |
| 11:11 | edw | You're welcome. |
| 11:12 | edw | FileUtils.deleteDirectory(). |
| 11:12 | edw | Or give me ten minutes and I'll write the equiv in Clojure for you. Burnt out but in a programing mood. |
| 11:12 | lispy_ | no :-) sounds like you need to take a break |
| 11:13 | lispy_ | thanks for the pointer |
| 11:13 | lispy_ | surprised we don't have it yet |
| 11:14 | lispy_ | gonna scan for libraries like : https://github.com/jashmenn/clj-file-utils see if someone has clojurised this for me already |
| 11:22 | edw | lispy_: `delete-cursively`: https://gist.github.com/edw/5128978 |
| 11:22 | lispy_ | edw: haha, nice one |
| 11:22 | lispy_ | saves me pulling in a bunch of jars :-) |
| 11:22 | lispy_ | thanks |
| 11:24 | edw | No problem. Always enjoy writing some nice looking code. |
| 11:25 | lispy_ | wonder what has stopped a version of it going into clojure ecosystem core somewhere ? |
| 11:27 | edw | Parsimony? It's a simple function. And it's a chainsaw. |
| 11:28 | edw | BTW, lispy_, that call to `file` allows this to take a string pathname. |
| 11:28 | lispy_ | I guess… leave maintenance of it to others |
| 11:28 | lispy_ | edw: I spotted that thanks |
| 11:33 | edw | Take another look: this one is better. It doesn't call file more often than necessary. https://gist.github.com/edw/5128978 |
| 11:36 | edw | Just updated it again so that it, you know, works… https://gist.github.com/edw/5128978 |
| 11:37 | lispy_ | edw: cool, thanks will try it out now |
| 11:43 | ToxicFrog | This seems like a specific application of ftw |
| 11:45 | edw | ToxicFrog hmm? |
| 11:46 | ToxicFrog | edw: file tree walk. A POSIX C function that is basically (ftw path fn flags) and recursively calls fn on every file and directory under path. |
| 11:46 | ToxicFrog | I forget if java.io has an equivalent. |
| 11:47 | edw | Ah! I thought your were making some (ugh!) “FTW!” reference a la "FAIL.” |
| 11:47 | edw | Hmm, yeah, that makes me wonder if clojure.walk has something useful for this situation. |
| 11:49 | edw | Nope. Need a fund to create a lazy file tree and then clojure.walk becomes the way to go. |
| 11:50 | edw | Hmm… |
| 12:05 | edw | lispy_: There is is file-seq, which looks like what we need. |
| 12:06 | lispy_ | edw: cool, looking it up now |
| 12:08 | edw | You could probably (doseq [f (reverse (file-seq (java.io.File. file-name)))] (delete-file f)) |
| 12:09 | edw | You need to reverse it, lispy_, because it lists a dir before its contents. |
| 12:12 | lispy_ | edw: oh, I've used file-sew before, forgot about tit, cool |
| 12:13 | mye | What do the clojurescript and emacs users among you do to manage two repls (one for clojure, on for clojurescript)? |
| 12:14 | mye | I've piggieback setup and can start both repls, but now I need some automation that sends to the clojurescript repl from .cljs buffers and does the right thing for .clj files |
| 12:15 | mye | There's one way to do it manually shown here: https://groups.google.com/forum/#!topic/clojure-tools/C0jND-uuV28/discussion |
| 12:16 | mye | He later mentions "nrepl.el streams", is someone using that? |
| 13:04 | antoineB | hello |
| 14:02 | supersym | programming in LightTable is so much fun already,... nice that this time (Leiningen,LightTable) I get the joy of learning Clojure/Lisp properly :D |
| 14:03 | zmiller | is there some special way that protocols have to be :required from other namespaces? |
| 14:08 | squidz | is there a way to make lein refresh project dependencies within emacs nrepl? |
| 14:10 | zmiller | I created a protocol with 1 function that only takes 1 argument (this). If i create a function that uses that protocol from within the same namespace, there's no problem. but if i :require that protocol and then try to define the function that uses it in another namespace, i get a java.lang.verifyerror. however, it is perfectly fine if i just call the protocol from the other namespace... |
| 14:10 | zmiller | ...without putting in inside a defn |
| 14:11 | gfredericks | lastlog -clear |
| 14:12 | gfredericks | zmiller: could you post a bit of code? |
| 14:13 | zmiller | so the first namespace has |
| 14:13 | gfredericks | refheap.com |
| 14:15 | zmiller | https://www.refheap.com/paste/12373 |
| 14:16 | zmiller | the announce-winner! function throws the error when i try to define the form |
| 14:16 | zmiller | but if i replace the dod/winners with some random function such as first, it will compile that form |
| 14:16 | gfredericks | what is the (:import dice.dice_of_doom) about? |
| 14:17 | zmiller | those types are defined in the first namespace, there is another protocol that i am extending to those types in the 2nd namespace |
| 14:18 | zmiller | so i wanted to refer to them without typing out the entire class. i have also been putting type hints in (for myself) so i don't want to type out the whole name every time |
| 14:18 | gfredericks | hmm I can reproduce it; I have no guesses but I'll noodle it a bit |
| 14:19 | gfredericks | I've never seen a VerifyError before |
| 14:19 | zmiller | i googled, i only found 1 clojure page talking about it |
| 14:21 | Bronsa | mh |
| 14:22 | Bronsa | >java.lang.IllegalArgumentException: Unable to resolve classname: ISeq |
| 14:22 | zmiller | ah! |
| 14:22 | gfredericks | I have to think this has something to do with the typehint |
| 14:22 | gfredericks | which is the weirdest part |
| 14:22 | Bronsa | yeah |
| 14:22 | Bronsa | that's it |
| 14:22 | zmiller | if you import ISeq into the 2nd namespace, it's okay |
| 14:22 | gfredericks | I don't know why though |
| 14:23 | gfredericks | o_O? |
| 14:23 | clojurebot | LINE-ing-en ['laɪnɪŋən] |
| 14:23 | gfredericks | clojurebot: thanks |
| 14:23 | clojurebot | We live to serve. |
| 14:23 | Bronsa | gfredericks: it looks like it doesn't use the full qualified class name |
| 14:23 | gfredericks | it wants to resolve it in every namespace you use the protocol in? |
| 14:23 | Bronsa | apparently so |
| 14:23 | gfredericks | that weeerd |
| 14:24 | zmiller | oh, so the fact that ISeq is typehinted in namespace 1 means that if namespace 2 wants to use it, it has to import ISeq |
| 14:24 | jtoy | can I read in a string with a macro and evaluate it without using eval? |
| 14:24 | Bronsa | well I think this is a bug anyway |
| 14:24 | zmiller | yeah, it doesn't seem like it works the way that it should |
| 14:24 | zmiller | thank you you 2! i could never have figured this out on my own |
| 14:25 | Bronsa | I'll try and see if i can get a patch |
| 14:26 | zmiller | oh by the way, how did you get the error that mentioned ISeq? i'm using nrepl and emacs and it didn't give me that error |
| 14:27 | gfredericks | jtoy: that's a question that's hard to interpret; can you describe your motivating use case? |
| 14:28 | zmiller | oh i see, i have to open up the nrepl-events buffer |
| 14:29 | supersym | :) |
| 14:29 | jtoy | gfredericks: I'm trying to create a function that allows me to pass in a string and have them be evaluated in the context of the sytem, very simple expressions like (> age 25), someone recommended that I use a macro to do this. im still very new to the macros so im trying to figure out how to do this |
| 14:31 | supersym | huh... so like a string, as in date or like someones life story.. and is age not the only one criteria to search for |
| 14:31 | supersym | doesnt seem to me you would need a macro tho |
| 14:32 | Bronsa | zmiller: I'm still using SLIME |
| 14:32 | jtoy | supersym: this is exactly what im trying to do: https://groups.google.com/group/cascalog-user/browse_frm/thread/908ef0ef7449c35b |
| 14:33 | zmiller | what would be wrong with using eval? |
| 14:33 | jtoy | well, i tried eval, but I couldnt get it to work, i think its because "eval wouldn't work because the query itself is generated from macros" |
| 14:34 | gfredericks | jtoy: if you're processing strings you don't need a mocr |
| 14:34 | gfredericks | macro* |
| 14:34 | Bronsa | zmiller: it looks like it's really an edge case |
| 14:34 | gfredericks | eval should work fine |
| 14:34 | zmiller | (def hello 3) |
| 14:34 | zmiller | (defn age-comp [s] |
| 14:34 | zmiller | (> (eval (symbol s)) 5)) |
| 14:34 | zmiller | (age-comp "hello") |
| 14:35 | gfredericks | (defn process-in-context [code-string] (binding [*ns* (the-ns "my.system")] (-> code-string read-string eval))) |
| 14:36 | gfredericks | if you're only dealing with single symbols you can probably use resolve and deref instead of eval |
| 14:36 | jtoy | gfredericks: ok, ill test out your example, is this releveant though? " "eval wouldn't work because the query itself is generated |
| 14:36 | jtoy | from macros"" |
| 14:36 | gfredericks | I have no idea what that means |
| 14:36 | jtoy | neither do I |
| 14:36 | jtoy | haha |
| 14:37 | gfredericks | I'll look at the thread |
| 14:39 | gfredericks | oh maybe I know what he meant |
| 14:40 | gfredericks | you could put the query in a backtick |
| 14:40 | gfredericks | this is a bit sticky though. should definitely be workable but I don't have the time to braindump about it |
| 14:40 | gfredericks | you should definitely _not_ have to write your own macro, though it's possible doing so might make things slightly simpler |
| 14:40 | gfredericks | but eval should be sufficient |
| 14:41 | jtoy | gfredericks: ok, ill test some more,thx |
| 14:43 | gfredericks | hyPiRion: dangit I kept looking around github and twitter for "hyperion" and couldn't find you :P |
| 14:56 | supersym | could I use something like org-mode emacs with LightTable, that anyone knows of? |
| 14:56 | supersym | meta-programming that is |
| 14:57 | supersym | i know you could build it from scratch, but i wondered if it was able to tap into the elisp Babel program |
| 15:06 | Bronsa | gfredericks: zmiller I have a patch |
| 15:06 | Bronsa | http://sprunge.us/WENi?diff I'm opening a bug on jira now |
| 15:14 | ghadishayban | 1.5.1 just got released |
| 15:14 | ghadishayban | fyi |
| 15:21 | zmiller | wow Bronsa, you are fast |
| 15:37 | ghadishayban | bronsa: there are some failing tests in your patch |
| 15:37 | hyPiRion | gfredericks: That's what you get for not spelling my nick properly |
| 15:37 | ghadishayban | in clojure.test-clojure.protocols |
| 15:38 | Bronsa | ghadishayban: I tried building it and they were passing, let me check |
| 15:40 | ghadishayban | bronsa: np. I had some phantom issues getting repeatable tests today on another patch. |
| 15:42 | ghadishayban | you might have to correct equality in on the "protocol fns have useful metadata" deftest |
| 15:42 | Bronsa | ghadishayban: tests are passing here, can you nopaste me the error you're getting? |
| 15:43 | ghadishayban | sure, one sec |
| 15:43 | zmiller | so you're the hyPiRion who i shall never catch in projecteuler! |
| 15:46 | hyPiRion | zmiller: Yeah. Not worked on it for a long time though. Perhaps I should. |
| 15:46 | ghadishayban | bronsa: http://nopaste.info/476f5346f5.html |
| 15:49 | ghadishayban | bronsa: the tags in the metadata don't match anymore |
| 15:50 | Bronsa | yeah |
| 15:50 | Bronsa | they are resolved now |
| 15:51 | Bronsa | ghadishayban: I'll fix this, resolve is not the correct function |
| 15:51 | edw | Is there a reason I need to ('require clojure.repl) to get C-c C-d to work in nrepl-emacs? |
| 15:51 | arohner | does (alter-var-root #'my-fn) work as expected with clj 1.3+ compiling of defn sites? |
| 15:51 | Bronsa | edw: C-c C-d is probably using clojure.repl/doc |
| 15:52 | edw | Bronsa: yes, I am aware. But why doesn't nrepl.el require it? |
| 15:52 | ghadishayban | edw: it should -- I *just* switched to emacs and it's there by default |
| 15:53 | edw | Huh. It disappeared with 1.5. |
| 15:53 | ghadishayban | edw: do you have melpa and marmalade enabled? |
| 15:53 | edw | When I switched to 1.5.0, that i. |
| 15:53 | devn | ,(require '[clojure.pprint :as pp]) |
| 15:53 | clojurebot | nil |
| 15:53 | ghadishayban | Clojure 1.5.1 is out -- FYI. nasty little memleak |
| 15:54 | edw | Saw that seconds ago. Already updated me 1.5 apps. Thanks. |
| 15:54 | edw | Comparing MELPA to Marmalade nrepl versions. I have (only) Marmalade. |
| 15:55 | devn | ,(pp/pprint (read-string "(^:once fn* [x] x)")) |
| 15:55 | clojurebot | (fn* [x] x)\n |
| 15:56 | devn | ,*clojure-version* |
| 15:56 | clojurebot | {:major 1, :minor 5, :incremental 0, :qualifier "RC6"} |
| 15:56 | devn | weird |
| 15:56 | ghadishayban | enable melpa and you should be good. |
| 15:56 | devn | im on clojure {:major 1, :minor 5, :incremental 0, :qualifier nil} |
| 15:56 | ghadishayban | i think -- technomancy helped |
| 15:56 | devn | this is what i see when i try the above |
| 15:57 | devn | ,(pp/with-pprint-dispatch pp/code-dispatch (pp/pprint (read-string "(^:once fn* [x] x)"))) |
| 15:57 | clojurebot | #(#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 15:57 | devn | ,(pp/with-pprint-dispatch pp/code-dispatch (pp/pprint (read-string "(fn [x] x)"))) |
| 15:57 | clojurebot | (fn [x] x)\n |
| 15:57 | devn | anyone know what's up with that? |
| 15:58 | devn | ,(pp/with-pprint-dispatch pp/code-dispatch (pp/pprint (read-string "(fn* [x] x)"))) |
| 15:58 | clojurebot | #(#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 15:59 | devn | it doesn't like that * |
| 16:02 | edw | The MELPA docs say put the add-to-list *before* package-initialize but I get warning when doing that and have always put it *after*. Thoughts? |
| 16:04 | edw | Ah, upgrading to the current MELPA version of nrepl solved my problems. Thank you. |
| 16:05 | ghadishayban | edw: no problem. |
| 16:06 | edw | ghadishayban: yeah, the (require 'package) did it for me. Thanks again. |
| 16:18 | Bronsa | ew |
| 16:18 | Bronsa | definterface is broken too |
| 16:20 | ghadishayban | it's hard to remember *where* exactly type hints go |
| 16:21 | ghadishayban | the code in CLJ-1180 doesn't ring familiar to me -- I thought the hint goes outside the fn |
| 16:22 | ghadishayban | but I'm speculating -- should look it up |
| 16:23 | ghadishayban | bronsa: see CLJ-1136 for a laugh |
| 16:23 | Bronsa | heh |
| 16:24 | Bronsa | yeah, the compiler is definitely not consistent on metadata evaluation |
| 16:25 | ghadishayban | official doc is that return hints go on the arg vector |
| 16:25 | ghadishayban | (f ^ISeq [a b c]) |
| 16:26 | Bronsa | ghadishayban: that might have changed a while agoo i think |
| 16:26 | ghadishayban | errr (defn f (^String [a b c])) |
| 16:26 | Bronsa | becasuse of problems with varargs functions |
| 16:26 | ghadishayban | oh |
| 16:26 | Bronsa | mmmh |
| 16:26 | ghadishayban | pulled it off clojure.org |
| 16:26 | clojurebot | clojure is like life: you make trade-offs |
| 16:26 | ghadishayban | no guarantee there =) |
| 16:27 | Bronsa | ghadishayban: well, on clojure test (defprotocol ExcampleProtocol .. (^String baz [a] [a b] ..)) |
| 16:27 | Bronsa | so.. |
| 16:28 | ghadishayban | you're totally right |
| 16:30 | Bronsa | ok, tests are passing now |
| 16:31 | ghadishayban | nice. fixing the worlds problems |
| 16:31 | ghadishayban | what did you end up doing? |
| 16:31 | Bronsa | one sec |
| 16:33 | Bronsa | ghadishayban: http://sprunge.us/CAjJ?diff |
| 16:33 | Bronsa | either I had to make tagToClass public, or I'd have had to rewrite maybeClass in clojure |
| 16:34 | Bronsa | resolve is a no-go becasuse (resolve 'booleans) => #'clojure.core/booleans |
| 16:34 | Bronsa | because* |
| 16:35 | ghadishayban | what about tagClass? |
| 16:37 | Bronsa | oh, that's probably better, you're right |
| 16:37 | ghadishayban | dunno |
| 16:37 | ghadishayban | i'm not really peeking too deeply |
| 16:37 | Bronsa | no wait |
| 16:37 | Bronsa | it seems like they do the same thing actually |
| 16:38 | Bronsa | tagClass is just nil-safe |
| 16:38 | Bronsa | but my call to tagToClass is wrapped in a when so it's safe |
| 16:42 | ghadishayban | looks good |
| 16:42 | Bronsa | well, fixing clj-1136 would probabily fix all those issues too |
| 16:42 | ghadishayban | did you try it with ^int ^ints or other prims? |
| 16:44 | devn | Hey amalloy -- how good are you with cl-format? :) |
| 16:44 | Bronsa | user=> (defprotocol p (^int x [_])) |
| 16:44 | Bronsa | p |
| 16:44 | Bronsa | user=> (:tag (meta #'x)) |
| 16:44 | Bronsa | int |
| 16:44 | Bronsa | user=> (class *1) |
| 16:44 | amalloy | on a scale of 1 to ten, i'm a -1 |
| 16:44 | Bronsa | java.lang.Class |
| 16:44 | devn | aww bummer |
| 16:44 | Bronsa | ghadishayban: ^ |
| 16:45 | devn | im stuck on a problem |
| 16:45 | devn | ,(pp/with-pprint-dispatch pp/code-dispatch (pp/pprint (read-string "(^:once fn* [x] x)"))) |
| 16:45 | clojurebot | #<CompilerException java.lang.RuntimeException: No such namespace: pp, compiling:(NO_SOURCE_PATH:0:0)> |
| 16:45 | devn | ,(require '[clojure.pprint :as pp]) |
| 16:45 | clojurebot | nil |
| 16:45 | devn | ,(pp/with-pprint-dispatch pp/code-dispatch (pp/pprint (read-string "(^:once fn* [x] x)"))) |
| 16:45 | squidz | how can i reconfigure lein after changing the project name/ns |
| 16:45 | clojurebot | #(#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 16:46 | squidz | after changing the project name(that is namespace and folder name), I can no longer run my namespace call |
| 16:46 | squidz | is there a way to reset the project with lein? |
| 16:46 | squidz | I also changed my project.clj |
| 16:46 | devn | amalloy: pretty sure it's blowing up in https://github.com/clojure/clojure/blob/master/src/clj/clojure/pprint/dispatch.clj#L367 |
| 16:47 | devn | but uh, you already told me you're -1 so im going to shut up now |
| 16:47 | devn | "~<#(~;~@{~w~^ ~_~}~;)~:>" <---sigh |
| 16:47 | hyPiRion | ~_ ? I've not seen that before. |
| 16:47 | clojurebot | Pardon? |
| 16:48 | devn | dude, dont ask me |
| 16:48 | hyPiRion | To the hyperref |
| 16:48 | hyPiRion | *spec |
| 16:48 | devn | hyPiRion: sounds like you know you're way around the formatter, any ideas on the above illegalargumentexception? |
| 16:49 | hyPiRion | Let me have a look |
| 16:50 | devn | hyPiRion: thanks in advance |
| 16:50 | devn | im stumped |
| 16:51 | Petein | Hello babes! is there any framework which you can develop android applications using clojure? |
| 16:52 | Petein | is there any reason to do that rather than using the native android sdk? |
| 16:56 | hyPiRion | devn: The gist of it is that it takes a single value, which must be a sequence and pretty prints it (newlines after every element, indented 2 spaces if the whole thing is longer than 72 characters). |
| 16:57 | devn | hyPiRion: that string above? |
| 16:57 | hyPiRion | ,(pp/cl-format true "~<#(~;~@{~w~^ ~_~}~;)~:>" (range 12)) |
| 16:57 | clojurebot | #<CompilerException java.lang.RuntimeException: No such namespace: pp, compiling:(NO_SOURCE_PATH:0:0)> |
| 16:57 | devn | ,(require '[clojure.pprint :as pp]) |
| 16:57 | clojurebot | nil |
| 16:57 | hyPiRion | ,(pp/cl-format true "~<#(~;~@{~w~^ ~_~}~;)~:>" (range 12)) |
| 16:57 | clojurebot | #(0 1 2 3 4 ...) |
| 16:57 | hyPiRion | ,(pp/cl-format true "~<#(~;~@{~w~^ ~_~}~;)~:>" (range 30)) |
| 16:57 | clojurebot | #(0 1 2 3 4 ...) |
| 16:57 | hyPiRion | meh. |
| 16:57 | hyPiRion | ,(pp/cl-format nil "~<#(~;~@{~w~^ ~_~}~;)~:>" (range 30)) ;; <<- |
| 16:57 | clojurebot | "#(0 1 2 3 4 ...)" |
| 16:58 | devn | so it takes a seq, eh? |
| 16:58 | Petein | Hello babes! is there any framework which you can develop android applications using clojure and it has any benefit rather than using the native android sdk? |
| 16:58 | hyPiRion | Okay, eh, the point is either way that it requres the first element to be a sequence |
| 16:58 | hyPiRion | right. |
| 16:58 | devn | well that's no good |
| 16:58 | devn | because |
| 16:59 | devn | ,(first (rest (rest '(fn* [x] x)))) |
| 16:59 | clojurebot | x |
| 16:59 | devn | ,(pp/cl-format nil "~<#(~;~@{~w~^ ~_~}~;)~:>" 'x) |
| 16:59 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 17:00 | devn | hyPiRion: how could i get it to play nice when it's not given a seq? |
| 17:00 | devn | hyPiRion: is there an easy way to do that? |
| 17:01 | hyPiRion | I'm not familiar with the rest of pp |
| 17:01 | jjido | seq? |
| 17:01 | clojurebot | seq is short for ,(doc ...) |
| 17:01 | hyPiRion | but I'll take a quick peek |
| 17:01 | devn | hyPiRion: it's cool, just didn't know if you knew of a simple way to make it at least not blow up |
| 17:03 | hyPiRion | hm |
| 17:03 | jjido | ,(seq? '(1 2 3)) |
| 17:03 | clojurebot | true |
| 17:03 | hyPiRion | ,(pp/with-pprint-dispatch pp/code-dispatch (read-string "(^:once fn* [x] x)")) |
| 17:03 | clojurebot | (fn* [x] x) |
| 17:03 | hyPiRion | pp/pprint prints, and returns nil. |
| 17:03 | devn | wait...no...you have to be kidding me... |
| 17:03 | jjido | ,(seq? [1 2 3]) |
| 17:03 | clojurebot | false |
| 17:03 | devn | i mean that makes 100% sense |
| 17:04 | devn | but uh oh hyPiRion -- i think this is the difference though |
| 17:05 | devn | ,(with-out-str (pp/with-pprint-dispatch pp/code-dispatch (pp/pprint (read-string "(fn* [x] x)")))) |
| 17:05 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 17:05 | devn | i want to capture it with-out-str |
| 17:05 | hyPiRion | ,(pp/with-pprint-dispatch pp/code-dispatch (with-out-str (pp/pprint (read-string "(^:once fn* [x] x)")))) |
| 17:05 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 17:06 | hyPiRion | ,(with-out-str (pp/pprint (read-string "(^:once fn* [x] x)"))) |
| 17:06 | clojurebot | "(fn* [x] x)\n" |
| 17:06 | devn | now with code dispatch... *KABOOOOM* |
| 17:07 | hyPiRion | ,(pp/with-pprint-dispatch pp/code-dispatch "what is this") |
| 17:07 | clojurebot | "what is this" |
| 17:07 | hyPiRion | ,(pp/with-pprint-dispatch pp/code-dispatch "(fn* [x] x)\n") |
| 17:07 | clojurebot | #<CompilerException java.lang.RuntimeException: No such namespace: pp, compiling:(NO_SOURCE_PATH:0:0)> |
| 17:07 | devn | grrr |
| 17:07 | hyPiRion | stupid timeout |
| 17:07 | devn | ,(require '[clojure.pprint :as pp]) |
| 17:07 | clojurebot | nil |
| 17:07 | hyPiRion | ,(pp/with-pprint-dispatch pp/code-dispatch "(fn* [x] x)\n") |
| 17:07 | clojurebot | "(fn* [x] x)\n" |
| 17:08 | hyPiRion | Well, it's certain that with-pprint-dispatch is a macro, so it does some magic there I guess. |
| 17:08 | devn | yeah :( |
| 17:08 | Petein | anyone developing android apps in clojure? |
| 17:09 | technomancy | Petein: android apps on clojure are currently too slow to be practical |
| 17:09 | jjido | ,with-pprint-dispatch |
| 17:09 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: with-pprint-dispatch in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 17:09 | technomancy | unless you're very patient and all your users are too |
| 17:09 | hyPiRion | Petein: http://dev.clojure.org/display/design/Android+Support |
| 17:09 | devn | if you're making a game that's all about patience |
| 17:09 | devn | it might be cool |
| 17:10 | Petein | technomancy: thanks for the feedback |
| 17:10 | hyPiRion | It's not a focus yet, but Rich talked about making slimmer Clojure versions for e.g. that purpose. |
| 17:10 | hyPiRion | And more debug-friendly ones. |
| 17:10 | devn | hyPiRion: i assume you're done looking at this with me? :) |
| 17:10 | hyPiRion | Though I'm pretty sure that's far away, I'm afraid. |
| 17:11 | hyPiRion | devn: Well, I should probably figure out what with-pprint-dispatch and code-dispatch does :p |
| 17:11 | devn | let's get weird with it hyPiRion |
| 17:12 | devn | code-dispatch is a multi-method |
| 17:12 | devn | hyPiRion: https://github.com/clojure/clojure/blob/master/src/clj/clojure/pprint/dispatch.clj#L448 |
| 17:13 | devn | hyPiRion: https://github.com/clojure/clojure/blob/master/src/clj/clojure/pprint/pprint_base.clj#L274 |
| 17:13 | devn | there's with-pprint-dispatch |
| 17:14 | hyPiRion | Oh, I see what's bugging you. |
| 17:14 | devn | !!! |
| 17:14 | sgarrett|afk | Anyone with experience using ElasticSearch? |
| 17:14 | devn | sgarrett: yeah |
| 17:15 | devn | sgarrett: what's up? |
| 17:15 | sgarrett | devn: I've got a small portion of it working for my application but I'm wondering if maybe my design is off. I was thinking that I could do writes to ES and then read immediately from the index, but I see that there's a refresh interval. |
| 17:16 | devn | sgarrett: describe the use case |
| 17:16 | sgarrett | devn: I know that I could refresh the index on each write but that seems like a bad idea. |
| 17:16 | devn | like... a user saves a record and it gets indexed, and they dont see it fast enough? |
| 17:16 | devn | why do you need to see it immediately? |
| 17:16 | sgarrett | devn: I basically have a collaborative blog. So anyone could be creating a post at any time. |
| 17:17 | devn | sgarrett: are you using elastisch? |
| 17:17 | sgarrett | devn: Yes. |
| 17:17 | devn | IIRC there's a way to force it to update |
| 17:17 | devn | solr has that too I believe |
| 17:17 | sgarrett | devn: So when the user would go back to their "my posts" section they would need to see the "new" post they just created there. |
| 17:17 | devn | sgarrett: do you have a LOT of users? |
| 17:17 | devn | how big is this? |
| 17:18 | sgarrett | devn: That's the plan. |
| 17:18 | devn | ah, yes, but a plan is not reality :) |
| 17:18 | devn | only suggesting that maybe this isn't an issue at all |
| 17:18 | sgarrett | devn: True. I don't want to over engineer, but I also don't want to get into a situation where migrating or something is terrible. |
| 17:18 | hyPiRion | devn: the gist of it is this |
| 17:18 | hyPiRion | ,(class (read-string "(^:once fn* [x] x)")) |
| 17:18 | clojurebot | clojure.lang.PersistentList |
| 17:19 | devn | sgarrett: my sense is that if at some point your writes get out of control, you could scale ES to handle it |
| 17:19 | hyPiRion | code-dispatch has no dispatcher for PersistentList, so it'll use pprint-simple-default (as far as I can see) |
| 17:19 | devn | hyPiRion: hmmm |
| 17:19 | sgarrett | devn: Okay. Do you know if refreshing the index per write would have bad repercussions? |
| 17:20 | devn | sgarrett: ive worked on a solr DB that had 250 million records |
| 17:20 | devn | there were optimizations and lots of subtle tuning |
| 17:21 | devn | but for indexes that are smallish, like 10-50k records, won't bite you unless you're updating a spellchecking index |
| 17:21 | devn | (on commit) |
| 17:21 | devn | and that's solr parlance: you would do something like (doseq [doc tons-of-docs] (add-to-index doc)) |
| 17:21 | devn | and THEN (commit!) |
| 17:22 | sgarrett | I see. Yeah these would all be individual commits. |
| 17:22 | devn | ive done aggressive commits before, and as long as it doesn't trigger "optimize" (more solr parlance) |
| 17:22 | devn | it seemed to be no trouble at all for <100k records |
| 17:22 | hyPiRion | devn: okay, I've found it. https://github.com/clojure/clojure/blob/master/src/clj/clojure/pprint/dispatch.clj#L367-379 |
| 17:23 | sgarrett | devn: Okay. That sounds good. |
| 17:23 | devn | that else condition is where it happens hyPiRion ? |
| 17:23 | devn | sgarrett: dont treat what im saying as gospel |
| 17:23 | sgarrett | devn: No worries there. ;) |
| 17:23 | devn | sgarrett: but my suggestion is to push it and try to benchmark it with a ton of records |
| 17:23 | devn | i have a feeling you'll be surprised at the speed |
| 17:23 | sgarrett | devn: Agreed. Definitely will be doing some load testing. |
| 17:23 | hyPiRion | devn: (first (rest (rest alis))) is the issue. it's expecting it to be a list, but it's not. |
| 17:24 | devn | hyPiRion: yeah, that's what i was saying earlier |
| 17:24 | sgarrett | devn: Okay. I'm used to working with MarkLogic server and that automatically reindexes on create, so didn't know what the implications would be here. |
| 17:24 | hyPiRion | oh, sorry |
| 17:24 | sgarrett | devn: Thanks for the help! |
| 17:24 | devn | hyPiRion: nono it's okay, im happy to hear im not totally off the mark |
| 17:24 | devn | hyPiRion: im wondering wth I can do to fix this |
| 17:25 | hyPiRion | I didn't read what you wrote earlier, remind me on doing that. |
| 17:25 | devn | hyPiRion: no worries, this formatter logic expects a list right? |
| 17:25 | hyPiRion | devn: It's a bug with the pprinter, so I suggest you ask them to fix it. |
| 17:25 | hyPiRion | yeah, it's buggy, simply put. |
| 17:25 | devn | hyPiRion: so you think it's a legit bug? |
| 17:25 | edw | What does the :once metadata do? |
| 17:26 | hyPiRion | devn: yes |
| 17:26 | amalloy | edw: promises the compiler you'll only call the function once, so it does locals-clearing on its closed-over variables asap |
| 17:26 | hyPiRion | ,(let [id (fn* [x] x)] (id 40)) |
| 17:26 | clojurebot | 40 |
| 17:26 | devn | edw: like (defonce ...) |
| 17:27 | amalloy | devn: wat. :once has nothing to do with defonce |
| 17:27 | edw | Ah. I was searching the docs. Is that documented anywhere? |
| 17:27 | devn | amalloy: oh, really? |
| 17:27 | devn | i just assumed they were related |
| 17:27 | hyPiRion | devn: But regardless, it seems clever to file a report on that bug. |
| 17:27 | devn | hyPiRion: much appreciated |
| 17:27 | devn | hyPiRion: now, given the lifecycle of bugs in the clojure world |
| 17:28 | devn | im still looking for a way to hack around this, because this is a blocker for me :( |
| 17:28 | amalloy | probably not, edw |
| 17:28 | sgarrett | devn: One last question. If I had the index sharded, does a refresh of the index happen only on that shard or is it the whole index? More just curious on that one. |
| 17:28 | edw | amalloy: OK, so I'll feel less ignorant for not having known that. |
| 17:29 | devn | sgarrett: depends on how you set things up |
| 17:29 | hyPiRion | devn: When would the deadline for a fix be? I can probably make a patch during next week. You could depend on a self-built Clojure version and add in that patch. |
| 17:29 | edw | BTW, I'm soon going to be looking for a programmer for a Clojure-heaviy position in NYC. |
| 17:30 | hyPiRion | Not pretty, but it'll solve the problem temporarily. |
| 17:30 | edw | s/heaviy/heavy |
| 17:30 | sgarrett | edw: I don't know you, but I might be interested. :) |
| 17:30 | devn | hyPiRion: im open to submitting a patch as well. i mean, for what im doing it might be reasonable to say "screw fn* pprinting" for now |
| 17:30 | edw | sgarrett: The feeling is mutual. ;) |
| 17:31 | devn | and just remove the anon-func from the list of things that are pretty printable by code-dispatch |
| 17:31 | devn | or something like that |
| 17:31 | hyPiRion | devn: ah, right. Well, feel free to do whatever pleases you. |
| 17:31 | devn | hyPiRion: either way i should log an issue for this |
| 17:31 | edw | sgarrett: I'm edw on Github; drop me a line. |
| 17:31 | sgarrett | edw: I have some interviews in the next week, but I'm looking. |
| 17:31 | hyPiRion | yeah |
| 17:31 | devn | i sent something to the list earlier, so i have a feeling an issue will get created either way |
| 17:32 | edw | sgarrett: You in NYC? |
| 17:32 | edw | Or thereabouts? |
| 17:32 | sgarrett | edw: I lived in NYC last year and loved it. I basically just moved away so I could save some money. :P |
| 17:33 | edw | sgarrett: I know how you feel. I've been cash-flow negative for the last year plus, living in Manhattan. Ah, start-ups… |
| 17:33 | sgarrett | edw: Just "followed" you on github. |
| 17:33 | sgarrett | edw: I'm looking for a startup position specifically if that helps. |
| 17:34 | edw | We should take this private but, we're a mobile adtech startup getting deeply into processing and acting on huge amounts of data. |
| 17:39 | Raynes | sgarrett: People love NYC? |
| 17:40 | ravster | I'm getting --> Assert failed: (vector? (:dependencies project [])) <-- when am doing lein ring server. But my :dependencies in the project file seem to be alright. |
| 17:40 | gillies | just heard about Zing JVM. Does it work with clojure? |
| 17:40 | sgarrett | Raynes: ha! I did. |
| 17:41 | Raynes | When I think of NYC all I an see and hear are sirens, police, drug addicts, the constant roar of cars and their horns, smoke in the distance from a fire and the thick smell of exhaust fumes. |
| 17:41 | Raynes | But I've never actually been there. ;) |
| 17:41 | sgarrett | Raynes: I think it's tough to beat culturally. |
| 17:42 | technomancy | Raynes: also http://sadguysontradingfloors.tumblr.com/ |
| 17:42 | metellus | most of those things would also apply to LA... |
| 17:42 | edw | Raynes, NYC is a million different places. Depends on where you are. Went to the Upper West Side, felt like a different planet. I'm a downtown (Village, Alphabet City, SoHo, Little Italy) kind of person. |
| 17:42 | danneu | How come (map list {:1 1 :2 2} {:3 3 :4 4}) ;=> (([:1 1] [:4 4]) ([:2 2] [:3 3])) ? https://gist.github.com/danneu/a39f5354938b7b9a754e |
| 17:42 | technomancy | metellus: yeah, but Hollywood has incentive to glamourize LA |
| 17:42 | Raynes | metellus: Parts of LA, of course. Didn't say I enjoyed all of LA either though. |
| 17:43 | Raynes | technomancy: They're doing a terrible job of it. |
| 17:43 | sgarrett | I wasn't a big fan of LA when I visited last August. |
| 17:43 | metellus | danneu: because an "element" of a map is a [key value] pair |
| 17:43 | edw | My gf has been stuck in Long Beach, CA, just southwest of LA, and the whole place is insipid. |
| 17:43 | metellus | and the order is not guaranteed |
| 17:44 | devn | ill take weather over NYC credentials |
| 17:44 | technomancy | Raynes: it looks pretty great in Iron Man, but then you realize it's because he can just fly places instead of driving. |
| 17:44 | edw | I liked the paved paths along the beach for skateboarding, though. |
| 17:44 | sgarrett | "insipid" is the definition of my trip to LA. |
| 17:44 | Raynes | Santa Monica is pretty great. |
| 17:44 | devn | I wouldn't live in LA, but I would live in most of the rest of CA. |
| 17:44 | Raynes | As is Malibu. |
| 17:44 | edw | Skateboarding to work through slush gets old quick. |
| 17:44 | Raynes | LA isn't that bad, guys. LA is a lot of places. |
| 17:45 | Bronsa | to what is C-h k bound in emacs? |
| 17:45 | devn | edw: lol, I'm in WI so moving to NYC for me is not at all something I'm interested in. |
| 17:45 | Raynes | NYC isn't all fun and games either, you know. You live in Manhattan. |
| 17:45 | Bronsa | I rebinded C-h but now I don't remember what C-h k is :( |
| 17:45 | devn | I have seen snow before. I do not like it. |
| 17:45 | Bronsa | rebound* |
| 17:45 | danneu | metellus: Did you see the Gist? That doesn't seem to explain the inconsistency |
| 17:46 | metellus | it does, because you should have no expectations whatsoever about the ordering of elements in a map |
| 17:46 | edw | Raynes: I hear you. Everything's a tradeoff. I'm an East Coaster. If you forced me to move to the West Coast, I'd probably be pretty happy in SF, but like Philly, the place goes to sleep pretty early. (And I say that as a forty year old.) |
| 17:46 | devn | metellus: actually that looks weird |
| 17:46 | devn | he has two seperate maps |
| 17:46 | devn | separate* |
| 17:46 | danneu | metellus: How come the results are consistent then? |
| 17:47 | devn | metellus: that looks real weird, you don't agree |
| 17:47 | devn | ? |
| 17:47 | edw | C-h k is describe-key, Bronsa. |
| 17:47 | Bronsa | thanks |
| 17:47 | edw | Or describe-key-1, actually. |
| 17:47 | Raynes | I haven't seen edw, but descriptions residents give me of it make me wonder why everybody enjoys it so much. |
| 17:47 | Raynes | Oops. |
| 17:48 | metellus | devn: what's so weird about it? |
| 17:48 | Raynes | I haven't seen SF. |
| 17:48 | danneu | metellus: I encountered this when reading about `doseq` http://clojuredocs.org/clojure_core/clojure.core/doseq#example_183 |
| 17:48 | jjido | ,'({:1 1 :2 2} {:3 3 :4 4}) |
| 17:48 | clojurebot | ({:1 1, :2 2} {:3 3, :4 4}) |
| 17:48 | Raynes | Not edw. Wow. That was the best typo ever. |
| 17:48 | edw | Raynes: Where? SF or NYC? |
| 17:48 | Raynes | SF. |
| 17:48 | edw | Funny, yes! |
| 17:48 | devn | metellus: oh, nevermind |
| 17:49 | devn | ,(map list [{:a 1 :b 2} {:c 3 :d 4}]) |
| 17:49 | clojurebot | (({:a 1, :b 2}) ({:c 3, :d 4})) |
| 17:49 | jjido | aah |
| 17:49 | devn | if ^that produces (([:a 1] [:c 3]) ([:b 2] [:d 4])) that would be weird |
| 17:49 | metellus | yes, that would be very bad |
| 17:49 | edw | I didn't like living in the SF Bay area because it's a monoculture in so many ways. Everyone's either an MBA or a programmer. Everyone's a lefty, Whole Foods shopper. (And I'm basically one of those too, but still…) |
| 17:49 | ravster | I'm getting an assertionerror when trying to run "lein ring server". I don't understand why its not seeing the :dependencies are a vector in my project file. https://gist.github.com/ravster/5130631 |
| 17:50 | devn | edw: the NYC wall street dudes are people i would like to never hang out with again |
| 17:50 | devn | id rather live in a petri dish of progressives than in a cesspool of cocaine sniffing assholes |
| 17:50 | edw | devn: I have like zero contact with those people; they're easy to avoid. |
| 17:51 | danneu | ,(map list {:1 1 :2 2} {:3 3 :4 4}) |
| 17:51 | clojurebot | (([:1 1] [:4 4]) ([:2 2] [:3 3])) |
| 17:52 | jjido | danneu: what's the last arg? |
| 17:52 | devn | edw: yeah, but now and then one of them sneaks in |
| 17:52 | devn | edw: :) |
| 17:52 | edw | I skateboard or walk or bike or (occasionally) take the train everywhere and belong to four museums and have to shoulder my away through masses of models and artists to get my soup at lunchtime, and then I go home and practice skateboarding at Tompkins Sq Park, less than a block from me. |
| 17:52 | Raynes | devn: Well, CA is exactly that only with crack smoking assholes. |
| 17:52 | Raynes | SF, I mean. |
| 17:52 | edw | I live in paradise, I feel. |
| 17:52 | devn | haha |
| 17:52 | Raynes | Jesus, I can't get my abbreviations straight today. |
| 17:53 | Raynes | devn: So did my pull request fix your problem? |
| 17:53 | devn | Here is where I want to live: http://www.youtube.com/watch?v=iYJKd0rkKss |
| 17:53 | edw | Raynes: Yeah, SF has the most pretty aggressive panhandlers. |
| 17:53 | devn | Raynes: indeed it did, I just needed to drop (str ...) from around (str (:_id (get-user username))) |
| 17:54 | Raynes | devn: Yeah, I saw that and has a feeling it was nutty but I wasn't sure enough to remove it myself and you were already gone. |
| 17:55 | danneu | jimt_: what do you mean 'last arg'? |
| 17:55 | jjido | ,doc map |
| 17:55 | clojurebot | #<CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.repl/doc, compiling:(NO_SOURCE_PATH:0:0)> |
| 17:56 | danneu | jjido: how is my example different from (map + [1 2] [3 4]) |
| 17:56 | jjido | I mean in (map list x y) what is y? |
| 17:57 | danneu | jjido: i don't understand your question. y is the second collection that'll be zipped up with x. |
| 17:57 | jjido | ,(map + [1 2] [10 20]) |
| 17:57 | clojurebot | (11 22) |
| 17:57 | jjido | danneu: thanks |
| 17:58 | metellus | danneu: becasue [1 2] is a vector and {:a 1 :b 2} is a map |
| 17:58 | metellus | vectors are ordered, maps are not |
| 17:58 | jjido | so you are doing (list [:1 1] [:4 4]) |
| 17:59 | metellus | (there is *some* internal ordering to a map, but it's not necessarily the one you would expect) |
| 17:59 | danneu | metellus: ah, so it's not random |
| 17:59 | danneu | er, it doesnt randomize |
| 17:59 | metellus | it's determined by the JVM and/or Clojure |
| 17:59 | danneu | in other words i'm trying to figure out why i can't replicate the `;; where` code in this example http://clojuredocs.org/clojure_core/clojure.core/doseq#example_183 |
| 18:01 | edw | What do you mean "replicate"? |
| 18:01 | danneu | (map list {:1 1 :2 2} {:3 3 :4 4}) always pairs :1 with :4 |
| 18:02 | danneu | whether this irc bot is evaluating it or my repl is |
| 18:02 | danneu | meanwhile {:a 1 :b 2} {:c 3 :d 4} always pairs :a with :c as i'd expect |
| 18:03 | edw | danneu, Dude, what you're doing is deeply wrong. What are you trying to accomplish? |
| 18:03 | hyPiRion | danneu: if you prepend clojure functions with ',' or '&', you'll get it evaluated |
| 18:03 | hyPiRion | ,(map list {:1 1 :2 2} {:3 3 :4 4}) |
| 18:03 | clojurebot | (([:1 1] [:4 4]) ([:2 2] [:3 3])) |
| 18:03 | hyPiRion | But as mentioned, maps don't give you any ordering guarantees. |
| 18:04 | edw | Are you trying to pair map entries from two maps sorted by key? |
| 18:04 | danneu | edw: i'm just trying to understand line 9 of http://clojuredocs.org/clojure_core/clojure.core/doseq#example_183 |
| 18:05 | edw | First of all, those are vectors, not maps. |
| 18:05 | jjido | no maps {} |
| 18:05 | metellus | edw: I think you're looking at the wrong example |
| 18:06 | metellus | one of those example does exactly what he's trying to do and gives (([:1 1] [:3 3]) ([:2 2] [:4 4])) |
| 18:06 | edw | OK. |
| 18:06 | jjido | do you know clojure differentiates between brackets? |
| 18:06 | jjido | ok |
| 18:06 | hyPiRion | edw: that's a bad example, heh. Don |
| 18:06 | hyPiRion | Don't look at it ;) |
| 18:06 | edw | Do danneu, the deal is this: maps are unordered. The order is not something you can/should depend on. |
| 18:07 | edw | ,(map identity {:a 1}) |
| 18:07 | clojurebot | ([:a 1]) |
| 18:08 | danneu | edw: yeah i get that much. |
| 18:08 | Raynes | edw: http://www.youtube.com/watch?v=-sKDd9uOW-0 |
| 18:08 | edw | danneu, does what I just eval'd make sense to you? The function that is being mapped is called with each map entry. |
| 18:08 | arrdem | is there an http proxy handler for ring? |
| 18:09 | danneu | edw: yeah, i see that mapping funcs to hash-maps vectorizes hash-map k/v pair. |
| 18:09 | edw | danneu: OK, so this should be crystal clear, too: ,(map list {:a 1} {:b 2}) |
| 18:10 | edw | ,(map list {:a 1} {:b 2}) |
| 18:10 | clojurebot | (([:a 1] [:b 2])) |
| 18:10 | edw | danneu: right? |
| 18:10 | edw | Because there's only one possible ordering of entries for a one item map. |
| 18:10 | danneu | right, it's zipping :a and :b |
| 18:10 | danneu | in an order that can't be ambiguous |
| 18:11 | danneu | i guess my issue is understanding the implications of 'map key order is not guaranteed' |
| 18:11 | edw | Right. You should not depend on the output of that example code. It's _one possible_ result. There are _four possible results_. |
| 18:11 | metellus | that you shouldn't do anything with maps that relies on them having a consistent order |
| 18:11 | metellus | that's the implication |
| 18:11 | metellus | if you want something ordered, us a vector |
| 18:12 | metellus | use |
| 18:12 | danneu | i get that. but i can run my gist 1000 times and the two examples diverge from eachother the same way every time. |
| 18:12 | edw | danneu: As metellus said, your inability to rely on the order is the implication of the nature of a map. |
| 18:12 | danneu | and i can't replicate the clojure doc example even once |
| 18:12 | metellus | danneu: it's not determined randomly |
| 18:13 | metellus | there is some reason in the internals that will order it |
| 18:13 | metellus | so with the same versions of everything on the same machine, you'll get the same result consistently |
| 18:13 | danneu | metellus: so it's like it's using the same 'seed' every time. like the hash of the values or something. |
| 18:13 | edw | danneu: The internal representation of maps has (probably changed) since that sample code was placed in the docs. |
| 18:13 | danneu | ahh, thanks guys |
| 18:13 | danneu | that was killing me |
| 18:13 | metellus | but yeah, that example was probably from an older version of Clojure |
| 18:13 | jjido | or the JVM |
| 18:15 | danneu | phew |
| 18:15 | edw | danneu: And the implementation is allowed to do things like store map entries in a vector if it's really small vs a hash table or whatever. It's the implementation's choice. Imagine a sufficiently smart compiler that saw that you used only integer keys in sequential order. It could implement the map as a vector. |
| 18:19 | arrdem | edw: that sort of stuff is far easier to do in a JIT where you have runtime information unless you can somehow staticly prove that access pattern with type information such as Map<Integer:Object>. |
| 18:22 | edw | arrdem: Don't disagree. Just trying to explain how the system can choose implementations at run time. |
| 18:22 | danneu | clojure does have some nice examples in its docs tho |
| 18:40 | zakwilson | I'm using migratus and it's saying "no migrations found" even though there are migrations which appear to be named correctly in src/migrations. |
| 18:42 | rebcabin | I have both clojure-1.4.0 and clojure-1.5.0 installed, but "lein repl" always brings up 1.4.0 when I am not in a project directory ... clues on how to switch the default plz & thx? |
| 18:43 | zerokarmaleft | rebcabin: check out profiles in the docs |
| 18:43 | zakwilson | https://github.com/technomancy/leiningen/blob/stable/doc/PROFILES.md |
| 18:44 | rebcabin | thank you :) |
| 19:17 | muhoo | what are we using for database migrations these days? migratus? ragtime? lobos? drift? other? |
| 19:21 | Raynes | muhoo: The blood of children. |
| 19:22 | muhoo | muaaaahahaha |
| 19:23 | muhoo | btw, nice job on that video. definitely redo it when you can really cut loose and belt it out. and wear some rock-star clothes too-- rock is to dress up to. |
| 19:24 | muhoo | ok well then i guess i have a day of researching and trying a handful of migration libraries :-/ |
| 19:24 | muhoo | lazyIRC fails to absolve me of that, apparently |
| 19:28 | Raynes | muhoo: I could fart at the microphone and you'd tell me nice job, fwiw. |
| 19:28 | Raynes | Cause you're a nice guy. |
| 19:29 | muhoo | well you are good. if you sucked i'd probably say nothing. |
| 19:30 | Raynes | Heh. |
| 19:30 | Raynes | I can't even remember what song I did. |
| 19:30 | muhoo | it was something i'd never heard of :-P |
| 19:31 | Raynes | Mercy? |
| 19:31 | Raynes | Yeah, Mercy. |
| 19:31 | Raynes | Good ol' OneRepublic. |
| 19:31 | devn | Raynes: devn needs your help again |
| 19:31 | devn | Raynes: Heroku won't pick up the damned MONGOLAB_URI |
| 19:33 | Raynes | devn: You mean getclojure won't pick up the damned MONGOLAB_URI? |
| 19:34 | Raynes | Heroku is the one that should be setting it and you're the one who should be picking it up. |
| 19:35 | Raynes | devn: You can do 'heroku config' or something to see what vars are set. |
| 19:39 | devn | Raynes: im getting an NPE |
| 19:40 | devn | (System/getenv "MONGOHQ_URL") is nil at compile time methinks |
| 19:40 | Raynes | Well, I thought you wanted MONGOLAB_URI? |
| 19:40 | devn | tried adding MONGOHQ just to see if it worked |
| 19:40 | Raynes | Can you set it locally and then run it? |
| 19:41 | gfredericks | hyPiRion: ping |
| 19:43 | Raynes | devn: It works fine locally. Sounds like Heroku isn't setting the variable. |
| 19:48 | Raynes | yogthos|away: http://yogthos.net/blog/41?utm_source=dlvr.it&utm_medium=twitter BOOM, FIRST COMMENT. |
| 19:53 | devn | Raynes: I booted up a lein repl and checked for it |
| 19:53 | devn | it's there |
| 19:59 | gillies | is there a way to read in a file as a clojure data strucure ? |
| 19:59 | gillies | liek foo.txt == {:foo "bar"} |
| 20:00 | arrdem | well you could (eval (read-string (slurp "foo.txt"))) |
| 20:00 | arrdem | but then you have arbitrary code execution... |
| 20:00 | arrdem | so you really want to use the data reader |
| 20:01 | arrdem | https://github.com/clojure/tools.reader |
| 20:01 | gillies | arrdem: fsvo "arbitrary" |
| 20:01 | gillies | isn't code just data? |
| 20:02 | arrdem | gillies: yes and no... the issue is that via reader macros one could execute potentially malicious code. |
| 20:02 | ghadishayban | arrdem: read-string is sufficient without the eval |
| 20:03 | devn | ^-(read-string (slurp "foo.txt")) |
| 20:03 | devn | use it all the time |
| 20:03 | ghadishayban | slurp -> string ; read-string -> clojure data structure ; eval ~-> compilation |
| 20:03 | arrdem | ,(read-string "#=(println \"foobarbaz\")") |
| 20:03 | clojurebot | #<RuntimeException java.lang.RuntimeException: eval reading not allowed when *read-eval* is false.> |
| 20:04 | devn | gillies: anyway, listen to what he's saying, but if it's just for your own purposes and you're confident no one you don't trust will write to the file, go nuts |
| 20:04 | arrdem | ghadishayban, gillies http://news.ycombinator.com/item?id=5343704 |
| 20:05 | devn | i quit following the read-eval discussion awhile ago, but if you want to be safe: (binding [*read-eval* false] (read-string (slurp "foo.txt"))) |
| 20:05 | arrdem | which is what clojurebot did to me... |
| 20:06 | devn | or use clojail's safe-read |
| 20:06 | amalloy | safe-read really isn't safe either. nothing is safe but upgrading to 1.5 and using edn/read |
| 20:06 | arrdem | ... can I make clojurebot remember that as ~reader somehow? |
| 20:06 | ghadishayban | devn: regarding *read-eval* false, -- see Fogus's comment |
| 20:06 | devn | nothing is safe |
| 20:07 | ghadishayban | also, amalloy == truth |
| 20:07 | arrdem | ~reader |
| 20:07 | clojurebot | Reader syntax of collections has gotchas |
| 20:07 | arrdem | well I suppose there's that too. |
| 20:07 | amalloy | clojurebot: reader is http://news.ycombinator.com/item?id=5343704 |
| 20:07 | clojurebot | You don't have to tell me twice. |
| 20:07 | arrdem | amalloy: I assume that's permissioned... |
| 20:07 | amalloy | huh? |
| 20:08 | arrdem | the "foo is" syntax for clojurebot |
| 20:08 | amalloy | i don't know why you would assume such a thing, when you have the opportunity to try it and see |
| 20:08 | arrdem | clojurebot: arrdem is awesome |
| 20:08 | clojurebot | Roger. |
| 20:08 | arrdem | ~arrdem |
| 20:08 | clojurebot | arrdem is awesome |
| 20:08 | devn | clojurebot: arrdem isn't very curious |
| 20:08 | clojurebot | arrdem is jeremy |
| 20:08 | arrdem | works for me |
| 20:08 | devn | clojurebot: arrdem is beautiful person |
| 20:08 | clojurebot | c'est bon! |
| 20:09 | devn | ~devn |
| 20:09 | clojurebot | No entiendo |
| 20:09 | devn | clojurebot: devn put a car in your car, so you can car while you cdr. |
| 20:09 | clojurebot | John McCarthy is someone without whom we would not be here today. |
| 20:10 | zakwilson | muhoo: I had your problem yesterday. I decided on migratus, largely because its author was here. Also, it sounded fairly sane. |
| 20:17 | pjstadig | i'll take that as a compliment |
| 20:17 | pjstadig | :) |
| 20:19 | tyler_ | wow i can't belive i didn't learn about edn until today |
| 20:21 | zakwilson | pjstadig: oh, good, you're here. Migratus seems like a good enough idea, but it's saying "No migrations found" when I do, in fact have migrations. |
| 20:25 | ravster | How do I fix this error when starting "lein ring server" --> Assert failed: (vector? (:dependencies project [])) |
| 20:26 | pjstadig | zakwilson: maybe something to do with out you have the migration dir configured? |
| 20:27 | pjstadig | and/or the way the files are name...i'd have to get more specifics |
| 20:30 | gfredericks | ravster: I think I saw that just the other day |
| 20:30 | gfredericks | cannot remember what on earth caused it though. |
| 20:32 | ravster | apparently I need to find a package I'm using that might be using an outdated leinjacker. |
| 20:33 | hyPiRion | gfredericks: pong |
| 20:33 | zakwilson | pjstadig: I just followed the example on github. I may have gotten it wrong, but I'm pretty sure I did not. |
| 20:34 | pjstadig | is there source i could see? otherwise, what is your migration dir config, and what are the names of your migration files? |
| 20:38 | tyler__ | they they remove entity-db from clojure api? |
| 20:38 | tyler__ | dat.core=> d/entity-db |
| 20:38 | tyler__ | CompilerException java.lang.RuntimeException: No such var: d/entity-db, compiling:(NO_SOURCE_PATH:1) |
| 20:38 | tyler__ | d/entity is a function |
| 20:44 | tyler__ | ah entity has all keywords you just have to merge with a native map |
| 20:45 | zakwilson | pjstadig: sorry, got distract.d Neighbor made me drink too much beer. |
| 20:45 | zakwilson | pjstadig: https://gist.github.com/zakwilson/5131226 |
| 20:51 | gfredericks | hyPiRion: I noticed in the logs you said at some point that nth-prime should be trivial in swearjure |
| 20:51 | gfredericks | just curious what the high-level idea was there |
| 20:51 | Raynes | zakwilson: Wish I had neighbors like yours. |
| 20:52 | zakwilson | Raynes: I gave her cookies. |
| 20:52 | gfredericks | Raynes: but he said "too much" -- that's more than you're supposed to have! |
| 20:53 | pjstadig | zakwilson: should be *.up.sql and *.down.sql not *-up.sql and *-down.sql |
| 20:54 | Raynes | gfredericks: I don't think anyone knows how much you're supposed to have. |
| 20:54 | gfredericks | you don't have to know -- we're talking about "too much" in an unqualified sense |
| 20:55 | pjstadig | zakwilson: i thought i changed migratus to warn when it found names in the migration dir that don't match its pattern |
| 20:55 | zakwilson | |
| 20:56 | zakwilson | pjstadig: the docs say “[id]-[name]-[direction].sql”, t the example says “s"rc/migrations/20111206154000-create-foo-table.up.sql”" |
| 20:57 | zakwilson | And those are dumb quotes. |
| 20:57 | hyPiRion | gfredericks: Well, if we want to get the nth prime, we can first start off by having the vector [2] and then generate n-1 primes through recursion. We then pick the nth element in the generated vector. |
| 20:57 | gfredericks | do we have `count`? |
| 20:57 | pjstadig | zakwilson: hrm |
| 20:57 | zakwilson | Anyway, I tried it both ways, same result. |
| 20:57 | gfredericks | I guess rest gives you count |
| 20:57 | hyPiRion | gfredericks: we don't need it either way |
| 20:58 | gfredericks | so presumably you're thinking of a way of doing this without division? |
| 20:58 | gfredericks | unless we have some way of getting `rem` that I'm unaware of |
| 20:58 | hyPiRion | oh, right. That's a bugger. |
| 20:58 | gfredericks | okay just checking if you had gotten that far |
| 20:59 | gfredericks | I think it's probably still possible |
| 20:59 | gfredericks | just hairier |
| 20:59 | hyPiRion | yeah, must be |
| 20:59 | hyPiRion | can we simulate rem? |
| 20:59 | hyPiRion | Right, we can. |
| 20:59 | gfredericks | I was just thinking about that |
| 20:59 | gfredericks | either that or do a division-less algorithm |
| 20:59 | gfredericks | a sievy thing |
| 21:00 | pjstadig | zakwilson: sorry about that. I'll update the docs, but it should be .[direction].sql, and you should get a warning if there's a file that doesn't match that pattern in the migrations dir |
| 21:00 | gfredericks | simulating rem is probably the simplest from a high level |
| 21:00 | hyPiRion | yeah, probably more efficient for high values of n |
| 21:00 | hyPiRion | (the sieve, that is)= |
| 21:01 | devn | Raynes: lol, dude I am STILL trying various crap to get that config variable out. |
| 21:01 | Raynes | devn: I can't imagine what would be the problem. |
| 21:02 | Raynes | It shouldn't matter if it is compile time or not. |
| 21:02 | devn | it's driving me insane man |
| 21:02 | Raynes | devn: https://github.com/Raynes/refheap/blob/master/src/refheap/server.clj#L13 I did this and it worked fine on heroku. |
| 21:03 | pjstadig | zakwilson: it is also expecting a 14 digit number for the migration id |
| 21:03 | pjstadig | zakwilson: yours are 12 |
| 21:05 | zakwilson | pjstadig: the docs do NOT say that. |
| 21:05 | pjstadig | zakwilson: i just updated them |
| 21:06 | devn | Raynes: im doing the exact same thing |
| 21:07 | zakwilson | pjstadig: ok, it liked that. Failed, but there may well be a typo in my sql. |
| 21:09 | zakwilson | If that is the case, I consider it a flaw that whatever postgres would say in complaint is not being displayed. |
| 21:10 | Raynes | devn: :| |
| 21:10 | devn | Raynes: well, hard-coding it works |
| 21:10 | devn | ugh |
| 21:10 | Raynes | Hahaha |
| 21:11 | tyler__ | in the repl is there a symbol that represents last output? |
| 21:13 | tmciver | tyler__: *1 |
| 21:13 | tyler__ | tmciver: thanks |
| 21:13 | tyler__ | ah nice it goes backwards |
| 21:13 | tyler__ | so i can get *5 |
| 21:13 | tyler__ | bravo |
| 21:14 | tmciver | tyler__: I think it only goes to *3 |
| 21:14 | devn | technomancy: can you think of any reason why I wouldn't be able to get at a config var on heroku? Apprently if you have like 64k or something of config vars you get capped, but they're there and I can see them from a lein repl, but when I deploy they're not there |
| 21:14 | tyler__ | meh |
| 21:14 | tyler__ | close enough heh |
| 21:15 | tyler__ | someone needs to make a clojroku |
| 21:15 | tyler__ | heh |
| 21:15 | Raynes | yogthos: First comment on your blog post about luminus + clabango is a guy complaining about no laser support. :D |
| 21:15 | Raynes | YOU'VE BEEN SERVED HOMEBOY. |
| 21:16 | devn | oh damn |
| 21:17 | egghead | :) |
| 21:17 | devn | omg im going to murder someone if this doesn't work soon |
| 21:34 | clifton | is there a good way to do 0-downtime deploys with clojure web apps? |
| 21:34 | brehaut | clifton: it would depend on your deployment situation |
| 21:35 | brehaut | clifton: eg, jetty behind (forex) nginx is different to servlet in an app container |
| 21:35 | clifton | yeah im using nginx now |
| 21:35 | clifton | im used to using unicorn in ruby, which is a pretty simple master/worker pre-forking setup |
| 21:37 | brehaut | i think (though i dont know specifics) that you can just start two jetty's on different ports and set up nginx to fail over |
| 21:38 | brehaut | most of the time you'd only have one running, and you'd cut over when you want to update |
| 21:38 | clifton | yeah the solution i googled uses port failover |
| 21:41 | technomancy | devn: they're not there at compile time or at runtime? |
| 21:42 | technomancy | exposing config at compile time is possible, but introduces a lot of undesirable semantics around the purity of the build function |
| 21:47 | tomoj | so what's the workaround? |
| 21:48 | tomoj | or you just accept the impurity if you need an s3 key at build time? |
| 21:49 | devn | technomancy: at compile time |
| 21:49 | tomoj | I mean, I know the user-env-compile workaround, but what's the workaround around user-env-compile? :) |
| 21:50 | dabd_ | How can I force the evaluation of lazy seqs? The expression [(some-fn-that-returns-a-lazy-seq)] returns [clojure.lang.LazySeq@...] |
| 21:50 | dabd_ | I tried doall but it doesn't work |
| 21:50 | devn | technomancy: this is the code that is forcing me to set it at compile time: https://github.com/devn/getclojure/blob/master/src/getclojure/models/sexp.clj#L11 |
| 21:51 | pjstadig | zakwilson: migratus should let bubble any exception that would be getting thrown from JDBC |
| 21:51 | devn | tomoj: i didn't know that workaround |
| 21:51 | tomoj | but like he says, "undesirable" :/ |
| 21:51 | devn | yeah and i understand why |
| 21:51 | devn | but im looking to just finish this and go do something else |
| 21:51 | devn | so this is going to have to do for now |
| 21:52 | zakwilson | pjstadig: "java.sql.BatchUpdateException: Batch entry 1 <unknown> was aborted. Call getNextException to see the cause. |
| 21:52 | preyalone | Are there macros for Haskell-like pattern matching? |
| 21:52 | tomoj | I can't even remember how "clojure.lang.LazySeq@" happens. it's not str or print, so what is it? |
| 21:53 | devn | technomancy: i also cant seem to get Pygments to install via pip :\ |
| 21:54 | tomoj | lazybot: google clojure match |
| 21:54 | lazybot | [clojure/core.match · GitHub] https://github.com/clojure/core.match |
| 21:55 | preyalone | core.match isn't available yet. |
| 21:55 | devn | Raynes: you ran pygmentize on heroku, right? i see in the logs that it untars that dir to resources, but then when i inspect the slug it's not there |
| 21:56 | Raynes | devn: I did. |
| 21:57 | tomoj | it's not available? |
| 21:58 | preyalone | I'm using clojure stable and this feature is not yet available. |
| 21:58 | Raynes | It's a library, preyalone. |
| 21:58 | bbloom | lynaghk: remind me at clojure/west, you and i need to discuss rewrite systems! |
| 21:58 | bbloom | lynaghk: and property trees |
| 21:58 | Raynes | Not built into Clojure, but it is available. |
| 21:59 | preyalone | If it's a library, why is it called core / clojure? |
| 21:59 | preyalone | *core.match |
| 21:59 | Raynes | Because it could potentially get moved into Clojure one day. |
| 21:59 | Raynes | And if it did, the namespaces would not need to change. |
| 21:59 | Raynes | And thus existing code would continue to work without modification. |
| 21:59 | Raynes | This will likely never happen, but they also use JIRA and Confluence as well so their sanity is already questionable. |
| 22:00 | preyalone | interesting |
| 22:00 | preyalone | How did Atlassian get so popular? |
| 22:00 | devn | Java |
| 22:00 | Raynes | How did Hitler get so popular? |
| 22:00 | brehaut | painting |
| 22:00 | devn | bahahahaha |
| 22:01 | devn | Using Jira is sort of like the holocaust... I guess... |
| 22:03 | technomancy | tomoj: I have a hack where you can add query params to your buildpack URL for private params |
| 22:03 | technomancy | but I don't think we'll end up productionizing it because it doesn't work for certain cases and having two ways to do it is confusing |
| 22:03 | technomancy | even though for the solutions it does work on it's a superior solution to user-env-compile |
| 22:04 | technomancy | devn: but this is what you want if you can't avoid needing config during build: https://devcenter.heroku.com/articles/labs-user-env-compile |
| 22:04 | technomancy | tomoj: https://github.com/heroku/slug-compiler/blob/master/lib/slug_compiler.rb#L77 <- not in production |
| 22:32 | arrdem | amalloy: thanks for reminding me to try before asking XP |
| 22:32 | arrdem | solving my own problems is way more fun |
| 22:32 | amalloy | "try it and see" is the right answer to like a quarter of all questions asked in irc |
| 22:34 | tomoj | generous estimate |
| 22:34 | abp | amalloy: That even applies to how I work on my library. Written 10 or more prototypish things in along the way. |
| 22:34 | abp | -in |
| 22:35 | arrdem | tomoj: really? I'd guess it's conservative... |
| 22:36 | Raynes | Just write a plugin for lazybot. |
| 22:36 | Raynes | Why do people keep writing new bots? Damned lisp curse. |
| 22:37 | arrdem | there's your answer... it's about as easy to roll your own as to build on something else :D |
| 22:39 | brehaut | i smell irony |
| 22:39 | tomoj | hmm, I want to test my promise library, so I want to add async support to cemerick.cljs.test, so I want a promise library, ... |
| 22:40 | tomoj | oh I guess obviously cemerick.cljs.test shouldn't use a promise library |
| 22:48 | hyperboreean | how can one figure out the clojurescript version to use in a project.clj ? |
| 22:50 | supersym | https://github.com/emezeske/lein-cljsbuild |
| 22:50 | supersym | technically not the correct answer |
| 22:50 | supersym | but guessing its the result you probably would want that counts? |
| 22:50 | tomoj | http://search.maven.org/#search%7Cga%7C1%7Cclojurescript |
| 22:51 | tomoj | &(learn-command! lazybot 'mvn) |
| 22:51 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: learn-command! in this context |
| 22:51 | arrdem | dakrone: clj-http is a dream, thanks! |
| 22:52 | Raynes | tomoj: I'd like an extension of my $latest command to work with maven central. Go. |
| 22:54 | tomoj | but using laser, not lein's indices |
| 22:55 | tomoj | I'll do that on thursday |
| 23:02 | alandipert | arrdem: re: proxy, pushed out https://github.com/tailrecursion/ring-proxy the other week... also based on clj-http by the awesome dakrone |
| 23:03 | arrdem | alandipert: okay cool, a quick google didn't turn any up so I threw together a generic handler that just did a (client/get (:url request)) |
| 23:04 | tyler__ | whats an easy way to cancel in lein repl if i get caught in bad parens? |
| 23:05 | tyler__ | not quit the repl just restore back to sane state |
| 23:05 | arrdem | alandipert: badass, that's exacltly what I was thinking would be in order |
| 23:05 | alandipert | arrdem: cool! yes it does all http verbs and munges cookie domains |
| 23:06 | tyler__ | alandipert: nice |
| 23:08 | alandipert | tyler__: thanks |
| 23:08 | arrdem | tyler__: none that I know of short of interacting with the repl via emacs or vim where you have a full editor to fix your mistakes with. |
| 23:09 | tyler__ | control d it is then |
| 23:09 | arrdem | tyler__: I would suggest just closing the expression (balancing the parens, brackets etc) and feeding the repl a bad form rather than C-ding |
| 23:10 | tyler__ | arrdem: tried that, it got stuck i think |
| 23:11 | tyler__ | i was like ))))))))))))))))))))))))))))))))))) |
| 23:11 | tyler__ | heh |
| 23:12 | johnmn3 | in clojurescript, instead of dom/appendChild, I want to do something like dom/setChild. What is the best way to go about doing that? |
| 23:14 | alandipert | johnmn3: (do (set! (.-innerHTML ele) (dom/appendChild ele x)) is one way |
| 23:15 | alandipert | johnmn3: err, that's busted, but idea is to clear and append |
| 23:15 | johnmn3 | right |
| 23:15 | johnmn3 | I was thinking that... closure has goog.dom.RemoveChildren |
| 23:16 | johnmn3 | goog.dom.removeChildren, rather |
| 23:16 | alandipert | that's another way, yeah. also jquery's empty() |
| 23:33 | brehaut | im curious, why does re-seq use an fn an explicit recursion rahter than loop recur for its lazy-seq generation? |
| 23:38 | ivan | brehaut: isn't that the only way to recur (lazily) in a lazy-seq? |
| 23:39 | brehaut | ivan: no, thats the very purpose of lazy-seq |
| 23:42 | brehaut | in hindsight, i suspect its because the recursive call is not in the tail position |
| 23:58 | devn | yeesh, constant stream of memory errors on heroku |
| 23:58 | devn | 2013-03-11T03:59:53+00:00 heroku[web.1]: Process running mem=534M(104.4%) |
| 23:59 | technomancy | are you leaving lein running? |