#clojure log - Aug 31 2012

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:02 cemerick: I'm going to have to write one hella rant after this site is built.

0:02 :-)

0:02 brehaut: excellent

0:04 cjfrisz: Oh, macros...

0:04 * cjfrisz croons softly to abstract concept of macros

0:13 nsxt_: cemerick: what sort of site are you building?

0:15 cemerick: nsxt_: One of the web variety. :-)

0:16 nsxt_: cemerick: aww, fine... understood. :)

0:16 uvtc: I hear it may reside somewhere on the internet.

0:16 cemerick: nsxt_: hopefully you'll know all about it soon enough.

0:17 nsxt_: cemerick: is it related to your work with clojureatlas?

0:17 cemerick: nah

0:17 nsxt_: (p.s. just in case you don't get enough thank yous for that, here's a hearty pitch)

0:17 cemerick: aw, thanks :-)

0:19 wmealing_: ive heard of those internet websites.. they are the future.

0:20 cjfrisz: I hear the internet is on computers now

0:21 amalloy: i think they're being replaced by cloud websites

0:24 Raynes: amalloy: How do they get those sites all the way up there?

0:24 uvtc: Cloud-based with a chance of Raynes.

0:26 wmealing_: *groan*

0:31 cbare: noob question:

0:31 If I have a bunch of functions. They either return false or a result. I want to apply them sequentially and return the first non-false result.

0:32 Is there a construct for that already?

0:32 tos9: ,(doc dropwhile)

0:32 casion: (first (drop-while

0:32 clojurebot: Titim gan ?ir? ort.

0:36 cbare: something like this? (first (drop-while #(% my-input) [f g h ... ]))

0:36 uvtc: I am so spoiled by the Clojure cheatsheet. Wonderful.

0:36 casion: uvtc: do you know of a 1.4 cheat sheet with popup docs like http://jafingerhut.github.com/cheatsheet-clj-1.3/cheatsheet-tiptip-no-cdocs-summary.html

0:36 tomoj: &((some-fn :foo :bar :baz) {:bar false :baz 3})

0:36 lazybot: ⇒ 3

0:37 uvtc: ~cheatsheet

0:37 clojurebot: Cheatsheets with tooltips can be found at http://jafingerhut.github.com/ .

0:37 uvtc: :)

0:37 casion: this is 1.3 though

0:37 uvtc: Thanks, casion .

0:37 Oh.

0:37 tomoj: cbare: so ((some-fn f g h) my-input) or ((apply some-fn [f g h]) my-input)

0:38 casion: I didnt even know about mapv until yesterday because I rely on that too much haha

0:38 uvtc: casion: No, I only know of the one at clojure.org and the jafingerhut ones with the tooltips.

0:38 casion: uvtc: I guess I'll look into how jafingerhut put together the 1.3 ones

0:38 and see if I can make 1.4

0:39 uvtc: The tab-completion in the repl also helps.

0:40 amalloy: some-fn makes me so sad. anyone want to guess what ((some-fn = >) 5 10) returns?

0:40 cbare: do the functions you give to some-fn have to be predicates? Or can they return composite values?

0:42 casion: amalloy: why is that confusing? (= 5) is true

0:43 Scriptor: amalloy: isn't it just a short-hand way to write an or expression?

0:43 as long as any of the predicates returns true, it does

0:43 amalloy: casion: because (or (= 5) (> 5) (= 10) (> 10)) is a much less generally-useful function than (or (= 5 10) (> 5 10))

0:44 and it's much easier to get the former behavior from a some-fn that behaves like the latter, than it is to get the latter from a some-fn that behaves like the former

0:44 uvtc: I thought you're only supposed to pass single-arg predicates to some-fn. So, it looks odd with `=` in there.

0:45 amalloy: uvtc: yes, that is the existing behavior of some-fn, which i am arguing is useless

0:49 casion: amalloy: would you wish it to process pairs or capture all arguments

0:49 amalloy: huh?

0:50 casion: like ((some-fn > ) 5 6 7) would be (> 5 6 7) or (or (> 5 6) (>6 7))

0:50 obviously they are the same in that context

0:51 amalloy: none of those, they don't make any sense

0:52 for one function arg, some-fn as it is now is perfectly fine

0:52 uvtc: amalloy: Not exactly sure what behaviour you'd like to see.

0:53 amalloy: ((some-fn f g h) a b c) (or (f a b c) (g a b c) (h a b c))

0:55 ie, for N function args and M "value" args, it should be like an 'or with N clauses, each calling an M-arg function with all the values

0:57 and the existing behavior is not useful at all. the second example on http://clojuredocs.org/clojure_core/clojure.core/some-fn (which you mentioned to me that you added, uvtc) could easily be (some (some-fn even? #(< % 10)) [1 2 3])

0:58 literally all the current handling of multiple args ever saves you is the characters (some []), whereas my proposed handling could actually make operations simpler

0:58 Raynes: amalloy: But is it web scale?

0:59 wmealing_: ಠ_ಠ

1:01 cbare: for what it's worth, some-fn seems to do what I wanted, thanks tomoj!

1:15 casion: amalloy: doesnt juxt do what you want?

1:15 (or (juxt f g h) a b c))

1:15 er, missed a set of parens

1:15 amalloy: no

1:15 but it's not far, i suppose

1:16 (some identity ((juxt f g h) a b c))?

1:17 casion: ((juxt f g h) a b c) returns [(f a b c) (g a b c) (h a bc )] which is what I thought you were after?

1:17 I think I may be mis understanding

1:17 amalloy: you seem to be attempting to apply 'or in a way that does not work

1:18 which is why i replaced it with some identity

1:18 casion: ah, I see

1:21 jebberjeb: In idomatic clojure, are there some guidelines for when to use macros?

1:22 Maybe that's not the right way to articulate this...

1:22 when should I use macros:)

1:26 casion: branching macros in clojure still confuse me at times :|, the idea of 'when' or 'and' or 'or' etc.. returning a non-boolean value refuses to stick

1:28 amalloy: jebberjeb: when you need to evaluate something in a new or non-standard context

1:29 eg, (let [x 1] x) is a macro that evaluates its body, x in a context where there is a local named x bound to 1

1:29 (when foo bar) is a macro that evaluates its body, bar, only when foo is not truthy

1:34 tomoj: cljs has :import now too :)

2:32 ivan: is there any kind of client authentication mechanism for nREPL?

2:35 I guess I could combine openssl s_client and a netty listener that checks the client's cert

3:03 bloudermilk: I've been reading online and I can't seem to find a definitive answer: Are circular dependencies in Clojure a bad idea? Specifically, I'm trying to work with directed graphs

3:04 amalloy: a circular reference is not possible in an immutable data structure

3:05 so you can't really have a circular dependency in the object graph

3:06 instead, usually you'd have pointers to "labels", rather than to objects themselves: {'a {:data 4, :edges #{'b}}, 'b {:data 10, :edges #{'a}}}, for example

3:20 bloudermilk: amalloy: Thank you, this makes sense

3:21 amalloy: What about with transients?

3:21 amalloy: not relevant

3:23 kral: namaste

3:24 bloudermilk: amalloy: noted

3:24 augustl: amalloy: never thought about the impssibility of circular refs before, that's awesome

3:25 bloudermilk: amalloy: Not even with refs?

3:25 immutable data is blowing my mind

3:25 amalloy: *shrug* you can have refs point to each other, but you won't be able to get an immutable snapshot of the data structure, so it's pretty worthless

3:27 bloudermilk: amalloy: Indeed, it seems like the wrong thing to do. Other than labels, how else would one maintain an efficient circular data structure?

3:27 Or are labels not horrible inefficient...

3:27 *horribly

3:29 amalloy: step 1: make it work. step 2: make it fast. (step 1.5 is usually realizing that most of it doesn't need to be optimally super-duper-extra-fast)

3:30 bloudermilk: amalloy: duly noted

3:34 jdj: Don Knuth: "Premature optimization is the root of all evil (or at least most of it) in programming."

3:35 bloudermilk: I feel compelled for some reason as I learn Clojure (my first FP language) to understand how to properly model data

3:36 Coming from a classical OO mutable runtime

3:36 Raynes: It's weird how people think of OOP as the 'old' and 'classic' way of doing things. :p

3:38 bloudermilk: Raynes: Weird, no (people that started with "classical" were taught that). Unfortunate, yes

3:48 seancorfield: When I learned programming, OO was very fringe and FP was more center stage in academia. I liked FP a lot. Then I had to learn OO when it went mainstream. Ugh. Glad FP is back in vogue :)

3:49 But a strong OO background is certainly an obstacle to learning effective FP. Unfortunately.

3:50 amalloy: seancorfield: i disagree. a "strong" background in any kind of programming is an advantage in learning another kind

3:50 a shallow, lengthy background in OO is more what i'd call a disadvantage in learning FP

3:51 seancorfield: Taking away assignment and loop variables has a fairly debilitating effect on an OO programmer since they spend all their time poking at data hidden in boxes to make it change...

3:51 Zentrope: seancorfield: I work daily spelunking a code base (I didn't write) in which "inheritance" is the main way the original authors avoided code duplication.

3:51 seancorfield: amalloy: perhaps "a strongly entrenched OO background" then?

3:52 Most "Java Programmers" these days are "strongly entrenched" rather than having a "strong" background in the way you mean...

3:52 amalloy: *shrug* clojure was my first functional language. it's more about attitude: do you see the new ideas/rules of FP as restrictions or as interesting challenges

3:52 seancorfield: Zentrope: sorry for your pain :(

3:52 amalloy: I think it also depends on how you view OO and OO languages :)

3:53 amalloy: i loved em for sure. didn't know anything else. reinvented java whenever i had to work in C

3:53 Zentrope: seancorfield: *shrug* It's just interesting to see all the pitfalls lined up right there before me. Smart authors. They did all the _right_ things. But, somehow.... ;)

3:54 amalloy: but i'm not really making any general points, i guess

3:54 seancorfield: When Haskell appeared, I really thought that might be the turning point, and FP would go mainstream... having seen SASL, Miranda, ML, and many others not get much traction.

3:55 I'm glad we're finally seeing FP being taken seriously and problems with OO being admitted...

3:55 amalloy: well, their freenode room is twice as big as ours still

3:56 which is obviously the only interesting metric of language momentum

3:56 seancorfield: Haskell? I used to hang out there but since I didn't get to write Haskell for a living, I kinda lost interest :)

3:57 The Haskell community are certainly passionate :)

3:57 I'm very happy that I get to write Clojure for a living!

3:57 amalloy: haskell is pretty amazing as a language. i enjoy dabbling in it, but clojure is so great that i don't really have the motivation to really dive in

3:58 naeg: is something similiar to this possible in clojure (and performant)? http://stackoverflow.com/questions/4261332/optimization-chance-for-following-bit-operations

3:59 amalloy: naeg: having spent two seconds glancing at that question, i am confident that you (or indeed i) will write bad code somewhere else in the program that costs way more speed than the speedup you could get from using shifts there

4:00 naeg: amalloy: but the algorithm seems so neat?

4:00 seancorfield: if memory was not so constrained, no one would bother packing data in and out of bit patterns like that tho...

4:00 naeg: it doesn't have to be as performant as in C or ASM, about a msec is okay (that's what I'm having with this solution: https://gist.github.com/3520562)

4:02 but it is possible to create a int64 (maybe from java?) and then do shift operations on it?

4:04 seancorfield: Java has bitwise operations, yes

4:04 Apage43: mrm

4:04 trying to do a rate-limiting wrapper that blocks if the wrapped fn is being called too fast

4:05 right now I'm using an agent make the callers "get in line", but feels ugly that the fn is running in a different thread than the caller, and that would probably subtly break some stuff that expects that not to happen

4:06 amalloy: funny. i've written rate-limited twice, and both times chose something different than blocking

4:06 Apage43: I saw the one in useful :). For this I'm rate limiting requests to an HTTP API.

