#clojure logs

2012-12-01

01:09Sgeo__Is there a way for me to make my own Var$Unbound?
01:09Sgeo__better yet, unbound var with no particular name
01:14RaynesSgeo__: Why?
01:19RaynesSgeo__: (defn who-cares [] (let [s (gensym)] (intern *ns* s) @(resolve s))) Could do something like this. You said with no particular name, but does it matter if it's a random gensym?
01:20RaynesYou'd have to create a Var with no name to create an Unbound with no name. Not sure if that is possible.
01:20RaynesWuh, I guess you can.
01:21RaynesSgeo__: (clojure.lang.Var$Unbound. (clojure.lang.Var/create))
01:21RaynesThis seems to work.
01:22Sgeo__Neat
01:22RaynesNow tell me why damn it.
01:22RaynesI can't bear the suspense.
01:22Sgeo__Oh, as for the why: It seems like it might be a good way to represent a lazy value that has not been calculated yet
01:22Sgeo__Or at least, semantically I feel like it makes some sort of sense
01:22RaynesIsn't that a promise?
01:23Sgeo__How does letfn work?
01:23Sgeo__Probably does make more sense to do a promise, I guess
01:24Sgeo__But then you have to @ the promise, unlike with the var, where... uh, I guess you do need to deref that too unless it's storing a fn
01:36jondavidjohnAnyone willing to help review a clojure novice's code? .... http://codereview.stackexchange.com/q/19203/2776
01:44tomojI wonder why clj-http won't parse json bodies of responses with 'exceptional' status
01:52muhooi'd use cheshire for the json parsing
03:46philr_Hello friends. I have a newbie question: why don't my for loops work in core.clj?
03:49andrewmcveighphilr_: If you post your code that's not working (and the error if there is one) to a pastebin like refheap, we might be able to help better.
03:49philr_Sure. I have a minimal example.
03:49philr_Let me do that for you...
03:51philr_So I made a new project with "lein new app test". Then added this to the skeleton:
03:51philr_https://www.refheap.com/paste/7186
03:52philr_Now "lein run" prints "Hello, World!" and nothing else.
03:53andrewmcveighOK, so... for is lazy, and as "println" doesn't return a value, and you're not using that (nil) value, (println x) is not being called.
03:53philr_Aha!
03:54philr_So... doseq?
03:54andrewmcveigheither use doseq in place of for (for "side-effecting" code)
03:54andrewmcveighor, if for was to return a value, you can wrap it in doall to force the evaluation.
03:55philr_doseq it is. Boy is my face red. Thanks muchly!
03:55andrewmcveighno probs.
04:52RaynesI haven't seen your code, but that's what I'm thinking based on your description.
04:53ucbah, the top level invocation is like (-> client (fn1) (fn2) ...)
05:04RaynesYes, you could change it to (when client (-> client (fn1) (fn2)))
05:04RaynesBut
05:04ucbsure, but fn1 might close the connection and so fn2 gets nothing to work with
05:04RaynesIf one computation relies on the result of the last one possibly being ni… Yes. Okay.
05:04RaynesYou want -?> then.
05:04ucbyeah :)
05:05ucbgreat, thanks! \o/
05:06bbloomseems odd that a failed operation on a client causes nil to be returned rather than an error code or an exception or something
05:07ucboh, not my choice, when the other party doesn't like a particular packet you send it it'll just close the connection
05:07ucbI could alternatively throw an exception in that case
05:07philr_Raynes: Yep. "lein new app test".
05:08bbloomucb: what is "client" ? is that a type you've created?
05:08ucbwell, I lie, it won't just close the connection, it'll let you know it didn't like your last message and close the connection
05:08ucbbbloom: it's the tcp-client in the aleph library
05:09bbloomucb: tcp?
05:09bbloomucb: or what protocol?
05:10ucbbbloom: tcp, yes
05:10Raynesbbloom: I think I'd prefer nil over an exception.
05:10bbloomRaynes: I'd prefer a status code :-P
05:11ucbI personally prefer nil too
05:11Raynesbbloom: Don't know what his purpose is, etc.
05:11RaynesHe may not need a status code.
05:11bbloomyeah, fair enough
05:12ucbwell, right now I'm working on the handshake, and its outcome is binary
05:12ucbI'm happy getting a nil at the end if it failed
05:12ucbotherwise, I get the client to start sending data
05:25abpHm, can I, when getting passed forms in a macro, find unresolvable symbols in the forms? lexical bindings like let must be considered.
05:39borkdudeany general advice in here whether to upgrade to 10.8 OSX? what would I gain from it (except for incompatibility problemsn)?
05:42ucbborkdude: you'd upgrade your wallet to a lighter one too
05:45Apage43you know, I did do the upgrade, and I can't think of anything it added that's really all that useful
05:48RaynesNew notifications stuff.
05:48Apage43right. but most of the apps I wanted notifications from worked fine with growl
05:49RaynesIt's still a significant improvement.
05:49Apage43*shrug*
05:49Apage43I did get iTunes 11
05:49RaynesGrown exists *because* this didn't exist.
05:50clj_newb_2345how do i dfine a *.clj file that is _auto included_ into every namespace? I want to have my own defn macro (which calls the clojure.core/defn) to be the default defn in all of my code
05:50Apage43I found that to be quite an improvement
05:51RaynesYou can't.
05:52clj_newb_2345I can't?
05:52clj_newb_2345or someone else can't?
05:53RaynesYou, sir, cannot.
05:53clj_newb_2345can clojure.core ahckers do this?
05:55RaynesI don't think anybody can do this.
05:56clj_newb_2345what if we got Gosling and Hickey working on it together; between rewriting Clojure and the JVM, would this be possible?
05:56Apage43it's not a language issue, I mean, it's just not a featue that's there
05:57clj_newb_2345what if Trovalds also joined the team so we could make changes ot the Linux kernel to support this
05:57Apage43namespaces pull in clojure.core by default and don't really provide a way to change or modify that
05:57clj_newb_2345and Grove joined too, so we couuld modify x86 instructions
05:57clj_newb_2345hmmm
05:57clj_newb_2345so basically, this wouuuld mean hacking "require"
05:57Apage43(ns)
05:57Apage43rather
05:57clj_newb_2345hmm
05:57RaynesWow. Apple Reminders is amazingly sufficient.
05:58clj_newb_2345this is interesting, so I can just repalce the top of all files with
05:58clj_newb_2345(my-ns ........ )
05:58Apage43well no
05:58clj_newb_2345problem is, how do I get clojure to find (my-ns ... ) ?
05:58Apage43because (my-ns) won't be available
05:58clj_newb_2345since I need to define the function somewhere
05:58clj_newb_2345fuck
05:58Apage43as its not in clojure.core
05:58clj_newb_2345what if I added my-ns into clojure.core?
05:58clj_newb_2345then I'd be set
05:59clj_newb_2345I feel like this is similar to modifying the physics of the universe in order to make a red shirt look blue
05:59Apage43sure, but you'd have to make sure that happens before anything tries to load the files that use it
05:59clj_newb_2345hmm
05:59clj_newb_2345can I get lein to define my-ns for me?
05:59Apage43i imagine that could be problematic in general, especially so if you use AOT
06:00Apage43unless you're using AOT this is all mostly done at "run time"
06:00clj_newb_2345I do have one gen-class
06:00clj_newb_2345for a custom exception class I wrote
06:00clj_newb_2345everything else is not AOT
06:00Apage43anyway
06:01Apage43this is all very ugly and there's probably a … slightly.. less terrible way to accomplish the same thing
06:01clj_newb_2345alright
06:01clj_newb_2345I could spare an extra :use line
06:01clj_newb_2345at the start of every *.clj file
06:01Apage43I feel like there might be some http://www.perlmonks.org/index.pl?node_id=542341 going on
06:02clj_newb_2345i want to redefine defn
06:02Apage43why?
06:02clojurebotwhy is the ram gone is <reply>I blame UTF-16. http://www.tumblr.com/tagged/but-why-is-the-ram-gone
06:02clj_newb_2345I want something like type hints, except it'sll be "type comment"
06:02clj_newb_2345i.e., it's not a thype hint, but it's just a short comment describiing the incoming type
06:03clj_newb_2345so I'd like something like (defn foo [ \n a "this is a House object" \n b "this is a Car object" ] ... )
06:03clj_newb_2345that's all
06:03clj_newb_2345wait wait, meant [\n a "this implements the House protocol" \n b "this impelments the Car protocol" ]
06:03mpenetyou could just use metadata, no need to redefine things
06:04clj_newb_2345use metadata on the arguments of a defn?
06:04clj_newb_2345mpenet : can you paste sample code?
06:04mpeneton the fn itself
06:04clj_newb_2345I really want the comments "inline"
06:05Apage43(defn foo [^{:comment "My comment text"} arg1 ^{:comment "More comment text"} arg2])
06:05Apage43actually i think that gets thrown out
06:06Apage43ah, nope
06:06mpenetif that's just for information as clj_newb_2345 seems to want, this would be ok
06:07Apage43(meta (first (first (:arglists (meta #'foo))))) => {:comment "My comment text"}
06:07Apage43&(meta #'clojure.core/+)
06:07lazybot⇒ {:ns #<Namespace clojure.core>, :name +, :file "clojure/core.clj", :line 920, :arglists ([] [x] [x y] [x y & more]), :added "1.2", :inline-arities #<core$_GT_1_QMARK_ clojure.core$_GT_1_QMARK_@166f453>, :inline #<core$nary_inline$fn__3842 clojure.core$nary_... failed to paste: peer not authenticated
06:07Apage43the arg metadata you attach is on the symbols in :arglists there
06:08Apage43in fact, a type hint is just a metadata of the form {:tag theclass}
06:08clj_newb_2345 (defmacro my-defn [fname args & body] `(defn ~fname ~(apply vector (map first (partition 2 args))) ~@body))
06:08clj_newb_2345that is all I need
06:08clj_newb_2345I don't use the multiple definition opption of defn
06:08mpenetApage43: yes, type hints are under :tag
06:09Apage43clj_newb_2345: wait, you don't even want to keep the strings? You're just throwing them out?
06:10clj_newb_2345I don't wnat to keep this
06:10clj_newb_2345it's purely to make it easier for me to read
06:10clj_newb_2345I apologize if that was not clear.
06:10clj_newb_2345thanks to evere who helped talk me out of modifying clojure.core, I like this solution more :-)
06:10Apage43(defn foo [a #_"This will be ignored" b #_"so will this"] (+ a b))
06:10Apage43(foo 1 1) => 2
06:11clj_newb_2345lol
06:11Apage43Prefixing a thing with #_ causes it to be ignored
06:11clj_newb_2345reader macros
06:11clj_newb_2345I'm an idiot
06:11clj_newb_2345hmm
06:11clj_newb_2345this is even better ,no need to define a new macro
06:11Sgeo__,Float/NaN
06:11clojurebotNaN
06:13Apage43or just take the line break and use regular comments
06:13Apage43instead of almost hacking up everything =P
06:13clj_newb_2345man; this is brilliant
06:15Apage43This is the first time I've run into a place to use #_ though
06:16clj_newb_2345I like the ; more
06:16clj_newb_2345now my edditor even clorizes the type
06:16clj_newb_2345and I can do weird thigns like ; Hash<String, Hash<String, Animal>>
06:16Apage43right. this is almost certainly what you want
06:18clj_newb_2345this is fucking brilliant
06:18clj_newb_2345my code looks a little weird, since many functions are now 2-3x as long (due to the args eacn on it's own line)
06:18clj_newb_2345but I like it
06:42ucbare java integers 32 bits? (apologies if this is a stupid question)
06:42ucbmore precisely, I'm wondering if rand-int Integer/MAX_VALUE will generate a 32-bit value
06:44ucbseems to be the case
06:46Guest29562@ucb The Java Specification says that it is: "The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers, respectively"
06:46ucbGuest29562: thanks!
06:54borkdudewhat is the clojure analogue of for example liftP in Haskell?
07:17borkdudehmm, is this really much of an improvement…? https://www.refheap.com/paste/7187
07:18josteinkhow do I do a case-insensitive substring search in clojure?
07:18josteinksomething akin to
07:18josteink(def windows (contains? os-name "windows")
07:22andrewmcveigh&(re-seq #"(?i)windows" "WinDOws blah blah ...")
07:22lazybot⇒ ("WinDOws")
07:24borkdudejosteink what about smth like this? https://www.refheap.com/paste/7188
07:24josteinkandrewmcveigh & borkdude: thanks both :)
07:25borkdudejosteink you could do some preprocessing on the pattern to lowercase that as well
07:25borkdudeandrewmcveigh solution is even better, always forget about re-seq
07:26andrewmcveighre-seq is awesome :)
07:27borkdudeyeah
07:27rbarraudLambda is awesome; everything else is just derivative :-)
07:29borkdudethere should be a +1 button on clojuredocs so you can look at the most popular functions ;)
07:30borkduderegex driven development
07:30josteinkborkdude: that just feels dirty :)
07:30borkdudehehe
07:33borkdudere-seq and juxt… never forget about those
07:38borkdude(was note to self)
08:55borkdudeRaynes hm, it only occured to me now, is your Twitter name inspired by the IO Monad?
09:50tomojbrowser repl broken in r1535?
11:40clojure-newbhey guys… I'm doing : (map #(hash-map :key1 (first %) :key2 (nth % 1) :key3 (last %))) to build a hash-map out of a vector, which is fairly concise, but I don't like the nth, first and last, can I use destructuring in this form or do it another way ?
11:43borkdude(let [[a b c] v] #{:k1 a :k2 b :k3 c})
11:45jeremyheiler&(apply hash-map [:a 1 :b 2 :c 3])
11:45jeremyheilerwould that work for you?
11:47jeremyheilerhmm no. sorry. your keys are not in yoru vector
11:48jeremyheilerperhaps use zipmap
11:48jeremyheiler,(zipmap [:key1 :key2 :key3] [1 2 3])
11:48clojurebot{:key3 3, :key2 2, :key1 1}
11:49borkdude,(apply hash-map (interleave [:a :b :c] v))
11:49clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: v in this context, compiling:(NO_SOURCE_PATH:0)>
11:49borkdudemultiple ways to go
11:50clojure-newbborkdude: that looks cool
11:50borkdudeadmittedly I like zipmap the best
11:50borkdude,(doc zipmap)
11:50clojurebot"([keys vals]); Returns a map with the keys mapped to the corresponding vals."
11:50clojure-newbjeremyheller: thats cool too
11:51clojure-newbso many ways, I've got loads to learn
11:51jeremyheilerclojure-newb, that's what makes it fun
11:52jeremyheilerthere's always more to discover
11:52clojure-newbjeremyheiler: yeah, though sometimes I spend too long making it perfect instead of working on the real problem :-)
11:52jeremyheilerhaha, you're not alone there!
12:03borkdudejeremyheiler that's the risk of such a cool language.. never done refactoring ;)
12:29abevbye
12:29abevquit
12:29abevexit
12:31jondavidjohnany clojure affcianados want to give me a quick code review? I'm just learning and want to make sure I'm leaning into the strengths of the language... http://codereview.stackexchange.com/q/19203/2776
12:34gfredericksooh you could destructure decks
12:34gfredericks[deck1 deck2] (split-at middleish cards)
12:35jondavidjohnnice, so I wouldn't have to do nth
12:35gfredericksright
12:35gfredericksthis thing needs line numbers
12:36gfredericks(->> (interleave deck1 deck2) flatten) is a somewhat superfluous use of ->>
12:36gfredericksit's not terrible though I can imagine liking it
12:37gfredericksindentation on overhand is bad
12:37jondavidjohnyeah, I think it reads well
12:37gfredericks(the if lines up with the parent let)
12:37gtrakdo you guys know of a shortcut for ring-mock requests with session-cookies?
12:38gfrederickslooks like you could stand to make a helper out of (partial partition-by (fn [_] (zero? (rand-int 2))))
12:38gfredericksI don't think (vec cards) gets you anything
12:39gfredericksoh wait
12:39gfredericksI had to scroll to see more code
12:40jondavidjohnI know functions use - as a word seperator, should bindings follow the same form?
12:40gfredericksyeah good point
12:40gfredericksI hadn't noticed that
12:40gfredericksunderscores are generally just for interop with other systems that use them
12:40jondavidjohnok, cool
12:41tmciverjondavidjohn: I think the use of flatten in riffle is redundant.
12:41tmciverinterleave produces a seq
12:41tmciver,(interleave [1 2 3] [4 5 6])
12:41gfrederickscalling seq in mongean is probably unnecessary as well
12:41clojurebot(1 4 2 5 3 ...)
12:42gfredericksindentation for the ->> form in pile is bad
12:42jondavidjohntmciver: the decks are chunked with partition-by
12:42tmciverjondavidjohn: also, it looks like you don't use card_count in overhand.
12:43gfredericksI think most of the recursion can be done with recur to save stack space
12:44jondavidjohnI tried but it was throwing an error
12:44gfrederickswat.
12:44jondavidjohndo I need to reverse the if to use recur?
12:44gfredericksno
12:44gfrederickswhat error?
12:44jondavidjohnjust swap out the calls
12:44jondavidjohnI'll test
12:45jondavidjohnnice, I guess it works fine
12:46gfredericksthough now that I think about it maybe you'd consider it more natural to use iterate
12:46gfredericksrather than building the iteration into the shuffling functions
12:47gfredericksif you really like the API you have, you could (defn mongean ([cards] ...actual work...) ([cards times] (nth (iterate mongean cards) times))) I think
12:47jondavidjohnahh, nice since it's built into the lang with iterate, i'll remove the recursion
12:48gfredericksrecursion doesn't end up being necessary in clojure very often
12:48gfredericksloop is a class n00b-trap
12:48jondavidjohn(iterate (mongean [..]) 4) seems pretty natural
12:48gfredericksoh no that's not quite how iterate works
12:49gfredericksiterate returns an infinite lazy seq of [deck (mongean deck) (mongean (mongean deck)) ...]
12:49gfredericksso you can use nth to get the result you want
12:49gfredericksthe second arg to iterate is the original deck
12:49jondavidjohnahh
12:50jondavidjohnthanks!
12:51gfredericksnp
12:51jondavidjohnlots of good stuff, still really impressed with how much I could accomplish in such terse (yet understandable) code..
12:53tmciverjondavidjohn: just curious, why do you do the (somewhat) complicated calculation of middleish in riffle? I would imagine you'd ideally want to used some kind of guassuan randomization of the middle position.
12:54jondavidjohnjust my formulation of giving the splitting of the deck a reasonable margin of error based on deck size
12:54jondavidjohnwith a minimum of 2
12:54jondavidjohntotally open to a better way
12:54tmciverah, I think I see. You're choosing a random card within 10% of the center of the deck?
12:54jondavidjohnright
12:55tmcivercool
12:55jondavidjohnis there a more idiomatic way?
12:55gfredericksdoes anybody know about future plans for the js/foo and js* forms in cljs? Are they intended to be permanent?
12:56jondavidjohnalso, I guess it's ok to do a lot of work in my let bindings?
12:56jondavidjohnmost of the functions' work are done there
12:56gfredericksjondavidjohn: it's worth checking for refactoring opportunities, but not generally terrible
12:57tmciverjondavidjohn: yeah, that's typical.
12:57jondavidjohni find it's a side effect of immutibility
12:57jondavidjohnat least that's what drove me in that direction
12:57gfredericksjondavidjohn: yeah; I think the main tradeoff is readability; so as long as you're satisfied with that, it's ok
12:58jondavidjohncool, thanks again, both of you! later!
12:59cg_mortonHey clojure fans. Where would you recommend to start learning for someone with coding experience but who is new to Lisps?
13:00gfredericks4clojure is easy to get started with
13:00Foxboroncg_morton, clojure koans is awsome
13:00FoxboronI find them more fun then 4clojure
13:01Foxboronbut, clojure koans needs leiningen to actually use them, so as gfredericks said, 4clojure is easier :)
13:01cg_mortonI suspect I will want leiningen eventually
13:02cg_mortonwell anyway, I will check those out. Thanks!
13:19jondavidjohngfredericks: ok... so run that iterate usage by me again? something like ... [cards times] (nth times (iterate (riffle cards) times) ?
13:20jondavidjohnor i mean ... [cards times] (nth times (iterate riffle cards)
13:20jondavidjohnO
13:22tmciverjondavidjohn: (nth (iterate riffle cards) times)
13:23tmciverto riffle the initial deck 'times' times.
13:23gfrederickscrate's defpartial creates some interesting metadata and I'm curious if anybody understands the use case
13:24gfredericksjondavidjohn: just like tmciver said; also if you're interested you might enjoy pondering why ((apply comp (repeat times riffle)) cards) is equivalent
13:25gfredericks(I think iterate is more readable though)
13:25jondavidjohnI'll check it out
13:25jondavidjohnyeah, definitely a clean alternative to my recur
13:27jondavidjohnwhat if the iterating function has multiple arguments?
13:27jondavidjohndoes it break down there?
13:27gfredericksyeah can't iterate that way
13:27jondavidjohncool
13:27gfredericksyou should be able to make it work by partially applying the rest of the args
13:27gfrederickslike (iterate #(foo % n) cards)
13:37hcumberdaleHi ,)
13:40jeremyheilerhello, hcumberdale
13:40muhoowhat are people using to create json services these days? wakeful? bishop? shoreleave? raw ring handlers?
13:41muhooliberator? there are so many :-/
13:42muhoo*sigh*
13:43gfrederickswakeful looks crazy-simple, which is what I wanted in this instance
13:44gfrederickswait it also looks weird o_O
13:44hhutchmuhoo: i am working with shoreleave right now, i was using fetch before, i like it
13:45gfredericksactually I don't want json at all I want edn
13:46hhutchif you are using clojurescript, i recommend shoreleave-remote
13:46gfredericksright now I want something that's under 10 lines
13:46gfredericksit's just for a demo
13:46gfredericksshoreleave looks too serious
13:47gfredericksI'll do compojure if nothing else
13:49hhutchgfredericks: my implementation is not at all 'serious' .. have you seen this? https://github.com/robert-stuttaford/demo-enfocus-pubsub-remote.git
13:49hhutchthat's what i've been using for reference
13:50gfrederickshhutch: the src/depr/server.clj has a lot of noise in it for my use; the demo is focusing on the client-side, so I just want to setup the server as basically as possible
13:53gfredericksdoes anybody know if it's possible to override lein-cljsbuild's version of CLJS via an explicit dependency and lein checkouts?
13:53gfrederickslein deps :tree doesn't even list cljs :/
13:56C-KeenHi! If anyone of you is visiting 29C3 in Hamburg this year, you may want to drop by at the lisper/schemer assembly. Maybe you want to spread some clojure love too by doing a workshop? Tell me or write it up on https://events.ccc.de/congress/2012/wiki/The_%28un%29employed_schemers_%26_lispers_guild. Thanks!
14:22muhooshoreleave seems to have the weight of popularity behind it. but then so did/does noir, and i realized its limitations quickly enough :-/
14:23seangrovemuhoo: I'm using shoreleave, but haven't used noir much - what limitations did you come across?
14:24muhooit uses atoms and non-functional stuff to act like django, which was nice coming from that rails-y world, but then not so much.
14:24muhooalso lots of macros which don't compose so well.
14:25muhooshoreleave looks heavy to me, and i'm suspicious of that now.
14:25seangroveIntersting, good to know
14:25muhoomaybe i shouldn't be.
14:25seangroveI'm only using shoreleave pubsub right now, it's been reasonably nice
14:25seangroveCan't speak to anything else though
14:27muhooi'll try it. i'm thinking maybe before i try to wrap my brain around some big thing, i should try to solve the problem first with low-level tools, and only move up to something heavier once i find myself with a specific need to write something, and instead of reinventing that wheel myself.
14:28seangroveThat's always a good approach
14:29muhooright now my paid work is having to live inside the brains of the people who wrote android, and it's making me crazy. so that may be coloring my feelings about other things too, and not in a good way.
14:29seangroveI tried to get into cljs a year ago or so without having a good understanding of js, which was a big mistake
14:30seangroveMaybe it'll reasonable in the future, but it was important to build several very large apps in javascript before I was able to make the jump to cljs properly
14:30muhoointeresting, yes, sounds like the mistake i made of trying to learn clojure without understanding java :-)
14:30seangroveHeh, I still don't understand Java very well, but Clojure on that side is pretty robust to shield you from it for awhile
14:31seangroveIt'll break down eventually, but I like that you can be productive and explore without a super deep Java background
14:31muhooseangrove: wait until you get to this: http://chasemerick.files.wordpress.com/2011/07/choosingtypeforms2.png?w=640
14:35seangroveWell, I'm glad that story is there when needed, but it does look intimidating
14:37muhoothe clojurebook.com has a pretty good explanation of all that stuff. but, who knows, you could maybe get by a very long time without ever having to know it.
14:37muhoo mean, i still don't know X86 assembler :-)
14:37seangroveSo far it's been reasonably easy to avoid interop beyond just insantiating basic classes
14:38seangroveBut anyway, far more interested in cljs for the time being
14:38seangroveThinking about trying to build a cljs around ember.js using the same techniques as jayq
14:38muhooAVR assembler, yes. ARM assembler, yes. but x86 assembler looked so annoying to me i said i'd never learn it, and, so far, never have.
14:39seangroveHeh, is that what's holding you back now?
14:39muhoothat sounds interesting. i haven't used ember.js, but native cljs wrappers of stuff is A Good Thing.
14:39seangrove"Damn, if *only* I had learned x86 assembly!"
14:39seangrove(said few people, ever)
14:40muhooif i were writing windoze viruses, maybe, then x86 assember would be necessary. but i've no interest in that world.
14:41muhooavr assembler, however, is kind of fun (embedded microcontrollers), though it's been years.
14:48seangrovebbloom: You around?
14:49bbloomseangrove: what's up?
14:49seangroveWanted to share: http://jida.herokuapp.com/?query-id=50b9aa72e4b0b66235465dae
14:49bbloomoh neat, i'll check it out
14:50seangroveMade some progress, but the majority of it came from wei_
14:50bbloomheh, great, i'm an example :-)
14:51muhooit uses bootstrap.js?
14:51seangrovemuhoo: Yeah
14:51seangroveWell, not js, just the css, I think
14:52bbloomcool stuff
14:56muhoowow dnolen@Davids-MacBook-Pro.local 738 commits!
14:57muhooi dunno what kind of coffee he's drinking, but puts him far and away the most prolific committer
14:57jonasenseangrove: cool
14:57p_lmuhoo: well... some git workflows create a *lot* of commits
14:57jonasenseangrove: http://jida.herokuapp.com/?query-id=50ba5fe7e4b0d89fb0a4ae3f
14:57p_lmuhoo: when you divide 738 by 20~30 commits a day...
14:57bbloomooo that gives me an idea. lynaghk would doing some github-style graphs for that codeq project be a good test c2po?
14:58bbloomtest for c2po, that is
14:58muhooseangrove: very nice work.
15:00seangrovejonasen: Oh, good query
15:00seangrovemuhoo: Thanks, but wei_ (in here sometimes) did most of the work
15:01seangroveI tink it's ready to share on the mailing list
15:01bbloomseangrove: jonasen anyway to do an order by on that?
15:01jonasenbbloom: not in datalog
15:02jonasenseangrove: bbloom: but the webapp could support ordering by column.. which would be useful
15:02bbloomcould be part put up in the query param too :-)
15:03seangroveHmm, wonder if that would be good
15:03seangroveAn idea anyway, I'll add it to the wiki
15:04jonasenseangrove: what version of datomic are you running?
15:06seangrovejonasen: One second, I'll check
15:07seangrovedatomic-free-0.8.3599
15:07jonasenseangrove: ok. Is it much work to update the peer library?
15:08seangroveI don't think so, no
15:08seangroveI'm actually not sure what part that is though, on reflection
15:09seangroveIs that the part that's running in-app, separate from the transactor?
15:14jonasenseangrove: in-app
15:14jonasenseangrove: find authors/committers http://jida.herokuapp.com/?query-id=50ba637ae4b0d89fb0a4ae40 http://jida.herokuapp.com/?query-id=50ba63d6e4b0d89fb0a4ae41
15:16seangrovejonasen: Very nice!
15:16seangroveWhy do you ask about updating the peer library?
15:16bbloomanybody working on getting the clojurescript analyzer running so that we can query deeper into the code? :-)
15:17jonasenseangrove: a recent version has some new query features I wanted to try
15:18jonasenbbloom: I started once, but didn't get very far.
15:18bbloomjonasen: what stopped you?
15:19jonasenbbloom: I'm also working on a java analyzer: https://github.com/jonase/codeq/tree/java
15:19jonasenbbloom: macros.
15:20bbloomhmm yes, code execution is scary :-P
15:21bbloomjonasen: was the issue analyzing macros in clojure code since the cljs analyzer doens't support them?
15:22jonasenbbloom: well, I didn't care too much about that. But getting the analyzer to run at all wasn't as easy as I expected
15:22bbloomjonasen: yeah, the public interface isn't exactly publicly documented
15:23jonasenbbloom: since codeq works on one source file at a time the cljs analyzer can't find the files it needs
15:24bbloomhm, i see
15:26seangrovejonasen: Is this the latest library? https://clojars.org/com.datomic/datomic-free
15:26seangroveHappy to swap it out and push
15:28jonasenaccording to https://groups.google.com/d/topic/datomic/lt9xVbZaX3s/discussion 0.8.3661 is the latest
15:32HolyJakHow is it possible that > can be used as java.util.Comparator? Does clojure somehow convert the boolean result to −1/+1 ? I'd be glad if anybody can point me towards the anser.
15:35seangroveHmm, I'm not seeing the jar for 0.8.3661 in clojars at all though. Updating Datomic on the server...
15:36HolyJakClojure Programming on page 107-108 says that yes, predicates are adapted to behave as Comparators, but doesn't say where/how :-(
15:40jonasenseangrove: btw, how are you able to run datomic-free on Heroku. Or will you simply loose all data at any time?
15:40seangrovejonasen: Just the app is run on heroku, but datomic is run on a vps, along with the workers for importing git urls
15:40jonasenseangrove: ok
15:41antares_HolyJak: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/AFunction.java#L46
15:41HolyJakthanks a lot!
15:42HolyJakI love this channel :-)
15:44bbloomantares_: now I'm curious what a sneakyThrow is :-)
15:44bbloomhttps://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Util.java#L183
15:44bbloomnice.
15:44bbloomheh
15:45bbloomie: turn off this blasted checked exceptions nonsense
15:45HolyJakbbloom: thx for providing also a pointer to the answer after having attracted my attention to it :)
15:45antares_bbloom: the "least inconvenient" way to throw exceptions without specifying them in method signatures all the time http://www.jayway.com/2010/01/29/sneaky-throw/
15:47HolyJakI see
15:59bbloomhmmm i have some source of non-determinism in my code… but i'm not sure where….
15:59bbloomi don't use random
15:59bbloomthere are no inputs
16:00bbloomno IO
16:00bbloomuses only core clojure data structures
16:00bbloomyet repeated execution yields varied results....
16:01bbloomthe only thing i can think of is that it's hashing functions differently from iteration to iteration… would that make sense?
16:01bbloomyeah, i guess it does… hm
16:02bbloom&(hash (fn []))
16:02bbloom,(hash (fn []))
16:02clojurebot1087093623
16:02bbloom,(hash (fn []))
16:02clojurebot512672660
16:02bbloomthat makes sense
16:02bbloomshouldn't be affecting my algorithm tho :-P
16:05gfredericks,(hash "foo")
16:05clojurebot101574
16:05gfredericks,(hash "foo")
16:05clojurebot101574
16:05gfredericks,(hash (apply str (range 10000)))
16:05clojurebot-1524940506
16:14gfredericksempty protocols are an interesting pattern
16:15gfredericksapparently only cljs allows it?
16:15tomoj1.5.0-beta1 too, I think
16:15gfredericksah
16:16gfredericksin clj-jvm you can extend a protocol to an interface, can't you?
16:16bbloomgfredericks: yeah, turns out to be useful as a sort of bit flag. i just used them for functions with metadata in cljs
16:16bbloomgfredericks: what use cases have you run into?
16:17gfredericksnone, I just saw it in the CLJS code :)
16:17tomojhttps://github.com/clojure/clojure/commit/2bc8b1f5
16:17gfredericksI was initially curious if the use cases mapped to any typical OOP patterns
16:17bbloomgfredericks: I've seen empty interfaces before
16:18bbloomgfredericks: but these days that same use case is better handled by an attribute or metadata in java or c#, etc
16:18gfredericksI guess because I saw ASeq in the cljs code, the naming pattern of which reminds me of the abstract superclasses in clj-jvm
16:18bbloomwhat's that find-fn syntax in here again?
16:18gfredericks$findfn 3 4 7
16:18bbloom$find-fn nil 5 '(5)
16:18bbloom$findfn nil 5 '(5)
16:19bbloomno clojurebot? :-/
16:19gfredericksit's lazybot
16:19gfredericksand he's apparently not here
16:19bbloomdammit lazybot, i need you
16:19bbloomget off the couch
16:19HolyJak&(+ 1)
16:19HolyJak,(+ 1)
16:19clojurebot1
16:19bbloomfound https://github.com/Raynes/findfn
16:20HolyJak,(+ 2)
16:20clojurebot2
16:22ivaraasendoes anyone here know the current state of Incanter? seems pretty stale just by looking at the github repo.
16:23bbloom(find-fn tester {:a 1} nil :a 1) ;; assoc
16:23bbloom(find-fn tester '(:a) nil :a) ;; conj
16:23tomojhmm, if I put (load-file "/home/tom/repl.clj") in my :repl-options :init, it works, but if I put the code that is in repl.clj, I get a "ClassNotFoundException: cljs.repl.browser"
16:23bbloom(find-fn tester #{:a} nil :a) ;; sorted-set-by
16:23bbloomdoesn't seem right :-/
16:23bbloomi need a function which yields a set
16:23bbloomthe best i got is:
16:23bbloom&(set/union nil #{:a})
16:24bbloom,(set/union nil #{:a})
16:24clojurebot#<CompilerException java.lang.RuntimeException: No such namespace: set, compiling:(NO_SOURCE_PATH:0)>
16:24bbloom,(clojure.set/union nil #{:a})
16:24clojurebot#<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.set>
16:24bbloom*shrug*
16:25tomojgiven what args?
16:25tomoj,(clojure.set/union [1 2 3] [1 2 3])
16:25clojurebot[1 2 3 1 2 ...]
16:26tomojwonder if there's a good reason set and vec aren't identity when possible
16:27bbloomi'm doing an update-in
16:27bbloom(update-in some-map [some key path] set/union #{element})
16:28bbloomwould be nice to omit the #{} and replace set/union with set-conj or something
16:28tomojwhere set-conj is #(conj (or #{} %1) %2)?
16:28tomojer, that's backwards ofc
16:29bbloomyeah, basically
16:29bbloomi find myself needing that function frequently
16:30olliveraHi, I am reading a tsv file .. doseq [line (line-seq rdr)] ... how can I extract (access) only the 2nd and 5th field in the line?
16:32bbloombreak it down: first you need to split the line on tabs
16:33tomojhuh, doseq allows initial :let-bindings, for doesn't
16:36gfrederickstomoj: boo :(
16:37olliverabbloom, how can I split the line on tabs?
16:37gfredericks,(clojure.string/split "\t" "foo\tbar\tbazzy")
16:37clojurebot#<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.util.regex.Pattern>
16:37gfredericks,(clojure.string/split #"\t" "foo\tbar\tbazzy")
16:37clojurebot#<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.util.regex.Pattern>
16:37gfredericks,(clojure.string/split "foo\tbar\tbazzy" #"\t")
16:37clojurebot["foo" "bar" "bazzy"]
16:38bbloomgfredericks: heh, i do the same thing
16:38bbloomi make BOTH mistakes every time haha
16:38bbloomsometimes i even try to write /\t/ :-P
16:38gfrederickslol
16:38gfredericksin the future we will all use eclipse and that will not happen
16:39ivaraasengfredericks: might want to compile the regexp as well
16:39gfredericksivaraasen: does it not get compiled by the clojure compiler?
16:39ivaraasengfredericks: hm, you might be right. or maybe HotSpot does some magic
16:40gfredericks,(type #"\t")
16:40clojurebotjava.util.regex.Pattern
16:40gfredericksif it's a Pattern does that imply it's already compiled?
16:41ivaraasenisn't it compiled on the go by the regexp reader macro?
16:41gfredericksthat's what I assumed
16:41gfredericks,(type (read-stryng "#\"\t\""))
16:41clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: read-stryng in this context, compiling:(NO_SOURCE_PATH:0)>
16:41gfredericks,(type (read-string "#\"\t\""))
16:41clojurebotjava.util.regex.Pattern
16:42gfredericksI don't know that it's a reader macro, since that's the most basic syntax for it
16:42ivaraasenOK, they're compiled at read time by the reader macro, according to the docs
16:42gfredericksw00p
16:43gfredericksclojure: always doing the right thing some of the time.
16:43tomojI think they may be compiled again at compile time?
16:44gfrederickswat.
16:44tomojbut can you even have an 'uncompiled' Pattern?
16:45gfredericksmy guess is in javaland that's a pattern represented as a string
16:45tomojoh, I see, the emitter for a Pattern emits a string and then a call to compile
16:45gfredericksemitter?
16:46gfredericksthe sexp->bytecode compiler?
16:46tomojthe byte code generator
16:46gfrederickshuh.
16:46gfredericks,(.compile #"\t")
16:46clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: compile for class java.util.regex.Pattern>
16:46gfredericksoh you compile a string to a regexp
16:46gfredericks,(str #"\t")
16:46clojurebot"\\t"
16:47ivaraasenbut yeah, a really simple solution to getting say the 5th line of a TSV file would probably be to use clojure-csv's (parse-csv MyFile :delimiter \\t) and do a nth 5.
16:49ivaraasen,(. Pattern compile "\t")
16:49clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: Pattern in this context, compiling:(NO_SOURCE_PATH:0)>
16:51TimMc&(identical? #"foo" #"foo")
16:51TimMc,(identical? #"foo" #"foo")
16:51clojurebotfalse
16:52AWizzArd /wii cemerik
16:55xificurCis there anyone kind enough to link me or explain me how to get lein working on pcbsd?
16:56xificurCafter a lein self-install if i try to run for example "lein repl" in xterm i get a line 260: java: command not found
16:58lynaghkbbloom: making a codeq + c2po charts HN bait post has been on my agenda for a while = )
16:59bbloomlynaghk: nice
16:59lynaghkbbloom: I haven't had a ton of time to play with either datomic or codeq, though
17:00lynaghkI don't know if you know Carlos Scheidegger at AT&T Labs at all, but he was pretty jazzed about codeq when I told him about the project
17:00ivaraasenxificurC: did you install OpenJDK through the AppCafe?
17:00lynaghkbbloom: any questions in particular you are thinking about visualizing?
17:01bbloomlynaghk: nah, nothing in particular
17:02xificurCivaraasen: nope, thanks a lot :) Sorry for having so dumb questions and problems :(
17:02lynaghkbbloom: I don't know if there has been any progress on the Clojure analysis bit of codeq since it was released
17:02xificurCtoo new to this OS
17:02lynaghkbbloom: but I think it'd be very interesting to look at relative distributions (via histograms) of things like form depth, # of forms per fn, length of forms, &c.
17:03lynaghkbbloom: but when codeq was first released the analysis just looked at toplevel forms only.
17:04bbloomlynaghk: not much, just talking about that with somebody above. apparently macros are a pain :-)
17:04lynaghkbbloom: even without doing full macroexpansion I think it'd be pretty useful
17:05lynaghkbbloom: after all, as a programmer you're looking at the literal forms, not the fully qualified/expanded ones.
17:06bbloomlynaghk: yeah, but the analyzer just chokes on defmacro, i'd assume
17:06bbloomlynaghk: also, there was mention of the core strategy of one-file-at-a-time being insufficient
17:06bbloomthe analyzer's moduel system is tightly coupled to gclosure right now :-/
17:07lynaghkbbloom: ah. Assuming a file is well-formed EDN, couldn't you pretty easily just traverse it and do a lot of counting?
17:08lynaghkbbloom: that's what I'd be interested in, as a first pass. Of course, getting all of the actual semantics in there would be great too. Still though, looking at forms is much more interesting than lines.
17:11bbloomlynaghk: yeah, i figure lots of other people are interested, so they can push for changes to cljs :-) more interested parties outside of just those doing browser-side work is welcome
17:11bbloomanyway, just published an early version of https://github.com/brandonbloom/qplan
17:11bbloom:-)
17:14lynaghkbbloom: do you have your codeq playground on github?L
17:15bbloomlynaghk: i don't have a codeq playground :-) seangrove and somebody else does
17:15bbloomjida.herokuapp.com
17:15muhooit's a gist, isn't it?
17:15seangroveYeup, tinkering with it right now
17:16seangroveShould have it back up in a second
17:17gfredericksso you can extend a protocol to a java interface but not to another protocol; any guesses about the reasoning there?
17:17gfredericksis the interface functionality an unfortunate necessity but normally we want to extend to concrete types?
17:18seangroveWas trying to upgrade datomic for jonasen
17:20andrewmcveighI just pulled master on clojure/clojurescript, cljsbuild now throws :No such var: json/pprint, compiling:(cljs/source_map.clj:142)
17:20andrewmcveighAnyone know what that is?
17:22lynaghkseangrove: do you know of any JavaScript libraries for making textareas that have paredit? I was thinking about making something similar to your Jida project but refuse to do anything until I get a highlighted, paredit'd textarea for input
17:22seangrovelynaghk: Nah, I ran into the same problem, wrote a little helper for determining balanced parens, and then realize how much thought must have gone into paredit
17:23seangroveRe-pushing to Heroku, should be back up in a bit. cljs compilation sometimes takes ~5-7minutes though
17:24lynaghkseangrove: I guess you could call in the nuclear option and use Ymacs: http://www.ymacs.org/
17:25gfrederickstried ymacs for 3 seconds until C-n opened a new chrome window
17:25lynaghkgfredericks: ah, yeah. That and I can't use other people's emacs anyway. It's kind of in the uncanny valley of textareas
17:26seangroveAnd even then, no paredit mode :)
17:26seangroveBut I think something like emacs => llvm => emscripten... or something might eventually be a cool project
17:27lynaghkseangrove: oh, I hadn't thought about that route. Probably because I want to stay sane
17:27Rayneslynaghk: subpar for codemirror
17:27Raynes$google subpar codemirror
17:27RaynesNo bot.
17:27RaynesI haven't had to restart him in probably 6 months.
17:27RaynesI literally don't even remember how.
17:28lynaghkRaynes: ohh, written in ClojureScript. Hip.
17:28gfredericksRaynes: there should be some command you can issue in #clojure that restarts him
17:28gfredericks$arise
17:29Raynesgfredericks: That's a chicken and the egg problem. If he is dead he can't respond to commands.
17:29gfredericksthere should be a command you can issue in #clojure for chicken and egg problems
17:29gfredericks$hatch
17:29Raynes:p
17:30muhoo&(hatch)
17:30lazybotjava.lang.RuntimeException: Unable to resolve symbol: hatch in this context
17:30gfredericksand that would be his normal response to that
17:33RaynesIs there an official content type for edn?
17:33gfredericksI saw application/edn somewhere
17:33gfredericksprobably had something to do with fogus. That guy.
17:33RaynesYeah, ring-edn uses that.
17:34gfrederickswoah what does ring-edn do
17:34RaynesI have no idea.
17:35seangroveRaynes: Reminds me a bit of Robin Hood/Friar Tuck: http://www.vintage-computer.com/vcforum/archive/index.php/t-5628.html
17:36gfredericksit is very weird that the ring-edn readme example uses print-str instead of pr-str
17:37Raynesfogus is a terrible programmer.
17:37RaynesNobody gets aware with that.
17:38RaynesI hate you.
17:41andrewmcveighDoes metadata on defmulti work in cljs? It seems to compile alright, but it seems to break in the browser by prepending the var name with self__
17:43seangrovelynaghk: Ok, all better now: http://jida.herokuapp.com/?query-id=50ba63d6e4b0d89fb0a4ae41
17:44lynaghkseangrove: neat. You are running datomic in process?
17:44seangroveNah, it's on a server elsewhere
17:44lynaghkseangrove: do you have a pro copy?
17:45seangroveNah, just the free one. Pro would be nice so I didn't have to worry about disk space, etc.
17:45Sgeo__Suppose two libraries are combinable in some way
17:45seangroveBut maybe I'll ask once Jida is of use to the community
17:45Sgeo__As in, let's say one exports a protocol, and another exports a type that could be made to fit the protocol
17:45lynaghkseangrove: yeah, I have no idea what the storage characteristics are. I'd like to use datomic on S3 for fire-and-forget log all the things.
17:46Sgeo__Do I just write my own library that fits them together, and put that up as a separate thing?
17:46seangroveSame here
17:46muhoo[5~[5~[5~/sb end
17:46wink,(map (fn [x] (str x x)) ["a" "b"])
17:46clojurebot("aa" "bb")
17:46winkwhy is that converted to a list?
17:46gfredericksit's a lazy seq
17:46gfredericks,(type (map (fn [x] (str x x)) ["a" "b"]))
17:46clojurebotclojure.lang.LazySeq
17:46seangroveDatomic-as-a-service would be pretty cool - it wouldn't be a good idea as a professional thing, probably, but as a tool for toy projects on Heroku, would be nice
17:46gfredericksseqs get printed as lists
17:46muhooqplan looks interesting, but i find i can't get my brain around what it does
17:46winkok, my bad. why is it not a vector still? :)
17:47Sgeo__qplan?
17:47seangroveUnfortunately, it seems like the setup of datomic makes it pretty difficult to offer as a service, or just extremely expensive
17:47gfrederickswink: map always returns a lazy-seq; there is a mapv if you really need a vector, but likely you don't
17:47lynaghkseangrove: are you not on github?
17:47seangrovehttp://github.com/sgrove
17:47lynaghkseangrove: how do you mean?
17:47Sgeo__wink, because it's convenient for a lot of cases, reducing the amount of work that needs to be done after multiple transforms of the sequence
17:48Sgeo__Suppose you mapped f onto some sequence, and mapped g onto the result
17:48seangroveJida source is here https://github.com/yayitswei/jida
17:48lynaghkseangrove: ugh, usability fail. I github searched you and it shows all of your repos but doesn't say "users:" on the sidebar like it used to.
17:48gfredericksSgeo__: how does it reduce work unless you don't consume everything?
17:48Sgeo__The underlying sequence only needs to be walked once
17:48gfredericksSgeo__: there's still the intermediate seq
17:48winkSgeo__: yeah, I understand it probably makes things easier
17:48winkI was just a bit dumbfounded now
17:48seangroveNo problem
17:48gfredericksSgeo__: I expect it's assymptotically the same as mapv
17:49seangroveAnyway, I was thinking a public tool like Jida could potentially be very useful for programming communities, and as a way for the Datomic Company to show off the utility, use, etc. of datomic
17:49lynaghkseangrove: yeah, totes.
17:49ivaraasenI really need to set up a datomic playground.
17:49Sgeo__Hmm, I guess only consuming part of it is probably when it would act to reduce work, mostly
17:50lynaghkseangrove: are you getting the hash from the query string, or are you normalizing it first
17:50gfredericksSgeo__: my understanding is that reducers are interesting partly because they avoid the intermediate representation
17:50lynaghkseangrove: e.g., (-> read-string pr-str md5sum)
17:50bbloomandrewmcveigh: sorry, stepped out
17:50ivaraasenmaybe ask my professors for some petroleum big data and see what cool stuff it's capable of.
17:50bbloomandrewmcveigh: not sure what the source_maps thing is about, should ask dnolen
17:50seangroveThe hash used for the query id?
17:50lynaghkseangrove: yeah
17:50seangroveIt's just a mongo-db id, where the queries are stored
17:51lynaghkseangrove: ah, I see.
17:51bbloomandrewmcveigh: as for the multi metadata, you mean (defmulti ^:foo f …
17:51bbloom?
17:51seangroveI don't know enough about managing datomic yet, so I wanted to keep all data in there essentially "stateless"
17:51andrewmcveighbbloom: np, I pulled the source-maps branch I thought I was on master.
17:51seangroveOr always re-creatable.
17:51bbloomandrewmcveigh: whoops :-) ok
17:51seangroveEasy enough to import a dozen or more clojure repos, so even if datomic blows up and all data is lost, no big deal
17:51lynaghkseangrove: mind if I tweet about this project to a few people? Or will it be going on/offline for a while?
17:51seangroveBut saved queries are much more valuable, they need to be backed up
17:51andrewmcveighbbloom: yes. (defmulti ^:foo f ...
17:52seangrovelynaghk: Nah, we were about to send it out to the list this weekend
17:52bbloomandrewmcveigh: there are no vars in cljs
17:52bbloomandrewmcveigh: if you do that in clojure, you need to do (meta #'f)
17:52bbloomandrewmcveigh: (meta f) doesn't work
17:53andrewmcveighbbloom: well, maybe var is not what I meant... the form (defmulti ^:foo ...) compiles to in js seems to be "munged?" to self__.f
17:53bbloomandrewmcveigh: give me a moment, i'll check it out
17:53andrewmcveighI'm not actually trying to get at the metadata.
17:54bbloomandrewmcveigh: ah, ok so it should be ignored, it's just not… ill look
17:54bbloomandrewmcveigh: would you please file a ticket?
17:54andrewmcveighbbloom: in the jira?
17:54bbloomandrewmcveigh: yeah
17:55andrewmcveighbbloom: sure, will do.
17:55bbloomandrewmcveigh: well
17:55bbloommake sure you include a test case :-)
17:55bbloombecause i don't see an issue here ...
17:55bbloomdoes it only affect advanced mode you said?
17:56andrewmcveighI've not even checked advanced mode, I've got it on :whitespace.
17:57bbloomandrewmcveigh: ok, help me reproduce it
17:57andrewmcveighI'll try on a fresh project. Maybe something's broke here.
18:06gfredericksAJAX has a lot of similarities with the IO monad doesn't it
18:06seangrovegfredericks: How so?
18:06gfredericksI'm thinking mostly of the fact that the runtime forces you to do it async
18:06moogatronicHaving a strange issue with lein-cljsbuild: Could not locate cljs/analyzer__init.class or cljs/analyzer.clj on classpath
18:07moogatronicUsing version 0.2.9. If i use 0.2.1 it works… Anyone see this before?
18:07gfredericksso therefore, like the IO monad, any composition of functions that involves async at any point must itself be asyncy
18:08andrewmcveighbbloom: hmm, it seems that when the metadata is (defmulti ^:field f ...) that breaks it, whereas (defmulti ^:foo f ...) doesn't. Maybe there's a reason for that?
18:10seangroveAh, got it
18:10seangroveSeems so, yes
18:12bbloomandrewmcveigh: heh ok… let me see...
18:13andrewmcveighbbloom: this does it for me https://gist.github.com/4185793
18:14bbloomheh ok, ticket that & i'll see what i can do… i think i know where the issue is
18:15andrewmcveighbbloom: OK, will do.
18:15Sgeo__defprotocol-once?
18:16Sgeo__...Why is it needed, what happens if you call defprotocol several times?
18:17Sgeo__Or deftype or defrecord
18:17Sgeo__With the same code?
18:20tomojSgeo__: bad things in some cases https://www.refheap.com/paste/b83f0ae013c7bcf8af2de885a
18:20bbloomthe issue is that munge looks at some metadata on symbols, so it's a more general problem regarding the :field metadata
18:20bbloomandrewmcveigh: i can probably just namespace the keys....
18:21Sgeo__tomoj, oh
18:21Sgeo__That... kind of sucks really badly
18:21Sgeo__Reminds me of Python
18:21bbloomandrewmcveigh: there is probably a simpler test case too...
18:22Sgeo__Seriously, I expect Clojure to play nice with modifying and changing code at runtime
18:22Sgeo__Maybe I'm expecting it to be too much like CL?
18:22bbloomSgeo__: others expect that too. file a bug
18:23bbloomandrewmcveigh: (def ^:field f identity)
18:23tomojyou want it to detect that the sigs are the same?
18:23tomojand in case they're not, give the current behavior?
18:24bbloomandrewmcveigh: i can't dig into it now, but file that ticket and link me to it… either i or dnolen will take a look at it sooner or later
18:24Sgeo__Hmm, not sure the exact semantics that I would want
18:24andrewmcveighbbloom: ah, it even does it with def?
18:24andrewmcveighbbloom: Writing it now.
18:25andrewmcveighbbloom: actually (def ^:field f identity) is fine for me.
18:26bbloomandrewmcveigh: try to call it
18:26andrewmcveighbbloom: ah, yeah.
18:36gfredericksRaynes: jayq contains "application/edn" as well
18:36gfredericksalso "text/edn" and "application/clojure" and "text/clojure"
18:36lynaghkgfredericks, Raynes: we're using application/edn for our services that send edn over the wire.
18:36gfredericksso....whatever
18:37gfredericksis "application/json" an unfortunate name?
18:41mpenetgfredericks: about the async ajax monad, it is possible, it's a different definition from the one in jayq, the 2 can coexist.
18:41andrewmcveighbbloom: I've submitted the ticket, but I can't seem to link it to anyone. CLJS-434
18:42bbloomhttp://dev.clojure.org/jira/browse/CLJS-434
18:42gfredericksmpenet: I just got all excited about this new view of ajax/async
18:42bbloomandrewmcveigh: thanks
18:42gfredericksmpenet: apparently jquery deferred, which I didn't previously know about, is up this alley?
18:42mpenetgfredericks: sometimes you want realized values between steps (allows "natural" transform with Mabye or sometimes is required depending on use case), sometimes you dont care
18:43mpenetit is
18:43gfredericksmpenet: yeah, and it occurred to me that you wouldn't want to assume independence even when you can prove it in the code, because statefulness on the server might not allow reordering
18:43gfredericksso it definitely ought to be explicit
18:43mpenetgfredericks: yup
18:44gfredericksit'd be a weird server that didn't allow that, but best to be safe
18:44mpenetgfredericks: feel free to scratch this itch, this would be welcomed in jayq with the other one
18:45tomoj(let [res1 (req1) res2 (req2)] [@res1 @res2]) vs (let [res1 @(req1) res2 @(req2)] [res1 res2])
18:45mpenetgfredericks: it's more about the workflow in your app, ex: POST, need to wait for a response and do GET that depends on the previous post.
18:45gfredericksmpenet: once I get my head around it I assume it should be straightforward so I'll be happy to throw up a patch if that turns out to be the case
18:45gfredericksmpenet: I guess that wouldn't be so weird
18:45mpenetgfredericks: not at all imo
18:45jamiiIf anyone feels like proof-reading some vaguely clojure-related writing, I'd be much obliged :D
18:45jamiihttps://gist.github.com/800eaa1876dfaad4b600
18:46gfredericksI think if I were doing that I'd think about having the POST return the data itself
18:47mpenetgfredericks: yeah, but it's maybe not that specific, maybe my example was bad, but I meant sometimes the order can be important
18:48gfredericksit wouldn't surprise me too badly, I just can't think of a common use case with a restful server
18:49mpenetif req1 fails, dont do req2, is a good enough justification imo
18:49mpenetwell could be
18:49gfredericksoh that's a good point
18:50mpenetso the 2 versions are potentially useful
18:52holohi
18:54tomojif req2 needs the previous response, you could do (let [res1 @(req1)] @(req2 res1)), or make req2 accept a defer, for @((comp req2 req1)). can't decide if I like the latter
18:55holoi want to do something like (= type(var) <some way to represent the class constant>) how do i do the <...> thing?
18:55gfredericks,Integer
18:55holoi mean (type var). sorry for my legacy typo
18:55clojurebotjava.lang.Integer
18:55tomojmaybe you define a special comp that handles asynchrony, @((comp@ req2 req1)), and just have req2 take a response
18:55gfredericks,java.util.List
18:55clojurebotjava.util.List
18:56gfredericksholo: just write it ^
18:56gfredericksfully qualified, or naked if you imported it
18:56holooh.. i can just write.. hehe
18:56gfrederickstomoj: yeah that's basically how jayq already works
18:56holoso obvious
18:57hologfredericks, thanks
18:57gfredericks,(= (type {2 4}) clojure.lang.PersistentArrayMap)
18:57clojurebottrue
18:57gfredericksholo: you also might like clojure.core/instance?
18:58hologfredericks, yes, i like it :) thanks
18:59tomojgfredericks: (then (req1) req2) ?
18:59tomojer, done I guess
18:59mpenettomoj: we have a let form that does that
19:00mpenettomoj: let-ajax, and also let-defered
19:00mpenetthere is an example in the jayq readme
19:00mpenet
19:01tomojah, if you want points
19:02tomojthat's pretty cool, I hadn't thought of :let/:when for dropping out of the monad
19:04mpenetyes I think so too, I haven't used it in my apps though.
19:12devinusis there a literal reader syntax for PersistentQueue yet?
19:18seancorfieldibdknox: you around?
19:19seancorfieldI upgraded my Win8 VM from Release Preview to Pro and had to reinstall Java and now LightTable doesn't work again :(
19:20tomojdevinus: only in cljs I believe
19:20devinusthat's disappointing
19:20devinustomoj: what is it in cljs?
19:20tomoj#queue
19:20tomoje.g. #queue[1 2 3]
19:23dnolenjamii: nice
19:23gfredericksis that a tagged literal?
19:23tomojdevinus: http://dev.clojure.org/jira/browse/CLJ-976
19:25devinus"this needs more time" what does that mean?
19:28bbloomi assume he means hammock time?
19:29bbloomi love that i wrote a 100 lines clojure library on the jvm and then tested on cljs and it worked first try :-)
19:32Hodappnice!
19:32bbloomit's absolutely amazing how far you can get with maps, sets, and vectors
19:57tomojI wonder if we should wait until cljs depends on 1.5 to put test-> etc in there
19:57tomojor maybe copy them over to cljs/core.clj in the meantime
19:58bbloomtomoj: probably no harm in copy pasting them over, since the goal is for cljs to eventually be self hosting
19:58bbloomit will need to have copy pasted defs of everything eventually...
19:59bbloomtomoj: submit a ticket with patch & see what dnolen says
20:00tomojthankfully refer :exclude appears to not explode when you exclude something that doesn't exist
20:00tomoj(I'm using cljs with 1.5)
20:00bbloomyeah, that seems like a reasonable behavior :-)
20:02bbloomtest-> is super useful :-)
20:18alex_baranoskyany idea why adding this to my project file is not enough for leningen to find the needed jar for me? [org.clojure/tools.trace "0.7.5"]
20:19alex_baranoskyis the trace jar in some odd repo?
20:19gfredericksalex_baranosky: in what way does it fail? it says it can't find the jar?
20:20alex_baranoskygfredericks: yeah, it says it can't find it in the specified repos - central, releases, clojars, snapshots
20:22gfredericksthe sonatype repo says it only has "0.7.1" and "0.7.3"
20:23gfredericksso maybe there's been some failure to publish the most recent version
20:24gfredericksit was messed with quite recently apparently
20:24gfredericksmaybe there's a delay
20:28tomojin cljs, (zero? (inc nil))
20:28tomojguess I'm not surprised
20:29gfredericksI just got 1
20:29tomojoh, yeah
20:29bbloomtomoj: unfortunately no way to make that give you an error without losing a lot of perf
20:29tomojbut I wonder if writing (update-in {} ks inc) is really a user error anyway
20:30bbloomsimilar issue: (+ 5 "adsf")
20:30Sgeo__Why should it be an error?
20:30tomoj,(update-in {} [:foo] inc)
20:31clojurebot#<NullPointerException java.lang.NullPointerException>
20:31bbloomSgeo__ automatic type coercion is a bug waiting to happen
20:31bbloombut host semantics leak through sometimes
20:31bbloom,(+ 5 "adsf")
20:31clojurebot#<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number>
20:31Sgeo__tomoj, so what should I do if I want to inc the value at key :foo but if it's not there just leave it alone?
20:31bbloomclojurescript returns "5asdf"
20:32bbloom,(update-in {} [:foo] #(inc (or % 0)))
20:32clojurebot{:foo 1}
20:32p_lbbloom: have you seen a talk called "WAT"?
20:32bbloomp_l: yeah
20:32alex_baranoskygfredericks: ahhh… I tried 0.7.4, 0.7.2 and 0.7.0 amazingly -- thanks for the info, it works
20:32p_lthen you know why ;)
20:33Sgeo__It's easy to make a monad around Lamina's result-channels
20:34Sgeo__But what about Lamina channels?
20:37bbloomp_l: heh watched it again https://www.destroyallsoftware.com/talks/wat it's pretty funny
20:37tomojI note lamina seems to have no mapcat
20:38tomojoh wait
20:38tomojyeah it does
20:38tomojreturn x = (channel x); ch >>= f = (mapcat* f ch) ?
20:44tomojSgeo__: but aren't channels sorta hopeless?
20:44Sgeo__hm?
20:44clojurebotbenchmarking is https://github.com/hugoduncan/criterium
20:45Sgeo__Well, do we want channels used monadically to have those semantics?
20:46Sgeo__Channels are effectively FRP Events, right? Are FRP Events monads, I forget
20:46Sgeo__Erm, monadic values
20:47tomojyes, Event is a monad
20:47tomojbut channels aren't Events :)
20:47bbloomtomoj: Sgeo__: I know you guys are interested in FRP and dataflow and stuff.. i've been working on a less haskell-ish approach :-)
20:47bbloomhttps://github.com/brandonbloom/qplan
20:48tomojinteresting
20:48tomojlooking at the test, it reminds me of something I've been thinking about for http middleware ever since cemerick's solver for nrepl middleware
20:49bbloomthe doc string in core.clj explains a tad of the academic bits, but see the referenced papers for real details
20:49tomojguessing it's not what I think it is though
20:49bbloomtomoj: not familiar, link?
20:49SgeoSolver for nrepl middleware?
20:49bbloomis the goal to just get a linearization of a dependency graph?
20:49bbloomie these middle wares need these, so run these in this order?
20:50tomojyeah, that's what cemerick's did
20:50tomojalthough I am interested in more than linear stacks
20:50bbloomyeah, this is a bit more complex than that
20:50bbloomthis is multi-output and multi-directional
20:50tomojdunno where it is, nrepl or somewhere
20:50bbloomin that case you have zero or more dependencies. in this case you have N to M inputs to outputs
20:51bbloomwith cycles
20:52bbloomi intend to use this (or an optimized version of it) for the basis of a data bindings system
20:53bbloomi have a whole bunch of half finished researchy experiments i'm going to slowly stitch together into a serious framework :-)
20:53tomojso you'll have channels basically, or just event callbacks, which rerun evaluate with some new data?
20:54bbloomtomoj: it's not a continuous model, it's discreet
20:54tomojsure, but what's the analogue of push seqs?
20:55bbloomtomoj: there isn't one really…
20:55bbloomI expect to have something more similar to the datomic model
20:55bbloomwhere you have some kind of "transaction data" so to speak
20:55bbloomand you modify a priority map of properties, and then re-evaluate bindings
20:56tomojso a click event occurs and some handle submits a 'transaction'?
20:56tomojhandler
20:57bbloomyeah, something like that… clicking will send off a command
20:57bbloomthe command will be expanded, like a datomic transaction function
20:57bbloomwhich occurs recursively until you have some set of primitives, like datomic has add and retract
20:58tomojpresumably, unlike datomic, the history will not be kept around? :)
20:58bbloomyeah, probably just going to keep exactly two versions: current and previous
20:58tomojlooks cool. I'll have to add those papers to my todo list
20:58tomojfor the record, I seek not a haskell-ish approach, but a clojure-ish approach :)
20:59bbloomhence i expanded my search beyond functional programming papers, which tend to be very haskellish
21:00bbloomthe property models papers are collaborations with Adobe; ie C++
21:00bbloomi need to think more about what an in-memory no-history version of datomic would look like
21:01bbloomespecially with good support for ordered trees
21:01tomojyeah, I keep accidentally thinking I have type classes :(
21:01SgeoYeah, I think channels are more Applicative than Monadic
21:02tomojthe correct applicative for Events is very weird
21:02SgeoAlthough, sort of getting into frustrations with Clojure not using thunked I/O
21:02SgeoI'm calling it thunked instead of monadic, because monadicness isn't the only interesting thing
21:02bbloomSgeo: what frustrations?
21:03SgeoThe Clojure equivalent of println <$> somechannel should return another channel, right?
21:03SgeoA channel of ... what? IO values, I would think
21:03SgeoBut that's not so nice and intuitive in Clojure
21:04Sgeo(map println [1 2 3]) isn't a lazy sequence of things you can trigger to print out a number
21:04SgeoIt's a lazy sequence that, as the sequence gets realized, prints stuff out
21:04SgeoWhich I feel is too soon
21:05bbloomah yes
21:05bbloomclojurescript had a pr-seq interface
21:05bbloomwhich returned a lazy sequence of strings
21:05bbloombut it got yanked out for performance reasons
21:05Sgeopr-seq is missing the point
21:06bbloomin what way? it isolates the IO
21:06SgeoWhat I want is something that behaves like... (map (fn [v] (println v)) [1 2 3])
21:06SgeoWait, no
21:07Sgeo(map (fn [v] #(println v)) [1 2 3])
21:07Sgeo,(map (fn [v] #(println v)) [1 2 3])
21:07clojurebot(#<sandbox$eval27$fn__28$fn__29 sandbox$eval27$fn__28$fn__29@1cb02395> #<sandbox$eval27$fn__28$fn__29 sandbox$eval27$fn__28$fn__29@6ff019e9> #<sandbox$eval27$fn__28$fn__29 sandbox$eval27$fn__28$fn__29@7c354968>)
21:07Sgeo,(doseq [io (map (fn [v] #(println v)) [1 2 3])] (io))
21:07clojurebot1
21:07clojurebot2
21:07clojurebot3
21:08bbloomdo you really need that to apply to OTHER PEOPLE's printing? or can you simply: (fn [& args] (fn [] (apply print args))
21:09SgeoIt becomes relevent I think when you want to map doing IO onto things other than sequences
21:09bbloomSgeo: I haven't done much with haskell outside of project euler toy apps
21:10bbloomso i'm not really sure how it's IO performance is achieved or how dethunkificiation occurs in the compiler or any of that fancy stuff
21:11bbloomnor am i really sure what benefits i get from lazy IO, other than the obvious downsides of resource leaks, motivating iterators, etc
21:11Sgeolazy IO is generally discouraged in Haskell, but that's not what I'm getting at
21:12SgeoIs there a function to get every other element from a list?
21:12SgeoOr a lazy-seq?
21:12tomoj(partial take-nth 2)
21:12Sgeoty
21:13Sgeo,(dorun (take-nth 2 (map println [1 2 3 4])))
21:13clojurebot1
21:13clojurebot2
21:13clojurebot3
21:13clojurebot4
21:14Sgeo,(take-nth 2 (map #(str "(println " % ")") [1 2 3 4]))
21:14clojurebot("(println 1)" "(println 3)")
21:14tomojfor me, in clojure, the answer is usually "don't put IO in a seq"
21:14SgeoI want putting IO in a seq to be comfortable
21:14Sgeobasically
21:17tomojwhat's uncomfortable? defining your own println that returns a function?
21:18Sgeo,(doseq [io (take-nth 2 (map #(fn [] (println %)) [1 2 3 4]))] (io))
21:18clojurebot1
21:18clojurebot3
21:18Sgeotomoj, I'm sure I could write a function to take an I/O performing function and thunkify it
21:19SgeoBut I feel like it should be more built-in. I could also write my own dorun and doseq and for if the language didn't have them
21:19SgeoAlthough the thunkify function probably is not as difficult to write as for
21:20Sgeo(fn [f] (fn [& args] (fn [] (apply f args))))
21:20SgeoI think
21:22tomojguess I don't understand IO well enough to understand the benefit, given that we have no static type system
21:22gfredericksisn't that just identity?
21:22gfredericks(fn [f] f) would do the same thing more performantly?
21:22gfredericksoh wait nevermind :)
21:23Sgeotomoj, the benefit is that you can freely pass around objects that represent performing an action, without actually performing that action until you want to
21:24tomojcan't you freely do that here too? difference is there's no type distinction between an action and a nullary function
21:25SgeoYes, but the standard library isn't designed with that in mind
21:25SgeoThere's no function for walking along a seq of nullary functions and doing them all
21:25tomojright, oh well
21:25SgeoFor example
21:27tomojI don't see the benefit in having a standard library that is designed with thunked IO in mind :)
21:27gfredericksI've thought about it too; if the type system can't guarantee that a function is pure, then it seems like you're just getting the worst of both worlds
21:27SgeoI find thunked I/O less confusing
21:28tomoj(reduce side-effects! nil seq-or-reducer-of-values)
21:29tomojeh. I do have IO problems. I dunno that thunked IO would solve them
21:29Apage43I still don't actually get what the desired behavior is, here
21:30SgeoDesired behavior is for
21:30Sgeo,(dorun (take-nth 2 (map println [1 2 3 4])))
21:30clojurebot1
21:30clojurebot2
21:30clojurebot3
21:30SgeoTo just print 1 then 3
21:30clojurebot4
21:30Apage43ah
21:33Apage43,(dorun (map deref (take-nth 2 (map #(delay (println %)) [1 2 3 4]))))
21:33clojurebot1
21:33clojurebot3
21:33tomojhmm, but those actions only execute once
21:34tomoji.e. if you dorun the same seq again, it just prints nothing
21:34Apage43,(dorun (map #(%) (take-nth 2 (map #(fn [] (println %)) [1 2 3 4]))))
21:34clojurebot1
21:34clojurebot3
21:34tomojyeah, but Sgeo wants support from core :)
21:34Apage43and you can (dorun (map #(%) …)) that one a second time if you want to rerun the fn
21:35SgeoIf I write a library for this, what functions would I actually need to write?
21:36Sgeothunkify, perform, dorun, doall, any others?
21:36SgeoWould be nice to write (def perform #(%)) but that shows up differently in documentation, and I'm not sure where to put the docstring
21:37Apage43(def ^{:doc "I am a doc-string} somevar)
21:37Apage43er
21:37Apage43(def ^{:doc "I am a doc-string"} somevar)
21:37tomojso reduce :: (a -> b) -> a -> IReduce b -> IO b
21:37Apage43,(meta #'+)
21:37clojurebot{:ns #<Namespace clojure.core>, :name +, :file "clojure/core.clj", :line 920, :arglists ([] [x] [x y] [x y & more]), ...}
21:38SgeoUgh, I'd need to include arglists too, wouldn't I
21:38SgeoClojure makes it so painful to be pointless
21:38SgeoI love pointless programming
21:39Sgeo(Yes, I know the usual term is pointfree. I'm trying to be funny)
21:39ChongLieven haskell can make it painful to do pointfree style
21:39ChongLiif you're trying to stretch it anyway
21:40ChongLithere's some real gymnastics you do when there are multiple arguments
21:40ChongLilike the owl combinator
21:41SgeoIsn't there some sort of semantic editors thingy?
21:41gfredericksApage43: clojure allows docstrings on def now
21:41SgeoWhich I don't entirely understand, but whatever.
21:41Apage43oh? Neat.
21:41gfredericks(def perform "This is my perform fn" #(%))
21:41Sgeo,(-> (meta #'+) keys)
21:41clojurebot(:ns :name :file :line :arglists ...)
21:41tomojI'm working on a semantic editors library
21:41tomojnot going so well
21:41Sgeogfredericks, it will still be called a var and not a function by documentation though I think
21:42gfredericksSgeo: that'd be tool specific, right?
21:42gfredericksor you mean the :arglists missing and such?
21:43Sgeo:arglists missing, and the var thing I'm pretty sure I saw on Incanter documentation
21:43gfredericks,(-> *clojure-version* var meta keys)
21:43clojurebot(:added :doc :ns :name :dynamic ...)
21:43Sgeoztellman uses some library he wrote for importing fns from a namespace, wouldn't be necessary if def were comfortable
21:45tomojyou say (def foo +), and you want the :line/:file metadata to point back to clojure.core? or you just want specific parts of the metadata? :)
21:46gfredericksarglists would be nice
21:46gfrederickshmm :/
21:46gfredericksarglists and doc seem problematic though
21:47gfredericksanything can be added manually
21:50Sgeotomoj, well, would be nice to say (def foo (comp a b)), in which case there's multiple things that line and file would come from
21:50tomojoh, right, even (def foo +) is doomed since + has no metadata
21:50gfrederickstomoj: but presumably (def foo +) is an abstraction, and taking just about anything from + would be leaky
21:51SgeoBecause relevant metadata like arglists is on the var and not the fn
21:51SgeoIf it were on the fn, comp could produce new metadata
21:51SgeoFor example
21:51SgeoAlthough it would be annoying for writers of functions like that to have to do so, I guess
21:52tomojthe problem to me is that clojure.core can't choose for you what you want, you have to choose
21:52tomojif you want a comp that passes on some particular metadata you have to write it, since there's no generally desirable way to merge the metadata, I think
21:54tomojgfredericks: yeah, that's another case where clojure can't decide for you
22:05tomojhmm http://okmij.org/ftp/Haskell/zip-folds.lhs
22:05tomojinteresting point there. since we have r/take and r/drop, we can get r/zip
22:05tomojexcept.. that causes trouble if a reducer does IO upon reduce
22:05tomojand seems likely inefficient?
22:12devinuscan anybody explain why there seems to be a lot of mongo love in the clojure community?
22:12devinusam i missing something or is it just a coincidence?
22:20gfredericksclojure is webscale?
22:26bbloomdevinus: probably a coincidence
22:26bbloommongo has a lot of buzz, it's dynamically typed, it's pretty easy to set up.. there's probably some overlap in the style of workflows, so there's some overlap in the user bases
23:06Apage43devinus: I think it's about the same as the hold it has with node/python/ruby/etc., for prettymuch the reasons bbloom said
23:19jonasenseangrove: http://jida.herokuapp.com/?query-id=50bad538e4b02c359b552010
23:19jonasenseangrove: what happened with the datomic update? I saw you reverted it