2013-11-15
| 00:01 | swarthy | I'm confused by #'x, i see that it expands to (var x). Is (var) something like a pointer to an object? |
| 00:02 | bitemyapp | swarthy: yes but vars are transparent when used. |
| 00:02 | bitemyapp | swarthy: vars are how you create references to values |
| 00:02 | bitemyapp | swarthy: symbols are how you name vars. |
| 00:03 | bitemyapp | 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. |
| 00:04 | swarthy | so this is the seperation of identity and value then? (def x 4) thus x == 4 and (var x) == x itself |
| 00:04 | swarthy | do I understand that right? |
| 00:04 | bitemyapp | well, identity traditionally has been "are these the same pointer?" |
| 00:05 | bitemyapp | 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. |
| 00:06 | bitemyapp | but they don't have to actually *SHARE* the same value, just *BE* the same value. |
| 00: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. |
| 00:07 | swarthy | i'm trying to understand why something like this exists |
| 00: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. |
| 00: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...) |
| 00:08 | swarthy | bitemyapp: wondering what the #'core/request signifies |
| 00: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.) |
| 00:08 | bitemyapp | swarthy: that's indirection so it doesn't retain the original value |
| 00:08 | bitemyapp | swarthy: so you can dereference it upon use |
| 00:09 | bitemyapp | swarthy: often needed for things like app reloading... |
| 00:09 | bitemyapp | swarthy: think about it, without indirection, how can you swap things out so your server uses the new handler code? |
| 00:09 | bitemyapp | vars are why you can overwrite/monkeypatch arbitrary data. |
| 00:09 | bitemyapp | even if you shouldn't abuse that as a first-order programming methodology. |
| 00:10 | bitemyapp | swarthy: is it all beginning to come together now? |
| 00:10 | swarthy | yes it is more tangible at least |
| 00:10 | swarthy | thanks! |
| 00:10 | bitemyapp | swarthy: you have a REPL. Take your weapon, strike down your unknowns. |
| 00:10 | bitemyapp | swarthy: test it! |
| 00:10 | bitemyapp | swarthy: experiment! |
| 00:12 | swarthy | ah i see. (def x 5) (def y #'x) (println @y) |
| 00:20 | TimMc | (inc bitemyapp) |
| 00:20 | lazybot | ⇒ 12 |
| 00:25 | sshack | Can anyone here help me out with a simple clojure problem. |
| 00:26 | Adeon | only after you present your simple clojure problem |
| 00: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. |
| 00:27 | sshack | foo.baz/quux (use 'foo.baz) both spit out errors. |
| 00:28 | sshack | I am clearly missing something. Can anyone give me some pointers? |
| 00:28 | swarthy | What are the errors? |
| 00:37 | sshack | Exception lib names inside prefix lists must not contain periods clojure.core/load-lib |
| 00: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 |
| 00:45 | swarthy | 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 |
| 00:47 | sshack | See, even what I think are fully qualified function calls don't seem to work. |
| 00:47 | swarthy | so you 'lein new myapp' then cd myapp then 'lein repl' (+ 1 2) |
| 00:48 | swarthy | do you get 3? |
| 00:48 | sshack | Yeah. It's only my own functions that have this problem. |
| 00: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. |
| 00:49 | sshack | myapp/foo.clj |
| 00:50 | sshack | erm src/myapp/foo.clj |
| 00:51 | sshack | https://www.refheap.com/20900 |
| 00:52 | sshack | https://www.refheap.com/20901 <- With code this time. |
| 00:54 | swarthy | I don't think your testapp.foo is compiled. |
| 00:54 | swarthy | I'm trying to figure out how to do that at the repl. |
| 00:55 | swarthy | try (compile 'testapp.foo) |
| 00:55 | swarthy | then what you did before |
| 00:57 | sshack | Okay, now that is stupid. |
| 00:59 | sshack | So why do I have to compile this? |
| 00:59 | swarthy | Clojure is a compiled language. |
| 00:59 | swarthy | but also try (use 'foo.bar :reload-all) |
| 01:00 | swarthy | replace foo.bar with what you have |
| 01:00 | sshack | And why wasn't that mentioned in any tutorial somewhere? |
| 01:00 | swarthy | You should use LightTable when you are first getting started. |
| 01:00 | swarthy | It will make working with it all super easy. |
| 01:02 | swarthy | 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. |
| 01:02 | swarthy | You just open your project folder. then press ctrl-enter to evaluate your code |
| 01:02 | swarthy | and the results show up right next to it |
| 01:02 | sshack | I'm still missing something as I know I've done this in the past. |
| 01:02 | sshack | Yeah, I know about lt. |
| 01:03 | swarthy | What do you know you have done? |
| 01:04 | sshack | Loaded all my code and called functions in a different ns. |
| 01:07 | swarthy | you could (require 'myapp.foo) then (myapp.foo/bar x) should work |
| 01:08 | swarthy | or (require '[myapp.foo :as foo]) then use (foo/bar x) |
| 01:11 | `cbp_ | why is haskell so hard lol |
| 01:12 | `cbp_ | worst syntax ;-; |
| 01:17 | danneu | i could never find a good workflow with haskell |
| 01:17 | danneu | especially when i'm used to evaluating the line i'm looking at in a file with cloclo |
| 01:23 | brainproxy | cloclo? |
| 01:23 | sshack | swarthy Right. So my problem seems to come down entirely to my code vs others code. |
| 01:24 | sshack | 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. |
| 01:24 | sshack | But that's enough for tonight. I"m starting to make mistakes. |
| 01:25 | swarthy | yeah, ask tomorrow during the day. More experienced people will be around and I am sure they can sort you out! |
| 01:41 | bitemyapp | arrdem: alright, Linux machine gets a monopoly on the KVM for awhile, I need to get some work done ^_^ |
| 01:41 | bitemyapp | arrdem: stealing your idea (mostly) |
| 02:16 | Ember- | ambroseb_: yes, I know that |
| 02:16 | Ember- | but type checking can do sanity checking for you |
| 02:17 | Ember- | if your function just wants map as a parameter and nothing else will do then type checking is way to go |
| 02:17 | Ember- | and that was the original problem mentioned |
| 02:18 | Ember- | 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 |
| 02:18 | Ember- | and I tried to tell him that he needs to change the way he thinks about his function signatures in general |
| 02:18 | Ember- | but there are cases when you need to be explicit and that's a great place for either contracts or typed clojure |
| 02:19 | Ember- | where typed clojure of course is way more comprehensive choice |
| 02: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. |
| 02:45 | ambroseb_ | whether these functions blow up or have undefined behaviour on weird input is another matter |
| 02:51 | bitemyapp | ambroseb_: interfaces that actually need to handle such a thing usually break out into discrete type dispatch eventually anyway |
| 02:52 | Ember- | ambroseb_: I agree what you say, maybe I expressed myself badly |
| 02: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. |
| 02: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 |
| 02:53 | Ember- | when it makes sense |
| 02:53 | Ember- | and in clojure world you usually want to pass around datastructures |
| 02:54 | Ember- | when I've taught Clojure for Java programmers I've noticed that is the no. 1 problem they are facing |
| 02:54 | Ember- | 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 |
| 02:54 | bitemyapp | Ember-: that doesn't actually happen very often. |
| 02:54 | bitemyapp | at best, you're writing functions for data that is vaguely "mappy" or vaguely "iterable" |
| 02:55 | bitemyapp | these are concepts trivially reified in a static type system that isn't made of ass and fail like Java's |
| 02:55 | Ember- | bitemyapp: true, but that doesn't mean that isn't a good thing when it's possible |
| 02: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. |
| 02:56 | bitemyapp | Ember-: you get a lot more mileage out of knowing things than you do not knowing things. |
| 02:56 | Ember- | of course |
| 02: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 |
| 02:56 | Ember- | like I said, I expressed myself badly obviously |
| 02:56 | bitemyapp | Ember-: there are many wonderful things about Clojure, none of them have to do with having a primitive type system. |
| 02:57 | Ember- | and that must be the reason why I said typed clojure is great, right? |
| 02:57 | Ember- | I *do* know all of these things |
| 02:57 | bitemyapp | this conversation isn't for just you and I |
| 02:57 | bitemyapp | sometimes I expound on things just to disseminate ideas |
| 02:58 | bitemyapp | same reason I tweet things. |
| 02: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 |
| 02:58 | Ember- | but I've also faced situations where all I care is some little thing in the parameter and rest can be whatever |
| 02:59 | Ember- | the latter has *always* been more generic and used in more places |
| 02:59 | bitemyapp | you always care, it's just a question of how much you're thinking about it |
| 02:59 | bitemyapp | the only time you truly don't care about your parameters or data you're using is when you're not actually using them |
| 02:59 | Ember- | yeah, if you don't care then you don't need that function |
| 02:59 | bitemyapp | you're always relying on *something* to be true |
| 02:59 | bitemyapp | the question is how specific and well thought out those things are |
| 03:00 | Ember- | yes, but my original statement comes from the guys coming from static typed world |
| 03:00 | Ember- | especially java guys |
| 03:00 | bitemyapp | java doesn't represent anything good or interesting about static type systems |
| 03:00 | Ember- | since they just can't think that's a real option to *not* be *completely* strict |
| 03:00 | bitemyapp | Java as a language is a vehicle for hate, fear, and human misery. |
| 03:00 | Ember- | hehe |
| 03:01 | Ember- | it has many, many things done wrong |
| 03:01 | Ember- | but it is better than some alternatives :) |
| 03:01 | Ember- | take PHP for example |
| 03:01 | Ember- | or C++ |
| 03:02 | Ember- | everything is relative to where you compare it |
| 03:02 | Ember- | if you compare java to clojure or haskell then yes, I agree with you completely |
| 03:03 | bitemyapp | Clojure doesn't meaningfully have a type system, so it doesn't belong on that spectrum. |
| 03:03 | Ember- | especially to haskell since we were talking about static typing |
| 03:03 | bitemyapp | Clojure has a type system like a bald man has a hair style. |
| 03:04 | Ember- | but this conversation is pointless, we obviously think likewise |
| 03:04 | Ember- | I need to work :P |
| 03:04 | bitemyapp | Ember-: I need to write Haskell code, soothe my soul :P |
| 03:05 | Ember- | bitemyapp: feel sorry for me, I'm writing Java |
| 03:05 | Ember- | my last project was with Clojure :( |
| 03:05 | Ember- | oh, and it's a legacy system |
| 03: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. |
| 03:05 | Ember- | so, legacy system written in Java |
| 03:06 | bitemyapp | There's some legacy at my company, but it's Python and a startup so only so much pain is possible. |
| 03:06 | Ember- | I've tried to convince the customer that certain parts would make sense if it was in Clojure (which it would) |
| 03:06 | Ember- | but they think that's something bad and hipster |
| 03:06 | Ember- | same as they think WebLogic is great |
| 03:07 | Ember- | even though I presented them with arguments that it isn't and it's actually just costing them a lot of money for nothing |
| 03:07 | Ember- | and making our lives more miserable |
| 03:07 | bitemyapp | Ember-: you need to find a new customer or rejigger that relationship yo. |
| 03:07 | bitemyapp | Life is too short to write Java. |
| 03:07 | Ember- | fortunately I get out of this project by the end of the year |
| 03:07 | bitemyapp | Good. |
| 03:08 | bitemyapp | Ember-: my current life improvement goal is getting out of the bay area. I've heard good things about Seattle, Portland, and Austin. |
| 03:08 | bitemyapp | I don't know how soon a departure could happen, it's looking like a 1-2 year goal. |
| 03:08 | Ember- | well, I live in Finland :) |
| 03:09 | bitemyapp | Ember-: I don't know if I would be very happy working as a programmer outside of the US. |
| 03:10 | bitemyapp | I guess there are some Haskell and Clojure companies outside of the US, but it can be harder to find. |
| 03:10 | Ember- | bitemyapp: very true |
| 03:11 | Ember- | but fortunately in Finland Clojure is raising it's head *hard* |
| 03:11 | Ember- | quite a many companies have either started using it or are considering |
| 03:11 | Ember- | Haskell is still in minority |
| 03:11 | bitemyapp | Ember-: JVM host for Clojure helping there I imagine? |
| 03:12 | bitemyapp | I think people overestimate the usefulness of being on the JVM, personally, but if it sells it sells. |
| 03:13 | TEttinger | bitemyapp, it's been a pretty huge selling point for me, since I learned Java before any lisps |
| 03:14 | TEttinger | it does let me back into comfortable mutable java libs for tasks where that makes sense |
| 03: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. |
| 03:14 | TEttinger | yes. |
| 03:15 | bitemyapp | I could name a few that have given me grief as a result |
| 03:15 | TEttinger | but would it be better anywhere else? |
| 03: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. |
| 03: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. |
| 03:16 | bitemyapp | Another reason I'm meh about the JVM is that I really like having fast-starting binaries. |
| 03:16 | bitemyapp | or scripts. |
| 03:16 | TEttinger | that too. |
| 03:17 | bitemyapp | I do a lot of odd-and-end scripting/automation/binary distribution/dev-opsy stuff |
| 03:17 | bitemyapp | Clojure is...not great for that. |
| 03:17 | bitemyapp | I end up setting up a REPL and trying to do what I need to do in "batch" |
| 03:17 | bitemyapp | which works okay up to a point, but it's not really what I want. |
| 03:22 | Ember- | bitemyapp: indeed, that's the reason |
| 03:22 | Ember- | and the fact that you can call java code from clojure easily |
| 03:22 | Ember- | so there's an existing ecosystem |
| 03:23 | Ember- | 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 |
| 03:23 | Ember- | but that is a compelling argument anyway for management |
| 04:30 | ambrosebs | isn't the docstring for iterate incorrect? |
| 04:30 | ambrosebs | ,(doc iterate) |
| 04:30 | clojurebot | "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects" |
| 04:30 | ambrosebs | (class (iterate + 1)) |
| 04:30 | ambrosebs | ,(class (iterate + 1)) |
| 04:30 | clojurebot | clojure.lang.Cons |
| 04:30 | ambrosebs | that's not a LazySeq |
| 04:33 | ambrosebs | the implementation looks fishy |
| 04:33 | ambrosebs | (cons x (lazy-seq ...)) vs (lazy-seq (cons x ...)) |
| 04:34 | ambrosebs | second arity of reductions has the same problem |
| 04:40 | ambrosebs | Cons is just as lazy as LazySeq right? |
| 04:40 | ambrosebs | so this is probably not a problem. |
| 04:41 | ambrosebs | from a typing perspective, I'm not sure what to give the return type of iterate as |
| 04:41 | ambrosebs | I guess ISeq or ASeq |
| 04:41 | ambrosebs | in fact LazySeq sounds optimistic for *any* sequence operation return type |
| 04:42 | ambrosebs | like Cons, LazySeq is just an implementation of ASeq |
| 04:44 | clgv | ambrosebs: no. you are right. cons is not lazy. the first element of that sequence is already realized |
| 04:44 | ambrosebs | clgv: well it's already realised by passing to iterate. |
| 04:44 | ambrosebs | but yes |
| 04:45 | clgv | ambrosebs: yeah that's true. but we are arguing about the properties of the return value |
| 04:46 | clgv | ambrosebs: I wonder if that is supposed to be some (pre-mature?) optimization |
| 04:46 | ambrosebs | clgv: it seems unlikely, the first arity of repeat has the same idiom but backwards |
| 04:47 | ambrosebs | I think it's just an unintentional inconsistency. The big question for me: what does the documentation mean exactly by "returns a lazy sequence". |
| 04:47 | clgv | ambrosebs: well, than I'd regard it as an error but with most likely no practical implications |
| 04:48 | clgv | ambrosebs: the documentation clearly shoots for the behaviour repeat exposes |
| 04:49 | ambrosebs | There are Seqs that are never lazy at all right? So a "lazy sequence" must mean a LazySeq I guess |
| 04:49 | ambrosebs | I mean, a partially lazy Cons is even incorrect, but yea. |
| 04:50 | ambrosebs | Hmm actually is there an implementation of ISeq that is eager? |
| 04:51 | ambrosebs | probably not relevant. |
| 05:10 | clgv | ambrosebs: yes. PersistentList implements ISeq ;) |
| 05:11 | ambrosebs | clgv: :) |
| 07:08 | djpowell | Hmm, sourcemaps don't work on Windows, under advanced mode, or various other combinations of options |
| 07:09 | djpowell | Seems to be to do with the relative path munging and backslashes and stuff |
| 08: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. |
| 08:56 | danielszmulewicz | IRC is quiet because everybody's at the clojure_conj? |
| 08:56 | danielszmulewicz | :-) |
| 08:56 | danielszmulewicz | jealous |
| 08:56 | Ember- | no, I'm cursing Java code |
| 09:00 | mdrogalis | danielszmulewicz: Correct. |
| 09:01 | danielszmulewicz | mdrogalis: :) |
| 09:04 | clgv | danielszmulewicz: it's wakeup time for those in GMT - 8 I guess ;) |
| 09:06 | danielszmulewicz | Oh right. I always forget |
| 09:30 | ambrosebs | is it clojure_conj because it sounds like conf, or (into conference people) ? :) |
| 09:31 | cark | because it's conj'ing people together ? |
| 09:31 | mdrogalis | Hah, ambrosebs |
| 09:31 | echo-area | Which http client would you suggest? http-kit, clj-http, or http.async.client? |
| 09:32 | ambrosebs | cark: (into conference people) is the same as (apply conj conference people) :) |
| 09:32 | cark | if a little obfuscated ! |
| 09:34 | cark | you know what, i never used conj with more than one item to be conj'ed |
| 09:34 | cark | didn't even know it was possible |
| 09:34 | cark | been using clojure since before 1.0 |
| 09:34 | cark | ... |
| 09:35 | mdrogalis | I recently learned you can do: |
| 09:35 | mdrogalis | ,(assoc [1 2] 0 3) |
| 09:35 | clojurebot | [3 2] |
| 09:35 | mdrogalis | Had no idea assoc could do that. |
| 09:35 | cark | ,(get [1 2] 1) |
| 09:35 | clojurebot | 2 |
| 09:36 | cark | i'd say it's vectors that can do it |
| 09:36 | mdrogalis | You get my point :P |
| 09:36 | cark | hehe yep |
| 09:38 | philandstuff | vectors are Associative |
| 09:42 | clgv | ambrosebs: no, `into` uses transients and is more efficient ;) |
| 09:42 | clgv | ambrosebs: I thought the "conj"ing together people might be the reason... |
| 09:43 | clgv | ambrosebs: is there a "clojure cons" in front of the toillets at "clojure conj"? ;) |
| 09:44 | ambrosebs | clgv: :) |
| 09:47 | Aim_Here | The "clojure dissoc" happens when people decide to form squabbling factions and excommunicate each other from the Clojure community |
| 09:47 | cark | disj ! |
| 09:48 | mdrogalis | Heh |
| 09: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}} |
| 09: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 :) |
| 09: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 |
| 09:59 | arrdem | echo-area: clj-http is what I see getting the most use... but they all do the same job. |
| 09: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) |
| 09:59 | uruviel | *thank you |
| 09:59 | echo-area | arrdem: I got the same idea on a stackoverflow page. Thank you! |
| 09: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 | uruviel | 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 | mikerod | 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 | technomancy | 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 | pjstadig | like if you get an exception poping one of the bindings, then what do you do with the rest |
| 11:28 | pjstadig | 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 | mikerod | 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 | danneu | 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 | danneu | 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 | danneu | (while my monologue is on the subject of recent things i've started doing) |
| 12:17 | danneu | feel free to siphon some of my awesomeness into your own projects. |
| 12:17 | danneu | 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 | xificurC | i think the best i could do was run an nrepl session via leiningen and then jack in |
| 12:23 | xificurC | 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 | danneu | 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 | xificurC | 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 | xificurC | 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 | xificurC | shouldnt leiningen compile on 7u21? |
| 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 | mpwd | Does anyone know the fastest JSON parsing library for clojure? |
| 12:43 | mtp | is json parsing a measurable bottleneck in your code? |
| 12:43 | mtp | 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 | indigo | Maybe I should ask in ##php |
| 12:55 | indigo | :P |
| 12:56 | S11001001 | arrdem: null converts to 0 |
| 12:57 | S11001001 | 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 | arrdem | 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 | arrdem | 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 | arrdem | clojurebot: ping |
| 13:19 | clojurebot | "-1" |
| 13:19 | clojurebot | 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 | joegallo | it's just a minor improvement, though |
| 13:39 | joegallo | 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 | pjstadig | i forget what it does https://github.com/pjstadig/new.dotfiles/blob/master/.gitconfig#L23 |
| 13:51 | pjstadig | it helps git find a useful chunk of text to show at the top of a diff |
| 13:51 | pjstadig | 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 | joegallo | which is an amazing coincidence |
| 13:52 | pjstadig | haha, yeah that is an amazing coincidence |
| 13:52 | pjstadig | if only i actually read chats before i opened my big mouth |
| 13:56 | joegallo | heh, no worries, brotha |
| 13:57 | arrdem | didn't someone put together a custom git frontend that actually stored Clojure code structurally rather than textually? |
| 13:57 | arrdem | 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 | bitemyapp | errr...arrdem ^^ |
| 14:02 | bitemyapp | 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 | bitemyapp | 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 | danenania | if so, is there a way to stop it doing so? can i annotate string keys with ^:export? |
| 14:06 | danenania | apparently i can't annotate string keys |
| 14:08 | bitemyapp | danenania: don't do that. |
| 14:08 | bitemyapp | 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 | 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 | bitemyapp | arrdem: "complecting" things together instead of making composable tools isn't the answer. |
| 14:18 | bitemyapp | 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 | technomancy | "it's a feature, not a bug" |
| 14:20 | arrdem | ^ this |
| 14:20 | arrdem | 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 | bitemyapp | 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 | technomancy | 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 | 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 | bitemyapp | 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 | technomancy | it was pretty awkward |
| 14:24 | technomancy | had to pull in a crazy adapter class from a random openstreetmap jar |
| 14:24 | technomancy | 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 | technomancy | https://github.com/heroku/buildkits/blob/master/project.clj#L15 |
| 14:25 | technomancy | 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 | technomancy | 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 | bitemyapp | `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 | bitemyapp | `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 | bitemyapp | seangrove: mark went over to the Go camp a long time ago |
| 14:32 | technomancy | seangrove: I'm not really "there" |
| 14:33 | technomancy | 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 | bitemyapp | `cbp: Leiningen test selectors in the REPL |
| 14:33 | technomancy | bitemyapp: well |
| 14:34 | technomancy | 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 | indigo | 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 | bitemyapp | ~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 | `cbp | 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 | cmiles74 | 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 | bitemyapp | or make it nicer. or something. |
| 14:40 | bitemyapp | cmiles74: hrm, that would be nice. |
| 14:40 | bitemyapp | 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 | bitemyapp | `cbp: ah, he already has support for a memory-index. |
| 14:41 | bitemyapp | 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 | bitemyapp | `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 | bitemyapp | `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 | `cbp | 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 | `cbp | :-p |
| 14:44 | bitemyapp | `cbp: which? |
| 14:46 | `cbp | bitemyapp: the example right before 3.2.3 i think |
| 14:47 | `cbp | 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 | `cbp | or uh something similar i can't quite remember what i wanted |
| 14:52 | `cbp | the python driver had something i wanted |
| 14:53 | bitemyapp | `cbp: I fixed that Haskell program. |
| 14:53 | bitemyapp | `cbp: do you want to see? |
| 14:54 | bitemyapp | `cbp: data Complex a = Complex { real :: a, img :: a} <--- I made it parametric and removed the typeclass qualifier. |
| 14:54 | bitemyapp | λ> real c |
| 14:54 | bitemyapp | 1.0 |
| 14:54 | bitemyapp | it was referring to an "a" that hadn't been passed to the type constructor (parametric type constructor) |
| 14:54 | bitemyapp | 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 | `cbp | or i guess its just that line |
| 14:56 | bitemyapp | it's just that line. |
| 14:56 | bitemyapp | data Complex = Num a => Complex { real :: a, img :: a} -- old |
| 14:56 | bitemyapp | data Complex a = Complex { real :: a, img :: a} -- new |
| 14:56 | bitemyapp | the problem is "a" can be anything right now |
| 14:56 | bitemyapp | so I need to figure out how to readd the Num constraint. |
| 14:58 | bitemyapp | `cbp: you can do this too: data Complex a b = Complex { real :: a, img :: b} |
| 14:58 | bitemyapp | tho I don't know why you would. |
| 14:58 | bitemyapp | I'm figuring out why my typeclass qualification makes the type decl existential. |
| 15:01 | bitemyapp | sorry, GADT issue. |
| 15:01 | bitemyapp | `cbp: that specific syntax actually got deprecated. |
| 15:01 | bitemyapp | `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 | bitemyapp | sigh. |
| 15:02 | `cbp | lol |
| 15:02 | bitemyapp | `cbp: #haskell can't agree on what #haskell thinks about Yann's tutorial. |
| 15:02 | bitemyapp | 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 | bitemyapp | you don't constrain the types of your data |
| 15:03 | bitemyapp | you constrain the types of your functions. |
| 15:03 | bitemyapp | `cbp: ^^ |
| 15:04 | bitemyapp | noprompt: long time no see. |
| 15:04 | bitemyapp | noprompt: the age of Grom is upon us. |
| 15:05 | bitemyapp | noprompt: Prepare thyself and thy Salad: http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/ |
| 15:05 | `cbp | oh uhm |
| 15:05 | `cbp | 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 | noprompt | 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 | noprompt | 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 | noprompt | ^ 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 | justin_smith | 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 | seangrove | 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 | also | i *think* i'm using r2030 |
| 16:18 | bitemyapp | seangrove: are we still doing Lava? |
| 16:21 | bitemyapp | 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 | TimMc | 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 | TimMc | 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 | pjstadig | http://lmgtfy.com/?q=phil+bagwell |
| 16:26 | bitemyapp | pjstadig: that's just mean :( |
| 16:27 | bitemyapp | 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 | pjstadig | 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 | pjstadig | 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 | pjstadig | and adds some features to them |
| 16:30 | augustl | iirc Clojure is unique in that they're completely immutable? |
| 16:30 | augustl | 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 | technomancy | 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 | pjstadig | reading the code second best |
| 16:32 | pjstadig | (aside from reading the papers) |
| 16:32 | also | seangrove: it's :emit-constants |
| 16:32 | also | 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 | bitemyapp | technomancy: is there a stream?! |
| 16:40 | technomancy | bitemyapp: I'm ... present |
| 16:40 | technomancy | 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 | bitemyapp | technomancy: who used juxt? |
| 16:41 | technomancy | biggbear: yeah; there's no way afaik to refer it everywhere though |
| 16:41 | technomancy | bitemyapp: alan dipert had a juxt in his lisp-in-bash impl |
| 16:42 | technomancy | 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 | technomancy | bitemyapp: wayt |
| 16:43 | technomancy | wait |
| 16:43 | bitemyapp | technomancy: wut |
| 16:44 | pjstadig | wat |
| 16:44 | technomancy | what is going on with the #() |
| 16:44 | technomancy | 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 | bitemyapp | 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 | bitemyapp | that's how I knew to add the wrapper >:) |
| 16:47 | bitemyapp | 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 | justin_smith | 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 | bitemyapp | I end up doing manual "negative" tests before proceeding with a change that I am running the tests to verify. |
| 16:49 | bitemyapp | 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 | justin_smith | 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 | justin_smith | or a ref |
| 16:56 | noncom | cool! |
| 16:57 | noncom | thanks! |
| 16:57 | justin_smith | n/p |
| 16:57 | justin_smith | 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 | justin_smith | but the DAG will help with that |
| 16:58 | noncom | yes, DAG is a radical approach |
| 16:58 | bitemyapp | hello 90s. |
| 16:58 | bitemyapp | 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 | bitemyapp | 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 | noncom | no tailcall optimisation makes the mutable approach the best here |
| 17:01 | noncom | justin_smith: you said "most", what datastructures it can't help to build? |
| 17:02 | justin_smith | noncom: just hedging my bet |
| 17:02 | justin_smith | :) |
| 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 | justin_smith | 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 | justin_smith | TIL, thanks |
| 17:08 | TEttinger | justin_smith, hypergraphs are barely used and the one implementation I have found is awfully slow. |
| 17:08 | TEttinger | 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 | justin_smith | *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 | justin_smith | 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 | noncom | 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 | justin_smith | and I want my code to be runnable on the client |
| 17:15 | justin_smith | or the server |
| 17:15 | justin_smith | 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 | seangrove | 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 | bitemyapp | seangrove: http://www.gnu.org/software/emacs/manual/html_node/emacs/Reverting.html |
| 17:18 | bitemyapp | 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 | justin_smith | (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 | justin_smith | no, not sit-for |
| 17:23 | justin_smith | 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 | JohnCMadison_ | i wonder why |
| 17:44 | JohnCMadison_ | thanks TimMc |
| 17:45 | TimMc | IIRC, it may not work properly at the top level. |
| 17:45 | TimMc | &(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 | bitemyapp | 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 | TimMc | 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 | bitemyapp | whether it should nil the value out or remove the attribute properly |
| 17:49 | bitemyapp | 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 | bitemyapp | TimMc: amalloy mostly discussed the nesting issue |
| 17:49 | bitemyapp | and I* |
| 17:49 | TimMc | They all seem pretty straightforward to me, but I can see where argument would arise. |
| 17:49 | TimMc | (yes, remove, {}) |
| 17:50 | TimMc | 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 | bitemyapp | 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 | Apage43 | the problem with that |
| 17:52 | Apage43 | 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 | Apage43 | and I dissoc it empty and the assoc onto the thing I dissoced from |
| 17:52 | Apage43 | 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 | TimMc | 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 | TimMc | Err, that second ..map.. should really be the first expression. |
| 17:56 | bitemyapp | TimMc: that sort of symmetry would certainly be nice. |
| 17:57 | bitemyapp | 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 | bitemyapp | 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 | bitemyapp | 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 | Apage43 | 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 | bitemyapp | 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 | bitemyapp | arrdem: Prepare yourself...the category theory memes are coming... |
| 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 | bitemyapp | 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 | bitemyapp | echo-area: it makes interop awkward and generally multimethods + maps suffice for what you'd want to do. |
| 20:05 | bitemyapp | 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 | echo-area | 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 | 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 | seangrove | ,(.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 | seangrove | 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 | justin_smith | err |
| 20:24 | seangrove | Also, upon inspection, getYear seems to be a bit strange |
| 20:24 | seangrove | "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 | justin_smith | 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 | justin_smith | it is like a single arm if |
| 21:10 | justin_smith | with no else |
| 21:11 | justin_smith | 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 | xuser | 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 | justin_smith | 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 | justin_smith | that technomancy for example is wont to make |
| 21:38 | justin_smith | because null has an implicit do |
| 21:38 | justin_smith | otherwise, you can use or |
| 21:38 | justin_smith | err |
| 21:38 | justin_smith | I mean and, of course :) |
| 21:38 | justin_smith | ,(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 | `cbp | this is embarassing |
| 21:49 | `cbp | i'll sweep them under the rug after the next patch.... |
| 21:50 | bitemyapp | `cbp: happens to the best of us :) |
| 21:50 | bitemyapp | `cbp: at least you're so productive you forget your own work! |
| 21:50 | bitemyapp | `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 | bitemyapp | or huskar. |
| 21:52 | bitemyapp | `cbp: well get the patch going, what's the ETA? |
| 21:52 | `cbp | bitemyapp: wanna play LoL |
| 21:52 | `cbp | 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 | bitemyapp | `cbp: they'd be better get started downloading too :) |
| 21:55 | bitemyapp | `cbp: also we should do voice. Do you typically use mumble, teamspeak, or in-game? |
| 21:55 | bitemyapp | I guess in-game is easiest. |
| 21:55 | bitemyapp | 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 | arrdem | s/box/ss9/ |
| 21:57 | bitemyapp | arrdem: what's an ss9? |
| 21:58 | `cbp | bitemyapp: 30 min |
| 21:58 | `cbp | 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 | bitemyapp | arrdem: the thing is, if we're playing DotA2, we can just use in-game. |
| 22:00 | bitemyapp | arrdem: which if we don't have a full team of 5, we should do. |
| 22:00 | bitemyapp | 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 | bitemyapp | 1d1 |
| 22:01 | clojurebot | 1 |
| 22:01 | bitemyapp | 1d0 |
| 22:01 | bitemyapp | AHA |
| 22:01 | arrdem | bitemyapp: sorry. samsung series 9 |
| 22:01 | bitemyapp | arrdem: what gfx chip? |
| 22:01 | bitemyapp | 1d9000000000000000000000000000000000000000000000000 |
| 22:01 | bitemyapp | 1d10000000000000000000 |
| 22:01 | bitemyapp | 1d10000 |
| 22:01 | clojurebot | 2434 |
| 22:01 | bitemyapp | 1d100000000000000000000 |
| 22:01 | bitemyapp | 1d100000000 |
| 22:01 | bitemyapp | 1d100000 |
| 22:01 | clojurebot | 21888 |
| 22:02 | arrdem | bitemyapp: intel integrated like a bau5 |
| 22:02 | bitemyapp | hrm. |
| 22:02 | bitemyapp | 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 | `cbp | er lol |
| 22:03 | bitemyapp | no |
| 22:03 | bitemyapp | arrdem: according to Valve, they were able to make their in-house game engines run better on Linux |
| 22:03 | bitemyapp | `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 | bitemyapp | `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 | `cbp | 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 | bitemyapp | 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 | egghead | oh nvm |
| 22:09 | egghead | derps |
| 22:09 | bitemyapp | egghead: way2go |
| 22:09 | `cbp | no one saw that |
| 22:09 | `cbp | 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 | bitemyapp | arrdem: sent you my steam name |
| 22:15 | arrdem | bitemyapp: I think I got you. there are two of you. |
| 22:16 | arrdem | badass. headset online. |
| 23:41 | sritchie | hey all - do you guys know if it's possible to turn on http compression using http-kit? |