#clojure logs

2013-04-05

00:12mmitchellgfredericks: i finally got it, and dang it's ugly! But this actually does what I want: https://www.refheap.com/paste/13283
00:12mmitchellif you change the "(is (= (subtract 1 2) 100)" to "(is (= (add 1 2) 100)" you'll see the error message in the REPL
02:16mjc`whoa. the full ramifications of laziness just hit me.
02:16mjc`my program exited before all my side effects happened
02:17arrdemthat can happen... isn't it cool?
02:18mjc`very
02:51arrdemhow long has the clojure in scheme project been running?
02:51arrdemI just found it...
02:51arrdemand I'm in awe
02:53arrdemalmost a year... man I'm glad I found this.
03:06arrdemanyone still awake care to comment on MIT vs EPL? I just read the EPL text and don't see any major differences.
03:06akhudekarrdem: last I read it, if you modify an EPL program you are required to release the source, though you can freely link to it or use it as a library without doing anything
03:07arrdemakhudek: ah that makes more sense.
03:07akhudeke.g. it's more like lgpl
03:07arrdemI just noted that the commercialization clauses were equivalent
03:08arrdemakhudek: however the onus for enforcing compliance lies with the original author, correct?
03:08arrdemor and "Contributor" I suppose
03:10akhudekthat's true of all licenses
03:12arrdemokay thanks for the info! I just started reading some GPL3 code and realized that I should remedy my ignorance of the different F/OSS license terms
03:12akhudekit's worth knowing about!
03:12akhudekeasy to run into incompatibilities
03:13akhudekesp. with GPL
03:13arrdemah copyleft...
03:14devnRE: EPL -- I sometimes find the notices at the top of source files which say "You must not remove this notice, or any other, from this software." to be wildly annoying
03:14devnIt's like ceremonious code bloat
03:14arrdemmeh... TBH tho if you didn't put it at the top I'd forget about the license when I'm just reading source
03:14arrdembesides. bytes are cheap and the compiler(s) throw all that away anyhow
03:15devnarrdem: If you add an additional 10 lines to every file in your project, I find that annoying. I'm not worried about a performance issue or something.
03:16devnAnd frankly I'm not "worried" about 10 lines in every file, but I do find it annoying. That should count for something. I can't be alone.
03:17devnI think in general it plants the seed that you should think for a bit about whether you want to contribute to a project.
03:17devnLegalese in my source code? Not unless I'm working on an application that deals specifically with law.
03:18devnIt's subtly stifling. This is the reason people ask about the EPL: "Wait, can I do the stuff I want to do?"
03:18akhudekdevn: unfortunately there is no way around legalese. Anyone writing software needs to understand the basics.
03:18augustlI agree, I find license preambles in source code very annoying
03:18devnThe EPL doesn't have the same reputation as MIT, GPL, or BSD. Some people are license mavens. I'm not one of them.
03:19devnWe talk about "clean code" and "DRY" and all of this stuff, but we are open to adding a giant comment block to our source files.
03:20devnIt's on the verge of, well, ridiculous.
03:20devnridiculosity
03:20arrdemgiant? a five line 80chr prefix isn't bad... my ranting comments are known to do much worse XP
03:21devnarrdem: comments are a disease in general IMHO. In any event, now we're starting to talk about style. Licences ought not cramp our style.
03:22arrdemI jest, but you could consider license function metadata sadly
03:23devnheh, honestly I wish leiningen removed the default of EPL for licenses
03:23arrdemmakes sense right? :doc, :added :author :license
03:23devnI think it adds this air of "official" to things which sometimes have no business being considered official
03:24akhudekdevn: agree with that, shouldn't be opinionated about licenses
03:24arrdemdevn: I think this is the only project I've done the prefix thing in and published..
03:24arrdemhttps://github.com/arrdem/SimpleVM#disclaimer
03:24devn"official" often gives off a vibe that turns the intrepid into scared sheep.
03:25akhudekand speaking of lein, lein-pedantic really should be a standard part of lein
03:25devni will give a "meh" to that
03:25devnbecause ive never seen it actually help me
03:25akhudekIt's so easy to get undefined behavor on larger projects.
03:25devni use it, but ive never been like "whoa! that shit is messed up!"
03:26arrdemthat's cool...
03:26devnquestions arive for me akhudek: How big is "larger"?
03:26devnarise*
03:26devnIs the need for pedantic a sign of a project doing more than it ought to? Etc.
03:26akhudekdevn: The most recent personal case I've seen was with a 20+ dep project
03:27devnakhudek: the domain matters I think
03:27devnI'm guessing it was http or dom-related?
03:27devnweb-related?
03:27akhudekdevn: yep
03:27arrdemthat's... more clojure than I've ever seen in one place before.
03:28arrdems/seen/heard of/
03:28devnthat stuff is ridiculous. i'll agree with you there i guess, but i guess i wonder if pedantic is treating a symptom rather than the problem
03:28devncan we curate more as a community to try and prevent the need for pedantic?
03:29akhudek lein deps :tree | wc gives 108 lines
03:29arrdemdevn: the only library issues I've encountered are noir and fnparse
03:29akhudekdevn: it's pretty hard in general with the pace that libraries evolve
03:29arrdemboth of which are deprecated and that isn't stated clearly
03:29devnakhudek: i feel like that's kind of a lie
03:30akhudekdevn: what is?
03:30arrdemakhudek: keeping up with lib devel
03:30devnthe assertion that no one could possibly keep up with some common set of "edge" "templates" for working dependencies
03:30devnit could even be automated
03:30devnpedantic is mechanical
03:31akhudekthe trouble is that each library needs to keep it's dependencies up to date
03:31akhudekand make sure that new versions don't break things
03:31akhudekthings like lein-outdated are a pretty good tool
03:31devnakhudek: but like...tests
03:31devndon't people protect themselves at all from the weather outside?
03:31akhudekdevn: yes, lots of those would be good too :)
03:32devnakhudek: im just saying, depending on what you're working on, there are certain pragmatic levels of attention that should be paid to these sorts of things
03:32devnand in some cases I find pedantic to be a complete waste of my time
03:33devnIt's like: "Here, do this! (PS: I can't tell you whether it matters or not)"
03:33akhudekdevn: the only thing worse than not knowing if a fix will work is having depedendencies randomly shuffle on you!
03:33devnSo every time I change a dependency I'm supposed to run some other task to check whether or not I'm still blessed by the Holy Dependency Management System
03:34devnThat just seems like a weak ass workflow
03:34akhudekdevn: it checks automatically, you don't usually run into many errors
03:35devnakhudek: I've seen people reorder 3 things in their project.clj and all of a sudden things magically change. I get grossed out by that. But again, back to my original criticism: I've never, not a single time, actually been like "Thank God for lein-pedantic!"
03:35devnIt literally has never been something I've needed, and I have dozens of commits and time spent editing my project.clj to heed pedantic's warnings.
03:36devnAt a certain point I think it's natural to question whether or not this is actually valuable to me.
03:36devnI'm not obsessed with staying on edge.
03:36akhudekdevn: I don't get it, how else would you solve the reordering problem you mentioned?
03:37devnakhudek: what I meant is: lein-pedantic is like "okay, cool!" if you reorder deps
03:37devnwhich is like... uhh, okay...
03:38devnif we're talking pedantry, why not try every permutation of deps to come up with the least amount of issues?
03:39akhudekdevn: order really has nothing to do with it, it's more that updates can cause issues. Everyone updates their libraries, they may not even be aware of issues due to caching and the like. Then they go to deploy and suddenly things are not working.
03:39devnif i have enough time to tinker with my project.clj for 20 minutes, i have enough time to let it try 5! times to give me a good solution
03:40devnakhudek: i will shut up because i don't think i'm going to be able to give a solution to this problem
03:40devnbut i feel like pedantic is a bandage and it doesn't address the real issue
03:40devnwhich is why i am strongly opposed to it being something lein includes by default
03:40MasseRWait what, it matters in what order you put dependencies in lein?
03:41devnMasseR: I've seen lein-pedantic give different results for different orders, yes, I believe that's the case.
03:41devnwhich is like-- WAT
03:41devnI believe Jim Crossley pointed this out in his demo of Immutant at Clojure/conj
03:42MasseRHmm... Doesn't lein use maven internally? So maven is dependent on order..?
03:42akhudekMasseR: I've possibly even seen lein exhibit nondeterministic behaviour in what versions of libraries it uses between runs.
03:42arrdemdevn: while I agree with you in theory, if we don't trust library maintainers to stay up to date, then something like pendantic makes perfect sense because you want to be able to discern when you aren't up to date & warn
03:42devnHe was like: "So, lein-pedantic complains... but if you put this dep here and that dep there, and add this exclusion, voila!"
03:42akhudekMasseR: the basic problem is if you have two libraries, A and B, that both depend on C, but A depends on C v1 while B depends on Cv2, what happens when you include both A and B as dependencies?
03:43akhudekMasseR: do you get C v1 or C v2?
03:43akhudekdevn: in any case, I don't know of any better way to solve the problem right now, but I do like knowing about the problem :-)
03:43akhudekbeen bitten by it too many times
03:43devnIMO the Answer is: Handle testing your system in a way that doesn't desperately rely on lein-pedantic to tell you about a problem.
03:44devnIf you're relying on lein-pedantic to help you keep your app stable, you're Doing It Wrong.
03:44MasseRakhudek: Agreed, but imo as long as they are not exclusive, do a choice and stick to it
03:44akhudekdevn: tests certainly go a long way, though nobody write perfect tests
03:44devnWho in their right mind runs lein-pedantic, fixes their deps, and sleeps easy with no tests around their app and how it's supposed to behave?
03:44MasseR"Hey, I need v1 or v2, and I seem to have v1 installed, that dependency is then ok"
03:45devnIt seems absolutely ridiculous to suggest that lein-pedantic is this wonderful catch-all tool for a lack of testing and quality in software.
03:45devn"Does my shit work? y/N"
03:45akhudekdevn: never said it was a substitute for testing, just another test itself
03:46devnakhudek: im just getting animated about it
03:46akhudekok, feel free to continue then :D
03:46devnbecause im not a testing freak or trying to set file permissions with a magnet and a pin
03:46devnBUT, I think we need to be real about what pedantic's role actually is
03:46devnit should be a diagnostic tool
03:47devnwhen your tests fail, you might look at it
03:47devnbut i don't think it has the kind of weight people seem to give it
03:47muhooum, pedantic is a dependency-resolution tool, AFAICT
03:47devnmuhoo: in response to?
03:48mjcthe github generation
03:48muhooit's not a testing tool, doesn't try to be one, and i've never heard anyone refer to it as one or try to use it as one
03:48devnheh
03:48devnmuhoo: so how does it fit into people's workflows?
03:50muhooi dunno too many people, so i can't say. in MY workflow i use it as a dependency resolution tool
03:50muhooplus "lein deps :tree" also
03:50devnbecause I seem to hear some nagging voices that insist you use it, but they don't really tell you when and how they use it. In any event, I feel like it's kind of how Rich said something like: There wasn't any notice at the top of your file that managing memory was on you.
03:50devnThis implicit problem with dependency resolution needs a better solution than some plugin that 1/3rd of the community knows about and uses.
03:51muhoodependency resolution is a mess, in my experience, even with great tools like lein, pomegranate, and pedantic
03:51arrdemmore than that... there needs to be a better guide to clojure at large
03:51arrdemI mean I never knew about lein deps :tree before this discussion
03:51devnmuhoo: sensible defaults are better than a myriad of optional plugins
03:51arrdemand half the community is still writing (use)
03:52muhooclojure is a young language; the docs definitely could use improvement. so could the tools.
03:52arrdemyoung being... five years I think?
03:52devnmuhoo: im not telling you this like: "HOW DARE YOU?" -- I'm just saying I think the *right* thing to do would be to provide these plguins a la carte, but to also provide some kind of sane way of enabling some smart dep resolution stuff within lein
03:52muhoothey're moving in the right direction AFAICT. as for docs, write some up and help, maybe?
03:52muhooarrdem: yes, how old is python? java? c++?
03:53muhoohow old is ruby? shit, how old is CL?
03:53arrdemppft CL still doesn't have a real dep manager
03:53arrdemquicklisp has shit on lein
03:53devnmuhoo: you're being defensive. i don't think he was trying to point his finger at the age of clojure
03:53devnand by telling you you're being defensive i suppose i'm being aggressive, sorry :)
03:54muhooif you want better docs, i have to say, the best way to get them is to write them
03:54ejackson,gaurds
03:54clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: gaurds in this context, compiling:(NO_SOURCE_PATH:0:0)>
03:54ejackson,guards
03:54clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: guards in this context, compiling:(NO_SOURCE_PATH:0:0)>
03:54ejacksonbah
03:54arrdemmuhoo: I've only been coding for five years and I considered python to be "young and hip" when I started so it's funny to me to contemplate a five year old language as still developing as I'm thinking about doing one in a few days
03:55devnmuhoo: easy to say in an irc channel full of people who spent the time reading source and learning things the hard way
03:55arrdemin fact I think Raynes is the only person here younger than me..
03:55muhooman, i'm not sure what to say then. that's what i do; if the docs suck, i either just write notes for myself, or if i'm feeling community-oriented, submit a patch for someone else's docs, or write up a blog post or something.
03:56devni love me some clojurian positivity, but damnit folks, we all need to just hug one another and admit that the docs suck and the traces are garbage
03:56devnwe need to be able to be that honest with ourselves
03:56devnor we're in rough shape
03:56arrdemlol
03:56muhooheh
03:57arrdemyeah... I guess I'll just man up and start working on Factual/fnparse
03:57muhoolook, i think the most helpful thing to do when docs suck, is to write better docs.
03:57devnmuhoo: yeah dude, of course
03:57devnbut that's like saying: hey guys, you know what would be better than nothing? something.
03:57devn*brain melts*
03:58arrdemdevn: now now you're sounding snarky again
03:58devn:X
03:58devngood thing i didnt hit enter on the next line
03:59arrdemheh
03:59muhoofyi, this is what my dependencies looked like for a web project in clj: https://www.refheap.com/paste/13140
03:59devnbut no, i have to say one last thing while i'm ranting: the clojure.org site is maintained via roughly the same broke-ass method that clojure is maintained.
04:00arrdemdevn: hah bitch about the community docs sites first
04:00arrdemclojuredocs.org?
04:00arrdem1.3.0?
04:00arrdemhah
04:00devnthe community should just have tea party day where we scrape all of the content from clojure.org, DDoS clojure.org, and build something that's community owned
04:00arrdemthe issue I have is that clojure-doc.org isn't freaking searchable
04:01devnNeeding a CA and a special handshake to modify broken docs on clojure.org? Fuck the what?
04:01arrdemit even refers to clojuredocs.org for function specifics
04:01muhoodidn't someone create a community-oriented, more-easily-mainteined alternative clojure docs site?
04:01arrdemmuhoo: link if you have one 'cause I've never heard of it.
04:01devnmuhoo: indeed they did. Several people have done this now.
04:02devnThe Lisp Curse is alive and well.
04:02devneveryone, quick, do your own thing!
04:02arrdem(inc devn)
04:02lazybot⇒ 5
04:02arrdemdevn: it isn't a language, it's a tool for replicating other peoples work better!
04:02akhudekyes, confusingly called http://clojure-doc.org/
04:02arrdem-________________________-
04:03akhudekthere is also http://clojure.github.com/ that many people don't know about
04:03devn"Hello gentles and ladies, I have written a series of tutorials and half of a book. I realize this exists in 17 other places, but those were outdated, so instead of contributing I chose to make a name for myself by being badass and doing All The Things."
04:04devn"Please, contribute to this version of the same material. I am confident with your support we can win!"
04:04arrdemakhudek: those are the best docs I've found even if I have to use Google to search em
04:04devnspeaking of stupid documentation sites
04:04muhoolinux has been like this for like 20 years now.
04:04devnI have http://getclojure.org up
04:04devnIt's kind of cool I geuss
04:04devnguess*
04:05akhudekI guess clojuredocs.org is more of an api site, clojure-doc.org seems like a good effort
04:05devngetclojure.org: it's like hoogle, but without any thought put into it.
04:05arrdemdevn: bug: if I just click search I get nothing
04:05devnarrdem: yeah, it's way buggy and lame, but if you want examples of functions it'll give you a back rub
04:06arrdemakhudek: clojure-doc.org needs about 100 pages of clojure.core/* copy added tho
04:06devnit drives me a little bit insane that clojuredocs.org and clojure-doc.org exist simultaneously
04:06arrdemdevn: that's awesome... it's just that the n00bs we get here don't even know how to use google to figure out what the right function is
04:07arrdemdevn: consequently I find core api docs more valuable since they let you find the tools to solve your problem
04:07devnarrdem: word. i think of this as a supplement to the core docs.
04:07devntyping in "let" for instance: lots of cool destructuring examples hidden in there
04:07devnim going to add ratings so people can tag stuff as idiomatic etc/
04:08arrdemoh well I suppose I can start racking up pull requests committing to clojure-doc
04:08devni parsed and ran all of clojuredocs.org in the sandbox that produces these examples as well
04:08devnso there should be lots of good examples in here
04:08devnjust need to eek them out
04:08arrdembeing able to up and down vote examples would be really slick..
04:08devnarrdem: commit to getclojure! help me add ambrose' analyze to it
04:09devna sort of hoogle-esque search engine
04:09arrdemdevn: I'll throw it on the heap with my school work and plethora of side projects
04:09arrdemI've kinda wanted to do a search engine for a while now...
04:09devnarrdem: "effective badgering" is the name of my game
04:09arrdemhaha
04:10devnarrdem: I'm using elastic search on this
04:10devnI could use your help writing a better analyzer and tokenizer
04:10muhoothat's a neat site.
04:10devnso things like -> and what-not work without quotes maybe?
04:10muhoolooks like it does aprpopos or find-doc
04:10muhoo,(find-doc #"lazy")
04:10clojurebot-------------------------\nclojure.core/concat\n([] [x] [x y] [x y & zs])\n Returns a lazy seq representing the concatenation of the elements in the supplied colls.\n-------------------------\nclojure.core/cycle\n([coll])\n Returns a lazy (infinite!) sequence of repetitions of the items in coll.\n-------------------------\nclojure.core/distinct\n([coll])\n Returns a lazy sequence of the element...
04:10arrdem,(doc) please... at least that doesn't fuck up the formatting
04:10clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: core$eval37$fn--38$fn--39$fn--40$my-doc>
04:11arrdemclojurebot: f off
04:11arrdemoh that was a regex search
04:11arrdemcute
04:11arrdem(dec arrdem)
04:11lazybotYou can't adjust your own karma.
04:11devnmuhoo: i wrote getclojure. it slurps up 5 years of clojure irc logs and runs all of the valid looking sexps through a sandbox
04:11devnit captures output and value
04:11muhoo,(doc find-doc)
04:11clojurebot"([re-string-or-pattern]); Prints documentation for any var whose documentation or name contains a match for re-string-or-pattern"
04:11Sonderbladearrdem: many clojure functions have generic "ungoogleable" names like get and apply, also try googling for the api for clojure maps and sets, its impossible to find a list of functions that applies to them
04:11clojurebotfor is not used often enough.
04:11arrdemmuhoo: that's cool, I didn't realize it
04:11devngetclojure has ~40k examples on it
04:11muhoodevn: really? very nice!
04:12muhoostackoverflow is ramping up pretty well with clojure answers too.
04:12muhoooften my google searches take me there
04:12devnyeah agreed
04:12devni love clojure because i can actually parse random sexps from all over the internet
04:12devnand run them in a semi-safe way using clojail
04:13muhoothere is always folklore in every language/field/technology. how to capture it is an interesting problem. i like the getclojure approach, kind of a cross between a google search and a repl
04:14muhooi do really like the stackoverflow approach though.
04:15muhoothere's voting, and well-worded answers. yeah, if you attached voting to getclojure, it could be a good answer to the problem of "how do we capture all this folklore and have it accessbile?"
04:15devnmuhoo: lots of ideas for getlcojure: id like to do analysis using ambrose' analyze library to provide more metadata, and then id like to provide a custom query syntax
04:16devnso you can do a query like this: (map * [...]) => {...}
04:16muhoothere is somethign that does that already
04:16devnerr something like that
04:16muhooraynes wrote it
04:16devnfind-fn?
04:16muhooyep
04:16devnyeah, but this is a bit different
04:16RaynesNo he didn't.
04:16devnit would be a search across the examples
04:16arrdemdevn: it'd be interesting to see this extended to libraries.. see the Lisp Curse we are overburdened with lib search & identification tools but we need a good one
04:16devnamalloy did it right?
04:16RaynesHe helped.
04:16muhooRaynes: i thought you did? huh, maybe it was a flatland thing
04:17devnarrdem: then was my next thing... codeq.
04:17RaynesIt was someone else whose name I can't remember.
04:17RaynesNot really muhoo.
04:17RaynesThe guy who wrote it doesn't hang out here anymore.
04:17RaynesI just turned it into a library.
04:17arrdemdevn: you may be able to make me stick around then XP
04:17devni imported all of the top-rated libraries into codeq. I'd like to try to analysis on expressions and fns in all of those libraries
04:17RaynesAnd amalloy_ helped the guy who originally wrote it.
04:17devnand then provide them as searchable examples as well
04:17muhooRaynes: oh, it is in your github account so i thought it was yours, sorry
04:17Raynesmuhoo: Heh, nothing to apologize for.
04:18RaynesI'm just making sure credit isn't given to me where it isn't deserved. <3
04:18arrdemdevn: it'd be really interesting to provide some sort of "hotness" metric on libraries based off of clojars data
04:18muhoofair enough.
04:18devnarrdem: oh that's coming. I have that one a local branch at the moment. Still thinking about it. Also, tomorrow my plan is to use pedestal to do the backend for getclojure.
04:19muhooif you make a reducer for hi-fives you can do them in parallel
04:19devngetclojure is getting nasty in that it does like 4 things in one code base. it needs some splitting.
04:19devnlol
04:19devnthat's how I failed out of college
04:20devn"nevermind class, time to write more code..."
04:21arrdem,(doc cos)
04:21clojurebotexcusez-moi
04:21devnMath/cos
04:21arrdem,(doc Math/cos)
04:21clojurebotNo entiendo
04:21muhoo,(Math/cos 22)
04:21clojurebot-0.9999608263946371
04:21devnthat's java
04:21devnso doc won't work
04:21arrdemah clojure.lang wrapper over java.lang
04:22devnjust java interop
04:22devn,(Integer/parseInt "999")
04:22clojurebot999
04:22devnsame deal
04:22devni wish i had more energy, but i need to go to bed so I can make your getclojure dreams come true tomorrow.
04:23devnping me if you have ideas or want to help out
04:23devncontributions are very welcome. refactors, code reviews, etc. all welcome
04:23muhoolink to the repo?
04:23devni also have a sweet new comp that a designer friend did for me, so it should look 9x sexier soon
04:24devnhttps://github.com/devn/getclojure/
04:24devnpardon my mess. there are some gross, large commits, unused code, lots of stuff that should be extracted, so seriously, go nuts, help me out
04:25arrdemdevn: you'll get sick of my "commit early commit often" and "branch like a motherfucker" style fast
04:25muhoothat's what private branches and "merge --squash" are for :-P
04:25arrdemmuhoo speaks the truth
04:25devnarrdem: nah, that's how I always role on projects, just not on projects where i sometimes have work that spans multiple weeks due to my time and availability
04:26devnroll*
04:26devnim very happy to have topic branches and lots of small commits
04:26devnthat's how it ought to be done
04:26devnso, no, not annoying, absolutely what i'd prefer
04:26arrdemdevn: mmkay. no promises you are now the ... 6th? project on the stack.
04:27arrdemmore classes and "work" whatever that is
04:27devnarrdem: dude, you gotta do what you gotta do, but this project is cooler than your other projects ;)
04:27devnlots of ideas to explore
04:27arrdemdevn: https://github.com/arrdem/sad I beg to differ
04:28arrdemI friggin generate runnable code from bnf. come at me br0
04:28devnokay, gold star
04:28arrdemcan haz inc plz?
04:28devnim suspending you for radically wonderful behavior
04:28arrdemXD
04:28devn(inc arrdem)
04:28lazybot⇒ 2
04:28arrdemw00t
04:29devncool that it uses fnparse underneath
04:29muhooheh, private branches and squash http://bace.s3.amazonaws.com/fucked2.jpg
04:29devnfor big branches i like just rebuilding a release branch from merged commits
04:30devnerr s/branches/projects
04:30arrdemmuhoo: wat
04:30muhoo"ugh" is a perfectly acceptable commit comment... in a private branch
04:30devnhaha
04:30devni have like 12 commits on getclojure "Fucking Heroku..Work!"
04:30devnor somesuch
04:31devnalso git commit -m ":fire"
04:31devnerr :fire:
04:31devnalways good for bad commits
04:31devnit's like cursing without the cursing
04:32arrdemhaha where's that github stats project on profanity per language...
04:33arrdemprofanity per time zulu could be cool too
04:33devnheh
04:33devni bet python programmers win
04:33devni don't know why, but i just feel it in my bones
04:34muhoohttp://www.vidarholen.net/contents/wordcount/
04:34devnokay, bed time for real now, but muhoo and arrdem and Raynes -- getclojure, ya'all. help me make something that makes people cry tears of joy for lambda jam
04:35arrdemdevn: later bro. I should hit the sack too...
04:35arrdemam I allowed to use bro in here? I can't tell and it's 4am...
04:35devndont call me bro, call me sis
04:35devnneed to avoid the brogrammer culture at all costs
04:36arrdemdevn: thinkslate.com is down
04:36devnheh, oh right, i own that domain too
04:37devnarrdem: ill put a picture of something super cool on there
04:37arrdemdevn: I mean I just went to stalk you and realized you had a dead link on github
04:37devnlike i did with: http://www.letmypeoplegolf.com
04:37arrdemfigured I'd mention it
04:37devnletmypeoplegolf is maybe my best work to date
04:39devn(hint: moses has a golf club instead of a gnarled staff)
04:39devn(hint 2: that's a celine dion midi)
04:39devn(hint 3: yes, i'm insane)
04:42muhoothat site is so 1995
04:42muhoohmm, no 1997. animated gifs, midi music. dude, you need a hit counter!
04:42arrdemwe're all mad here. now get to bed.
04:43muhooand flashing text
04:43arrdemwhat's the tag... <marque>?
04:43arrdemfor scrolling text?
05:09p_larrdem: marquee, I think
05:09arrdemp_l: that's the one.
05:53tomojclojure.core.rrb-vector.debug/dbg-vec is brilliant
06:00arrdemwould any of you be interested in an ARM powered ultrabook with 8 hour or more battery life?
06:02borkdudearrdem who isn't interested in that
06:02p_larrdem: if it had a) sensible firmware (something along the lines of OpenFirmware? EFI, I guess, could work too) b) sensible GPU c) enough cores and memory bandwidth to not annoy me with slowness ;P
06:03arrdemSince the RPi broke on the scene I've been trying to answer why there isn't a 15" laptop version
06:03arrdemand of late I've been kicking around the idea of doing a startup to sell exactly that
06:03arrdemI mean we're all nerds here and the business concept docs are pretty clear that I expect Linux-familiar devs to be the first buyers
06:03p_larrdem: ARM, with exception of recent windows efforts, leads to very... one-off products
06:04p_lalso, I want normal X11 support
06:04arrdemlol
06:05arrdemidk... I'm sure you and anyone else in this chan could boot whatever they wanted on it
06:05arrdemthe real question is what constitutes a "sane defaults" environment
06:06p_larrdem: "sane defaults" would be "actually having a firmware useful outside of embedded one-off products that won't crap on me just because the only thing it can do is read/write flash memory and talk over serial
06:07p_lso in case of, let's say, corrupted kernel (or actually wanting a simple way to change kernel) I can fix stuff without digging for serial link :)
06:07arrdemhum...
06:08p_lat least you could "make" vendors include a dump of openfirmware device tree instead of compiling in hardcoded memory addresses and parameters into kernel that fit only the device you have :>
06:08p_ltl;dr - first you need to actually define a platform, ARM doesn't give you one ;)
06:09arrdemp_l: I'm toying with the idea of simply being a raspbery pi compatable
06:10arrdemwhich is funny 'cause 30 years ago someone here started selling IBM compats
06:10p_larrdem: raspberry compatible would mean "slow"
06:11p_larrdem: the biggest win of RPi was the included proprietary bootloader that understood enough that it made hard to brick the device
06:12p_lbut I don't know if they offer any features to make, for example, a kernel that will boot both on RPi and another device without adding a ton of boilerplate that basically forms another firmware layer
06:12p_lfunnily enough, Win8 arm devices actually have that fixed, by including ACPI and EFI
06:15arrdemyou don't say XP
06:16p_larrdem: the good part was that the firmware didn't lock us out from *anything*
06:16p_lunlike on HTC :>
06:16arrdemI have no doubt that the same people who bought rpis would buy an rpi-based "hacktop pro" shall we call it.
06:17arrdemthe question in my mind is can I realistically scale that product beyond the hacktop market to actuall consumers before Asus etc. crush me.
06:18p_larrdem: netbooks mostly failed, but ChromeOS seems doing fine in that area
06:18arrdemespecially given that for the first time in really a decade we're seeing platform fragmentation from Microsoft with Windows for ARM
06:18arrdemp_l: my sense is that netbooks failed because they do less with less.
06:18p_larrdem: Microsoft, if not for some (IMO) errors is actually carefully trying to avoid that fragmentation
06:18p_lsomething that is also done by Android from start
06:19p_lhell, MS was mumbling about ditching x86 for a decade now
06:19p_lwhat *I* would like is a *real* ThinkPad
06:20arrdemI mean netbooks are physically small
06:20arrdemthat's a bitch to type on and soforth
06:20arrdemwhich doesn't help the fact that most of them are pretty underpowered.
06:20p_larrdem: it's a bitch to type on all new laptop's keyboards that I had access to, with possible exceptions of just mid-bitching in case of Dell Latitudes
06:21arrdemmy thought is that a slightly dressed-up rpi in a 15" chassis would suck little enough to get some traction.
06:21p_lthe pseudo-thinkpad's might be good in feedback, but have shitty layout
06:21arrdemthen iterate on the design cleaning up internals aw you go.
06:21arrdems/aw/as
06:23arrdemidk. we'll see if this can go anywhere. it may not be a blockbuster but there's a market for it.
06:24arrdemso it would seem at any rate.
06:25p_larrdem: just remember that getting all the rest of the stuff than just simple electronics is the hard part here :)
06:25p_land for fuck's sake, get something with performance
06:26p_lotherwise just driving any sensible-resolution screen will bog it down :)
06:26arrdemwe'll see but I'm confident that the first prototype will be a literal RPi in a 15" box.
06:26arrdemthe first production model may be better but who knows. this is all hot air atm.
06:28arrdembut yes. being able to see the framebuffer should not happen in this day and age.
06:30p_lhappens more often than it used to because FreeDesktop&co broke double buffering, I heard
06:36arrdemgads the disk is going to be the most expensive thing in this...
06:36arrdemthat's unexpected.
06:38p_luse MMC
06:38arrdemMMC?
06:38clojurebotTimMc: There is a Clojure patch on CLJ-1168 that seems like it should allow Leiningen to work with 1.5.0 and :jvm-opts ["-Dclojure.read.eval=unknown"] http://dev.clojure.org/jira/browse/CLJ-1168
06:38p_larrdem: SD card :)
06:39p_la lot of devices use the electrical interface but without the packaging
06:39p_ljust grab a fast one, maybe two and put them in RAID :D
06:39arrdemlol that's horrific
06:39arrdembut probably cheaper than a 64/128gb ssd
06:39p_larrdem: I've seen a laptop with vendor-made hw RAID-0 of two 128G SSDs
06:40arrdemp_l: if this thing rocks flash cards they'll probably be user-exchangable
06:41arrdemcase room is the least of my worries here.
06:41arrdemunless I want to fight the Macbook Air for the title of "most breakable paperweight"
06:42p_l... lol. Apparently those two SSDs? have higher bandwidth than RasPi *memory*
06:42arrdem-____-
06:43arrdemso looks like the pricepoint on this guy is going to be $250-$300 with "ssd" and battery.
06:43arrdemcase costs I have no way to estimate tho.
06:44arrdemoh I forgot keyboard & trackpad...
06:45arrdemp_l: what mobile keyboard did you like the most?
06:46p_larrdem: classic ThinkPad. I have R61, still great. T6x has the same one
06:48p_lyou're pretty much shit out of luck with non-hacker market anyway, so why not use the hackers to market your device to others :)
06:49p_lUnless you pack enough power and basically put something along the lines of ChromeOS on top ;)
06:51arrdemthat's the best option I suspect.
06:52arrdemI'm toying with the idea of an ARM Plan 9 build and trying to make a product out of having not shitty network filesystem support combined with a rewrite of the Linux 9p fileserver and a Windows 9p fileserver client
06:52arrdembut that's not a 0.1.0 kind of feature.
06:52arrdemhttp://arrdem.com/blog/draft/preview/85 what do you think?
07:17AnderkentAnyone know how to add a dependency to runs of `lein repl` that are not within a project? For example findfn
07:33arrdemAnderkent: add it to your lein dev profile
07:46hyPiRionAnderkent: add {:user {:dependencies extra-deps}} in ~/.lein/profiles.clj
08:05hans_hey. I am new to clojure and also dont have any experience with .net or windows development (at least since ~10 years or so). however, as clojure works with .NET would it be possible to build windows phone apps in clojure?
08:10corecodehyPiRion: scheme frustrates me :/
08:29AnderkenthyPiRion: that only works if i run `lein repl` in a directory with project.clj
08:30AnderkentI want exactly the opposite
08:30jweissany emacs users here ever get "Unmatched bracket or quote" trying to run vc-resolve-conflicts on a clojure file? Only workaround I can find is to turn off clojure-mode
09:06supersymwhat would be a use-case for protocols in clojure...like if you need certain Java interop over a line or? How are they much different from contracts? I'm a bit confused again :S
09:07supersymsome of the examples could also have been done in a different way
09:08supersymI guess what I mean to ask is what would constitute their use
09:09supersymah,.. never mind, found the answer: interop and polymorphism as I thought
09:09supersym><
09:11stuartsierraYes, protocols are mostly about polymorphism and grouping related functions.
09:12stuartsierraAs a side benefit, they can take advantage of fast virtual method dispatch on the JVM.
09:15ambrosebsstuartsierra: thanks for tools.namespace, using the dependency graph in core.typed. Reading through, it looks like adding (set! *warn-on-reflection* true) would cause tools.namespace not to find the ns form. Is that right?
09:15supersymsweet :) but a bit of an overkill perhaps for what I was exploring
09:15stuartsierraambrosebs: The `ns` form must be the first non-comment form in the file, if that's what you're asking.
09:15ambrosebsstuartsierra: ok, yes.
09:16stuartsierraI suppose it could scan the entire file, looking for an `ns` form, but that seems like overkill.
09:17ambrosebsstuartsierra: It's hard to know where to draw the line. Adding core `set!`s before `ns` seems common though.
09:18stuartsierraambrosebs: Really? I expect that to be controlled in tooling, usually.
09:21ambrosebsstuartsierra: I see it around the place. eg. CLJS analyzer. Not a big deal.
09:22stuartsierraambrosebs: Yeah, it's there. I usually assume that it's a leftover from development. I don't think it's a good idea to call `set!` at the top of a file that's going to be released in a library.
09:22ambrosebsstuartsierra: btw c.t.n.find has `import` instead of `:import` in the `ns`.
09:23stuartsierrareally? drat
09:24stuartsierrafixed
09:24dnolenstuartsierra: ambrosebs: funny enough in ClojureScript we actually use the analyzer to find ns forms in order to be more flexible.
09:25stuartsierramakes sense
09:27ambrosebsstuartsierra: A quick note on how the dependency graph handles cycles would be helpful.
09:29stuartsierraambrosebs: It doesn't.
09:30stuartsierraCycles aren't allowed.
09:31nadermanHey, without clojure.contrib can I still find "expect", "has-args", etc. from clojure.contrib.mock somewhere?
09:32pjstadig~contrib
09:32clojurebotMonolithic clojure.contrib has been split up in favor of smaller, actually-maintained libs. Transition notes here: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go
09:32pjstadignaderman: if you don't find it in that list, it didn't get migrated
09:32pjstadigyou could split it out yourself, or maybe someone already has, but i don't know
09:34nadermanpjstadig: yeah I saw that list, it's listed but without any info of where it went
09:34nadermanso i guess the answer is no
09:36ambrosebsstuartsierra: It wasn't clear at which point the input validation was performed. It's clear now it's at the graph level, perhaps consider adding a word or two in the readme?
09:37nadermanpjstadig: is there some other way I can locally just redefine a function as a stub for a test without that?
09:37ambrosebsstuartsierra: "c.t.n.dependency - generic non-cyclic dependency graph data structure"
09:38stuartsierrao
09:38stuartsierra*ok
09:45asalehrandom question ... why can't I type (my-record :my-key), while (:my-key my-record) works?
09:49tgoossensasaleh: because aparently you record doesn't implement the IFn interface
09:50stuartsierraRecords are maps, but they are not (by default) functions.
09:51tgoossensis it possible to (for whatever reason) to do (extend yourrecord clojure.lang.Fn ...)
09:51tgoossensprobably
09:52stuartsierrayes
09:52tgoossensgreat.
09:53tgoossensbtw stuartsierra, just saw your talk about patterns this morning, was very interesting ;)
09:54asalehtgoossens, thanks, because I'd like to use maps and my-record interchange-ably :)
09:55tgoossensasaleh: as I said, you can make it implment IFn (using extends) so that you actually don't have to care about that any more
09:55kastermatgoossens: link? (to the talk)
09:56tgoossenskasterma:http://www.infoq.com/presentations/Clojure-Design-Patterns
09:57kastermatgoossens: thx, summary certainly looks very interesting.
09:57tgoossensthe thing with tokens was new to me and seems very useful
09:59no7hingis there a way to have a queue in closures stm and pop it for elements?
09:59no7hings/closures/clojures/r
10:03jweissis there a reason records don't implement IFn the way maps do? is there any pitfalls to just adding it to all my records?
10:04jweissoh woops my colleague already asked this :)
10:04stuartsierrajweiss: It's a design decision, it's been discussed on the mailing list.
10:06supersymman my mind keeps drifting off about stuff I thought I knew but clojure throws around, or better said: how pure clojure is and how powerful the notions contained in it are
10:08supersymreally a work of art... Rich is either a genius or has been playing with computers a bit too much :D Probably a bit of both
10:23no7hing@weavejester: on clj-aws-s3: is that intended behaviour that exceptions (or more specific the SocketException) in the was java sdk get caught by the lib?
10:24weavejesterno7hing: On which function?
10:24no7hingput-object
10:25weavejesterno7hing: There's no catch in put-object
10:26john2xhello. how would one go about doing http requests with clojurescript?
10:26weavejesterIn fact… the only catch in the whole library specifically looks for AmazonServiceExceptions with a 404 status code.
10:26weavejesterjohn2x: Depends if you're talking in-browser xhrs, or node.js I guess
10:27john2xweavejester: in-browser xhrs. :)
10:30no7hingit's an internal one then before a retry, i still got the put request result instance back some times
10:30no7hingwill look deeper
10:34ravsterhello all
10:37devnheh, +1 to rich's -1 on anaphoric macros
10:55gfrederickshaha
10:55gfredericksmy favorite part about giving a macro talk was coming up with a list of guidelines (e.g., no anaphoric macros) and noticing that clojure.core violates basically all of them
10:56devnGuideline 1: We know you're clever. You don't need to prove it.
10:56hyPiRiongfredericks: anonymous function literals
10:57gfrederickshyPiRion: defmacro is an anaphoric macro
10:57hyPiRiongfredericks: is it?
10:57gfredericks&env and &form
10:57lazybotjava.lang.RuntimeException: Unable to resolve symbol: env in this context
10:57hyPiRionoh, hah
10:57gfredericks#() is a reader thing, so not an anaphoric macro strictly speaking
10:58gfredericksbut it definitely is one in spirit :)
10:58owengalenjonesanyone here have experience with pingles clj-kafka library?
10:58hyPiRiongfredericks: yeah, that was the point :)
10:59gfrederickshyPiRion: it's even crazier given that the meaning of the symbols varies based on which ones you use
11:00gfredericksit would have been comically arrogant if rich had instead replied with '-2'
11:01dnolengfredericks: is defmacro an anaphoric macro, or a fn def form w/ two invisible arguments?
11:01TimMcIt's anaphoric, since the caller does not specify the bindings.
11:01gfredericksdnolen: I'm not sure why the latter is not an instance of the former
11:01gfredericksan anaphoric macro will creating locals either with let or with fn; essentially the same effect
11:02dnolengfredericks: yes I was question the statement that defmacro is a macro
11:02gfrederickswell it certainly is in a technical sense
11:02TimMc...
11:02gfredericks,(.isMacro #'defmacro)
11:02clojurebottrue
11:03gfredericksnot sure what other sense you might be thinking of
11:03dnolengfredericks: yeah, I didn't realize that.
11:04hyPiRiongfredericks: Well, I think clojure.core is allowed to ignore all normal styles, really.
11:04gfrederickshyPiRion: agreed, it just gave me a chuckle
11:04hyPiRionheh
11:04gfredericksanother guideline was no side effects
11:04gfrederickswhich gen-class violates at the very least; haven't looked for others
11:04hyPiRiongfredericks: defmacro, perhaps?
11:04hyPiRion:p
11:05gfredericksdoes it?
11:05hyPiRiongfredericks: it changes the environment, doesn't it?
11:05gfredericks_expanding_ to something that side-effects is different from the macro itself having side-effects
11:05hyPiRionoh, okay, true enough
11:06gfredericksnow I'm curious what the other guidelines were
11:06hyPiRionThat would be fun: Make a library with only macros and say it's without any side-effects
11:06gfredericksnot deffing more than one thing was another
11:06gfredericksand defrecord/deftype do that
11:07hyPiRiongfredericks: so like, not defining a var twice you mean?
11:07gfredericksno
11:07gfredericksnot defining two vars
11:07hyPiRionoh, eh, in a single expression I suppose
11:07gfredericksunless perhaps you let the user list all the names
11:07gfredericksit's similar to anaphoric macros
11:08gfredericksI can imagine a defs macro that would be acceptable
11:08gfredericks(defs {:keys [foo bar baz]} {:foo 12 :bar 15 :baz 20}) for example
11:08gfrederickswhich defs foo, bar, and baz
11:10gfredericksthose were the stricter guidelines.
11:13kauschovarowengalenjones: a little bit, yes
11:13kauschovarowengalenjones: wrote a map-reduce job with it yesterday
11:16owengalenjoneskauschovar: when I try and implement the consumer example: https://www.refheap.com/paste/13292 clojure appears to connect but then hangs indefinitely and I dont see the output, did you have any issues with getting that to work?
11:17kauschovarowengalenjones: i only used the simple consumer, because i needed full control over when to commit the offsets to ZK
11:18kauschovarowengalenjones: no experience with the zk-consumer
11:18owengalenjoneskauschovar: gotcha, thanks anyway
11:19kauschovarowengalenjones: np. sorry i couldn't be more helpful
11:28gfredericksPedastal In Action has an interesting acronym
11:30TimMc?
11:31hyPiRionTimMc: PI(T)A?
11:31TimMchrm
11:43gfredericksoh
11:43gfredericksyeah forgot about the T
11:43gfredericksnevermind it would have an uninteresting acronym
11:58borkdudehow do I write a lobos migration to alter a column from a certain table to become unique?
12:00yacinso: http://pastebin.com/y2FgNwYy
12:01yacinwhen i run this, only the first prn goes to blah.log
12:01AnderkentIs there a ring middleware I can use to set charset for text responses?
12:01yacinthe one in the doseq goes to stdout
12:01yacinany ideas why?
12:02nDuffyacin: for the future, would you consider a pastebin without the big animated ads? We're partial to refheap.com herebouts (it being OSS and written in Clojure), but anything that doesn't offend anyone without an adblocker would be an improvement.
12:05yacinah, absolutely
12:06yacinhttps://www.refheap.com/paste/13295
12:06yacinto get in the habit :)
12:06yacinah, throwing it in a (do) fixes it
12:12alexnixonyacin: your 'doseq' isn't inside your 'binding' form
12:13yacinoh huh, didn't see that extra paren
12:13yacinguess i should keep paredit on in the repl
12:16Pure-Loulouhello room :)
12:17supersymola
12:17no7hingam i imagining things or is there a library in clojure that asserts that two numbers are both within a certain range?
12:17technomancy_no7hing: > does that
12:18no7hingi know, but it nags me that i think theres a lib
12:22Pure-Loulouhttps://www.refheap.com/paste/13298 any help?
12:22supersym... contains? sigh
12:22Pure-Louloui am newbie testing pmap
12:22borkdudeis it possible to see the generated sql from lobos?
12:23nDuffPure-Loulou: pmap exists mostly as a demo. It's only rarely useful in practice.
12:24hyPiRionPure-Loulou: pmap is not more efficient if the function you're mapping is very fast. You may want to use reducers instead (clojure.reduce I think)
12:24hyPiRionBut the best is to do benchmarking
12:24Pure-Loulouok i will read reducers :)
12:29borkdudeI'm trying this lobos migration, but it doesn't do anything: https://www.refheap.com/paste/13299
12:30borkdudeit would be good if I could see the sql it generated
12:36borkdudeI think forgetting :unique on a column is some unfortunate situation in lobos
12:36borkdudeI'm breaking the migration history.. f#$ this ;)
12:37weavejesterHmm… friend logs me in okay, but then adds nothing to the session. Does that sound familiar to anyone?
12:38no7hingweavejester: on the assert: was not a library but a discussion on SO after all http://stackoverflow.com/questions/6344454/clojure-range-case-macro
12:38ppppaulin compojure i want to match a url with '.'s in it
12:38ppppaulhow do i easily do this?
12:39gfredericksyou can't just include dots in the route pattern?
12:39ppppaulit will split the matcher on '.'
12:40gfredericksoh hmm
12:40hiredmanweavejester: I spent a while fighting with something similar that turned out to be the handler that was behind friend not passing the session it got through
12:40gfredericksso you want something like /:foo to match /one.two.three with {:foo "one.two.three"}
12:40ppppaul(ANY ["/:real-number" :real-number #"^-{0,1}[0-9]*\.{0,1}[0-9]+$"] [] some-handler )
12:40ppppauli want that to work
12:40hiredmanweavejester: the handler added it's own :session stuff and just tossed out friend's
12:41ppppaulso, sometimes there will be periods, sometimes not... i want them to be removed from the tokenizer
12:41borkdudecan friend also handle database user authentication and if so, is there some documentation/blog post about it?
12:41ppppaulor, i want to be able to define my token 'splitters'
12:41borkdudeI mean, user name/passwd from db
12:42weavejesterhiredman: Hm, I don't think that's the case here… but it's a possibility to investigate
12:42weavejesterppppaul: Why not make a part of the pattern optional?
12:42ppppaulhiredman, friend is hard to use
12:42hiredman*shrug*
12:42ppppaulweavejester, ?
12:42hiredmanworks for me (now)
12:43weavejesterppppaul: Hm, you're also using {0,1} which is odd. That's typically what ? is for.
12:43ppppaulmy regex-fu is weak
12:44weavejesterppppaul: Try: #"-?\d*(?:\.\d+)?"
12:44ppppauli have a lot of tests against these regexs, so i'm confident about them
12:44ppppauli made them so they would be easy to use/port to other engines
12:44hiredmanto be fair I haven't tried oauth or whatever else with friend
12:45ppppauloauth is a farce
12:45technomancy_oauth is fantastic if you can get away with outsourcing logins
12:45weavejesterppppaul: The ^ and $ are probably wrong too, because you don't want to match the beginning and end of the URI.
12:45technomancy_10LOC to implement oauth in https://syme.herokuapp.com by delegating to GitHub <3
12:45ppppauli'm not matching the url
12:46ppppauli'm matching a string that has come out of the tokenizer
12:46ppppaulcompojures tokenize splits on '/' and '.'
12:46ppppauli would like to remove the '.' for one of my routes
12:46weavejesterppppaul: No it doesn't :)
12:46ppppaulit doesn't?
12:46hiredmantechnomancy_: yeah, my pie in the sky place to go with this project would need to do something like that
12:47ppppauli have used it like such, though
12:47technomancy_hiredman: what's the project?
12:47weavejesterNope, not in the sense you're thinking, at least.
12:47ppppauli'll run some tests and see what happens
12:47hiredmantechnomancy_: my ideapad thing, the urls with clojurescript in an editor + an svg graphic on the side
12:48weavejesterppppaul: You have a route like: ["/:real-number" :real-number #"^-{0,1}[0-9]*\.{0,1}[0-9]+$"] correct?
12:48technomancy_hiredman: plz to steal if desired: https://github.com/technomancy/syme/blob/master/src/syme/web.clj#L94
12:48ppppaulyes weavejester
12:48hiredmantechnomancy_: sure, I just have to work out how I want it to work
12:48weavejesterppppaul: So that's going to be converted into something like: {:pattern #"/(^-{0,1}[0-9]*\.{0,1}[0-9]+$)" :params [:real-number]}
12:49weavejesterAnd the resulting regex doesn't really make sense.
12:49ppppaul...
12:49hiredmanI think I need some kind of delegration thing, maybe web intents, I am not sure oauth would actually play in to that
12:49weavejesterYou want a regex like: #"-?\d+(?:\.\d+)?"
12:50weavejesterOr #"-?\d*(?:\.\d+)?" rather
12:50ppppaulcan you give me a failing example?
12:50weavejesterppppaul: Something the regex won't match?
12:50ppppaulyeah, but something that i would expect it to match on
12:51hiredmanbasically I'd like to be able to let people sign in and then authorize the ideapad service to use some other clojurescipt compilation service
12:51weavejesterppppaul: "1f", "1.", "+1"
12:51ppppauli have a lot of tests, so i want to add to them and then change my matcher
12:52ppppauli tested against those
12:52weavejesterppppaul: The regex is essentially: optional "-", zero or more digits, optional (non-matching group: "." one or more digits)
12:52weavejesterppppaul: Are you testing the regex, or the route?
12:52ppppaulthe regex
12:53weavejester,(re-matches #"/(^-{0,1}[0-9]*\.{0,1}[0-9]+$)" "/1.0")
12:53clojurebotnil
12:54ppppaulwithout the '/'
12:54weavejester,(re-matches #"/(^-?\d*(?:\.\d+)?)" "/1.0")
12:54clojurebotnil
12:54weavejester,(re-matches #"/(-?\d*(?:\.\d+)?)" "/1.0")
12:54clojurebot["/1.0" "1.0"]
12:54ppppaul,(re-matches #"(^-?\d*(?:\.\d+)?)" "1.0")
12:54weavejesterThere we go
12:54clojurebot["1.0" "1.0"]
12:55jcromartiehttp://www.techempower.com/blog/2013/04/05/frameworks-round-2/
12:55weavejesterppppaul: Your route adds the "/" in at the beginning
12:55weavejesterA more simple example might show it better:
12:55jcromartiecompojure is lagging behind raw servlets, but beats the pants off most other dynamic language web libraries
12:56weavejester["/:foo" :foo #"[0-9]+"] => #"/([0-9]+)
12:56weavejesterjcromartie: It's not surprising. For the tests they ran Ring on top of Java servlets, so it was never going to be faster.
12:57technomancy_wow, yesod only barely beats rack?
12:59ppppaulweavejester, my real code (ANY ["/poi/:latitude/:longitude/with-radius/:radius" ...
13:00ppppauli have never had to include "/" in my regex for anything i've done with compojure param guards
13:00weavejesterppppaul: When you specify a custom regex, the routing library Compojure uses (Clout) just substitutes the custom regex into the regex it builds for the route.
13:00kauschovartechnomancy_: that surprises me, because yesod advertises itself as being very fast
13:00ppppaulyesod?
13:00weavejesterppppaul: No, *you* don't include the "/". The end regex includes the "/" because that's what you have in your route.
13:01ppppaulhmm
13:01kauschovarppppaul: yesod is a Haskel web framework
13:01kauschovar*Haskell
13:01weavejesterSo if your route is ["/foo/bar/:baz" :baz #".*"] then the regex generated is: #"/foo/bar/(.*)"
13:03jcromartieweavejester: do you think compojure could go faster? I think those results are fine BTW… not too shabby considering it beats the pants off of everything else that's popular right now
13:04weavejesterjcromartie: Oh definitely. Java servlets are basically doing a bunch of work that Ring never uses.
13:04weavejesterjcromartie: Cut out the middle man and there's a lot of stuff you wouldn't need to do.
13:05ppppaulweavejester, oh my
13:05technomancy_I'd rather see effort going to other things personally
13:05weavejestertechnomancy: Yeah, I'm not in a hurry to write my own HTTP server :)
13:05gfrederickscompojure-in-compojure
13:06weavejesterAlthough… there must be some Java servers that expose a lower interface.
13:08weavejesterYeah, it looks like Netty allows you to get the raw request, before cookies and sessions and parameters are parsed.
13:08weavejesterIn theory an adapter written against raw netty would be pretty quick.
13:08supersymah
13:09ppppaulcake looks like crap
13:09no7hingaloha could probably help there
13:09mthvedtit amazes me how slow many old web frameworks are
13:09mthvedthosting costs must have been through the roof back then
13:10jcromartiecompojure on Netty?
13:10no7hingor crowds just way smaller ;)
13:10jcromartiealeph does channels on Netty right?
13:10weavejesterThere's a netty adapter that seems to do without the servlet compatibility layer: https://github.com/datskos/ring-netty-adapter
13:10no7hingyes
13:10weavejesterYeah, but I'm not sure how quick channels are
13:10jcromartiechannels are a bit of overhead
13:10no7hingthey have their cost
13:10jcromartiebetter for complex dataflows than performance purposes, but it does gain some by using Netty
13:11weavejesterWell, I assume in this case we're talking theoretical peak performance, rather than anything you'd actually use in the vast majority of cases.
13:12jcromartieyeah
13:12jcromartieanyway, Compojure does the job :)
13:12jcromartieyou should be proud to see it near the top of the list
13:13supersymI should be really diving into Compojure soon then :)
13:13supersymthats what ppl are using in production mostly?
13:14weavejestersupersym: As far as I'm aware.
13:16supersymcool
13:17ppppaulring + compojure + something else supersym
13:17ppppauli use liberator atm, with compojure for route matching
13:20supersymalright.. I'm just asking because in a few months I'll need to be making my money and most work is in web dev anyway... But I went through Node.js ecosystem quite fast and somehow ended up here :)
13:21supersyma lot will be frontend work with semantics/seo so hiccup/enlive should do most of the time
13:22supersymI guess hiccup doesn't have functions for web 2.0 vocabularies yet? :P
13:25ppppaulnode.js is hell
13:25ppppaulhiccup is hell
13:26ppppaulhell is hell
13:26n_bppppaul: you mean node.js(funtion(res) { res.is(function(res) { return res.hell;} ))))
13:27FoxboronSay i wanna write a Scheme interp in Clojure. What parsing libs should i use? Been sniffing on Parsatron, but not sure if there are better options.
13:33billy_beanieim using println to print stuff but when i change it to print nothing comes out, why?
13:34technomancy_Foxboron: s-expressions are so easy to parse that using a library could be considered overkill
13:35Foxborontechnomancy_, well. Considering i wanna learn how to parse other stuff aswell, i think using libraries are just fine.
13:35technomancy_ah, well that's different =)
13:35timsgardnerdnolen: Doing some js interop stuff that would benefit from pattern matching… would you say the clojurescript version of core.match is production-ready, for simple stuff?
13:35FoxboronScheme is just because...well...1) its lisp. 2) look at 1
13:36technomancy_personally I would bootstrap off clojure.core/read and circle back to writing your own reader once you got the fun stuff working
13:36Foxborontechnomancy_: i lack the general logic thinking of how to even contrsuct a parser and interp. So gotta start somewhere
13:37supersympppaul: might be true but I cared for RAD times a lot and that helped a lot using coffee/stylus/jade/markdown because I work with developers and customers who are very picky about their front-ends :P
13:38supersymand I can't spend ages hand-writing everything so character-cutting was/is very important
13:39supersymusing clojure I'd get extremely powerful functions and sanity back, and parens..which is ok :P
13:40billy_beanieim using println to print stuff but when i change it to print nothing comes out, why?
13:41TimMcbilly_beanie: You may need to flush the output stream.
13:41TimMc&(use 'clojure.repl)
13:41lazybot⇒ nil
13:41TimMc&(apropos "flush")
13:41lazybot⇒ (*flush-on-newline* flush)
13:43billy_beanieokay let me try calling flush after my prints
13:43billy_beanieah there we go
13:43billy_beaniethanks TimMc
13:43billy_beaniewhy do i have to do that?
13:45dnolentimsgardner: yes it works for simple stuff as far as I know. A few people use it.
13:47borkdudeis this a valid approach in korma? https://www.refheap.com/paste/13302
13:48borkdudeit works, but I want to know if it 'the korma way'
14:02nzborkdude: seems ok to me
14:05devnDoes anyone know if there's a library in Clojure that deals with transfinite numbers?
14:05timsgardnerdnolen: cool, thanks
14:06devnMy coworker is interested in building a library and I'm trying to steer him in the right direction.
14:07stuartsierradevn: I'm curious: what's a use case for transfinite numbers in a program?
14:11devnstuartsierra: i'm typing for him: He doesn't really know yet. He's short answer was: "Because you can." ;) -- That being said, he thinks there might be some implications for scheduling.
14:12devns/He's/his/
14:12stuartsierraInteresting.
14:13stuartsierraWell, I hope he has fun with it. :)
14:15jonasendnolen: the following suprised me: (run* [q] (fresh [a] (membero a [:foo :bar]) (== q :baz))) ;; => (:baz :baz)
14:15jonasendnolen: but it works the same way in minikanren-simple so I guess it's known behaviour?
14:16stuartsierraWow, I think I understood that.
14:16stuartsierraIt's backtracking: there's one path for each possible binding of `a`.
14:17dnolenjonasen: expected behavior for sure.
14:18jonasendnolen: ok
14:19dnolenjonasen: just because the user doesn't include some variable in the result doesn't mean we can throw away answers.
14:21jonasendnolen: that makes sense. If I want to know the number of answers for a run* I can always do (distinct (run* ...)) so it should not be problematic
14:27gilbertw1Anyone using Sublime Text 2 to develop Clojure?.....if so, is there any syntax highlighting files available that are better than the one that it ships with?
14:29timsgardnerdevn: that's kind of a teaser… what scheduling implications might there be?
14:29timsgardnerdevn: I see there's a transfinite type class for Haskell
14:35devntimsgardner: heh, I really can't speak to that. He mentioned something about long-running processes and determining the order that certain operations should execute. He also alluded to von Neumann and how he studied the ordinals and transfinite numbers.
14:36arkhis there a more succinct way to get at a value matched in a regular expression than: (second (apply seq (re-seq #"foo=(\d+)" "this is foo=10")))
14:37n_b,(second (re-seq #"foo=(\d+)" "this is foo=10"))
14:37clojurebotnil
14:37devntimsgardner: thanks for the heads up on the transfinite type class
14:38devntimsgardner: I'd be happy to hook you up with him if you guys want to discuss. I think he's looking for someone more mathy than me to talk about this with. :)
14:39timsgardnerdevn: yah. It's kind of interesting, looks like the Haskell motivation was to avoid some awkwardnesses associated with floating point conversion
14:40n_barkh: It's because you're getting each match group, not each match
14:41arkh,(second (apply seq (re-seq #"foo=(\d+)" "this is foo=10")))
14:41clojurebot"10"
14:41n_bsee ##(doc re-groups)
14:41lazybot⇒ ------------------------- clojure.core/re-groups ([m]) Returns the groups from the most recent match/find. If there are no nested groups, returns a string of the entire match. If there are nested groups, returns a vector of the groups, the first element being the entire match. nil
14:42timsgardnerdevn: I'm rather rusty on my set theory these days, I'm afraid. But I like the idea of someone finding a use for transfinite arithmetic etc, since it's often used as an example of pointless math
14:42arkhn_b: that's cool - it just seems like a person has to go through some acrobatics to do something (imho) that's simle
14:42arkh*simple
14:43arkheven more so to, say, add a series of matches:
14:43arkh,(+ 1 (Integer/parseInt (second (apply seq (re-seq #"foo=(\d+)" "this is foo=10")))))
14:43clojurebot11
14:43devntimsgardner: can i private message you?
14:44timsgardnerdevn: think so :)
14:44n_barkh: You could just do (map last (re-seq pattern s))
14:45n_band I'd rewrite that adding example using a threading macro, since it's really piping data
14:45amalloyarkh: (apply seq x)? isn't that just (first x), except that it fails unless x is a seq of seqs?
14:46n_barkh: Yes.
14:46n_bwoops, meant amalloy *
14:47arkhamalloy: I was using (first x) initally but it would select the whole vector returned by re-seq
14:48arkhn_b: (map last ... ) might be nice but it returns a list instead of the inner value
14:49arkh,(map last (re-seq #"foo=(\d+)" "this is foo=10"))
14:49clojurebot("10")
14:49n_barkh: I'm aware, but I'm assuming you want this to work for a non-contrived example where there might be multiple matches
14:50arkhn_b: with the data I'm using there should be either a single match or non match ... the initial group of code I'm using fails on nil
14:51n_barkh: then use (comp second first) (re-seq...))
14:52n_barkh: or actually, (comp peek first) will be (imperceptibly) faster
14:53n_band if it fails on nil, then you might want to have an (if-let) as well
14:54arkhn_b: processing ... : )
14:55ztellmanjcromartie: a little late to the conversation, but aleph has > 90% of the raw performance of a basic netty adapter
14:56ztellmancloser to 95%, looking at the benchmarks again
14:56n_barkh: e.g. user=> (if-let [res ((comp peek first) (re-seq #"foo=(\d+)" "this is foo=10"))] #_=> (-> res Integer/parseInt inc) #_=> nil)
14:56ztellmanand that's not "channel overhead", that's adding support for pipelined requests, etc.
14:57arkhn_b: sorry, I'm not following the usefulness of (comp second first) or (comp peek first) in this case
14:58n_barkh: You want the last result (the matched group) of the first result returned by re-seq, no? It's simply an easier way of writing (peek (first (re-seq...))
14:58n_barkh: you might be better off with re-find though
14:59n_b,(re-find #"foo=(\d+)" "this is foo=10")
14:59clojurebot["foo=10" "10"]
14:59n_b,(re-find #"foo=(\d+)" "this is foo≠10")
14:59clojurebotnil
15:01arkhn_b: that gets around the seq related issues, so that's cool
15:02n_barkh: So what's the next problem? :)
15:02arkhsomewhat related, is there a shorthand for filtering nils? Something better than (filter #(not (nil? %)) ... )
15:02arkhn_b: ; )
15:03arkhe.g. (fnil) replaces a nil with a default, I'm just looking to filter
15:03fbernierarkh: remove perhaps
15:04n_barkh: ##(remove nil? [1 nil 2 nil 3])
15:04lazybot⇒ (1 2 3)
15:04fbernier(remove nil? ...)
15:04n_bor (filter identity lst)
15:04n_boh, that'll remove falses
15:05fbernierHow nice it feels to be a clojure/lisp noob and to know the answer to a question ...
15:05arkhremove looks good - thank you
15:05fbernier:)
15:05borkdudednolen where can I find some benchmark data on clojurescript?
15:05arkhfbernier: :D
15:06n_bfbernier: The questions in here are either solved by those with extensive Clojure & JVM experience or easily done by anyone who has memorized the clj cheatsheet :D
15:07n_barkh: If you haven't, I'd recommend running through some of the 4clojure problems up to 70-80. It'll teach you lots of tricks about working with seqs and lots about the core namespace
15:08arkhn_b: that's a good call ... I need some rounding out : ) Thanks for your help
15:09n_barkh: My pleasure! It's good to be the one answering a question for once :)
15:09lypanovI enjoyed projecteuler a lot just for getting my head about lisp syntax.
15:09lypanovaround*
15:09n_bHopefully I haven't lead you astray somehow :P
15:10n_bJoC after Clojure Programming IMO
15:10lypanovn_b: agreed.
15:10n_bI started with JoC, felt totally lost, and then it completely clicked after doing some little projects, 4clojure, and reading through Clojure Programming
15:11n_bSuper excited for the 2nd edition to come out. Have a few places in my app where core.logic is going to be very handy
15:11lypanovI do things backwards. So I did projecteuler. Then put clojurescript code into production. And then read JoC.
15:11lypanov(didn't read Clojure Programming but I've heard great things)
15:12mthvedtis there a version of lazy test that works with the latest leiningen?
15:12dnolenborkdude: what kind of benchmark data?
15:12borkdudednolen the kind you showed here some time, I vaguely remember it
15:12lypanovdnolen: fwiw just migrating our app from js+knockout.js to javelin+cljs.
15:13lypanovdnolen: cljs completely changes my motivational level. utter joy.
15:14dnolenborkdude: I just made various ones by hand and put them on jsperf.com
15:14n_blypanov: Are you using EDN as well?
15:14dnolenborkdude: there's also http://www.50ply.com/cljs-bench/
15:14lypanovn_b: no no clojure. just clojurescript.
15:14lypanovhosting story too complex for now.
15:14borkdudednolen ok tnx
15:15n_bI'm tempted to use Clojure from front to back for my projects, but too worried about others being able to extend it once I've graduated
15:15lypanovn_b: using the cute jayq ajax let macros.
15:15lypanovn_b: honestly if you're using clojure on the backend you're already at such a level that you shouldn't worry.
15:16AimHeren_b, make your project good enough that it's bait for proto-Clojurists
15:16lypanovn_b: only complex part of cljs for me has been advanced builds mixed with js.
15:16dnolenborkdude: though that last link may be out of date.
15:16dnolenlypanov: sweet!
15:17n_bAimHere: That's the plan ;)
15:18n_bWorking on quantitative literature research, so all the flexibility of LISP+JVM interop is a match made in heaven.
15:19octagonhi, how can i do pr-str on strings that contain escape codes? ex: (pr-str "\033[0m")
15:21octagoni.e. (count (pr-str "\033[0m")) should return 9, but it actually returns 6
15:24joegallowhy should it return 9?
15:24octagonjoegallo: oh wait, i see what you mean
15:27arkhoctagon: do you meant to use "\[\033[0m\]" instead?
15:27arkh*mean
15:28octagonarkh: yeah i dodn't think that \033 was a single character, so i guess clj is right :)
15:31SegFaultAXoctagon: Why wouldn't that be a single character?
15:31octagonSegFaultAX: no, it would. i was just confused
15:32SegFaultAXoctagon: Ah.
15:32fberniern_b: im at 71 problem solved on 4clojure ... probably why I could answer the question earlier ;)
15:34SegFaultAXSpeaking of 4clojure, it just crashed.
15:40jcromartieack! the code about halfway down this page is painfully weird http://java.dzone.com/articles/promises-and-futures-clojure
15:57ebaxt_I've ported most of rack-rewrite, but I can't decide if I should bother with send_file/x_send_file rules. Need it? https://github.com/ebaxt/ring-rewrite/blob/master/README.md https://github.com/jtrupiano/rack-rewrite#send_file-x_send_file
16:02mpenetjcromartie: most of the pain points or missing features he mentions are covered by libraries such as lamina, or cljque (this one seems to be a playground for what could be improved core promises/futures I think)
16:02jcromartienot to mention an async callback in a future is not hard at all
16:02jcromartie(future (do-something) (callback))
16:02mpenetyeah...
16:03stuartsierrampenet: Yes, cljque is an experiment.
16:03mpeneton a promise tho it's not possible at the moment, you have to do it manually as well
16:03mpenetstuartsierra: very cool stuff still, I like how it's taking shape
16:03stuartsierrathanks
16:04SegFaultAXstuartsierra: Is there something like it stable and ready for usage?
16:04stuartsierrano
16:05mpenetSegFaultAX: lamina is a bit similar in some way, but the vocabulary and underlying concepts are a bit different
16:06stuartsierraSegFaultAX: You're welcome to use it, of course, but I can't make any guarantees.
16:06SegFaultAXmpenet: I'm not married to the PromisesA protocol, but something along those lines would be really useful.
16:07mpenetSegFaultAX: lamina result-channels are close to promises
16:07mpenetbut tbh I would prefer something like cljque in core
16:08mpenetif it ever gets aproved/improved
16:09SegFaultAXmpenet: I don't think it needs to be in core.
16:10stuartsierraPromises are much more useful if everybody agrees on the same implementation.
16:10mpenettrue, but there are discussion about improving both future and promises
16:10SegFaultAXIt can be under the Clojure project umbrella like core.logic and core.match, but I don't really care if it's part of clojure.core proper.
16:10mpenetright
16:11rabbit_airstrikeanyone have any up-to-date resources on using ritz?
16:12mpeneteither way as stuartsierra said, having "one way to do it" would probably be better for everybody.
16:12stuartsierraIt's unfortunate that the JDK doesn't include an interface for this, so there are multiple competing implementations: Guava, Scala, etc.
16:13mpenetyes :/
16:14SegFaultAXstuartsierra: What, a PromisesA implementation?
16:15stuartsierraSegFaultAX: Not necessarily PromisesA, but a simple interface for "Callback when a Future is completed."
16:15stuartsierraWith that, we'd have a chance of making interoperable implementations.
16:15SegFaultAXAndroid has something like it with its AsyncTask implementation, I think.
16:16stuartsierraYeah, lots of libraries / frameworks have something *like* it. But there's no common interface for them to standardize on.
16:16SegFaultAXThey don't really compose in any meaningful way, though.
16:17SegFaultAXstuartsierra: Is this something you're still actively investigating?
16:17stuartsierrasort of
16:18jeremyheilerJDK8 will have Promise called CompletableFuture, I think.
16:19stuartsierraYeah, Java 8 is going to solve all problems ever. ;)
16:20SegFaultAXIs there already an established road map for Java 9?
16:20jeremyheilerhaha
16:21stuartsierraJava 9 will be so advanced it will actually write your code for you. :P
16:21jeremyheilerIt's about damn time!
16:23antares_SegFaultAX: there are some JEPs for JDK 9 already :)
16:23antares_SegFaultAX: mostly around the VM, though, those things take a long time to implement
16:23technomancy_"Java 1 was of the 90's. Java 5 generics came from the 70's. Java 8 lambdas come from the 40's. Java 20 will have a steam regulator."
16:24technomancy_https://mobile.twitter.com/jamesiry/status/250248275406491648?p=v
16:24stuartsierra:)
16:32konrcan't bind ♥ in a let in cljs :(
16:36borkdudehath korma something to help me not to manually having to trim things?
17:18borkdudehmm, I put a dependency from webjars in leiningen
17:18borkdudebut the resources from it don't seem to be available in my ring app
17:20borkdudeah got it (wrap-resource "/META-INF/resources")
17:32borkdudehmm, now that I added (resource/wrap-resource "/META-INF/resources") to my handler middlewares, the route "/" is returning an empty page
17:37borkdudeany idea why this happens? https://www.refheap.com/paste/13311
17:47borkdudewhen I remove line 18 the "/" page gets served normally
17:47borkdudebut then I don't get the webjars resources
17:57arrdemwhat's the replacement for noir.statuses?
18:55devnHmm, does anyone here use ritz and set breakpoints?
18:55tieTYTdid there used to be a clojure blip.tv?
18:55devntieTYT: yes
18:55tieTYTwhat happened?
18:55devnthose videos were moved to youtube i believe
18:56tieTYThttp://www.youtube.com/user/ClojureTV ?
18:56antares_tieTYT: yes
18:56tieTYTcool
21:08mmitchellanyone know of a good mocking library, besides midje? I found the old contrib mock lib, but it doesn't look like it's being maintained anymore.
22:32tieTYT2does clojure have something like haskell's zip?
22:33jeremyheiler~zip
22:33clojurebotzip is not necessary in clojure, because map can walk over multiple sequences, acting as a zipWith. For example, (map list '(1 2 3) '(a b c)) yields ((1 a) (2 b) (3 c))
22:33jeremyheiler:-)
22:33tieTYT2oh right
22:33tieTYT2i forgot about that
22:33tieTYT2thanks
22:33jeremyheilernp!
22:33tieTYT2so how could I use map that way, but pass each of these into a function so that 1 is the first param and \a is the second?
22:34tieTYT2would that just be (map my-function l1 l2)?
22:35jeremyheilerThat's exactly what the example shows.
22:35tieTYT2ok cool
22:35tieTYT2thanks
22:35jeremyheilerOh wait, nevermind.
22:35jeremyheilerGah, nevermind on that nevermind.
22:35tieTYT2:)
22:37jasonjckndnolen: is core logic smart about <? I know you can 'project' into clojure but that's not very efficient as it has to execute the clojure function for each element in the set that could be matched
22:38jasonjckndnolen: is project the only supported way to get inequality ops
22:43dnolenjasonjckn: you don't need project for < anymore, you have FD stuff now
22:43jasonjckn"FD" stands for?
22:43dnolenfinite domain
22:44dnolenjasonjckn: constraint solving over natural numbers
22:44jasonjcknk, I used core.logic extensively 1 year ago, sounds like there's some new features
22:44dnolenjasonjckn: yeah quite a few new things.
22:44jasonjcknis there a description of all the new stuff?
22:44jasonjcknand/or tutorial
22:45dnolen(run* [x y] (fd/in x y (interval 1 10)) (fd/< x y)), works
22:45dnolenjasonjckn: no not much in way of a tutorial for the news things yet.
22:46jasonjcknk
22:46jasonjckni'll try to figure it out
22:47dnolenjasonjckn: I think's some basic description in the wiki.
22:47jasonjckndnolen: couldn't you write a thin clojure wrapper around mozart/oz ?
22:47jasonjckndnolen: is the tradeoff just the IPC?
22:48jasonjckni guess lack of user defined functions is a big one
22:48dnolenjasonjckn: it worth considering hooking into external solvers yes, though Mozart/OZ is quite a behind stuff like GeCode or JaCoP
22:48dnolenjasonjckn: yes, I think it would just be less flexible. gotta run.
22:49jasonjcknkk seeya