#clojure log - Nov 15 2013

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

0:01 swarthy: I'm confused by #'x, i see that it expands to (var x). Is (var) something like a pointer to an object?

0:02 bitemyapp: swarthy: yes but vars are transparent when used.

0:02 swarthy: vars are how you create references to values

0:02 swarthy: symbols are how you name vars.

0:03 swarthy: vars and symbols used to be a singular concept in Common Lisp, Hickey had to separate the two in order to make Lisp-1 + full macros work.

0:04 swarthy: so this is the seperation of identity and value then? (def x 4) thus x == 4 and (var x) == x itself

0:04 do I understand that right?

0:04 bitemyapp: well, identity traditionally has been "are these the same pointer?"

0:05 pretty sure vars are isomorphic in this case, vars are equal if they share the same value, and they're only identical if they're the same var.

0:06 but they don't have to actually *SHARE* the same value, just *BE* the same value.

0:07 swarthy: i see. So this would be used in something like STM maybe. To check if the new and old are the same value before committing the identity of the var to its new value.

0:07 i'm trying to understand why something like this exists

0:07 ambroseb_: Ember-: danneu: core.typed has nothing to do with how generic your code is. It catches type errors in your code, no matter what abstraction level you use.

0:08 swarthy: bitemyapp: I'm coming from here: http://mmcgrana.github.io/2010/08/clj-http-clojure-http-client.html very last item (def request...)

0:08 bitemyapp: wondering what the #'core/request signifies