4:07 seancorfield: naeg: and, yes, Clojure has various bit-twiddling functions too, if you really want to go there...

4:08 Apage43: so if I'm calling it too fast I just want to wait, since I do need the result

4:16 naeg: seancorfield: I guess I will. The algorithm is neat and not that complex

4:17 (just to compare it to my other solution, will probably use the other one anyway)

5:28 gtuckerkellogg: how can one run all midje tests for a namespace from the REPL?

5:28 noidi: afaik, midje runs the facts as soon as they are evaluated

5:29 so try (require 'my.ns :reload)

5:29 or something like that

5:30 gtuckerkellogg: so there's nothing in midje like clojure.test's (run-tests 'your.namespace) ?

5:30 wow. in so many other ways, midje is superior.

5:31 amalloy: just...put your midje tests inside a deftest

5:31 i'm not a big fan of midje, but i don't see why it should diplicate functionality that it can reuse instead

5:32 gtuckerkellogg: good point

5:32 i'll do just that

5:33 amalloy, what don't you like about midje?

5:34 amalloy: i don't dislike anything concrete; i'm sure it's fine. the heavy emphasis on tdd styles isn't to my taste. i do think mocking is overused, but that's probably related to tdd

5:40 Raynes: amalloy: From what I can tell, midje is an excellent way to test things in creative ways without a lot of code.

5:40 I think a lot of things are quite a bit overly complex.

5:41 See 'around' and other crap like that.

5:41 Gives me a headache.

5:41 gtuckerkellogg: i just miss being able to run the whole namespace of tests from the repl

5:41 pyykkis: Raynes: +1

5:43 if something, test framework should be simple and explicit. I find clojure.test being just that (and I used to be a fan of rspec). We'll, i guess it's a matter of taste

5:54 algernon: gtuckerkellogg: (require 'my.ns :reload), as noidi said should do just that.

6:02 gtuckerkellogg: thanks

6:33 borkdude: hmm, I have an enlive template that is based on an html5 file, basically I just want to show the file

6:33 but it leaves the doctype out

6:34 this is my template:

6:34 (enlive/deftemplate welcome-page

6:34 "public/index.html"

6:34 [])

6:34 what could be the problem?

6:34 vijaykiran: borkdude: https://github.com/cgrand/enlive/issues/15 related ?

6:35 borkdude: vijaykiran that's it, tnx

7:10 Cheiron: Hi, what does this mean? IllegalArgumentException No value supplied for key: true clojure.lang.PersistentHashMap.createWithCheck (PersistentHashMap.java:89)

7:12 borkdude: ,{true}

7:12 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Map literal must contain an even number of forms>

7:12 borkdude: ,(hash-map true)

7:12 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: No value supplied for key: true>

7:12 borkdude: ,(hash-map true 1)

7:12 clojurebot: {true 1}

7:13 hyPiRion: ,(assoc {} true)

7:13 clojurebot: #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core$assoc>

7:13 borkdude: so it means exactly what is says, no value supplied for key: true :)

7:13 dunno about the createWithCheck thing though

7:31 Raynes: Cheiron: It usually means you're trying to create a map without enough key and value pairs.

7:32 Er, without one part of a pair.

7:32 As demonstrated above.

7:32 naeg: someone used common crawl with clojure already? http://commoncrawl.org/

7:32 Cheiron: eye c. still unable to locate the line. Anything wrong with (def ^{:private true :doc ".....:} ttl 20000)

7:34 borkdude: ".....: -> "…." I presume?

7:35 Cheiron: yes, i mean it is a string

7:37 borkdude: seem ok tom e

7:37 seems ok to me

7:38 Raynes: It wont be a literal map, Cheiron.

7:38 It'll be code that creates a map, like borkdude's hash-map call.

7:43 Cheiron: so this line isn't the suspect? (def ^{:private true :doc "....."} ttl 20000)

7:44 i'm trying to require a file

7:44 but the only message i got is: IllegalArgumentException No value supplied for key: true clojure.lang.PersistentHashMap.createWithCheck (PersistentHashMap.java:89)

7:44 i'm unable to locate the suspected map

7:46 I found it !! how stupid i am

8:45 jao`: nick jao

9:32 rhickey: clueless lein user q: lein repl fails if your code doesn't compile?

9:33 is there a way around that?

9:33 chouser: that probably depends on whether you're aot'ing or not.

9:34 rhickey: I'm not asking for anything specific

9:34 does :main entry trigger that?

9:34 clgv: rhickey: yes. if there is none it starts in namespace 'user

9:35 chouser: Ah, probably

9:35 rhickey: seems to

9:35 clgv: the same behavior when you do lein repl outside a project

9:35 chouser: so with no :main, lein repl succeeds and drops you in 'user even if none of your code compiles.

9:36 clgv: chouser: no. as far as I experienced, there is no compilation. you will have to require the namespaces you want to use from 'user namespace

9:52 chouser: How can I tell pprint to print metadata?

9:54 clgv: chouser: set *print-dup* to true

9:54 chouser: pprint seems to ignore both *print-dup* and *print-meta*

9:55 clgv: then you probably cant

9:56 chouser: wow. really?

9:56 clgv: humm just checkoing the source. it writes directly to *out*

10:06 advirol: Hi, I want to read the release announcement for Clojure 1.4 but as it seems, I cannot read it without logging in with a Google account.

10:06 Does s.o. have any idea for a solution? I would suggest to use open forums that don't require to login.

10:07 * nDuff is surprised the groups isn't set to be publicly readable

10:08 nDuff: s/groups/group/

10:08 advirol: hm, perhaps I made a mistake.

10:08 I verify that

10:10 rhickey: group is public readable, but if you are logged into google already it tries to log you in to groups

10:10 nDuff: advirol: I just pulled it up from a private-mode browser with a clear cookie set

10:10 s/clear/empty/

10:11 advirol: yes, you're right. my mistake was that i had been logged in and groups wanted to verify my account.

10:11 wmealing_: there was issues with either oauth or openid, i can't remember.. but i know there was a problem with one of them

10:11 is one preferred over the other ?

10:11 advirol: now since i completely logged out, i have access. just forget about it. ;)

10:11 clgv: advirol: the changes are also up on github

10:12 advirol: alright, even better. thx all

10:13 nDuff: rhickey: Is it expected that a delay throwing an exception should work when it's called again? A corner case where that doesn't behave as-expected (has locals cleared on rerun) came up yesterday; I don't know that anyone has come up with a clear enough reproducer to file a ticket yet, though hyPiRion was working on it.

10:13 wmealing_: or am i looking at this whole issue sideways ?

10:16 hyPiRion: nDuff: I filed a ticket

10:16 nDuff: http://dev.clojure.org/jira/browse/CLJ-1053

10:19 nDuff: hyPiRion: Ahh -- great; thanks!

10:21 ...and that's much clearer about what's going on.

10:23 hyPiRion: Yeah, it bothered me last night, so I did some testing and tried to figure out what the problem was.

10:25 It is a rather strange case.

11:12 kral: Are there any good example of clojure + clojurescript on github or similar site?

11:14 shaungilchrist: http://clojurescriptone.com/ (bare in mind it expects lein1.6 to follow the tutorial)

11:14 jsabeaudry: kral, http://github.com/ibdknox/overtoneCljs this one is not bad

11:15 kral, the key to clojurescript in my opinion is lein-cljsbuild, makes it really simple no need to install anything etc

11:17 xeqi: +1 for lein-cljsbuild

11:18 can't think of any recent open source projects showing everything togeter

11:18 `fogus: (inc jsabeaudry)

11:18 lazybot: ⇒ 1

11:19 xeqi: besies that overtone one

11:21 shaungilchrist: is anyone else using the notion of .cljx ala c2?

11:35 rhickey: what are people using for Clojure data Content-Type?

11:37 `fogus: application/clojure here

11:38 nDuff: Doesn't there need to be an x- in there for things that aren't standardized yet?

11:40 `fogus: Hmm, probably

11:44 metajack: x- is deprecated now

11:44 ohpauleez: rhickey: application/clojure here as well

11:44 metajack: http://tools.ietf.org/html/rfc6648

11:45 `fogus: I guess I was ahead of times (for once)

11:46 rhickey: looks like clj-http {:as :auto} checks for that as well

11:48 alpheus: Is there something like clojure.java.io/copy that can read from a java.io.InputStream and write to a byte array?

11:52 antares_away: alpheus: you probably can read data into a byte buffer and turn that into a byte array

11:59 alpheus: copy's "Output may be an OutputStream, Writer, or File." Can I make an OutputStream that's a byte buffer?

12:00 I should probably tell you my actual problem instead of asking about possible solutions.

12:00 mmitchell: is there any version of clojure that allows you to throw with a string only? (throw "my error")

12:01 alpheus: as opposed to (throw (Throwable. "my error"))?

12:01 mmitchell: alpheus: yes

12:01 ,(throw "boom")

12:01 clojurebot: #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Throwable>

12:02 mmitchell: ,*clojure-version*

12:02 clojurebot: {:interim true, :major 1, :minor 4, :incremental 0, :qualifier "master"}

12:04 hyPiRion: mmitchell: Well, it allows you to throw with a string only. Like, technically.

12:06 duck1123: you might want to check out slingshot. it has a fn called throw+

12:06 nbeloglazov: $clojuredocs copy

12:06 lazybot: incanter.processing/copy-pixels: http://clojuredocs.org/v/3256; incanter.core/copy: http://clojuredocs.org/v/2853; clojure.java.io/copy: http://clojuredocs.org/v/2139; clojure.contrib.io/copy: http://clojuredocs.org/v/491; clojure.contrib.duck-streams/copy: http://clojuredocs.org/v/254

12:07 nbeloglazov: $javadoc java.io.ByteArrayOutputStream

12:07 lazybot: http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html

12:07 nbeloglazov: alpheus: use ByteArrayOutputStream

12:07 lotia: how would i redirect System/SetOut ans System/SetErr in clojure?

12:09 bosie: anyone in here using cascalog?

12:13 technomancy: I realize it's an artificial distinction, but I wonder if the application/clojure content-type would be appropriate for data structures not intended for evaluation while text/clojure might be appropriate otherwise

12:13 err--s/not//

12:26 duck1123: why would you write clojure code/data you don't intend to be evaluated?

12:27 hyPiRion: duck1123: There's a difference between evaluating and reading, ##(doc *read-eval*)

12:27 lazybot: java.lang.SecurityException: You tripped the alarm! *read-eval* is bad!

12:27 hyPiRion: ,(doc *read-eval*)

12:27 clojurebot: "; When set to logical false, the EvalReader (#=(...)) is disabled in the read/load in the thread-local binding. Example: (binding [*read-eval* false] (read-string \"#=(eval (def x 3))\")) Defaults to true"

12:29 xeqi: fetch uses "application/clojure" https://github.com/ibdknox/fetch/blob/master/src/noir/fetch/remotes.clj#L25

12:29 though only on server responses :\

13:05 acheng: ,(java.lang.ProcessBuilder. "ls")

13:05 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: No matching ctor found for class java.lang.ProcessBuilder>

13:07 xeqi: ,(java.lang.ProcessBuilder. ["ls"])

13:07 clojurebot: #<ProcessBuilder java.lang.ProcessBuilder@1248de38>

13:07 acheng: xeqi: thanks!

13:11 xeqi: acheng: might take a look at https://github.com/Raynes/conch

13:13 acheng: (inc xeqi)

13:13 lazybot: ⇒ 2

13:46 pbostrom: I'm looking for ways to debug a Java app with Clojure, anyone have experience with this? a search through the ML mentions a few options, like https://github.com/djpowell/liverepl or https://github.com/wirde/swank-inject, wondering if one is better than the other

13:50 shawnlewis: Is there any way to merge namespaces (that I don't control)? For example I'd like to create a namespace that contains all of clj-time's sub-namespaces (clj-time.core clj-time.local clj-time.coerce clj-time.format)

13:51 as well as a few additional functions of my own

13:51 S11001001: shawnlewis: not a good way

13:54 shawnlewis: In Python you can access a module's imports via chaining. Like module.importedmodule.func

13:55 Walking the child namespaces and def'ing their symbols in the parent would be pretty bad huh?

13:56 S11001001: shawnlewis: it's highly error-prone

13:56 hyPiRion: shawnlewis: And the metadata would be gone, too.

13:56 emezeske: How do you deal with name conflicts?

13:57 hyPiRion: Unless you're tricking it somehow.

13:57 mindbender1: cemerick: on piggieback README, the line after ## Rhino ClojureScript Environment (default) is not clear. Mind having a look?

13:57 S11001001: dynamics, macros, redefinitions

13:58 as for that bit of Python, I'd call that a misfeature, as it makes what libs you happen to import into a module part of the public api of that module, unless you __all__ them away, which is tedious

13:58 emezeske: shawnlewis: What is your goal? To save typing in your requires?

13:59 S11001001: Well, in Python everything is always public, but I think it's generally understood that some things are obviously bad to poke around in

13:59 shawnlewis: emezeske: Yeah I feel like every time I need clj-time I end up needing 3 out for 4 of its submodules, I also don't like having to think about which function belongs to which submodule

14:01 emezeske: shawnlewis: How many functions from clj-time do you find yourself using? If it's not many, you could write your own utility api on top of them and just use that

14:02 shawnlewis: If you try to combine namespaces programatically, a new release of clj-time could break everything by merely adding a new private function to some namespace that conflicts with another namespace

14:02 shawnlewis: emezeske: that's true but I was hoping there might be a simpler way

14:02 emezeske: well i could have my super-namespace die if there are conflicts

14:03 pandeiro: can i basically drop in nrepl.el and use nrepl-jack-in the same way i was using slime/swank?

14:03 emezeske: shawnlewis: Well you wouldn't have any other choice but to die

14:03 shawnlewis: emezeske: oh i said you said private function. either way I think dying is appropriate

14:04 *i see you said

14:04 emezeske: shawnlewis: Dying is not just appropriate, it's all you could reasonably do

14:04 shawnlewis: Unless your code is going to go through the whole AST and rename conflicting functions everywhere

14:05 shawnlewis: yup

14:06 emezeske: shawnlewis: If you really, *really* want to do something like this, you could have a macro that, using a whitelist, builds proxy functions in one namespace for all the public functions from clj-time.* namespaces

14:06 Which is basically just a somewhat automated version of writing your own simplified wrapper API

14:07 shawnlewis: emezeske: right

14:08 I guess I was thinking (use) might have an option to also expose the referred functions to callers

14:08 SegFaultAX|work2: My 4clojure solutions keeps timing out for no reason. :(

14:09 shawnlewis: ie: my mental model was that (use) was equivalent to doing "from module import *" in python, but that's not the case

14:09 i'm not saying there's anything wrong here. just figuring out how stuff works

14:09 hyPiRion: pandeiro: I just did

14:10 At least for me, the transition was frightenly simple.

14:12 pandeiro: hyPiRion: seems too good to be true, as much as i struggled with swank

14:12 but it's working fine so far

14:13 cemerick: mindbender1: not clear how?

14:14 (it's basically a repeat of the interaction described in the cljs tutorial)

14:14 mindbender1: cemerick: there's an opening bracket that was not closed.

14:14 that confused me a bit

14:14 Gnosis-: it doesn't seem like I can throw+ inside the catch of a try+ block

14:15 ,try+

14:15 cemerick: mindbender1: sorry, where? I'm not seeing it.

14:15 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: try+ in this context, compiling:(NO_SOURCE_PATH:0)>

14:15 mindbender1: cemerick: immediately after ## Rhino ClojureScript Environment (default)

14:15 Gnosis-: ,(refer 'slingshot.slingshot)

14:15 clojurebot: #<RuntimeException java.lang.RuntimeException: java.lang.Exception: No namespace: slingshot.slingshot>

14:15 cemerick: oh, just in the text prior to the console interaction

14:16 mindbender1: yess

14:16 cemerick: Sure, will fix.

14:16 mindbender1: ok thanks

14:16 hyPiRion: pandeiro: Yeah, I'm kind of wondering when it will blow up on me.

14:16 cemerick: mindbender1: fixed; though it doesn't really change the process, etc.

14:17 mindbender1: cemerick: yeah I sensed so.. just that I kept looking for a closing bracket

14:17 Gnosis-: is it possible to re-throw an exception in slingshot?

14:17 mindbender1: cemerick: thanks for fixing

14:18 pandeiro: hyPiRion: we are both traumatized

14:18 dnolen: rhickey: any thoughts about the column tracking metadata patch for the Clojure reader? Is there some more rationale you want to see around that patch, or is it simply not on the table?

14:18 technomancy: Gnosis-: sure

14:20 Gnosis-: technomancy: if I have (throw+ (assoc e :test true)) in a catch block, the original exception gets thrown (before the assoc)

14:20 Frozenlo`: Is there a way to check if two functions are identical? Something like (= #(print "Hook!") #(print "Hook!"))

14:21 technomancy: Frozenlo`: sort of, if you use serializable-fn

14:21 pandeiro: is there any reason against running a small-time webapp via emacs/nrepl to be able to hot-patch and whatnot? is that a big risk?

14:22 technomancy: Gnosis-: huh, sounds like a bug in slingshot. you should be able to do it with ex-info though

14:22 * technomancy imagines a vary-ex function

14:22 Frozenlo`: technomancy: this? https://github.com/technomancy/serializable-fn

14:22 technomancy: (throw (vary-ex e assoc :test true))

14:22 Frozenlo`: that's the one

14:22 Frozenlo`: Thanks, looking now!

14:23 technomancy: pandeiro: you should launch it with a proper daemonization tool and launch an nrepl server from the inside.

14:23 update-ex is probably better than vary-ex

14:24 pandeiro: technomancy: what would be the tradeoffs there? more stability? automatic restarting?

14:24 xeqi: pandeiro: and make sure to restrict access, perhaps using https://github.com/cemerick/drawbridge as shown in https://devcenter.heroku.com/articles/debugging-clojure

14:24 technomancy: (update-ex e assoc :test true) -> (ex-info (.getMessage e) (assoc (ex-data e) :test true))

14:24 pandeiro: xeqi: great thanks

14:24 technomancy: pandeiro: yeah, and the more conventional it is the more likely you are to remember how to do it when you have to come back to it two years later

14:25 upstart-style init scripts are nice for that

14:26 depends on your definition of "small-time" I guess; if you're the only one using it then launching it out of a repl in tmux is fine =)

14:26 pandeiro: technomancy: me and a few people, but it would be nice to learn 'the right way to do it'

14:26 thanks

14:27 Frozenlock: technomancy: That's really nice! Will this work with cljs also?

14:27 technomancy: Frozenlock: I doubt it

14:27 SegFaultAX|work2: amalloy: Are you the 4clojure administrator?

14:27 amalloy: yes

14:27 Gnosis-: technomancy: regular throw _does_ work inside the catch block of a try+ :)

14:28 so how do I wrap a map inside it? make a Stone object?

14:28 technomancy: Gnosis-: I recommend ex-info

14:28 Gnosis-: technomancy: okay, thanks

14:29 how do I report this bug?

14:29 SegFaultAX|work2: amalloy: I'm trying to submit an answer to a question, but it times out almost every single time. When it does actually run my solution it works instantly, but sometimes it takes a while for it to even start the first test so by the time it gets to the last one it times out.

14:29 amalloy: Is the problem my code or 4clojure, do you think?

14:29 amalloy: 4clojure. the sandboxer handles some things (mostly java interop) pretty badly

14:30 SegFaultAX|work2: amalloy: There is no interop in this solution. Would you mind taking a look?

14:30 amalloy: sure

14:30 SegFaultAX|work2: Problem 73: https://www.refheap.com/paste/4774

14:31 amalloy: I didn't think I was being too abusive. But I'm still learning. :)

14:31 amalloy: SegFaultAX|work2: when i paste that into 4clojure, it succeeds instantly

14:32 SegFaultAX|work2: amalloy: Hmm, lemme retry.

14:32 amalloy: Yea it just spins for me then times out.

14:32 scriptor: it hangs for me too

14:32 amalloy: hm. pressed submit again, and this time it's stuck

14:32 SegFaultAX|work2: Even if it's not idiomatic Clojure, is my solution awful?

14:33 amalloy: no, looks pretty good to me

14:33 scriptor: definitely a problem with 4clojure here, I tried it with "2" and it also hangs for a bit

14:35 amalloy: well, i can restart it. it's not using much cpu or ram though

14:36 try now

14:36 SegFaultAX|work2: amalloy: That did it.

14:36 amalloy: Thanks so much!

14:37 amalloy: I'm getting close http://www.4clojure.com/user/segfaultax

14:38 jweiss: i'd like to update a file within a zipfile within a zipfile. This is turning out to be surprisingly difficult. is there anything out there to help beyond the java.util.zip classes?

14:38 eggsby: seancorfield: is there any way to send auth credentials with clj-soap?

14:43 hyPiRion: Ah, and now my solution to the reversi worked as well.

14:47 seancorfield: eggsby: i don't use clj-soap so i don't know, sorry

14:52 Gnosis-: technomancy: it turns out I was using slingshot 0.8.0; I upgraded to 0.10.3, and now I get this error at the REPL: ClassNotFoundException slingshot.Stone java.net.URLClassLoader$1.run (URLClassLoader.java:217)

14:54 eggsby: ah seancorfield: https://github.com/seancorfield/clj-soap this a different person? :p

14:54 no worries, just dropping down to the java :)

14:57 hyPiRion: ah, nrepl killed my paredit. Whenever I del over any paren/bracket, it's getting killed.

14:58 Gnosis-: technomancy: sorry, please disregard; I needed to do 'lein clean'

14:59 amalloy: heh. lispers are baffling. "dangit, i press delete and a character disappears. my text editor is broken!"

15:00 uvtc: hehehe

15:01 xeqi: technomancy: know anything about when the next nrepl.el release is? I'd love a fix for kingtim/nrepl.el#84

15:02 technomancy: xeqi: haven't heard much discussion about that, no

15:02 are you on the nrepl.el mailing list? could raise it there.

15:02 xeqi: somehow I'm managed to not join that yet

15:02 guess its time

15:04 amalloy: huh, i wonder why lazybot didn't post a link to that issue when you mentioned it

15:04 xeqi: I thought the same thing

15:04 wasn't sure if it was channel restricted

15:04 or if the "." messed it up

15:05 amalloy: i looked through the source, neither seems to be the case

15:05 hyPiRion: Is there some hook someone has created to fix the issue?

15:05 xeqi: xeqi/lein-pendantic#2

15:05 hyPiRion: (for the nrepl/paredit thing)

15:05 xeqi: &"I'm not broken"

15:05 lazybot: ⇒ "I'm not broken"

15:05 * xeqi shrugs

15:05 amalloy: 4clojure/4clojure#5

15:05 lazybot: CSS and HTML Layout -- https://github.com/4clojure/4clojure/issues/5 is closed

15:05 scriptor: maybe lazybot ignores closed issues?

15:05 clojurebot: Cool story bro.

15:06 scriptor: oh, well never mind

15:06 xeqi: oh, I misspelled my own repo :\

15:06 technomancy: whoa; what happened to http://www.opalang.org/

15:07 llasram: Soooo shiiiiny

15:07 technomancy: llasram: but but

15:07 the only reason I cared the slightest bit about opa was ocaml

15:08 and they replaced every mention of it with node

15:08 llasram: http://opalang.org/faq.xmlt still talks about OCaml as primary implementation language

15:08 ohpauleez: technomancy: 1.7m of funding will do that

15:08 amalloy: technomancy: i think it's april first in the southern hemisphere

15:09 ohpauleez: "JS Framework" is a easy way to raise a bunch of money

15:09 amalloy: Normandy, France

15:09 technomancy: ohpauleez: yeah, especially when you add "enterprise" to it

15:09 hoover_damm: Intel needs to release javascript optimization to the intel microcode

15:09 ohpauleez: technomancy: "enterprise" alone is an extra 150K

15:09 amalloy: eastern hemisphere, then. i think it's a viable joke regardless of technicalities

15:10 scriptor: kinda reminds me how racket-lang has no mention of "lisp" on the home page

15:10 * hoover_damm was being sarcastic

15:11 amalloy: ah, i think lazybot's regex doesn't accept . in repo names, even though it tries to

15:13 ohpauleez: technomancy: The one mention of OCaml exists in the job descriptions. "The compiler is written in OCaml"

15:13 I love when french companies use OCaml

15:13 it feels so french

15:13 SegFaultAX|work2: When did MongoDB and Node.js become *the* Javascript stack?

15:14 ohpauleez: SegFaultAX|work2: three years ago?

15:14 maybe two

15:15 technomancy: what on earth is "supported technologies" on that page supposed to mean? if you don't look closely it looks like they're saying google, twitter, and facebook use their stuff

15:15 SegFaultAX|work2: Well that makes me sad, then. Two significantly subpar technologies comprise *the* js stack. :(

15:16 ohpauleez: SegFaultAX|work2: Yes… it's like Asimov's "Foundation" is taking hold

15:17 May we be the instruments of a brighter future

15:17 SegFaultAX|work2: I guess 3 significantly subpar technologies, if you include Javascript itself.

15:17 acheng: hm. added [conch "0.3.1"] to my project.clj, ran lein deps, added [conch :as sh] to my clj file's :require clause in the call to ns.... when loading file i get FileNotFound for conch__init.class on classpath

15:17 Sgeo: What does being shackled to the JVM count as?

15:17 acheng: same result after getting a new clojure jack in session.

15:18 ohpauleez: Sgeo: Who's shackled? You can sort of run Clojure on JS, JVM, Scheme, Python, Lua, and soon barebones via C

15:18 Also, it's funny the company kept its name: MLstate

15:18 kudos

15:19 xeqi: acheng: (:require [conch.core :as sh])

15:19 SegFaultAX|work2: What's wrong with the JVM? It's a reasonably stable and performant virtual machine.

15:19 acheng: ah. of course

15:19 although i still get the error

15:20 oh nevermind

15:20 Sgeo: It suggests a model that might not be ideal, and the best performance is done by staying close to the model: Protocols vs generic functions

15:21 acheng: xeqi: thanks again

15:21 ohpauleez: I've been keeping a close eye on Rust, which has me pretty excited

15:23 dnolen: Sgeo: what language do you use that has generic methods as generic as Clojure's yet faster?

15:25 Sgeo: dnolen, I guess I don't know enough to make the comparison, but Common Lisp can be pretty fast, and I think it might be possible to build a Clojure-like generic system fairly thinly over CLOS

15:25 dnolen: Sgeo: CLOS isn't as generic, based on your argument you could probably do the same for Clojure. Are you going to be the one to do it?

15:27 Sgeo: Building Clojure on top of Common Lisp?

15:27 dnolen: Sgeo: no build faster generic methods for Clojure.

15:28 Sgeo: Java doesn't have anything similar to CLOS, I think

15:28 dnolen: Sgeo: ...

15:28 Sgeo: ...although, I have a thought

15:29 My Clojure-style generics on CLOS plan was kind of single-dispatch, actually

15:30 What is going on with all these ping timeouts?

15:30 Cheiron: Hi, how to import this enum in clojure code? http://hector-client.github.com/hector//source/content/API/core/1.0-1/me/prettyprint/hector/api/beans/AbstractComposite.ComponentEquality.html

15:30 _tca: Sgeo: notice: linode

15:30 emezeske: Sgeo: Are you writing your own programming language?

15:31 Sgeo: emezeske, I'm starting to think I should eventually

15:31 emezeske: Sgeo: I was going to suggest that.

15:33 ohpauleez: Sgeo: You should also give The Art of the Metaobject Protocol a read, and give the CLJS source code a read through

15:36 Cheiron: to import http://hector-client.github.com/hector//source/content/API/core/1.0-1/me/prettyprint/hector/api/beans/AbstractComposite.ComponentEquality.html (import '......AbstractComposite$ComponentEquality)

15:36 but to use the constants?

15:36 *but how

15:43 pepijndevos: How do I get a recent google closure library?

15:44 ohpauleez: pepijndevos: You're looking for the inclusion of the third-party pieces?

15:44 pepijndevos: ohpauleez: just a more recent version than what comes with cljsbuild

15:44 xeqi: &(java.math.RoundingMode/DOWN)

15:44 lazybot: ⇒ #<RoundingMode DOWN>

15:44 pepijndevos: or… as far as i understand the clojurescript stack at all

15:45 ohpauleez: pepijndevos: cljs includes a very very recent version, not more than a few months old

15:45 pepijndevos: ohpauleez: https://groups.google.com/forum/#!topic/clojure/gG24Shh8wDg

15:45 xeqi: Cheiron: I'd expect (AbstractComposite$ComponentEquality/EQUAL)

15:46 juhu_chapa: Hi all! Is there any way to pass params to a future?

15:46 ohpauleez: Ah gotcha. So you just need to pack up a jar yourself or nab a recent version from here: https://clojars.org/search?q=closure

15:46 pepijndevos: juhu_chapa: try future-call

15:46 ohpauleez: I maintain my own local version, as I use the HTML5 stuff and some of the third-party stuff in prod apps

15:47 pepijndevos: ohpauleez: oohing on clojars seems > 2035

15:47 *nothing

15:48 ohpauleez: packing up your own custom jar isn't hard, just annoying

15:48 pepijndevos: ohpauleez: Can I have yours? Or… maybe I should just go with the seamless field

15:49 seancorfield: eggsby: i forked clj-soap thinking i could get it running on clojure 1.4 in a project i'm using at work but it didn't have the right features for what i needed... the original is here https://bitbucket.org/taka2ru/clj-soap

15:49 juhu_chapa: pepijndevos: future-call accept a function with no-params :(

15:49 pepijndevos: maybe an agent is the right choice

15:50 pepijndevos: maybe...

15:50 Sgeo: juhu_chapa, make the function a closure?

15:50 ohpauleez: pepijndevos: in my experience, if you can revert to something already in the goog-jar without too much trouble or loss of functionality, you should. If not for Occam's razor, than to just to make life easier and move on in the solution space

15:50 seancorfield: eggsby: i ended up publishing a new version (snapshot) that works with 1.4.0 / lein2 but that's as far as I got: https://clojars.org/org.clojars.seancorfield/clj-soap

15:51 Sgeo: ,(let [a 5 f #(+ % a)] (f 6))

15:51 pepijndevos: ohpauleez: right, will do.

15:51 clojurebot: 11

15:52 eggsby: ah seancorfield, ya i'm having to drop straight down to apache axis2 myself

15:52 seancorfield: i ended up dropping down to apache axis too... version 1 due to constraints on the middleware container i'm running my clojure code in...

15:52 once it was wrapped in clojure code, it was fairly painless to use :)

15:53 eggsby: is there a special syntax to access nested classes via clojure?

15:53 juhu_chapa: Sgeo: :O

15:53 pepijndevos: eggsby: dollar, I believe

15:53 eggsby: ah, thank you pepijndevos

15:54 was driving me bonkers that nrepl wasn't autocompleting it and org.package.EnclosingClass.NestedClass wasn't working

16:04 gtrak`: Raynes: hey, I saw your fork of ring-cors, is there advantage to it from the parent?

16:05 nbeloglazov: I'm moving to repl.el from swank. I added it my load-path and require'd. Try to nrepl-jack-in, it start server, but *nrepl* buffer stays black. No input hint like "user =>" and when I press enter it says "Wrong type argument: integer-or-marker-p, nil".

16:07 ohpauleez: gtrak`: A look at the network info on github suggests that there are some decent improvements in the flatland version

16:08 https://github.com/flatland/ring-cors/network

16:08 gtrak`: yea, I saw that, good enough for me I guess :-)

16:34 nbeloglazov: Does somebody uses nrepl.el with emacs 23? Does it work with latest nrepl.el? It seems to be broken for 23. Can somebody check?

16:35 technomancy: I know it's primarily developed using 24

16:35 Raynes: Probably easier to just use 24.

16:35 It's officially released now, so you shouldn't have to compile from source or anything.

16:36 nbeloglazov: Raynes: seems not for ubuntu 10.04 :(

16:37 technomancy: you can use nix

16:37 nbeloglazov: So better to put this "only 24" to README

16:38 tanzoniteblack: nbeloglazov: https://launchpad.net/~cassou/+archive/emacs has an emacs24 build for lucid, I think

16:38 nbeloglazov: tanzoniteblack: thanks

16:39 tanzoniteblack: the "emacs-snapshot" package is an emacs24 build available for lucid from that ppa, doesn't look like the "emacs24" stable package supports lucid though

16:41 technomancy: it used to say it supported 24 only, then someone who used 23 said that should be removed because it worked for him, but that was a few weeks ago

16:42 nbeloglazov: Commit that broke it was made 10 days ago (I think it broke).

16:42 tanzoniteblack: as of 2 weeks ago or so, the version on elpa worked in 23

16:43 nbeloglazov: https://github.com/kingtim/nrepl.el/commit/958b042fd9ba7c17eb968709a47685dadaa809b4

16:43 completion-at-point-functions was introduced in 24

16:47 holo: hi

16:48 i have a function called "ANY" in my code. i need to know to which library it belongs. is there a search engine for this kind of stuff?

16:49 tanzoniteblack: using the backtick (`) you can get the full form of a function

16:49 ,`(defn)

16:49 clojurebot: (clojure.core/defn)

16:49 lnostdal: move the cursor 'any' and press M-. this will take you to the definition of that function

16:49 press M-, to go back to where you where

16:51 mattmoss: git status

16:52 oops

16:52 holo: tanzoniteblack, lnostdal, this is a function that is possibly not even installed in my system, so i was thinking about a public code repository search engine

16:52 technomancy: that'd be a neat feature to add to clojuresphere

16:53 some kind of hoogle port

16:54 ivaraasen: clojuresphere gives me an application error

16:54 strange

16:55 technomancy: memory quota exceeded =\

16:56 ivaraasen: :/

16:57 holo: that hoogle thingy would be cool

16:57 nbeloglazov: I tried search few minutes ago there. May be it's related

16:57 ivaraasen: set up donations and I'll contribute towards extra dynos :)

16:57 technomancy: jkkramer: mind if I collab myself in to fix it?

16:57 holo: it wouldn't be as cool as in haskell since we don't have type signatures

16:58 probably just a config issue

16:58 xeqi: we have $findfn

16:58 technomancy: yeah, it's not using trampoline

16:59 jkkramer: technomancy: sure go for it

17:00 clojuresphere needs some love

17:00 technomancy: I wonder if I should have it emit a warning in the buildpack if you use run without trampoline

17:00 jkkramer: do you have anything specific you've been wanting to do with it?

17:00 jkkramer: the main issue I ran into is that github stopped providing a way to get all clojure projects

17:01 technomancy: oh, you needed the v2 api?

17:01 in practice how many things on github weren't accessible via clojars?

17:01 jkkramer: last I checked, none of the API stuff allowed a query for "repo language = clojure"

17:02 nbeloglazov: Updated to emacs 24. nrepl.el works fine. Indeed seems to be broken on 23.

17:02 jkkramer: there were a number of projects on github but not clojars, I believe -- e.g., non-lib projects

17:03 technomancy: jkkramer: hm; yeah that's a drag

17:03 jkkramer: still, libraries are where clojuresphere is most useful

17:04 wow, lots of juicy TODOs in here =)

17:04 jkkramer: technomancy: yeah. being clojars-centric would still be useful. I'll see about refreshing it this weekend, maybe get things automated

17:04 technomancy: jkkramer: maybe we'll take a look at this for a future seajure meeting

17:04 it's a really fun problem

17:04 jkkramer: it was fun to work on, when I had access to the data I needed

17:05 technomancy: lein now warns when you try to deploy a project without description, url, or license

17:05 so the quality of the data on clojars should improve over time

17:05 jkkramer: cool

17:06 technomancy: plus leiningen-core is a library now, so you can easily calculate transitive deps given a project.clj file

17:06 jkkramer: another nagging issue was malformed project.clj files, or ones that expected to be eval'd. it could use more robustness there

17:06 technomancy: well there you go =)

17:07 what's "experiment with long-running threads on heroku" from the todo mean?

17:08 jkkramer: how's the one-file raw map approach working for you?

17:09 I was thinking jiraph or neo4j might be a good fit for this problem

17:09 but I appreciate the simplicity of the approach you're currently using =)

17:12 jkkramer: technomancy: re long-running threads - I was wondering whether a thread could be spun off on the web dyno to refresh the graph. Normally you'd have a cron job or worker dyno do that sort of thing, I think(?)

17:12 technomancy: oh, and it has to be in-process since you don't have any way to persist state

17:12 if you were using neo4j you could manually initiate `heroku run lein run -m clojuresphere.refresh` or use the scheduler addon

17:12 holo: xeqi, that's a really nice addition, that "findfn", but what i want is rather more simple than that. just a search by function name pattern, even if it returned 10 libraries, it would be a good result

17:13 technomancy: holo: for the record, ANY comes from compojure

17:13 holo: but you're right that it would be a cool thing to have

17:13 jkkramer: you could do that with an executor if you needed it in-process

17:13 holo: technomancy, hahaha, thanks for the brain database :)

17:14 technomancy: jkkramer: I deployed a fix for the out-of-memory error

17:15 jkkramer: technomancy: right. Since it was a hobby hack, I had a limited threshold for new tech, so tried to keep it simple

17:15 technomancy: awesome thanks

17:15 technomancy: jkkramer: we poked a bit at neo4j at a past seajure meeting

17:16 would you want to go in that direction if we ended up hacking it at a meeting?

17:17 jkkramer: technomancy: sure, any and all improvements welcome. neo4j has been on my list of things to learn for a while

17:19 technomancy: jkkramer: considering "hard to find" was the main complaint about clojure libs in cemerick's survey I think clojuresphere is a pretty important project

17:21 emezeske: technomancy: Without clojuresphere, there's no good way to ask "what's the de facto library for X" except in IRC :)

17:22 shaungilchrist: I was honestly unaware of it til just now hah. this is great

17:22 technomancy: emezeske: yes, and nothing will ever come close to the wonderfulness of this channel =)

17:22 jkkramer: even clojuresphere can't always decide what the de facto lib is, though

17:23 technomancy: sure; there's only so far you can go with an algorithmic approach, but it scales like nobody's business

17:23 jkkramer: e.g., when a lib changes hands, or a fork becomes the new standard even though it's not popular yet

17:23 emezeske: jkkramer: That's definitely true, but it sure could help

17:23 jkkramer: maybe it could incorporate some user input/feedback

17:23 emezeske: jkkramer: With a bit of human intuition to make sense of the data

17:23 jkkramer: upvotes, vouching, "mark as de facto" or something

17:23 technomancy: jkkramer: yeah, there's no recency decay factored in yet, is there?

17:24 whoa, compojure 0.6.3

17:24 jkkramer: technomancy: don't think so. even then, just because a project hasn't been updated recently, doesn't mean it's inactive. it might just be bug-free :)

17:24 it hasn't been updated in a long time

17:25 technomancy: yeah, but a dependency from an active project should count for more

17:26 IMO anyway

17:26 jkkramer: it should count for something, for sure

17:26 andersf: maybe even measure recent commits, number of persons involved etc

17:27 jkkramer: get some machine learning in there

17:27 technomancy: get bradford cross on the phone

17:27 andersf: jkkramer: any plans of performing a reindex anytime soon? :)

17:28 jkkramer: i'll do one tonight. got put on the back burner when I found the github harvester stopped working

17:28 * emezeske does a celebratory dance.

17:28 jkkramer: so…github won't be very accurate but at least clojars will

17:29 * emezeske sings a line from a Phil Collins song, "I've been waiting for this moment, for all my life."

17:30 advirol: http://www.youtube.com/?v=djytP2ls5Eg

17:30 sry

18:00 SegFaultAX|work2: amalloy: I like your solution to #77

18:01 amalloy: On 4clojure, that is.

18:01 Frozenlock: I've added mouse support to zyzanie, for those interested in adding shortcuts in their cljs app. https://github.com/Frozenlock/zyzanie

18:02 amalloy: heh, thanks. group-by frequencies solves pretty much the whole problem

18:02 SegFaultAX|work2: amalloy: Yup, it's similiar to my solution.

18:02 (defn anagrams [words] (into #{} (map set (filter #(< 1 (count %)) (vals (group-by frequencies words))))))

18:02 amalloy: When I saw that you also used group-by freq I was like "damn, I was hoping I was being slick with that"

18:04 kjellski: is there a function in clojure that could be called collect-by? a function that lets you provide an f that creates a new bucket for each new return value and collects contents of coll by these values?

18:04 amalloy: &(doc group-by)

18:04 lazybot: ⇒ "([f coll]); Returns a map of the elements of coll keyed by the result of f on each element. The value at each key will be a vector of the corresponding elements, in the order they appeared in coll."

18:05 kjellski: amalloy: -.- sometimes my brain even hurts itself... ^^ thanks!

18:05 SegFaultAX|work2: kjellski: It's funny because we were literally talking about a 4clojure solution that uses it not 1 minute before you joined the chan.

18:06 kjellski: SegFaultAX|work2: problem 50 ?

18:06 ^^

18:06 SegFaultAX|work2: amalloy: I really want to get more comfortable using composition in Clojure. In Haskell, (.) flows very nicelly. For some reason I just don't think about it as much yet in Clojure.

18:06 I'm getting there, though.

18:07 amalloy: well, it doesn't flow as nicely as haskell

18:07 SegFaultAX|work2: It flows fine. It's just slightly more part of the normal syntax, ya know?

18:07 gtrak`: every time I try to use comp, I end up thinking -> is better

18:07 SegFaultAX|work2: That and ($) are just part of idiomatic Haskell expressions.

18:08 gtrak`: -> and ->> aren't really reusable though, are they? I mean composition actually produces a new function where as -> just threads a value through successive forms.

18:09 andersf: kjellski: #77

18:09 kjellski: sorry for spoiling :>

18:09 gtrak`: ,(#(-> % inc inc) 2)

18:09 clojurebot: 4

18:10 SegFaultAX|work2: andersf: That example is too trivial to be useful.

18:10 andersf: pweh

18:10 SegFaultAX|work2: ,(let [double-inc (comp inc inc)] (double-inc 2))

18:10 clojurebot: 4

18:11 SegFaultAX|work2: I guess the point is I don't yet associate composition with threading. Or rather, I don't think "should this use function composition or the threading operator?" They have different uses in my mind, perhaps wrongly so.

18:12 gtrak`: there's a bit fewer stack frames with threading when you can use it, that's probably not significant though

18:13 SegFaultAX|work2: gtrak`: Like, 1 fewer, right?

18:14 gtrak`: yes, I suppose so :-)

18:15 it feels like the same intent for me, but I find comp more awkward to use in practice, plus the left/right distinction

18:15 arrdem: why not k-1 for k composed functions? naively if I'm going to thread the return value of a function through k others I sequentially create stack frames for all K functions and eval from the top down

18:16 SegFaultAX|work2: arrdem: The extra frame comes from the function returned by comp

18:17 arrdem: ,(let [x (fn [a] (inc a)) y inc z inc] (x (y (z 1))))

18:17 clojurebot: 4

18:17 SegFaultAX|work2: arrdem: Eg h = (f . g) then we have 3 stack frames right? h g f

18:17 gtrak`: plus the composition is at run-time, so there's the cost of the closure

18:17 whenever it decides to get allocated

18:17 arrdem: push three frames pluss the let...

18:17 then reduce down

18:18 rufoa: ,(contains? (transient #{:foo}) :foo)

18:18 clojurebot: false

18:18 rufoa: ^ is this intended behaviour? note that 'get' works on transient maps, 'nth' on transient vectors, 'count' on all transient structures etc

18:18 gtrak`: so, (let [a (comp...)] ...) is worse than (def a (comp...))

18:18 amalloy: SegFaultAX|work2: haskell's tail calls surely mean that h = f . g doesn't consume three stack frames, right?

18:18 SegFaultAX|work2: amalloy: But this isn't haskell.

18:19 If tails calls can be eliminated, then it can happen in place, sure.

18:20 rufoa: That's strange indeed. I'd be curious to know why that failed.

18:20 rufoa: SegFaultAX|work2: https://github.com/clojure/clojure/pull/12 this perhaps?

18:21 i'm not familiar with the internals of clojure but it seems like the same issue

18:23 surma: Hey guys. I just did `(let [w1 w2 w3 :as words] (split line #"\s+") ...)` and words is bound to an vector longer than 3 items. How can I idiomatically bind the resulting vector?

18:24 tomoj: rufoa: http://dev.clojure.org/jira/browse/CLJ-700

18:24 gtrak`: surma: i think there must be a typo somewhere

18:24 SegFaultAX|work2: ,(let [[a b c & more] [:a :b :c :d :e :f]] (a b c more))

18:24 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: Wrong number of args passed to keyword: :a>

18:24 SegFaultAX|work2: ,(let [[a b c & more] [:a :b :c :d :e :f]] [a b c more])

18:24 clojurebot: [:a :b :c (:d :e :f)]

18:24 rufoa: thanks tomoj, didn't notice that

18:25 SegFaultAX|work2: surma: ^ Like that?

18:25 gtrak`: ,(let [[w1 w2 w3 :as words] (split line #"\s+" "hello how are you doing?")] words)

18:25 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: split in this context, compiling:(NO_SOURCE_PATH:0)>

18:26 gtrak`: ,(let [[w1 w2 w3 :as words] (clojure.string/split line #"\s+" "hello how are you doing?")] words)

18:26 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: line in this context, compiling:(NO_SOURCE_PATH:0)>

18:26 surma: ,(let [[w1 w2 w3 :as words] (clojure.string/split "hello how are you doing?" #"\s+")] words)

18:26 clojurebot: ["hello" "how" "are" "you" "doing?"]

18:27 surma: I want words to be ["hello" "how" "are"]

18:27 gtrak`: surma: doesn't work that way

18:27 surma: gtrak`: figured as much ^^

18:27 gtrak`: ,(macroexpand-1 '(let [[w1 w2 w3 :as words] (clojure.string/split "hello how are you doing?" #"\s+")] words))

18:27 clojurebot: (let* [vec__168 (clojure.string/split "hello how are you doing?" #"\s+") w1 (clojure.core/nth vec__168 0 nil) w2 ...] words)

18:27 emezeske: ,(let [[w1 w2 w3 :as words] (clojure.string/split "hello how are you doing?" #"\s+")] (take 3 words))

18:27 clojurebot: ("hello" "how" "are")

18:28 gtrak`: this is the expansion: (let* [vec__2006 (clojure.string/split "hello how are you doing?" #"\s+") w1 (clojure.core/nth vec__2006 0 nil) w2 (clojure.core/nth vec__2006 1 nil) w3 (clojure.core/nth vec__2006 2 nil) words vec__2006] words)

18:28 SegFaultAX|work2: surma: What are you trying to do?

18:28 gtrak`: you can see words is bound to the result of split

18:29 you can make a custom macro, or you can do [w1 w2 w3] or take 3.

18:29 surma: SegFaultAX|work2: Nothing really. I'm just playing around with ":as". Learning Clojure ;)

18:30 gtrak`: Okay. That's all I wanted to know. Thanks for the expansion. Gonna remember that in the future ;)

18:30 gtrak`: np

18:31 SegFaultAX|work2: Does loop..recur generate a trampoline internally?

18:32 gtrak`: SegFaultAX|work2: I just took a quick peek, it looks like loop generates one of these: http://asm.ow2.org/asm33/javadoc/user/org/objectweb/asm/Label.html so that should be a clue

18:33 doc says 'Labels are used for jump, goto, and switch instructions'

18:35 and in recur, there's a line, gen.goTo(loopLabel)

18:36 the compiler keeps the labels on a var stack, so that determines the recur target (I wonder if I could hack that ;-)

18:38 thorbjornDX: is it normal to cringe at python code after learning about a lisp?

18:39 vilonis: yes, which is strange because python code seemod so elegent before

18:40 technomancy: it's not technically required, but, you know...

18:40 * nDuff is writing Python this week, and it's downright painful.

18:40 hoover_damm: eventually you stop cringing at things and learn to just accept them as is

18:40 thorbjornDX: vilonis: I find myself thinking a helper 'function' that uses [].append is ugly

18:40 nDuff: ...soooo many places where a bit of nil punning, or a let, or real lambdas, or somesuch would save me extra lines.

18:41 thorbjornDX: hoover_damm: Yeah, I know that python/perl are good languages, and have their places

18:41 nDuff: yeah, I definitely hit the limits of lambdas today

18:41 tanzoniteblack: http://programmablelife.blogspot.com/2012/08/conways-game-of-life-in-clojure.html has a section at the bottom, where the clojure example is almost identically written in "un-idiomatic python", I find that's what my Python looks like quite a lot now a days

18:42 hoover_damm: thorbjornDX, :) I'm just an old Sysadmin who's never stopped evolving from shell into ruby into python into lisp into clojure.

18:42 thorbjornDX, it's just another tool to help :) win

18:42 one that I rather like

18:42 thorbjornDX: nDuff: and that helper function that I was doing had one of the notorious 'm = reobj.match(blah); if m is not None: l.append(m.groupdict())'

18:43 hoover_damm: I really want to incorporate some clj into my work, but I'm not quite there :p

18:44 hoover_damm: thorbjornDX, I found the absolute best way. Infrastructure management

18:44 technomancy: hoover_damm: pallet?

18:44 hoover_damm: nah

18:44 not cm

18:44 nor cmdb

18:44 nDuff: ...oh -- the other thing I really wanted today was partial

18:44 technomancy: what are those?

18:44 thorbjornDX: infrastructure management... hmm

18:45 hoover_damm: can you give me an example?

18:46 emezeske: nDuff: functools has partial

18:46 hoover_damm: technomancy, one of my clients runs on multiple infrastructure providers. We've taken on some burdons of our own that make our life fun. But to start just a lame restful/dashboard interface that you can query all the available servers, their status, credentials... reinstall it, manage provisioning status

18:46 technomancy: gotcha

18:46 hoover_damm: technomancy, i've reviewed many systems and basically they all end up opinionated

18:47 for us it starts with just basic ubuntu and being able to catalog and search our infra and have it pull data from 3rd party api endpoints

18:47 some own data collection as well for what you cannot get via api

18:48 and when your spending 500k on infrastructure a month people want it pretty ... yeah

18:49 and between currently 3 providers (1 virtual, 1 paas, 1 metal hosting)

18:50 nDuff: emezeske: Yes, but this was actually in a case where idiomatic Python was object-oriented, not functional.

18:50 emezeske: nDuff: I'm just saying, if you want partial, you can have it

18:51 nDuff: ...so, what I _really_ wanted was an easy way to create a subclass of an object with a default value for a constructor argument...

18:51 thorbjornDX: nDuff: can't you use a metaclass for that?

18:52 nDuff: Could, but anything more than 2 lines is too much code for too little benefit here. This was "sure would be convenient if..." thing.

18:52 thorbjornDX: nDuff: fairNuff

18:56 dnolen: can now decode SourceMapV3 http://github.com/clojure/clojurescript/blob/source-map/src/clj/cljs/sourcemap.clj

18:56 emezeske: nDuff: lambda *args: MyClass(42, *args)

18:57 dnolen: next step preserve line / col info for every emitted symbol and merge w/ this and create new source map.

18:57 emezeske: dnolen: high five!

18:57 tanzoniteblack: nDuff: you mean like this http://pastebin.com/c7gEQChX ?

18:57 dnolen: so maybe we can show off stepping in Chrome for Strange Loop?

18:57 emezeske: dnolen: That's such a big deal

18:57 dnolen: and all you hard core CLJSers can finally get a little bit of help w/ your simple & advanced compiled code

18:58 * nDuff ponders whether it's worth firing up a text-based browser

18:58 * nDuff really, _really_, *really* hates pastebin.com

18:59 tanzoniteblack: nDuff: http://paste.ubuntu.com/1178754/ is that better? I don't want to dump a bit of Python code here

18:59 nDuff: *nod*. I don't actually remember what I was doing at the time when "damn, this would be easier with a partial" went through my head

18:59 so I couldn't say with certainty whether that's an exact fit or not.

19:00 It _is_ a fairly compelling argument that I've gotten pretty far out of #python headspace, though.

19:00 thorbjornDX: i need to use *args more often

19:02 tanzoniteblack: nDuff: I have more of a problem of getting out of the python mind-set and into the clojure one; but considering how functional my python tends to be, it's less painful to do that then it is to code in Java

19:05 Frozenlock: I'm trying to run himera, but I run into this: Error: problem requiring leiningen.js hook Exception in thread "main" java.io.FileNotFoundException: Could not locate leiningen/js__init.class or leiningen/js.clj on classpath:

19:05 But I can see the 'missing' file, it's there!

19:06 gtrak`: I don't miss python really, clojure's more dynamic, transparent, and faster once you get past the initial learning.

19:07 I can jump into the source and have a good idea of what it's doing

19:15 Gnosis-: technomancy: I wrote a workaround macro for the slingshot bug we were talking about: https://www.refheap.com/paste/4783

19:16 I'm not sure it's useful to you or anyone but me, though

19:30 unlink: Is there a more concise expression for this: (split-with (comp (partial = method) :method) xs)

19:32 hyPiRion: unlink: Method is a local, right?

19:32 /s/Method/method

19:32 unlink: hyPiRion: yes, it is let-bound.

19:32 emezeske: unlink: Maybe (split-with #(= % :method) xs) ?

19:33 hyPiRion: emezeske: You mean (split-with #(= method (:method %)) xs), right?

19:33 unlink: No, using an anonymous lambda it would be (split-with #(= method (:method %)) xs)

19:33 hyPiRion: It's essentialy the same

19:33 emezeske: Oh, I misread the original, sorry

19:34 xeqi: (split-with #(-> % :method (= method)) xs) ?

19:34 not that it changes much

19:34 unlink: I was hoping for something similarly concise to: break ((== method) . _method)

19:34 hyPiRion: Do you need both parts?

19:35 unlink: Yes.

19:37 hyPiRion: Well, the closest other thing I can think of is (group-by :method xs), but it's more of a filter/remove thing.

19:38 unlink: Right, I like that too.

19:39 Thanks.

20:00 kjellski: is there a debug let? that prints all definitions? or something similar.... ?

20:03 emezeske: kjellski: I don't know the answer to your question, but there is a hack that I use occasionally to see things in a let:

20:03 ,(let [a 1 b 2 _ (println a b) c 3] (+ a b c)])

20:03 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: ]>

20:03 emezeske: ,(let [a 1 b 2 _ (println a b) c 3] (+ a b c))

20:03 clojurebot: 1 2

20:04 6

20:09 hyPiRion: I usually redefine prn to (fn prn [a] (clojure.core/prn a) a) - it's rather nifty for debugging.

20:10 So my way would be (let [a (prn 1) b (prn 2) c (prn 3)] (+ a b c))

20:10 Though I don't know if it's idiomatic - it's something I've dragged along from common lisp.

20:21 djanatyn: I'm having a lot of trouble getting clojure working on windows

20:22 casion: more information would be nice

20:22 djanatyn: I'm using clojure mode version 1.11.5, emacs 24, and Leiningen 2.0.0-preview10 on Java 1.6.0_11 Java HotSpot(TM) Client VM

20:23 sorry, was getting versions before I explained my issue :)

20:23 so, so far I've got lein working nicely, but I'm having issues with clojure-jack-in. when I try to connect I get this error:

20:24 (error "Could not start swank server: '$SHELL' is not recognized as an internal or external command, operable program, or batch file")

20:24 I'm using eshell, due to some restrictions on the computer I'm using

20:25 hyPiRion: djanatyn: Are you able to run "M-x shell" without issues?

20:25 djanatyn: nope, command prompt disabled :(

20:26 this is a school loaned laptop, and they have a few things locked down to prevent mischief.

20:26 is enabling the command prompt necessary to get clojure-mode working?

20:28 xeqi: you could try `lein swank` from the project and M-x slime-connect

20:28 djanatyn: ah, I see what's up. clojure-swank-command is set to "echo \"lein jack-in %s\" | $SHELL -l"

20:30 ...and also lein doesn't have swank. what is the preferred way to add plugins with lein 2?

20:31 xeqi: for swank, add {:user {:plugins [[lein-swank "1.4.4"]]}} to ~/.lein/profiles.clj

20:31 hyPiRion: .lein/profiles.clj I believe.

20:31 djanatyn: sorry, just did :) I'll try googling next time before asking

20:32 Raynes: Consider using nrepl.el instead of swank and SLIME.

20:32 swank-clojure is deprecated.

20:34 djanatyn: thanks Raynes! I installed nrepl and everything is working fine

20:34 kd4joa: swank clojure is still more stable than nrepl at this point. I'm sticking with it for now, but you are right nrepl is supposed to be the favored

20:34 I'll keep checking out nrepl and will make the move when it stops crashing so much

20:35 djanatyn: umm, hmm. perhaps I said that too soon.

20:36 kd4joa: give it a try and see how it works for you

20:37 most of the time it works great for me, but I've had a couple instances where it freaked out on me

20:38 and it is the tool that it sounds like people are going to spend their time on

20:38 hyPiRion: As long as you don't use paredit, you should be relatively fine. But it's pretty awesome at killing paredit's keybindings.

20:40 djanatyn: D: I love using paredit

20:41 also, I'm getting this error when I try to compile a file with C-c C-k: clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: EOF while reading string

20:42 hyPiRion: I'm using bodil's hack to get over it while waiting for a new version: https://github.com/bodil/emacs.d/blob/master/bodil-lisp.el#L55

20:43 djanatyn: ah, looks like someone else had the same error 3 days ago, and they released a new version of nrepl with a fix

20:44 brainproxy: good tutorial for learning how to use YourKit in combo w/ clojure and Eclipse

20:44 ?

20:50 arrdem: can someone point out what's wrong with the IO in this gist? for some reason it (read)s without end. https://gist.github.com/3561992

21:00 nvm got it

21:00 djanatyn: what was it?

21:01 arrdem: something with the way lein was bootstrapping the program. If I just `clj <foo.clj>` it works fine

21:02 probably a bug in my project.clj, but I don't really care since this is a script anyway.

21:06 dansalmo: How can I split a sequence like '(\b \o "F" \: \h \o) at the \:? I tried (split-with (partial = \: '(\b \o "F" \: \h \o) ) but it gives a '() split result.

21:07 (partial = \:)

21:09 djanatyn: alright, thanks guys! I've got nrepl and emacs set up, and I'll be able to use clojure at my school and in my stats class :)

21:16 kd4joa: stats class? very cool. what kind of stats class and how are you going to use it?

21:17 Raynes: kd4joa: What do you mean by 'crashing so much'?

21:17 kd4joa: it gets into the situation where when I switch to the nrepl buffer it throws an exception as soon as I switch to it

21:17 that's been the biggest problem

21:18 Raynes: Oh. The word 'crashing' confused me.

21:18 I thought you meant Emacs was actually crashing.

21:18 kd4joa: sorry. that was kind of a generic expression

21:18 I should have been more specific

21:19 Raynes: But yeah, I imagine all those little issues will be fixed soon.

21:19 For every nrepl issue, there are 15 that a new user coming to Clojure has with SLIME.

21:19 So I'm optimistic.

21:19 kd4joa: I'm sure they will since it's getting so much attention

21:19 yeah I am too. I do remember the pain of getting SLIME working

21:20 casion: getting slime working is pretty easy with 24

21:20 at least it was for me

21:20 Raynes: Yeah, an ancient version of SLIME.

21:20 That clojure-jack-in hacks into .emacs.d for you.

21:20 That is 15 different kinds of disgusting.

21:21 casion: that is true

21:21 but it works for the most part :)

21:26 gtuckerkellogg: dos nrepl.el have something analogous to slime-compile-defun yet?

21:27 Raynes: What does that do?

21:27 gtuckerkellogg: it compiles the top level form

21:27 I have it attached to C-c C-c

21:28 (or maybe that's how it comes in slime)

21:28 Raynes: gtuckerkellogg: C-M-x

21:28 gtuckerkellogg: nrepl readme has a list of commands.

21:28 nrepl.el readme, that is.

21:31 gtuckerkellogg: Tnanks Raynes :)

21:31 i apprently missed that one.

21:32 I was really happy to see output of evals in a clojure buffer are now sent to the repl

21:33 djanatyn: hmm, nrepl's auto-complete is really slow

21:33 I'm using ac-nrepl, which I found on marmalade. how do most people using nrepl handle auto completion?

21:35 ooh, never mind. I wasn't actually using ac-nrepl, and now it's a lot faster.

21:38 xeqi: kd4joa: for reference, theres an issue for that at https://github.com/kingtim/nrepl.el/issues/86

21:50 Frozenlock: Why does lein throw an error when trying to run himera? Apparently it has something to do with leiningen.js (not on classpath?!) I'm pretty sure it has to do with this --> :hooks [leiningen.js]

21:50 (from https://github.com/fogus/himera/blob/master/project.clj)

21:52 holo: hi

21:54 cjfrisz: Man... I really want nrepl-jack-in to do stack traces like swank-clojure

21:54 I really like everything else about it, but the stack trace handling kills me

21:54 djanatyn: hmm. does anyone know where I'm supposed to put incanter.jar?

21:55 I tried installing it with lein, but apparently there's a mongodb jar it can't find

21:56 also, I think the incanter blog with all the howtos is down :(

22:07 hugod: cjfrisz: ritz-nrepl does that

22:11 Raynes: hugod: Why is your stuff not going into nrepl proper?

22:12 hugod: Raynes: because it adds a ton of stuff, and means you use two jvm processes

22:12 Raynes: Bleh

22:13 hugod: it also shares common code with the swank version of ritz

22:15 Raynes: so the answer is, it was easier to do like that. I have nothing against putting parts of into nrepl/nrepl.el

22:21 gtuckerkellogg: djanatyn :(

22:28 cjfrisz: hugod: Is it a pain to install?

22:28 The github page made it sound like a pain

22:30 jasonjckn: amalloy: have your patches for reducers been comitted yet?

22:31 amalloy: no

22:31 jasonjckn: amalloy: k, i'll revisit mine when yours are in

22:32 i was busy for a while, but i guess you've been blocked on rhickey and I didn't miss too much

22:32 i'm on the contributors list merely by signing the agreement, i guess my work here is done ;) jk

22:46 SegFaultAX|work2: I want to filter a map to only keys where the values match a given predicate, what's the best way to do that?

22:55 technomancy: jkkramer: I have clojuresphere working with clojure 1.4 and the latest compojure stack

22:56 jkkramer: technomancy: whoa cool. I was just sitting down to see about refreshing the data

22:56 technomancy: I punted on the github section though

22:58 jkkramer: have you seen drawbridge?

22:58 I could add this in too: https://devcenter.heroku.com/articles/debugging-clojure

23:00 jkkramer: technomancy: I've seen it. I've generally shied away from plugging a repl into a live site but no harm in having the option I suppose

23:01 technomancy: jkkramer: actually probably not much point right now since there's basically no difference between dev and production

23:02 tmciver: SegFaultAX|work2: how about (into {} (filter your-val-pred your-map))

23:03 technomancy: jkkramer: sent a pull request for my modernize branch

23:03 you may want to do your refresh first since I haven't tested the switch to tentacles

23:03 tmciver: SegFaultAX|work2: your-val-pred would have to call (val %) at some point.

23:07 technomancy: jkkramer: if we're going to swap the storage out for another backend that might make sense to do first, don't you think?

23:07 jkkramer: technomancy: merged. going to futz with the github code anyway before refrsh

23:07 technomancy: ok, cool

23:08 I figure a different backend would probably be fairly high-impact; the kind of thing you'd want to do sooner rather than later?

23:08 jkkramer: I wonder how accurate this is… https://api.github.com/legacy/repos/search/project.clj?language=clojure. can't search for empty keyword, and it doesn't say what it searches

23:08 clj_newb_3802: so I've written an app in clojurescript, because I hate the java graphics api

23:09 now my question: is there a way to bundle this application as a desktop applicatino somehow?

23:09 technomancy: jkkramer: it's not very big

23:09 oh, it's paginated

23:09 hm

23:09 jkkramer: technomancy: possibly yeah. Have to wrap my head around the code & data again. it's been a while

23:09 right

23:12 searching for clojure yields 88 pages of projects… https://api.github.com/legacy/repos/search/clojure?language=clojure&start_page=88. That seems to be the best to be gotten through the API

23:12 technomancy: nice

23:41 cjfrisz: I love ripping out my own code

23:41 So much fun

23:50 john2x: hmm, how do I call a function which is (defn)'d after the function calling it?

23:51 tmciver: john2x: declare? ##(doc declare)

23:51 lazybot: ⇒ "Macro ([& names]); defs the supplied var names with no bindings, useful for making forward declarations."

23:52 john2x: ah thanks!

Logging service provided by n01se.net