#clojure logs

2014-12-12

00:35gastoveEvening, all. I've just done a brew update/upgrade, and now `lein` is choking trying to import defrecords from other projects -- throws a class not found exception.
00:35gastoveHas anybody else.... run in to this? Have any sage advice?
00:37gastoveFor instance, I'm using Adam Wynne's `twitter-api`, and `(import '[twitter.callbacks.protocols AsyncStreamingCallback])` (which worked earlier today) now throws a class not found exception.
00:37gastoveBizarre but true: the project still lein-compiles perfectly.
00:41justin_smitha lein version change shouldn't even be able to effect that
00:41rritochgastove: I have a similar problem with protocols/lein. I compiled clojure itself with leiningen and now the protocols aren't loading, they're throwing class not found exceptions. A class not found exception means the applied classloader can't find the class. When it comes to protocols I suspect it means the protocol was compiled into a classloader that isn't in the current classloader or ancestor
00:41rritochI can get a REPL from the uberjar, but I get class not found errors when trying to use this new build as a dependency.
00:43gastovejustin_smith: agreed. And yet; this was all working this morning, and now is totally hosed, and I am running real low on theories.
00:43justin_smithgastove: it is easy to change your lein version
00:43justin_smith"lein upgrade [v]
00:43justin_smith"
00:44gastovejustin_smith: heh. Point. I might try that, see if anything changes. But your point is a good one -- it *shouldn't* do a damn thing.
00:44justin_smithgastove: one more thing - have you run lein clean?
00:44gastovejustin_smith: yep. Hasn't helped.
00:48gastoveOh, and rritoch: the word 'protocol' in what I'm trying to import is a bit of a confusing choice -- it doesn't refer to a Clojure `protocol.`
00:49rritochgastove: Ok, in my case it is clojure protocols, or more specifically, the extend-protocol generated classes that aren't showing up.
00:49gastove*nods*
00:49gastoveYeah, in this case it's all `defrecords`.
00:50gastoveJust.... which I knew what the hell is going on :/
00:50gastove*wish
00:51rritochgastove: defrecords are implemented by deftype so your problem is probably occuring with deftype also.
00:51gastoverritoch: oh good. -__-
00:53rritochgastove: I would suggest you create a java class with a static initializer block that prints out debug messages identifying what classloader the class was loaded with, and then extend the java class you created, compare the hash to the hash of the currently applied classloader, usually the baseLoader.
00:54gastoverritoch: that's.... pretty clever. Well played.
00:54rritochgastove: If you don't get any output, that would indicate the class never loaded, otherwise you can track down why the classloader tree isn't what you need it to be.
00:59rritochgastove: That is probably what I need to do, but I'll need to manipulate the extend-protocol to automatically apply my classloader logging base class.
00:59rritochgastove: My issue is more system wide, I think I broke everything :)
00:59gastoveIt's using the URI Classloader, which seems... fine. And the jar is getting on the classpath...
01:00gastoverritoch: I mean, this is affecting every project on this computer. Sooooo good?
01:02rritochgastove: I really don't know any more about the issue right now. I just know the paths I plan on taking to solve my similar issue. I'm going to check the original clojure vs the uberjar now though
01:02gastoveGood luck!
01:03rritochgastove: Ok this is what I found, in the ant compiled clojure the protocols I'm missing were AOT compiled.
01:04rritochgastove: Specifically I'm misising clojure.core.protocols*
01:04gastove....huh.
01:05rritochgastove: What I'm suggesting is look into your target ... classes folder
01:05rritochgastove: If your using AOT compilation
01:06rritochgastove: The problem may be that leiningen isn't compiling the class you need. At least that appears to be what my problem is.
01:06gastoveYeah -- just did. But: no AOT compilation, in my project or in the 3rd-party I'm having trouble importing.
01:06justin_smithgastove: I assume your require the namespace before trying to import the classes?
01:09rritochgastove: Ok, I found something worthy of note, the clojure.core package contains two clojure files, protocols.clj and reducers.clj, in my case only reducers was compiled but reducers isn't compiled by the ant system since it's in alpha state
01:10rhg135I'm starting to question the validity of my choice to port lazybot to use datomic
01:10TEttingerrhg135, there are kinda a lot of uses of mongo in there huh
01:10rritochgastove: I'm going to comment out the reducers and see if that fixes my problem. If it does than that means there is a bug where leiningen is only compiling certain things from one file in a package, possibly indicating something went wrong without throwing an exception.
01:11gastovejustin_smith: actually, I haven't been, and it's been working fine...
01:11gastoveBut, uh.
01:11gastoveI just added that.
01:11gastoveAnd now it's working great.
01:11gastoveSo, uh....
01:11gastoveWell done!
01:12gastoveWay to be better at clojure than, um, I am.
01:12rhg135TEttinger: not much but it's heavily entwined with mongo
01:12rhg135And schemaless db in general
01:12justin_smithgastove: there is no magic in "import" that causes clj files to be loaded
01:13justin_smithgastove: so if clojure is generating the class you need, you need something to load that clojure code.
01:13gastovejustin_smith: so I am reading right now. Now what I'm wondering is, how the *fuck* has this been working so far?
01:13gastoveWelp.
01:13justin_smithgastove: I think lein may have changed its policy about :aot
01:14justin_smithwhere it does so less often than it had in the past
01:14rhg135But I have gotten the fortune plugin working
01:14gastovejustin_smith: it reassures me to think that there might be an explanation here in which I'm not just an idiot.
01:14justin_smith:aot causes the files to be loaded, you see
01:14justin_smithhaha
01:14gastovejustin_smith: ah, gotcha.
01:14gastovejustin_smith: well, thanks for learning me a thing!
01:14rritochjustin_smith: Lol, I bet that is my problem also. Maby the REPL doesn't require onto these protocols since clojure has them precompiled, but since this custom build didn't precompile them the project depending on this custom builds REPL is crashing.
01:15justin_smithno idea
01:15justin_smithyou could try explicitly requiring the namespaces I guess
01:17rritochDo you think technomancy would accept such a trivial change to lein? The code would be more correct, technically, but it is unnessisary code with the current versions of clojure.
01:17rritochAs much as possible I'm trying to do things without modifying leiningen.
01:22rritochAnyhow, commenting out reducers didn't do anything to help. It removed all the reducers class files but didn't cause the protocols classes to be generated.
01:24rritochActually, every time I type lein compile, clojure.core.protocols is on the list of files that need to be recompiled, even without any modifications
01:25rritochIf I can figure out what all these files have in common, maybe I can resolve the issue.
01:31rritochThe only thing I can see is they have some variant of extending a class, proxy, defmethod, and/or extend-protocol
01:33rritochTwo are using :refer-clojure :exclude, one of which uses :refer-clojure :exclude and doesn't actually extend any classes.
01:42rritochLol
01:42rritochI found the solution.
01:42rritochThe problem was that I was using the master branch to compile with instead of a release branch
01:43rritochI switched to use 1.7.0-alpha4 as the compiler clojure version and all the files compiled
01:47rritochAnyhow, the leiningen compiled clojure is now functional :)
01:53rhg135rritoch: I hate those moments
02:00rritochrhg135: heh, well I still have a long ways to go before this is really viable. The produced version can't compile clojure, and the tests won't run. Anyhow this is just a proof of concept fork. I don't expect to use this in production environments.
02:02rhg135rritoch: as Rich said tests are guard rail programming but not compiling clojure is probably a bad sign lol
02:03rritochrhg135: Well the tests are facing a chicken and egg problem
02:03rritochrhg135: Exception in thread "main" java.lang.ClassNotFoundException: clojure.test_clojure.genclass.examples.ExampleClass, compiling:(clojure/test_clojure/genclass.clj:1:1)
02:04rhg135I'm not acquainted with the ball of complexity that is the low level implementation of clojure
02:05rritochrhg135: As for not being able to compile clojure I suspect this issue was inherited from the master branch as I haven't done anything to the compilation system.
02:06rritochrhg135: I haven't really yet hit the low level. I consider the clojure.asm branch the low-level, I'm just toying with the clojure.lang level.
02:07rritochrhg135: My big mistake was branching from the master branch (hot) instead of branching from a release.
02:07rhg135For me clojure.asm is 'I give'
02:10rhg135If I have to mess with it I'd have to rethink what my goal is
02:11justin_smithrhg135: clojure.asm is just the java asm lib copy-pasted into the clojure source, none of us wrote it
02:12rhg135justin_smith: I know that just proves you shouldn't need to change it
02:12rritochjustin_smith: Really, that being the case it is really too bad there is so much resistance to my custom numeric types
02:12andyfrritoch: Current Clojure master is same as 1.7.0-alpha4, which builds just fine.
02:13rritochjustin_smith: The reason I needed unsigned types is that I'm trying to make a persistent ClassFile type, similar to clojure persistent types accept instead of manipulating map properties, your manipulating classfiles.
02:14andyfrritoch: I don?t understand why you think you are getting resistance to your proposed numerics changes?
02:16andyfOr rather, I think it is fair to say that any significant changes proposed have to go through a fair amount of work and time to get in.
02:17andyfEven when there is interest in adding them.
02:17rritochandyf: Maybe I misinterpreted the situation
02:18andyfI have no say in the matter of whether those changes will be made to Clojure, but I don't recall in the last 3 years seeing any significant proposed changes where the Clojure maintainers dropped everything and said, "Oh, yeah, that has got to get in this week."
02:19rritochandyf: Well there were some comments made in this room against it, mostly related to the results of programmers abusing the feature.
02:20andyfI see. I haven't read those comments, so perhaps I'm misinterpreting the situation.
02:20rritochandyf: I also have my own "issues" with the feature that I haven't yet resolved, Primarily dealing with precidence.
02:21rritochandyf: Industry standard seems to be that double stays at the top of the food chain.
02:21rhg135rritoch: it's a learned fear of overloading
02:21rritochandyf: Clojure follows that also, which is good
02:21rhg135But I think we're responsible
02:22rritochandyf: It seems it is possible with this feature to get around that issue by wrapping doubles in an INumber, but there's no consistency in precidence with my changes.
02:22rritochandyf: Currently it runs under the rule of "left object gets total control"
02:23rritochandyf: But I don't think that is truly how it should work. I would think the left side should have a "vote" on the return type, and the right side should get final say, such as by adding an "identity" function to the numeric types which gets called on the right side if the right side is an INumber.
02:23andyfI've got other fish to fry for now -- no special interest in whether there are significant numerics changes or not.
02:24andyfIIRC, the current built-in numerics have symmetric rules for determining the type of arithmetic results.
02:29rritochandyf: Yes, and establishing symmetric rules when applying method applies is a non-trivial problem, that I haven't yet solved, until that is solved, and I have a complete persistent classfile object, moving forward on these custom numeric types right now doesn't make sense.
02:30andyfrritoch: When you say you did this to create unsigned types, do you mean of any magnitude, like Java BigInteger, or you mean fixed-size 32-bit or 64-bit unsigned values?
02:31rritochandyf: Fixed sizes, but only going up to U32
02:32rritochandyf: The custom types I made each contain a method to read their value from an inputstream, which breaks up the incoming classfile into the proper structure with little effort
02:32andyfI guess you realize that except for comparison ops like < <= etc., the arithmetic ops like + - * inc etc. all have identical bitwise results for 2's complement signed values and unsigned values?
02:37rritochandyf: I believe I've seen something like that in SHA256 algorithms, but it really isn't how I'm implementing these. Most new machines are 64 bit so I'm internally storing the values as long's and bytearrays in these custom values so I always have a cache of the long value and the byte array.
02:39andyfIn terms of non-comparison ops and storage space, a Java 32-bit signed int is perfectly big enough for an unsigned 32-bit int
02:39rritochJava classfiles only use up to U4 so without a need for U8 I can use longs for everything
02:42rritochandyf: I know it's possible, but storage space isn't really a critical concern. A lot of compilers are memory hogs, I see no reason not to stick with the trend.
02:42akurilinquestion: does clojure have anything to sanitize user input from things like xss?
02:43rritochandyf: These classfile objects are useless before and after being injected into a classloader, or saved as a file in most cases. I can't think of a situation where these objects would have a long lifetime.
02:43akurilinin my case it's specifically for a json api
02:44andyfsounds like you are keeping tradeoffs in mind, so good. I just have habits of an embedded coder where often bits are precious.
02:49rritochandyf: Yes, I am cutting a lot of corners. There are some parts of java classfiles that allow U4's as indexes of arrays, though java only supports indexes up to int's max (about half that). I could support it by maintaining 2 internal lists in the List types, but instead I'm just not supporting them (for now).
02:52rritochandyf: For that tradeoff, all index operations of java's Lisp interface use int's so either I'd have to allow negative indexes, or I'd need to extend the list interface to take long indexes instead of int indexes, neither solution is good.
02:53andyfJava's Lisp interface?
02:58rritocherr, Lisp => List
02:58rritochSorry, Brainfart
02:59rritochI've been programming since I was about 6 years old on a commodore 64, now that I'm getting older my fingers seem to have their own mind, I think one thing and type another somtimes.
03:00rritochTechnically, computer languages were my first language. I misspell many english words, but rarely ever misspell computer commands. It is the result of learning computers before learning english.
03:01andyfno spoken language learned before age 6?
03:01andyfthat would be unusual
03:01rritochandyf: Lol, no. Of course I could speak and comprehend english, I just couldn't write much at 6.
03:03rritochandyf: Back then my programming was pure dictation, I'd take some code, and then make small changes until it would run. It was a bit like an improved application of the infinite monkey theorem.
03:04andyfThat is a good way to start to learn to write natural language, too. Have to walk before you can run
03:04rritochandyf: I wasn't able to really write programs from scratch until I was about 11.
03:05TEttingerrritoch: a commodore? I'm surprised it wasn't an IBM machine since you mentioned your dad worked there
03:11_rritochTEttinger: I didn't start working with intel based computers until I was old enough to buy my own.
03:11_rritochAmazing I can remember any of this at all.
03:15_rritochTEttinger: Anyhow, my computer conversations with him when he was already retired, so I have no current contacts with IBM, but my conversations with him are what brought me to try linux.
03:16_rritochTEttinger: Back then he said linux was IBM's future, but as far as I can tell IBM has mostly stopped producing software, so I'm not sure what ever came of it.
03:17TEttingerthey make X10, which is certainly interesting.
04:29jonathanjcan anyone suggest a good (but not necessarily) complex scheduler? i need to expire database entries at a certain point in time (which is stored in the database)
04:33_tim__is it possible to get lein to generate debug symbols in java classes, similar to what javac -g does?
04:45clgv_tim__: specify :javac-options in your project.clj
04:46_tim__thanks, i'll give it a go...
04:51shriphanihi. has anyone here used monger? I was confused about forming a query to check if an array contained an element. in mongodb, the find query {x: "y"} checks if x contains a "y" but the equivalent monger expression doesn't. Can anyone help ?
05:04noncomshriphani: i used monger, but did not have a similar task
05:04clgvit's not equivalent then ;) maybe you should post your monger expression as well, so that the monger users might help you
05:04shriphanifair enough :) one sec.
05:05shriphani(mc/find-maps db "stuff" {} {:x "y"})
05:05noncomshriphani: maybe https://github.com/michaelklishin/monger/blob/master/src/clojure/monger/operators.clj#L65
05:05noncom?
05:06noncomwhat is depicted on this picture? http://maven.apache.org/images/maven-logo-2.gif
05:07shriphaninoncom, I tried the operator but couldn't figure out how to get a parseable query
05:08shriphani(mc/find-maps db "stuff" {} {:x {$elemMatch "y"}})
05:08shriphaniit refuses to parse it
05:10shriphaniis there a way to force-issue a raw mongodb query ?
05:10shriphanithat would solve my problem and I can go to sleep
05:10noncomshriphani: try ctrl+f "elemmatch" here http://clojuremongodb.info/articles/querying.html
05:11shriphaniyeah I see the examples, I am not sure how to translate them to my case
05:11shriphanibecause they seem to be querying: {:x [{:y y}...]}
05:11noncomgive your exact case
05:11shriphaniand I am querying {:x [y1 y2 y3]}
05:11shriphaniand I want to check if x contains y1
05:12noncom(mc/find db coll {:your-array {$elemMatch "y"}})
05:12noncomshould be this
05:13shriphaniMongoException Can't canonicalize query: BadValue elemMatch: Invalid argument, object required. com.mongodb.QueryResultIterator.throwOnQueryFailure (QueryResultIterator.java:214)
05:14shriphaniso yeah idk wtf is going on
05:14noncomah, wait i wil try
05:19noncomshriphani: hmmm.. yes, there is some problem..
05:20noncomi will try to find out, wait
05:20shriphaniyeah this is pissing me off atm lol.
05:22noncomshriphani: http://stackoverflow.com/questions/23754249/elemmatch-not-working-in-mongodb
05:22shriphanihm. well that is cool
05:22shriphanibut I can issue a query without elemmatch from the mongodb prompt
05:23shriphaniso I wonder what the dsl is doing to fuck that up
05:25noncomheh..
05:25noncomwell..
05:26noncomshriphani: i assume it does nothing
05:26noncomshriphani: (type $elemMatch) gives string
05:28yogsotothHi, could someone help me understand what this really means? https://github.com/metosin/compojure-api#request--response-formats
05:29yogsotothI would like to serve csv
05:29yogsotothbut I don't really understand how I should declare it
05:30yogsotothmore precisely, I don't really understand what they call a request as it doesn't appear to be a "ring request"
05:31shriphaninoncom, that is expected since I presume it just replaces the operator with a string in the final query.
05:31noncomshriphani: heeeeey!
05:31shriphanisup ?
05:31noncomshriphani: try (mc/find-maps @database "test" {:x {mops/$elemMatch {mops/$exists "y1"}}})
05:31shriphanihm and that works ?
05:31noncomyes
05:31noncomor..
05:31noncomwell..
05:32noncomshriphani: i just assume you have to use some other operator in conjunction with elemmatch for simple values
05:32shriphaniyup that did it.
05:32shriphanifuck this.
05:32noncomnono
05:32noncomtry the values that dont match
05:33noncomit still gives them..
05:33noncomi guess it is not the full solution
05:33noncombut closer to it
05:33shriphanihm so I should still report it right ?
05:34shriphanialso I think I fucked up
05:34shriphaninoncom, the dsl works fine
05:34shriphaniI stuck the find query in the second arg not the first.
05:35shriphaniso I guess I just wasted your time. sorry about that.
05:35noncomshtiphani: maybe.. i thuink that there should be some operator to work in conjunction with elemmatch but which gives mongo objects for strings. since it works perfectly with maps
05:35noncomnono that was interesting
05:35noncomi am also into great works with mongo soon
05:35ikitommi_yogsototh I can check that, the csv
05:35noncomactually thanks for the trip :D
05:38noncomshriphani: elemmatch only accepts {}. so there must be something inside that {}
05:39noncomi guess something like {$identity "y1"}
05:39noncombut there is no $identity...
05:39noncomso elmmatch only accepts expressions
05:39noncomnot simple values
05:40noncomshriphani: heeey!
05:40noncomshriphani: now i definetely foud it out!
05:40noncom=> (mc/find-maps @database "test" {:x {mops/$elemMatch {mops/$in ["y1"]}}})
05:40noncom({:_id #<ObjectId 548ac08535fed696b170bf04>, :x ["y1" "y2" "y3"]})
05:40noncom=> (mc/find-maps @database "test" {:x {mops/$elemMatch {mops/$in ["y7"]}}})
05:40noncom()
05:45noncomyogsototh: i believe they mean ring requests really.. why not?
05:46yogsotothnoncom I tried in fact, I also tried to read the code. In fact this is in the declaration of the docs of the api
05:47yogsotothbut I don't understand how to add this metadata nor how can I handle the csv format with a middleware without breaking the actual multi-format system
05:52ikitommi_it is a ring-request, just with extra meta-data to publish the serialization capabilities for docs
05:53yogsotothikitommi_ ok so just a (assoc-in request [:meta :produces] ["csv"]) ?
05:54ikitommi_ok, the docs really suck on that, will write an example of that.
05:54yogsotothikitommi_ that would be just great! Thank you very much.
05:55ikitommi_yes, but that's only for the documentation part -> that would translate "can now produce csv". [:meta :consumes] for the other way
05:59ikitommi_do you have the encoder already implemented?
06:01yogsotothikitommi_ not yet
06:03ikitommi_does anyone btw. know the maintainers of https://github.com/ngrunwald/ring-middleware-format?
06:04ikitommi_related to https://github.com/ngrunwald/ring-middleware-format/pull/26 & https://github.com/ngrunwald/ring-middleware-format/issues/36
06:05yogsotothbtw, my friend and I made a small informal presentation on compojure-api. You could see them here: http://yogsototh.github.io/keynote-compojure-api/#/title
06:08ikitommi_awesome!
06:13ikitommi_I'll write a intro/sample how to add own (ring-middleware-format) serializers to compojure-api, most probably have time to do on weekend
06:13ikitommi_and the swagger 1.2 => 2.0 post is almost ready too.
06:16yogsotothikitommi_ that sounds great!
06:16yogsotothikitommi_ and thanks for your time!
06:25kungiyogsototh: Is there a way to use compojure-api with the reloaded workflow? I tried it once and failed because of some state in compojure-api.
06:25yogsotothyes
06:26yogsotothadd (wrap-if (env :dev) wrap-reload)
06:26yogsotothin your middlewares
06:26yogsotothwith wrap-reload from ring.middleware.reload :refer [wrap-reload]]
06:27yogsotothand [environ.core :refer [env]] for env
06:27kungiyogsototh: thanks :-)
06:27yogsotothWorks with both jetty and http-kit
06:28ikitommi_https://gist.github.com/Deraen/9d65f447593859dd07ae <-- how to integrate Component nicely with compojure-api
06:29kungiikitommi_: \o/
06:30kungiikitommi_: I very much enjoyed your talk at euroclojure this year btw.
06:31ikitommi_good to hear, thanks kungi!
06:36clgvwouldn't (::components `+compojure-api-request+) suffice instead of `(::components ~'+compojure-api-request+) ?
06:37clgv,(read-string "`(::components ~'+compojure-api-request+)")
06:37clojurebot(clojure.core/seq (clojure.core/concat (clojure.core/list :sandbox/components) (clojure.core/list (quote +compojure-api-request+))))
06:37clgv,(read-string "(::components `+compojure-api-request+)")
06:37clojurebot(:sandbox/components (quote sandbox/+compojure-api-request+))
06:37clgvah no.
06:38clgvhumm I dont get the benefit of that expression ^^
06:40ikitommi_benefit? it's generating code to read the value of ::components from ring-request into a plumbing letk assignment
06:41ikitommi_so you can destructure the components like this: https://gist.github.com/Deraen/9d65f447593859dd07ae#file-handler-clj-L20
06:43dagda1_can I prepend to a map, the opposite of assoc
06:43ikitommi_instead of saying (let [db (get-in request [::components :db :db])] ... in every handler.
06:45ffwacomdagda1_: maps arn't sorted
06:46dagda1_ffwacom: meaning that I can not guarantee the order of the keys?
06:46ffwacomnot as far as I know, however they fit into the trie is how they end up
06:56_rritochdagda1: You can accomplish the indended result by maintaining an array of the keys in the map, but as ffwacom stated, they're not sorted, ex ##(list (assoc {:a 0 :c 2} :a 1) (assoc {:a 0 :c 2} :b 1))
06:56lazybot⇒ ({:c 2, :a 1} {:b 1, :c 2, :a 0})
07:25clgvikitommi_: I only ment that particular expression
07:26clgvmeant
07:26clgvthe syntax-quote seems superfluous there
07:43kungi(inc ikitommi_)
07:43lazybot⇒ 1
07:43kungiikitommi_: Thank's for the example it works perfectly.
08:03dnolen_Bronsa: ping
08:04Bronsadnolen_: pong
08:05dnolen_Bronsa: back on fixing recur detection in core.match, looking for the simplest way to do this
08:05dnolen_Ideally I just want to catch a mismatched recur exception
08:06dnolen_I don't care about unknown locals, globals anything else at all
08:06dnolen_possible?
08:08Bronsadnolen_: so you have something like (loop [x 1] (match foo whatever (recur ..))) and need to know that that recur expression refers to the outer loop?
08:09dnolen_Bronsa: I just want to know that recur is present at all, if it is we need to use a different compilation strategy
08:09dnolen_all that stuff is already in place
08:10dnolen_but the recur detection logic is bad, picks up 'recur
08:12Bronsadnolen_: gotcha. so you need to analyze the match body setting up the local env + using (keys &env), look in the core.async source for how to do that
08:13Bronsadnolen_: then you need to assign a loop-id + loop-locals in the env using Compiler/LOOP_LOCALS https://github.com/clojure/tools.analyzer/blob/master/src/main/clojure/clojure/tools/analyzer.clj#L517-L518 to inform t.a that it can recur
08:14Bronsadnolen_: finally using a prewalk on the AST, you can look for the loop-id you generated in the :loops set of :recur nodes, :loops is added by the annotate-loops pass
08:16dnolen_Bronsa: aren't loop locals just locals?
08:16dnolen_Bronsa: I mean understand the special purpose of loop locals - asking about how to derive them.
08:17Bronsadnolen_: from the macro, just bind :loop-locals to (count @Compiler/LOOP_LOCALS)
08:17Bronsadnolen_: if LOOP_LOCALS is unbound there's no outer loop and you can skip the recur check alltoghether I believe
08:17michaelr525hey
08:18michaelr525any way in cursive to enable printing of the whole stack trace in repl?
08:18michaelr525it just prints one line for some reason
08:19Bronsadnolen_: you'll also need to manually perform the annotate-loops initialization in the root AST node https://github.com/clojure/tools.analyzer.jvm/blob/master/src/main/clojure/clojure/tools/analyzer/passes/jvm/annotate_loops.clj#L79-L82
08:20dnolen_Bronsa: I don't suppose I can share logic for Clojure(Script) analysis here, make-env, analyze, get-loop-locals sounds like a copy and pate affair
08:20Bronsadnolen_: I'm kinda busy now but if don't figure it out I can sketch it for you ~Monday
08:21Bronsadnolen_: yeah
08:22dnolen_Bronsa: ok, don't mind digging into this, would be nice to get familiar w/ the analyzers - thanks for the pointers, I think I understand
08:23Bronsadnolen_: I might move the recur validation logic in a pass rather than embed it in the core analyzer so all this will be unnecessary. But for now you'll need to setup it this way
09:37CookedGryphonthis is a long shot... but i don't suppose there's any way to dynamically access the version number in a leiningen project file without factoring out the version at the top
09:37CookedGryphonI want to pass it through as an option to a leiningen plugin without having to tweak the plugin
09:37CookedGryphonjust to concatenate the version on the end of the app title property
09:42stuartsierraDon't plugins have access to the full project map?
09:42jonathanjis it possible to pass parameters to yesql queries by name?
09:43jonathanji mean, i have to name parameters in the query anyway, why can't i pass them by name from clojure?
09:44jonathanjseems like there's an issue filed for this
10:00atyzHas anyone noticed that Emacs seems to format strangely when using certain functions like cond. Is there a way to get it to align the functions correctly? https://www.refheap.com/94798
10:03CookedGryphonatyz: depends what you mean by correctly, those look more or less correct to me
10:03CookedGryphonif you wanted it aligned past the end of the cond, you wouldn't have put the newline right after teh cond
10:10atyzCookedGryphon: not at the end of the cond. Its one space vs 2 spaces
10:10atyzErm 0 spaces vs 2 spaces
10:10atyzThe first one looks like a collection of things. whereas the 2nd one makes it easier to see that its a fn call
10:13CookedGryphonI think that's standard for anything that doesn't have bindings or something on the first line...
10:16atyzDo you not think the 2nd on is easier to read?
10:22CookedGryphonnot particularly, but then I'm used to the emacs behaviour
10:35mgaareCan someone help me with an aleph/gloss/manifold problem? I seem to be having a stupid - http://pastebin.com/LuVnFcga
10:42jonathanjhrm, how do i do update-in for multiple (unnested) keys?
10:43justin_smith,(-> {:a 0 :b 1} (update-in [:a] inc) (update-in [:b] dec))
10:43clojurebot{:b 0, :a 1}
10:44justin_smithif you need the keys to depend on each other in some way, then you want something other than update-in though
10:45jonathanjjustin_smith: no, that's what i want, thank you
10:50jonathanjjustin_smith: hrm, how about only perform both update-ins on the condition that the map is not empty?
10:50jonathanjis it possible to retain the use of the threading macro?
10:58justin_smith,(some-> {:a 0 :b 1} (update-in [:a] inc) (update-in [:b] dec))
10:58clojurebot{:b 0, :a 1}
10:58justin_smith,(some-> {} (update-in [:a] inc) (update-in [:b] dec))
10:58clojurebot#<NullPointerException java.lang.NullPointerException>
10:58justin_smitherr
10:58justin_smith,(some-> {} not-empty (update-in [:a] inc) (update-in [:b] dec))
10:58clojurebotnil
10:58justin_smiththere we go
10:59Glenjamin,(some-> {:a 0 :b 1} not-empty (update-in [:a] inc) (update-in [:b] dec))
10:59clojurebot{:b 0, :a 1}
10:59Glenjaminah, didn't realise not-empty returned coll
10:59justin_smiththat's pretty much why not-empty exists - otherwise you could use seq
11:07mmghi, I’m using core.async and calling a 3rd party library. I noticed that the library is periodically killing my thread (I filed a bug report with them) but I need a work around… is there a way to have a worker pool in core.async ? like this go-loop has 5 workers at all times? And preferrably some kind of way to ensure there are always X workers? Alternatively if someone has a better idea for a work around I’d love to hear it
11:08justin_smithmmg: core.async already has a thread pool - perhaps you need a way to add threads back to the pool if the client is killing them? or only use the client outside of go blocks.
11:09justin_smiths/client/3rd party lib/
11:10mmgum… I think it’s specifically the go-loop abstraction is staying on one thread, so maybe if I just manually started like 5 of those ?
11:10mmgalso without a ref to the Thread object I’m not sure how to determine if it’s still alive or just taking a long time
11:10justin_smiththat's not what go loops do. There is a pool for core.async, it runs those go blocks that are available for running.
11:11justin_smithyou could check the core.async thread pool, and verify whether all its threads are alive and present
11:11justin_smiththere is also ##(Thread/currentThread)
11:11lazybot⇒ #<Thread Thread[Thread-5426,5,sandbox]>
11:11justin_smithwhich you can store and check in the future etc.
11:11mmgyeah that’s a good point
11:11mmgthanks
11:13trisshey all. if I've got a list of items and want to call a function on each pair of them what would be the simplest means?
11:13trissam I looking at using reduce or something?
11:13justin_smith,(map #(apply + %) (partition 2 (range)))
11:13clojurebot(1 5 9 13 17 ...)
11:13justin_smiththat's 0+1, 2+3, 4+5, 6+7, 8+9, etc.
11:14justin_smithor do you want to step by only one item?
11:14justin_smith,(map #(apply + %) (partition 2 1 (range)))
11:14clojurebot(1 3 5 7 9 ...)
11:14justin_smiththat's 0+1, 1+2, 2+3, 3+4 ...
11:18trisswicked thanks justin_smith
11:35ppppaulwhy doesn't pprint work in clojurescript?
11:45dnolen_ppppaul: hasn't been ported
11:46dnolen_ppppaul: I started copying some things over but it's going to be bit of a project.
11:48noncom|3what is the most idiomatic way to know if a {} is a subset of another {} ?
11:49noncom|3i want to create a predicate for a filter that filters a set of {}s on subject of containing a complete predicate {} ?
11:49stuartsierranoncom|3: clojure.set/subset?
11:49noncom|3stuartsierra: does it work for nested maps ?
11:49noncom|3i will check now..
11:50stuartsierraOh, you mean if one map has a subset of keys in another map?
11:51noncom|3stuartsierra: yes, keys and values and everything
11:51noncom|3stuartsierra: actually, i would word it as "is a {} fully contained inside another {}? "
11:52noncom|3i know i can write a function for that.. but what is the most idiomatic way?
11:52noncom|3* a recursive function
11:53awkoramawhat is non idiomatic about writing a function?
11:55stuartsierranoncom|3: Maybe something like (every? (fn [k] (= (get map-a k) (get map-b k ::not-found))) (keys map-a))
11:56noncom|3awkorama: indeed it is idiomatic, i am just not sure how well i can write it so that it be the most idiomatic clojure :)
11:58awkoramanoncom|3: are you considering maps as keys as well ?
11:58justin_smith,(let [a {:a 0 :b 1}] (= a (select-keys {:a 0 :b 1 :c 2}) (keys a))) ; noncom|3
11:58clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/select-keys>
11:58justin_smitherr
11:58justin_smith,(let [a {:a 0 :b 1}] (= a (select-keys {:a 0 :b 1 :c 2} (keys a)))) ; noncom|3
11:58clojurebottrue
11:59awkoramai mean, would your fn return true for following {{foo bar a b} {x y}} and {{foo bar} {x y}} ?
12:00justin_smithstuartsierra 's method may be faster, but I think that version is pretty clear
12:00noncom|3stuartsierra, justin_smith: these two work! thank you, gonna learn the aesthetics!
12:00noncom|3awkorama: yes, keys too should match
12:00awkoramashould match or should a subset?
12:00awkoramashould be**
12:01justin_smithawkorama: oh, so you are suggesting a recursive version?
12:01awkoramacause i think that becomes a non trivial problem
12:01noncom|3the pred {} must contain all keys of a {} and all the keys should have the same values as in the {} being trialed
12:01justin_smithyeah, the recursive version is harder - but I can't think of a use case for it either
12:01justin_smithand it isn't what noncom|3 is talking about iether
12:02noncom|3my use case: i have to find json subobjects that match a certain criteria (contain certain kv pairs)
12:02awkoramayeah, but jsons are trees (nested maps)
12:03awkoramanesting in the values only though
12:03justin_smithnoncom|3: another more sophisticated approach would be to define schema's with prismatic/schema and check if an object matches that schema. But if select-keys works it makes sense to just use that.
12:03justin_smithawkorama: can json have a map as a key even?
12:03awkoramajustin_smith: no, but clojure can i think
12:03justin_smithyes, it definitely can
12:04awkoramabut then it becomes a very interesting problem, i mean if even theoretical
12:04justin_smithyou could implement select-superset-keys
12:04noncom|3http://www.refheap.com/94806
12:04justin_smiththen recurse
12:04noncom|3see, the subobjects are stored under uuids
12:05justin_smithnoncom|3: yeah, you can totally use select-keys to test which kind you are getting
12:05noncom|3so i have to find the particular subobjects that have certain "isa" and "name" kvs
12:05noncom|3oh, fine! :)
12:05awkoramanoncom|3: i don't think i am helping you know, i just generalised your problem to become a more interesting one, not practical though
12:05justin_smithnoncom|3: but for something more sophisticated you still may want to try prismatic/schema
12:06noncom|3so in the end, i have to get their uuids
12:06justin_smithif you ever need that
12:06noncom|3oh, the prismatic wizardry...
12:07justin_smithso I am playing with datomic and data.csv to load a bunch of campaign contribution info for querying (public good project) - clojure populates the db so much faster than emacs can print out the contents, it's kind of sad
12:08justin_smiththis is even with emacs scrolling so fast you can't read anything
12:08noncom|3justin_smith: about prismatic schema: so, all i have to do with it is just (s/validate data pred) ???
12:08lazybotnoncom|3: Oh, absolutely.
12:08noncom|3that simple?
12:09ppppaulis there a function that will let me do a (distinct) but on a key?
12:09ppppaulhttps://gist.github.com/boxxxie/7bbe149d1bfa481dcb57
12:09ppppauli made this that does what i want, but it uses set 2 times
12:14justin_smithppppaul: maybe you want group-by
12:15ppppauli thought of that... but i would have to map over that as well
12:15justin_smith,(group-by :sha [{:sha "a" :id 1} {:sha "a" :id 2} {:sha "b" :id 3}])
12:15clojurebot{"a" [{:id 1, :sha "a"} {:id 2, :sha "a"}], "b" [{:id 3, :sha "b"}]}
12:16justin_smithI think it would still lead to a simpler answer though
12:16ppppaulmy output is a set of 1 element
12:16ppppaulin my example
12:18justin_smith(->> data (group-by :sha) (map #(update-in % [1] first)) vals)
12:19justin_smithactually (->> data (group-by :sha) (map (comp first second)))
12:19justin_smiththen make it a set if you like, but either way the sha1 will only occur once each
12:20ppppaulthanks
12:21noncom|3justim_smith: sadly but schema only checks for types, not values...
12:22justin_smithppppaul: or you could use sorted-set-by - dunno if this is abusing it though ##(sorted-set-by #(compare (:sha %) (:sha %2)) {:sha "a" :v 1} {:sha "b" :v 1} {:sha "a" :v 2})
12:22lazybot⇒ #{{:v 1, :sha "a"} {:v 1, :sha "b"}}
12:23justin_smithyou just conj things on, it will only end up having one item with a given :sha key
12:24justin_smithnoncom|3: I think it could be done by defining a set of values allowed. But probably you just want select-keys and =
12:24noncom|3yeah
12:25noncom|3just researched the schema thing
12:33justin_smithschema is generally pretty great though
12:34justin_smitheven as a kind of enforcable documentation of my own code
12:38EvanRis there a common syntax trick to type in date(time) literals
12:38EvanRlike there is with regex
12:39justin_smith&#inst "2001-1-1"
12:39lazybotjava.lang.RuntimeException: Unrecognized date/time syntax: 2001-1-1
12:40justin_smitherr
12:40justin_smith&#inst "2001-01-01"
12:40lazybot⇒ #inst "2001-01-01T00:00:00.000-00:00"
12:40justin_smiththe rest of the numbers are the time, and the timezone offset
12:40justin_smith,(java.util.Date.)
12:40clojurebot#inst "2014-12-12T17:38:21.228-00:00"
12:41EvanRah inst
12:41EvanR(though, the offset does not survive the conversion to java.util.Date
12:41EvanR)
12:42justin_smithright, but you could convert to a Calendar instead
12:42justin_smithor whatever
12:42justin_smithor separately grab the tz offset
12:42EvanRwith #inst ?
12:42justin_smith,(type #inst "0000-00-00")
12:42clojurebot#<RuntimeException java.lang.RuntimeException: failed: (<= 1 months 12)>
12:42justin_smith,(type #inst "0000-01-01")
12:42clojurebot#<SecurityException java.lang.SecurityException: denied>
12:42justin_smithhrmph
12:43justin_smith&(type #inst "0000-01-01")
12:43lazybot⇒ java.util.Date
12:43justin_smithyeah, that's too bad
12:47justin_smithEvanR: actually no, the timezone is part of the Date ##(.getTimezoneOffset #inst "0000-01-01T00:00:00.000-07:00")
12:47lazybot⇒ 0
12:47justin_smitherr....
12:48EvanRno
12:48justin_smithyeah, I dont' know where it is getting the .getTimezoneOffset from, but clearly not from the object, sorry
12:48justin_smith,(bean (java.util.Date.))
12:48clojurebot{:day 5, :date 12, :time 1418406382786, :month 11, :seconds 22, ...}
12:49justin_smith,(:timeZoneOffset (bean (java.util.Date.)))
12:49clojurebotnil
12:49justin_smith,(:timezoneOffset (bean (java.util.Date.)))
12:49clojurebot0
12:49kryftI'm writing a web backend in clojure, and I'd basically want to return something like {:status 500 :body "sql exception"} from any handler that accesses the db and gets an exception from jdbc. Do I need a macro for that?
12:49kryftIf I want to minimize boilerplate, that is
12:50justin_smithkryft: (defn wrap-db-error [handler] (fn [request] (try (handler request) (catch some.jdbcException e {:status 500 :body (.getMessage e)}))))
12:50justin_smithas a middleware
12:51justin_smithjust figure out which exception(s) you want to be catching
12:51kryftjustin_smith: Ah, right, of course
12:52kryftThanks!
12:53justin_smithin fact, at least in dev mode, you can catch all Exception thrown that way - you may want to get the string from the stack trace too (string/join "\n" (map str (.getStackTrace e)))
12:55kryftjustin_smith: Right, the app is simple enough that I could just catch everything; it's not like I can do anything smarter than signal "server error" in any case
12:55justin_smithactually (string/join "\n" (.getStackTrace e)) suffices
12:56EvanRjustin_smith: i think timezoneoffset in Date is some marginally useless thing related to its also confusing and i *think* mostly useless hidden internal Calendar
12:56EvanRDate is really a epoch / utc timestamp
12:56justin_smithyeah, nothing about the Date object itself seems to influence the timezonOffset, I was misled
12:56upwardindexIs there a more idiomatic way of writing (zipmaps keys (map fun keys)) ?
12:57upwardindexs/zipmaps/zipmap/
12:58justin_smith,(into {} (map (fn [k] [k (.toUpperCase k)]) ["a" "b" "c"]))
12:58clojurebot{"a" "A", "b" "B", "c" "C"}
12:58justin_smithdon't know about more idiomatic, but at least it only walks the sequence ocne instead of twice
12:58justin_smith*once
13:01dnolen_core.match 0.3.0-alpha1 released, feedback welcome
13:01dnolen_https://github.com/clojure/core.match
13:04devlldnolen_: why there is no issues for core.match?
13:04anneliesJIRA
13:04annelieshttp://dev.clojure.org/jira/browse/MATCH
13:04anneliesdevll: ^
13:05devlloh,I see. thanks.
13:05dnolen_devll: Clojure contrib library issues are tracked in JIRA
13:18DiffEngrI have some clojure style questions. Would this be an OK place to ask about them?
13:18dnolen_DiffEngr: yes
13:20DiffEngrstyle question 1: I have taken to using ... multifunctions/arity to have a version of a fn that destructures a map, and then another more "bare" version of that function that takes the raw arguments
13:21DiffEngrand then the destructuring version calls the raw version with the destructured values
13:22dnolen_DiffEngr: seems a bit odd to me anyway, I would just have all arities take the map
13:26DiffEngrthe in use form might be (draw-thing complex-map), but the, um, testing form might be (draw-thing [0 0] [100 100])
13:27DiffEngrI guess I consider the map-form as a convenience, and the non-map as the "pure" form
13:27oskarkvDiffEngr after you have destructured the map it seems pointless to call the other-arity function. And perhaps you need the different arities later
13:29DiffEngroskarkv: The point, for me, is an easily tested/comprehensible form. That's probably b/c I'm a beginner.
13:29oskarkvDiffEngr isn't it easy to just make a map when testing? (draw-thing {:a [0 0] :b [100 100]})
13:30DiffEngroskarkv: the map might be deeper than that
13:30noonianDiffEngr: if its just for testing in the repl, i might make a custom user ns with (defn test [a b] (draw-thing :a a :b b)) or w/e
13:30noonian(draw-thing {:a a, :b b})
13:31oskarkvok ;) anyway i think most people don't use arities in that way
13:31DiffEngrnoonian: cool, I'll try that. Thanks for the input gang.
13:34kryftHmm, in what namespace is SQLException defined? (If I want to catch SQLException specifically)
13:38nooniankryft: probably java.sql.SQLException https://docs.oracle.com/javase/7/docs/api/java/sql/SQLException.html
13:40kryftnoonian: Yes, (:import java.sql.SQLException) seems to do the trick; thanks
13:40nooniannp
13:41kryftCould I have found that out somehow? I didn't see it in (say) the jdbc API docs, although they refer to SQLException
13:42nooniani just googled "java SQLException" and found the class from the javadocs for the exception
13:43kryftAh, right, because it has nothing to do with clojure as such
13:43noonianyup
13:43kryftI have practically zero java background, and it shows sometimes :)
13:44noonianyeah, a lot of people come to clojure with no experience with java or the jvm
13:50awkoramawhat is usually these people's background then?
13:50awkoramaother lisps ?
13:53nooniansome people come from java, some from lisp, some from ruby/python backgrounds, and maybe a few js devs interested in clojurescript
13:57crash_eprefuge is granted to all
14:07DiffEngror Objective-C!
14:08jarjar_primeyay for objective-c :-P
14:17SparkySparkyBoomi came from scala :D
14:17SparkySparkyBoomhavent really given up on scala though
14:20uris77_im coming from java/groovy and javascript (mostly javascript these days)
14:27justin_smithawkorama: I came from scheme / ocaml / common lisp, but clojure could more easily be deployed to a corporate stack
14:29EvanRhahahaha
14:30dottedmag"I have imported this handy Java library" (c)
14:33awkoramawell i think clojureCLR will become a main target in some time, because of the new Microsoft's "we love you all" policy
14:34uris77_hmm, I think it is more likely that more ppl adopt F# because of that
14:34uris77_instead of more ppl flocking to clojure
14:34dottedmagI think IT guys from that bank will print T-shorts with a slogan "We embedded Lisp in your Java when it was not yet a mainstream"
14:36noonianif you're looking for a lisp though F# isn't really in the running
14:37awkoramai was just thinking why RH chose JVM as his primary target. I reckon it was because it was good enough virtual machine that is multiplatform and (semi)open
14:38awkoramawhen CLR becomes more open and multiplatform, there is no reason to stay in jvm as primary target, i think
14:40uris77_there is still the matter of learning the tools for CLR, it won't be so straightforward
14:40awkoramauris77_: you mean the ecosystem?
14:41noonianjvm will still be stable, performant, and have tons of libs so there's no reason to abandon it
14:42nooniani think its great that we can target both platforms with clojure though
14:42justin_smithsome people are targetting node too (ie. for the lower startup time since closure compiler gives us tree shaking and you don't deploy the compiler)
14:43kryftHeh, "tree shaking", I like it. :) (I had never heard the term before, but the meaning was immediately obvious)
14:44justin_smithkryft: it's a nice term of the art
14:45awkoramajustin_smith: can you repl to the running node/clojure application if you don't have the compiler ?
14:45justin_smithawkorama: I don't think so, it can't eval anything after all
14:45justin_smithyou need the jvm for the eval part
14:46justin_smithrEpl
14:46arrdemjustin_smith: correct.
14:46awkoramai don't know much about clojurescript
14:46awkoramaso in clojurescript one can not do (eval "(+ 3 4)") ?
14:47awkoramaor i mean (eval '(+ 3 4))
14:47uris77_awkorama: yeah, I mean the ecosystem and knowledge transfer.
14:47Bronsaawkorama: right, you can't. cljs doesn't have a resident compiler
14:47uris77_for example, I would love to work with F#, but it means I have to get very familiar with the tools for managing an application in the CLR
14:48uris77_the PaaS services I can use, nevermind having to use windows and invest in tooling there.
14:48awkoramawell managing an application written in clojure on jvm is a difficult task as well, mainly for modern java programmer using spring-boot and the like
14:48awkoramauris77_: that is all about to change, microsoft wants to run server side .net on linux
14:49uris77_yeah, running on linux is one thing, tooling is something else. For example, I know how to deploy netty/jetty tomcat, etc. jmx ...
14:50uris77_don't know the CLR equivalent, plus having to maybe use azure (instead of heroku, cloudfoundry or aws or dropbox)
14:50awkoramawhy azure?
14:50awkoramai mean, linux can be run on all of the clouds that are IaaS, right?
14:50uris77_because I'm asuming that the deployment story for CLR is better in azure.
14:50awkoramaregarding PaaS, it's just a matter of time till it runs .net
14:51awkoramauris77_: it's pretty bad in azure as well, microsoft is trying to change it, once they do, it will be good on all IaaS providers
14:51uris77_yeah, I hope so. Would love to write some F# apps
14:51uris77_yeah, we tried azure 2 years ago and had to switch
14:51uris77_it was terrible
14:52awkoramaalso CLR might actually be better for clojure since it was made to support multiple languages from the start
14:52uris77_i still don't think the clojure apps will be portable across hosts. Will be similar story we have with clojurescript
14:52uris77_because clojure doesn't hide the host from you
14:53awkoramauris77_: sure and that's a good thing
14:53tbaldridgeawkorama: I wouldn't be so sure about that. On average ClojureCLR runs about 50% slower than Clojure on the JVM
14:54awkoramatbaldridge: well it wasn't a target for much optimization in the past
14:54tbaldridgethe whole "portable" bit of the CLR is a bit of a mis-nomer
14:55tbaldridgeawkorama: it's a bit more than that the platform itself is much slower, lacking a profiling JIT, being more statically typed than the JVM, etc.
14:56awkoramatbaldridge: Well I might be wrong, I just think that microsoft is trying to open .net more than oracle does with java, that does bring in community and community usually solves most of the problems that you described.
14:56justin_smithawkorama: jvm clojure relies on the vm for most of its optimization, the parts that aren't optimized by the vm itself should be portable improvements that also increase the performance on CLR
14:58tbaldridgeawkorama: perhaps, but I see no word form MS about the CLR gaining a profiling JIT, and something like that is really a must for Clojure to perform decently.
14:58awkoramatbaldridge: :) i am not saying that it will be tomorrow
15:00awkoramahttps://github.com/Microsoft/dotnet/commits/master
15:01awkoramathey open sourced the platform not a month ago and they already accept pull requests, try that with oracle
15:02noonianbut whats wrong with the jvm? i don't think clojure needs it to change at all really (although TCO would be nice)
15:03awkoramathere are many platforms that are not wrong and clojure does not target it as primary
15:03tbaldridgeawkorama: ummm that repo only contains docs, no code.
15:05awkoramaah, sorry
15:06awkoramahttps://github.com/dotnet/corefx/commits/master
15:06awkoramathis one then
15:08tbaldridgeawkorama: I guess what I'm saying is this: .NET has always had a one-shot JIT. it's the way it's always been and recent efforts have focused around AOT not gaining amore performant JIT. I don't see that happening anytime soon. And getting a more advanced JIT is exactly what Clojure on the CLR would need.
15:09awkoramatbaldridge: what other languages (or types of languages) would benefit from better jit on clr ?
15:09tbaldridgeDynamic languages, the very type that MS has ignored for years.
15:10tbaldridgeSee typescript, C#, F#, etc. MS hasn't pushed a dynamic language in years (ever?).
15:10hiredmanwell, in typical microsoft fashion ignoring the means releasing a product, hyping it, then dumping it
15:10hiredmanhttp://en.wikipedia.org/wiki/Dynamic_Language_Runtime
15:10tbaldridgenaw...they'd never do that ;-)
15:12tbaldridgeDLR still exists in the form of dynamic, but yeah, that's more akin to invokeDynamic then something like Hotspot.
15:17akurilinquestion: do you guys have a recommendation for xss-sanitizing user input in my clojure json api?
15:18akurilinis there a lib out there that'd make it reasonably straightforward?
15:34cfleming$mail michaelr525 There's a button on the toolbar you can use to print the whole stack trace - by default nREPL only sends back a summary.
15:34lazybotMessage saved.
15:57abaranoskycould anyone here give me a little quick help with the Cheshtnut library for Clojurescript? (https://github.com/plexus/chestnut)
15:57micryptabaranosky: What's the matter?
15:58abaranoskyI'm relatively new to CLJS, and thought I could connect to the Weasel repl directly from Emacs
15:58CRM114SLIME?
15:58abaranoskyM-x cider Host: 127.0.0.1 Port: 9001
16:03micryptabaranosky: M-x cider-jack-in. Then `(run)(browser-repl)` … IIRC.
16:06abaranoskymicrypt: after doing that, how do I connect to the weasel repl so I can evaluate code form cljs?
16:06abaranoskyor am I missing something fundamentally here ?
16:07micryptabaranosky: Haven't looked at this in a while, but I vaguely remember that you ought to already be connected.
16:07abaranoskymicrypt: .... investigating....
16:11abaranoskymicrypt: thx, I got it working. You're the man :)
16:14brucehaumandnolen_: well the warnings are gone in 2202. But things seem to be really robust in 2411.
16:14brucehaumandnolen_: that is just a feeling
16:15shriphanihey everyone. I don't follow clojure on jira so frequently so this might be a n00b question. Is clojure 1.8 going to come with a speedup
16:17dnolen_shriphani: what kind of speedup?
16:18shriphaniprogram startup
16:18shriphanidnolen_ ^
16:18shriphanirepl launches still take a lot of time compared to say python.
16:20dnolen_shriphani: launching a regular Clojure REPL doesn't take very long - like a second on my machine
16:20shriphaniI am presuming you're doing this with lein repl ?
16:21dnolen_shriphani: that's not a *regular* Clojure REPL
16:21shriphaniah.
16:21EvanRlein repl, takes about 10-20 seconds for me
16:21shriphaniso I am presuming this is a question about how to make a lein repl launch faster
16:22TEttingershriphani, there have been some good experiments done there. grenchman, drip
16:22dnolen_shriphani: there's whole lein github wiki page about it that
16:23justin_smiththere is a beautiful flow one can achieve in clojure, where you step by step transform the shape of the data into the shapes needed. It feels like juggling, if I were good at it.
16:24SagiCZ1justin_smith: do you think all problems can be described as shaping data?
16:24justin_smithSagiCZ1: hmm... I am not 100% sure if that is always *useful*, but I am sure it is always possible
16:25justin_smithbut I enjoy the flow and discovery of solving the problem domain when I model my task that way
16:25justin_smithand watch the data structures I produce achieve the shape I need
16:25SagiCZ1i really like you can easily shape collections using apply filter map etc.. end write it as (-> coll foo1 foo2 ... ) it really looks great and is super readible
16:25justin_smith(and as a final stage I of course have the imperative thingy that takes that data structure and does the io or transaction or whatever)
16:26justin_smithSagiCZ1: yes, and has a nice developer workflow for incrementally reaching a solution
16:26EvanR-> a b c d is also known as (comp b c d) a if the arguments were in another order
16:26SagiCZ1yup.. i would love to apply similar solutions to more problems than i already do
16:26SagiCZ1EvanR: not as readible to me..
16:27justin_smithSagiCZ1: so far it seems like one of the most imporant tricks is starting with an imperative stage that has no logic, then building the data structure that I know that stage should receive
16:27EvanRSagiCZ1: well, what i was suggesting is the way unix pipe programs look
16:28EvanRjust making sure those arent readable either
16:28SagiCZ1justin_smith: what do you mean by imperative stage without logic?
16:28SagiCZ1EvanR: i guess.. i have no experience with unix pipes sadly
16:28EvanRan as some aside biggotry, i cant stand any syntax that begins with a right arrow with nothing on the left
16:29EvanRlooking at ruby
16:29EvanRand coffee
16:29SagiCZ1oh
16:29SagiCZ1ok maybe it was not a good example.. sorry
16:29justin_smithSagiCZ1: as in (perform-transaction data)
16:29justin_smithSagiCZ1: and that is the only place where a side effect occurs
16:29justin_smithso everywhere else I can just construct the data structure that drives the transaction, without thinking about ordering etc.
16:30SagiCZ1yeah.. so basicaly isolating the places where side effects happen
16:30EvanRjustin_smith: in which case, youd probably describe it as the main effect, the point of that part of the program
16:30justin_smithlike a breandead monad
16:30justin_smithsure
16:30justin_smith*braindead
16:32SagiCZ1i was a little bit dissapointed with clojure lately.. when i write code that looks really nice and is functional.. only to find out later that it is unusebly slow, because by abstracting the data manipulations my algorithms end up for example O(n^2) or worse.. so then i have to go back, optimize and the result is usually uglier
16:32EvanRand you can use mutation to implement a function and still keep it pure as far as an observer can tell, if it would make it faster or more readable
16:33amalloythat's a fairly unusual occurrence, SagiCZ1: clojure encourages you to use appropriate data structures, with the easily-available maps, vectors, sets, and so on. what did you accidentally write inefficiently?
16:33turbofailseriously i've never had that problem
16:33SagiCZ1amalloy: its totally posible i am actually NOT writing a good clojure code.. and i am just writing a bad clojure code which is .. well bad
16:33turbofaili've had problems where the constants were larger than i'd like, but never a problem with orders of growth
16:34edwSagiCZ1: Do you have an example? I have trouble imagining where writing pure, elegant code would result in raising the exponent of the time or space complexity of a solution.
16:34edw(What turbofail said.)
16:34justin_smithI think you do have to develop a "nose" for things which increase your complexity-order
16:34shriphaniedw, linear algebra ?
16:34SagiCZ1it was an algorithm which would find two closest points in a collection of points
16:35justin_smithyeah, doing that in an 'intuitive' way could easily blow up
16:35stuartsierraI think this is true of imperative programming too: for any algorithm, there is frequently a solution which is simple, obvious, and slow.
16:35shriphaniSagiCZ1, I would floyd warshall that.
16:35shriphanior nvm.
16:35SagiCZ1justin_smith: yep.. maybe it is just a coincidence, but i remembered that occasion
16:35edwshriphani: Naive, un-special-cased matrix code is always going to be molasses-slow. That's not a functional vs imperative issue.
16:36turbofailyeah the simple way of doing that problem is going to be n^2 in imperative code as well
16:37SagiCZ1also i have a very hard time imagining how much space in memory clojure collection can actually take up.. do you guys calculate it some way?
16:38stuartsierraSagiCZ1: Estimating memory usage for *anything* in a managed runtime like the JVM is hard.
16:39TEttingerstrings in particular use different backing structures at different sizes, IIRC. when profiling string heavy code you often see com.sun packages being used
17:44devnhrm, single page clojurescript app + friend-oauth2, the solution i have working is a total hack.b
18:12andyftechnomancy: I have a recollection of someone, perhaps you, expressing wishes that Clojure complained about keywords other than :use :require :import and a few other documented ones. Was it you?
18:15andyfe.g. a warning or error if someone did something like this, which Clojure happily turns into a call to the println function: (ns my.ns (:println ?Hello ns form!?))
18:16andyfwhich would be syntactically correct if I could figure out a way to get my IRC client to avoid using smart quotes by default whenever I start it up again.
18:16andyfAnyway, in case you do read this, I am working on an Eastwood linter that will warn about various wrong and/or suspicious things about ns forms, and am looking for ideas.
18:26stuartsierraandyf: I've often wished the `ns` macro were stricter, because I had to try to work around all the different variations in syntax for tools.namespace.
18:27andyfstuartsierra: To be clear, I am not here proposing to create a ticket to make changes to Clojure's ns form -- only to warn about things that look wrong or suspicious in Eastwood.
18:27stuartsierraandyf: I know. But that would still help. :)
18:27andyfTop of my list is to warn about references in vectors, i.e. http://dev.clojure.org/jira/browse/TNS-21
18:28andyfwarning about keywords other than :require :use :import and the few other documented ones is also easy.
18:29andyfSomeone suggested the following in an Eastwood issue, but I haven't investigated it enough to see whether it is even a correct suggestion: https://github.com/jonase/eastwood/issues/98
18:31andyfBasically, if someone ever had a wrong ns form that took them a while to figure out a problem with it, and it can be detected "syntactically", I'm interested.
18:31stuartsierraandyf: That looks correct (#98). `:only` doesn't mean anything in `:require`, and the example is missing a vector around the libspec.
18:33stuartsierraandyf: If you're interested in all the forms that tools.namespace understands (which is a subset of what Clojure allows) see https://github.com/clojure/tools.namespace/blob/5b0944994b12f1a18b4c5763ce2a5d7ab5b49085/src/main/clojure/clojure/tools/namespace/parse.clj
18:34andyfI'll dig more, but you mean you think it should start with (:require [some.lib] instead of (:require some.lib ? I thought Clojure handled it with the bare lib spec.
18:35Caffeinehttps://clojars.org/core.logic is super duper confusing. It says to use [core.logic "0.6.1-SNAPSHOT"] for lein, but it doesn't work, you have to use [org.clojure/core.logic "0.8.8"]. I where to report this issue, or if it's even one (or if I'm confused)...
18:35andyfYep, I have been looking at that namespace and using pieces of it. May use more.
18:35stuartsierraandyf: a bare lib name is OK, but that example has `(:require some.lib as lib)` which doesn't work.
18:35stuartsierraThat is, `(:require some.lib :as lib)` instead of `(:require [some.lib :as lib])`
18:36Caffeines/I where/I don't know where/
18:36andyfgot it. I don't have the allowed syntax memorized yet, but probably will by the time this linter is done.
18:37stuartsierraandyf: The docstrings for `ns`, `require`, and `use` are also quite specific about what the syntax is supposed to be.
18:38stuartsierraCaffeine: clojars.org is not a definitive reference for anything. The README at https://github.com/clojure/core.logic shows the current release version.
18:39stuartsierraAlso, everything under github.com/clojure/ is published by default to the Maven Central Repository <http://search.maven.org/&gt; not Clojars.
18:39andyfI agree clojars.org isn't definitive for Clojure contrib libraries like core.logic, but surely it is definitive for libraries only deployed there?
18:39hiredmanwhat does definitive mean?
18:40andyfone dictionary defn: "the most authoritative of its kind: e.g. the definitive biography of Harry Truman"
18:42hiredmanthe definitive most up to date version in a maven repo?
18:43mjoanisok, that's weird... I guess the page should be taken down... outdated enough
18:44hiredmansome day, a kademlia federated maven repo
19:21SpikeMasterhi clojure
19:22andyfhowdy
19:22SpikeMasterwhat's the best tooling for clojure? (advanced users). IDE?
19:23Bronsa(inc andyf) ;; thanks for the sanity check on CLJ-979
19:23lazybot⇒ 11
19:23SpikeMaster(inc andyf)
19:23lazybot⇒ 12
19:24SpikeMasterwhoah. wanted to see if that was real
19:24andyfopinions vary. Cursive is shaping up to look impressive. Eclipse+Counterclockwise is used by some. Vim+Fireplace and Emacs+CIDER are perhaps the most common.
19:25BronsaSpikeMaster: even if I personaly use emacs, if I had to start from scratch now I'd go with Cursive Clojure 100%
19:25arrdemAgreed. Cursive is pretty awesome and is easier to pick up.
19:25arrdemEmacs... can be an investment.
19:26andyfYou can get a rough idea of what fraction of people use what under the "What is your *primary* Clojure/Script/CLR dev environment?" question here: https://cognitect.wufoo.com/reports/state-of-clojure-2014-results/
19:26SpikeMasterlets say you are a master of Eclicpse, Vim, and Emacs. A true master that understands the tools at the source code level. Which would you go with?
19:27noonianemacs
19:27andyfSpikeMaster: If you find someone who understands all of those tools at the source code level, let us know :)
19:29arrdemhehe
19:29arrdemBronsa: oi got a minute
19:30sg2002SpikeMaster: I'd say it all depends on your project. Whehter you need a debugger. Whether you need java interop. Emacs is terrible for java for example. There are many things to consider.
19:30Bronsaarrdem: yeah
19:31SpikeMasteremacs is awesome for C# with omnisharp. Shame it sucks for java.
19:31SpikeMasteri am actually adept at all 3 tools. Vim, Emacs, and Eclipse.
19:31arrdemBronsa: https://www.refheap.com/94814 <- Clojure grammar. Namespace qualified symbols are hitting a parser conflict. mind taking a look.
19:32Bronsaarrdem: I said I got a minute, not sure about the brain power :P
19:32BronsaI'll take a look
19:32arrdemBronsa: lol thanks.
19:34arrdemBronsa: I'm expecting that the string "foo/bar" will be ...
19:34andyfarrdem: What parser tool are you using?
19:34arrdemson of a gun I found it
19:34arrdemBronsa: I'm good. thanks.
19:34Bronsacool.
19:34arrdemandyf: antlr4
19:34arrdemandyf: via aphyr's clj-antlr4
19:34arrdemnot what I'd call... user friendly
19:34andyftools.reader doesn't do what you want?
19:35arrdemandyf: Oxlang stuff. Trying to stand free of Clojure infrastructure :P
19:39BronsaI'm really biased because I like to see my name on a commit but if CLJ-979 gets in 1.7.0 it'll be really good for the AOT story in clojure
19:41arrdemnice. keywords and symbols working now.
19:41andyfBronsa: You've certainly been working at that one hard enough :-) Thanks.
19:41arrdemjustin_smith: lazybot plugin to generate CLJ-XXXX links?
19:42Bronsaandyf: I now know much more about jvm classloaders than I'd ever wished I did
19:43arrdemBronsa: gross problem. nice patch.
19:43justin_smitharrdem: yeah, that would actually be pretty cool. you can make an issue for that feature on my lazybot fork if you like
19:43arrdemjustin_smith: willco
19:43justin_smitharrdem: speaking of features, I should do some more work on hint-hint
19:43arrdemjustin_smith: dude you have issued turned off
19:43arrdemjustin_smith: you're not a contrib
19:43arrdemjustin_smith: the fuck man
19:44justin_smithweird? I'll turn them on
19:44Bronsajustin_smith: damn I totally forgot about hint-hint. I really need to contribute to that when I have some time
19:44justin_smitharrdem: are you looking at noisesmith/lazybot?
19:44arrdemjustin_smith: yep
19:44arrdemshould build an emacs translation table from IRC handles to github URLs at some point..
19:45justin_smithare they on now?
19:45Bronsaor just ban from the internet whoever has more than one nick.
19:45arrdemjustin_smith: yep
19:45Bronsastarting from justin_smith
19:45arrdemBronsa: yeah but then some really cool ppl like bbloom and dnolen don't get to stick around :C
19:46justin_smithon the upside I would have so much more free time
19:46Bronsasome losses are necessary for the cause
19:49andyf* checks sane list. That was quick.
19:50arrdemYou must be this crazy to compile Clojure code
20:03justin_smithlet me just say, committee is a terrible word
20:04justin_smithdoing a datomic project with campaign finance data... so many fucking keywords with "committee" in the name, so many chances to spell committee wrong in a keyword...
20:22andyfjustin_smith: Eastwood's keyword-typos linter might be useful to you: https://github.com/jonase/eastwood#keyword-typos
20:22andyfIt must be enabled explicitly to see its output, since it can be fairly noisy.
20:23andyfAlso, if you use emacs, dynamic-abbrev is cool
20:23justin_smithandyf: luckily datomic is pretty strict about schemas, but I just keep catching myself with the same typos
20:23justin_smithandyf: yeah, I need to remember to use M-/ more often
20:24andyfCursive will probably have symbol/keyword/whatever completion with AI
21:30weavejes_justin_smith: I have an indent-or-complete function that I map to tab
21:31justin_smithweavejester: that's a good idea.
21:33weavejesterjustin_smith: https://gist.github.com/weavejester/569a6eb40d28f9edbd2c if you're interested.
21:34justin_smithwhat's that looking-at expression do?
21:35weavejesterjustin_smith: It's emacs regex syntax for "end of word"
21:36weavejesterjustin_smith: Uh, actually, end of symbol
21:48arrdemweavejester: have you seen aggressive-indent-mode?
21:49weavejesterarrdem: No, what's that?
21:49weavejesterJust googled it
21:49weavejesterHuh, interesting...
21:49arrdemI like it a _lot_
21:50arrdemgets a little... janky when you don't keep everything balanced
21:50arrdemwhole file is indented 6 or 8 levels and then unindented.
21:50weavejesterHm, maybe I'll make sure it's only loaded when paredit is loaded.
21:51arrdemit works fine without paredit, you just get agressive about using commas for whitespace you want to round trip :P
21:53weavejesterbtw, on the subject of emacs, the only advantage I've heard of smartparens over paredit is that sp can handle XML/HTML
21:53weavejesterIs there any other advantage?
21:53justin_smithinteresting
21:54arrdemweavejester: I'm a filthy non-paredit user, sorry I can't help more.
21:54arrdemmy brain just... isn't there yet
21:54weavejesterDoesn't smartparens also have a non-strict mode?
21:55arrdemyeah I think that's what I run it in.
22:00arrdemhas anyone here used a hexadecimal float in anger? I can't imagine.
22:03kristofOh, arrdem
22:03kristofHow's your compiler coming along? Or subset, or whatever it was.
22:05arrdemkristof: http://arrdem.com/2014/12/11/oxcart_going_forwards/
22:05arrdemkristof: dead until I feel like hard forking Clojure
22:05kristofOh, ha, that was released yesterday
22:05arrdemyarp
22:05kristofExcellent timing for me to ask, I suppose, considering I haven't spoken to you in at least half a year
22:06arrdemkristof: if you check out the github repo there are some kickass demos that totally work, but it's far from "done". the blog post says it all.
22:16kristofarrdem: I'm sorry to hear that.
22:16kristofarrdem: Read your post, and I still think the idea is worth picking up again in the future for people who want a statically linked, optimized lisp
22:17kristofThe only really popular language right now that supports full metaprogramming is Rust :(
22:17arrdemyeah :C
22:17kristofarrdem: That said, I got distracted and started reading your syscalls post
22:17arrdemI hope that Oxcart comes back to life, or Kiss or Oxlang actually go somewhere
22:17kristofwhich is even more interesting than I thought
22:18arrdemkristof: lol I can't take credit for that, that's really a mate's idea. check out the LispM post. That's my best right now
22:18kristofI didn't like that one :P
22:18kristofSaw it in my planet clojure feed
22:19arrdemlol
22:20arrdemyou're welcome to disagree with me, I just want someone to show me wrong. I got some "corrections" from old LispM hackers, but they were details not flaws in the argument.
22:22kristofWell, the sections on the historical lisp machine and the contrast to modern hardware are fine, I learned a fair bit
22:23kristofarrdem: I was just referring to your concluding section. I think language homogeneous environments are kind of worthless
22:23Wild_Catwhat's the matter with Rust? It looks really good.
22:24kristofWild_Cat: not garbage collected
22:24arrdemkristof: yeah... that's a something I need to really sit and have a think on. I don't see a fundimental reason why a well designed homogenous language system is fundimentally a problem given the strict functional equivalence of modern languages.
22:24arrdemkristof: hey man they have some kickass escape analysis :P
22:24Wild_Catkristof: Rust's memory management really seems to make a lot of sense to me.
22:24Wild_Catit's almost like compile-time GC.
22:24arrdemWild_Cat: that was the idea :P
22:25kristofIt's fancy RAII
22:25kristofwaiting on that full fledged gc library
22:25kristofanyway, that's beside the point
22:25kristofarrdem: I don't see a fundamental reason why we need a well designed homogenous langauge system.
22:25Wild_Catand their super-powerful type system means that full GC can probably be added after the fact
22:26kristofarrdem: Ok, question: does everything run on a single garbage collector?
22:26arrdemkristof: what where when why?
22:27kristofarrdem: The old lisp machines worked by loading lisp programs into a single lisp image, right?
22:27arrdemkristof: yep.
22:27kristofSo garbage collection happened at the operating system level
22:27kristofBut that pauses EVERY running program.
22:27arrdemsorta kinda
22:28kristofStill a fair point, minus nuances
22:28justin_smithluckily today we have concurrent GC. Well some of us do.
22:28kristofjustin_smith: On Azul, maybe
22:28kristofIs hotspot pauseless?
22:29justin_smithsince 1.4
22:29arrdem(inc justin_smith)
22:29lazybot⇒ 158
22:29arrdemgood lord. you could beat alan at this rate
22:30kristofHrm.
22:30arrdemkristof: so the reason for wanting a "single language" machine is that communicating between threads and breaking things into services becomes a _lot_ easier.
22:30justin_smithwe'll see. I don't have his wit and insight.
22:30justin_smitharrdem: do you have an opinion on mirage?
22:30arrdemkristof: you no longer have the Unix problem of "everyone's writing parsers and printers"
22:31arrdemkristof: instead you can have OS/VM level constructs for moving raw data... or in Clojure's case just sharing a pointer :D
22:31kristofarrdem: Sure, but that's assuming the host language is perfect. Inevitably someone wants something else and doesn't want to have to wait for the language developer to implement it.
22:31justin_smithhttp://www.openmirage.org/
22:31arrdemkristof: some people are just silly :P
22:31justin_smithkristof: that never got in the way of C
22:32kristofarrdem: Well, you can't write realtime applications in Java. Or at least, I don't think that's the language of choice, is it?
22:32arrdemjustin_smith: I don't know enough about it but I can throw it on my reading list if you're really serious
22:32arrdemkristof: dont != couldn't.
22:32justin_smitharrdem: it's ocaml instead of an OS running on a vm
22:32justin_smitharrdem: single language runtime
22:32arrdemjustin_smith: oh. nice!
22:32justin_smitharrdem: which seems relevant to this discussion
22:33kristofHrm. Okay.
22:33arrdemkristof: so here's my 0.02
22:33kristofarrdem: What about low level programming?
22:33arrdemI've heard the argument made that Clojure needs a strong GC due to all the structural sharing stuff.
22:33justin_smitharrdem: oh, and it is also self-hosting
22:33kristofarrdem: High level languages that provide safe environments don't allow you to do the kind of bit mangling that's necessary for certain domains.
22:34justin_smithkristof: the fact that ocaml self-hosts mirage would be an argument against that
22:34arrdemkristof: sure, which is why you have an assembler in $HIGH_LEVEL_LANG and an escape hatch so if you really need to you can run asm
22:34justin_smithnot that every high level lang lets you do that stuff easily of course
22:34kristofarrdem: Like Rust's unsafe keyword. Okay.
22:34arrdemkristof: I explicitly mentioned having that as a vehicle towards becomming self hosting.
22:34kristofjustin_smith: Does ocaml have something similar to above?
22:35justin_smithit compiles down to machine code, and you can use arbitrary machine code via ffi
22:35kristofWas aware of the former, not the latter
22:35justin_smith(I mean to self-host targeting a bare VM you kind of have to be able to do that)
22:36arrdemOkay. Still working with Antlr. Do I care about performance enough to hammer out a listener client to speed this crap up.
22:36arrdemor do I just do a tree walk in Clojure because I'm a lazy sod
22:36kristofarrdem: Maybe I'm convinced now.
22:36kristofNot that it matters, I'm not important.
22:36arrdemlol
22:36arrdemI doubt anyone here fits that description
22:36kristofBut I've argued about this in #lisp enough times to have thought that I had my position solidified on the matter
22:37arrdemthe thing that's tough with this is nobody knows how it'll perform until someone goes and friggin does it
22:38arrdemso it's all moot unless there's a luntatic out there who chooses to do so
22:39justin_smitharrdem: so if you remember I posted that tweet because I saw a Tandy 102 on twitter while I was doing something with my own
22:40justin_smithI went and ordered a non-working one, with the idea that I can connect a beagle-bone's IO ports to its keyboard and LCD
22:40justin_smiththere is more than enough room for a beagle-bone on the inside...
22:40justin_smiththe keyboards on those things are actually very nice
22:42arrdemjustin_smith: oh nice!
22:45arrdemokay... lambda expressions parsing..
22:50arrdemdispatch & discard working
22:50arrdemballin