0:08 TimMc: swarthy: A var is a mutable pointer; a symbol is the name of a var. (Symbols don't *have* to name vars, of course.)

0:08 bitemyapp: swarthy: that's indirection so it doesn't retain the original value

0:08 swarthy: so you can dereference it upon use

0:09 * swarthy has mind blown.

0:09 bitemyapp: swarthy: often needed for things like app reloading...

0:09 swarthy: think about it, without indirection, how can you swap things out so your server uses the new handler code?

0:09 vars are why you can overwrite/monkeypatch arbitrary data.

0:09 even if you shouldn't abuse that as a first-order programming methodology.

0:10 swarthy: is it all beginning to come together now?

0:10 swarthy: yes it is more tangible at least

0:10 thanks!

0:10 bitemyapp: swarthy: you have a REPL. Take your weapon, strike down your unknowns.

0:10 swarthy: test it!

0:10 swarthy: experiment!

0:12 swarthy: ah i see. (def x 5) (def y #'x) (println @y)

0:20 TimMc: (inc bitemyapp)

0:20 lazybot: ⇒ 12

0:25 sshack: Can anyone here help me out with a simple clojure problem.

0:26 Adeon: only after you present your simple clojure problem

0:26 sshack: I've got a leon project with a few different files. foo.bar, foo.baz. I run a leon repo and it loads foor.bar namespace, but then I cannot access foo.baz namespace no matter what I try.

0:27 foo.baz/quux (use 'foo.baz) both spit out errors.

0:28 I am clearly missing something. Can anyone give me some pointers?

0:28 swarthy: What are the errors?

0:37 sshack: Exception lib names inside prefix lists must not contain periods clojure.core/load-lib

0:39 swarthy: paste the code you are tyring to run/execute and the error on refheap.com. I'm still new myself so I'll need to see as much as possible to help

0:45 sshack: this may be helpful to you - http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html

0:47 sshack: See, even what I think are fully qualified function calls don't seem to work.

0:47 swarthy: so you 'lein new myapp' then cd myapp then 'lein repl' (+ 1 2)

0:48 do you get 3?

0:48 sshack: Yeah. It's only my own functions that have this problem.

0:49 swarthy: where have you saved these files? When you (use) or (require) those files in they need to have a (ns) declaration that co-responds to the directory structure. And that directory structure needs to be on your java classpath.

0:49 sshack: myapp/foo.clj

0:50 erm src/myapp/foo.clj

0:51 https://www.refheap.com/20900

0:52 https://www.refheap.com/20901 <- With code this time.

0:54 swarthy: I don't think your testapp.foo is compiled.

0:54 I'm trying to figure out how to do that at the repl.

0:55 try (compile 'testapp.foo)

0:55 then what you did before

0:57 sshack: Okay, now that is stupid.

0:59 So why do I have to compile this?

0:59 swarthy: Clojure is a compiled language.

0:59 but also try (use 'foo.bar :reload-all)

1:00 replace foo.bar with what you have

1:00 sshack: And why wasn't that mentioned in any tutorial somewhere?

1:00 swarthy: You should use LightTable when you are first getting started.

1:00 It will make working with it all super easy.

1:02 The way clojure works is that you write a mystuff.clj which gets compiled to a series of .class files. .class files are what the JVM uses for bytecode. Doing all of this manually at the repl is a pain. So most people use Emacs or some other editor to do it for them. I suggest LightTable again, it is free and very easy to use.

1:02 You just open your project folder. then press ctrl-enter to evaluate your code

1:02 and the results show up right next to it

1:02 sshack: I'm still missing something as I know I've done this in the past.

1:02 Yeah, I know about lt.

1:03 swarthy: What do you know you have done?

1:04 sshack: Loaded all my code and called functions in a different ns.

1:07 swarthy: you could (require 'myapp.foo) then (myapp.foo/bar x) should work

1:08 or (require '[myapp.foo :as foo]) then use (foo/bar x)

1:11 `cbp_: why is haskell so hard lol

1:12 worst syntax ;-;

1:17 danneu: i could never find a good workflow with haskell

1:17 especially when i'm used to evaluating the line i'm looking at in a file with cloclo

1:23 brainproxy: cloclo?

1:23 sshack: swarthy Right. So my problem seems to come down entirely to my code vs others code.

1:24 I can use/require other peoples code and iw works perfectly. But clojure seemingly just won't find my code at least at the repl.

1:24 But that's enough for tonight. I"m starting to make mistakes.

1:25 swarthy: yeah, ask tomorrow during the day. More experienced people will be around and I am sure they can sort you out!

1:41 bitemyapp: arrdem: alright, Linux machine gets a monopoly on the KVM for awhile, I need to get some work done ^_^

1:41 arrdem: stealing your idea (mostly)

2:16 Ember-: ambroseb_: yes, I know that

2:16 but type checking can do sanity checking for you

2:17 if your function just wants map as a parameter and nothing else will do then type checking is way to go

2:17 and that was the original problem mentioned

2:18 that guy was worried that if he writes more clojure code into single codebase he will lose track of what his functions should take as parameter

2:18 and I tried to tell him that he needs to change the way he thinks about his function signatures in general

2:18 but there are cases when you need to be explicit and that's a great place for either contracts or typed clojure

2:19 where typed clojure of course is way more comprehensive choice

2:45 ambroseb_: Ember-: I don't understand the thinking that just because we're in a dynamic language most of our functions should have some defined behaviour for any parameter type. I'd say the overwhelming majority of functions (both library & user defined) have more specific types than Any as parameters, so it's a valid concern to lose track of this information.

2:45 whether these functions blow up or have undefined behaviour on weird input is another matter

2:51 bitemyapp: ambroseb_: interfaces that actually need to handle such a thing usually break out into discrete type dispatch eventually anyway

2:52 Ember-: ambroseb_: I agree what you say, maybe I expressed myself badly

2:52 bitemyapp: there's a pretty narrow range of things that truly dynamic functions can express that are awkward in a static type system and that range gets narrower by the year.

2:53 Ember-: what I was trying to say that it is a *good* thing to be able to accept many different *datastructures* if that's what your function takes

2:53 when it makes sense

2:53 and in clojure world you usually want to pass around datastructures

2:54 when I've taught Clojure for Java programmers I've noticed that is the no. 1 problem they are facing

2:54 they have hard time to grasp the fact that in Clojure you want to operate on data structures, not on some specific types containing your data

2:54 bitemyapp: Ember-: that doesn't actually happen very often.

2:54 at best, you're writing functions for data that is vaguely "mappy" or vaguely "iterable"

2:55 these are concepts trivially reified in a static type system that isn't made of ass and fail like Java's

2:55 Ember-: bitemyapp: true, but that doesn't mean that isn't a good thing when it's possible

2:55 bitemyapp: then when somebody passes a "mappy" thing or "iterable'ish" thing to your function that doesn't satisfy all of your constraints, you can fuckin' fix it instead of getting cryptic exceptions.

2:56 Ember-: you get a lot more mileage out of knowing things than you do not knowing things.

2:56 Ember-: of course

2:56 bitemyapp: Ember-: dynamic type systems are like wearing a blind fold so that when you scoop food out of random bowls into your mouth you don't have to know what you're eating

2:56 Ember-: like I said, I expressed myself badly obviously

2:56 bitemyapp: Ember-: there are many wonderful things about Clojure, none of them have to do with having a primitive type system.

2:57 Ember-: and that must be the reason why I said typed clojure is great, right?

2:57 I *do* know all of these things

2:57 bitemyapp: this conversation isn't for just you and I

2:57 sometimes I expound on things just to disseminate ideas

2:58 same reason I tweet things.

2:58 Ember-: I've written clojure professionally and while doing that I've faced situations where I want to be extremely strict about the parameters my function can take

2:58 but I've also faced situations where all I care is some little thing in the parameter and rest can be whatever

2:59 the latter has *always* been more generic and used in more places

2:59 bitemyapp: you always care, it's just a question of how much you're thinking about it

2:59 the only time you truly don't care about your parameters or data you're using is when you're not actually using them

2:59 Ember-: yeah, if you don't care then you don't need that function

2:59 bitemyapp: you're always relying on *something* to be true

2:59 the question is how specific and well thought out those things are

3:00 Ember-: yes, but my original statement comes from the guys coming from static typed world

3:00 especially java guys

3:00 bitemyapp: java doesn't represent anything good or interesting about static type systems

3:00 Ember-: since they just can't think that's a real option to *not* be *completely* strict

3:00 bitemyapp: Java as a language is a vehicle for hate, fear, and human misery.

3:00 Ember-: hehe

3:01 it has many, many things done wrong

3:01 but it is better than some alternatives :)

3:01 take PHP for example

3:01 or C++

3:02 everything is relative to where you compare it

3:02 if you compare java to clojure or haskell then yes, I agree with you completely

3:03 bitemyapp: Clojure doesn't meaningfully have a type system, so it doesn't belong on that spectrum.

3:03 Ember-: especially to haskell since we were talking about static typing

3:03 bitemyapp: Clojure has a type system like a bald man has a hair style.

3:04 Ember-: but this conversation is pointless, we obviously think likewise

3:04 I need to work :P

3:04 bitemyapp: Ember-: I need to write Haskell code, soothe my soul :P

3:05 Ember-: bitemyapp: feel sorry for me, I'm writing Java

3:05 my last project was with Clojure :(

3:05 oh, and it's a legacy system

3:05 bitemyapp: Ember-: I'm sorry to hear that. My current project (wrapping up right now) at work is in Clojure, next one is likely to involve Clojure but I can't be sure how much.

3:05 Ember-: so, legacy system written in Java

3:06 bitemyapp: There's some legacy at my company, but it's Python and a startup so only so much pain is possible.

3:06 Ember-: I've tried to convince the customer that certain parts would make sense if it was in Clojure (which it would)

3:06 but they think that's something bad and hipster

3:06 same as they think WebLogic is great

3:07 even though I presented them with arguments that it isn't and it's actually just costing them a lot of money for nothing

3:07 and making our lives more miserable

3:07 bitemyapp: Ember-: you need to find a new customer or rejigger that relationship yo.

3:07 Life is too short to write Java.

3:07 Ember-: fortunately I get out of this project by the end of the year

3:07 bitemyapp: Good.

3:08 Ember-: my current life improvement goal is getting out of the bay area. I've heard good things about Seattle, Portland, and Austin.

3:08 I don't know how soon a departure could happen, it's looking like a 1-2 year goal.

3:08 Ember-: well, I live in Finland :)

3:09 bitemyapp: Ember-: I don't know if I would be very happy working as a programmer outside of the US.

3:10 I guess there are some Haskell and Clojure companies outside of the US, but it can be harder to find.

3:10 Ember-: bitemyapp: very true

3:11 but fortunately in Finland Clojure is raising it's head *hard*

3:11 quite a many companies have either started using it or are considering

3:11 Haskell is still in minority

3:11 bitemyapp: Ember-: JVM host for Clojure helping there I imagine?

3:12 I think people overestimate the usefulness of being on the JVM, personally, but if it sells it sells.

3:13 TEttinger: bitemyapp, it's been a pretty huge selling point for me, since I learned Java before any lisps

3:14 it does let me back into comfortable mutable java libs for tasks where that makes sense

3:14 bitemyapp: TEttinger: I came to Clojure from Python and learned Haskell concurrently. The JVM was a wash for me. It seems to have helped bootstrap some libraries more quickly, but a lot of the libraries have ugliness hiding under the covers.

3:14 TEttinger: yes.

3:15 bitemyapp: I could name a few that have given me grief as a result

3:15 TEttinger: but would it be better anywhere else?

3:15 bitemyapp: TEttinger: Python and Haskell's libraries were typically a clean break except in the case of some underlying C, pretty happy with that.

3:16 TEttinger: my only real issue with clojure on the JVM is that a significant group of end users do not have any sort of java installed, and bundling a JVM is ugh.

3:16 bitemyapp: Another reason I'm meh about the JVM is that I really like having fast-starting binaries.

3:16 or scripts.

3:16 TEttinger: that too.

3:17 bitemyapp: I do a lot of odd-and-end scripting/automation/binary distribution/dev-opsy stuff

3:17 Clojure is...not great for that.

3:17 I end up setting up a REPL and trying to do what I need to do in "batch"

3:17 which works okay up to a point, but it's not really what I want.

3:22 Ember-: bitemyapp: indeed, that's the reason

3:22 and the fact that you can call java code from clojure easily

3:22 so there's an existing ecosystem

3:23 sure, a lot of java code is so bad when you think it from clojure side of things that you don't *want* to call it

3:23 but that is a compelling argument anyway for management

4:30 ambrosebs: isn't the docstring for iterate incorrect?

4:30 ,(doc iterate)

4:30 clojurebot: "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"

4:30 ambrosebs: (class (iterate + 1))

4:30 ,(class (iterate + 1))

4:30 clojurebot: clojure.lang.Cons

4:30 ambrosebs: that's not a LazySeq

4:33 the implementation looks fishy

4:33 (cons x (lazy-seq ...)) vs (lazy-seq (cons x ...))

4:34 second arity of reductions has the same problem

4:40 Cons is just as lazy as LazySeq right?

4:40 so this is probably not a problem.

4:41 from a typing perspective, I'm not sure what to give the return type of iterate as

4:41 I guess ISeq or ASeq

4:41 in fact LazySeq sounds optimistic for *any* sequence operation return type

4:42 like Cons, LazySeq is just an implementation of ASeq

4:44 clgv: ambrosebs: no. you are right. cons is not lazy. the first element of that sequence is already realized

4:44 ambrosebs: clgv: well it's already realised by passing to iterate.

4:44 but yes

4:45 clgv: ambrosebs: yeah that's true. but we are arguing about the properties of the return value

4:46 ambrosebs: I wonder if that is supposed to be some (pre-mature?) optimization

4:46 ambrosebs: clgv: it seems unlikely, the first arity of repeat has the same idiom but backwards

4:47 I think it's just an unintentional inconsistency. The big question for me: what does the documentation mean exactly by "returns a lazy sequence".

4:47 clgv: ambrosebs: well, than I'd regard it as an error but with most likely no practical implications

4:48 ambrosebs: the documentation clearly shoots for the behaviour repeat exposes

4:49 ambrosebs: There are Seqs that are never lazy at all right? So a "lazy sequence" must mean a LazySeq I guess

4:49 I mean, a partially lazy Cons is even incorrect, but yea.

4:50 Hmm actually is there an implementation of ISeq that is eager?

4:51 probably not relevant.

5:10 clgv: ambrosebs: yes. PersistentList implements ISeq ;)

5:11 ambrosebs: clgv: :)

7:08 djpowell: Hmm, sourcemaps don't work on Windows, under advanced mode, or various other combinations of options

7:09 Seems to be to do with the relative path munging and backslashes and stuff

8:08 jamiei_: Does anyone know how to set the series labels for a multiple series time series chart with incanter? Setting the :series-label property does not produce the outcome I expect.

8:56 danielszmulewicz: IRC is quiet because everybody's at the clojure_conj?

8:56 :-)

8:56 jealous

8:56 Ember-: no, I'm cursing Java code

9:00 mdrogalis: danielszmulewicz: Correct.

9:01 danielszmulewicz: mdrogalis: :)

9:04 clgv: danielszmulewicz: it's wakeup time for those in GMT - 8 I guess ;)

9:06 danielszmulewicz: Oh right. I always forget

9:30 ambrosebs: is it clojure_conj because it sounds like conf, or (into conference people) ? :)

9:31 cark: because it's conj'ing people together ?

9:31 mdrogalis: Hah, ambrosebs

9:31 echo-area: Which http client would you suggest? http-kit, clj-http, or http.async.client?

9:32 ambrosebs: cark: (into conference people) is the same as (apply conj conference people) :)

9:32 cark: if a little obfuscated !

9:34 you know what, i never used conj with more than one item to be conj'ed

9:34 didn't even know it was possible

9:34 been using clojure since before 1.0

9:34 ...

9:35 mdrogalis: I recently learned you can do:

9:35 ,(assoc [1 2] 0 3)

9:35 clojurebot: [3 2]

9:35 mdrogalis: Had no idea assoc could do that.

9:35 cark: ,(get [1 2] 1)

9:35 clojurebot: 2

9:36 cark: i'd say it's vectors that can do it

9:36 mdrogalis: You get my point :P

9:36 cark: hehe yep

9:38 philandstuff: vectors are Associative

9:42 clgv: ambrosebs: no, `into` uses transients and is more efficient ;)

9:42 ambrosebs: I thought the "conj"ing together people might be the reason...

9:43 ambrosebs: is there a "clojure cons" in front of the toillets at "clojure conj"? ;)

9:44 ambrosebs: clgv: :)

9:47 Aim_Here: The "clojure dissoc" happens when people decide to form squabbling factions and excommunicate each other from the Clojure community

9:47 cark: disj !

9:48 mdrogalis: Heh

9:53 uruviel: Hey, what would be the good way of matching rules for unknownly deep maps with core.logic? Say unify ?p with {:foo {:bar {:baz p}}} or {:foo {:baz p}}

9:56 ambrosebs: uruviel: sounds like a recursive conde? it's been so long since I've used core.logic, that's all I've got :)

9:57 hiredman: uruviel: I like recursive goals with feature rec, I assume you are matching something tree like, like the output of clojure.xml/parse

9:59 arrdem: echo-area: clj-http is what I see getting the most use... but they all do the same job.

9:59 uruviel: ambrosebs: thank, I'll take a look. basically what I'm after is that I have some input map (from XML or JSON) and want to trigger some rules based on "what kinda looks like" (i.e. I'd like to be as ignorant as possible about the structure of the data)

9:59 *thank you

9:59 echo-area: arrdem: I got the same idea on a stackoverflow page. Thank you!

9:59 uruviel: I thought core.logic might be an interesting fit, I looked into core.match but it doesn't seem to handle nested maps that well

10:14 hiredman: is there some documentation on recursive goals somewhare? (been a while since I did logic programming, and even that was in prolog)

10:35 mikerod: why are dynamic bindings in `binding` bound in parallel as opposed to sequential, like `let`

10:35 I'm just curious in the motivation in working opposite to `let`

11:02 technomancy: mikerod: IIRC it's only possible to do it efficiently for let

11:05 zerokarmaleft: hmm, wouldn't it have more to do with the difference b/w binding and let wrt lexical scope rather than efficiency?

11:06 technomancy: IIRC to do it efficiently dynamically you have to push bindings as a whole

11:06 because binding macroexpands to push-thread-bindings?

11:10 zerokarmaleft: technomancy: yea, all the value-exprs-to-be-bound have to be evaluated before push-thread-bindings

11:24 clgv: it is amazing how badly you miss clojure when you have to use R to extract data from their binary "Rdata" format...

11:26 mikerod: so it is just more efficient to push-thread-bindings in bulk?

11:27 pjstadig: there are some sticky issues with popping bindings if you push them one at a time

11:27 like if you get an exception poping one of the bindings, then what do you do with the rest

11:28 but probably it's more to do with efficiency i guess

11:30 technomancy: it's actually more surprising to me that you *can* let-bind efficiently one at a time

11:47 mikerod: interetsing

11:47 interesting*

11:49 danneu: Adding a slight background and underline to clojure function-names in definitions is life-changing

11:51 mikerod: danneu: visually?

11:51 danneu: http://i.imgur.com/Cen1sIG.png

11:52 no more hunting for the fn name

11:52 mikerod: yeah, that makes it a bit more obvious

11:53 danneu: might even make it <marquee>

12:15 putting tests in ^{:test _} meta is also pretty awesome in the early stages of a project. that way functions are portable in a time when you're not yet sure how you're going to actually split up namespaces or what your abstraction will look like

12:15 (while my monologue is on the subject of recent things i've started doing)

12:17 feel free to siphon some of my awesomeness into your own projects.

12:17 plenty to go around

12:17 xificurC: hi i'm trying to install cider for emacs 24 on slackware 14 with no luck. package-install throws an "Error during download request: not found" and el-get-install doesn't show cider as an option, only nrepl

12:18 technomancy: xificurC: nrepl.el from marmalade still works well

12:19 xificurC: technomancy: so theres no need to go for cider? I was out for a couple of months

12:21 danneu: xificurC: id just roll with nrepl

12:22 technomancy: I don't think there's any need to switch unless there's a specific bug you're running into that's been fixed in the past few weeks

12:22 xificurC: I remember now that I couldnt get nrepl working well on this machine before, sigh

12:23 i think the best i could do was run an nrepl session via leiningen and then jack in

12:23 nope, I dont have leiningen, must have been another machine.. and leiningen wont install either

12:24 danneu: i dont think that's so painful a workaround if you really have to do that

12:24 as long as everything's operational after that like nrepl-eval-buffer

12:24 technomancy: I doubt cider will have fixed that

12:25 danneu: xificurC: what would actually happen when you'd nrepl-jack-in?

12:25 xificurC: danneu: that aws on a different machine, i have bigger problems here :)

12:26 gosh im a noob at slackware

12:28 danneu: you must be pretty patient if youre willing to set up a development environment on an OS you're not so familiar with

12:28 xificurC: ill have to update jdk first but the tarball md5sum is failing

12:29 arrdem: danneu: he'll fit in nicely... as evidenced by chord we have the patience of saints here.

12:29 xificurC: danneu: i got clojure or common lisp running on slackware,win xp, win 7 and maybe even pcbsd

12:31 so you cant wget jdk, thats a nice one

12:31 danneu: arrdem: good point

12:32 xificurC: that explains the md5sum failure and why the jdk tarball had 175kB. A small implementation indeed

12:33 danneu: i dont know why i so quickly dismissed the wooly yaks that graze on the plains of OS idiosyncrasies

12:34 xificurC: and I already have 2 jdks on my machine, how brave of me

12:35 shouldnt leiningen compile on 7u21?

12:38 * arrdem contemplates a mural of such yaks

12:40 xificurC: how can i uninstall a previous version of nrepl?

12:41 mpwd: xificurC: Maybe try rm -r the offending directory in ~/.m2/repository/

12:42 Does anyone know the fastest JSON parsing library for clojure?

12:43 mtp: is json parsing a measurable bottleneck in your code?

12:43 until that is 'yes', i wouldn't bother fretting over finding the fastest one

12:45 indigo: Oh PHP https://www.refheap.com/20921

12:45 notsteve: mpwd: have you tried the clojure version? https://github.com/clojure/data.json it's a pretty save bet

12:46 indigo: mpwd: Cheshire is pretty good too https://github.com/dakrone/cheshire

12:51 arrdem: indigo: .... WTFPHP

12:51 indigo: arrdem: I know right

12:52 arrdem: indigo: it's great because I can't even justify it at all. I'm really really curious why that's the case.

12:54 indigo: arrdem: Yeah... I have no idea as well. Maybe some backwards compat crap?

12:55 Maybe I should ask in ##php

12:55 :P

12:56 S11001001: arrdem: null converts to 0

12:57 oh, no, that doesn't make sense.

12:58 `cbp: anyone using http-kit websockets, i use the .toString method on channels to log connections but sometimes I get clients like #<AsyncChannel 0.0.0.0/0.0.0.0:8080<->null> why would that be

13:10 indigo: arrdem: I asked and they just redirected me to the comparisons operator page :|

13:11 S11001001: indigo: they probably did you a favor; the php docs are about the only sane thing in php land

13:11 mpwd: mtp: No, but we are using it for serialization and there are several libraries, so I just wanted the fastest. I figure I'll just go with cheshire

13:11 indigo: Hehe yep

13:11 arrdem: S11001001: haha yeah that's why I'm entertained by this.

13:12 indigo: is nil < -Inf ?

13:13 indigo: arrdem: For which language

13:14 S11001001: arrdem, indigo: ah, I see. The 2nd case is applicable: left operand is null, right is anything: convert to bool, false < true

13:14 arrdem: indigo: php

13:15 S11001001: okay. that makes sense at least.

13:15 indigo: arrdem: True

13:17 arrdem: ,(#'clojure.pprint/cl-format "~b" -1)

13:17 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve var: clojure.pprint/cl-format in this context, compiling:(NO_SOURCE_PATH:0:0)>

13:17 indigo: I was all "nil.. Ruby? Clojure?"

13:17 arrdem: ,(do (use 'clojure.pprint) (cl-format "~b" -1))

13:17 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long>

13:19 xificurC: so it only took an hour or two to get nrepl running

13:19 arrdem: ,(do (use 'clojure.pprint) (cl-format nil "~b" -1))

13:19 clojurebot: ping

13:19 clojurebot: "-1"

13:19 PONG!

13:19 devn: anyone know where exp and pow come from in overtone?

13:26 `cbp: yogthos: hi

13:35 upwardindex: Any way to make git a little bit more smart with sexps ?

13:38 joegallo: http://wandrian.net/2012-03-11-1727-custom-git-hunk-headers-for-lisp.html this is useful

13:38 it's just a minor improvement, though

13:39 there are also some command line flags you can use to ignore whitespace changes, which make it easier to deal with the addition of a wrapping form that changes indentation on a bunch of lines

13:47 upwardindex: joegallo: thank you that will help a bit

13:50 pjstadig: upwardindex: i find this useful

13:50 i forget what it does https://github.com/pjstadig/new.dotfiles/blob/master/.gitconfig#L23

13:51 it helps git find a useful chunk of text to show at the top of a diff

13:51 http://stackoverflow.com/questions/3409526/customizing-headings-in-git-diff

13:51 joegallo: yeah, technically what pjstadig has is the same setup as i have.

13:52 which is an amazing coincidence

13:52 pjstadig: haha, yeah that is an amazing coincidence

13:52 if only i actually read chats before i opened my big mouth

13:56 joegallo: heh, no worries, brotha

13:56 * pjstadig brohugs

13:57 arrdem: didn't someone put together a custom git frontend that actually stored Clojure code structurally rather than textually?

13:57 woulda sworn I saw that on HN a few months ago...

13:58 pjstadig: arrdem: don't know. rich did codeq

14:01 bitemyapp: arohner: that was Codeq which is built on Datomic.

14:01 errr...arrdem ^^

14:02 arrdem: also Seangrove made a web frontend to that I believe.

14:02 arrdem: bitemyapp: ah. that makes sense.

14:02 bitemyapp: arrdem: https://groups.google.com/forum/#!topic/clojure/Fs6AHk5hA_k

14:02 arrdem: I really want to play with that...

14:02 bitemyapp: arrdem: http://blog.datomic.com/2012/10/codeq.html

14:03 arrdem: so go play with it

14:03 arrdem: soo many yaks so little time..

14:04 danenania: does the closure compiler munge object keys created with (js-ob)? getting an error only in advanced mode that seems to be caused by munging

14:05 if so, is there a way to stop it doing so? can i annotate string keys with ^:export?

14:06 apparently i can't annotate string keys

14:08 bitemyapp: danenania: don't do that.

14:08 danenania: wait, nevermind, you're doing something else, sorry.

14:11 seangrove: arrdem: Not perfect, might be fun for you to play with http://www.jidaexplorer.com/

14:12 * seangrove is thinking CodEqsplorer might have been a better name

14:12 arrdem: seangrove: haha thanks for the link

14:12 seangrove: ... or Codeqsplorer

14:13 arrdem: idk. I feel like structural version control is a good thing, and I also have this feeling that issue tracking and version control should be integrated into a single system.

14:13 technomancy: arrdem: I've read a bit about it, but last I checked all the research in the area of tree-aware version control was around XML =\

14:14 arrdem: vc backed support for literate as long as I'm dreaming...

14:14 seangrove: danenania: I don't think that closure will munge string keys

14:15 danenania: seangrove: just discovered that apparently it does unless using aset/aget http://squirrel.pl/blog/2013/03/28/two-ways-to-access-properties-in-clojurescript/

14:15 arrdem: technomancy: that's most unfortunate...

14:15 technomancy: indeed

14:16 seangrove: danenania: Very interesting, I was just looking at the implementation of js-obj, but that explanation makes sense

14:17 bitemyapp: arrdem: issue tracking is a workflow issue and people are too persnickety about it. Version control should be neutral territory.

14:17 arrdem: "complecting" things together instead of making composable tools isn't the answer.

14:18 Having too much shit rolled into the same thing is part of what made Fossil terrible.

14:18 seangrove: arrdem: I agree with bitemyapp, but I would very much like to see what a structurally-aware vc looks like

14:18 bitemyapp: structurally aware VC would be great, I just don't think you need to throw JIRA into it.

14:19 seangrove: Yeup.

14:19 arrdem: bitemyapp: I guess so. Really all I want is an issue tracking system that integrates nicely with my entirely emacs/zsh based workflow. The real answer is probably to just run a $ROOT/.git and an ignored $ROOT/issues/ with a seperate .git...

14:19 bitemyapp: arrdem: that's org-mode dude.

14:20 seangrove: Hrm, pondering storing edn in a postgres field vs figuring out how to use the native hstore...

14:20 technomancy: bitemyapp: only if you want to get issue reports from emacs users only

14:20 "it's a feature, not a bug"

14:20 arrdem: ^ this

14:20 wait. no. ^^^ that.

14:20 bitemyapp: I didn't know other people were a prerequisite.

14:21 technomancy: bitemyapp: spoken like a bona-fide CL hacker!

14:21 bitemyapp: seangrove: is it a simple KV query pattern or do you need to query the contents?

14:21 technomancy: well, I legitimately didn't know arrdem needed anybody but himself to use his issue tracking.

14:21 technomancy: bitemyapp: maybe I'm projecting my own desires

14:21 wouldn't be the first time

14:21 arrdem: bitemyapp: I don't, but technomancy's got my number on this one.

14:22 seangrove: bitemyapp: k:v with arrays as values, I'm thinking. Querying is nice, but not a requirement. I'll have some background workers chewing through the database constantly updating queryable fields

14:22 * arrdem sighs and digs out the org mode tome

14:22 seangrove: arrdem: I don't know if it's a tome as much as a blackhole

14:22 technomancy: arrdem: https://github.com/technomancy/edgestow <- doesn't actually work, but

14:22 seangrove: It just keeps going

14:23 bitemyapp: seangrove: then either way can work, but the reason for using HStore is so you query against the contents.

14:23 technomancy: seangrove: org is another whole emacs within emacs

14:23 bitemyapp: you could make a structural version control system as long as you decided on some universal concepts

14:23 and made a language plugin system

14:23 seangrove: bitemyapp: Yeah, I'm wondering if it's going to be a nightmare to figure out how to use hstore from clojure and thus should be put off until later...

14:24 arrdem: technomancy: this is evil. I love it.

14:24 technomancy: seangrove: I tried using hstore from clojure a while back

14:24 it was pretty awkward

14:24 had to pull in a crazy adapter class from a random openstreetmap jar

14:24 maybe it's gotten better?

14:24 bitemyapp: technomancy: not especially.

14:25 seangrove: technomancy: Sounds like I should 100% avoid it then, thank you for that anecdote

14:25 bitemyapp: seangrove: in a situation where you want to store edn, you're generally looking at a datomic or document store oriented access pattern.

14:25 * seangrove wipes his forehead, thankful to have dodged a bullet and saved a whole day or two

14:25 technomancy: https://github.com/heroku/buildkits/blob/master/project.clj#L15

14:25 this was like a year ago

14:26 seangrove: bitemyapp: Yeah, it's occurred to me. I've got a live demo coming up Monday and need to get things done, but I'll have to sit you down and talk about the schema/workload and hear your thoughts on bringing datomic in the mix

14:26 bitemyapp: `cbp: so, projects. Made any decisions as to what you want to work on?

14:26 `cbp: bitemyapp: nope =p

14:27 seangrove: technomancy: Thanks again, really saved my day/weekend I think.

14:27 technomancy: np

14:27 the new json stuff looks nicer, but no idea re: jdbc support

14:27 bitemyapp: `cbp: lightweight composable SQL library, possibly with hstore/json support etc

14:28 `cbp: let me dig up my list

14:28 `cbp: maybe a haskell-powered blog and get my dissertation done at the same time!

14:28 bitemyapp: `cbp: there's grom

14:28 `cbp: http://github.com/bitemyapp/grom/

14:28 seangrove: technomancy: Yeah, pvh got me on on a pg kick a few years ago and definitely love it, but it can be hard to take advantage of a lot of the pg-specific features from clojure

14:28 bitemyapp: `cbp: grom is an nREPL client in Haskell

14:29 technomancy: oh yeah pvh is super helpful

14:29 bitemyapp: I'm a big fan of PostgreSQL myself.

14:32 seangrove: technomancy: He's definitely not long on clojure though. Laughed at me quite a few times when we switched over.

14:32 technomancy: M-x eyeroll

14:32 bitemyapp: `cbp: I had an idea for Erlang style OTP in Clojure, but I think Immutant is kinda covering that

14:32 seangrove: I would have thought you and mark would have done a better job indoctrinating the faithful there :P

14:32 bitemyapp: seangrove: from what?

14:32 seangrove: mark went over to the Go camp a long time ago

14:32 technomancy: seangrove: I'm not really "there"

14:33 there's a pretty huge disconnect between remotes and locals

14:33 bitemyapp: `cbp: Scala School for Clojure, Wrap ssh/jsch with something nicer (core.async?), Swagger support

14:33 `cbp: Leiningen test selectors in the REPL

14:33 technomancy: bitemyapp: well

14:34 bitemyapp: all of `lein test` turned into a library, really

14:34 bitemyapp: `cbp: SMTP -> Database/Search Engine

14:34 technomancy: test selectors alone would be a bit half-assed

14:34 bitemyapp: `cbp: zero-config in-memory lucene index (Clucy?)

14:34 seangrove: technomancy: Ah, bummer to hear that. Used to be the top place I wanted to work.

14:35 bitemyapp: `cbp: any of those strike you?

14:35 technomancy: yeah, it's been a bit disappointing

14:35 `cbp: bitemyapp: maybe i'll let the dice roll

14:35 bitemyapp: `cbp: erruh?

14:35 indigo: bitemyapp: The Lucene index sounds fun

14:35 Lucene is sexy

14:35 technomancy: clojurebot: 2d12

14:35 clojurebot: Titim gan éirí ort.

14:35 technomancy: =(

14:36 bitemyapp: indigo: next on my list is getting Simonides launched.

14:36 technomancy: hiredman: what's the dice command?

14:36 bitemyapp: if noprompt can get a fucking internet connection, we'll pair on Grom.

14:36 ~roll

14:36 clojurebot: Cool story bro.

14:37 arrdem: $roll 2d6

14:37 bitemyapp: seangrove: know of any frontend testing (automated) stuff that is more baked than this: https://github.com/pandeiro/ghost ?

14:37 arrdem: dang

14:38 seangrove: bitemyapp: We use clojurescript.test and selenium/taxi + Sauce Labs

14:38 bitemyapp: oh right, of course.

14:39 `cbp: hmm porqué no los tres

14:39 prolly start with lein test as a ser- er library

14:39 cmiles74: bitemyapp: I have a pull request out to clj-webdriver (taxi

14:39 bitemyapp: ) to include PhantomJS support.

14:40 bitemyapp: `cbp: like technomancy said, that's sort of a library already. The question is how to extend it.

14:40 or make it nicer. or something.

14:40 cmiles74: hrm, that would be nice.

14:40 cmiles74: it's too bad casper et al are kinda ghetto.

14:41 `cbp: ok uhm lucene then

14:41 bitemyapp: `cbp: https://github.com/weavejester/clucy

14:41 `cbp: ah, he already has support for a memory-index.

14:41 haha, hum.

14:41 `cbp: gg

14:42 cmiles74: bitemyapp: clj-webdriver is a step in the right direction, but it's still not really fun.

14:42 bitemyapp: cmiles74: yeah.

14:43 `cbp: want to write Haskell? :P

14:43 `cbp: bitemyapp: I'm having a bit of a hard time with it honestly hah

14:43 bitemyapp: `cbp: tried Yann Esposito's tutorial?

14:43 `cbp: http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/

14:43 `cbp: i'll need a few weeks to grok it probably

14:43 yeah im following that

14:44 bitemyapp: `cbp: s'all good.

14:44 `cbp: one of the examples there didnt work and so i asked in #haskell and left even more confused

14:44 :-p

14:44 bitemyapp: `cbp: which?

14:46 `cbp: bitemyapp: the example right before 3.2.3 i think

14:47 bitemyapp: ill probably try to add lazyness to revise this weekend

14:47 bitemyapp: `cbp: that's a really good idea.

14:47 `cbp: bitemyapp: also a `do` query

14:52 or uh something similar i can't quite remember what i wanted

14:52 the python driver had something i wanted

14:53 bitemyapp: `cbp: I fixed that Haskell program.

14:53 `cbp: do you want to see?

14:54 `cbp: data Complex a = Complex { real :: a, img :: a} <--- I made it parametric and removed the typeclass qualifier.

14:54 λ> real c

14:54 1.0

14:54 it was referring to an "a" that hadn't been passed to the type constructor (parametric type constructor)

14:54 I don't know why his code was data Complex = ...

14:55 `cbp: oh so it was a bug?

14:55 bitemyapp: `cbp: his fuck-up, not yours.

14:55 `cbp: I imagined maybe this code is on previous version

14:55 bitemyapp: I'm figuring out how to reintegrate the typeclass qualification now, but it "just works" now.

14:55 `cbp: bitemyapp: do you have a paste?

14:55 or i guess its just that line

14:56 bitemyapp: it's just that line.

14:56 data Complex = Num a => Complex { real :: a, img :: a} -- old

14:56 data Complex a = Complex { real :: a, img :: a} -- new

14:56 the problem is "a" can be anything right now

14:56 so I need to figure out how to readd the Num constraint.

14:58 `cbp: you can do this too: data Complex a b = Complex { real :: a, img :: b}

14:58 tho I don't know why you would.

14:58 I'm figuring out why my typeclass qualification makes the type decl existential.

15:01 sorry, GADT issue.

15:01 `cbp: that specific syntax actually got deprecated.

15:01 `cbp: Yann's tutorial is probably getting long in the tooth.

15:01 `cbp: bitemyapp: yeah that's what i figured

15:01 bitemyapp: or not.

15:01 sigh.

15:02 `cbp: lol

15:02 bitemyapp: `cbp: #haskell can't agree on what #haskell thinks about Yann's tutorial.

15:02 answers to come when they stop arguing.

15:03 arrdem: is the argumet worth watching?

15:03 bitemyapp: arrdem: no, they're right.

15:03 you don't constrain the types of your data

15:03 you constrain the types of your functions.

15:03 `cbp: ^^

15:04 noprompt: long time no see.

15:04 noprompt: the age of Grom is upon us.

15:05 noprompt: Prepare thyself and thy Salad: http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/

15:05 `cbp: oh uhm

15:05 ok

15:06 noncom: ,(keyword "aaa bbb")

15:06 clojurebot: :aaa bbb

15:06 `cbp: how does grom work

15:06 noncom: why are keywords with space allowed?

15:06 hiredman: clojurebot: 1d6

15:06 clojurebot: No entiendo

15:06 hiredman: 3d6+5

15:06 clojurebot: 13

15:06 noncom: {(keyword "a b") 3}

15:06 hiredman: there we go

15:06 bitemyapp: 2d12

15:06 clojurebot: 12

15:06 danneu: If you've (case (int x) ...) and your case-preds are 1, 2, 3, then how can you resolve the reflection error where (int x) is an int, but 1 2 3 are longs?

15:06 bitemyapp: nice.

15:06 noncom: ,{(keyword "a b") 3}

15:06 clojurebot: {:a b 3}

15:07 `cbp: 1d6

15:07 clojurebot: 6

15:07 noncom: ,{(keyword "a b") (keyword "c d")}

15:07 clojurebot: {:a b :c d}

15:07 hiredman: danneu: remove (int x)

15:07 bitemyapp: ,(get {(keyword "a b") 3} (keyword "a b"))

15:07 clojurebot: 3

15:08 noprompt: bitemyapp: zomg, the salad jokes last night.

15:08 bitemyapp: noprompt: Grom will eat your salad and take your land.

15:08 noncom: so why keywords with spaces are alowed? that ruined my world today

15:08 danneu: hiredman: haha, yeah. i'll just do that. the function it's dispatching uses (int _) for a dumb reason

15:08 technomancy: ...

15:08 bitemyapp: noprompt: https://github.com/bitemyapp/grom/ all glory to grom!

15:08 noprompt: bitemyapp: eff, i'm gonna be in hell for a little while. javascript.

15:09 bitemyapp: technomancy: twitter.

15:09 technomancy: bitemyapp: I saw

15:09 hiredman: danneu: it seems unlikely that that is the reflection warning though

15:09 bitemyapp: noprompt: I'm sorry to hear that. Write Fay instead and compile to JS!

15:09 `cbp: noncom: how did it ruin your day

15:09 noprompt: bitemyapp: if i could write in an alt-js lang believe me i would be cljs.

15:10 noncom: `cbp: boiled to a simple example, i was trying to get the key :a from the map readout, which did not exit, and was :a b instead

15:10 noprompt: bitemyapp: the best thing i can do right now is use mori.

15:10 bitemyapp: however, i'm still writing clj/cljs at home.

15:10 noncom: `cbp: i could not find where was i wrong

15:10 `cbp: noncom: oh :-)

15:10 noncom: the data was coming from elsewhere so i had no guess that that can happen

15:10 teslanick: Javascript isn't so bad; it's remarkably expressive for having a stupid java-like syntax.

15:11 seangrove: teslanick: Nope, it's pretty bad.

15:11 noprompt: teslanick: what seangrove said.

15:11 seangrove: It's tolerable in small doses, but it's to be carefully monitored.

15:12 noprompt: it's magnified after a full year of clj/cljs.

15:12 javascript is a bit more tolerable than python i'll say that.

15:13 bitemyapp: noprompt: don't get me started about Python's fake closures.

15:14 nenorbot: bitemyapp: what's wrong with Python's closures?

15:14 poppingtonic: I've noticed that, the more I immerse myself in Clojure, the harder it gets for me to parse Python.

15:14 teslanick: he told you not to get him started ;)

15:15 nenorbot: Just genuinely curious :)

15:20 noprompt: dnolen: will cljsbuild automatically compile js that uses closure too?

15:21 ^ or if anyone else has an answer to that question.

15:26 OscarZ: I'm looking at memoize function here: http://clojure.org/atoms .The function will be called recursively, I'm wondering about the scope of "mem" .. wouldnt there be a new copy of mem for each function call ?

15:27 Raynes: OscarZ: mem is defined outside of the anonymous function.

15:27 OscarZ: obviously not.. but how does that work..

15:27 `cbp: OscarZ: it's a closure

15:27 Raynes: OscarZ: The returned function closes over 'mem'. That's what a closure is.

15:27 OscarZ: oh.. right.. the "fn" part ?

15:28 Raynes: Yes. That's an anonymous function, which memoize returns.

15:28 TimMc: nenorbot: Yeah, I keep hearing people whinge about Python's closures, but I still haven't heard an explanation.

15:28 OscarZ: thanks.. it makes sense

15:36 seangrove: Hrm, what's the clojure method of converting clojure datastructures to edn? I see clojure.edn/read-string for reading

15:36 `cbp: seangrove: pr-str

15:36 justin_smith: seangrove: usually pr-str suffices

15:37 or pr with a stream argument

15:37 seangrove: Ah, yes, sorry, my example I was using in the repl was slightly off

15:37 pr-str was doing its job fine, pebkac

15:43 arrdem: hum... looking at using core.logic for a strategy system. Should I be pushing predicates into c.c.l instead of writing them in stock Clojure?

15:56 adhollander: cd

16:01 TimMc: ls

16:01 lazybot: boot data dev home lost+found opt root sbin selinux swap tmp

16:09 pjstadig: rm -rf /

16:10 TimMc: pjstadig: You'll need a --no-preserve-root

16:16 also: what clojurescript compiler options (versions? something?) would cause it to emit javascript like "cljs.core.constant$keyword$7" instead of "cljs.core.Keyword(null, "else", "else", 1017020587)"

16:16 hyPiRion: TimMc: we should totally implement Swearjure in https://github.com/alandipert/gherkin

16:16 also: i get cljs.core.constant$keyword$7 running bin/cljsc and the other from lein-cljsbuild

16:17 i *think* i'm using r2030

16:18 bitemyapp: seangrove: are we still doing Lava?

16:21 seangrove: if so, is that today or tomorrow?

16:21 TimMc: hyPiRion: Yeah, I'm definitely waiting for Clash or whatever Clojure-on-bash gets called. :-P

16:21 Are you at the conj?

16:22 seangrove: bitemyapp: tomorrow, and if you're not going into your office on Saturday, we can find a more in-the-middle place to meet. Must be bars somewhere in the middle.

16:22 technomancy: TimMc: are you???

16:22 lazybot: technomancy: Oh, absolutely.

16:22 seangrove: I believe SF has the highest number of bars per-capita in the states

16:22 hyPiRion: TimMc: yep

16:23 TimMc: technomancy: Nope.

16:23 technomancy: sadface.jpg

16:23 TimMc: Yeah, I should go some time.

16:23 Too busy this year.

16:24 bitemyapp: seangrove: I won't be at the office, but the office isn't a bad epicenter because I have unparking next to it.

16:24 biggbear: does "lein repl" reads the file project.clj? and if so how to include in there libraries like clojure.pprint. Please

16:24 seangrove: also: Very strange

16:25 technomancy: biggbear: clojure.pprint is a namespace, not a library

16:25 augustl: doing algorithm basics on coursera. Are there any papers/blog posts/.... about the persistent data structures in Clojure?

16:25 pjstadig: augustl: yes

16:26 http://lmgtfy.com/?q=phil+bagwell

16:26 bitemyapp: pjstadig: that's just mean :(

16:27 pjstadig: it's not actually that obvious that Clojure's data structures are based on Bagwell, rather than Okasaki's work.

16:27 pjstadig: turns out the results aren't that great, they don't surface any papers

16:27 http://lampwww.epfl.ch/papers/idealhashtrees.pdf

16:27 bitemyapp: dammit

16:27 clojurebot: Gabh mo leithscéal?

16:27 bitemyapp: beat me to the punch.

16:28 augustl: pjstadig: thanks!

16:28 pjstadig: sure

16:29 augustl: i don't think there are any papers on clojure's persistent vectors, but there's the rrb trees paper which kinda explains them http://infoscience.epfl.ch/record/169879/files/RMTrees.pdf

16:29 and adds some features to them

16:30 augustl: iirc Clojure is unique in that they're completely immutable?

16:30 or is it transients that makes Clojure unique?

16:31 technomancy: augustl: clojure is different from many implementations in that the performance characteristics don't degrade over time

16:31 also efficient functional vectors are quite rare

16:32 augustl: perhaps reading the damn code is enough for a good understanding - after the coursera algorithms course, that is

16:32 pjstadig: augustl: implementing them will be the most illuminating

16:32 reading the code second best

16:32 (aside from reading the papers)

16:32 also: seangrove: it's :emit-constants

16:32 seems to be true for my lein-cljsbuild, false for cljsc

16:33 augustl: pjstadig: are there C implementations? Would be fun to toy with that

16:33 seangrove: also: That's the source of the problem? I've never seen that flag.

16:33 augustl: memory management aside..

16:33 also: i think it's this: https://groups.google.com/forum/#!topic/clojurescript/bSFK6CEE3PE

16:34 pjstadig: augustl: you need GC for persistent datastructures to work, which could is possible in C

16:39 technomancy: nice round of applause for juxt at the conj

16:39 bitemyapp: technomancy: wait, are you watching?

16:39 technomancy: is there a stream?!

16:40 technomancy: bitemyapp: I'm ... present

16:40 in, you know, meatspace

16:40 biggbear: technomancy: thanks, i guess you have to require clojure.pprint in the project.clj -> repl-options -> init?

16:40 bitemyapp: technomancy: oh, I didn't know. ;_;

16:40 technomancy: who used juxt?

16:41 technomancy: biggbear: yeah; there's no way afaik to refer it everywhere though

16:41 bitemyapp: alan dipert had a juxt in his lisp-in-bash impl

16:42 and the current speaker said it was his favourite function

16:42 bitemyapp: technomancy: I just documented this code which uses juxt: (into {} (map #((juxt :db/id identity) %) (db->schema db)))

16:43 technomancy: \m/

16:43 bitemyapp: wayt

16:43 wait

16:43 bitemyapp: technomancy: wut

16:44 pjstadig: wat

16:44 technomancy: what is going on with the #()

16:44 were you just checking to make sure I'm paying attention?

16:44 bitemyapp: technomancy: this is production code.

16:44 S11001001: technomancy: needs to meet quota of eta expansion

16:45 bitemyapp: technomancy: I remember it breaking before I did that, but I can remove it and see if the arity is kosher.

16:45 in the absence of a type system keeping me honest, cargo cult rules the day.

16:46 noncom: how do i better parse huge trees in recursive manner with element types (but not java types) that require different parsers AND avoid StackOverflow exception? example: https://www.refheap.com/20932

16:46 technomancy: bitemyapp: or you know... a repl?

16:47 bitemyapp: technomancy: I did use it in a REPL

16:47 that's how I knew to add the wrapper >:)

16:47 let me test again tho

16:47 technomancy: I don't see how it can make a difference in a map over one coll

16:47 justin_smith: noncom: at parse time you could build a DAG in terms of elementa-ids and connections to them in one map and elements by id in another map, and then construct the tree out of the DAG after you are done parsing

16:48 that way everything can go in the heap

16:48 bitemyapp: I still need a library that randomly fucks with my functions to test my coverage.

16:49 I end up doing manual "negative" tests before proceeding with a change that I am running the tests to verify.

16:49 ahhh and the negative test failed. Fuck me in the beard.

16:49 technomancy: ._.

16:53 bitemyapp: nicferrier: Scala is so good because everyone can just pretend it's Java. #thatsagoodthingright?

16:55 noncom: justin_smith: i got it but still have two questions: 1) why parsing to build the maps wont cause SO?, 2) what's DAG?

16:55 justin_smith: Directed Acyclic Graph

16:55 a standard data structure

16:55 noncom: ah

16:55 justin_smith: you don't need to use the stack to build the data

16:56 noncom: right

16:56 justin_smith: that's why I suggest the connections map / elements map implementation

16:56 noncom: i can use an atom instead of the stack, am i right?

16:56 justin_smith: right

16:56 or a ref

16:56 noncom: cool!

16:57 thanks!

16:57 justin_smith: n/p

16:57 there is still the trick of changing the non-tail-recursive descent into a linear non stack-building (or minimally stack-building) version

16:58 but the DAG will help with that

16:58 noncom: yes, DAG is a radical approach

16:58 bitemyapp: hello 90s.

16:58 Totally Radical!

16:59 justin_smith: radical in the old sense as well: it is very primitive, you can build most other data structures out of one :)

16:59 bitemyapp: technomancy: bare juxt is fine.

16:59 technomancy: good catch.

16:59 technomancy: bitemyapp: yw =)

17:00 noncom: sorry me no native english, radical i mean that it is totally impure when i was first thinking pure, but let it go

17:00 no tailcall optimisation makes the mutable approach the best here

17:01 justin_smith: you said "most", what datastructures it can't help to build?

17:02 justin_smith: noncom: just hedging my bet

17:02 :)

17:02 noncom: :D

17:02 justin_smith: it could be that it is a basis for every possible data structure, for all I know

17:03 hmm.. I guess you could build a cyclic graph out of multiple acyclic graphs, so the obvious answer to that question is ruled out...

17:03 noncom: yeah.. everything is described in terms of relations..

17:04 justin_smith: but of course you cannot build a DCG out of a single DAG

17:06 TEttinger: hypergraphs man

17:07 justin_smith: ahh, I figured something like that existed

17:07 TIL, thanks

17:08 TEttinger: justin_smith, hypergraphs are barely used and the one implementation I have found is awfully slow.

17:08 but in theory, they can be used to implement I believe any data structure

17:09 justin_smith: yeah, when an article on a data structure has this much math in it I usually figure it doesn't have much use outside haskell programming :)

17:09 *much practical programming use

17:09 noncom: can a prolog program be considered a hypergraph?

17:10 justin_smith: there is probably a linear transform from turing machine to hypergraph

17:10 TEttinger: yeah. I might look up data literals to see if I can make http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html have some nice syntax sugar for Clojure.

17:12 justin_smith: I have been working on a pure clojure quad-tree implementation, so I can use it in clojure or clojurescript for packing algorithms

17:12 for extra credit I decided not to use any geometry libs and relearn all my 2d geometry by implementing it out of bare clojure

17:13 bitemyapp: justin_smith: whyyyyyyy?

17:13 amalloy: TEttinger: why would you want that mutable data structure to have nice clojure sugar? there's already an immutable analogue to that at org.flatland/ordered

17:14 justin_smith: because I want to be better at geometry, to inform my packing algorithms :)

17:14 noncom: TEttinger: you mean clojure is going to have a LHM literal?

17:14 justin_smith: so the lib was ok? recently i've been thinking of octrees in clojure for 3d...

17:15 justin_smith: well the libs I could find all used interop

17:15 and I want my code to be runnable on the client

17:15 or the server

17:15 which rules out just using a js or java based lib

17:16 seangrove: Hrm, wish there was an easy way to tail the *nrepl-server* buffer when it's spewing tons of text

17:16 I have to keep mashing M->

17:16 justin_smith: also, nothing wrong with polishing one's weapon, so to speak

17:16 bitemyapp: justin_smith: definitely not. Your reasons make sense.

17:17 justin_smith: seangrove: there is an emacs mode I once found for that - similar to auto-revert mode but for buffers that are getting inserted to by other elisp

17:17 Glenjamin: hi guys, random question: how do you pronouce ".clj" ?

17:17 seangrove: justin_smith: Interesting, couldn't find it from a bit of googling

17:17 hfaafb: see el jay

17:17 bitemyapp: seangrove: auto-revert-tail-mode not working because it's not a file?

17:18 seangrove: http://www.gnu.org/software/emacs/manual/html_node/emacs/Reverting.html

17:18 seangrove: http://www.emacswiki.org/emacs/AutoRevertMode

17:18 justin_smith: I don't think auto-revert does what you expect when there is no file

17:18 seangrove: bitemyapp: Yeah, it's not a file, hence the trouble

17:19 amalloy: Glenjamin: usuall see el jay, indeed, although occasionally clidge is convenient

17:19 justin_smith: culje?

17:19 bitemyapp: seangrove: the code in that emacs wiki page has a goto-char thing, might be able to set up a timer for that.

17:19 Glenjamin: i realised i was thinking of it as "kludge" in my head, which doesn't really fit :D

17:19 seangrove: bitemyapp: I'll check it out, thanks

17:21 justin_smith: bitemyapp: yeah, that's what the snippet I lost was doing, (goto-char (point-max)), followed by sit-for in a loop

17:22 (while also doing things by making sure this was being done in the right buffer etc. - for extra credit you could even skip the whole thing if the buffer is not visible)

17:23 no, not sit-for

17:23 run-at-time

17:41 TEttinger: noncom, I just found https://github.com/flatland/ordered , which does what I wanted anyway

17:42 JohnCMadison_: Can anyone point me to the replacement of dissoc-in?

17:44 TimMc: JohnCMadison_: update-in + dissoc

17:44 JohnCMadison_: ok

17:44 i wonder why

17:44 thanks TimMc

17:45 TimMc: IIRC, it may not work properly at the top level.

17:45 &(update-in {:a 1 :b 2} [] dissoc :a)

17:45 lazybot: ⇒ {nil nil, :a 1, :b 2}

17:45 TimMc: :-(

17:45 bitemyapp: JohnCMadison_: I don't think people really agreed on what it should be mean for unmaterialized/partially materialized paths.

17:45 TimMc: &(update-in {:a 1 :b 2} [:does :not :exist] dissoc :a)

17:45 lazybot: ⇒ {:does {:not {:exist nil}}, :a 1, :b 2}

17:45 bitemyapp: I think amalloy have disagreed on the semantics before :)

17:46 TimMc: ^ Yeah, there's some weird results.

17:46 bitemyapp: TimMc: might as well just use a function that returns nil

17:46 JohnCMadison_: ok. right. better to have no function than a buggy one

17:46 bitemyapp: it wasn't buggy

17:46 it was a philosophical dispute.

17:46 JohnCMadison_: ah

17:47 bitemyapp: there wasn't a way to get everybody to agree on a single well-defined behavior.

17:47 TimMc: bitemyapp: Do you recall a case where you disagreed?

17:47 bitemyapp: TimMc: do you want me to recount amalloy and I's discussion, or what I think it should do?

17:48 TimMc: I'm guessing there would be some argument about what happens when you dissoc the last key in a map (although it's pretty clear to me.)

17:48 bitemyapp: Recount, if you can.

17:48 bitemyapp: there are like 2-3 different things

17:48 TimMc: I'll search if you can't.

17:48 bitemyapp: one is whether it should short-circuit the nested path if it encounters a key along the way that doesn't exist

17:48 whether it should nil the value out or remove the attribute properly

17:49 whether removing the final key in a map should result in {} or nil (I prefer the former, result here depends on the last issue somewhat)

17:49 TimMc: amalloy mostly discussed the nesting issue

17:49 and I*

17:49 TimMc: They all seem pretty straightforward to me, but I can see where argument would arise.

17:49 (yes, remove, {})

17:50 For some decisions, you would end up with a recursive modification.

17:50 bitemyapp: TimMc: so the two of us agree at least.

17:50 TimMc: (dissoc-in {:a {:b {:c 4}}} [:a :b :c]) would result in nil, e.g.

17:51 bitemyapp: oh, no.

17:51 I wouldn't want that.

17:51 Apage43: ,(assoc nil :a 1)

17:51 clojurebot: {:a 1}

17:51 TimMc: Neither would I, that's the consequence of...

17:51 bitemyapp: (dissoc-in {:a {:b {:c 4}}} [:a :b :c]) should return {:a {:b {}}}

17:51 Apage43: well

17:51 the problem with that

17:52 is

17:52 TimMc: (mu, mu, nil)

17:52 bitemyapp: Apage43: Clojure gives no fucks about nils.

17:52 Apage43: if my initial thing is a sorted-map

17:52 and I dissoc it empty and the assoc onto the thing I dissoced from

17:52 I don't want it to become a different type of map in the middle there

17:52 bitemyapp: Apage43: that's why we're saying don't return nil. Or at least I am.

17:52 TimMc: *Nod* I am not a fan of Clojure's pretending nil is a meaningful collection.

17:53 TEttinger: so is the solution to toplevel update-in to just use update?

17:53 bitemyapp: TimMc: I'm not a fan of anything-goes compilers.

17:53 TEttinger: oh there is no update

17:54 TimMc: &(update-in {} [] assoc 1 2)

17:54 lazybot: ⇒ {nil {1 2}}

17:54 Apage43: ...

17:54 TimMc: *sigh*

17:54 I'm pretty sure update-in has a buggy base case.

17:54 Apage43: such surprising

17:54 `cbp: haah wat

17:54 bitemyapp: so type safe, wow, pretty error

17:56 TimMc: If I (update-in ..map.. [..path..] assoc 1 2), then (get-in ..map.. [..path.. 1]) should return 2

17:56 Err, that second ..map.. should really be the first expression.

17:56 bitemyapp: TimMc: that sort of symmetry would certainly be nice.

17:57 grumble grumble.

17:57 TimMc: &(update-in {:a {:b {:c 4}}} [:a :b :c] dissoc :c)

17:57 lazybot: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IPersistentMap

17:57 TimMc: &(update-in {:a {:b {:c 4}}} [:a :b] dissoc :c)

17:57 lazybot: ⇒ {:a {:b {}}}

17:57 TimMc: Other than the short-circuiting and the base case, I think update-in + dissoc does the right thing.

17:58 Apage43: other favorite thing is the clojure.set functions that will totally give strange answers if you feed them collections that aren't sets

17:58 bitemyapp: Apage43: does Golang even have sets?

17:59 Apage43: probably not

17:59 bitemyapp: Serious question (in the stdlib)

17:59 lol.

17:59 Apage43: not that I can find

17:59 TimMc: http://dev.clojure.org/jira/browse/CLJ-373

18:05 Apage43: bitemyapp: just maps.

18:05 bitemyapp: http://www.philandstuff.com/2011/10/25/learning-monads-in-clojure-a-warning.html

18:05 Apage43: sweet bros, just use dem keys.

18:05 Apage43: and that's part of the language. the stdlib doesn't have any extra collections of any sort.

18:06 bitemyapp: Apage43: hnnnnngggggg

18:07 Apage43: since they'd just be bags of interface{}

18:07 oh, interface{}

18:08 bitemyapp: Apage43: great work guys.

18:14 TEttinger: bitemyapp: https://dl.dropboxusercontent.com/u/11914692/functional-doge.png

18:15 noprompt: such typesafe

18:15 TEttinger: wow

18:15 `cbp: ¬_¬

18:19 bitemyapp: `cbp is distressed to be surrounded by such dorks.

18:19 TEttinger: <3

18:34 TEttinger: similarly terrible, https://dl.dropboxusercontent.com/u/11914692/dogejure.png

18:36 Morgawr: TEttinger: http://doge.ufeff.pw/?n=128 this is how you do it :P

18:36 TEttinger: there we go

19:40 arrdem: bitemyapp: Morgawr just out memed you, you gonna take that?>

19:41 bitemyapp: arrdem: I will wait and lurk.

19:41 arrdem: Prepare yourself...the category theory memes are coming...

19:41 * arrdem is disappointed

19:41 john2x: oooh shibe. http://github.com/john2x/shibebot

19:41 arrdem: (inc john2x)

19:41 lazybot: ⇒ 1

19:41 arrdem: (inc Morgawr)

19:41 lazybot: ⇒ 1

19:42 arrdem: (inc TEttinger) ; for effort

19:42 lazybot: ⇒ 6

19:42 toothpick`: (dec arrdem)

19:42 lazybot: ⇒ 5

19:42 bitemyapp: john2x: lmfao.

19:45 john2x: heh. I had to kill the bot, as it was getting way too many downvotes and getting banned too fast.

19:45 bitemyapp: john2x: :(

19:46 arrdem: john2x: haha it looks like it was pulling 75% downvotes :P

19:49 danenania: does anyone have experience with shoreleave? having csrf troubles with ring.middleware.anti-forgery... __anti-forgery-token is defined in my cookies, but not getting added to requests with remote-callback or rpc macro

19:58 echo-area: Is it strange if I'm using defrecord but also create a function mk-my-record?

20:00 bitemyapp: echo-area: not at all, Haskellers do something comparable all the time.

20:00 echo-area: bitemyapp: Thanks

20:00 bitemyapp: mostly so they can constrain the input types to a specific use-case without constraining the type of the record.

20:00 echo-area: And another question: Is it idiomatic to use Agents with Records?

20:00 bitemyapp: echo-area: egads

20:01 echo-area: What?

20:01 clojurebot: What is sampling a random integers betwen 2, 12 s..t. P(X = i) = (7-|i-7|)/36

20:01 echo-area: What does "egads" mean?

20:01 bitemyapp: $google egads

20:01 lazybot: [Urban Dictionary: egads] http://www.urbandictionary.com/define.php?term=egads

20:02 echo-area: Hmm, sorry

20:02 bitemyapp: it's fine.

20:02 echo-area: And thank you :)

20:02 bitemyapp: np

20:02 echo-area: I generally just use maps with agents.

20:03 echo-area: Yes, but I made a protocol

20:03 bitemyapp: echo-area: well, only way to know is to try it, but make a serious attempt of breaking it.

20:03 echo-area: I see. Learn from experience :)

20:05 bitemyapp: echo-area: the reason for my discomfort is that if the record definition gets reloaded or something, the agents will persist stale versions of the record

20:05 echo-area: it makes interop awkward and generally multimethods + maps suffice for what you'd want to do.

20:05 multimethods also let you avoid fucking with your data.

20:07 echo-area: Ah, that's indeed better. I'll go switch to those. Thank you!

20:07 I think this is important especially if the data structure is surely going to be changed shortly

20:08 bitemyapp: that's the easiest time I've ever had convincing somebody not to fuck their data with protocols.

20:08 echo-area: Good for both of us :)

20:19 arrdem: bitemyapp: YOU WILL NEVER BREAK ME

20:20 * arrdem curses as he restarts his repl again

20:20 seangrove: Seems like not all #inst methods are created the same...? Or should I be able to all (.getYear #inst "2013-08-31T23:49:19.000000000-00:00") any time I get #inst back?

20:20 ,(.getYear #inst "2013-08-31T23:49:19.000000000-00:00")

20:20 clojurebot: #<SecurityException java.lang.SecurityException: denied>

20:21 seangrove: Well, it works if I copy/paste it into the repl, but in other cases it's a java.sql.Timestamp, and I get the error "No matching field found: getDayOfYear for class java.sql.Timestamp"

20:21 Which is just bonkers, because I think java.sql.Timestamp subclasses java.util.Date, which does have the method .getYear

20:22 justin_smith: wait, do you want getYear of getDayOfYear?

20:22 seangrove: justin_smith: Yes, that could be my problem.

20:23 justin_smith: ,(.getDayofYear (java.util.Date.))

20:23 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: getDayofYear for class java.util.Date>

20:23 seangrove: I think I was calling getDayOfYear :P

20:23 justin_smith: ,(.getYear (java.util.Date.))

20:23 clojurebot: 113

20:23 seangrove: Please excuse me, and thank you for being nice debugging rubber duckies

20:23 justin_smith: /quacks.

20:23 err

20:23 * justin_smith quacks.

20:24 seangrove: Also, upon inspection, getYear seems to be a bit strange

20:24 "Returns a value that is the result of subtracting 1900 from the year that contains or begins with the instant in time represented by this Date object, as interpreted in the local time zone."

20:25 justin_smith: hysterical raisins

20:25 seangrove: Why the arbitrary 1900?

20:25 justin_smith: from back when people wanted to store a year in 7 bits

20:26 or some kind of madness like that

20:26 noonian: you just found the y2k bug :)

20:29 arrdem: justin_smith: gotta have that sign bit mon

20:30 justin_smith: "as we fully intend to have a new language to replace this one in two years, the year field will be represented as a single bit"

20:31 arrdem: waaat

20:31 justin_smith: hyperbolizing the attitude of the '70s - that they didn't need a bigger datatype because people would be upgrading anyway

20:37 gws: another favorite developer pastime: taking opaque identifiers and forcing them into some arbitrary box because, well, "that's what it looks like": http://techcrunch.com/2009/06/12/all-hell-may-break-loose-on-twitter-in-2-hours/

21:10 xuser: What's the purpose of the 'when' here? https://www.refheap.com/20940

21:10 justin_smith: it only executes the body if pred is true

21:10 it is like a single arm if

21:10 with no else

21:11 it is weird - I guess in some cases nil or false would be passed in as pred

21:12 xuser: justin_smith: yeah, I guess is testing for a nil pred, thanks

21:16 just haven't got to the part in the book where they explain 'when',

21:16 justin_smith: ,(when true :ok)

21:16 clojurebot: :ok

21:16 justin_smith: ,(when false :ok)

21:16 clojurebot: nil

21:16 xuser: justin_smith: is it a matter of style to use 'when' when there is no else?

21:17 justin_smith: yeah - though some will also specify that when should only be used for side effects

21:17 noonian: i've never used when

21:17 justin_smith: ,(when true (print :a) (print :b) :c)

21:17 clojurebot: :a:b:c

21:17 justin_smith: with if you would have needed a do statement

21:18 noonian: I got into the habit with common lisp of using when for all my single arm ifs

21:18 xuser: Ok

21:18 noonian: i guess its nicer than an iff because if you have use an explicit do in an if if you want to have more than one form

21:18 justin_smith: it can be - like any other macro the main usage is to make your code clear

21:18 egghead: oh nice I didn't know when had an implicit do

21:18 noonian: well i screwed that sentence up royally

21:37 arrdem: justin_smith: why for side effects?

21:37 justin_smith: it's a style argument

21:37 that technomancy for example is wont to make

21:38 because null has an implicit do

21:38 otherwise, you can use or

21:38 err

21:38 I mean and, of course :)

21:38 ,(and true :hello)

21:38 clojurebot: :hello

21:38 justin_smith: ,(and nil :hello)

21:38 clojurebot: nil

21:39 justin_smith: and do, which is for chaining many statements and only returning the last value, is clearly only for side effects

21:48 `cbp: bitemyapp: damn it I implement functions which are already implemented but with another name :(

21:48 this is embarassing

21:49 i'll sweep them under the rug after the next patch....

21:50 bitemyapp: `cbp: happens to the best of us :)

21:50 `cbp: at least you're so productive you forget your own work!

21:50 `cbp: also, you know what time it is, right?

21:50 `cbp: bitemyapp: :-o

21:51 bitemyapp: `cbp: it's time.

21:51 `cbp: i think there's another patch t.t

21:51 bitemyapp: `cbp: hopefully they nerf the spirit fuckers.

21:51 or huskar.

21:52 `cbp: well get the patch going, what's the ETA?

21:52 `cbp: bitemyapp: wanna play LoL

21:52 i have one guy that doesnt play dota

21:53 bitemyapp: `cbp: sacrifice him to Molech, then fire up DotA2

21:53 `cbp: =o

21:54 bitemyapp: `cbp: why don't they have DotA2?

21:54 `cbp: bitemyapp: they've never played it nor installed it

21:55 bitemyapp: `cbp: today is the day.

21:55 `cbp: they'd be better get started downloading too :)

21:55 `cbp: also we should do voice. Do you typically use mumble, teamspeak, or in-game?

21:55 I guess in-game is easiest.

21:55 arrdem: wakie wakie

21:56 arrdem: bitemyapp: wat

21:56 bitemyapp: arrdem: DotA2 time.

21:56 arrdem: oh r we dotaz

21:56 bitemyapp: arrdem: confiscate a computer

21:56 `cbp: bitemyapp: skype

21:56 arrdem: http://www.youtube.com/watch?v=0OzWIFX8M-Y

21:56 `cbp: i have all of those though

21:57 arrdem: bitemyapp: I'm playing on my box. hang on plugging back in & gearing up

21:57 s/box/ss9/

21:57 bitemyapp: arrdem: what's an ss9?

21:58 `cbp: bitemyapp: 30 min

21:58 bitemyapp: i have 2 guys on lol maybe 1 guy on dota

21:58 bitemyapp: `cbp: tell the two on LoL to skip drinking for a night or two and use the money for DotA2

21:59 `cbp: i think they avoid dota on principle

21:59 bitemyapp: `cbp: well they're not friends.

21:59 arrdem: bitemyapp: how are we VOIPing?

21:59 bitemyapp: arrdem: I think cbp wants Skype.

22:00 * arrdem cries a little and fires Skype up

22:00 bitemyapp: arrdem: the thing is, if we're playing DotA2, we can just use in-game.

22:00 arrdem: which if we don't have a full team of 5, we should do.

22:00 arrdem: so no need I think.

22:00 arrdem: good point that... gimme a minute to pacman -R this cancer and find my USB headset

22:00 `cbp: 1d2

22:00 clojurebot: 2

22:00 bitemyapp: arrdem: what's ss9?

22:01 1d1

22:01 clojurebot: 1

22:01 bitemyapp: 1d0

22:01 AHA

22:01 arrdem: bitemyapp: sorry. samsung series 9

22:01 bitemyapp: arrdem: what gfx chip?

22:01 1d9000000000000000000000000000000000000000000000000

22:01 1d10000000000000000000

22:01 1d10000

22:01 clojurebot: 2434

22:01 bitemyapp: 1d100000000000000000000

22:01 1d100000000

22:01 1d100000

22:01 clojurebot: 21888

22:02 arrdem: bitemyapp: intel integrated like a bau5

22:02 bitemyapp: hrm.

22:02 arrdem: that runs DotA2?

22:02 arrdem: bitemyapp: somehow

22:02 bitemyapp: arrdem: Valve are fucking wizards.

22:02 arrdem: bitemyapp: on Linux too...

22:02 bitemyapp: arrdem: that might actually be helping your case.

22:02 arrdem: goddamn black magic

22:02 `cbp: bitemyapp: i thought u played dota more

22:03 er lol

22:03 bitemyapp: no

22:03 arrdem: according to Valve, they were able to make their in-house game engines run better on Linux

22:03 `cbp: I only tried out LoL recently, I'm not a fan.

22:03 `cbp: oh

22:03 bitemyapp: it's a treadmill grinding game, no likey.

22:03 arrdem: gimme a a min... I gotta figure out how to change my alsa I/O standard device

22:03 clojurebot: Gabh mo leithscéal?

22:04 `cbp: casual ;)

22:04 bitemyapp: that too

22:05 `cbp: are you trying to play on gentoo or something

22:05 bitemyapp: also I can't last hit for shit in LoL

22:05 `cbp: no i was calling you a casual

22:05 arrdem: clojurebot: ping

22:05 clojurebot: PONG!

22:06 bitemyapp: `cbp: oh fuck you I used to play HoN.

22:06 `cbp: HoN was briefly the nectar of the MOBA gods

22:06 xuser: you guys don't play counter strike? ;)

22:06 `cbp: i did for a bit

22:06 too many games though

22:07 bitemyapp: xuser: I got tired of losing. I'm better at more tactical shooters.

22:08 arrdem: meh. lemme try a different headset, Arch doesn't like this one

22:08 bitemyapp: arrdem: :(

22:08 xuser: I just played dota when it all started inside warcraft frozen throne ;)

22:08 bitemyapp: xuser: I used to play it then too

22:08 I didn't get respectable at the game until HoN though.

22:08 arrdem: xuser: I'd totally be a rabit MW:O fan if the devs didn't suck

22:09 egghead: why does this block: (take 300 (reduce + (range)))

22:09 oh nvm

22:09 derps

22:09 bitemyapp: egghead: way2go

22:09 `cbp: no one saw that

22:09 actually i screenshotted

22:09 bitemyapp: lol `cbp

22:09 arrdem: egghead: logged chan what up

22:10 egghead: nuuu

22:10 bitemyapp: arrdem: what's your Steam account again?

22:12 arrdem: bitemyapp: eradicator5999 or cator5999 I forget

22:14 bitemyapp: arrdem: what kind of bullshit is that.

22:14 arrdem: sent you my steam name

22:15 arrdem: bitemyapp: I think I got you. there are two of you.

22:16 badass. headset online.

23:41 sritchie: hey all - do you guys know if it's possible to turn on http compression using http-kit?

Logging service provided by n01se.net