text:
0:00 Jesterman81: thanks for the help guys, appreciate it
0:00 awwaiid: oh even fancier
0:01 justin_smith: ,(map (juxt :foo :bar) [{:foo "foo" :bar "dummy" :axe "blood"} {:foo "baz" :bar "dummy"}]) ; if you want two specific keys
0:01 clojurebot: (["foo" "dummy"] ["baz" "dummy"])
0:57 kenrestivo: there's also select-keys
0:57 oic, backscroll
1:54 ddellacosta: kind of a Java question, but: how do I add something to the java.library.path (in Mac OS X)? I'm trying LD_LIBRARY_PATH in my bashrc but it's not working. Can I pass it in directly via lein?
2:02 nevermind, figured it out, I guess that's what jvm-opts is for
2:11 xinix: who knows Storm by clojure?
2:13 a real-time streaming style computation framework...who has its source code?
2:14 Rhainur: xinix: ???
2:14 lazybot: Rhainur: How could that be wrong?
2:14 Rhainur: xinix: it's open source: https://
2:32 cfleming: So I have a question about circular namespace dependencies in Clojure
2:32 I thought they were actually illegal, but it seems like this might not be the case.
2:33 ztellman's manifold library has a bad case of them, by using require in the middle of a file.
3:18 xsyn: I have a stupid question
3:18 if I have a function which has a datalog query inside it
3:18 and the query is (q '[:find]… )
3:19 and I want to pas the :where clause of the query a value
3:19 how do I get it to eval that value?
3:19 so that the query sees it?
3:19 currently I'm getting: Unable to resolve symbol: id in this context
3:55 Nevermind, found my solution
3:55 my problem was that I was trying to use datalog to query a csv
3:57 ddellacosta: (Java interop question:) er, how do I call a static method on a nested class?
3:57 amalloy: ddellacosta: use the right name for the nested class
3:57 it's not Foo/Bar or Foo.Bar, it's Foo$Bar
3:58 ddellacosta: amalloy: yeah, I've got that far, but this doesn't seem to be working for me: (.staticMethod Foo$Bar) <- is that wrong?
3:58 amalloy: that's not how you call static methods on any class
3:58 ddellacosta: amalloy: yeah, so, I'm wholly ignorant of that I guess. :-(
3:58 * ddellacosta goes to look up java interop docs
3:59 amalloy: (Foo$Bar/staticMethod)
3:59 ddellacosta: amalloy: ah, right, thanks. Found it here simultaneously: http://
4:31 yedi: does anyone use cljs on the client with a non-clj lang on the server? curious about people's experiences and common dev practices
4:38 CookedGryphon: is there a neat way to do a count with transducers? I'm mapping a function over a coll, and then want to count how many items now pass a predicate
4:38 previously I was doing a filter then counting the result, but it I shouldn't need to construct an intermediate sequence at all
4:39 I mean i could map (constantly 1) and then transduce +, but that feels a bit clunky too
5:05 keeds: yedi: fynder.io use cljs with Haskell
5:55 cfleming: Can anyone point me to some information about &form & &env, in particular describing when they have to be explicitly passed, and when they should appear in argument lists?
5:57 I understand that they have to be passed when calling a different arity of the same macro
5:58 ticking: Does anybody know why the IAtom protocol of cljs is empty?
5:58 Bronsa: cfleming: they should never be explicitly passed
5:59 cfleming: Should they ever appear in arg lists of defmacro? They appear in the arg list of defn, but that's an fn marked with ^:macro
5:59 Bronsa: no they shouldn't, that's an implementation detail
5:59 cfleming: Bronsa: According to this, you sometimes have to: http://
6:00 Bronsa: cfleming: that's a horrible thing to do
6:00 cfleming: you're invoking the macro as a function there
6:00 cfleming: Bronsa: It's not me - sadly as a tool developer I have to support people who do horrible things :-)
6:00 Bronsa: This is for arity checking in Cursive
6:00 Bronsa: one should do instead (defmacro x ([] `(x 1)) ([x] x))
6:01 cfleming: Bronsa: defn has them explicitly in its arg list
6:01 Bronsa: cfleming: that's because defn is implemented before defmacro
6:02 cfleming: Bronsa: Right. I'm just trying to figure out the rule for arity checking - currently Cursive thinks defn accepts 3 args and a rest.
6:03 Bronsa: Neat trick in your alternative there, but I can't say it's intuitive.
6:03 Bronsa: it's not a trick, it's the only way to do it right :)
6:04 cfleming: eeeh, I disagree, you're saying it's more intuitive to expect a macro to work like a function inside its decl?
6:04 cfleming: Well, or use a helper function as suggested in that post - or just not have multi-arity macros :-)
6:05 Bronsa: note that in the stackoverflow example he's doing (macro &form &env a b) and expects a and b to be evaluated at call time
6:05 cfleming: I think the helper function is probably the clearest solution of all of them.
6:05 Bronsa: me too
6:06 cfleming: but it's not always feasable. see e.g. c.c/or or c.c/and
6:06 cfleming: I think I'm just going to filter out &form and &env from arg lists and calls for checking arity, and anyone who does anything crazy like let-binding something and then explicitly passing it will get what they deserve.
6:06 Bronsa: heh
6:07 cfleming: how are you doing arity checking anyway? using :arglists?
6:07 cfleming: If it weren't for defn I'd just ignore the whole edge case.
6:07 Bronsa: if so, good luck with that. people are overwriting :arglists, it's unreliable
6:07 cfleming: No, I use the actual function arglists, so for defn it'll just be name & rest
6:07 Bronsa: ah ok
6:08 cfleming: Which is not very useful.
6:08 Yeah, I'd love to be able to rely on :arglists for more things (parameter info etc) but it's basically useless for my purposed.
6:08 purposes.
6:09 This arity checking is more useful for functions.
6:09 I also have to ignore any calls with unquote-splicing
6:09 Like (assoc ~map ~@kvs)
6:10 Bronsa: yeah. I proposed to split :arglists into :arglists and :doc-arglists months ago so that :arglists can be used by tools/compilers safely but it never got attention from core.
6:10 cfleming: Fortunately when I index I get both - it would be great to have it in the language.
6:10 Bronsa: cfleming: ah I didn't realize you're analyzing the unexpanded code
6:11 cfleming: Bronsa: Yeah, Cursive only works on source.
6:11 Bronsa: Which has its ups and downs, but mostly ups :-)
6:12 Bronsa: So I use :arglists when showing docs and so forth, and the actual arglists for this kind of thing.
6:13 Bronsa: yeah that's the only sensible way to do it
6:13 cfleming: Bronsa: I implemented a parsing framework for macros similar to seqex, so I'll potentially be able to use that to show more useful errors in the editor for forms that have an associated parser.
6:14 Bronsa: in eastwood we are actually using :arglists, but there are issues when users overwrite the default :arglists
6:14 cfleming: Eastwood parses source sometimes too, right?
6:15 Bronsa: yes it does, but mostly relies on the expanded AST & runtime informations
6:15 cfleming: I'm actually planning to pillage Kibit and Eastwood for inspections in Cursive soon.
6:15 Bronsa: awesome
6:16 cfleming: really good work with Cursive btw, I'm super impressed. I unfortunately don't use it myself as I've invested way too much time in emacs but I'll definitely be suggesting cursive to everyone who asks
6:16 (inc cfleming)
6:16 lazybot: ⇒ 4
6:16 cfleming: I can do some interesting other ones too, like (if-let [x (something)] ...) - if x is never referred to I can offer to update it to (if (something) ...)
6:16 Thanks, I'm glad you like it!
6:17 I'll be talking at the conj about the difference in approach between Cursive and practically everything else
6:17 i.e. the pros and cons of using source
6:17 It allows some really nice functionality
6:17 And means that everything just works with cljs
6:19 I'll let you know when the Kibit/Eastwood stuff is in so you can take a look. One of the many nice things about using IntelliJ is that that's all real time in the editor, and the quickfixes are right there too.
6:20 Bronsa: cool
6:21 cfleming: They seem to have improved their indexes in v14 too, which allows them to do this sort of thing: http://
6:21 Guest_: may I ask, as a new Clojure learner, dabbling in Light Table - what I benefit from Cursive?
6:22 (would , not what)
6:22 cfleming: The interesting thing there is that they have a global graph structure, but still show the results in real time - I don't know how they do that.
6:22 Bronsa: magic that Just Works™ :)
6:23 cfleming: That means that I might be able to do some limited global type inference (which fns return seqs, for example) and provide useful warnings.
6:23 Bronsa: That's the idea :-)
6:23 I'll be able to mark globally unused vars shortly.
6:24 Guest_: Sure, it depends a bit what you're doing. Generally Cursive is very easy to set up and get going.
6:24 Guest_: If you're doing CLJS LightTable still has a lot going for it in terms of ease of use.
6:25 Guest_: But IMO Cursive has more functionality that you can grow into it as you learn more about it and get more used to Clojure.
6:27 Guest_: I see - have to try ... so I'm getting IntelliJ first and then more
6:27 thanks for answering
6:27 cfleming: Guest_: Think of it as probably roughly equivalent power to Emacs but without a lot of the swearing :-)
6:27 Guest_: great
6:27 cfleming: If you have problems, either hit me up here or on firstname.lastname@example.com
6:27 Guest_: I'm not going to learn emacs right now, I guess ...
6:28 :-)
6:28 cfleming: If you're just learning Clojure, I wouldn't recommend learning both at the same time, no.
6:28 dysfun: and of course emacs will ultimately be more extensible than cursive
6:28 cfleming: dysfun: Sure, no doubt.
6:28 Guest_: right now I'm in the "easy" section of 4clojure
6:28 dysfun: not that i didn't have to work quite hard on some things
6:29 Bronsa: dysfun: the question is if you really need all that extinsibility when coding
6:29 cfleming: dysfun: That said, there's a lot that Cursive can do that Emacs can't either - different pros and cons.
6:29 dysfun: of course. like everything.
6:29 personally i use emacs because a) my fingers are hardwired b) IDEs just irrationally irritate me
6:30 Bronsa: I mean, I've built emacs into my OS, but as for editing clojure I'm not sure clojure-mode + SLIME is much superior to Cursive at this point
6:30 dysfun: SLIME? nrepl-cider
6:30 Bronsa: no thanks
6:30 dysfun: heh, i patched that
6:30 i use ac-nrepl-compliment sometimes too
6:31 Bronsa: I've tried switching from slime to nrepl/cider at least 5 differnt times, everytime I went back crying.
6:31 cfleming: Yeah, there's still a bunch of Emacs functionality I'm catching up with, but it's all fairly doable. But there are a lot of things that an AST and global indexes allow that are really cool.
6:32 dysfun: i was never a SLIME user and i gravitated towards cider
6:32 cfleming: Bronsa: I'm actually going to have to add a minimal REPL to Cursive - there are a surprising number of people who basically want inferior-lisp
6:33 I was surprised, anyway.
6:33 dysfun: what functionality do you provide that you consider replaces it?
6:34 presumably something like lighttable's live eval?
6:34 cfleming: That I consider replaces what?
6:34 dysfun: the need for a repl
6:34 cfleming: Oh, I don't - Cursive has full nREPL integration
6:34 dysfun: oh i see what you mean
6:35 i'll have to give it a play sometime. when i last used it, it was pretty terrible for actually writing lisp
6:35 cfleming: But there are a lot of people who don't want that - they just want a prettier wrapper around clojure.main, basically
6:35 What was, IntelliJ?
6:36 Bronsa: cfleming: I'm actually not surprised -- one of the things I dislike most of both Cursive & CCW is actually their repl interface
6:36 dysfun: Cursive
6:36 cfleming: dysfun: If you try it again I'd be interested to know what you're missing.
6:37 Bronsa: It's not so much the interface, people don't want nREPL, and especially lots of magic in middleware.
6:37 Bronsa: cfleming: ah well, I don't know anything about that :)
6:38 cfleming: Bronsa: see https://
6:39 clgv: Bronsa: what is bad about repl interface in CCW & Cursive?
6:39 milos_cohagen: If 95% of the time I use emacs+cider to eval forms and get back response in mini-buffer, would that be called using a repl?
6:40 dysfun: cfleming: it was more that i didn't even have things i consider basic like rainbow parens
6:40 cfleming: dysfun: It does have that, you have to turn it on
6:40 milos_cohagen: I'll pull up the repl buffer if I print something big.
6:41 TEttinger: dysfun, yeah I loved that in light table. but nightcode doesn't have rainbow parens yet
6:41 clgv: cfleming: do you use tools.analyzer to get the AST for Cursive?
6:42 cfleming: clgv: No, I use a custom parser
6:42 clgv: The AST elements have to be derived from IntelliJ base classes
6:42 clgv: cfleming: ah ok. a translation from a tools.analyzer would have been difficult?
6:42 CookedGryphon: Does anyone know if count can work with transducers?
6:43 clgv: +AST
6:43 CookedGryphon: I don't want to build the intermediate collection, just count the things that end up coming through after my mappings and filters
6:43 clgv: CookedGryphon: should be doable though you will need a volatile for the counting state
6:43 cfleming: clgv: I'm actually not sure - I started out using a custom parser before tools.analyzer was around, and I haven't investigated whether it would be worth switching.
6:44 clgv: cfleming: ah so that is the main reason
6:44 CookedGryphon: clgv: Is there nothing in the standard library, this doesn't feel like something I should need to roll my own for
6:44 clgv: CookedGryphon: probably not yet since transducers are alpha
6:44 or ebta?
6:45 cfleming: clgv: The parser is actually pretty simple since I have to maintain all source information (comments etc) too, so it's very much just the basic forms - lists, symbols, keywords etc. The more interesting stuff I build on top of that myself.
6:45 clgv: CookedGryphon: but you could come up with a `counting` function and submit it as patch
6:46 cfleming: clgv: Speed is also an important issue since Cursive parses a *lot* - the current parser is actually Java
6:47 clgv: cfleming: interesting, though you could just use clojure with mutable stuff (deftype with mutable fields)
6:48 cfleming: to gain similar/same speed
6:48 Bronsa: clgv: there are actually issues with that b/c clojure functions have to box chars
6:49 clgv: Bronsa: ah well, didn't know you need to store primitive chars for that...
6:51 Bronsa: clgv: cfleming I actually don't think using tools.analyzer for guiding an editor/IDE gains you that much TBH
6:51 clgv: Bronsa: yeah, I am not really satisfied with the implementation of Clojure's primitive function
6:51 Bronsa: but if you have no parser at the start of your project?
6:51 *no other parser
6:51 +analyzer
6:52 Bronsa: clgv: the thing is, t.a helps you if you can actually evaluate each form as you go. if you can't, you have to work your way to lie to tools.analyzer and make it believe everything's fine
6:53 this is a consequence of clojure's compilation model btw, there's nothing I can do about it
6:54 clgv: Bronsa: ah ok, in short it is not analyzing statically?
6:55 Bronsa: clgv: it is analyzing statically, the issue is that the compilation level is the top-level form
6:55 compilation unit*
6:57 clgv: Bronsa: so you mean you got to maintain the context that was evaluated before the current top-level form?
6:57 Bronsa: clgv: yeah well, I just plug into clojure's namespaces
6:58 clgv: the POC is this: (defn x [] 1) (defmacro y [] (x)) (defn z [] (y))
6:58 clgv: you could analyze just fine the first two forms without any evaluation
6:59 but when you get to z, you need x to be evaluated in order to be able to do the macroexpansion
6:59 clgv: ok
7:00 Bronsa: racket has a mechanism to work around this issue, by defining some sort of compilation levels but basically all lisps that I'm aware of have this "issue" that emerges
7:05 cfleming: Bronsa: Do you know why the extra attr-map at the end of the multi-arity form of defn is required?
7:06 Bronsa: cfleming: no, I never understood why it's there
7:06 nor have I ever seen it actually used FWIW
7:06 cfleming: Bronsa: Me either, it's not even in a different scope - it's really weird.
7:07 That's good to know.
7:09 clgv: cfleming: yeah that one is strange.
7:23 Guest_: newbie looking for help in understanding recursive example
7:23 the assignment ist http://
7:24 the (working) solution I have is:
7:24 (defn -flatten [coll]
7:24 (if (coll? coll)
7:24 (mapcat -flatten coll)
7:24 [coll]))
7:24 clgv: Guest_: post it on refheap.com please
7:24 Guest_: ah, ok
7:25 [learning how to do this]
7:25 https://
7:25 clgv: Guest_: what is you question about that function?
7:26 Guest_: trying to analyze what's going on inside the recursive loop
7:27 I inserted a (println coll) to look at ir
7:28 like so:
7:28 https://
7:28 why do I never see the complete coll in the prints?
7:28 (I#M feeling dense ...)
7:29 schmir: Guest_: the println changes the return value
7:30 Guest_: ah ...
7:31 recursive thinking need alot of practicing, I guess
7:33 what would be the best way to look into the iterations of a recursive loop?
7:34 (I thought println would be sensible)
7:34 schmir: the problem you introduced has nothing to do with recursion.
7:34 Guest_: ok
7:34 schmir: println returns nil
7:34 Guest_: yes
7:35 I had the println before the mapact
7:35 schmir: so, the function with the println returns nil, since you put the println at the end of the do block
7:35 clgv: Guest_: just add (println coll) after [coll]
7:35 Guest_: (sorry)
7:35 clgv: then you see the collection per function call
7:36 Guest_: in a (do ..) ?
7:36 clgv: no
7:36 Guest_: ok
7:36 thanks
7:36 clgv: just before the `if` the `defn` has an implicit `do` for its body
7:36 Guest_: (I know this questions are very newbish)
7:37 clgv: Guest_: you got a book to learn those basics quickly?
7:37 Guest_: yes
7:37 clgv: ,(defn -flatten [coll] (if (coll? coll) (mapcat -flatten coll) [coll]))
7:37 clojurebot: #'sandbox/-flatten
7:37 clgv: Guest_: then best interleave reading and experimenting at the repl
7:38 Guest_: yes, just now in Light Table
7:38 "#'sandbox" is something I can look up?
7:39 clgv: ,(-flatten (last (take 100 (iterate list nil))))
7:39 clojurebot: (nil)
7:39 clgv: ,(-flatten (last (take 500 (iterate list nil))))
7:39 clojurebot: (nil)
7:39 clgv: ,(-flatten (last (take 5000 (iterate list nil))))
7:39 clojurebot: #<StackOverflowError java.lang.StackOverflowError>
7:39 clgv: Guest_: `sandbox` is the namespace where the bot evaluates our commands
7:40 Guest_: ah, sorry
7:40 clgv: Guest_: in your repl you likely have `user`
7:40 Guest_: understood
7:40 thanks
7:40 clgv: the last expression demonstrates that the -flatten is subject to a stackoverflow. but maybe you wait until later to find out what the problem is ;)
7:41 Guest_: could be solved by recur, I guess
7:42 clgv: Guest_: for a lazy-seq approach there should be no stacked `concat` which is implicitely called in `mapcat`
7:42 Guest_: ah ...!
7:42 good, that is something to think about
7:43 "interleave reading and experimenting at the repl" is what I do since a few days
7:43 clgv: ,(flatten (last (take 5000 (iterate list nil))))
7:43 clojurebot: (nil)
7:43 clgv: gooad ^^. next you should get an individual irc name so that people can remember you around here ;)
7:43 Guest_: ok
7:44 thanks again!
7:57 mmeix: done
7:57 clgv: good.
8:00 mmeix: "stacked 'concat' " was the point, I hadn't quite understood
8:00 but it gets clear
8:02 (I'm positively surprised by the helpfulness I experienced here in te last days)
8:04 clgv: mmeix: you usually get good help here. usually you should find a minimal version of your source that produces the same problem and describe what you expect and what happens to get fast answers
8:04 mmeix: yes, I'm trying ...
8:05 for a newcomer the question is often not so clear, but it's getting better :-)
8:05 back to 4clojure
8:06 clgv: lazybot can also help you if you know examples that specify your function ;)
8:06 mmeix: what/who is lazybot?
8:06 clgv: $findfn odd? (range 5) [1 3]
8:06 &42
8:06 lazybot: ⇒ 42
8:06 clgv: that guy ^^
8:06 mmeix: a robot I guess
8:07 lazybot: Execution timed out.
8:07 []
8:07 clgv: $findfn odd? [0 1 2 3 4] [1 3]
8:08 lazybot: Execution timed out.
8:08 clgv: ah well maybe that feature broke...
8:08 lazybot: []
8:59 justin_smith: $findfn 6 3 3
9:00 lazybot: Execution timed out.
9:00 [clojure.core/max-key clojure.core/cond clojure.core/char-escape-string clojure.core/-' clojure.core/*data-readers* clojure.core/- clojure.core/default-data-readers clojure.core/unchecked-subtract clojure.core/*clojure-version* clojure.core/unchecked-subtract-int clo... https://
9:01 justin_smith: so it times out, and it also finds me a bunch of answers
9:01 cool
9:03 greghendershott: I want to split a URL string into the components (scheme, host, port, etc.). In Racket I'd use string->url. What's a good way to do that in Clojure?
9:04 justin_smith: ,(bean (java.net.URL. "http://
9:05 clojurebot: #<MalformedURLException java.net.MalformedURLException: denied>
9:05 justin_smith: greghendershott: if you run that locally you will see the "bean" abstraction for that class - but each key in that map also represents a more efficient method call that you can call directly
9:06 greghendershott: justin_smith: Ah, so Java interop for that. Thanks!
9:06 justin_smith: ,(.getProtocol (java.net.URL. "http://
9:06 clojurebot: #<MalformedURLException java.net.MalformedURLException: denied>
9:06 justin_smith: :P
9:06 sw1nn: hi, can anyone offer any suggestions on avoiding this stack overflow using transducers? Problem exists in clojure and clojurescript (running in chrome 37). Not sure if I'm doing something dumb, but for small values of the repeat it works as expected, but larger values cause Overflow. https://
9:07 justin_smith: greghendershott: yeah, the jvm interop for the net stuff is decent, and you can use various apache libs for more advanced functionality too (by including them in your project.clj of course)
9:08 dnolen_: greghendershott: note using bean means you can use interact with the url as a map, (:protocol (bean (java.net.URL. "http://
9:08 verma: TIL about bean
9:08 justin_smith: dnolen_: yeah, that's why I showed that first - do you happen to know how big the overhead on bean is?
9:09 greghendershott: justin_smith: dnolen_: Thanks. A (correct) regexp for splitting URLs is non-trivial, so happy to use something "official".
9:09 dnolen_: justin_smith: probably not small but this doesn't sound like he's going to stick it in a loop
9:09 justin_smith: fair point :)
9:10 greghendershott: Feeling a little worried I don't know enough Java, and how much will I need to learn to be effective in Clojure. But, I'm just getting started.
9:10 dnolen_: sw1nn: I'm somewhat confused as to why that code is written that way
9:10 greghendershott: Open mind, turn on firehose
9:11 justin_smith: greghendershott: knowing java is not a huge concern, knowing how to search and read javadoc (and use what it describes via interop) will help you a lot
9:12 greghendershott: justin_smith: Ah right I meant the libs/ecosystem, what's out there to use. Not the lang. Thanks for the tip re javadoc and interop.
9:12 justin_smith: greghendershott: I find the javadoc-search-pane (for chrome and firefox) really helpful for finding what I want
9:12 * greghendershott takes notes
9:13 justin_smith: https://
9:13 it does completion of potential matches as you type, which is a huge help
9:13 sw1nn: dnolen_: well, it's an experiment with transducers, so it could be artificial. I'm receiving sequences [0 1 0 1 0] I want to total up all the 1s basically.
9:14 ie. [[0 1 0 1 0][1 0 0 1 0] ... [1 1 1 0 0]]
9:14 greghendershott: justin_smith: Thanks!
9:16 dnolen_: sw1nn: in any case the stack trace is clear, it looks like you have build up a bunch of lazy map ops and you realize it at the end and blow the stack. Nothing much to do w/ transducers.
9:17 Bronsa: sw1nn: what dnolen_ said. if you replace map with a mapv it should work fine
9:17 or (doall (map
9:17 sw1nn: dnolen_: ahh..I was being dumb :-), mapv works.
9:19 justin_smith: greghendershott: dnolen_: turns out the standard deviation of bean is greater than the execution time of a direct method call. https://
9:20 For what it's worth. I had heard bean had a big overhead but had not microbenchmarked it before.
9:24 ckirkendall: Anyone out there run into the clojurescript compiler hanging indefinitely when dealing with large quoted forms.
9:25 dnolen_: ckirkendall: haven't heard of this being a problem, but entirely possible - somebody may have never tried that before
9:25 ckirkendall: I know at one point large EDN structures were an issue until a parsing fix landed in Closure Compiler
9:26 stuartsierra: justin_smith: oh yeah, `bean` does full reflection on every call; wildly inefficient.
9:26 Bronsa: stuartsierra: on every call? couldn't it do it once and cache?
9:27 stuartsierra: Couldn't I fly if I flapped my wings hard enough?
9:30 ckirkendall: This is a large edn file being brought in as a quoted structure through a macro.
9:31 Bronsa: ckirkendall: in clojure it's often not a good idea to include big literals in code, I suppose it might be similar for cljs
9:31 ckirkendall: dnolen_: it compiles find if optimizations is set to none.
9:31 dnolen_: ckirkendall: so it's a Google Closure thing it sounds like
9:31 ckirkendall: dnolen_: that is the feeling I have.
9:32 dnolen_: ckirkendall: you may be hitting another parse corner case in Closure, what version of Google Closure do you see via lein deps :tree?
9:33 ckirkendall: dnolen_ Bronsa: v20140625
9:35 schmir: how do I exclude some namespaces from an uberjar?
9:35 dnolen_: ckirkendall: yeah pretty recent, you might want glance over the generated :none JS to see if something stands out
9:36 ckirkendall: also might make sense to describe how much JS you are generating - megabytes?
9:36 ckirkendall: dnolen_: will do. In the mean time I think we will take Bronsa's suggestion and try loading this at run time.
9:37 dnolen_: ckirkendall: yeah that's the simpler solution - another option is to just give Google Closure more memory - there's really no such thing as too much in my experience.
9:37 justin_smith: updated - with more fields accessed, and a hash-map created, the performance difference is much smaller
9:38 https://
9:38 ckirkendall: dnolen_: going to look at the memory thing right now., If that is the issue its easy to fix.
9:40 justin_smith: schmir: if you only need those libs at dev time, you can put them in a dev profile http://
9:40 oh wait, namespaces...
9:41 you could put the namespaces in a separate folder that is in your :dev :source-paths so that they are only found during dev time
9:43 schmir: justin_smith: right. but I'm looking for another solution. I'd like to keep the files in the same directory.
9:43 justin_smith: a hacky way to do it would be deleting the .class files from the uberjar - it's just a zip file after all
9:43 xeqi: schmir: In that case use :uberjar-exclusions https://
9:44 justin_smith: oh that's much better
9:44 (inc xeqi)
9:44 lazybot: ⇒ 14
9:45 schmir: xeqi: ok, will try that. I thought this is only for resource files. let's see
9:46 justin_smith: resource vs. class stuff is a very leaky abstraction - it's all just stuff that ends up on the classpath
9:52 schmir: xeqi: thanks. that seems to work, though it still aot compiles the excluded files.
9:52 (inc xeqi)
9:52 lazybot: ⇒ 15
9:52 ckirkendall: dnolen_ memory doesn't seem to be the issue. On to the javascript.
9:58 arrdem: mdrogalis: lol @ pool request
10:04 mdrogalis: arrdem: :D
10:04 I'm a doofus in the morning.
10:05 greghendershott: justin_smith: So the map from (bean (java.net.URL. "http://
10:05 Is that b/c `bean` is calling getContent http://
10:05 b/c I don't want a connection, I just want to parse the URL into its components.
10:05 Hmm....
10:06 justin_smith: greghendershott: that would be a good reason to use the accessors directly, and likely, yes, that is what is happening
10:06 greghendershott: Maybe I can not use `bean`, and somehow call the members individually?
10:06 Ah OK I'll work with that. Thanks.
10:06 justin_smith: right - did you see my updated paste? it includes creating a hash map directly using the accessor methods
10:07 https://
10:07 greghendershott: justin_smith: Oh sorry, no I missed that. scrolling.... back. You posted it again. :) Thanks! Got it.
10:08 OK so this is cool. I didn't expect I'd need to learn interop basics this early, but it's fine, that's good.
10:08 justin_smith: it's pretty simple
10:08 (mostly)
10:09 greghendershott: Simple things are simple, I imagine? :)
10:10 justin_smith: it's not just that - there's little things that expose differences between how clojure uses the jvm and how java uses it -- varargs are a bit weird, and things that specialize on int
10:11 clgv: justin_smith: did you typehint `loc` or is it's type inferable by the compiler?
10:11 -' :(
10:12 justin_smith: clgv: loc is defined before the other forms are compiled
10:13 or does that not help?
10:13 I can try with typehinting and see if it makes a difference
10:13 clgv: justin_smith: if it has a typehint on the var it's fine otherwise there is reflection involved
10:13 ckirkendall: dnolen_: the quoted form that seems to be giving it trouble is 49k when compiled with no optimizations. I don't see anything that is odd obout the javascript.
10:14 justin_smith: clgv: so I need (def loc ^java.net.URL (java.net.URL. "http://
10:14 I'll try it
10:14 clgv: no on the var
10:14 move it one position to the front
10:14 justin_smith: clgv: got it, thanks
10:14 this hinting stuff keeps surprising me
10:16 clgv: justin_smith: vars are an indirection so the compiler has no clue which type of value they refer to (it could change during runtime). with the type hint you tell the compiler that the type remains the specified one
10:17 justin_smith: OK
10:18 TimMc: That's a really good point.
10:20 justin_smith: oh wow, that is a huge difference, paste updated - that makes the direct access version very fast https://
10:20 (inc clgv)
10:20 lazybot: ⇒ 29
10:22 clgv: ah yes, that's more like it :D
10:22 Bronsa: I am always moderately annoyed that clojure doesn't have any option to turn on simple global type inference on things like (def a (Foo. ))
10:23 justin_smith: yeah, it was counterintuitive that it wouldn't attempt that
10:23 I mean, that's a pretty safe thing to add a hint to
10:23 clgv: Bronsa: but you still would need something like (def ^:infer-constant-type foo (Foo.))
10:23 Bronsa: build profiles are getting to the top of my wish-list pretty fast
10:23 clgv: since you are allowed to rebind the var to anything
10:24 Bronsa: clgv: no a per-form config option wouldn't make sense, agreed
10:24 clgv: Bronsa: damn I forgot to mention the work on "static" functions as feature I want in the survey
10:25 hyPiRion: Have people talked about how they want better error messages yet?
10:25 Bronsa: clgv: build profiles are way more essential IMHO
10:26 clgv: Bronsa: just my perspective ;)
10:26 Bronsa: clgv: adding features to the compiler right now is really painful
10:26 clgv: Bronsa: I'll agree on build profiles being number one if there are performance optimization for production builds included ;)
10:26 Bronsa: clgv: sure, that's the whole point :) but you need the infrastructure in place before adding those or it will get a mess
10:27 clgv: Bronsa: agreed
10:28 Bronsa: unfortunately I doubt there's any interest in refactoring the compiler ATM
10:28 justin_smith: clgv: what about automatically hinting by default on def when the class is trivial to determine at compile time? what's the counter argument for doing that?
10:28 Bronsa: justin_smith: you might be at the repl and later want to rebind the var to a different type
10:28 justin_smith: yes we are allowed to rebind a def to a different class, but even with hinting that wouldn't break anything would it? you just get the wrong type hint
10:29 clgv: justin_smith: what Bronsa said.
10:29 Bronsa: and if you have already evaluated a function that does interop on that var, it's broken
10:29 justin_smith: ahh
10:29 got it
10:29 that's what I was looking for, thanks
10:29 (inc Bronsa)
10:29 lazybot: ⇒ 58
10:29 clgv: justin_smith: primitive functions that are called accordingly are a good example for that
10:30 when you reevaluate the function without the primtive typehints the callsite will throw
10:31 Bronsa: I'd like to see a benchmark to see how much an impact compiling to (if (instance? primInterface x) (.invokePrim x ..) (invoke x ..)) instead of directly yo (.invokePrim x ..) has
10:32 protocols callsites compile to something like that and they are pretty fast so I'm not sure it would be a prohibitive enhancement
10:32 justin_smith: cheaper than reflection to be sure
10:32 clgv: Bronsa: or (try (.invokePrim x ..) (catch ApropriateExceptio e (.invoke x ..))
10:33 Bronsa: clgv: oh yeah
10:33 it might have some impact on jvm inlining though
10:34 clgv: Bronsa: both? or just the try-catch version?
10:35 Bronsa: both, or neither :P I don't really know enough about it
10:35 clgv: Bronsa: I have no clue about the internals of inlining on the jvm ;)
10:38 Bronsa: maybe I try that, I was working on more flexible primitive functions anyway
10:38 Bronsa: clgv: I'd be interested to know about that
10:43 clgv: Bronsa: currently I am just hacking the compiler from a library
10:44 i.e. reusing its class generation features for reify
11:10 yedi: does anyone use cljs on the client with a non-clj lang on the server? curious about people's experiences and common dev practices
11:12 daniel___: yedi, dont think so
11:12 thats crazy
11:12 yedi: =p , jc to know if ppl have written about their experiences somewhere
11:13 justin_smith: daniel___: saw some guy on twitter talking about using cljs with rails
11:13 shem: yedi: i'm doing such a thing right now. cljs/om in the client, perl in the server (for legacy reasons). communication via json
11:14 muraiki: shem: are you doing anything with websockets in perl?
11:14 justin_smith: daniel___: a coworker of mine made some great stuff using cljs on the frontend and google app-engine and node.js on the backend (two different projects)
11:14 shem: muraiki: nope
11:15 yedi: shem: cool! i guess it's been working out pretty well?
11:15 muraiki: shem: I work at a perl shop and our internally developed framework doesn't really have a way to easily fit in something like websockets... was just curious if you had explored that in perl :)
11:15 shem: yedi: it's certainly more fun than doing mostly everything on the server side with perl
11:16 yedi: shem: for packaging different cljs code for different webpages and sending them to the client, how do you go about that? do you simply just build a bunch separate js files from the cljs and choose which ones to included in the html markup?
11:17 oooo clojure cup results are out
11:17 shem: yedi: i use simple routing inside the root component like this: https://
11:18 yedi: btw there's a #clojurescipt channel which might be more appropriate for this
11:18 yedi: shem: oh it's in the style of a one page application? all your pages require the same cljs?
11:18 clojurebot: excusez-moi
11:18 yedi: ah true, i forget ##clojurescript is a thing
11:19 cka3yc: 1
11:19 shem: yedi: yeah, one page logically. but many completely different views
11:21 yedi: shem: right, so when loading a view that isn't the index or main page. do you send the base/root js to the client and then it requests what's needed from the server to generate to view? so two round trips instead of 1?
11:21 the winning app: http://
11:21 shem: nope, no communication with server
11:22 i just change the route-name in app state and om renders a different view
11:24 yedi: shem: ah ok, seems simple enough. thanks for sharing
11:24 cka3yc: Hello, trying to read tar.gz file like so :
11:24 (with-open [in (java.util.zip.GZIPInputStream.
11:24 (clojure.java.io/input-stream
11:24 "my-file-name.gz")
11:24 and getting "Not in GZIP format", but i can open this archive in my file manager without any problems, what can be the problem here? I'm on Windows 7
11:25 p_l: it's probablyt not a gzip file
11:32 daniel___: justin_smith: wasnt completely serious, it could obviously work
11:32 its a bit strange if you have a choice in the matter though
11:40 justin_smith: yeah, those examples had client requirements that ruled out clj on the back end
11:43 seangrove: I'm really starting to get attracted to the idea of a clojure-flavored haskell. Could be a lot of fun.
11:44 justin_smith: seangrove: flavor as in syntax or semantics?
11:45 seangrove: Clojore-syntax, clojurescript-macros, haskell/ghc typing
11:45 justin_smith: ahh, OK
11:45 seangrove: No runtime macros, but we don't have them in cljs anyway
11:46 Also, the degree of purity Haskell has means the compiler is free to do a lot more
11:46 It's an interesting set of ideas, I can definitely see why Haskell is academia's playground
11:55 dnolen_: seangrove: I think this idea doesn't really make any sense - you already have core.typed, HM style typing while preserving Cljoure semantics. What you're talking about sounds like Haskell w/ Lisp syntax http://
11:56 seangrove: dnolen_: Yeah, certainly I'd rather it be closer to Liskell (not a fan of Haskell syntax at this point), but core.typed being optional makes it largely useless without a ton of discipline and buy in from everyone
11:56 dnolen_: I like core.typed too, but having seen it in a large code base, it's really subject to bitrot
11:57 It's just an idea I'm considering playing with a bit more though
11:59 dnolen_: seangrove: I don't see how this any different from evolving code conventions, deprecated libraries / APIs, etc.
11:59 investing in anything is a shit ton of work
12:00 seangrove: dnolen_: Except if the libraries aren't doing the typing as well, then you're doing a huge amount of work for every library that you bring in
12:00 Just a cultural thing that causes a lot more pain for core.typed users than for ocaml/haskell users
12:00 dnolen_: seangrove: what you're saying still doesn't make sense given the larger goals of gradual typing
12:01 seangrove: the the point is not to type everything in the world
12:01 this is a waste of time
12:01 seangrove: dnolen_: Ah, yes, I'm sorry. I'm saying that gradual typing is a really tough problem
12:01 Don't mean to open up a debate, it's not a hugely interesting problem
12:01 dnolen_: seangrove: no static typing has the same problem
12:01 bbloom: seangrove: gradual typing is rapidly becoming pretty well understood :-)
12:01 dnolen_: seangrove: there's thing called Type Providers in F# for a reason
12:02 seangrove: dnolen_: I'll have to look up type providers, thanks. Haven't looked into F# at all yet
12:02 dnolen_: seangrove: even if you did come up with such a thing good luck providing semantics for interop anyhow
12:03 bbloom: type providers are pretty damn cool
12:04 dnolen_: which is another thing that core.typed doesn't get enough credit for, attempting to give semantics to host
12:05 seangrove: dnolen_: How so?
12:05 zot: is there any notion of directly accessing the parent namespace? e.g., i'm in foo.bar.baz, and want to access foo.bar/funk — is there a relative/.. style access, or do i just need to explicitly say foo.bar/funk?
12:05 dnolen_: seangrove: dude, read the paper :)
12:05 seangrove: dnolen_: Will do
12:05 clgv: zot: no. there is no such runtime concept as parent namespaces
12:05 bbloom: zot: relative imports are a bad idea
12:06 clgv: zot: actually, there is no guarantee that a namespace class for a parent (according to your definition) exists at all
12:06 zot: use aliases as in (:refer [foo.bar :as fb])
12:06 technomancy: bbloom: why is that?
12:07 zot: i don't have a need for guarantees, but i too am curious about the bad idea flag :)
12:07 s/flag/flag-in-the-ground/ :)
12:07 bbloom: b/c it makes it harder to grep for usages of namespaces
12:07 clojurebot: It's greek to me.
12:07 bbloom: b/c it saves like ~20 characters in an entire file
12:07 b/c you should use aliases anyway
12:08 b/c there's no such thing as a parent directory in unix
12:08 i'm sure i could think of a few more :-)
12:09 sritchie: technomancy: oh man, I finally found it: https://
12:09 bbloom: b/c it makes the meaning of a file's code depend on the location of the file
12:09 nothing else does that right now
12:09 btw python 3 removes relative imports ...
12:10 or rather *implicit* ones, i bleieve
12:10 technomancy: bbloom: racket has them
12:10 bbloom: technomancy: racket has everything
12:10 technomancy: the grep thing I'd buy; the other reasons are bogus
12:10 I'm still wondering what it would look like if you could chop of a subtree of namespaces and treat them as an isolated unit
12:11 I think you could solve a lot of dependency problems that way
12:11 bbloom: you can't cat a file to the compiler and have it work if you've got relative imports
12:11 b/c you need to know the file's path
12:11 sritchie: technomancy: that plugin I just sent you allows you to do that with a lein proj (I just jumped in so I'm probably missing a ton of context)
12:11 bbloom: nothing else in clojure is source location dependent
12:11 technomancy: you can't cat a file to the compiler and have it work anyway
12:11 bbloom: sure you can
12:11 technomancy: FSVO of "work" that includes line numbers
12:11 bbloom: that's basically what load-file does
12:12 but it does know the file path ;-)
12:12 technomancy: right
12:12 bbloom: the way people use inferior lisp probablyw ouldn't work b/c it really just does pipe stuff, as far as i udnerstand
12:12 but i'm not a emacs guy
12:12 technomancy: any definition of "work" that doesn't give you useful error messages is not a definition I buy
12:12 milanj: hi, what's best way to extend exception
12:12 bbloom: milanj: use ex-info and ex-data
12:12 milanj: or if you absolutely must make a custom subclass for interop purposes, write java
12:13 milanj: I don't want it for inter opt purposes
12:13 bbloom: (doc ex-info)
12:13 clojurebot: "([msg map] [msg map cause]); Create an instance of ExceptionInfo, a RuntimeException subclass that carries a map of additional data."
12:13 bbloom: ^^ that's what you want
12:13 milanj: ok, let me check those
12:22 bbloom, thanks
12:22 btw. this doesn't look nice
12:23 bbloom: what's not nice about it?
12:23 technomancy: it's a lot nicer than subclassing Exception
12:24 milanj: that is right
12:24 lvh: reiddraper: Hi! You wouldn't happen to know if there's a URL generator, or, maybe more generally, generator-generator from instaparse, or generator-generator from ABNF?
12:24 milanj: bbloom, well, you manually comparing things from map that you put in exception
12:24 probably can be made better with some macro
12:25 jeremyheiler: lvh: this might help: https://
12:25 for urls
12:25 milanj: I can, judging by this you only need on Exception class
12:25 jeremyheiler: it uses instaparse under the hood
12:25 lvh: jeremyheiler: Yeah, I'm using that. It has a URI schema, I'm trying to turn that into a test.check generator
12:25 bbloom: milanj: i'm not sure i understand your complaint
12:26 technomancy: milanj: it is a shame there's no built-in macro to pattern-match against ex-data
12:26 mdrogalis: milanj: I think I know what you're saying. You're repeating the keywords in the map?
12:26 You'd have to repeat the method call to Exception's subclass. It's a superficial difference, if I understand correctly.
12:27 milanj: if java was like this we would throw only OneException with map in it and then compare it by hand
12:27 technomancy: java sucks at having syntax for data though
12:27 milanj: yes, cool thing is that lisp allow it to play with syntax
12:27 reiddraper: lvh: nothing that i'm familiar with, but a url generator would not be difficult to write
12:28 technomancy: milanj: there's sort of pattern-matchy stuff in slingshot that works on ex-infos
12:28 Bronsa: how cool would it be if catch could destructure ex-infos?
12:28 technomancy: https://
12:28 lvh: reiddraper: yeah, I just try to avoid writing code :) any particularly good contrib libs that I could contribute a generator to?
12:28 milanj: technomancy, thanks, I'll check that for sure
12:28 native solution is ugly
12:29 technomancy: milanj: it gives you all the building blocks you need, but it's low-level
12:29 reiddraper: lvh: hmm, maybe https://
12:29 cc gfredericks ^
12:29 lvh: reiddraper: awesome, thank you :)
12:29 reiddraper: np
12:30 milanj: technomancy, sure, but exception handling is something that is basic enough to have good solution in core language
12:30 so anyone can use the same solution
12:30 technomancy: milanj: and so is pattern matching; I agree =)
12:30 lvh: particularly gen'/for seems very useful for my url maker :)
12:31 technomancy: milanj: but if you ever tried to contribute a change to clojure you'd understand why it's this way
12:32 milanj: technomancy, I just started with clojure, coming mainly from CL world (and Java in last couple of years)
12:32 mdrogalis: Welcome :)
12:32 milanj: (don't make me mention cl conditions system) : ))
12:33 Bronsa: technomancy: things are a bit better now than before though, puredanger is actually responsive :)
12:33 milanj: ok, thanks to all
12:33 technomancy: milanj: yeah the only thing I'm still jealous of CL about =)
12:33 mister_zombie: Hi, I'm new to clojure, as an introductory project I wanted to build a thing that parses a webpage to check for missing alt properties on img tags
12:34 milanj: btw. is that decision because of interopt with java or something else (not to have conditions) ?
12:34 technomancy: Bronsa: I've seen fixes go through better than in the old days, but I'd still much rather contribute to slingshot than clojure itself.
12:35 justin_smith: milanj: you keep calling interop (inter operation) interopt (inter optimization?)
12:35 mister_zombie: I don't really want to start off building a parsing library, is there any good one out there?
12:35 danneu: what's a nice way to implement (select-keys2 {:a 1, :b 2} [:a :b :c]) -> {:a 1, :b 2, :c nil}
12:35 milanj: I meant inter-op
12:36 danneu: nvm zipmap+juxt comes to mind
12:36 ckirkendall: mister_zombie: enlive has some tools that would make this easy.
12:37 mister_zombie: I tried it but I couldn't get it to work
12:37 I had issues with attributes
12:37 justin_smith: ,(into {} (map (juxt identity {:a 1, :b 2}) [:a :b :c])) ; danneu
12:37 clojurebot: {:a 1, :b 2, :c nil}
12:38 lvh: reiddraper: If (gen/sample my-generator) returns a bunch of duplicates, is that a bug in my generator, or considered OK behavior?
12:38 reiddraper: lvh: totally depends, try (gen/sample my-generator 100) and see if you get more diverse data
12:39 ckirkendall: mister_zombie: can you give me an idea of the type of problem you had.
12:39 lvh: reiddraper: ah; that made me realize the answer actually
12:40 reiddraper: lvh: sampling is also (just like testing) subject to sizing, and the size increases as you ask for more tests, or more samples
12:40 lvh: reiddraper: (basically it's just a fixed url + a fixed pair + an optional pair with only five or so possible values; so as soon as sample *can* ask for more than, oh, 6 types or so, it's going to repeat itself)
12:40 reiddraper: I guess it could be rephrased as: does every generator need to be able to produce arbitrary examples
12:40 gfredericks: reiddraper: I had great success with exponential hops down the shrink tree the other day; such a bizarre tactic though
12:40 lvh: reiddraper: or can it say "these are all the things I have, sorry"
12:41 reiddraper: I guess it's not usually a problem because most real generators, especially composed ones, will be able to produce many more examples than you can ever check
12:41 reiddraper: lvh: test.check doesn't care if there's lots of duplication, but it also doesn't take advantage or do anything smart with that
12:41 lvh: reiddraper: ok, cool, thanks again :)
12:41 reiddraper: gfredericks: hmm, we should talk about that, still thinking next week might be good to meet up?
12:41 gfredericks: I down it's worth considering as an official shrink strategy but it was fun
12:41 oh urm
12:42 reiddraper: maybe next week is bad actually
12:42 anything later is probably fine. also RIGHT NOW would work.
12:43 reiddraper: gfredericks: i'm in my last two days at basho, so now probably isn't good... :) , we'll figure it out
12:49 ckirkendall: mister_zombie: https://
13:02 mister_zombie: ckirkendall: Oh. That's very cool.
13:06 sritchie: so, with environ and the 12 factor thing of sharing config through environment variables,
13:07 if I'm never supposed to check them into source control, how am I supposed to sync a dev environment between team members?
13:09 technomancy: sritchie: nothing wrong with checking dev default values into source control
13:09 justin_smith: sritchie: relevant page for reference http://
13:10 technomancy: depends on what you use - I have seen for example the credentials to an internally used mysql server accidentally get open sourced
13:10 technomancy: which config via env would have prevented
13:10 technomancy: justin_smith: developing against a server that isn't on your laptop? =(
13:10 sritchie: justin_smith: so how would you get those credentials to new devs?
13:10 justin_smith: sritchie: a scrit that sets up all the dev time env, that isn't in vc
13:11 sritchie: and just gets emailed around or something?
13:11 I can see putting that in a separate project,
13:11 under VC, which just never gets open sourced -
13:11 seems just as "secure" as any other distribution channel
13:11 justin_smith: technomancy: it's a cms, the designer needs to be able to create asset handles, the frontend needs to be able to create content placeholders, etc. and everyone should have this stuff in sync
13:12 technomancy: acknowledged it is a specific workflow, but this kind of thing is not super uncommon
13:12 sritchie: actually, here's one config question I had for you guys -
13:12 technomancy: I actually put default settings in the code itself, only because you have to restart the whole JVM to change actual env vars
13:12 sritchie: I'm moving all my config over to the env, but having strict "dev" and "prod" configs isn't quite working,
13:12 since I might want to run production stripe queries, or send mandrill emails, from my repl
13:13 (but not actually store production DB info locally)
13:13 so that requires switching just one config variable, the stripe key, and nothing else
13:13 one way to do that is to prefix environment variables with "DEV_" or "PROD_", but that's pretty busted,
13:14 (and then have a dynamic variable that I can override for specific repl calls)
13:14 or is there some other, cleaner way to accomplish this -
13:14 of maintaining granularity at the repl
13:15 justin_smith: sritchie: how about this for flexibility: the vars come in through the env, that is used to populate system properties (which are all updatable at runtime)
13:15 mi6x3m: Can someone explain:
13:15 ,(var '+)
13:15 clojurebot: #<CompilerException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:0:0)>
13:16 mi6x3m: a, wait, it's a macro lol
13:16 justin_smith: sritchie: the reason not to put this into system properties directly is the jvm prints out properties at boot, which you probably don't want for credentials
13:16 mi6x3m: ,(var +)
13:16 clojurebot: #'clojure.core/+
13:16 hiredman: mi6x3m: (var ...) is a special form
13:16 sritchie: justin_smith: haha, sure
13:16 Bronsa: mi6x3m: not a macro, a special form
13:16 justin_smith: ,'(var '+)
13:16 clojurebot: (var (quote +))
13:16 sritchie: justin_smith: but then to override, I'd need some way of having the dev AND prod loaded at the same time,
13:16 hiredman: #'+
13:16 mi6x3m: any way to get the var from a symbol?
13:16 sritchie: so that I could switch between them
13:16 justin_smith: that's what seems to break the 12 factor
13:16 Bronsa: ,(resolve '+)
13:16 clojurebot: #'clojure.core/+
13:17 danneu: (or (:db-uri *env-override*) (:db-uri env) "datomic:mem://localhost:4334/dev")
13:17 hiredman: ,(apropos "var")
13:17 clojurebot: (clojure.core/*allow-unresolved-vars* clojure.core/alter-var-root clojure.core/find-var clojure.core/var-get clojure.core/var-set ...)
13:17 hiredman: etc etc
13:17 justin_smith: sritchie: you would have a function that populates the properties from the env at boot, but you can also update individual keys (since they are in properties) in runtime
13:17 mi6x3m: damn, I totally forgot about resolve although I use it once every mins...
13:17 (inc Bronsa)
13:17 lazybot: ⇒ 59
13:18 sritchie: justin_smith: I just meant as far as naming conventions. Since, to override, I'd need access to the prod variable as well
13:18 justin_smith: I know I can make it work, I have been, it just requires a bunch of switches,
13:18 or embedding the environment mode in the variable name
13:18 justin_smith: yeah
13:19 I wonder if this could be addressed with some usage of environ + component?"
13:19 s/"//
13:20 danneu: yeah, components could init with an optional config map that's merged into environ.core/env
13:21 technomancy: sritchie: consider carica too; IMO the env var stuff falls over for more complicated use cases, especially when you want nested data.
13:23 TimMc: I generally store my entire program as an environment variable.
13:24 sritchie: TimMc: :)
13:24 technomancy: nice, looking
13:24 TimMc: Unfortunately, they're trying to "patch" the "bug" I've been using to do that.
13:26 sritchie: technomancy: looks like carica wants you to check the entire config into source, yeah?
13:29 technomancy: sritchie: no, it's designed to have prod config overlaid at deploy time
13:30 martinklepsch: when using pipeline-async I wouldn't be able to pipe intermediate into the to-chan right? (lets say the progress of a file being uploaded)
13:33 mi6x3m: has anyone here used a plugin to copy files with leiningen?
13:33 like for resources
13:34 danneu: gulp.js ;)
13:40 sritchie: technomancy: so, with heroku, I'd still need a deploy tool to transfer the carica config file over, yeah?
13:40 technomancy: I'm currently on dokku and using environ, which works well there -
13:40 technomancy: sritchie: oh yeah, carica isn't really heroku-friendly
13:43 sritchie: technomancy: figaro has a script that dumps all variables to heroku - that would probably solve it for carica
13:43 have some way to read from the env as well, with some convention for the nesting,
13:43 then inject all variables into heroku's env
13:43 technomancy: sritchie: you kinda lose the advantages of carica though
13:44 supporting non-string types, etc
13:44 sritchie: sure
13:58 verma: in clojurescript how do I check if a certain object is a native javascript arraybuffer type, or in other words can reliably check types of native JS types? js/Array js/ArrayBuffer js/Float32Array etc.
14:01 in cljs repl (type "hello") gives me #<function String() { [native code] }>
14:01 eriktjacobsen: I'm using clojure.java.jdbc 0.3.4… even in the simplest test case of a primary key select on a table with 4 rows, i'm seeing queries take 900ms-1200ms where they are 100ms on the mysql commandline client. Same client, same host, same query. Brief internet search doesn't show any outstanding known performance issues… any ideas to debug ?
14:02 justin_smith: eriktjacobsen: just a shot in the dark, try using a connection pool?
14:03 but that is a huge overhead, and just creating a connection would not explaian a delay like that
14:04 eriktjacobsen: justin_smith: thanks looking into c3p0 now
14:06 noonian: verma: you can probably do (= (array) js/Array)
14:06 verma: i mean (= (type (array)) js/Array)
14:09 xeqi: is there a core.logic relation to say something is a symbol?
14:09 verma: noonian, checking
14:10 nice, that works, that check is a function against functin check :)
14:10 noonian: yep :)
14:10 verma: (type (array)) returns a function like object
14:10 (inc noonian)
14:10 lazybot: ⇒ 6
14:10 noonian: yeah, just typing Array in a js console returns the same thing pretty much
14:11 verma: oh yes, true
14:11 noonian: because in js the constructor function *is* the type
14:12 verma: this is however, far better type checking compared to what native js offers
14:15 eriktjacobsen: justin_smith: hmm the current c3p0 seems broken… as soon as I add [jdbc.pool.c3p0 :as pool] to require, it causes java.jdbc to break "Could not locate jdbc/core__init.class"
14:15 doctorm: Can any vim-fireplace users tell me what :Require is supposed to do? I was thinking you could use it to eval a namespace in your repl, but all it does for me is pitch an error.
14:15 mister_zombie: How would I go around packing my compojure app as a standalone jar I can run?
14:16 justin_smith: eriktjacobsen: hmm - you may need to exclude its version, or it may be developed against an archaic version of jdbc
14:17 mister_zombie: I put a "main" setting in my project.clj, pointing to the correct namespace, but I don't know what to do after that.
14:17 eriktjacobsen: I think its just out of date… deps tree doesn't show it trying to include jdbc: " [clojure.jdbc/clojure.jdbc-c3p0 "0.3.0"]
14:17 [com.mchange/c3p0 "0.9.5-pre8"]
14:17 [com.mchange/mchange-commons-java "0.2.7"]
14:17 "
14:18 noonian: mister_zombie: just run 'lein uberjar' from the project directory; you will need a -main fn defined for the entry point
14:18 mister_zombie: noonian: What do I put in the main?
14:18 noonian: mister_zombie: it will create a verbosely named jar in target
14:19 mister_zombie: in project.clj under :main put a symbol telling it what namespace your -main function is in
14:19 and in that namespace have a (defn -main [& args] (println "hello world"))
14:23 kjellski: just starting out with clojure, wasn't there a syntax element that lets you specify the var and functions to apply to it all after each other? and you don't need to repeat the var all the time?
14:23 justin_smith: eriktjacobsen: to back up and take a different tack for a moment: you could profile (the jdk comes with jvisualvm for example) and figure out what the app is trying to do when those delays happen
14:23 eriktjacobsen: or maybe even jstack (command line utility, shows all stack traces of all threads)
14:24 eriktjacobsen: kjellski: You can pipeline stuff such as (-> data fn1 fn2 fn3 fn4)
14:24 kjellski: eriktjacobsen, agh, I'll fiddle with that one in the repl :) is it a macro?
14:25 noonian: kjellski: if you want to do things to the return values you can use '->' for java object interop (like using a bunch of setters) you can use (doto (MyObj.) (setSomething "bar") (setSomethingElse "baz"))
14:25 justin_smith: kjellski: if you repeated the var you would not get stacked results - do you want a sequence of stacked effects, or parallel operations on the original?
14:25 noonian: kjellski: yeah its a macro
14:25 ,(macroexpand-1 '(-> {:foo 17} (assoc :bar "bar") println))
14:25 clojurebot: (println (assoc {:foo 17} :bar "bar"))
14:25 mikerod: I'm a bit saddened that http://
14:26 kjellski: noonian, ah, I needed this for javascript interop, that might help to set some stuff on easeljs shapes, thanks!
14:26 mikerod: I can't wait until records can make efficient keys in maps
14:26 noonian: kjellski: yeah, np
14:26 kjellski: I think doto is what I needed :) thanks @all!
14:26 puredanger: mikerod: I'll take the hit on that one, sorry (just didn't get to screening it)
14:27 mikerod: puredanger: I forgive you. hah :-P - It's ok. Transducers sooner than later is a Good Thing.
14:30 mister_zombie: I get this when I try to compile or run now : Exception in thread "main" java.lang.NoSuchMethodError: clojure.lang.RestFn.<init>(I)V, compiling:(ring/middleware/params.clj:1:1)
14:31 kjellski: noonian, much cleaner, thanks :)
14:32 mister_zombie: Project file: http://
14:38 nkozo: core.async question: I have a go-loop receiving data from a chan, it must be sure the data is not mutated after is sent to his chan, there is a way to make the chan execute a transformation function (to clone the data) everytime an element is put into it, but synchronously? I mean, when (>! c v) returns is assured v is already transformed to v2, and the go-loop only sees v2 values
14:42 weavejester: nkozo: You're sending mutable data through a channel?
14:42 nkozo: weavejester: is a compromise
14:43 weavejester: nkozo: What's the situation?
14:43 nkozo: i want to keep a client api simple, so they can send bytebuffer's over the chan without doing anything special
14:44 never used chan transducers / pipelines, so I'm not sure this is possible
14:45 weavejester: Why would the client want to send bytebuffers over a channel?
14:46 nkozo: to compose network packets
14:47 weavejester: Okay, so the client is sending a byte buffer to a channel, which is then being delivered to a socket or somesuch?
14:47 nkozo: yep
14:47 weavejester: What's the purpose of using a channel?
14:47 nkozo: asynchronicity
14:47 and homogeneous api
14:48 i know there are other alternatives, I want to know if this specific one is possible :)
14:48 weavejester: Why a bytebuffer over something like an array?
14:49 So you want a channel that clones the data coming in to ensure immutability?
14:49 nkozo: arrays are mutable also, same problem
14:49 weavejester: exactly
14:50 weavejester: executes a function when a value is put in him and uses the return value as the new one
14:50 weavejester: Is cloning a bytebuffer each time more efficient than just using a vector?
14:50 nkozo: suposse yes :)
14:51 weavejester: Okay, I'll suppose you've benchmarked it
14:51 You could use clojure.core.async/map> I believe to apply a function to the input before putting it on the channel
14:52 nkozo: no, I'm doing only a thinking exercise, also to learn the core.async api
14:52 Bronsa: weavejester: well each assoc/dissoc on a vector you're always cloning at least one array
14:52 clojurebot: Excuse me?
14:52 Bronsa: err, conj
14:52 weavejester: Bronsa: Yeah, but the arrays are a fixed and relatively small size.
14:53 Bronsa: right
14:53 weavejester: Bronsa: Cloning a byte buffer n times is likely to be less efficient, I suspect, than putting the byte buffer into a vector once.
14:54 But for a hypothetical exercise, I guess that doesn't matter
14:54 Bronsa: weavejester: yeah, depends on the size
14:56 weavejester: Does anyone happen to have any suggestions for what to name a function that takes in a configuration and spits out a handler?
14:56 I was thinking "endpoint", but that might be a little overloaded
14:56 justin_smith: endpointFactory
14:56 (not really)
14:56 kjellski: is there something like a step function that creates a lazy seq of numbers as is defined by the gap between the numbers?
14:57 llasram: ,(range 1 10 2)
14:57 clojurebot: (1 3 5 7 9)
14:57 mister_zombie: Would any of you mind telling me what I'm doing wrong? "lein run" fails, and so does "lein uberjar" — Project file: http://
14:57 kjellski: llasram, thanks! :) I only tried the second argument!
14:57 nkozo: the general problem is how to put a mutable value1 to a chan and making the chan executing automatically a function that extracts an immutable value2 from value1, sends value2 to the chan reader and makes (>! c value1) return after value2 was extracted (so value1 can be safely mutated)
14:58 danneu: mister_zombie: what's the err
14:58 weavejester: mister_zombie: You've specified your main function as a handler function.
14:59 danneu: yeah, your root handler is millepattes.handler/app
14:59 your -main fn is a fn that boots the server
15:00 weavejester: You also have (use 'ring.adapter.jetty) sitting at the top level for some reason
15:01 But then refer to jetty/run-jetty down at the bottom
15:01 noonian: :ring {:handler millepattes.handler/-main} should be millepattes.handler/-main instead
15:01 er millepattes.handler/app instead
15:12 mister_zombie: So I corrected the thing for :ring, how do I make my -main okay?
15:12 weavejester: mister_zombie: You have a bad 'use' statement at the top you need to fix.
15:13 You want to remove it, and add: [ring.adapter.jetty :as jetty] to your requires
15:17 noonian: mister_zombie: yeah, your -main function looks ok to me, you just need to fix the other little things that are throwing errors when the namespace gets loaded
15:18 mister_zombie: I get this now: Exception in thread "main" java.lang.NoSuchMethodError: clojure.lang.RestFn.<init>(I)V, compiling:(ring/util/servlet.clj:1:1)
15:19 weavejester: mister_zombie: Oh, you have an ancient ring-jetty dependency in your project file for some reason
15:19 mister_zombie: Update it to 1.3.1
15:20 verma: man I can never get vim-fireplace + piggieback to work correctly, it was working fine, and now its totally stopped working, no matter what I do, it never starts
15:20 weavejester: mister_zombie: It's worth noting that with lein-ring you don't need a -main function, since lein ring server / lein ring uberjar cover its usecases
15:21 mister_zombie: weavejester: Really? lein ring uberjar was all I needed? XD
15:22 weavejester: mister_zombie: Yes, so "lein ring server" will start up a dev server, and "lein ring uberjar" will create an uberjar with an automatic main function
15:24 verma: anyone here use vim-fireplace + piggieback?
15:28 mister_zombie: Thank you all, much appreciated
15:32 Say I want to deploy to an application container, would the uberjar do just fine?
15:33 kjellski: Is there an easier way to create this squence of vectory then this?
15:33 ,(map vec (partition 2 (interleave (range 0 1000 100) (range 0 1000 100))))
15:33 clojurebot: ([0 0] [100 100] [200 200] [300 300] [400 400] ...)
15:35 TimMc: ,(map (fn [x] [x x]) (range 0 1000 100)))
15:35 clojurebot: ([0 0] [100 100] [200 200] [300 300] [400 400] ...)
15:35 TimMc: kjellski: ^
15:36 kjellski: TimMc, :D thanks, now I feel like I haven't seen the obvious solution...
15:40 weavejester: mister_zombie: The uberjar is for standalone apps, but there's an uberwar option (lein ring uberwar) for deploying to servlet containers
15:41 doctorm_: verma: I got disconnected, did you get an answer to your Piggieback question?
15:41 mister_zombie: weavejester: Awesome
15:44 aztak: good evening!
15:44 mmg: is there a way to see jvm parameters in the clojure rpl? specifically -Xmx ?
15:45 dbasch: ,(System/getenv)
15:45 clojurebot: #<AccessControlException java.security.AccessControlException: access denied (java.lang.RuntimePermission getenv.*)>
15:45 dbasch: mmg try that
15:45 amalloy: dbasch: that's not and environment var
15:45 aztak: mmg: I think you need to hit the JMX subsystem to get info about -Xmx params
15:45 dbasch: depending on how you ran the jvm I guess
15:45 aztak: (Runtime/getRuntime et. al)
15:47 dbasch: (.totalMemory (Runtime/getRuntime))
15:47 amalloy: i don't think that actually works, does it?
15:48 if your heap hasn't grown to use up all the space allocated yet, then .totalMemory only returns the heap size
15:48 aztak: mmg: http://
15:48 amalloy: that is, it returns the current heap size, not the max heap size
15:49 mmg: thanks!
15:49 mi6x3m: does anyone have some experience with lein-resource?
15:49 amalloy: man, it is really hard to find the right words to distinguish between "size of heap" and "size of objects allocated on heap"
15:50 aztak: amalloy: used/committed/max ? :)
15:50 amalloy: excellent, well done
15:52 dbasch: actually why do you need to know Xmx from a repl? Did someone else run the repl?
15:52 otherwise it's whatever you told it
15:55 amalloy: dbasch: like an episode of the price is right? "we started this clojure repl...now guess how much ram it has!"
15:55 mi6x3m: is there any piece of code to edit leiningen structures
15:55 like removing a dependency
15:58 dbasch: amalloy: am I allowed to do stuff inside the repl before guessing? That may be fun
15:59 amalloy: you can do whatever you want, we're not really on tv
16:08 noonian: i'd watch that tv show if it existed
16:11 verma: doctorm_, no :(
16:11 doctorm_: verma: What are you trying to use it with? I've got it to work with weasel successfully
16:12 verma: doctorm_, I just have a cljs project, which I connect over the default austin repl (rhino) and its been sort of unpredictable
16:12 it works sometimes and everything is great, but then just totally stops
16:12 doctorm_, I've been hearing about weasel, let me check that
16:13 doctorm_: verma: Give it a shot, I haven't tried austin, because I heard about similar things happening
16:13 verma: doctorm_, I would hope that its austin specific stuff that's not working, and piggieback is doing its job fine :)
16:14 doctorm_: verma: Cool, ping me if you run into trouble connecting to weasel
16:14 verma: doctorm_, sure thing, thanks!
16:17 amalloy: huh. i just got a stack overflow from running `lein deps :tree`
16:17 technomancy: amalloy: 2.5.0 or older?
16:17 amalloy: oh, for sure. 2.3.4, apparently
16:19 technomancy: should be fixed, yeah
16:19 amalloy: what was the issue?
16:19 technomancy: dunno; xeqi fixed it iirc
16:20 TimMc: technomancy has people for that kind of thing
16:22 * technomancy makes bumper stickers saying "I outsource my software development. And I vote."
16:24 m1dnight: Is there a cleaner way to check "(or (= x y) (= x z))"?
16:24 technomancy: (#{y z} x)
16:25 m1dnight: hah! I knew it! :) Thank you
16:27 amalloy: unless one of y or z is false or nil
16:27 m1dnight: nope, checking if a keyevent is either one or the other
16:27 justin_smith: (contains? #{x y} z)
16:28 m1dnight: I'm jealous of the people who write proper functional code
16:29 I try,but I don't always manage. Kinda stuck in OO coding.
16:31 dbasch: m1dnight: your or statement is perfectly functional
16:32 I see nothing unclean with it btw
16:32 m1dnight: well, yes it is. But byfunctional I mean the dense functional code that you can never get in OO or other languages
16:32 An experienced functional programmer writes way more elegant FP code than somebody like me
16:32 And I envy that :p
16:35 ustunozgur: a bit off-topic but , is anyone aware of any articles that compares functional programming and frequency domain representation of signals?
16:35 as in oop vs functional ~ time domain vs freq domain
16:35 justin_smith: ustunozgur: I found a great paper applying information theory to code reading / bug detection
16:37 ustunozgur: justin_smith: which one is it?
16:39 justin_smith: ustunozgur: http://
16:40 ustunozgur: Thank you.
16:42 Richard Hamming also had some thought on the matter in his Art of Science and Eng book. A quote: "Until we better understand languages of communication involving humans as they are (or can be easily trained) then it is unlikely many of our software problems will vanish."
16:43 it's chapter 4 for the curious worrydream.com/refs/Hamming-TheArtOfDoingScienceAndEngineering.pdf
17:01 _pr0t0type_: Hey guys, is there a gdb/pdb for lein projects I can to set break points?
17:01 I want to be able to halt the application at some line and inspect stuff
17:07 ustunozgur: _pr0t0type_: http://
17:08 verma: doctorm_, even the regular non-weasel stuff is failing the same way, e.g. (cemerick.austin.repls/exec)
17:10 doctorm_, and (cemerick.piggieback/cljs-repl) never returns the prompt back :(
17:10 going on a killall frenzy
17:11 technomancy: _pr0t0type_: breakpoints are easy as long as you don't need stepping
17:11 verma: ok, I had a ton of zombie repls running, checking again
17:12 ok, got a prompt this time :)
17:19 seangrove: Wow, madness http://
17:20 amalloy: seangrove: if you can't do it in emacs, it's not worth doing, after all
17:22 40,000 lines of warnings from `lein deps :tree` about conflicting dependency versions. kill me now
17:22 mgaare: seangrove: I must use this
17:23 jeremyheiler: amalloy: i'l rm -rf your code base if you'll rm -rf mine
17:25 verma: ok, I am done with this shit man :( .. what's a good starting point into trying emacs with clojure?
17:25 I am going to use it with evil mode of course :P
17:26 jeremyheiler: verma: i switched cold turkey from vim
17:26 i felt like evil-mode would've just gotten in the way of properly learning emacs
17:27 verma: I don't want to really learn emacs :( .. I just want a good dev env for clojure, and vim + fireplace is failing me right now :(
17:27 noonian: verma: clojure for the brave and true has a good walkthrough for getting emacs setup nicely with clojure: http://
17:27 jeremyheiler: verma: have you tried intellij with cursive?
17:27 technomancy: verma: the one at clojure-docs.org is good too
17:27 http://
17:28 mgaare: verma: emacs prelude is not a bad starting point either
17:28 technomancy: cider's super unstable ATM though
17:28 eriktjacobsen: I just use Vim and a repl in another window… honestly I dont think you need fireplace or any workins
17:28 WildBamboo-Josh: Just be aware that if you go down the Cider route in Emacs, I think it's advisable to stick to the stable 0.7 version. 0.8 is a big rewrite and quite unstable at the mo
17:28 noonian: yeah, even with emacs i use lein repl most of the time
17:28 technomancy: even 0.7 isn't that stable
17:28 WildBamboo-Josh: oh ok, lol
17:29 jeremyheiler: i thought 0.7 was a big rewrite..
17:29 verma: eriktjacobsen, its nice to be able to send stuff to repl sometimes I guess, do you have a workflow for that?
17:30 technomancy, noonian WildBamboo-Josh so emacs + cider 0.7 is the recommended way right now?
17:30 brehaut: just use melpha, then nothing will be stable, and cider will seem like a rock
17:30 eriktjacobsen: I generally have a split off on the side with repl-friendly macro-expanded or variable-injected values ready to copy / paste
17:30 technomancy: verma: I would stick with 0.6 or nrepl.el
17:30 eriktjacobsen: Just a scratch buffer that never gets saved, just for common queries and expanded things
17:32 WildBamboo-Josh: brehaut: lol
17:33 amalloy: eriktjacobsen: that sounds unbearable
17:33 verma: eriktjacobsen, you copy and paste stuff?
17:34 eriktjacobsen: yup, two windows vertically split or on separate monitors, and 3 key strokes (copy,switch,paste)
17:34 never bothered me and works fine over ssh
17:35 technomancy: oh good; the clojure-doc.org article no longer recommends ESK
17:35 mgaare: for what it's worth, I run cider 0.8 and haven't really had problems
17:36 dbasch: verma: I downgraded from 0.7 to 0.6 a while back
17:36 0.7 did not like something about my setup
17:36 technomancy: the simplest thing is just to use nrepl.el; it's still on marmalade
17:37 brianwong: hello, i am trying to catch a java.io.FileNotFoundException around 'with-open'
17:37 verma: technomancy, is it awesome?
17:37 technomancy: verma: it's ... fine?
17:37 brianwong: the problem is, the file never closes when i catch this exception
17:37 technomancy: I haven't been keeping up with the fancy new features
17:37 but it's enough for me
17:37 brianwong: is there a common idiom for this problem?
17:38 brehaut: technomancy: time to implement nrepl directly in atreus
17:38 brianwong: https://
17:38 so when a filepath is given that doesnt exist, the exception is caught, but the file isnt closed, so the program gets stuck
17:39 mdrogalis: brianwong: I think with-open closes it in a finally block, no?
17:39 brianwong: i thought that was built into the macro as well
17:40 that is why im a bit confused
17:40 dbasch: brianwong: if the path doesn't exist, there is no file to close
17:40 what do you mean the file isn't closed?
17:40 mdrogalis: Seems to be https://
17:40 Yeah, heh. That's a good point, dbasch.
17:41 brianwong: dbasch, that is a good point. my command-line tool hangs with this try/catch
17:41 if i remove the try catch, the exception just propagates as expected
17:42 maybe it is somewhere else in my prgram that doesnt handle the return value well
17:42 ill do more research
17:42 dbasch: brianwong: check that the file exists before calling with-open
17:42 or don't use with-open, and do your own try/catch
17:42 verma: man, I was in the middle of this awesome clojure flow, and now all this env issues :(
17:44 brianwong: thanks for the advic
17:44 advice
18:07 m1dnight: If I want to use trace in a simple lein repl, where would I put the dependency?
18:07 I.e., not in a project workspace
18:09 jeremyheiler: m1dnight: the :dev profile in ~/.lein/profiles.clj, I think
18:10 technomancy: jeremyheiler: user profile actually
18:10 m1dnight: jeremyheiler: That worked!
18:10 Didn't know about that file :x
18:12 jeremyheiler: technomancy: what differentiates user from dev?
18:12 technomancy: jeremyheiler: :dev is for per-project stuff
18:12 jeremyheiler: gotcha
18:17 _pr0t0type_: clojure.data.json (json/read-str) returns a hashmap with strings as keys. Does anyone know how to make that return keywords instead during deserialization? ie from {"data" []} to —> {:data []}
18:18 mister_zombie: How do I pull my namespace in the lein repl?
18:18 AeroNotix: _pr0t0type_: if you pass :key-fn you can run arbitrary stuff on the key of the JSON
18:18 m1dnight: (ns ..) ?
18:18 that should work..
18:18 AeroNotix: so you could pass the function keyword
18:19 m1dnight: Or do you mean (use 'name.space) ?
18:19 mister_zombie: I have my stuff in some namespace, i'm in the root of the project (with the project.clj file), I want to toy with some functions in my namespace
18:20 AeroNotix: mister_zombie: is the namespace a part of the project where project.clj is
18:20 SegFaultAX: mister_zombie: You can just require/use it as normal.
18:20 mister_zombie: yes
18:21 AeroNotix: mister_zombie: lein repl will pull it in by default
18:21 SegFaultAX: mister_zombie: You can also use in-ns to operate in the context of that ns.
18:21 _pr0t0type_: AeroNotix: pass in? Can you elaborate a bit on that?
18:21 AeroNotix: _pr0t0type_: such as (json/read-str some-str :key-fn keyword)
18:22 and it'll apply the function `keyword` to all keys in the JSON objec
18:22 mister_zombie: Thanks!
18:22 AeroNotix: object*
18:22 mister_zombie: Sweet!
18:23 _pr0t0type_: AeroNotix: awesome, thanks dude!
18:23 SegFaultAX: mister_zombie: This is the de facto blog post on Clojure namespaces (including refer/use/require/import)
18:23 http://
18:23 AeroNotix: _pr0t0type_: nw friend
18:23 mister_zombie: Thanks!
18:24 AeroNotix: I want to draw bar charts from clojure -- any good/cool libraries?
18:24 amalloy: AeroNotix: 4clojure uses incanter
18:25 AeroNotix: amalloy: wow ok, that looks good
18:26 dbasch: _pr0t0type_: with cheshire you can do (parse-string str true) and it gives you keywords for keys
18:41 doctorm: verma: Sorry, just got back. I can walk you through the way I set up weasel if you haven't already mastered emacs. I'll do a little write up and post it, although it is mostly documented on the github page.
18:44 verma: doctorm, thanks! I am just looking at emacs right now, didn't really start anything yet, setting up evil mode right now.
18:44 doctorm, I am having trouble with all repls basically
18:45 not sure what to do
18:45 I can launch them from the command line lein repl .. and use the
18:45 m
18:45 but only to a certain degree though, that stops working after a while too
18:46 doctorm: verma: Yeah, it's something I'm struggling with too. I'm in the process of moving to LightTable (just getting vimlike modal editing figured out there). vim-fireplace is good, but not quite good enough (mainly stack traces don't seem to show in the repl, ever)
18:46 verma: if you're writing a doc, you'd be doing a huge flavour to vim people wanting to use it for clojure dev, all resources are scattered around, and the docs mostly don't tell you exactly what to do, and I am too lazy to read so much stuff
18:47 doctorm: But I'll still do a writeup with weasel, because that is something I got figured out, and I didn't experience it breaking like you described
18:49 verma: lol, s/flavour/favor/g
18:55 justin_smith: doctorm: stack traces may be suppressed there by default, there is always (clojure.repl/pst) which will show the most recent stack trace
18:55 or, more accurately, I should say, shows the stack trace for the most recent exception
18:57 doctorm: justin_smith: Thanks, I'll check that out. It's not the only reason for moving to LightTable, I also like the idea of using an editor whose architecture I can understand and is written in the language I'm using.
18:59 eriktjacobsen: justin_smith: earlier you recommended jvisualvm…. any guides you'd recommend. I'm used to gdb / valgrind in c. Don't see a call tree, and it seems so much time is spent in clojure.tools.nrepl.transport and various core stuff its hard to decompress
19:01 justin_smith: eriktjacobsen: if you want something like gdb, there is jdb
19:01 and as I mentioned, jstack will show a stack trace of every thread
19:04 eriktjacobsen: also, specifically in jvisualvm, the CPU profiler/cpu panel and the threads view may help you figure out what's happening with those long running jdbc queries
19:12 lodin: Is there any way to unload a class (created with deftype)? This is for auto reloading purposes.
19:13 justin_smith: eriktjacobsen: for example here is me profiling a call to jdbc: http://
19:13 amalloy: lodin: if there are outstanding references to instances of that class you can't unload it, and if there aren't you don't need to
19:14 probably. i guess maybe that last bit isn't true?
19:14 tldr i don't actually know much about classloaders
19:15 lodin: amalloy: If I reload a file and the deftype has been removed, I can still reference it.
19:15 eriktjacobsen: justin_smith: hmm first time using jvisualvm, what are you using for settings in "start profiling from" and profile / dont profile? Im not seeing any jdbc entries when profiling the jdbc code. looking up the jvisualvm docs now
19:15 justin_smith: eriktjacobsen: all I did was double click on the process on the left pane, and go to the profiler pane, then click on "CPU"
19:16 lodin: amalloy: And that's a problem, because next time I run it it will fail.
19:16 justin_smith: eriktjacobsen: it should all be evident from my screenshot
19:16 lodin: amalloy: I tried pretty hard to get rid of references, even remove-ns, but that didn't help.
19:16 justin_smith: eriktjacobsen: I never got an option of where to profile from, I just clicked on the CPU button, then ran my query, and watched those red bars move
19:17 amalloy: lodin: yeah, indeed. i don't really know of a way to unload classes
19:17 lodin: I also found that doing the deftype repeatedly, overwriting the class with an identical class, leaks memory.
19:18 justin_smith: http://
19:18 the claim is that the only way to unload a class is to garbage collect the classloader that brought it in, clojure just uses one classloader
19:19 amalloy: justin_smith: the first part of that is true, pretty sure the second isn't
19:19 justin_smith: or is it possible to specify a custom classloader in clj such that it can later be unloaded?
19:19 eriktjacobsen: justin_smith: gotcha. with default settings i'm not seeing anything but clojure internals: http://
19:20 will dig
19:20 justin_smith: for doall to be doing that much, makes it sound like an expensive or very large lazy seq is being forced?
19:21 but the fact that no jdbc classes show up there at all is suspicious
19:22 amalloy: justin_smith: i think clojure makes a new DynamicClassLoader per eval request and daisy-chains them together, but it's probably more complex than that
19:22 dbasch: I wonder if all this is still accurate http://
19:22 eriktjacobsen: the internals of all those calls are the same. lots of clojure.core and clojure.lang, nothing from my own libraries or jdbc
19:23 justin_smith: eriktjacobsen: yeah, it makes me think something else that did not get captured is realizing something very large and / or very expensive
19:23 eriktjacobsen: it may be informative to look at the threads view and see which threads are working - many of them have informative names
19:24 eriktjacobsen: also, some jstack calls from the command line while a query is running should show where each thread is - the stack trace should reveal who is spending all this CPU time on a doall
19:37 eriktjacobsen: Thank you a bunch for the info
19:37 lodin: justin_smith, amalloy: So the conclusion is that no, it's not currently possible and probably won't be a for a while?
19:37 amalloy: i believe so
19:40 doctorm: verma: https://
19:40 verma: While testing it, I ran into a bunch of different problems depending on the order I did certain things
19:42 verma: So try it out in that order, and see if you have any more luck. I'll be away for a bit, but back later tonight. Let me know if it works
19:44 xeqi: amalloy: I believe it was a space leak from lazyness, though when I fixed that I redid most of the pedantic code and changed some algorithms
19:44 amalloy: xeqi: yeah, that sounds consistent
19:46 TimMc: Next week I'll be working on a wrapper for liverepl that will provide line-editing, injection of dependencies (w/ pomegranate), and limited classloader leakage
19:46 Wish me luck.
19:46 lodin: Is it worth submitting a bug report about (do (deftype Foo []) (deftype Foo [])) leaks memory? I.e., the shadowed class is not GCed.
19:48 brehaut: lodin: hmm, i am super vague on the details, but i think classes are stored in the permgen, so theres no way to free them until the next vesion of java that ditches permgen is available
19:50 java 8 is the version that ditches permgen
19:50 * lodin googles permgen.
19:51 TimMc: The permanent generation in Java's generational GC.
19:51 brehaut: lodin: google JEP 122 as well
19:51 which is to say, the generation that is not collected (because its permenant)
19:52 Jaood: who needs clojure when you have java 8?
19:53 hiredman: lodin: how sure are you it leaks memory?
19:54 Jaood: tough crowd
19:54 brehaut: Jaood: you get more laughs with funny jokes ;)
19:54 Jaood: ;)
19:54 hiredman: http://
19:55 lodin: hired: I wouldn't put a number on it. :-) But it seemed to me, looking at the memory used by the java process, that it leaked.
19:55 brehaut: lodin: a lot of non-reference count based collectors collect at non-deterministic times.
19:56 hiredman: lodin: how comfortable are you monitoring the memory usage of a java process?
19:56 it is a known stumbling point
19:56 brehaut: lodin: dead objects arent collected until there is a reason to do so (ie, memory pressure requires more free space)
19:56 hiredman: most jvms also don't return memory to the os, even if it is "free"
19:57 they hang on to it incase they need it later
19:57 lodin: Yeah I know, but I figured based on the previous discussion that the observation agreed with leakage.
19:57 Jaood: greedy jvm
19:58 lodin: So let's take a step back. :-)
19:58 hiredman: I think the gc behaviour of classes was a little more subtle then just "the never get gc'ed" even before java 8
19:58 lodin: It looks like deftype leaks memory. Does it?
19:59 hiredman: lodin: it may, or may not, I dunno, you haven't presented evidence either way
20:00 lodin: hiredman: I'm asking for evidence. :-)
20:00 devn: hiredman: im cribbing most of what you did on your branch to pull it into weavejester/lein-ring, but i got stuck... https://
20:01 would be curious to know if you have any ideas
20:01 mthvedt: new classes do not leak memory, they get garbage collected when the class is no longer referenced
20:01 same with deftype
20:01 hiredman: deftype in itself cannot leak memory
20:01 mthvedt: although in clojure you must explicitly remove the namespace
20:02 if your deftype is in one
20:02 lodin: mthvedt: Could you elaborate on that?
20:02 hiredman: but it generates a java class, and if the java runtime you are using (there are several) doesn't reclaim classes that could happen
20:02 johann: hey guys, i'm trying to write some images online to disk. i just tried using pmap and agents to make it concurrent. the images on disk aren't filling out to the full dimensions for reasons beyond me. anyone know what may cause this?
20:03 mthvedt: hiredman: ok, the recent sun/oracle JVMs garbage collect classes.
20:03 hiredman: the ability to redef a deftype like you did using do depends on clojure's DynamicClassloader, which does keep a reference to classes in a map in a static field, but it only keeps the last class with a given name
20:03 lodin: hiredman: I did another test, and it does look like it just releases the classes later rather than sooner.
20:04 at least on this machine.
20:04 mthvedt: lodin: a class is no longer referenced in java when its objects, class objects, classloader, and "sibling" classes from the same classloader are all out of scope.
20:04 …if i remember right.
20:05 TimMc: clazz.parentNode.nextSibling
20:05 oh wait, this isn't the DOM
20:05 mthvedt: in clojure you can achieve the class/classloader conditions by unmapping the ns, which i've actually done successfully in experiments
20:06 with generating arbitrary numbers of deftypes
20:09 amalloy: brehaut: hasn't every version since like java 5 been the one that ditches permgen?
20:09 it's not actually a "java" thing so much as a detail of various jvms, not necessarily all of them, anyway
20:10 lodin: mthvedt: I'm not sure I follow. How did you unmap the ns? remove-ns?
20:11 mthvedt: lodin: yes iirc
20:15 devn: hiredman: with your version of lein-ring, do you specify servlet-class and servlet-name, or is that not necessary? do you specify init and handler like you normally would?
20:25 lodin: mthvedt: I tried http://
20:34 mthvedt: lodin: not sure tbh, been a while since i messed around with that. it looks like that shouldn't happen though.
20:38 squeedee: Hey folks. Whats the general concensus on name collisions with core? Like i felt that 'lsystem.iterate' was a great function name...
20:40 justin_smith: squeedee: :refer-clojure in your ns block
20:41 lodin: hiredmen: Can I call that a bug at least? ;-) (Seriously though, any insights into why it works like that would really be appreciated.)
20:41 *hiredman
20:42 squeedee: justin so the idiom is to name things as they should be. Consumers just need to exclude?
20:42 justin_smith: why exclude? :use is bad anyway
20:42 brehaut: amalloy: i think with java 8 you can actually download an oracle jvm that implements it
20:43 amalloy: perhaps as part of something called meatspace (if my rememberng is correct)
20:43 (its probably not correct, that sounds nuts)
20:43 amalloy: not sure if serious...
20:43 metaspaace
20:43 squeedee: well i guess i should try it, but i thought you mean refer-clojure :exclude iterate
20:43 meant*
20:43 hiredman: lodin: what are you trying to do?
20:44 justin_smith: squeedee: oh yeah, I thought you meant consumers of your lib
20:44 brehaut: amalloy: that sounds a lot more sane than my recollecting and would make more sense
20:44 lodin: hiredman: http://
20:44 justin_smith: squeedee: yeah, use :exclude in :refer-clojure, name things the name that makes sense
20:44 lodin: hiredman: I want to get rid of the class.
20:44 hiredman: lodin: you can't
20:45 squeedee: justin_smith thanks :D
20:45 lodin: mthvedt, hiredman: I'm getting different bets here ...
20:45 amalloy: huh, interesting. i got pull requests to flatland/useful this morning. i thought forks couldn't get pulls
20:45 hiredman: lodin: I have mthvedt on ignore, so I have no idea what he is saying
20:46 lodin: but if he told you unmapping the namespace would do anything there he is very mistaken
20:47 squeedee: amalloy on github?
20:48 mthvedt: i don't understand the passive-aggression
20:48 amalloy: squeedee: yes
20:48 squeedee: amalloy: anything can get pulls
20:48 you can make a pr to a branch
20:49 dbasch: permgem was indeed removed in java 8, TIL
20:49 squeedee: if its public, it can be done. fork or no fork
20:49 dbasch: PermGen
20:50 squeedee: btw amalloy, you've helped me a lot today :D (with all your comments, stackoverflow and elsewhere)
20:51 amalloy: i have?
20:51 squeedee: yep. most of the useful answers i've found today have been in part thanks to you.
20:55 amalloy: man, a whole heck of a lot of pull requests to amalloy/useful have piled up. apparently my notification settings were not sending them to me
20:56 jeremyheiler: amalloy: finally!
20:56 lol
20:58 amalloy: weird. i was unwatching the repo
20:58 lukecossey: Anyone ever tried to get the goog.fx.css3.Transitions working with Safari?? Every other browser is fine.
21:02 amalloy: hey, here's a pull request by me from two years ago. it is thoroughly unfamiliar to me: https://
21:06 technomancy: amalloy: happens to me all the time
21:06 (github magically unwatching repos for me)
21:06 amalloy: technomancy: it was a pull request to my own repo!
21:06 oh
21:06 verma: thanks doctorm, I will give it a shot
21:06 technomancy: yeah, that one ... not so sure what's going on
21:07 amalloy: technomancy: i expect the unwatching was my fault, as some weird side effect of splitting up the flatland stuff into amalloy/ninjudd/raynes repos
21:07 technomancy: amalloy: it's happened waaaaaay too often to me IME for it to be something I hit by accident
21:08 lodin: hiredman, amalloy, et al.: I'm off. Thanks for your comments and pointers.
21:09 mthvedt: lodin: still there?
21:09 lodin: mthvedt: Yes.
21:10 mthvedt: lodin: i've been playing with a repl/profiler, and it looks like i'm wrong about deftypes being GCed. however, NSes do get GCed, but only if unmapped.
21:11 i'm not sure if that's correct behavior, just a tidbit for you.
21:12 lodin: mthvedt: How did you get to the conclusion that deftypes not being GCed?
21:12 mthvedt: lodin: generated a large number of them and watched the profiler.
21:13 that is, a number larger than current allocated memory.
21:14 lodin: mthvedt: That's what I did as well, but I don't know enough about how JVM and the OS handles memory to be certain I interpret that correctly.
21:15 Except I didn't use the profile. I just watch the java process memory.
21:16 justin_smith: lodin: wouldn't one test be to see if you can make the jvm run out of space? give a relatively low max permgen and max heap, then repeatedly make classes that should be collectible. See if you can make it crash just doing that.
21:16 mthvedt: lodin: sun/oracle JVM will prefer garbage collecting to expanding the heap. growing heap + a lot of objects hanging around = they aren't being garbage collected.
21:16 justin_smith: also, profiling is not super hard, the jdk comes with a profiler, other ones are not hard to find
21:18 lodin: justin_smith: Yeah, this has given me a reason to look into profilers and JVM settings. I'm not a java guy, so this is new territory for me.
21:18 verma: crap, trying to start cljs env in cider nrepl gives me this: UnsupportedOperationException count not supported on this type: Symbol clojure.lang.RT.countFrom (RT.java:556)
21:18 has anyone seen this before?
21:28 what is this page basically asking me to do? (sorry for off-topic)
21:28 http://
21:29 is it asking me to (require 'hl-line) ?
21:30 justin_smith: verma: if you want to load that library, yeah that's how you would do it
21:31 then you would turn on the minor mode in a buffer where you want it
21:31 verma: you can do it interactively via M-:
21:31 followed by M-x hl-line-mode in any buffer where you want it turned on
21:31 verma: justin_smith, I want to highlight the current line, really, that means I load that and set some variable to enable it?
21:31 oh ok
21:31 justin_smith: it's pretty intense, I am turning it off again now
21:32 verma: how do I get it to enable all the time? (setq hl-line-mode 1) in ~/.emacs ?
21:32 justin_smith: require loads conditionally, just like in clojure
21:32 arrdem: Grimoire beta build if anyone cares to kick it around http://
21:32 looks like there are six bots in this channel that crawl everything..
21:32 justin_smith: verma: hl-line-mode is buffer local, though there may be a global variant
21:32 global-hl-line-mode
21:32 yeah
21:32 verma: justin_smith, nice thanks
21:33 its looks nice, its not that intense :P
21:33 justin_smith: maybe it just sucks with my color scheme
21:33 danielcompton: amalloy: thanks for the quick build, I was just about to make an internal release
21:33 verma: now i need horizontal line and I'd be one step away from CAD software
21:33 I mean vertical
21:33 justin_smith: haha
21:33 I am sure it is possible
21:33 arrdem: verma: there's a script I saw a while back that did both...
21:33 verma: yeah, I stumbled across it just now
21:34 justin_smith: verma: it would be cool to have it as a hairline crosshairs overlay
21:34 rather than highlighting the entire line
21:34 verma: media would so pick that up
21:34 amalloy: danielcompton: of useful? i actually haven't pushed the release to clojars yet. i can't figure out how to without going into the office, since clojars no longer takes scp uploads and i'm not set up here to do whatever the new stuff is
21:34 verma: hackers targetting your bytes
21:34 lodin: justin_smith, mthvedt: I tried what justin_smith said, and to me it seems like it collects the classes when the memory limit is hit.
21:35 danielcompton: amalloy: also, just saw that we need to go to 0.11.3
21:35 0.11.2 was released in feb https://
21:35 justin_smith: lodin: if you attach jvisualvm, there is a histogram of memory usage and gc events, you should see a nice chart of it
21:35 mthvedt: lodin: interesting, can i see a refheap?
21:37 danielcompton: amalloy: no idea why that commit doesn't show up in https://
21:38 verma: what do people usually use here to open files super fast? something similar to ctrlp in vim?
21:38 danielcompton: verma: clojure.java.io is usually fast enough
21:38 dbasch: amalloy: there's a lein target for deploying to clojars now, but you have to set up gpg first
21:38 amalloy: dbasch: yeah, i have that all set up at work
21:38 dbasch: I did that a couple of days ago
21:39 it takes a minute
21:39 verma: danielcompton, oh sorry, should have mentioned, I am off-topicing a little bit, was interested in something like ctrlp+vim for emacs
21:39 amalloy: or i think i do, anyway. i'm even ssh'd into work, so you'd think it would work, but something weird happens to the gpg agent
21:40 verma: this looks like exactly what I need: https://
21:41 technomancy: I use https://
21:41 but that's probably just because I wrote it
21:42 verma: :D
21:42 technomancy, that's awesome!
21:42 technomancy, you have a screenshot of what it looks like? is it fuzzy finder sort of?
21:42 technomancy: it is??
21:42 lazybot: technomancy: Uh, no. Why would you even ask?
21:42 lodin: mthvedt: jvisualvm confirmed that the classes are GCed. No need to use ns-remove either.
21:42 mthvedt: lodin: and these are deftypes?
21:43 technomancy: verma: it looks the same as the one you linked to
21:43 lodin: mthvedt: Yes. I did eval of deftype in a doseq.
21:43 mthvedt: tonight i've gotten gc to work with ordinary stuff like evaling to get a closure, but not with deftypes
21:43 can i see?
21:43 verma: technomancy, oh
21:44 technomancy: verma: oh, mine requires GNU find FWIW
21:44 lodin: mthvedt: Yeah, maybe we're talking about different things.
21:44 technomancy: I should add a readme... I wrote this in 2007 or so
21:45 verma: I think I will use flipr, since it has a screenshot and a readme :P
21:47 technomancy: I'm heartbroken
21:49 http://
21:49 lodin: mthvedt: I do (doseq [_ (range 100000)] (eval (read-string "(deftype Foo [])"))) and once it hits about 40000 classes in my case (-Xmx100m and -XX:MaxPermSize=100m), it collects all but 3000-5000 of them.
21:51 scottj: fake! a) technomany no longer lives in rainy seattle, but sunny southern california. b) no facial hair
21:53 lodin: mthvedt: I apparently had a rather large permgen size when I first tested it.
21:53 technomancy: scottj: [artist's conception]
21:54 amalloy: wait, does technomancy really live in southern california now?
21:54 lodin: justin_smith: jvisualvm was brilliant for seeing this. Thanks.
21:55 technomancy: amalloy: san diego area
21:55 amalloy: why was this not on the evening news?
21:56 technomancy: I'm on the run from the law
21:56 arrdem: wait that would have _put_ it on the evening news...
21:56 mthvedt: lodin: which JVM are you using? this is not working for me.
21:57 and also which clojure?
21:57 Jaood: the NSA is after him, to much stallman koolaid
22:00 verma: man why does fiplr look different for me, its fuzzy search sucks as well :( .. I just see all matches concatenated and not listed like from top to bottom like in the screenshot
22:00 technomancy: verma: that's ido-vertical
22:00 hiredman: clojurebot: technomancy is on the run from the three laws of robotics
22:00 Jaood: technomancy: doesn't ido do fuzzy matching?
22:00 clojurebot: You don't have to tell me twice.
22:01 technomancy: Jaood: that's another setting too
22:02 ido-flex-match iirc
22:02 it's *simple* =)
22:02 scottj: imo best to look at flx and flx-ido
22:02 verma: technomancy, so I don't need fiplr at all?
22:02 scottj: if you want fuzzy matching on from the start. default is only to do fuzzy if there are no non-fuzzy matches
22:02 technomancy: verma: different libs/settings do different things. what do you want?
22:03 verma: Ctrl-T -> shows file listing from current directory -> I type in a few characters for the file I am interested -> finds and highlights most relevant result -> I hit enter -> opens the selected file
22:04 technomancy: find-file-in-project doesn't bias in favour of the current dir
22:04 verma: what does it favor?
22:04 technomancy: historical chocies
22:05 verma: oh?
22:05 technomancy: if you want something in the current dir, just use C-x C-f
22:05 mthvedt: lodin: try (doseq [_ (range 1000000)] (eval `(deftype ~(gensym "Foo") []))) , should cause an OOM.
22:05 verma: so it would remember sort of which projects I am working on etc.?
22:05 mthvedt: what i think is happing is clojure keeps references to each class name hanging around. so if you keep redefining Foo, this won't cause an OOM.
22:06 lodin: mthvedt: clojure 1.6.0, and java 1.7.0_51 on 64-bit Win 8, and clojure 1.6.0 java 1.7.0_21 (openjdk) on 64-bit linux mint.
22:06 technomancy: verma: it won't look beyond the current project
22:07 dunno what flipr does
22:07 brehaut: technomancy: isnt that a startup?
22:07 verma: I added a ton of folders to ignore (5 actually) and it seems to be finding stuff that I want
22:07 technomancy: brehaut: it's a good bet
22:07 lodin: mthvedt: That makes sense. It shouldn't be release, because you might want to use it. Right?
22:07 verma: earlier I would search for core.cljs and it would open something I don't care about under .repl/...
22:07 so now .repl is in ignore list sort of
22:08 brehaut: technomancy: i guess flipr spends a lot of venture moeny with no actual business plan, and tries to get bought by facebook then
22:08 verma: brehaut, isn't that called enterpreneurship :P
22:09 mthvedt: lodin: right. but in a more complicated example where you remove the ns periodically, i still get OOM. my understanding of remove-ns is it's supposed to remove those mappings.
22:09 verma: thanks for all the help technomancy
22:09 (inc technomancy)
22:09 lazybot: ⇒ 143
22:09 verma: oh jeez
22:09 how do you see score without incing?
22:09 arrdem: (identity verma)
22:09 lazybot: verma has karma 0.
22:09 verma: oh what?? :(
22:10 arrdem: (identity amalloy)
22:10 lazybot: amalloy has karma 173.
22:10 Jaood: (dec verma)
22:10 lazybot: ⇒ -1
22:10 verma: :(
22:10 arrdem: (dec Jaood) ;; MAD at work
22:10 lazybot: ⇒ 3
22:10 verma: (inc verma) ; :P
22:10 lazybot: You can't adjust your own karma.
22:10 verma: :D
22:10 nullptr: (map identity [Jaood verma])
22:10 Jaood: only 170 left to be amalloy
22:11 lodin: mthvedt: Yeah. I would've expected that as well.
22:11 verma: (identity verma)
22:11 lazybot: verma has karma -1.
22:11 verma: :D
22:11 Its like I belong to the dark side
22:11 Jaood: (inc verma)
22:11 lazybot: ⇒ 0
22:11 Jaood: (inc verma)
22:11 lazybot: ⇒ 1
22:11 verma: like just started getting dark
22:11 Jaood: (inc verma)
22:11 lazybot: Do I smell abuse? Wait a while before modifying that person's karma again.
22:11 verma: :(
22:11 Jaood: (inc verma)
22:11 lazybot: Do I smell abuse? Wait a while before modifying that person's karma again.
22:11 mthvedt: (inc lazybot)
22:11 lazybot: ⇒ 31
22:11 arrdem: lol @ ratelimit
22:12 verma: :)
22:12 amalloy: clojurebot: what does abuse smell like?
22:12 clojurebot: Titim gan éirí ort.
22:12 bar1: (inc verma)
22:12 lazybot: ⇒ 2
22:12 bar1: (inc verma)
22:12 lazybot: ⇒ 3
22:12 bar1: (inc verma)
22:12 lazybot: ⇒ 4
22:12 bar1: (inc verma)
22:12 lazybot: Do I smell abuse? Wait a while before modifying that person's karma again.
22:12 bar2: (inc verma)
22:12 lazybot: ⇒ 5
22:12 bar2: (inc verma)
22:12 lazybot: ⇒ 6
22:12 bar2: (inc verma)
22:12 lazybot: ⇒ 7
22:12 verma: lol
22:12 lodin: mthvedt: As the paste above showed, the class survives the remove-ns.
22:13 mthvedt: lodin: yup
22:14 verma: argh, super annoying that my repl opens in a horizontal split
22:14 Jaood: verma: with cider?
22:15 verma: yeah
22:15 Jaood, ^
22:17 Jaood: verma: depending on your window size it chooses vertical vs horizontal split
22:17 verma: oh
22:17 ncie
22:17 nice
22:18 Jaood: but moving it its trivial anyway :)
22:18 verma: oh nice
22:18 it did split nicely now :)
22:19 lodin: mthvedt: If you find some hack to get rid of (or even just hide) the class when the ns is removed, please let me know. :-)
22:25 arrdem: ambrosebs: the idea is that /store and friends will represent a .m2 equivalent structure that you can walk to see other artifacts/groups
22:26 ambrosebs: UI needs work I guess... but the idea is that core.typed, tools.analyzer and the rest can sit in the same tree now with no changes
22:27 ambrosebs: arrdem: nice
22:28 arrdem: adding articles now so there's a structure for sharing long form commentary like destructuring and macro notes
22:28 or even just linking to other resources in a sharable (across documentation) way
23:21 ghadishayban: reiddraper: I'm using test.check to verify transducers vs. lazy seqs right now... it's not supposed to be this fun!
23:21 arrdem: (inc reiddraper)
23:21 lazybot: ⇒ 3
23:21 arrdem: oh that's just wrong
23:22 ghadishayban: I am trying to think of the minimal crappy functions to map and mapcat and take-while with
23:22 reiddraper: ghadishayban :), i'm sure we'll all be curious to see the results
23:22 ghadishayban: but I'm not doing a very good job yet
23:22 reiddraper: fun project to play with though
23:23 ghadishayban: I'm ending up with functions like (drop-while odd? (filter even? (range...)))
23:23 which is blowing up the jvm
23:24 reiddraper: ah fun, hmmm
23:25 ghadishayban: how to balance having a good test of a chain of collection transformers that doesn't need the halting problem solved?
23:25 vs. just getting it working but having it be a so-so test
23:25 i'd pay a beer for the latter right now
23:25 reiddraper: indeed
23:26 it's often fruitful with property-based testing to start with a worse test, assure yourself the SUT is correct, and then improve the test
23:26 (correct w/r/t the current state of the test)
23:28 ghadishayban: Yeah I'm using the same generator for arguments to filter and remove
23:28 which is broken if they're both in a chain of operations with the same args
23:29 for a minimal SUT I'll just vary the operations themselves, but not the arguments to them
23:33 reiddraper: seems like a great start
23:51 ghadishayban: both bugs christophe grand found today were related to r#'educed handling
23:52 #'reduced
23:52 to check collections, you'd want to exercise that well.