#clojure logs

2015-10-13

00:17mungojellyi want to insert something every nth item in a sequence, i did (filter #(not (= % filler)) (interleave thingiwantlotsof (concat filler (take n thingiwantoccasionally ... but that seems silly? :)
00:18justin_smith,((fn every-nth-fill [item coll n] (apply concat interleave (partition-all n coll) (repeatedly item))) :spacer (range 10) 3)
00:18clojurebot#error {\n :cause "Wrong number of args passed to keyword: :spacer"\n :via\n [{:type java.lang.IllegalArgumentException\n :message "Wrong number of args passed to keyword: :spacer"\n :at [clojure.lang.Keyword throwArity "Keyword.java" 97]}]\n :trace\n [[clojure.lang.Keyword throwArity "Keyword.java" 97]\n [clojure.lang.Keyword invoke "Keyword.java" 110]\n [clojure.core$repeatedly$fn__5099 in...
00:19justin_smith,((fn every-nth-fill [item coll n] (apply concat interleave (partition-all n coll) (repeat item))) :spacer (range 10) 3)
00:19clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.core$interleave>
00:19justin_smith,((fn every-nth-fill [item coll n] (apply concat (interleave (partition-all n coll) (repeat item)))) :spacer (range 10) 3)
00:19clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Keyword>
00:19justin_smith:P
00:19mungojellythat makes more sense yeah, partition into the pieces, put the spacer between, yeah that expresses what i'm doing thanks :)
00:20justin_smith,((fn every-nth-fill [item coll n] (apply concat (interleave (partition-all n coll) (repeat [item])))) :spacer (range 10) 3)
00:20clojurebot(0 1 2 :spacer 3 ...)
00:23mungojellyok somewhat related question, i've taken 200000 of that pattern, and then i want to go in and change some stuff in the long version, but it seems silly to keep a zillion repetitions to express that i want to change something in the middle, is there something for expressing that idea of "this repeated, but with these changes"
00:24justin_smithmungojelly: you may be able to express your pattern using take / repeat / cycle? how to express it in code would really depend on the pattern
00:26mungojellyi can write what i want easily enough i think, i just want to have a patch set like [[12345 :q] [123255 :z]] and then build a seq that takes the patch if available or else the base sequence
00:26mungojellyit takes forever to know what's NOT out there already so i know when i need to spell it out :)
00:28mungojellyi just found out today about bardo which does all sorts of interpolation, i could write out any of those ideas of how to interpolate but it's so much nicer to just have them all at hand and bang around with them
00:30mungojellythere's no concept already of like a sparse sequence, so you just give it the indexes of the things that ARE filled, and then when you pull on it it gives you "nil" or a default unless you've got something there
00:30mungojellyoh i think i saw a matrix package, that must have sparse matrixes, i'll look tehre
04:12tdammersso I'm getting "Unsupported operation: can't eval locals" when trying to call a macro inside a macro
04:13tdammerswhat does that mean? what am I doing wrong?
04:22Kneivatdammers: Can you check it with macroexpand?
04:23tdammersnope
04:23tdammersit doesn't compile
04:23tdammersI'll try to come up with a minimal case, hold on
06:22shouryaGoing a little off topic here, any easy language to learn?
06:25tdammersshourya: depends on what you already know, how deep you are willing to dive, and what kind of goals you have
06:25tdammersshourya: some languages are easy to pick up but get progressively harder as you do more complex stuff; others have a steeper learning curve but pay off eventually
06:26shouryaI'd go with the steeper learning curve languages.
06:26shouryatdammers: what's the first language you started with?
06:28algernonsteeper learning curve, but great benefits, I'd say Haskell.
06:28tdammersalgernon: ;)
06:28tdammersshourya: Pascal
06:29tdammersshourya: would not recommend as a first language these days, but it wasn't too bad
06:33shouryaAh thanks guys!
06:51shterrettI need to generate a list of Timezones. I was trying to `(import ‘[org.joda.example.time TimeZoneTable])`, but I get a ClassNotFoundException org.joda.example.time.TimeZoneTable error.
06:51shterretthttp://www.joda.org/joda-time/timezones.html
07:08Kneivashterrett: and you have joda time in your dependencies?
07:08shterrettI’m able to import org.joda.time DateTimeZone without a problem
07:09shterrettBut I haven’t explicitly specified it
07:11shterrettAdding org.joda.time or org.joda.example.time gives me a “Could not find artifact in clojars” error
07:14oddcullyshterrett: maybe one of your already established deps brings in joda-time and maybe with some incredible old version
07:15oddcullyshterrett: i'd check the deps in the project first to see what's up
07:15shterrettoddcully: joda isn’t in the existing deps; is there a way to check the version from the repl?
07:16oddcullystart with a `lein deps :tree` first
07:17shterrettoddcully: joda-time is a dependency of selmer; version 2.7
07:18oddcullyoh wait... example
07:18oddcullyi doubt, that this is part of the jar or gets packaged in any jar
07:19shterrettthe docs say “This table can be rebuilt by running org.joda.example.time.TimeZoneTable”
07:19shterrettBut I can only do that if I have the source?
07:20shterrettIs there another way to list timezones? I’m trying to give users a way to select their timezone in a web form
07:20oddcullywhy not look at the examples source and adopt it yo your needs? https://github.com/JodaOrg/joda-time/blob/master/src/example/org/joda/example/time/TimeZoneTable.java
07:22shterrettI can do that; I can also copy the generated table and save it as an array. I was just hoping to reuse existing code.
07:24oddcullywell i think the example is what it is: an example. gathering the zones and turning it into html should be separated in your code. but ymmv
07:27shterrettah - I see. I thought the class call referenced in the documentation was just a list of the zones. I didn’t realize it was building the html
07:27shterrettI was planning on doing that part; I just wanted a canonical list of the timezone names
08:03kungiWhat can go wrong in the wiring if goog.require("some_cljs_file.clj") cannot find the namespace?
08:09kungiAAAARGH!
08:09oddcully(inc rubberduck)
08:13kungioddcully: It took me ~40 Minutes to recognize I needed an ^:export on a function.
08:14kungiSometimes I would prefer doing something with wood instead computers.
09:06kungiWhich header do I have to set in a GET request to request edn output from my api instead of json?
09:08oddcullykungi: have you tried Accept: application/edn
09:08kungioddcully: no i haven't :-)
09:09jonathanjis liberator a popular library?
09:09jonathanj(i like it but i don't see many people talking about it)
09:09kungioddcully: \o/
09:09kungioddcully: that was easy
09:10jonathanjswagger has some really appealing properties but there doesn't seem to be much discussion about using swagger and liberator together
09:11kungijonathanj: I had a look at liberator, but the lack of swagger support turned me off. Currently I am using compojure-api
09:11jonathanji just found yada, it seems interesting after a 60 second glance
09:12jonathanjkungi: how are you finding compojure-api?
09:14ikitommi_jonathanj: many people have been asking about Liberator + Swagger, and I know some guys who have poked with it.
09:16ikitommi_ring-swagger provides a clean model for describing the endpoints with schema. used also by compojure-api & yada.
09:16kungijonathanj: It works most of the time. I don't like the compojure routing style very much since I've seen bidi which looks way cleaner.
09:17ikitommi_and there is also pedestal-swagger (https://github.com/frankiesardo/pedestal-swagger) and we are working on a CQRS+lib with Swagger.
09:21kungiikitommi_: When I define a schema where some keys are schem/Int they don't show in the swagger-ui in the "Model Schema" section as required parameters. Is this a known problem?
09:40ikitommi_kungi: not sure what's the case, could you write an issue (with details) of it?
09:42ordnungswidrigmaintainer of liberator here. I'm not a big fan of swagger although I'm absolutely not against it. Unfortunately I'm pretty much the only maintainer of liberator and I'm spending my time more on fundamental issues. I'd welcome any patch or additional library to marry liberator and swagger!
09:42kungiikitommi_: sure
09:45ikitommi_ordnungswidrig: but, what do you think if i collect the guys who have been poking with that and we could have google hangout to discuss if how (and by whom) it could be done? (co-author of ring-swagger here)
09:47ordnungswidrigikitommi_: that sounds like a good idea. I'd love to have people be able to build something like a swagger integration with it. What should be possible today is to declar "swagger model" and convert that to a liberator resource declaration e.g.
09:57jonathanjikitommi_: sorry if this is a stupid question, but it's not particularly clear how ring-swagger and liberator interact
09:58ordnungswidrigthey don't
09:59jonathanjordnungswidrig: why aren't you a fan of swagger?
10:00ikitommi_yes, they don't. best way would be to make Liberator resource publish it's swagger-endpoint info out in the schema defined by the ring-swagger, for the routing-swagger integration to use.
10:01ordnungswidrigTo me swagger looks very much procedural, focusing on "api calls". I'm more into the "resource model" like HTTP promotes it. I.e. resources which are represented by media types and are manipulated in an uniform way by methods. Swagger is a case of out-of-band documentation while a RESTful architecture promotes hyperlinking and discovery.
10:02ordnungswidrigSo I'm not against swagger, which might be useful for "published, versioned" APIs. But that's not my usecase :)
10:02jonathanjisn't that totally orthogonal to Swagger itself and more of a user-chosen usage?
10:03jonathanj(promoting hyperlinking and discovery)
10:05ordnungswidrigjonathanj: yes and no. Swagger published typically a "single view" on and application. Whereas in a RESTful architecture you have individual and independent resources which happen to link to each other. In the latter architecture you could crawl the web and gather the same information. I think that swagger lead developers of skip the discover part and hardcode urls, media
10:05ordnungswidrigtypes and relations.
10:06jonathanjyada and liberator seem to have very similar ideals
10:07ordnungswidrigjonathanj: the have very similar developers: Malcolm Sparks who is the main dev of yada helped a lot with liberator :)
10:08jonathanjhttps://github.com/juxt/yada/blob/master/dev/resources/user-manual.md#liberator
10:08ordnungswidrigI yada would not have the dependency on manifold for async, you could implement it on top of liberator.
10:10jonathanjhaving used liberator a few times, i think the biggest draw yada (well actually swagger has) is the documentation
10:10jonathanji have no desire to sync separate markdown files with the code and host them somewhere
10:11ordnungswidrigIt should be possible to extract docs of the liberator resource declarations, or make it available for OPTIONS requests.
10:12jonathanjwell, it is just code so "possible" is not in question, it's more about convenience
10:12ordnungswidrigOne problem with liberator is that the callbacks are functions which tend not to serve well as documentation. But many of the decisions actually use "static" declarations like :available-media-types which could be used for docs.
10:13jonathanjdocumenting :available-media-types is of relatively little value though
10:15ordnungswidrigjust an example. but in my opinion the available media types (and the documentation of them) are the single most important information about a hypermedia resource
10:15jonathanjthat's the tail end of the problem though
10:16jonathanjfirst you have to know what the resource's purpose is and how it fits together with the rest of the service
10:16jonathanjonce you have an abstract understanding of that then you can start worrying about how they're represented
10:16jonathanjimo
10:17jonathanjordnungswidrig: anyway, this is mostly wishful thinking because there isn't anything to take the documentation generation and hosting problem off my hands for liberator (that i know of)
10:18ordnungswidrigFor the architecture that I described and which is the one HTTP was built for, the resource should self describe". I guess you're more interested in serving APIs over HTTP which a fine but not what HTTP was initially designed for.
10:20dnolenI just cut 1.7.145 https://github.com/clojure/clojurescript/releases/tag/r1.7.145
10:21dnolenbefore putting together a proper announce it’d be great if people could take a second to test it
10:22jonathanjordnungswidrig: what do you mean self describe?
10:32noncomi'm now trying to compile a project that uses cljx conditional compilation and the project code cannot be evaled since no reader function is found for tag +clj - how do i fix this?
10:32ordnungswidrigjonoathanj: example: when you look at http://api.m.ox.ac.uk/browser/#/ (a HAL browser for some the oxford university's services you'll find that you can discover the available resources and media by following the hyperlinks.
10:33bjadnolen, I'm not using UUIDs in my cljs project, but there were no regressions using the tarball for r1.7.145
10:34ordnungswidrigjonathanj: given that the application understands the HAL media type you and the relations (which are documented at http://moxie.readthedocs.org/en/latest/apps/{rel}.html)
10:35dnolenbja: great thanks for the feedback
10:35ordnungswidrigjonathanj: the link template seems to be broken (or I'm doing something wrong), but the docs are on http://moxie.readthedocs.org/en/latest/apps/contacts.html
10:38jonathanjordnungswidrig: the structure of the data for HAL looks pretty similar to the last Swagger-backed service i had to write a client for
10:38jonathanjreading http://stateless.co/hal_specification.html
10:39ordnungswidrigoh, swagger doesn't prevent hypermedia, it only doesn't promote it :-)
10:39jonathanjwell, neither does liberator
10:39ordnungswidrigsure.
10:39ordnungswidriggood point. but if you combine liberator with bidi then you can have it easily :)
10:40jonathanjyes, i was going to mention bidi earlier talking about yada
10:40jonathanjbidirectional resources are a pretty rare quality in routing software
10:41ordnungswidrigGiven http://petstore.swagger.io/ where do I learn the URL of the root resource, the entry to the world of petstore?
10:41jonathanji could easily use bidi and liberator together, right/
10:41jonathanjsince bidi just produces a ring handler?
10:42ordnungswidrigjonathanj: yes. and using the tagged-match feature you can use (path-for ::my-other-resource some-id) to generate a URL pointing the the resource with the tag ::my-other-resource!
10:43ordnungswidrigjonathanj: you'd match in bidi like this [["/user" :id] (tag users ::users)] and can like with (path-for ::users "some-id").
10:43jonathanjordnungswidrig: that petstore thing is an interesting example, how would you make the starting point more obvious given a HAL-like structure?
10:44ordnungswidrigjonathanj: I need to know two things: how to read HAL and a starting URL, e.g. petstore.swagger.io. I'd then expect links (or link templates) to the available resources, pets, owners, etc.
10:45jonathanjokay, but how is a link useful?
10:45jonathanjyou still have to understand the goal of the service
10:46jonathanj(i still don't understand what that petstore service does)
10:46ordnungswidrigjonathanj: now hard coding. the server implementation can change it's mind about the location of the owners resource, the media type and like that. Given that the client does not hard code the location of the "owners" resource.
10:46jonathanjdoes it sell pets or pet accesories?
10:46ordnungswidrigjonathanj: good point! This should be actually discoverable from the resources or the media-types used.
10:47jonathanjordnungswidrig: do you have an example liberator app that takes this approach that i could study?
10:47ordnungswidrigjonathanj: the hal browser (see the oxford example) is maybe as close as you can get to "automatically" understand hal. You need to put a layer of domain specifiy semantic on top of it.
10:47ordnungswidrigjonathanj: which approach? HAL, bidi-links?
10:48jonathanjthe media-types discoverability
10:48ordnungswidrigone key part of understanding a HAL resource is the use of relations.
10:48jonathanjwhich i guess is probably likely a HAL example?
10:49ordnungswidrigTry to explore http://api.m.ox.ac.uk/browser/#/, e.g you can see there is e.g. a rel "contacts" which has a documentation link describing what the relation means.
10:51jonathanjthe documentation link opens in a tiny iframe in chrome
10:51jonathanji guess i can open it in a new tab
10:52ordnungswidrigI just learned how to search for courses at oxford: follow the relation app:courses, and look for a relation of type "hl:search", the docs of that relation told me the "q" parameter is fro full text query. Using this information I could build the URL "/courses/search?q=hypermedia" and learned there are no courses on this topic in oxford.
10:57jonathanjtoo bad the the {rel} link template is broken
10:58jonathanjwhich kind of underscores a particular point about hyperlinks: there is no rule about putting a broken hyperlink into hypermedia
10:58ordnungswidrigjonathanj: the "docs" icon actually expands it.
10:58ordnungswidrigjonathanj: the fact the hyperlinks can break is a good thing. This allows decoupling of resources and made the web scale. There is no "link police".
10:59ordnungswidrigjonathanj: ok, maybe google is the link police, lowering your page rank.
11:00jonathanjan alternative point of view is that you're roaming the wild west of hypermedia
11:02jonathanjordnungswidrig: hrm, well i'm looking at courses search resource and it has a "curies" link with an href to a template string
11:02jonathanjif i replace the {rel} in there with "curies" i end up at a 404
11:02ordnungswidrigoh, I see
11:02ordnungswidrighttps://en.wikipedia.org/wiki/CURIE
11:03jonathanjthat hyperlink isn't in my resource :P
11:03ordnungswidrigIt's a form of URL abbreviation syntax
11:03ordnungswidrigjonathanj: is part of HAL I guess :-)
11:03jonathanjwell it's a relation, not so?
11:03ordnungswidrigjonathanj: and a typical case of "out of band documentation"
11:03jonathanjthe href tells me i can go to {rel}.html
11:03jonathanjbut actually that's not true
11:03jonathanjthere's a certain list of relations that have documentation
11:04jonathanjwhich relations have documentation is totally undiscoverable
11:04ordnungswidrigthe "curie" link registers the "app" curie and when you encounter a link relation named "app:xxx" then you replace the href by the "href" of the "app" curie replacing the {rel} with the "href" value of the original link
11:06dnolenClojureScript 1.7.145 is out! big thanks to everyone who contributed
11:06ordnungswidrigi.g. in resource at /contact you see a link with relation "hl:search". It starts with "hl" which is a curie defined in the resource. It's href value is "http://moxie.readthedocs.org/en/latest/http_api/contact.html#{rel}&quot;, you need to replace the {rel} with the part of the rel name after "hl:" this giving http://moxie.readthedocs.org/en/latest/http_api/contact.html#search
11:06jonathanjordnungswidrig: i actually have no idea what you just said
11:07jonathanjordnungswidrig: okay, got it
11:07ordnungswidrighttp://www.mikestowe.com/2015/01/what-the-heck-are-curies.php
11:07ordnungswidrigOh, I see
11:07ordnungswidrigyes, curies can be confusing!
11:07jonathanjordnungswidrig: so there's nothing to really help me to construct such resources, that i know of
11:08jonathanjit seems like it would be really complex to design and use a library to help with this
11:09ordnungswidrigjonathanj: there's hal-clj but it seams pretty basic.
11:10ordnungswidrigIf I only had all the time to build these nice tools :)
11:56trissis it possible to do a `lein install` from within a REPL?
12:10justin_smithtriss: only if your project deps include the leiningen libs
12:10clgvI am looking for the correct approach for reconnect attempts with aleph.tcp when the server application may be down for some time but recovers eventually
12:12clgvI tried to simply perform connection attempts after a given timeout but then it happens that more than one connection is established although I got a timeout exception for all attempts except the last attempt
12:14trissjustin_smith: um... I want to work on a project that's a dependency for another one without having to restart 2 REPL's every time I make a change to the dependancy
12:15justin_smithtriss: you can reload the source files without changing your dep version
12:15justin_smitheven if the source file is in another project's directory
12:15justin_smith,(doc load-file)
12:16clojurebot"([name]); Sequentially read and evaluate the set of forms contained in the file."
12:16trissah brilliant thanks man
12:18clgvtriss: with a good editor/ide you could just use a key combination to load the current file, which may be the one from the dependency, into the repl
12:19trissthanks clgv I'll give it a try.... vim'ing over here so I'm sure its possible
12:22clgva lack of aleph.tcp users in here :(
12:22justin_smithztellman used to hang out here, probably ditched IRC for slack
12:26clgv$seen ztellman
12:26clgvwhat happened to lazybot?
12:27justin_smithmy karma was about to catch up with amalloy's so he stopped logging the bot in
12:27justin_smithjust kidding
12:27justin_smithit's always been a bit unstable, and it may be changing hands
12:28clgvjust noticed that it had been offline on my lately occasional visits
12:30justin_smithyeah, it's not just instability now, it's also less attentively restarted too
13:06RaynesIrclj doesn't know how to reconnect and nobody has ever cared enough to add it and I rarely pay attention to IRC.
13:22justin_smithRaynes: I want to care! I want to do the right thing! don't give up on humanity yet
13:24m1dnight_my bot framework reconnects on timeouts! :o
13:24m1dnight_it was a hassle to do, though.
13:25pilnelord, why didn't i discover clojure sooner? i might still have a luscious thick head of hair that isn't greying.....
13:26justin_smithhaha
13:27pilne... i'm reading a blog post from harvard about clojure, and someone in the first comment seemed to imply that lisps are harder to read and maintain than most languages >.< where's my mirc-fish!
13:28pilneerr, the most recent comment
13:28pilneno lie, java and c++ attempted to murder something inside of me >.<
13:30rhg135Doing java too often made me hate computers.
13:31pilneif i learned one thing from programming.... all end-users that have to put data in, need to have things fed to them in drop-down menus whenever possible >.<
13:31ARM9preach it
13:32schmuddeAfter being introduced to Common LISP as an undergrad in ~1999, I decided to stop programming rather than go back to a world of Ada & Java. I've returned to see a more "functional" world.
13:32pilnei wish my highschool and undergrad had *anything* that wasn't java or c++
13:33schmuddepilne: I was really lucky. We had one professor that had one foot in AI research.
13:33justin_smithI was lucky, I didn't learn to use a computer until I was an adult and outside acedemia, so I wasn't forced to learn crap just for a curriculum
13:34pilnemy programming rebirth happend as my midlife crisis
13:34pilnecheaper, but probably not as satisfying as a legal teen affair >.<
13:34schmuddepilne: Nice! Good outcome.
13:35pilneyeah, i found "drracket" almost by accident, and was like "all in one ide, not *java* or c++, why the fuck not i'm bored"
13:35pilneand now i'm looking to make java desktop and webapps for shits and giggles
13:35pilnewell
13:35pilneclojure
13:35pilnebut jvm
13:45justin_smithpilne: getting figwheel working for cljs, with a react based lib for rendering, was a revelation after doing webapps "the normal way"
13:46pilneheh, i'm actually really interested in reactive stuff for a game engine
13:46pilnemy girlfriend has some incredible ideas, and is a blender whiz
13:47justin_smithcool - is react reactive? I mean the name makes it sound like it might be...
13:47justin_smithto be clear I was talking about react.js, a lib from facebook that makes it easy to do single page js apps
13:47pilneit is broadly a "style" that is designed to react to inputs, it's a relatively new persuit amongst functional style languages
13:48pilneit's probably more of a "big dieal" with a language like haskell which is so very immutable
13:48justin_smithpilne: but in terms of game design with a functional language, I am a big fan of the Component Entity System data paradigm (as an alternative to OO encapsulation)
13:48pilne(which is where i heard of it first, a haskell version of DOOM2 (or quake??))
13:48justin_smithpilne: right, I wasn't talking about reactive programming (which I am familiar with), I was talking about facebooks react lib
13:49pilneoh
13:49pilnefuck facebook
13:49pilne:p
13:49pilnei sign on when the gf needs me to like a post from her work
13:49pilnelol
13:49justin_smithyou don't need to use facebook to use react, and it's good tech for web page rendering
13:49pilnecool
13:50pilnei will keep it in mind if we choose to deploy to the web on a game, i think that the hardware today can run the jvm fast enough to do some pretty decent 3d stuff.
13:51oddcullyil2 was done in java
13:52pilneyeah, so i'm gonna be fine, we're not trying to one-up the cryengine >.< lol
13:53pilnei love the borderlands style, and when it came out, the id5 engine blew my mind
14:02audaxionanyone use the duct lein template?
14:15SeyleriusHmm... I wonder if using jdk7 instead of jdk8 could fix the problem.
14:41boxedI have a macro which spits out macros, and I have another macro where I need to figure out if a symbol is one of those generated macros… my first idea was to put meta data on the macro but it seems I can’t do that… how would I do this otherwise?
14:49engblomboxed: To me it sounds like you do something uneccessary complicated. You should probably take a short break and then appoach the problem from another angle.
14:50boxedmm.. I actually figured out I can work around the problem… still.. would be nice if one could do this
14:51tdammersquick question: I call a macro from clojurescript, and that macro calls a function that throws an exception. What will happen?
14:51boxedactually… hmm.. how do I even put meta data on a function?
14:52boxedtdammers: you mean the macro calls the function, or the macro expands to a call of the function that throws?
14:52tdammersthe macro calls the function
14:52tdammers(defmacro foo [x] (throw (Exception. "OINK")))
14:52tdammerslike this
14:53boxedtdammers: that’s weird.. but yea ok, so that will throw at compile time
14:54tdammers'cause it seems that in my case it doesn't throw at all, or at least nothing throws when I do that
14:54tdammersbut probably means something between the macro definition and the throw somehow doesn't go through
14:55Seyleriusboxed, tdammers: It almost sounds like you're trying to make a reader macro. Clojure doesn't really allow those.
14:55rhg135justin_smith: as to your queston about react, by itself it isn't reactive, but it can be used so
14:55SeyleriusRun what you're trying to do by me again?
14:56boxedSeylerius: now I’m confused… do you want ME to explain what I’m trying to do?
14:56Seyleriusjustin_smith: So, I've verified that switching from JDK8 to JDK7 doesn't fix the problem with the barbecue library.
14:56Seyleriusboxed: Yep.
14:56tdammersSeylerius: no, I don't need a reader macro
14:57tdammersSeylerius: what I'm doing is I have a macro that takes an extra parameter that is a function; the macro parses stuff from a file, and then calls that function on the parse tree before returning it to clojurescript
14:57boxedSeylerius: so I’ve got this lib: https://github.com/boxed/defk and I want to make a (partial) to match it.. and in order to do that I need to figure out if a symbol is a) a macro generated by defk, or b) something else
14:58tdammersand that macro does, in fact, work flawlessly
14:58tdammersat least in a lab situation
14:58tdammersbut in my real application, it doesn't do any transforming
14:58boxedhmm.. actually, maybe I can just check if the symbol is a macro and that’ll be good enough now that I think of it… partial doesn’t work on normal macros anyway
14:59tdammersso I made that function throw to see if it runs at all, which it doesn't seem to do
15:01boxedheh, ok, so how do I check if a symbol is a macro?
15:03hiredman_I am at a loss as to how a 1.8 beta can be cut given how broken the new direct linking code in the compiler is
15:03justin_smith,(-> #'or :meta :macro?)
15:03clojurebotnil
15:03justin_smith,(-> #'or :meta keys)
15:03clojurebotnil
15:03justin_smith,(-> #'or meta keys)
15:03clojurebot(:arglists :doc :added :line :column ...)
15:03justin_smith,(-> #'or meta :macro)
15:03clojurebottrue
15:03justin_smith,(-> #'+ meta :macro)
15:03clojurebotnil
15:03Bronsahiredman_: I would have expected dl to be at least disabled in the new build
15:04justin_smithboxed: see above, you can use the metadata and check for the :macro keyword - this is what the compiler looks for to decide if something is a macro, so it's accurate
15:04Bronsathere's really no point in cutting a beta release if people can't try it out in real code because of a known bug
15:04boxedjustin_smith: great! thanks
15:05justin_smithboxed: in fact you can make some really weird behaviors happen if you arbitrarily add / remove the :macro key from var metadata :)
15:07Bronsahiredman_: puredanger wrote a comment about that in the clojure-dev slack: " re the beta1 release, CLJ-1809 (and CLJ-1805) are known important things but Rich hasn't had time to look at them so we decided to release this beta without them. that stuff will probably be resolved in the next beta. "
15:08boxedjustin_smith: hmm, another followup.. if I only have the name of that macro I should do: (:macro (meta (ns-resolve *ns* (symbol "foo")))) right?
15:09justin_smithboxed: or just (resolve (symbol "foo"))
15:09boxedjustin_smith: ah, cool
15:09justin_smith,(resolve (symbol "+"))
15:09clojurebot#'clojure.core/+
15:10justin_smithboxed: resolve is effectively (partial ns-resolve *ns* ...) if you ignore the env stuff
15:10justin_smithor wait, never mind, it's effectively that partial regardless :)
15:12boxedheh, check
15:12Seyleriusjustin_smith: Trying OpenJDK8, then OpenJDK7. Let's see if anything actually fixes this...
15:12justin_smithSeylerius: fixes which again?
15:14justin_smithSeylerius: ahh, the barbecue issue
15:39Seyleriusjustin_smith: Weird. It claims to have produced a coredump, but I can't find it.
15:39justin_smiththat's odd
15:40SeyleriusYeah, it really is.
15:56celwellHello, would you format this differently, or is this standard clojure style? https://gist.github.com/celwell/d3658d1a1383c4e488a5
15:58Seyleriuscelwell: There's a tool called cljfmt, or something like that.
15:58SeyleriusLemme look it up.
15:58Seyleriuscelwell: https://github.com/weavejester/cljfmt
15:59celwellSeylerius: interesting, thanks
15:59SeyleriusNow, I'll take a look at your code.
16:00nanukowhat does it mean to have the following: #”some string”
16:00celwellregex
16:00Seyleriuscelwell: Nice. Well-formatted, imo.
16:00SeyleriusRegular Expression/regex/regexp
16:01nanukooh, sweet! thanks
16:01TEttingernanuko: except in that exact case, where you have smart quotes
16:01TEttinger,(re-find #"the" "hey, there's a regex here!")
16:01clojurebot"the"
16:01TEttinger,(re-find #"the" "hey, no regex here!")
16:01clojurebotnil
16:02SeyleriusYeah, smart quotes are dangerous.
16:02TEttinger,(re-find #”some string” "will not find some string because of smart quotes")
16:02clojurebot#<ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException: 8221>
16:02SeyleriusPh34r the smart quotes.
16:03TEttinger,(re-find #"some string" "will find some string because no smart quotes")
16:03clojurebot"some string"
16:04{blake}Why, when I use Swing, do I not need to note that in my project.clj? Is that because Swing is part of the JDK?
16:05Seylerius{blake}: Yep.
16:06SeyleriusAlso, if you're doing Swing shit, you might want to consider playing with Seesaw.
16:07{blake}Seylerius: Oh, I will. It makes a nice contrast after straight Swing.
16:08SeyleriusIt's quite handy, imo.
16:08SeyleriusI'm thinking of doing a PR to add printer support to it.
16:09{blake}I'm teaching my students how to use Java in their Clojure code, so Swing was a great way to get fast results. When I clean up the project with Seesaw, I think they're going to like it even more.
16:09SeyleriusNice.
16:09SeyleriusThey'll get a kick out of that, I bet.
16:09aghiuru{blake}: students? where are you teaching clojure?
16:10SeyleriusAhh, why the fsck does Apache Barbecue crash every time I save a barcode to a file, and why did it fail to leave a coredump?
16:13{blake}aghiuru: At my place of employment.
16:14pilnethe more time i spend in lisp/scheme land, the more i wonder why in the hell c and c++ ever caught on (and java by extension, although i'm guilty of seeking out clojure to get at java's tasty libraries)
16:19Seyleriusjustin_smith: I officially have lost all respect for Oracle in this moment.
16:19SeyleriusI'd tried OracleJDK7&8. Both crashed. I just swapped in OpenJDK7.
16:20SeyleriusMy JVM is /still/ running.
16:20SeyleriusIt's been at least 10 minutes.
16:22Seyleriusjustin_smith: Yep. The problem is Oracle.
16:22SeyleriusThe problem is always Oracle.
16:26justin_smithcelwell: unless I had a strong reason to do otherwise, I would turn that merge call into an assoc
16:27justin_smithSeylerius: that may be a good rule of thumb
16:28SeyleriusI'd switched to fscking Oracle's crap to make Minecraft, of all things, work properly.
16:28justin_smithhaha
16:31{blake}lein pulls from maven and clojars...anywhere else?
16:33justin_smith{blake}: defaults are maven central, clojure.org/releases and clojars
16:34{blake}justin_smith: Groovy.
16:35snowellGroovy also pulls from maven central by default
16:35snowellhahahaha I'm so funny
16:35{blake}snowell: All part of my scheme.
16:36pilnei see what you did there
16:36pilneare you a standards compliant scheme?
16:39{blake}O
16:39{blake}No, I've got all kinds of crazy macros.
16:39pilnepost-compile assembly injection to rape the processor huh?
16:40{blake}Whatever it takes. I'm "practical".
17:25sobelpilne: OO seems like a shortcut to programming in a grown-up way but OO loses faster than anyone can even admit
17:25sobelfaster and harder
17:26pilnei'm not a fan of the OO paradigm, but on occasion it is the most elegant solution
17:26sobelit's a useful construct where it makes sense. it's just not very applicable, in general.
17:27sobelfor example, it's one venue for polymorphism, and i'm pretty sure that's useful sometimes. maybe.
17:33pilnemethinks there would be a lot less ugly code out there if OO was an option and not the foundation (for java/c++ especially)
17:34emautonWhile I enjoy my counterfactuals as much as the next programmer, I think that's excessively optimistic. ;o)
17:35pilnehey, i have to be a massive pessimist at work, let me be optimistic in my funzies :p
17:52pilneam i correct in thinking that reduce is very similar to fold (from the left) in haskell?
18:02postpunkjustinpilne: yup
18:02pilneis there a fold-r that i'll be introduced to?
18:02sobeli work with tacit pessimists. i profit by understanding this but not trying to rock their boat.
18:03sobelin other news, i just stumbled on https://github.com/cemerick/clojure-type-selection-flowchart at the right time
18:03postpunkjustinpilne: not really. I think there might be something like that in the reducers library, but hardly anyone uses it
18:04pilnei work for a smaller ups dispatch/delivery hub, 2/5 of my bosses make peter griffin from family guy look like einstein >.< (i'm on the corporate, not union side... sadly)
18:04sobelis fold-r like sql's right join; there for completeness?
18:05pilnein haskell, foldr is significantly lower memory use than foldl due to how the "thunks" are accumulated
18:05pilnenot sure if clojure's lisp suffers that fate
18:08{blake}I want to claim a resource through a function, but I'd like to not burden the client with locking and freeing it, and I'm not sure how that's possible.
18:11postpunkjustinpilne: I'm reading up on foldr now, I'd never really thought about it
18:11{blake}Component, maybe?
18:11pilneif clojure doesn't make huge thunks due to lazy evaluation when using reduce, then it is probably a non-issue
18:12postpunkjustinI don't think reduce is lazy in Clojure
18:12{blake}with-open?
18:17xemdetia{blake}, what sort of lifetime is the client owning this resource?
18:18{blake}Short functions.
18:19{blake}I've basically got these Java objects I'm messing with, but since it's a web app, I need to be able to lock them, create new ones, cache as needed, etc.
18:19{blake}But I'd like to avoid putting that in the client.
18:25{blake}xemdetia: So, yeah: Short.
18:31pilnethis little blurb in this tutorial about when-let and if-let have left me with more questions than answers >.<
18:32xemdetia{blake}, would locking work?
18:32xemdetialike literal clojure.core locking
18:33justin_smithpilne: the only difference between if* and when* (including -let or -not variants) is that when accepts N forms that all trigger or none trigger, and if accepts 1 or more, and either one of them triggers, or none
18:33justin_smith(none being an option in the 1 form case)
18:33justin_smith,(if false :wat)
18:33pilnei haven't really gotten to the * forms yet >.<
18:34clojurebotnil
18:34justin_smithpilne: I was using * as a shorthand
18:34pilneahhh
18:34pilnek
18:34justin_smith,(if-let [foo false] :wat)
18:34clojurebotnil
18:34justin_smith,(when-let [foo false] :a :b :c :wat)
18:34clojurebotnil
18:34pilnei guess it is more like the tacking the -let on is what has me head scratching
18:35{blake}xemdetia: Maybe. If I say "(locking o..." and multiple threads are calling that?
18:35justin_smith,(when-let [foo :OK] :a :b :OK)
18:35clojurebot:OK
18:35justin_smithhere we can pretend :a and :b were important side-effecting function calls
18:35{blake}xemdetia: That could work until I figure out a caching system, I guess.
18:35xemdetia{blake}, maybe. It's a monitor lock. I don't know what sort of java objects you are trying to lock or how the library considers them locked
18:36pilneso, when it is truthy, it will call foo on a and b?
18:36{blake}xemdetia: POJOs, in the parlance of our time.
18:36justin_smithpilne: no, it will do a, then b, then wat
18:36justin_smithand since I did not use foo, it gets ignored altogether :P
18:36pilneahh
18:36{blake}xemdetia: Though that still forces the client to lock. :-/
18:36pilnei think my time with other languages often has me over-thinking lisp/functional stuff
18:37justin_smithpilne: so it's just a sequence of arbitrary impure actions, which each have the opportunity but not the requirement to use your binding
18:37pilneit took me hours to realise that "switch:" in haskell... literally just switched the order of the arguments being fed to a function.....
18:37xemdetia{blake}, yeah I can't think of anything else offhand if you aren't going to use a helper that could do the locking for the consumer
18:37justin_smithpilne: and of course when implies side effects, otherwise if would suffice with its single form
18:37{blake}xemdetia: Helper, how? Like a macro?
18:37xemdetiaor some macro shenanigans
18:37xemdetiawell an api
18:38xemdetiawell that wouldn't work either
18:38xemdetiascope is wrong which is your initial problem
18:38{blake}right
18:39{blake}I have to enclose all uses of the object somehow.
18:39justin_smith{blake}: one paradigm to consider is instead of giving the object to a process, give a request to a process that owns the object. The locking is not needed because it is only used in one context, and you send requests via a queue. This is basically what core.async does too.
18:39xemdetiathat's true, if you have the clients just push things to some sort of processor it would then be much easier to serialize
18:41justin_smithfor N isolatable objects, just have N threads serving a single concurrent queue, and let the first one to grab a request serve it, and just make sure they don't grab new requests until they are done with the last one and cleaned up after it
18:41{blake}justin_smith: OK, I can see how that could work. That might be the "best" solution.
18:41justin_smith{blake}: it has a tradeoff - less performance in some cases due to the overhead of using a queue instead of a call stack
18:41justin_smithbut it definitely avoids a lot of complexity and pitfalls that come with locking
18:42{blake}justin_smith: It could be more performant in my case. I was trying to use a "Use it if you can, or make a new one if the other's in use."
18:43{blake}justin_smith: And making a new one consumes massive time & RAM.
18:43justin_smithoh yeah, and with the parallel managing threads and queue version allows easy re-use
18:43xemdetiayeah I was thinking of more hard interop case where some java process would be touching your pojo
18:44{blake}Nah. It's a web app. I've got Java objects on the back end which are disturbingly impure. =P
18:45xemdetiathen yeah creating some sort of queue/message passing interface seems to be the way to go
18:45justin_smithyeah, so for each request from a client, forward a request onto the object managers queue, and let the first available one give you your result (and then work out a more complex logic if it's not something you can handle in a single back and forth...)
18:48{blake}It's pretty simple.
18:48{blake}Or perhaps a better word is it's very localized. Get in, get out.
18:49justin_smithyeah, that is very compatible with the process+queue option
18:50{blake}All right, I'll do it that way. I don't like the whole caching/locking thing.
19:03pilnealright, cool points for calling @ the wormhole operator LoL
19:06justin_smithpilne: wait, where did that come up? I have not heard of that name before
19:06pilnehttps://aphyr.com/posts/306-clojure-from-the-ground-up-state
19:18justin_smithheh, cool
19:23neoncontrailspilne: That's awesome. Haha I love it
19:24pilnei've been working through that as my intro to clojure, it is doing pretty ok, not sure if it would work for a complete and utter programming noob, but... that's hard to learn without someone to at least get a basic environment setup for ya (although lein is easier than my ex girlfriend >.<)
20:08neoncontrailspilne: I think your hunch is probably correct that it would be hard to learn Clojure as a first programming
20:08neoncontrails*programming language
20:11neoncontrailsThe article you linked to is a good example of Lispy things that seemed really difficult to me years ago (state as a function? Wuut?) and only started to make sense when I saw the difficulty of maintaining my object-oriented code
20:12neoncontrailsThat difficulty was bearable though, because I didn't have the added complexity of data types to worry about. I was learning Scheme
20:12pilnei like to point people to ruby or racket just due to the documentation being superb (especially "how to design programs" for racket).
20:12pilneworking through "how to design programs" was literally the most enjoyable learning experience i've had in ages
20:14neoncontrailsWhat was the design philosophy in a nutshell?
20:15neoncontrailsOh this book!
20:15neoncontrailsI remember seeing this recently when I was trying to find other things Matthias Felleisen had written
20:16neoncontrailsHis book, The Little Schemer, is one of my favorites
20:16pilnethat is a good book too
20:17NaNneoncontrails: I have that one but still dont immerse on it, do you recommend it to a new commer?
20:18pilneits just super nice that you can "tell" DrRacket to work in a compatibility mode with the book, and DrRacket is completely and wonderfully self-contained, but it is still a scheme and not a lisp in the end (not that being a scheme is inherently bad, just different)
20:18neoncontrailsNaN: Hmm. I think it's a great book for a certain type of person who enjoys thinking about programming at a theoretical, abstract level. Do you?
20:20NaNneoncontrails: I don't know, but I think if you can think in that way, the (programming) language isn't a restriction
20:20NaNneoncontrails: so let's say the book it's about learn to "think the lisp way"?
20:24neoncontrailsNaN: maybe I should clarify what I mean by "abstract." By abstract I mean, if you've ever wondered about how while loops work at the level of primitive logical operations, or how you'd make a database from a composition of names closures, it's the perfect book for you
20:25domokatohi guys. i'm trying to use amalloy's ordered library but I'm getting "Compiling flatland.useful.cli...Exception in thread "main" java.lang.IllegalAccessError: update does not exist, compiling:(cli.clj:1:1)"
20:25neoncontrailsIt's not a level of abstraction that will particularly help you write programs, but it may help you appreciate them as works of art
20:25NaNneoncontrails: seems interesting... will check it out
20:26neoncontrailsThe 'Lambda the Ultimate' chapter is probably one of the most thrilling experiences of my young programming career
20:28domokatoI'm using update in my code (which was previously compiling), so it should be there
20:37pilnedomo, i'd try and help, but i'm too damn new to clojure, so I'm not gonna try, my apologies
20:49domokatopilne: no worries man :)
20:51justin_smithdomokato: the function update was introduced in clojure 1.7, what clojure version are you using?
20:52domokato1.7.0-alpha4
20:53justin_smithdomokato: can you try updating to 1.7.0 ?
20:53justin_smithnot every pre-release of 1.7 had update
20:55domokatojustin_smith: it worked! kind of strange since i'm using update in my code already
20:56domokatojustin_smith: thx
21:06pilneliking lisps has way too many distractions >.<
21:06pilneespecially now that i have a common lisp repl on my phone >.<
21:36pilneit's funny... when i solve my rubik's cubes, i feel like it is a very imperative/procedural process, but trying to program that way feels so constrained and akward to me >.<
21:37justin_smithpilne: isn't solving a cube a series of operations taking a state of a cube and returning a new state of the cube?
21:40pilnevery true, but it is inherently mutable
21:40justin_smithat the end it is still a cube :)
21:40justin_smithand every step has an opposite and can be undone
21:41justin_smithpilne: which is similar to many functional paradigms for modeling state over time
21:41pilnevery true, and the algorithms all (can be, maybe not most optimally) be boiled down to simple conjugations
21:41pilnesorry, algorithms is cube-speak for taking one specific pattern to the next
21:42pilnemoves are the more generalized forms in the jargon
21:42pilne"algorithms" are like optimized assembly-written loops, sometimes they really don't "relate" easily to what you are doing, but they are really fast at doing it
21:43justin_smith right, and this is all 100% compatible with fp - and a procedural language easily lets you break those constraints
21:43pilnehrm... "cubing and coding - the bloggings of a madman"
21:44pilnehrm... is there a way to break out of the jvm and run straight assembly code when needed? if so, the level of abstraction that clojure provides would be astounding
21:44pilnes/level/levels
21:44justin_smithpilne: there's clojure wrappers to jni stuff out there somewhere...
21:45justin_smiththough clojure's idioms are difficult to use without gc present
21:45pilnethis is true of most the lisps, but a small segment of code with a bit of manual gc is an option, and either that, or the wonderful craft octoberfest i'm drinking, are giving me a warm fuzzy feeling (:
21:45justin_smithbut if using clojure to generate very procedural mutating code suffices - sure, there's ways to do that
21:46justin_smithhaha
21:47pilneyeah, i'm quite enamored with clojure, and the general "attitude/vibe" of the community i've found so far
21:48pilnepeople who code in a language that doesn't frustrate you probably just don't have much reason to not be jovial (:
21:50justin_smithpilne: unlike other languages, we are with clojure because it's the language we prefer, not because it is a default we are stuck with, and that does make a difference I think
21:50justin_smiththe flip side is this community would disappear fast if it got unpleasant, because very few people out there are forced to use clojure without other options available
21:51pilneeh, i hopped around for a while, haskell, ocaml, scala, python, and ruby when i decided to start coding again (i didn't want to touch c++ or java itself if i didn't have to), haskell has a great community, but the language just... "cabal hell" lol
21:51pilneracket has a wonderful community too
21:52justin_smithmaybe there is a correlation between unityped languages and affable attitudes
21:52pilnei even tried perl (but just the tip)
21:53pilneperl is nutty, i respect the shit out of it, but it is just nutty
21:53pilnei kinda lump perl and emacs into a same "thought" category
21:57pilnealthough i have an immense fondness for vi, and vi mode in atom (: lol
22:00pilnelike i said the other day, after looking at ceylon, and trying scala, the fact that clojure doesn't shove eclipse or netbeans down my throat made me smile.
22:19bjaI'm probably guilty of wanting too much of my lunch to be free, but I've experienced way more classpath hell involving maven/leiningen (particularly when doing things with AOT compilation) than I have with haskell/cabal
22:20adubja: free lunch is so much fun
22:21bjaheh. I have a project that just barely works, but manages to remix about 40 java libraries in my :dependencies. I only had to write a little glue code (and fork/path several of the libraries to agree on versions of things)
22:22bjaI have an outstanding item on my todo list of trying to use tools.reader/tools.analyzer/tools.emitter to implement something similar to the maven shade plugin but for clojure libraries
22:24aduMaven is a tragedy. Java should have had a package manager from the start. But if we knew that a "compiler" required 150 things, like websides, compiler docs, language docs, library docs, FreeNode channel, mailing list, syntax highlighing for GitHub, syntax highlighting for Emacs, syntax highlighing for Vim, syntax formatter for Eclipse, token parser for ctags, comment parser for doxygen, then we probably would have written fewer languages w
22:24adumore design from the start.
22:27bjamy only other experiences with package managers are pip/easy_install/setuputils/distutils from python, gems from ruby, and cabal from haskell. comparatively, leiningen/maven is awesome
22:27aducabal is pretty cool
22:28bjathe classpath hell only really seems to affect me if I'm using a lot of libraries
22:28bjamost projects I'm between 5 and 20 and it's fine
22:30pilnei love haskell, it is beautiful and elegant, but i can't see myself digging that deep to make programs in a timely manner, monads just make my brain go "lol wut m8"
22:32TEttingerbja: what you mentioned about shade for lein...
22:32TEttingercould it be done with an uberjar and no :main ?
22:33bjaI don't think so? consider the case where I want to use, say, clj-time 0.11.0 but one of my libraries is from like 2012 and uses clj-time 0.4.0
22:34TEttingerright, right
22:34bjafwiw (this was my reality last year with storm...)
22:34TEttingerit may be possible to do it now with some arcane setting or even just lein pom and adding shade
22:34bjaerr, I don't know why I parens there
22:34bjabut maven shade won't rewrite the .clj files will it?
22:35bjawill maven shade rewrite the class files if I AOT?
22:35bjai.e. I have some library foo-from-2012 that uses clj-time 0.4.0. If I AOT that library, can I then have maven shade rewrite its class files?
22:35bjaor does maven shade require the .java files?
22:35bjaI didn't research maven shade too much
22:36TEttingerI don't think anything rewrites clj files, and I don't know how shade works (it may only use .class files, which both clojure and java spit out)
22:36TEttingerI think shade groups any dependencies into the current library distributable jar
22:36TEttingerlike uberjar does for executable jars
22:37bjaI want an option to do something like this
22:37TEttingerso you would have clj-time 0.4.0 inside the shaded jar, and I think it may do classpath stuff to make that shaded jar prefer its own version
22:37bja{:dependencies [[foo-from-2012 :isolate [clj-time]]]}
22:38TEttingerright
22:38adupilne: Monads are simple
22:38aduI don't know why ppl have so much trouble with them
22:38TEttingerthis is a definite request people have had before
22:38bjahttps://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html
22:39bjait seems like the shade plugin works on bytecode
22:39bjawill have to play with the pom and see if I can get it working like I want
22:39bjaif I can, it should be trivial to add a leiningen plugin to generate the right xml
22:42TEttingeradu: do I have it right that a monad is a sort of wrapper around another type, and you can use it to get values of the associated type (which depend on the wrapper and could be, for example, random) while ensuring that the wrapper is itself not treated as an element of the wrapped type for type checking purposes?
22:42TEttingeradu: which is similar to the factory pattern in java or other OOP languages?
22:42TEttingerbja: woohoo!
22:43TEttingerbja: there may be a maven plugin API that you can call from a lein plugin
22:43bjaTEttinger: upon closer inspection, it looks like the maven shade plugin won't do what I want out of the box. the maven shade plugin could be used on clojure code I control to make sure that it doesn't export my dependencies to some common global name
22:43aduTEttinger: Yes and no
22:44aduTEttinger: there are 2 models that work really well for Monads: Containers (which is your description) and Computations (which is one of the best Monad tutorials out there)
22:44bjaso if I had foo-from-2012 that wanted to use clj-time 0.4.0, I could do that and then maven shade plugin could make sure that when people depend on foo-from-2012, they don't get clj-time conflicts
22:44aduTEttinger: the great thing about Monads tho is that they abstract both models with a common interface
22:44bjabut it falls short of letting me say something like "this thing that I depend on, isolate all of its dependencies (or the ones I specify) relative to it"
22:45bjaalthough, given that it works on bytecode, it's probably possible to modify the maven shade plugin to do this
22:45TEttingerbja: I'd prefer to check if there's an API for calling shade
22:46TEttingerbja: it also may be a good idea to go in #leiningen and see if any experts are awake
22:47pilneadu, i'll have to look into it more, but, alas, i must call it a night, see ya'll around