2013-06-14
| 00:09 | CaptainLex | futile: I love you, please keep saying things every now and then |
| 00:09 | futile | CaptainLex: uhh |
| 00:10 | futile | CaptainLex: Okay I get the point, I'll shut up |
| 00:10 | CaptainLex | <futile> I'm not gonna lie about it: programming is hard. <--- If I did usenet, this would be in my sig |
| 00:13 | jack_rabbit | I'm not gonna lie about it: programming is fun. |
| 00:13 | CaptainLex | Fun and hard are my two favorite things |
| 00:13 | jack_rabbit | kinky. |
| 00:17 | futile | I'm going to make this code really inefficient right now, because it'll be Good Enough™ and I can optimize it later as needed. |
| 00:17 | futile | I mean O(n^2) |
| 00:18 | CaptainLex | futile: What's the asymptotic minimum for the data set? |
| 00:18 | futile | 3 |
| 00:19 | futile | I mean, I have no idea. |
| 00:19 | CaptainLex | Hahaha |
| 00:19 | futile | (what that means) |
| 00:19 | CaptainLex | Ahhh |
| 00:19 | CaptainLex | I mean |
| 00:19 | hadronzo` | I'm trying to use net.clojure/monads in a clojurescript project, but the compiler complains that "required "monads.core" namespace never provided". The dependency correctly downloaded when calling lein deps and I called "lein cljsbuild clean". Any ideas as to why the namespace can't be found? |
| 00:19 | CaptainLex | what's the theoretical bottom limit for the kind of algorithm? |
| 00:19 | futile | CaptainLex: no idea. |
| 00:20 | futile | CaptainLex: it's this guy: https://github.com/evanescence/test2/blob/master/test/test2/finder_test.clj |
| 00:21 | futile | technomancy: psst |
| 00:21 | noahlz | is there a more concise way to write boolean expressions like this: |
| 00:22 | noahlz | (and (or (zero? foo) (= 1 foo)) |
| 00:22 | noahlz | (or (zero? bar) (= 1 bar)) |
| 00:22 | noahlz | (pos? bazz)) |
| 00:22 | jack_rabbit | looks pretty concise to me. |
| 00:22 | noahlz | compound boolean expressions rather |
| 00:22 | CaptainLex | Well, I mean |
| 00:22 | noahlz | yeah, just something feels...wrong about it |
| 00:22 | CaptainLex | you might be able to factor in something about xors |
| 00:23 | CaptainLex | write down the boolean logic and see if it can be simplified in algebra |
| 00:23 | CaptainLex | Other than, any more concise might be confusing later on |
| 00:23 | noahlz | hmm probably right |
| 00:24 | TheBusby | noahlz: juxt? |
| 00:24 | noahlz | hmm |
| 00:24 | clojurebot | No entiendo |
| 00:25 | noahlz | TheBusby: different inputs |
| 00:25 | noahlz | or args rather |
| 00:26 | TheBusby | likely fine as is, but I usually try to abstract out bits like (zero-or-one? foo) |
| 00:26 | TheBusby | since it usually describes a special property of the data |
| 00:26 | TheBusby | that isn't always the case though :/ |
| 00:27 | futile | TheBusby: I was thinking the same thing, zero-or-one? |
| 00:27 | TheBusby | futile: just an example to describe the above |
| 00:28 | futile | unrelated. |
| 00:28 | futile | I've been working on the same exact problem all day. |
| 00:28 | futile | And it's feeling really ridiculous. |
| 00:28 | jack_rabbit | noahlz, how about: (letfn [(x [y] (or (zero? y) (= 1 y)))] (and (x foo) (x bar) (pos? bazz))) |
| 00:29 | noahlz | figured it out |
| 00:29 | futile | noahlz: do go on.. |
| 00:29 | noahlz | (and |
| 00:29 | noahlz | (or (#{0 1} foo)) |
| 00:29 | noahlz | (or (#{0 1} bar)) |
| 00:29 | noahlz | (pos? bazz)))))) |
| 00:30 | noahlz | foo and bar can be 0 or 1 |
| 00:30 | TheBusby | why or? |
| 00:30 | noahlz | hmm |
| 00:31 | noahlz | no more need for or! |
| 00:31 | metellus | ,(every? #{0 1} [1 0]) |
| 00:31 | clojurebot | true |
| 00:31 | noahlz | nice |
| 00:31 | jack_rabbit | ooh, nice. |
| 00:31 | malyn | (and (> 2 foo -1) (> 2 bar -1)) seems simpler? |
| 00:31 | TheBusby | ^^^ best |
| 00:32 | futile | I vote for the every? solution |
| 00:32 | malyn | Agreed, every? is nice. |
| 00:32 | noahlz | i'm going to inline a sequence to be able to call every? |
| 00:32 | futile | (and (every? #{0 1} [foo bar]) (pos? baz)) |
| 00:33 | CaptainLex | Which of these two bots is the evaluating one? |
| 00:33 | noahlz | hahah |
| 00:33 | noahlz | hmm |
| 00:34 | metellus | they both do ##(every? #{0 1} [0 1 0 0 1 1]) |
| 00:34 | lazybot | ⇒ true |
| 00:34 | futile | I got past a theoretical problem earlier today, and thought "yay, now all I have left is to write some code and this thing is done!" |
| 00:34 | futile | but it turns out, this is super-hard college-level algorithmics |
| 00:34 | futile | and the only solution that supposedly works is one I can't even read. |
| 00:36 | CaptainLex | futile: Sounds intriguing! Links? |
| 00:36 | futile | CaptainLex: https://github.com/evanescence/test2/blob/master/test/test2/finder_test.clj |
| 00:36 | CaptainLex | Ahaha the same one. I'm sorry ;( |
| 00:39 | futile | Welp, God obviously wants me to put test2 down for a few minutes/days. |
| 00:39 | futile | Probably to focus more on work. |
| 00:40 | futile | So that's that. He's the boss. |
| 00:41 | jack_rabbit | sounds futile to me... |
| 00:42 | futile | jack_rabbit: yeah, it's futile to do anything outside of God's will. hence the nick. |
| 00:42 | Denommus | is there a function to get the user's home directory? |
| 00:43 | Raynes | futile: Are you evanescence? |
| 00:43 | futile | Raynes: yes why |
| 00:43 | Raynes | futile: Can I have an autograph? |
| 00:43 | futile | Raynes: uhh.. what's the joke? |
| 00:43 | futile | oh, the band. |
| 00:44 | Raynes | http://en.wikipedia.org/wiki/Evanescence |
| 00:44 | Raynes | I was wondering who the guy who sent me a README change was, futile. |
| 00:44 | futile | Raynes: https://www.google.com/search?q=define%3Aevanescence |
| 00:44 | Denommus | guise. Srsly. Srsly, guise |
| 00:45 | Raynes | Denommus: Yes. |
| 00:45 | Raynes | Hold on a damned second. |
| 00:45 | Raynes | :p |
| 00:45 | futile | Raynes: docs are a fundamental part of any project. no docs = dying/dead project. |
| 00:45 | futile | bad docs = dying/dead project |
| 00:45 | Raynes | futile: Well, you didn't add docs. You changed them. |
| 00:45 | futile | every line counts. |
| 00:45 | Denommus | my wife is insisting for me to sleep, and I need to do JUST that |
| 00:45 | futile | Denommus: but someone is WRONG on the internet! |
| 00:45 | Raynes | Denommus: https://github.com/Raynes/fs/blob/master/src/me/raynes/fs.clj#L24 |
| 00:45 | Denommus | futile: speak that to every company, ever |
| 00:45 | Raynes | Denommus: (System/getProperty "user.home") |
| 00:45 | Raynes | homeboy |
| 00:46 | futile | Denommus: all I can do is change what I'm in control of |
| 00:46 | Denommus | did you see that Trillian opened its new protocol? |
| 00:46 | futile | Oh man I remember Trillian 0.71 or whatever |
| 00:47 | Raynes | I'm definitely all up on Trillian news. |
| 00:47 | Raynes | Said nobody in the '10s ever. |
| 00:47 | futile | I made some skins for it! |
| 00:47 | Denommus | it's not about trillian per se, but about another federated and open protocol :) |
| 00:48 | Raynes | $google xkcd standards |
| 00:48 | lazybot | [xkcd: Standards] http://xkcd.com/927/ |
| 00:48 | futile | yeah yeah |
| 00:48 | futile | Denommus: go to bed! |
| 00:48 | Denommus | I think I should. I'm a bit electric, though |
| 00:48 | ddellacosta | hmm, so when I call fixtures, I need to remember that the order I set them up is the opposite that they will get run, huh? Always trips me up. |
| 00:48 | Raynes | Ground yourself. |
| 00:49 | Denommus | well, I have a bunch of friends who actually use the new trillian protocol for group chatting, but Trillian's client for Android sucks because their nicks do not appear on a group chat |
| 00:50 | Denommus | I'll do a client for them, and I'm glad I got Clojure working on android |
| 00:50 | futile | ddellacosta: well, for now ;) |
| 00:50 | ddellacosta | futile: huh, what do you mean? |
| 00:51 | futile | ddellacosta: just a test2 plug |
| 00:51 | ddellacosta | ah, okay. I'll wait until I can use it to judge... |
| 00:51 | Denommus | ... shouldn't it be trivial to make a macro that reverses the order of the fixtures declarations? |
| 00:52 | Denommus | well, I'm going to bed, I already calmed down |
| 00:53 | ddellacosta | Denommus: yah, definitely. But, whatever, it's not hard to remember they are run in reverse, essentially. |
| 00:53 | futile | Denommus: good night. |
| 00:54 | Denommus | good night |
| 00:55 | futile | me too. |
| 01:01 | ddellacosta | I swear, mutability is the cause of all the pain in my life |
| 01:02 | CaptainLex | ddellacosta: xD |
| 01:02 | CaptainLex | LISPers just get me |
| 01:02 | jack_rabbit | amen, bruthuh. |
| 01:02 | ddellacosta | CaptainLex: oh, I was being dramatic, let's be clear. |
| 01:03 | ddellacosta | on the flip side, without mutability, there's a lot you can't do. |
| 01:03 | jack_rabbit | Just look at haskell. |
| 01:03 | ddellacosta | But I just got bit by it, so I was complaining (dramatically). ;-) |
| 01:03 | CaptainLex | Indeed. Like love, you just gotta put up with the bad stuff |
| 01:03 | CaptainLex | Haha rough, jack_rabbit :P |
| 01:03 | ddellacosta | what about Haskell? |
| 01:04 | CaptainLex | Haskell's inability to hot-swap code is the only thing keeping me in clojure for the foreseeable future ;) |
| 01:04 | ddellacosta | ha |
| 01:04 | callen | CaptainLex: the only thing? |
| 01:04 | callen | CaptainLex: I'd regard not having to use Template Haskell as being fairly big. |
| 01:05 | CaptainLex | callen: Haha that may well be so, I'm pretty inexperienced with FPLs that aren't Scheme |
| 01:05 | CaptainLex | And for the time being it's extremely convenient to have access to the whole Java ecosystem |
| 01:05 | callen | CaptainLex: classic Lisp macros are nice. :) |
| 01:06 | ddellacosta | okay, since I feel responsible for this discussion, I simply want to add that mutability was in fact not my problem, but a simple, stupid, syntax error. Carry on. |
| 01:06 | CaptainLex | That's the other thing: LISP being all meta appeals to me very much |
| 01:06 | CaptainLex | Haskell lacks that utterly |
| 01:07 | callen | the metaness isn't quite as kabuki-theatre-esque in Clojure as say Python or Ruby. |
| 01:07 | callen | more subtle at first, but cleaner. |
| 01:07 | brehaut | CaptainLex: go learn the typeclassopedia and come to us about haskell being more or less meta |
| 01:08 | brehaut | http://www.haskell.org/haskellwiki/Typeclassopedia |
| 01:08 | brehaut | its a different kind of meta, but it is absolutely still meta |
| 01:09 | CaptainLex | Are we talking about the code itself, or the culture? I just meant about LISP code being a list, is all. |
| 01:10 | brehaut | the code |
| 01:11 | brehaut | its not trivially representable it its primative datastructures, but thats not the only way one gets a hit of meta |
| 01:11 | CaptainLex | Hmmmm |
| 01:11 | CaptainLex | Your words have wisdom, brehaut |
| 01:11 | mindbender1 | How can I set the printed representation of a deftype? |
| 01:11 | CaptainLex | And I just tried to tab autocomplete on the word "wisdom" |
| 01:11 | CaptainLex | DWIM, KVirc |
| 01:11 | brehaut | mindbender1: *handwaveing* print-dup |
| 01:11 | callen | CaptainLex: homoiconicity is convenient and good to have, but it doesn't constantly smack you in the face like you think it will once you get started. |
| 01:13 | mindbender1 | brehaut: the doc says nothing, do you have any link I can look at? |
| 01:13 | brehaut | CaptainLex: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html thats skims the kind of metaness that haskell excells at |
| 01:14 | brehaut | mindbender1: nope. im just vaguely away that print-dup and some related multimethods is how serialisation occurs. never looked at it thoguh |
| 01:14 | jack_rabbit | Haskell seems really cool to me, but I just can't get over the lisp syntax. |
| 01:14 | mindbender1 | ok thanks reading sth already |
| 01:15 | jack_rabbit | Not enough to start using Haskell instead, anyway. |
| 01:16 | brehaut | jack_rabbit: haskell's syntax is optimized for a different style of functional program, which becomes especially noticable with pervasive curried functions, operators and a sprinkling of type classes |
| 01:16 | jack_rabbit | brehaut, the curried functions are probably my favorite part of haskell. It's just so useful. |
| 01:17 | CaptainLex | Clojure is definitely the LISP for me, though, with its particular emphasis on immutability. My freshman professor instilled in me what can at best be described a mere tolerance for set! |
| 01:18 | brehaut | CaptainLex: btw, haskell's rewrite rules and pervasive non-strictness mean that some things that look like function application is actually transformed at compile time |
| 01:18 | callen | jack_rabbit: http://www.colourcoding.net/blog/archive/2012/09/29/clojure-macro-defn-curried.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ColourCoding+(Colour+Coding) |
| 01:19 | brehaut | CaptainLex: for instance, if you write map (+1) $ map (*2) [1,2,3] |
| 01:19 | jack_rabbit | callen, Yeah, I know clojure can do the same thing. :) |
| 01:19 | callen | JUS' SAYIN' BRO |
| 01:19 | jack_rabbit | I wish java interop were a little more difficult in clojure, though. |
| 01:19 | brehaut | it is rewriten by the compile to map (\x -> x * 2 + 1) [1,2,3] |
| 01:19 | CaptainLex | Haha what? |
| 01:19 | CaptainLex | (at jack_rabbit) |
| 01:19 | jack_rabbit | I see a lot of clojure written by java programmers, and it's not good. |
| 01:20 | jack_rabbit | It's basically Java in clojure syntax. |
| 01:20 | CaptainLex | Ah, yes |
| 01:20 | ddellacosta | jack_rabbit: yah, what do you mean by that? I mean, that is one of the most pragmatic--even if I can't say "best"--parts of Clojure |
| 01:20 | ddellacosta | ah |
| 01:20 | brehaut | i see a lot of code written by programmers, and it's not good |
| 01:20 | brehaut | ftfy |
| 01:20 | ddellacosta | yeah, what brehaut said, basically |
| 01:20 | jack_rabbit | brehaut++ |
| 01:20 | jack_rabbit | (inc brehaut) |
| 01:20 | lazybot | ⇒ 14 |
| 01:20 | jack_rabbit | There we go. |
| 01:20 | CaptainLex | But if interop were harder, I'd probably be using Guile for my project right now instead of clojure :P |
| 01:20 | ddellacosta | I think that's just a byproduct of it being part of the Java environment |
| 01:20 | brehaut | thanks |
| 01:20 | ddellacosta | but that is definitely a case of taking the good with the bad |
| 01:20 | jack_rabbit | ddellacosta, It's certainly not a mere byproduct. |
| 01:21 | ddellacosta | and for me the good overwhelms the bad in Clojure |
| 01:21 | ddellacosta | jack_rabbit: yeah, I hear you, I'm just saying that, if it wasn't that, it'd be something else. |
| 01:21 | ddellacosta | without dismissing what you're saying. |
| 01:21 | brehaut | CaptainLex: http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/rewrite-rules.html for reference btw (the best way to get an infinite loop in ghc) |
| 01:21 | ddellacosta | and the Java interop is definitely a double-edged sword. |
| 01:22 | CaptainLex | I |
| 01:22 | ddellacosta | and on that note, I think I will go get some lunch. |
| 01:22 | CaptainLex | m a little concerned my project will relie so heavily on the libraries I'm using that I'd basically only be using clojure for the REPL |
| 01:22 | CaptainLex | which, you know, isn't *bad* |
| 01:22 | CaptainLex | but it's not great |
| 01:22 | CaptainLex | s/relie/rely |
| 01:23 | callen | I really need food. |
| 01:23 | jack_rabbit | I just hate seeing a lot of Java interop in the middle of clojure functions. I'd rather just have separate namespaces for interop wrappers. |
| 01:24 | jack_rabbit | Or macros at least. |
| 01:24 | jack_rabbit | It's really just preference I suppose. |
| 01:24 | ddellacosta | callen: if we were in the same place, we could go for lunch. Alas. |
| 01:24 | CaptainLex | Farewell, ddellacosta! |
| 01:24 | callen | ddellacosta: 2221 here anyway. Enjoy your lunch! |
| 01:25 | ddellacosta | thanks! see ya'll later. |
| 01:25 | jack_rabbit | 0022 here. |
| 01:31 | brehaut | thats friday done. later |
| 01:56 | CaptainLex | I'm off to bed; later chaps! |
| 04:54 | dpwright | I have some code in the top-level of a clojure file |
| 04:55 | dpwright | it happens to be generated by a macro, though I don't think that's relevant |
| 04:55 | dpwright | is there any way to ensure that that code is executed? |
| 04:56 | dpwright | it seems like it is executed the first time the namespace is :required |
| 04:56 | dpwright | whereas I want it to be executed regardless of whether or not :require is run on that file |
| 04:56 | dpwright | is there a leiningen setting or something to automatically load all scripts at startup? |
| 04:57 | dpwright | :aot :all doesn't seem to work, and neither does :gen-class |
| 05:02 | clgv | dpwright: you do "lein repl"? |
| 05:04 | dpwright | clgv, that didn't seem to work for me |
| 05:04 | dpwright | I'll just double-check, but basically, the code adds something to a global map atom, and the values added by anything I'd :required were fine, but the ones added by files which weren't :required anywhere weren't present |
| 05:18 | clgv | dpwright: I was just asking to get information about your workflow |
| 05:19 | clgv | dpwright: a general comment: in clojure as in java only code of namespace/classes that are actually loaded by the jvm can execute any code |
| 05:21 | deg | cbp``: Thx (from yesterday). reduce-kv is what I needed. |
| 05:22 | dpwright | right, I figured there'd be something like that... so I'm wondering if there's any way I can force it to be loaded by the jvm |
| 05:23 | dpwright | or force a certain set of files to be, perhaps, like everything in a certain directory or matching a certain regex or something |
| 05:24 | dpwright | I thought there might be a leiningen setting for it, but I looked through project.clj and couldn't see anything obvious... |
| 05:26 | dpwright | erm, looked through the sample project.clj that is |
| 05:27 | tranceholic | hi, im very new to leiningen, could i ask a question? |
| 05:28 | finishingmove | i installed Leiningen running lein self-install (after downloading and adding the lein.bat file to my path). Is there something else to it, or is it installed now? It created a /.lein/self-installs/leiningen-2.2.0-standalone.jar |
| 05:30 | john2x | try it out by running lein in cmd? |
| 05:31 | finishingmove | ok, it started retrieving some dependencies after that |
| 05:59 | redSnow | why loop in clojure is a special form but not a macro? |
| 06:00 | SegFaultAX | Needs lower level support. |
| 06:01 | SegFaultAX | Macros run at compile time and accept unevaluated forms and usually return new forms. |
| 06:01 | SegFaultAX | But there isn't any /other/ syntax that represent the low level looping construct, so if it was a macro what would it evaluate to? |
| 06:03 | no7hing | i connect to an erlang node via 'ports' (=stdin/stdout) and the erlang side doesn't pick up EOL when doing normal println from the clojure side. any ideas? |
| 06:03 | no7hing | using a shell script that just echoes strings, it works like a charm |
| 06:08 | redSnow | SegFaultAX: thanks for your reply,but how does common lisp implement its LOOP macro? |
| 06:09 | SegFaultAX | redSnow: Clojure is not common lisp. |
| 06:11 | SegFaultAX | redSnow: If you'd like to discuss how CL is implemented, either #lisp or one of the various mailinglists for CL (eg SBCL). |
| 06:15 | mindbender1 | who is the most *final* programmer on planet Earth? |
| 06:22 | SegFaultAX | mindbender1: Huh? |
| 06:55 | tonijs | curl http method |
| 09:11 | hyPiRion | no7hing: EOL in erlang is apparently a big problem, at least that's what Raynes has expressed |
| 09:11 | hyPiRion | Or maybe that was EOF |
| 09:13 | no7hing | @hypirion then it's probably EOF - EOL is working now with the usage of line: open_port({spawn, ?EXT, [stream, {line, ?MAXLINE}]) |
| 09:14 | hyPiRion | ah |
| 09:16 | no7hing | i skimmed over the documentation under http://www.erlang.org/doc/man/erlang.html#open_port-2 and stopped at 'stream' never suspecting the gem is hidden one line below |
| 09:16 | no7hing | pun intended :p |
| 09:16 | hyPiRion | hehe |
| 09:21 | no7hing | give me another hour and the yak is completely shaved |
| 09:23 | no7hing | when the erlang vm goes away, the jvm stays up and starts saturating a cpu core |
| 09:23 | Denommus | hi |
| 09:23 | no7hing | whily happily spinning in a loop/recur trying to read from stdin |
| 09:24 | hyPiRion | hi there |
| 09:28 | Denommus | anyone doing android dev in clj? |
| 09:33 | papachan | Denommus hi |
| 09:33 | papachan | still problem with this java activity class? |
| 09:34 | Denommus | still |
| 09:34 | Denommus | I understand the problem |
| 09:34 | Denommus | but I can't come up with a solution |
| 09:35 | Denommus | the problem is that the application class is being defined in clojure code. The AndroidManifest uses this application class to load up clojure, probably |
| 09:36 | Denommus | when I try to use Java, I think it tries to open the activity before being able to load the code of the application class, so the software crashes |
| 09:36 | Denommus | when I take out the application class from the manifest, it also crashes for some other reason |
| 09:36 | Denommus | so it must be another way to do that |
| 09:36 | Denommus | for now, all I can think of is using two separate applications and hide the icon of the second one |
| 09:59 | stuartsierra | Denommus: Daniel Solano Gomez did a talk about Clojure dev in Android at Clojure/conj a couple years ago; video should be online. |
| 10:35 | devn | Denommus: I have another link for you, one sec |
| 10:35 | devn | http://clojure-android.blogspot.com/2013/06/state-of-clojure-on-android-2013.html |
| 10:46 | Denommus | I'm checking both of the links, but they don't really cover my problem |
| 10:46 | Denommus | I think I'll deal with it, for now |
| 10:52 | ambrosebs | stuartsierra: it seems tools.namespace only understands :require prefixes when in a list. Is this intentional? I'd like it to pick up on (:require [foo [bar :as b]]), rather than (:require (foo (bar :as b)). |
| 10:53 | ambrosebs | stuartsierra: I know you're opinionated on what is legal in a ns form :) |
| 10:53 | stuartsierra | ambrosebs: That's intentional. |
| 10:53 | ambrosebs | ok |
| 10:53 | fsmunoz | Is (Arrays/toString foo) "idiomatic" or is there a better way? Asking because in the absence of Clojure-specific knowledge it's easy to fill the gaps with Java methods... |
| 10:53 | stuartsierra | [foo [bar :as b]] is ambiguous |
| 10:53 | hyPiRion | fsmunoz: yeah, it is |
| 10:53 | fsmunoz | hyPiRion: ty |
| 10:54 | ambrosebs | stuartsierra: I'm guessing the rule is use () for prefixes and [] for the options? |
| 10:55 | stuartsierra | yse |
| 10:55 | stuartsierra | That's what the docstring says. |
| 10:55 | ambrosebs | ok. I've never come across that. |
| 10:56 | ambrosebs | stuartsierra: got it, thanks. |
| 10:59 | fsmunoz | I'm having a doubt that is hard to explain, but I'll try: the tools-cli command line parser has an example (let [[options args banner] (cli args ...)] <body> ); I get the destructing bit. Now, Iw ould like to take advantage of this let to add all the other variables I'm currently def'ing. Is that possible/something I want? |
| 10:59 | hadronzo` | To require a clojurescript library, does one only need to add the dependency to project.clj and then require the library namespace? Or do I need to also add the source path to the cljsbuild configuration? |
| 11:00 | jjttjj | just got a mac for the first time, and now clojure-mode indentation seems to be slightly off (eg, the second binding in a let binding will line up with the bracket on the previous line instead of the first character of the binding name) |
| 11:00 | jjttjj | anyone know what might be causing this? |
| 11:05 | devn | I'm curious what the shortest solution to the following is: https://gist.github.com/devn/5782556 (golfers welcome) |
| 11:06 | devn | Output is: ({"Issue Two" {:priority "high", :selector "issue_2"}, "Issue One" {:priority "high", :selector "issue_1"}} {"Issue Four" {:priority "low", :selector "issue_4"}, "Issue Three" {:priority "low", :selector "issue_3"}}) |
| 11:07 | jeremyheiler | fsmunoz, The firs two arguments are the first "def". just add more ;-) https://www.refheap.com/15790 |
| 11:07 | bbloom | devn: start by flipping it inside out |
| 11:08 | fsmunoz | jeremyheiler: I could swear that was my very first approach and it failed miserable, so I started wondering if it was some clojuresques peculiarity. Perhaps I just fumbled with the [], let me try agin |
| 11:08 | bbloom | devn: eliminate levels of nesting and the structure will become clearer to you |
| 11:08 | devn | bbloom: ive written it a few ways |
| 11:08 | devn | im not really loving any of them |
| 11:08 | devn | i flipped it and used a couple for's, but meh |
| 11:08 | jeremyheiler | fsmunoz: the first pair of expressions can be confusing because it's using destructuring. |
| 11:12 | janpaulbultmann | any thoughts on how to annotate functions in a priority que with a priority? |
| 11:12 | bbloom | devn: ok so what exactly is the goal? |
| 11:12 | bbloom | devn: verbalize the problem you're trying to solve |
| 11:13 | janpaulbultmann | a meta attribute would work fine but seems bad style, while reifying callable to crate a priority-fn seems over the top as well. |
| 11:13 | bbloom | devn: you want them grouped by priority? |
| 11:13 | ambrosebs | stuartsierra: would you take a patch to tools.namespace.parse to warn on suspicious looking ns forms? |
| 11:14 | janpaulbultmann | bbloom: thread mixup ^^ this had nothing to do with devns problem, while it also contains a priority ^^ |
| 11:14 | ambrosebs | stuartsierra: ... or should checking (:require [foo [bar]]) be an error? |
| 11:18 | ToBeReplaced | ambrosebs: what's wrong with (:require [foo [bar]])? |
| 11:19 | ambrosebs | ToBeReplaced: I just learnt that it violates require's docstring. |
| 11:19 | ambrosebs | prefix lists should be lists. |
| 11:21 | ToBeReplaced | ambrosebs: ah... yeah i've never seen that written anyway -- i do (:require (foo (bar :as bar))) a lot though |
| 11:21 | ambrosebs | :) I think we all do it differently. |
| 11:21 | janpaulbultmann | devn: have you taken a look at the relational algebra fns in .set |
| 11:22 | bbloom | devn: sorry, walked away. here: https://www.refheap.com/15792 |
| 11:24 | ToBeReplaced | the require form is really funky -- it's a smell for me that this doesn't work -- (:require (unqualified-module :refer [bar]) |
| 11:24 | shriphani | Hi. I am using the enlive library and I get java.lang.OutOfMemoryError: PermGen space … I have upped the -XX:PermSize jvm options but I can't get around this error. What are my options ? |
| 11:27 | fsmunoz | jeremyheiler: ty, it works of course, it's obvious now. I am so used to (let ((a 1) (b 2) ...) etc. that I got a bit lost in there. |
| 11:27 | jeremyheiler | fsmunoz, np; glad you got it working |
| 11:30 | gfredericks | Is "jrclj" the most promising clojure-jruby interface lib? |
| 11:36 | adammh | is there a "reverse partial" function in core? something that would allow: (map (rpartial nth 4) some-list-of-lists) |
| 11:36 | justin_smith | adammh: do you mean something like (comp reverse (partial take 4)) |
| 11:37 | bbloom | adammh: use the #() syntax |
| 11:37 | arcatan | #(nth % 4) |
| 11:37 | stuartsierra | ambrosebs: not sure |
| 11:37 | justin_smith | oh, that kind of reverse |
| 11:37 | justin_smith | heh |
| 11:37 | futile | I've wanted (revere-partial), where it would place pre-given args at end instead of beginning. |
| 11:38 | ambrosebs | stuartsierra: right now it just silently ignores the whole expression. |
| 11:38 | adammh | bbloom: I was mostly curious how to avoid using the # syntax |
| 11:38 | futile | Yeah, I've found that one strong indicator of idiomatic Clojure code is how few # there are. |
| 11:38 | bbloom | adammh: you can also use (for [list list-of-lists] (nth list 4)) |
| 11:38 | stuartsierra | ambrosebs: OK, that's not so good. |
| 11:38 | bbloom | futile: what?!? |
| 11:39 | adammh | the for macro is petty nice as well.... in this case I'm really gunning for a point-free style way of doing it |
| 11:39 | janpaulbultmann | adammh: # is shorter than everything else you have no need for varargs as provided with partial, ans iirc it is written somewhere that rick intended #( for exactly this reason |
| 11:40 | janpaulbultmann | s/reason/case |
| 11:40 | bbloom | adammh: clojure doesn't have anything for that in core. particularly b/c of support for multiple arities and var args |
| 11:40 | bbloom | adammh: but you could write something to do it easy enough if you needed it often |
| 11:41 | bbloom | adammh: but unless you have a good motivation for going point free, use a name. unless there isn't a good name, use #/% |
| 11:41 | adammh | bbloom: for sure.... I almost always end up using #() |
| 11:42 | futile | bbloom: what. |
| 11:42 | bbloom | futile: how is #/% not idiomatic? |
| 11:43 | futile | bbloom: they usually can be replaced with things like comp, partial, juxt, etc to produce cleaner code |
| 11:43 | futile | #(:foo (:bar (:baz %))) => (comp :foo :bar :baz) |
| 11:43 | janpaulbultmann | adammh: unless the name of it has only 2 symbols it will be longer ^^ and also less obvious for other devs |
| 11:43 | bbloom | futile: i disagree that comp/partial are cleaner, but i'm not going to rehash this argument… it's been discussed to death on irc |
| 11:43 | futile | #(foo bar %) => (partial foo bar) |
| 11:44 | futile | it has? |
| 11:44 | futile | oh. didn't realize people disagreed. |
| 11:44 | futile | Oh well, whatever. |
| 11:44 | arcatan | my rule of thumb is that #/% is fine, but %1, %2, are not |
| 11:44 | bbloom | there are proponents on both side |
| 11:44 | bbloom | s |
| 11:44 | janpaulbultmann | arcatan: +1 |
| 11:45 | futile | I instantly know how partial/comp work without having to fully read their arg-list. With % I first have to read the whole internals to know what it's doing. |
| 11:45 | futile | For me partia/comp/etc is a mental optimization. |
| 11:45 | nenorbot | Hi guys. Does anyone know if there's some with-connection type macro to use with http connections? |
| 11:46 | adammh | futile: I agree 100%, much easier to reason about |
| 11:46 | futile | (inc adammh) |
| 11:46 | lazybot | ⇒ 1 |
| 11:48 | Bronsa | partial can be much slower than #/% though |
| 11:48 | futile | Bronsa: it also has the potential to be optimized by the compiler down the road |
| 11:48 | Bronsa | ,(time (dotimes [_ 1e6] ((partial + 1) 0))) |
| 11:48 | clojurebot | "Elapsed time: 470.640895 msecs"\n |
| 11:48 | Bronsa | ,(time (dotimes [_ 1e6] (#(+ 1 %) 0))) |
| 11:48 | adammh | doesn't partial/comp created fewer mini-classes as well? |
| 11:48 | clojurebot | "Elapsed time: 54.850288 msecs"\n |
| 11:49 | adammh | ouch.... |
| 11:49 | Bronsa | partial has to use apply. |
| 11:51 | llasram | nenorbot: Not exactly what you asked, but probably what you actually want: https://github.com/dakrone/clj-http |
| 11:51 | nenorbot | llasram: thanks! |
| 11:52 | devn | bbloom: nice solution. thanks. I was trying to work threading in there and not having much luck. |
| 11:53 | bbloom | devn: i don't really try to "work threading in", so much as i think about how to get closer and closer to the solution one step at a time. |
| 11:53 | bbloom | devn: i program like a search problem with heuristics and backtracking :-) minimizing distance to goal as i go |
| 11:54 | futile | Well this sucks. |
| 11:55 | futile | Now I have to go back and change all my (partial)s to #()s so my code isn't so slow. |
| 11:55 | futile | And make it uglier in the process. |
| 11:55 | tomjack | I wonder if you can characterize reasonable uses of varargs |
| 11:56 | adammh | futile: if you know the function arity you could always do something like partial1, partial2 etc and not call apply, right? |
| 11:57 | futile | adammh: don't see those anywhere |
| 11:58 | adammh | you would have to write them |
| 11:58 | `fogus | Bronsa: Those two timings are not analogous. |
| 11:58 | Bronsa | `fogus: function creation time? |
| 11:59 | `fogus | Bronsa: Oh! You're timing creation time? I thought you were timing call time |
| 11:59 | Bronsa | `fogus: I was. I was trying to understand what was wrong with my timings |
| 12:00 | Bronsa | let's start this again, `fogus why are they not analogous? |
| 12:00 | adammh | futile: (defn partial1 [f a] (fn [b] (f a b))) should be reasonably fast |
| 12:00 | ToBeReplaced | Bronsa: you're creating the function during each iteration... the cost of creating the partial function dominates the cost of calling it, and is much more expensive thatn the cost of creating the anonymous function |
| 12:00 | Bronsa | ,(let [f #(+ 1 %)] (time (dotimes [_ 1e6] (f 0)))) |
| 12:00 | clojurebot | "Elapsed time: 109.686815 msecs"\n |
| 12:00 | Bronsa | ,(let [f (partial + 1)] (time (dotimes [_ 1e6] (#(+ 1 %) 0)))) |
| 12:00 | clojurebot | "Elapsed time: 151.900303 msecs"\n |
| 12:00 | `fogus | Bronsa: If you're trying to time calls only, then you should pull the partial out of the loop |
| 12:01 | Bronsa | derp. |
| 12:01 | Bronsa | ,(let [f (partial + 1)] (time (dotimes [_ 1e6] (f 0)))) |
| 12:01 | clojurebot | "Elapsed time: 1061.071234 msecs"\n |
| 12:01 | Bronsa | partial is still slower |
| 12:01 | tomjack | unfair |
| 12:01 | tomjack | don't use + |
| 12:01 | tomjack | unless that's your point :) |
| 12:01 | piranha | I noticed that compojure coerces multiple POST values in a single one leaving only last one. Is it possible to get a list of them somehow? |
| 12:02 | Bronsa | ,(let [f (partial str "foo")] (time (dotimes [_ 1e6] (f 0)))) |
| 12:02 | clojurebot | "Elapsed time: 1296.423319 msecs"\n |
| 12:02 | Bronsa | ,(let [f #(str "foo" %)] (time (dotimes [_ 1e6] (f 0)))) |
| 12:02 | clojurebot | "Elapsed time: 999.388559 msecs"\n |
| 12:02 | futile | So only slightly slower. |
| 12:02 | futile | Yay. |
| 12:02 | Bronsa | partial will always be slower. |
| 12:02 | piranha | or ring, I'm not exactly sure |
| 12:02 | tomjack | it's that damned apply :( |
| 12:03 | tomjack | I guess? |
| 12:03 | Bronsa | yep |
| 12:03 | mpenet | it s a big "slightly", depends on the context |
| 12:03 | `fogus | ,(time (dotimes [_ 1e6] (#(str "foo" %) 0))) |
| 12:03 | clojurebot | "Elapsed time: 849.724175 msecs"\n |
| 12:03 | `fogus | ,(let [f #(str "foo" %)] (time (dotimes [_ 1e6] (f 0)))) |
| 12:03 | clojurebot | "Elapsed time: 734.682657 msecs"\n |
| 12:03 | `fogus | ,(let [f #(str "foo" %)] (time (dotimes [_ 1e6] (f 0)))) |
| 12:03 | clojurebot | "Elapsed time: 768.429482 msecs"\n |
| 12:03 | `fogus | ,(time (dotimes [_ 1e6] (#(str "foo" %) 0))) |
| 12:03 | clojurebot | "Elapsed time: 750.518391 msecs"\n |
| 12:03 | `fogus | Should be the same |
| 12:05 | Bronsa | http://sprunge.us/JFMN |
| 12:05 | arcatan | maybe it's time to warm up criterium? |
| 12:05 | jodaro` | heh |
| 12:05 | Bronsa | nope. it's the apply. |
| 12:05 | oliverro | https://github.com/hugoduncan/criterium/ is really nice if you want to compare execution time |
| 12:06 | jodaro` | "write once, ruin everything." |
| 12:06 | `fogus | So I came late to the party, what's the problem? Just that partial is slower? |
| 12:06 | stuartsierra | ambrosebs: tools.namespace should either support the syntax or throw an error. Please make a ticket to that effect. |
| 12:07 | Bronsa | `fogus: somebody was arguing about using partial/comp/juxt over #(), I just pointed out that partial is generally a bit slower than #() |
| 12:07 | `fogus | Oh, it's the anti-point-free-league. ;-) |
| 12:07 | piranha | ok, to answer my own question: I should've catched :form-params in compojure and not just :params |
| 12:07 | Bronsa | comp and juxt too, for arities superior to 3 |
| 12:07 | ToBeReplaced | would it be reasonable (possible?) for apply to gain the ability to preserve type hints on the return type of f if all arities for f share the same type hint? |
| 12:08 | Bronsa | I actually prefer using comp/partial/juxt myself. |
| 12:08 | `fogus | You could add some-fn and every-pred too. For all the same reasons |
| 12:08 | arcatan | yes, my main rationale for #() is the extra performance i'm getting out of it! |
| 12:08 | Bronsa | right |
| 12:09 | tomjack | is that sarcasm? |
| 12:09 | arcatan | (yes) |
| 12:09 | tomjack | thanks, I'm dense |
| 12:09 | ToBeReplaced | Bronsa: why is comp slower? |
| 12:10 | arcatan | tomjack: well, you never know on the internet. |
| 12:10 | Bronsa | ToBeReplaced: check the implementation. |
| 12:10 | Bronsa | it uses apply and varargs |
| 12:10 | tomjack | and inhibits inlining even when those aren't used |
| 12:10 | Bronsa | anyway, the performance penalty should hardly matter. |
| 12:11 | futile | `fogus: what's your stance on using comp/partial/juxt vs #() in every-day situations? |
| 12:11 | technomancy | you get 3x more experience points from using juxt |
| 12:12 | `fogus | futile: I use #() if the problem calls for it and partial if the problem calls for that |
| 12:12 | TimMc | I'm pretty sure there's also an inlining bonus for #(+ 1 %) that partial can't take advantage of. |
| 12:13 | futile | `fogus: so you don't worry about optimizations/speed, you just worry about code-correctness? |
| 12:13 | futile | technomancy: sweet, maybe I'm leveling up and don't even know it |
| 12:14 | `fogus | futile: I worry about speed when speed becomes a problem. What I don't do is avoid something because it's 100ms slower. Most of the time that slowdown is irrelevant |
| 12:14 | ambrosebs | stuartsierra: http://dev.clojure.org/jira/browse/TNS-9 |
| 12:15 | futile | `fogus: okay good to know I'm not crazy. thanks. |
| 12:15 | futile | (about this) |
| 12:15 | stuartsierra | ambrosebs: thanks |
| 12:16 | `fogus | futile: In practice I probably use #() more than partial and -> more than comp, but not because of speed. It just seems to work out that way |
| 12:17 | futile | oh |
| 12:19 | futile | "ruby free is the way to be!" |
| 12:19 | technomancy | I usually switch to for when partial/comp gets unwieldy |
| 12:20 | technomancy | (assuming it's in a map/filter context) |
| 12:20 | Bronsa | my biggest problem with #/% is that I don't like how it looks. So i prettified it a bit with emacs http://i.imgur.com/9LJGgu6.png |
| 12:20 | technomancy | less perly, heh |
| 12:21 | justin_smith | is that an emacs mode thing? |
| 12:21 | CaptainLex|ZZZ | Bronsa: Nice! |
| 12:21 | Bronsa | also, I always miss the % sign. |
| 12:21 | Bronsa | justin_smith: just some font-lock hack |
| 12:21 | Bronsa | https://github.com/Bronsa/.emacs.d/blob/master/config/hooks.el#L32 |
| 12:21 | futile | technomancy: I keep forgetting you can use for for filtering too, thanks for reminding me |
| 12:22 | futile | I found out the other day you can use for instead of mapcat, that was awesome. |
| 12:22 | futile | re: https://github.com/evanescence/test2/blob/master/src/test2/default/reporter.clj#L15-L17 |
| 12:22 | technomancy | oh, with nestingness? |
| 12:22 | clojurebot | Gabh mo leithscéal? |
| 12:23 | futile | technomancy: yeah |
| 12:23 | technomancy | nice |
| 12:25 | justin_smith | Bronsa: does that code turn #"^.*$" into λ"^.*$" ? |
| 12:25 | Bronsa | no, just #( into λ( |
| 12:26 | justin_smith | oh, I see it now, it checks for the ( |
| 12:26 | tomjack | how about 'contains? into '∈ ? |
| 12:27 | tomjack | I guess if I steal those I'd stop using '∈ etc in data |
| 12:28 | tomjack | or maybe the ambiguity doesn't matter anyway |
| 12:29 | ToBeReplaced | Bronsa: those are pretty saucy -- do you know of other users with similar transforms? |
| 12:31 | technomancy | I used to replace fn with λ |
| 12:31 | technomancy | but IMO it's a bit silly; only saves one char |
| 12:32 | Bronsa | ToBeReplaced: https://github.com/jaycfields/unplugged-pack/blob/master/init.el#L113 |
| 12:32 | technomancy | replacing function with scripty-f in JS is a lot nicer because otherwise JS is just ridiculously verbose |
| 12:33 | Denommus | ·_________· |
| 12:33 | ToBeReplaced | thanks |
| 12:35 | amalloy | technomancy: only saves one char, but it's greek! you get so much geek cred, and it feels like you're hanging out with mccarthy |
| 12:36 | papachan | ,(require '[clojure.pprint :refer [cl-format]]) |
| 12:36 | clojurebot | nil |
| 12:36 | papachan | ,(cl-format nil "~b" 30) |
| 12:36 | clojurebot | "11110" |
| 12:38 | justin_smith | can cl-format do roman numerals and english like the common lisp one does? |
| 12:39 | tomjack | ,(cl-format nil "~r" (rand-int 1e9)) |
| 12:39 | clojurebot | "nine million, three hundred fifty-seven thousand, nine hundred thirty-six" |
| 12:40 | redSnow | clojurebot: ,(println "just test") |
| 12:40 | clojurebot | ,(let [testar (fn [x y] (if (= (reduce + (filter odd? (range 0 x))) y) (str y " is an")) )] (testar 10 25)) |
| 12:41 | tomjack | where is the first "the value of values" talk? |
| 12:41 | tomjack | infoq's from goto? |
| 12:42 | devn | Apologies if you've seen this but the video is pretty funny: http://jz13.java.no/ |
| 12:43 | ArseneRei | tomjack: This one? http://www.infoq.com/presentations/Value-Values |
| 12:44 | tomjack | yes I think I was actually looking for "persistent data structures and managed references" |
| 12:46 | jeremyheiler | devn, if everything was written in clojures(script) then it would be easy to swtich to v8! |
| 12:48 | ArseneRei | tomjack: Ah, I haven't viewed that one. |
| 12:51 | Foxboron | any VIM users that know a good dark color scheme? I struggle to find on that highlights every keyword in Clojure :/ |
| 12:52 | TimMc | technomancy: λ-replacement mucks with line length limits |
| 12:52 | ArseneRei | Foxboron: http://slinky.imukuppi.org/zenburnpage/ is what I use. |
| 12:52 | rasmusto_ | I'd like to generate all unique combinations of a collection that are a certain length, is there a standard way to do this? |
| 12:53 | rasmusto_ | Foxboron: I use http://ethanschoonover.com/solarized myself |
| 12:53 | technomancy | TimMc: and indentation in some sketchy cases =\ |
| 12:53 | technomancy | Foxboron: zenburn is great; highly recommended |
| 12:54 | Foxboron | rasmusto_: tried it, it looked all fucked up in my terminal, havent botheres to check out why |
| 12:54 | rasmusto_ | Foxboron: which terminal? For the terminal vim, you usually set up the colorscheme in the term, and not in vim |
| 12:55 | IamDrowsy | rasmusto_: you should have a look at http://clojure.github.io/math.combinatorics/ (combinations) |
| 12:56 | rasmusto_ | IamDrowsy: Ok, thanks :) |
| 12:58 | rplaca | justin_smith: yes, cl-format does roman numeral like CL |
| 12:59 | rplaca | and like CL it only goes up to 4999 cause the actual Romans never counted higher |
| 13:00 | technomancy | (throw (NumberFormatException. "Actual Romans never counted this high.")) |
| 13:00 | rplaca | technomancy: I'd say "submit a pull request", but you can't :) |
| 13:01 | technomancy | oh snap |
| 13:03 | hyPiRion | SUBMIT A JIRA TICKET |
| 13:04 | rasmusto_ | uh oh: https://en.wikipedia.org/wiki/Combinatorial_explosion (my jvm is hung up) |
| 13:04 | hyPiRion | You'll get an answer within 4999 days for sure. |
| 13:04 | technomancy | hyPiRion: I prefer "Submit to Jira" |
| 13:05 | hyPiRion | heh |
| 13:05 | hyPiRion | give in to jira. |
| 13:10 | futile | Being able to nest test-contexts has added some complexity to test2. |
| 13:11 | patchwork | Huh, for some reason my project just started throwing this on startup: |
| 13:11 | patchwork | Could not locate clojure/tools/nrepl/server__init.class or clojure/tools/nrepl/server.clj on classpath: |
| 13:11 | patchwork | How is that possible? |
| 13:11 | futile | It's good, but it means I really have to whittle down the spec so it is't so overwhelming and long. |
| 13:11 | justin_smith | patchwork: something pulling in an old clojure version? |
| 13:12 | Foxboron | rasmusto_: sorry, had to catch a train. I tried to only setup for VIM use. Don't really like solarized as terminal colors |
| 13:12 | technomancy | patchwork: what's the context? |
| 13:13 | patchwork | technomancy: I am running % lein ring server |
| 13:13 | patchwork | and it has worked for awhile |
| 13:13 | patchwork | I've been using nrepl and connecting to it |
| 13:14 | technomancy | patchwork: does your :dependencies vector contain nrepl? |
| 13:15 | technomancy | personally I prefer going the other way and starting the ring server from the repl, but as long as you've declared your deps right, either way should work |
| 13:15 | patchwork | In ~/.lein/profiles? |
| 13:15 | patchwork | :dependencies [[ritz/ritz-nrepl-middleware "0.7.1-SNAPSHOT"]] |
| 13:15 | patchwork | Maybe that is the problem |
| 13:15 | patchwork | Hmm.... |
| 13:16 | technomancy | lein puts nrepl in the :base profile, so if you want to be able to launch an nrepl server when that profile isn't active you need an explicit dependency on it |
| 13:17 | cemerick | Interesting pile of cljs (gclosure, really) compilation warnings using master: https://gist.github.com/cemerick/5783641 |
| 13:17 | cemerick | anyone else seeing this? |
| 13:17 | patchwork | I have a dep for [org.clojure/tools.nrepl "0.2.2"] |
| 13:17 | patchwork | Does that not include the server? |
| 13:17 | technomancy | patchwork: no, that should be enough. I suspect the middleware is doing something funny. |
| 13:17 | patchwork | Got it |
| 13:18 | technomancy | (for no reason other than "it's middleware, so it can do unexpected things") |
| 13:19 | patchwork | I removed any :dependencies from my ~/.lein/profiles.clj, same issue |
| 13:27 | patchwork | upgraded to nrepl 0.2.3 and the problem went away? |
| 13:27 | patchwork | What could have caused that? |
| 13:33 | futile | "It is now apparent to me, that my profession all along has been poetry. Yet throughout all this time, such knowledge has not been mine." |
| 14:02 | jodaro | me too |
| 14:02 | jodaro | except its really bad poetry |
| 14:02 | jodaro | like open mike style |
| 14:02 | jodaro | mic |
| 14:02 | llasram | Poor Mike... |
| 14:02 | finishingmove | marky mark |
| 14:02 | finishingmove | look him up |
| 14:03 | futile | I'm a poet and I didn't even know it. |
| 14:03 | futile | So, test2's core is nearly done, taking into account every feature planned for 1.0 |
| 14:04 | futile | But, its own test-suite is really bogging it down. Like, a lot. |
| 14:04 | futile | I need to convert it to something else. But it can't remain the way it is. |
| 14:13 | Bronsa | futile: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L16 what's the point of using -> here? |
| 14:13 | futile | Bronsa: it didn't use to be just 2 things. |
| 14:13 | futile | since it got simplified, I just haven't cleaned it up. |
| 14:13 | futile | Plus it's not that ugly as it is righ tnow |
| 14:14 | tomjack | to me it's confusing to use -> for side-effects like require |
| 14:15 | tomjack | I parsed your when as an if because it looks like there are two expressions in the body |
| 14:15 | Bronsa | I would use doto there actually |
| 14:15 | futile | Bronsa, tomjack: hmm. |
| 14:16 | amalloy | (resolve (doto s (-> namespace symbol require))) |
| 14:16 | futile | My tests seriously suck. They no longer tell me whether anything's working in test2 or not. |
| 14:16 | Bronsa | amalloy: more like (doto s (-> namespace symbol require) resovle) |
| 14:16 | Bronsa | but yeha. |
| 14:16 | Bronsa | yeah* |
| 14:16 | amalloy | Bronsa: no, not at all |
| 14:16 | Bronsa | resolve* |
| 14:16 | amalloy | he needs it to return the var, not the symbol |
| 14:16 | Bronsa | amalloy: right, brainfart |
| 14:17 | tomjack | (-> s (doto namespace symbol require) resolve) ? |
| 14:17 | amalloy | tomjack: gross imo |
| 14:17 | tomjack | and wrong |
| 14:17 | amalloy | uhhhh, i don't think it's wrong. expands to the same thing |
| 14:18 | amalloy | it just makes it hard to tell you're returning the result of (resolve): you have to read the whole expression to the end |
| 14:18 | tomjack | (doto s namespace symbol require) is wrong |
| 14:18 | amalloy | oh, sure |
| 14:20 | tomjack | (let [ns (namespace (symbol s))] (require ns) (resolve s)) :P |
| 14:21 | futile | So here's my plan for how to do around-each and around-all fixtures, given a tree of tests: https://github.com/evanescence/test2/blob/master/src/test2/default/runner.clj#L11-L15 |
| 14:21 | Bronsa | futile: (you're missing an use of destructuring a few lines above) |
| 14:21 | futile | Bronsa: by key? oh yeah, good point. |
| 14:23 | Bronsa | here too https://github.com/evanescence/test2/blob/master/src/test2/default/reporter.clj#L25 |
| 14:23 | Bronsa | https://github.com/evanescence/test2/blob/master/src/test2/default/reporter.clj#L30 here |
| 14:23 | Bronsa | and here https://github.com/evanescence/test2/blob/master/src/test2/default/reporter.clj#L36 |
| 14:23 | Bronsa | but maybe you prefer to leave them as they are. |
| 14:24 | futile | Bronsa: wow, good catches. |
| 14:24 | futile | Bronsa: yeah I'll change those. |
| 14:25 | Bronsa | also https://github.com/evanescence/test2/blob/master/src/test2/default/reporter.clj#L48-L49 you have those bound by the let. |
| 14:25 | futile | Bronsa: man you're good at this |
| 14:28 | Bronsa | futile: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L26-L27 you can do that while destructuring using :or |
| 14:28 | futile | Bronsa: that one I was on the fence about. |
| 14:29 | futile | Bronsa: it didn't look any cleaner/clearer when I tried it with :or |
| 14:29 | Bronsa | as you prefer. |
| 14:31 | redsnow | ,(println "test") |
| 14:31 | clojurebot | test\n |
| 14:31 | amalloy | futile: isn't flatten-results just a reimplementation of tree-seq? (defn flatten-results [x] (mapcat :test-results (tree-seq coll? :children x))) |
| 14:32 | amalloy | maybe i'm writing that wrong; tree-seq is a little fiddly. but it seems like it ought to be doable |
| 14:35 | seangrove | Knowing almost nothing of the java world, where would be a good place to ask about JavaMailer? |
| 14:35 | futile | amalloy: ah thanks for pointing that out |
| 14:44 | futile | Funny.. just as test2 is nearing completion, I'm losing steam rapidly |
| 14:46 | Bronsa | amalloy: I can read (defn flatten-results [{:keys [test-context children]}] (concat test-context (mapcat flatten-results children))) way better than the tree-seq counterpart |
| 14:46 | Bronsa | but maybe it's just me |
| 14:47 | Bronsa | (to be honest I had completely forgotten the existence of tree-seq) |
| 14:47 | xeqi | futile: you can do it! |
| 14:47 | futile | xeqi: I think I can if I can come up with a good testing strategy |
| 14:48 | futile | You know what? I'll rewrite all tests in test2. |
| 14:49 | futile | This is crazy. |
| 14:49 | llasram | Testing systems being self-hosting seems relatively sane to me |
| 14:50 | futile | I've had bad experiences with it before. |
| 14:50 | seangrove | I'm venturing into java interop from clojure-land for the first time, and looking at cemerick's interop flowchart, am I able to recrete this class (XoauthAuthenticator) with deftype? https://code.google.com/p/google-mail-xoauth-tools/source/browse/trunk/java/com/google/code/samples/xoauth/XoauthAuthenticator.java |
| 14:50 | amalloy | hmmmm. i wonder: would you expect (do (for [x (do (prn "realized") nil)] x) nil) to print anything? |
| 14:50 | futile | When you change one thing, you have to change it everywhere in every test. |
| 14:50 | futile | And then you can't even be sure that your tests make sense. |
| 14:50 | Bronsa | amalloy: I would. |
| 14:51 | futile | amalloy: no, it's never realized. |
| 14:51 | futile | Oh. |
| 14:51 | futile | Still no. |
| 14:51 | Bronsa | amalloy: nvm, I was reading doall instead of do, then no. |
| 14:52 | futile | amalloy: Nobody ever asks for for the results, so it never even tries starting. |
| 14:52 | futile | amalloy: so, I guess I look at for's seq in a macro-ish way. |
| 14:53 | cemerick | seangrove: For consumption from Java? The statics demand gen-class then. If you just want to have equivalent functionality, then regular functions and a map or maybe a record to tie everything together would be sufficient. |
| 14:54 | amalloy | anyone else, before i spoil things by discussing what actually happens? curious to see what someone who's been around longer, eg cemerick, thinks |
| 14:54 | cemerick | amalloy: actually happens when what? |
| 14:54 | amalloy | cemerick: "hmmmm. i wonder: would you expect (do (for [x (do (prn "realized") nil)] x) nil) to print anything?" |
| 14:54 | cemerick | oh |
| 14:54 | seangrove | cemerick: Trying to port that class to clojure to use with JavaMailer (also being used from Clojure) - does that count as being consumed from Java? |
| 14:55 | cemerick | I guess it's cheating if I plug it into the REPL :-P |
| 14:55 | cemerick | amalloy: nope |
| 14:56 | amalloy | cemerick: turns out it does |
| 14:56 | cemerick | really! |
| 14:56 | amalloy | yeah. the first collection argument to for is eagerly evaluated, outside of a lazy-seq context |
| 14:56 | amalloy | it's then consumed lazily, of course |
| 14:56 | cemerick | A valid bug. |
| 14:57 | cemerick | or, who knows, etc. |
| 14:57 | amalloy | yeah, more like the latter i'm afraid |
| 14:57 | amalloy | the for expands to something like (letfn [(step [xs] (lazy-seq ...))] (step (do (prn "realized") nil))) |
| 14:59 | schmir | I'd like to create a file like object that I can pass to io/reader, which reads data from a string/memory. how can I do that? |
| 14:59 | jodaro | seangrove: does the javamailer part expect an instance of that class or something? |
| 14:59 | amalloy | $google java stringreader |
| 14:59 | lazybot | [StringReader (Java Platform SE 6) - Docs Oracle] http://docs.oracle.com/javase/6/docs/api/java/io/StringReader.html |
| 14:59 | seangrove | jodaro: Yeah, looks like it |
| 14:59 | schmir | amalloy: thanks! |
| 15:00 | cemerick | seangrove: I know nothing about JavaMailer |
| 15:00 | seangrove | Pretty new to the Java world, almost everything has been done in cljs or straight clojure. Time to bite the bullet for the JavaMailer stuff |
| 15:00 | jodaro | seangrove: if you are calling stuff in Clojure, then you can possibly use proxy or something |
| 15:00 | jodaro | if you need to subclass it or whatever |
| 15:00 | cemerick | amalloy: well, it's worth filing, anyway |
| 15:00 | amalloy | yeah |
| 15:00 | seangrove | cemerick: Just looking to understand terminology |
| 15:00 | jodaro | depends a lot on what you need to do with it |
| 15:00 | seangrove | jodaro: Yeah, need to subclass it and then pass it to the JavaMailer method |
| 15:02 | cemerick | amalloy: makes sense, but the snippet "fails" in the same way in ClojureScript :-P |
| 15:02 | amalloy | cemerick: the for macro is stolen wholesale from clojure.core, so that's not surprising |
| 15:03 | jodaro | seangrove: proxy is probably what you want then |
| 15:03 | jodaro | unless you need finer granularity |
| 15:03 | amalloy | cemerick: maybe i should file it as a cljs bug, so that it gets handled quickly by dnolen instead of never by rich :) |
| 15:04 | jodaro | gen-class gives you more knobs and dials |
| 15:04 | cemerick | amalloy: cljs *uses* clojure.core/for, it's not just a copy/paste job. Only one way out of Dodge. |
| 15:05 | amalloy | yeah, i know. i guess "stolen" was unclear |
| 15:05 | ivaraasen | jimduey: really enjoying your talk on abstractions. good times. |
| 15:06 | blargtheorc | Hey guys, I have a web service that makes use of some request data i'm getting from ring. However that data is being used in several places of my app. It feels like i want to create an "object" |
| 15:06 | jodaro | seangrove: or you can punt and write it in java and use :java-source-paths in your project.clj |
| 15:06 | blargtheorc | is there a way for me to save the state of that request for reuse in other areas of my application. what is the clojure way of doing this? |
| 15:07 | nybbles | hello, has anyone gotten lein-cljsbuild working with the :repl-launch-commands configuration? i.e. the stuff described here: https://github.com/emezeske/lein-cljsbuild/tree/0.3.2/example-projects/advanced (under "Connecting Firefox to a REPL") |
| 15:07 | jodaro | blargtheorc: maybe an atom |
| 15:07 | nybbles | im on os x and i get errors that the browser command could not be found :| |
| 15:08 | nybbles | the command im using on OS X is "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome" |
| 15:08 | justin_smith | nybbles: for osx apps sometimes you need to use the open command |
| 15:09 | justin_smith | open /Applications... args... |
| 15:10 | Raynes | Just 'open' will work. |
| 15:10 | Raynes | If you give 'open' a URL it opens the default browser with the URL. |
| 15:10 | nybbles | sweet |
| 15:11 | nybbles | thanks.. i'll give that shot! |
| 15:13 | jimduey | ivaraasen: thanks. |
| 15:15 | noncom | ppl, is it ok to write very speed-ritical parts in java, with arrays and then use as a library? like massive generative geometry routines.. or can clojure be that fast too? |
| 15:15 | noncom | even slower factor like 1.05 would matter in such situation |
| 15:16 | jodaro | noncom: its not ok. you must write everything in clojure! |
| 15:16 | noncom | :D |
| 15:18 | ivaraasen | noncom: yes. type hints gets cumbersome, and sometimes you get ninja reflection anyway, so Java will usually be faster. |
| 15:19 | noncom | fun thing: writing java after clojure and scala feels like writing c after, say, python or ruby... :) that sort of feeling.. |
| 15:20 | hyPiRion | I feel C is pretty much similar to python really |
| 15:20 | hyPiRion | there's not much fundamental difference except for readability |
| 15:20 | hyPiRion | and typing |
| 15:20 | llasram | I'm curious to see your C, and terrified to see your Python |
| 15:21 | hyPiRion | llasram: yeah, that python part is funny |
| 15:21 | noncom | after meeting scala and clojure i used to despise java, but now i just have this feeling feels like doing a right thing very thoroughly, which is appropriate when necessary, like making speed-critical parts in c or asm :) |
| 15:21 | ivaraasen | I had my first Java course after learning Clojure. it was awkward |
| 15:21 | hyPiRion | Well, hm. I do tend to use anonymous functions quite a lot in python, so I would suppose the difference is rather large |
| 15:22 | ivaraasen | hyPiRion: you are probably going to get burnt at the stake for breaking PEP 8 |
| 15:22 | llasram | hyPiRion: Well I'm definitely not one to talk -- since I've been programming mostly in Clojure, all of my Python has become mostly top-level functions with nary a class in sight |
| 15:22 | jodaro | java starts to get exhausting |
| 15:22 | hyPiRion | Then again, I usually tend to write algorithms and data structures. Not much difference between those things in both languages |
| 15:22 | jodaro | you write a bunch of stuff and think "doesn't this code do what i want yet?" |
| 15:23 | Bronsa | amalloy: looks like just wrapping https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L4268 in a lazy-seq does it |
| 15:23 | jodaro | compared to clojure of course |
| 15:23 | noncom | llasram: i am a mediocre c coder and somewhat something in python :) just in my mind it is that sort of comparison |
| 15:23 | hyPiRion | In Clojure, writing algorithms and data structures is completely different |
| 15:23 | noncom | jodaro: ahahaha the "yet" part hits the spot |
| 15:23 | amalloy | Bronsa: yes, of course. it's not really the *best* solution, but it's what i'm planning to include in my ticket |
| 15:23 | hyPiRion | ivaraasen: oh, I get burnt for many things |
| 15:24 | futile | What do you guys think of the name "metatest" for this modularized testing lib? |
| 15:24 | jodaro | metatest sounds like tests for tests |
| 15:24 | futile | because (i.e.) you can build testing libs with it by building custom components on top of it |
| 15:24 | hyPiRion | PEP 8 would be one of the milder things I would've broken |
| 15:24 | jodaro | meat test, which is how i read that the first time, however |
| 15:25 | jodaro | sounds awesome |
| 15:25 | futile | ugh fine |
| 15:25 | noncom | for me python is far from c - it has so many abstractions... but.. if you speak of "algolish" languages then yes :) |
| 15:26 | noncom | i have a quetion |
| 15:26 | futile | I knew Python sucked when it introduced the "with" statement as a language-level feature, esp. in that way. |
| 15:27 | futile | If you can't do that kind of thing using just regular functions, you're not a "high-level" language. |
| 15:29 | noncom | o nvm, still struggle to formulate it.. |
| 15:29 | noncom | later it be |
| 15:35 | ivaraasen | hyPiRion: so, looking at summer internships at Thomson-Reuters, it seems that they use Clojure at some of their offices |
| 15:40 | amalloy | cemerick, Bronsa: filed http://dev.clojure.org/jira/browse/CLJ-1217 |
| 15:40 | cemerick | amalloy: "old hands"? |
| 15:40 | Bronsa | hah |
| 15:40 | cemerick | oy vey ;-) |
| 15:41 | amalloy | cemerick: "a person who is skilled at something through long experience" |
| 15:41 | amalloy | sounds like you |
| 15:41 | cemerick | long-term masochism ;-P |
| 15:42 | amalloy | apparently in the 19th century in australia it also meant an ex-convict |
| 15:42 | cemerick | sounds more like it |
| 15:43 | tieTYT | does core.typed have any caveats? I think I recall the pattern matching lib doesn't work with genclass, but I'm not sure. Does core.typed have problems like that? |
| 15:48 | hyPiRion | ivaraasen: hmm, cool |
| 15:50 | ivaraasen | hyPiRion: they have a position open in Oslo as well, but it seems to be mostly Java related stuff. |
| 15:55 | gfredericks | does clj-http do any kind of retrying by default? |
| 15:55 | dakrone | gfredericks: retrying for what kind of action? |
| 15:55 | gfredericks | dakrone: oh nm we found your comments on the issue :) |
| 15:56 | dakrone | :) |
| 16:12 | futile | The problem with self-hosting a testing lib is that it might give false positives, or be useless in telling how it failed. |
| 16:14 | simon_____ | Hi |
| 16:17 | futile | simon_____: hi |
| 16:19 | futile | ,(concat [] []) |
| 16:19 | clojurebot | () |
| 16:19 | futile | Reasonable. |
| 16:19 | futile | ,(meta #'+) |
| 16:19 | clojurebot | {:arglists ([] [x] [x y] [x y & more]), :ns #<Namespace clojure.core>, :name +, :column 1, :added "1.2", ...} |
| 16:19 | futile | ,(doc +) |
| 16:19 | clojurebot | "([] [x] [x y] [x y & more]); Returns the sum of nums. (+) returns 0. Does not auto-promote longs, will throw on overflow. See also: +'" |
| 16:19 | futile | Nice going clojurebot. Hey did you used to be sexpbot? |
| 16:20 | tomjack | lazybot was sexpbot |
| 16:20 | futile | oh. |
| 16:20 | futile | How long ago? |
| 16:20 | tomjack | hmm, actually I dunno |
| 16:20 | simon_____ | Anyone has any Idea why CollReduce is not defined on a java Iterator but only on Iterable? |
| 16:20 | futile | It shows in http://logs.lazybot.org/irc.freenode.net/%23clojure/today.txt |
| 16:20 | tomjack | I assumed lazybot was sexpbot's progeny |
| 16:21 | futile | Which is clearly not today, despite the nam. |
| 16:21 | futile | *NAME |
| 16:21 | tomjack | because lazybot replaced sexpbot in here. but maybe lazybot was from-scratch? |
| 16:21 | simon_____ | I only get Iterators from java stax xml etc... so CollReduce would be wonderful there |
| 16:22 | simon_____ | seems like I have to reify Iterable as from looking at the source iterator-seq seems to be kind of inefficent if you only want to use reducers. |
| 16:23 | simon_____ | synchronizing, creating in-between values etc. |
| 16:25 | tomjack | imo, (reduce f val coll) should return the same thing even if you call it twice |
| 16:25 | tomjack | an Iterator cannot support this, can it? |
| 16:25 | tomjack | (nor an Iterable reified over an Iterator) |
| 16:26 | simon_____ | yes thats true |
| 16:26 | simon_____ | though I dont care |
| 16:27 | futile | tomjack: there's only one function left before test2's default runner has complete support for fixtures: https://github.com/evanescence/test2/blob/master/src/test2/default/runner.clj#L5-L25 |
| 16:27 | simon_____ | tomjack: but thanks for the notice anyway, I think Ill do it the right way :) |
| 16:27 | futile | But it's really confusing me :) |
| 16:28 | tomjack | simon_____: if you figure that out and can share your solution, be sure to let us know |
| 16:28 | tomjack | been interested in xml+reducers but haven't had time to think about it |
| 16:28 | simon_____ | and reify iterable closing over the XMLInputFactory, so iterator will always create a new XMLEventReader |
| 16:31 | simon_____ | clojurebot: where do i paste? |
| 16:31 | clojurebot | Excuse me? |
| 16:31 | tomjack | curious, got an idea what the 'elements' of the xmlreducer will be? |
| 16:32 | tomjack | https://www.refheap.com/ |
| 16:32 | simon_____ | tomjack: I'm satisfied with the low level XMLEvents for now |
| 16:33 | tomjack | oh, yeah, that makes perfect sense. remembering some crazy thoughts I had confused me |
| 16:34 | simon_____ | tomjack: here is my yet unrun code: https://www.refheap.com/15797 |
| 16:35 | simon_____ | something like that .) |
| 16:35 | simon_____ | :) |
| 16:39 | futile | ffffff |
| 16:41 | futile | once-fixtures make life really really hard. |
| 16:45 | futile | actually let's put it this way: |
| 16:45 | futile | besides once-fixtures, test2 is done! |
| 16:45 | hyPiRion | "90% of the library is finished, now I just have to finish the other half" |
| 16:46 | futile | right, but a different perspective: |
| 16:46 | futile | "100% of 90% of the library is done!" |
| 16:46 | hyPiRion | yeah, that's true |
| 16:46 | futile | "we can worry about the other 50% later" |
| 16:46 | mikerod | N00b emacs question with Clojure. I'm trying to type a regex string literal, such as #"something\.something". When I get to the '\' character, the minibuffer says "Escaping character..." and then treats the next character I type differently. |
| 16:47 | mikerod | a) If I want to write a regex pattern for "something.something" is #"something\.something" incorrect? |
| 16:47 | mikerod | b) What is causing this "Escaping character..." behavior and what is it supposed to be helping with? |
| 16:48 | justin_smith | mikerod: try typing #"something then M-x describe-key and \ return when it prompts |
| 16:48 | justin_smith | it will tell you what it is doing when you hit the \ in that context |
| 16:48 | justin_smith | for example, I did this just now for <return> and it printed "(erc-send-current-line)" (among other output) |
| 16:49 | tomjack | mikerod: consider (str \( \)) |
| 16:49 | tomjack | as an example |
| 16:49 | justin_smith | mikerod: describe-key will tell you which mode / el file is causing the behavior when you type \ |
| 16:50 | mikerod | justin_smith: That worked out well. The docs described it as (paredit-backslash) and it makes sense how to use it. |
| 16:50 | justin_smith | cool - and the behavior may be modifiable with M-x customize-group paredit |
| 16:50 | justin_smith | (or may not, but many of these things are) |
| 16:51 | mikerod | tomjack: I'm not sure I understand what you mean with the (str \( \)) example. |
| 16:51 | justin_smith | ,(str \( \)) |
| 16:51 | futile | Aren't those char-literals? |
| 16:51 | clojurebot | "()" |
| 16:51 | futile | paredit-backslash is useful inside strings. |
| 16:52 | futile | lemme rephrase: |
| 16:52 | futile | paredit is useful |
| 16:52 | tomjack | paredit-backslash keeps it from becoming (str \()... |
| 16:52 | futile | :D |
| 16:52 | mikerod | justin_smith: that is true. paredit-backslash could be useful it seems though. It just threw me off and I was using it wrong. |
| 16:52 | futile | the paredit guy(s) knew what they were doin |
| 16:53 | justin_smith | I have not made the switch to paredit yet - such a disconnect from what I type and what goes into the buffer is disorienting |
| 16:53 | adammh | do any of you use smartparens instead of paredit? |
| 16:53 | mikerod | tomjack: I understand your point now. |
| 16:54 | technomancy | adammh: smartparens is a lot less opinionated than paredit, which IMO makes it a lot less useful out of the box. |
| 16:54 | mikerod | So yes, I think it is useful. And I agree with futile paredit is useful. I'm just sort of new to it still. |
| 16:55 | futile | opinionated is good, as long as the person who wrote it is (1) dogfooding it and (2) not an idiot |
| 16:55 | adammh | technomancy: I agree - although I find that smartparens works great for many non lisp languages |
| 16:55 | technomancy | smartparens is like "here are a bunch of commands you can bind to get paredit-like behaviour or other related behaviour" |
| 16:55 | alandipert | dakrone: hey are you around by any chance? |
| 16:55 | technomancy | adammh: yeah, it's definitely more general |
| 16:56 | futile | I think at this point I've memorized all of paredit's commands and use most of them every day. |
| 16:56 | futile | M-r was the last one I learned. |
| 16:56 | adammh | I tried using it with clojure and went back to paredit a few days later |
| 16:57 | tomjack | futile: including navigation? |
| 16:57 | futile | Yep. |
| 16:57 | tomjack | I spent a long time ignoring navigation, big mistake |
| 16:57 | futile | I think my least-used navigation key is C-M-p |
| 16:58 | futile | I get the other 3, but this one I just never think of using. |
| 16:58 | dakrone | alandipert: yea, I'm here |
| 16:58 | dakrone | alandipert: what's up? |
| 16:58 | futile | Also there's one thing I use that's not part of paredit but works great with it: |
| 16:58 | futile | C-M-SPC, more than once in a row sometimes |
| 16:59 | futile | I won't touch LightTable unless it has paredit behavior |
| 16:59 | futile | *keys |
| 16:59 | adammh | expand-region works even better |
| 17:00 | alandipert | dakrone: nevermind, answered my own cheshire question :-) |
| 17:01 | dakrone | :) |
| 17:02 | futile | Oh and I wish there were some keys bound to paredit-wrap-square, etc |
| 17:02 | futile | But to be fair, I can't think of any good ones either. So they're still not bound. |
| 17:03 | seangrove | How can I call proxy-super for a constructor in a proxy? |
| 17:04 | futile | Man, I can't tell why I broke something. That sucks. |
| 17:04 | futile | *how |
| 17:06 | mikerod | I don't think I've learned paredit navigation really yet :( |
| 17:07 | futile | mikerod: http://www.emacswiki.org/emacs/PareditCheatsheet |
| 17:07 | mikerod | I do M-x paredit-forward and M-x paredit-backward still as my navigation. I'm sure this is stupid. |
| 17:07 | seangrove | mikerod: Stick with it, certainly worth it once you've gotten it |
| 17:07 | futile | mikerod: just try to learn one of those keys per day. |
| 17:07 | futile | mikerod: if you do it right, in a month you'll be a pro |
| 17:08 | tomjack | hmm, cheetsheat seems incomplete? |
| 17:08 | futile | it is |
| 17:08 | mikerod | futile: Thanks, I will do this. seangrove I think it already has greatly improved my productivity. So I'm sure it is worth getting down all the keys. |
| 17:09 | futile | mikerod: as point of reference, I started learning paredit last November, and only got really good at it by January or Feb |
| 17:09 | futile | mikerod: but I took it slow so it was not very stressful :) |
| 17:09 | mikerod | futile: Ah, a good learning curve. :) |
| 17:10 | technomancy | most of the expression-based nav comes from emacs itself rather than paredit |
| 17:10 | futile | technomancy: oh? |
| 17:11 | futile | oh. |
| 17:15 | alandipert | dakrone: working on something that might interest you tho, using json+idioms for clj data serialization to take advantage of browser native parse |
| 17:15 | dakrone | that sounds neat |
| 17:15 | alandipert | dakrone: https://github.com/tailrecursion/cljson now with cheshire, which made the clj side faster than pr+read |
| 17:17 | dakrone | alandipert: hmm, so how are you going to handle someone wanting to actually encode {"s" ["bar"]}? |
| 17:17 | seangrove | damnit, looks like I need a named class. |
| 17:17 | alandipert | dakrone: becomes "{\"m\":[[\"s\",[\"bar\"]]]}" |
| 17:18 | alandipert | dakrone: (json) |
| 17:18 | dakrone | ahh, gotcha |
| 17:21 | alandipert | dakrone: curious, why do js arrays get parsed into seqs? |
| 17:21 | simon_____ | hm... |
| 17:23 | simon_____ | I think it is kind of unfortunate that the map/filter etc. functions in reducers always work on a foldable/reducable collection instead of the fold functions themselves |
| 17:23 | simon_____ | makes what i want to do more difficutl |
| 17:23 | tomjack | it is unfortunate |
| 17:24 | tomjack | the blog post had "mapping" "filtering" etc examples |
| 17:24 | simon_____ | yes, I want those! |
| 17:24 | tomjack | but these didn't get included in the actual library for some reason.. |
| 17:25 | amalloy | simon_____: huh? |
| 17:26 | simon_____ | I'd like to do something like (in [xml-path] fold-transformation) which would yield a fold transformation that only applies the fold-transformation if the reduction has entered the xml-path |
| 17:26 | simon_____ | maybe I'm on the wrong track there and this is easily possible with existing reducers? |
| 17:27 | amalloy | of course. just define the in function yourself, to take a path and a folder, and return a folder |
| 17:27 | simon_____ | the problem is, I cannot create a folder using the standard library functions |
| 17:27 | tomjack | simon_____: https://www.refheap.com/8672e2f99983bdb21b468c23d |
| 17:28 | tomjack | not that that is a solution, just remembered it and seemed relevant |
| 17:29 | simon_____ | that is exactly what I want to do.. but see he defined mapping and taking himself |
| 17:29 | tomjack | yep |
| 17:29 | simon_____ | so what good is reduce-if, if there are no standard library functions which help with defining reducers? |
| 17:29 | tomjack | good point I guess |
| 17:29 | tomjack | in my work I've just accepted that I'm going to have to rewrite reducers from scratch |
| 17:30 | tomjack | so didn't bother me much to just provide all the 'ings myself |
| 17:31 | amalloy | isn't (reduce-if pred f coll) just (map #(if (pred %) (f %) %)) coll)? |
| 17:31 | tomjack | no, see the example at the bottom for a disproof |
| 17:32 | simon_____ | couldn't this issue be brought to the attention of the clojure team, so that in some future reducers version we have less .. ehm "complection" :) ? |
| 17:33 | tomjack | I guess it could be a backwards-compatible change |
| 17:33 | tomjack | so there is hope perhaps |
| 17:33 | tomjack | seems like there's gotta be some reason rich didn't do it though |
| 17:33 | tomjack | since he clearly knew about 'mapping' etc... |
| 17:37 | tomjack | would be neat to have a juxting |
| 17:42 | futile | Honestly, the hardest part of writing this thing is testing it. |
| 17:42 | futile | Which is probably why I'm writing it. |
| 17:43 | simon_____ | maybe its the information of folder vs reducer |
| 17:44 | simon_____ | though that could be kept on the reducing-fn and also transformed by the transformer instead of tying it to the collection |
| 17:44 | tomjack | I don't see why you'd need that information on a reducing-fn |
| 17:45 | tomjack | I was also under the impression that r/reducer returned a folder |
| 17:45 | tomjack | r/folder seems odd to me, what's the point? |
| 17:46 | tomjack | CollFold has a default impl |
| 17:46 | tomjack | so if r/reducer return a CollFold it'd just fall back to reduce if the source coll wasn't foldable? |
| 17:46 | simon_____ | coll-fold is not implemented with reducer, but with folder it is |
| 17:46 | simon_____ | yes |
| 17:49 | simon_____ | well, I was in awe at the reducers blog post.. but the actual implementation seems kind of lacking... I'd be happy with the "..ing" versions alone and just do a single fold or reduce at the end |
| 17:50 | simon_____ | much better imho than trying to mimic that collection interface |
| 17:51 | simon_____ | gn8 everyone |
| 18:00 | tomjack | are pure functions considered values around these parts? |
| 18:00 | seangrove | tomjack: They're not serializable are they? |
| 18:01 | tomjack | my real question is 'what is a value?' - one vote for "serializable"? |
| 18:02 | seangrove | Then again, with referential transparency, I suppose they're never-changing... |
| 18:02 | patchwork | ,(= (fn [x] (+ x x)) (fn [x] (+ x x)) |
| 18:02 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 18:02 | patchwork | oops |
| 18:02 | seangrove | tomjack: Yeah, figured that was where you were going with it |
| 18:02 | patchwork | ,(= (fn [x] (+ x x)) (fn [x] (+ x x))https://github.com/mylesmegyesi/sass-clojure |
| 18:02 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 18:02 | patchwork | ha! |
| 18:02 | patchwork | ,(= (fn [x] (+ x x)) (fn [x] (+ x x))) |
| 18:02 | clojurebot | false |
| 18:02 | tomjack | equality, comparison, referential transparency |
| 18:02 | patchwork | there we go |
| 18:03 | patchwork | so no tomjack, they are not |
| 18:03 | patchwork | ,(= {:aa 5} {:aa 5}) |
| 18:03 | clojurebot | true |
| 18:03 | tomjack | is the term ambiguous? |
| 18:03 | tomjack | vague? |
| 18:03 | seangrove | Perhaps slightly ambiguous |
| 18:03 | seangrove | An interesting question though |
| 18:03 | patchwork | I consider a value to be something like 5, which cannot be changed and can be compared for equality |
| 18:04 | tomjack | 'cannot be changed' hmm |
| 18:04 | hyPiRion | Well |
| 18:04 | tomjack | i.e. referential transparency? |
| 18:04 | patchwork | Yeah, you can't redefine 5 |
| 18:04 | patchwork | it is 5, for always |
| 18:05 | hyPiRion | functions can be equal, but it's not possible to determine that for Clojure with certainty |
| 18:05 | hyPiRion | turing completeness and all that jam |
| 18:05 | patchwork | In practice, equivalent functions are not = |
| 18:05 | patchwork | thus, functions are not values |
| 18:06 | tomjack | definitely ambiguous, when I talk about 5 I'm not talking about an instance of Long |
| 18:07 | tomjack | I wonder if it's unfair to expect an intensional definition |
| 18:08 | hyPiRion | Isn't a value is a member of the set of possible interpretations of any possibly-infinite sequence of symbols? |
| 18:08 | muhoo | SegFaultAX: curious what you ended up deciding to do for work queues? |
| 18:08 | hyPiRion | Well, that came out a bit haskelly. |
| 18:09 | tomjack | the definition should disqualify (atom 3) |
| 18:09 | tomjack | ..atoms |
| 18:09 | patchwork | tomjack: exactly |
| 18:09 | patchwork | atoms are by definition not = |
| 18:09 | patchwork | though the values they hold can be |
| 18:10 | tomjack | it always sort of confused me that equality was required |
| 18:10 | tomjack | I think I see |
| 18:10 | tomjack | to me an atom is clearly not a value because you don't have referential transparency |
| 18:10 | tomjack | but to define referential transparency you need a notion of equality? |
| 18:11 | patchwork | You need to be able to tell if two values are equivalent, yeah |
| 18:11 | tomjack | which contains an ambiguity - equality of meanings or of implementations? |
| 18:12 | tomjack | clearly we want referential transparency to be about meanings I think, so I'm guessing pure fns should be called values |
| 18:12 | patchwork | They could be values, but that is why hyPiRion mentions turing completeness |
| 18:13 | patchwork | You can have two equivalent fns that are not defined in the same way |
| 18:13 | tomjack | turing completeness seems irrelevant :) |
| 18:13 | tomjack | but I think I've resolved my confusion, thanks |
| 18:13 | hyPiRion | tomjack: yeah, turing completeness IS irrelevant, but only in theory |
| 18:18 | jro_ | are there any mentionable projects, to somehow introduce type system in Clojure? |
| 18:18 | tomjack | $google core.typed |
| 18:18 | lazybot | [clojure/core.typed · GitHub] https://github.com/clojure/core.typed |
| 18:19 | nkhodyunya | jro_: core.typed isn't what u want? |
| 18:20 | jro_ | I would like just to toy different approaches, and e.g. play with Hindley - Milner if that exists. In order to learn stuff |
| 18:20 | seangrove | What is the clojure equivalent for final URLName unusedUrlName = null; ? |
| 18:23 | nkhodyunya | seangrove: : why don't just use nil literal instead of finalized object? |
| 18:24 | seangrove | nkhodyunya: I have no idea, I have almost no experience with Java, and trying to interpret as best I can |
| 18:26 | Denommus | on the android REPL, can I get the current activity somehow? |
| 18:40 | futile | technomancy: ERC doesnt show you PMs easily does it |
| 18:41 | jodaro | seangrove: if you are still trying to create that subclass of the javamail thing ... |
| 18:41 | jodaro | you might save yourself a lot of pain and just write it in java |
| 18:41 | jodaro | (i feel dirty saying that, but ...) |
| 18:42 | jodaro | futile: they show up in a new buffer, don't they? |
| 18:42 | futile | jodaro: sure but you gotta know there's a new (usually hidden) buffer suddenly |
| 18:43 | jodaro | yeah |
| 18:43 | futile | technomancy: iow, check your PM |
| 18:44 | ToBeReplaced | i've got a uberjar that runs locally but not on ec2, and if i add a pointless form to a specific .clj, it runs (also runs after reverting)... any clue what can cause that? |
| 18:46 | jodaro | jar mites |
| 18:47 | jodaro | (i have no idea) |
| 18:47 | jodaro | can you replicate it with a dummy uberjar with like just a main fn that prints hello world? |
| 18:49 | ToBeReplaced | it's arising from complexity -- many other deployments working, this one failing -- can't seem to find the thread that differentiates it |
| 18:50 | jodaro | hmm |
| 18:51 | jodaro | hard to answer without knowing exactly what you are doing |
| 18:51 | jodaro | i guess the best vague answer is "reduce complexity" |
| 18:52 | ToBeReplaced | yeah; was a shot in the dark, in case someone would say something like "check java runtimes on both machines" or something similar that i might have missed |
| 18:53 | jodaro | check java runtimes on both machines |
| 18:53 | ToBeReplaced | like that it's an obvious potential issue to someone more familiar with deploying jars than i am |
| 18:53 | jodaro | heh |
| 18:53 | jodaro | yeah i don't think i've had that happen to me before |
| 18:54 | jodaro | i'm sure my luck will run out eventually, though |
| 19:06 | amalloy | ToBeReplaced: stale classfiles for your AOTed namespaces? try lein clean before uberjarring |
| 19:07 | ToBeReplaced | yeah; i've hit that before; i had ruled it out b/c the jar runs on one machine but not another -- is that a reasonable conclusion? |
| 19:10 | ToBeReplaced | it's probably related to stale class files though in some way since touching a file in the jar "fixes" it |
| 19:20 | papachan | ,((fn [coll] (reduce #(conj (conj %1 %2) %2) '[] coll)) [1 2 3]) |
| 19:20 | clojurebot | [1 1 2 2 3 ...] |
| 19:25 | futile | I just did a recursive mapcat in Finder |
| 19:25 | futile | so weird |
| 19:27 | tomjack | papachan: that could be an interesting reducer combinator |
| 19:27 | tomjack | would make me want to make one that does one reduction on even elements, another on odd |
| 19:27 | amalloy | it's just (mapcat (partial repeat 2) coll) |
| 19:27 | sjl | anyone know how to customize the keybindings for fireplace.vim ? |
| 19:28 | tomjack | seems kind of weird to explode pairs out but could be nice if it's hidden from the user maybe.. |
| 19:28 | tomjack | I guess it can't really be hidden :( |
| 19:34 | tomjack | amalloy: raw reducer version seems much faster |
| 19:35 | amalloy | tomjack: presumably because rich still hasn't accepted the patch to add a repeat reducer |
| 19:35 | amalloy | well, i guess it wouldn't be one anyway |
| 19:35 | tomjack | I mean mapcat vs a transformer that just calls f1 twice |
| 19:35 | tomjack | of course I don't have the reduced? check in there.. |
| 19:36 | tomjack | but that should be like 20ns per reduction step or something I think |
| 19:36 | amalloy | tomjack: are you using r/mapcat? it should just call f1 twice |
| 19:36 | tomjack | that statement doesn't really make sense to me |
| 19:37 | tomjack | https://www.refheap.com/b296e3095b12aba0231fe04a7 |
| 19:37 | amalloy | i guess maybe not, cause it does a reduce |
| 19:37 | tomjack | that is what I mean by 'just' |
| 19:37 | tomjack | wow, using (list x x) instead of [x x] is almost twice as slow |
| 19:38 | tomjack | I expected short lists to reduce faster than vectors for some reason |
| 19:40 | tomjack | maybe I'm timing creation time |
| 20:04 | futile | ,(mapcat (partial repeat 5) (range 0 10)) |
| 20:04 | clojurebot | (0 0 0 0 0 ...) |
| 20:05 | futile | what kind of fun can we have with mapcat? |
| 20:05 | futile | ,(range 0 10) |
| 20:05 | clojurebot | (0 1 2 3 4 ...) |
| 20:05 | futile | ,(range 0 3) |
| 20:05 | clojurebot | (0 1 2) |
| 20:05 | futile | ,(doall (range 0 10)) |
| 20:05 | clojurebot | (0 1 2 3 4 ...) |
| 20:05 | futile | come on clojurebot stop being so lazy |
| 20:05 | tomjack | ,*print-length* |
| 20:05 | clojurebot | 5 |
| 20:06 | futile | ,#'*print-length* |
| 20:06 | clojurebot | #'clojure.core/*print-length* |
| 20:06 | futile | ,(mapcat (partial repeat 2) (range 0 2)) |
| 20:06 | clojurebot | (0 0 1 1) |
| 20:06 | futile | Weird. |
| 20:07 | tomjack | weird? |
| 20:07 | clojurebot | weird is that |
| 20:09 | hiredman | a vector is ultimately backed by arrays, a list is still a linked list, arrays have much better locality |
| 20:11 | futile | ,(mapcat (partial partition 3) (range 0 10)) |
| 20:11 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 20:14 | futile | It's strange that ##(map (partial apply +) (partition 3 (range 0 10))) doesn't have a final list for the lonely 9 |
| 20:14 | lazybot | ⇒ (3 12 21) |
| 20:15 | futile | ,(partition 3 (range 0 10)) |
| 20:15 | clojurebot | eval service is offline |
| 20:15 | tomjack | you want partition-all |
| 20:16 | futile | Oh. |
| 20:16 | futile | ##(partition-all 3 (range 0 10)) |
| 20:16 | lazybot | ⇒ ((0 1 2) (3 4 5) (6 7 8) (9)) |
| 20:16 | futile | ##(map (partial apply +) (partition-all 3 (range 0 10))) |
| 20:16 | lazybot | ⇒ (3 12 21 9) |
| 20:16 | futile | Hmm, all multiples of 3.. |
| 20:17 | futile | ##(map (partial apply +) (partition-all 3 (range 0 20))) |
| 20:17 | lazybot | ⇒ (3 12 21 30 39 48 37) |
| 20:17 | futile | Okay fine, gotta ditch the last one: ##(map (partial apply +) (partition 3 (range 0 10))) |
| 20:17 | lazybot | ⇒ (3 12 21) |
| 20:19 | futile | ,#'foo |
| 20:19 | futile | ###'foo |
| 20:19 | lazybot | java.lang.RuntimeException: Unable to resolve var: foo in this context |
| 20:19 | futile | (defn foo[]) |
| 20:19 | clojurebot | eval service is offline |
| 20:19 | futile | ##(defn foo[]) |
| 20:19 | lazybot | java.lang.SecurityException: You tripped the alarm! def is bad! |
| 20:19 | futile | Aww |
| 20:20 | futile | How would you write (divisible-by 3) to be truthy and honest? |
| 20:22 | futile | Why is this true? ##(every? #(zero? (rem % 3)) (map (partial apply +) (partition 3 (range 0 100)))) |
| 20:22 | lazybot | ⇒ true |
| 20:22 | futile | That's some weird math thing. |
| 20:22 | futile | You guys are smart math guys, right? Why does that happen? |
| 20:23 | futile | If you sum all the groups in ##(partition 3 (range 0 30)), you always get a number divisible by 3. |
| 20:23 | lazybot | ⇒ ((0 1 2) (3 4 5) (6 7 8) (9 10 11) (12 13 14) (15 16 17) (18 19 20) (21 22 23) (24 25 26) (27 28 29)) |
| 20:24 | futile | But it's not true for groups of 4... ##(every? #(zero? (rem % 4)) (map (partial apply +) (partition 4 (range 0 100)))) |
| 20:24 | lazybot | ⇒ false |
| 20:26 | futile | Oh, it's just algebra. |
| 20:26 | futile | Sorry. False alert. |
| 20:29 | amalloy | futile: that property holds for every odd N, but not for any even N |
| 20:30 | futile | ##(every? #(zero? (rem % 5)) (map (partial apply +) (partition 5 (range 0 100)))) |
| 20:30 | lazybot | ⇒ true |
| 20:30 | futile | Math is weird. |
| 20:30 | futile | amalloy: thanks |
| 20:30 | futile | There are so many ways to feel stupid in this world. |
| 20:30 | amalloy | it's pretty easy, really. the remainders (mod n) in any n-sized partition of integers will always be (0, 1, 2...n-1) |
| 20:31 | SegFaultAX | Well because you can always factor it the same way. |
| 20:31 | amalloy | and if you add them up for an odd set, that's (1 + n-1) + (2 + n-2) +... |
| 20:31 | amalloy | for an even number, there will be an extra n/2 in the middle with nothing to pair up with |
| 20:31 | futile | ##(every? #(zero? (rem % 5)) (map (partial apply +) (partition 5 1 (range 0 100)))) |
| 20:31 | lazybot | ⇒ true |
| 20:31 | futile | Oooh neat. |
| 20:31 | SegFaultAX | amalloy: Why would you write it that way? |
| 20:32 | SegFaultAX | amalloy: What's the point in (1 + n - 1)? |
| 20:32 | futile | amalloy: tbh I'm not understanding at all, but thanks anyway |
| 20:32 | SegFaultAX | Just n, n + 1, n + 2, etc. |
| 20:32 | amalloy | SegFaultAX: i'm working in mod n, as mentioned earlier |
| 20:32 | amalloy | so the set contains a 1 and an n-1, and adding them up always cancels out to zero |
| 20:32 | SegFaultAX | ... Cancels out to n |
| 20:33 | amalloy | which is zero, because we're talking about divisibility by n |
| 20:33 | SegFaultAX | n isn't 0 lolwut |
| 20:33 | amalloy | how much math have you taken? |
| 20:34 | SegFaultAX | amalloy: Dunno, 17 years? |
| 20:34 | SegFaultAX | amalloy: Your notation is pointlessly convoluted. |
| 20:34 | SegFaultAX | (Oh was that not to me?) |
| 20:34 | futile | SegFaultAX: it probably was |
| 20:34 | futile | SegFaultAX: I just like talking about myself |
| 20:34 | amalloy | the goal here is to show that, for all odd N, any selection of N contiguous integers sums to a multiple of N |
| 20:34 | SegFaultAX | amalloy: Then why not show the factorization? |
| 20:35 | SegFaultAX | x + x + 1 + x + 2 = 3x + 3 = 3(x + 1) |
| 20:35 | futile | Oh, I think maybe I get why. |
| 20:35 | amalloy | i thus chose to do math in mod N, and show that i can pair elements off so that they always add up to N, or to 0, which is the same thing mod N |
| 20:35 | amalloy | SegFaultAX: that's sufficient for N=3 |
| 20:36 | amalloy | i'm showing it for all odd N, not just 3 |
| 20:36 | futile | ok nevermind |
| 20:36 | futile | had it for a second, then lost it |
| 20:36 | futile | too many moving parts |
| 20:36 | futile | OK. Time to finish test2 once and for all. |
| 20:36 | SegFaultAX | amalloy: Sure ok. |
| 20:37 | amalloy | and clearly, you're right that it factors to n(x+1). but i didn't see that, and it's not totally obvious to me how to prove it |
| 20:37 | amalloy | whereas pairing them seemed pretty obvious |
| 20:38 | amalloy | and also, as a bonus, shows why it doesn't work for even N |
| 20:39 | amalloy | did it make sense this time? |
| 20:39 | SegFaultAX | I guess I can see how that might be more obvious, though if he doesn't grasp the algebra involved, modular arithmetic might confuse the matter. |
| 20:40 | amalloy | SegFaultAX: out of curiosity, is it easy to prove the factorization to n(x+1)? |
| 20:44 | SegFaultAX | amalloy: Sure! It's relatively straightforward. |
| 20:50 | tomjack | that's surprising |
| 20:51 | tomjack | (it's not true) |
| 20:51 | SegFaultAX | tomjack: What's not true? |
| 20:51 | tomjack | the function in question is (fn [n x] (apply + (map + (repeat x) (range n)))), yes? |
| 20:52 | SegFaultAX | tomjack: Are you referring to out previous discussion about the sum of consecutive integers? |
| 20:52 | tomjack | yeah |
| 20:53 | SegFaultAX | tomjack: What's not true, then? |
| 20:53 | tomjack | that for f that fn, (= (f n x) (* n (dec x))) |
| 20:54 | tomjack | er, inc |
| 20:54 | SegFaultAX | tomjack: I don't know what you're talking about. |
| 20:54 | tomjack | "it factors to n(x+1)" - false |
| 20:54 | tomjack | happens to be true for n=3 |
| 20:55 | SegFaultAX | tomjack: The factorization can be generalized to the average of the first and last number in the series multiplied by the size of the series. |
| 20:56 | SegFaultAX | tomjack: (What I assumed amalloy was asking is "can it be proven that the sum of n consecutive integers can be divided by n IFF n is odd" which is true, and readily provable. |
| 20:57 | tomjack | sure |
| 21:00 | amalloy | tomjack: i had incorrectly concluded that it was n(x+1) for any n, rather than just 3. |
| 21:01 | amalloy | (i definitely liked the pairing-off approach better; there's less to be confused about) |
| 21:06 | SegFaultAX | amalloy: I'm pretty sure your example wasn't correct anyway because all your terms would simplify to just n. |
| 21:06 | seangrove | What am I missing here - why doesn't `t` respond to methods that clojure.reflect says it has? https://www.refheap.com/15802 |
| 21:06 | amalloy | SegFaultAX: that was the point |
| 21:07 | amalloy | n+n+n+n is always divisible by n |
| 21:07 | SegFaultAX | amalloy: But that wasn't what we were talking about. |
| 21:07 | SegFaultAX | We weren't saying that all multiple of n are divisble by n |
| 21:07 | SegFaultAX | That's trivially true. |
| 21:07 | SegFaultAX | We're talking about the sum of a series. |
| 21:08 | seangrove | I thought I had the wrong version of the library, but the clojure repl is actually checking the object itself, so it should be accurate |
| 21:08 | seangrove | Hrm, two different errors... one is no matching field found, the other is no matching method found... |
| 21:09 | amalloy | SegFaultAX: right. and the terms of the series can be grouped together into pairs that sum to n |
| 21:09 | seangrove | Ah, maybe because it's private... |
| 21:09 | seangrove | Christ I hate Java |
| 21:10 | SegFaultAX | n+1 * |
| 21:11 | amalloy | SegFaultAX: wrong. consider n=7 |
| 21:11 | amalloy | one subseries there would be 0,1,2,3,4,5,6. seven contiguous integers |
| 21:12 | amalloy | they can be grouped: (1+6)+(2+5)+(3+4)+0 |
| 21:12 | SegFaultAX | amalloy: Consider that 1 + 2 + 3 + 4 + 5 ... + n = n(n+1) / 2 |
| 21:12 | SegFaultAX | amalloy: The only thing we've changed above is offsetting the series by a cosntant factor m |
| 21:12 | amalloy | agreed |
| 21:13 | SegFaultAX | So we can generalize it to (m + 1) + (m + 2) + (m + 3) ... (m + n) |
| 21:13 | SegFaultAX | (Actually, maybe we're driving at different points here. I might not understand what you're getting at) |
| 21:14 | SegFaultAX | I'm still talking about the original problem. |
| 21:14 | amalloy | SegFaultAX: i started with (m+1)+(m+2)...and took everything mod n, because the residues mod n will be 0..n-1 regardless of m |
| 21:15 | SegFaultAX | amalloy: Oh, well I must have missed that part :) |
| 21:15 | amalloy | at which point my telescoping is easy |
| 21:15 | SegFaultAX | amalloy: Then we're tlaking about the same exact thing. |
| 21:15 | SegFaultAX | futile: Are you getting all this? |
| 21:15 | amalloy | well, easy enough to miss, i only said it five times :) |
| 21:15 | futile | SegFaultAX: not even going to pretend I'm trying |
| 21:15 | futile | I'm making huge progress on test2. |
| 21:15 | futile | Could be done tonight. |
| 21:23 | SegFaultAX | The other thing I missed was that you're set is expressed as 1 .. n - 1 (which is entirely uncommon for this proof) |
| 21:27 | amalloy | SegFaultAX: it was actually 0, 1 .. n-1 |
| 21:27 | amalloy | and then i was ignoring the 0 |
| 21:27 | amalloy | (or rather, mentioning it once as irrelevant) |
| 21:29 | SegFaultAX | amalloy: Which it /isn't/ since the number of elements in the series is completely material to the proof. |
| 21:29 | abp | futile: Why are you postfixing all the functions with 'er' despite bbloom suggesting changing it some days ago? define, discover, run and report seem quite fine for example. |
| 21:30 | futile | abp: because |
| 21:30 | futile | abp: hey look over there! |
| 21:30 | futile | abp: https://www.youtube.com/watch?v=QAEkuVgt6Aw |
| 21:30 | amalloy | $google kingdom of nouns |
| 21:30 | lazybot | [Stevey's Blog Rants: Execution in the Kingdom of Nouns] http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html |
| 21:30 | SegFaultAX | Classic post. |
| 21:30 | abp | yeah |
| 21:31 | SegFaultAX | futile: Did you still want to know what's going on? Or have you checked out by this point? :) |
| 21:31 | amalloy | SegFaultAX: he stopped caring around sentence three |
| 21:31 | futile | SegFaultAX: yeah i saw it, its a good film |
| 21:31 | amalloy | anyway, i'm checking out myself. fun arguing with you, SegFaultAX |
| 21:32 | SegFaultAX | amalloy: Likewise! |
| 21:33 | SegFaultAX | futile: I'm going to explain it one more time using Gauss' proof, ok? |
| 21:33 | abp | SegFaultAX: So you're geek happy now? :) |
| 21:33 | SegFaultAX | Consider the numbers from 1 to N: 1 + 2 + 3 +4 + N |
| 21:33 | SegFaultAX | Ok? |
| 21:34 | clojurebot | okay is pokau |
| 21:34 | SegFaultAX | You could write that like this N + (N-1) + (N-2) + (N-3) + 1 |
| 21:35 | SegFaultAX | It's the exact same thing, except for we're counting backwards. |
| 21:35 | SegFaultAX | (In the case where N = 5, 5 + 4 + 3 + 2 + 1) |
| 21:35 | SegFaultAX | So we have 2 equivalent representations of the same value |
| 21:36 | SegFaultAX | If we sum them together pairwise, we get (N + 1) + ((N-1) + 2) + ((N-2) + 3) ... |
| 21:36 | futile | SegFaultAX: sounds good |
| 21:36 | futile | thanks |
| 21:36 | SegFaultAX | You'll see that all the summands (when simplified) are /just/ N + 1 + N + 1 ... |
| 21:37 | futile | oooh ok |
| 21:37 | futile | thanks. very smart. |
| 21:37 | SegFaultAX | futile: I haven't finished, nevermind. |
| 21:37 | SegFaultAX | I don't know how much more basic it can get. Sorry. |
| 21:38 | futile | its fine |
| 21:38 | futile | my mind is focused on something else |
| 21:39 | SegFaultAX | futile: Just trying to help. |
| 21:40 | futile | i do appreciate it |
| 21:42 | futile | I think the top-half of this is pretty rock-solid and done: https://github.com/evanescence/test2/blob/master/SPEC.md#reporter |
| 21:48 | abp | futile: Takes a seq of test-results and reports them to the user somehow. If it just were report. |
| 21:50 | abp | futile: Because now you describe which verbs are represented by which nouns and wich nouns consist of nouns wich are really verbs, mostly. |
| 21:52 | abp | test2 discovers defined tests and groups, runs them, and reports the results. |
| 21:56 | loliveira | How do I make a function that return true 2 times and then nil for all next calls? I've been trying this without success: (take-while (fn [& _] (take 2 (repeat true))) (range 1 10)) |
| 21:57 | tomjack | loliveira: don't |
| 21:57 | SegFaultAX | loliveira: Why would you want such a thing? |
| 21:57 | SegFaultAX | (Sounds like an XY problem) |
| 22:00 | loliveira | SegFaultAX: I need to provide a take-while pedicate for a function. In some cases, i want to return only 2 items. |
| 22:02 | SegFaultAX | loliveira: Why do you care how many items are returned? take-while is lazy anyway. |
| 22:03 | SegFaultAX | loliveira: What are you /actually/ trying to do? |
| 22:04 | jodaro | i have a KY problem |
| 22:04 | jodaro | i'm all out |
| 22:04 | callen | jodaro: you have a mango problem. |
| 22:05 | SegFaultAX | *slow clap* |
| 22:05 | callen | jodaro: namely, you don't have enough MangoDB in your task queue library |
| 22:05 | jodaro | haha |
| 22:05 | jodaro | mangodb |
| 22:05 | jodaro | there is a neighborhood cat we call mango |
| 22:05 | callen | MangoDB because it's sweeter than MongoDB brah. |
| 22:06 | jodaro | he's got one bad eye |
| 22:06 | callen | :( |
| 22:06 | jodaro | its mongodb but tropical |
| 22:07 | loliveira | SegFaultAX: https://www.refheap.com/15803 |
| 22:08 | loliveira | if test-mode is set, the predicate should "work" only n times. |
| 22:09 | loliveira | if not, is the value that will break the while loop. |
| 22:09 | loliveira | SegFaultAX: does it make sense? |
| 22:10 | SegFaultAX | loliveira: How is this being used? (Something is very wrong here) |
| 22:12 | loliveira | SegFaultAX: is passed by parameter to another function. This second function uses it internally.\ |
| 22:12 | loliveira | SegFaultAX: while-fn is passed by parameter to another function. This second function uses it internally. |
| 22:12 | SegFaultAX | loliveira: What's the overall problem statement? |
| 22:17 | loliveira | SegFaultAX: i'd like to control the number of items returned by a function that receives a while-fn only providing the proper while-fn. The original ordinal code was: https://www.refheap.com/15804. - "If test-mode is set, return all items". Now, i need to change it to "If test-mode is set, return on n items" |
| 22:42 | dnolen | core.match AOT issues finally resolved |
| 22:45 | SegFaultAX | loliveira: What I don't understand is why not just have the function lazily produce all the items, then (take n thingy-producing-items)? |
| 22:46 | SegFaultAX | loliveira: In other words, why does the thing producing values care how many you need? |
| 22:47 | SegFaultAX | loliveira: Keep in mind that Clojure has first class support for lazily evaluated sequences. |
| 22:48 | loliveira | SegFaultAX: the called function had a doseq that messed all up. I could remove it without proble |
| 22:48 | loliveira | m. |
| 22:49 | SegFaultAX | loliveira: Can you show us? |
| 22:49 | loliveira | SegFaultAX: sure. |
| 22:50 | Apage43 | dnolen: ! |
| 22:50 | dnolen | Ah Scala enters the compile to JS fold |
| 22:51 | dnolen | 16mb of runtime tho :D (I'm sure they'll sort it out soon enough) |
| 22:51 | Apage43 | while I'm sure I would never have needed it to work with AOT it'll be nice to have that scary warning out of the README |
| 22:51 | dnolen | Apage43: yes, I'm very close to pretty comprehensive set of fixes, gonna go through a lot of tickets that I think are addressed by this latest |
| 22:51 | dnolen | like to slap a beta on this sucker if it all goes well |
| 22:53 | dnolen | it amazing what can happen if you just write some sensible tests :P https://github.com/clojure/core.match/blob/master/src/test/clojure/clojure/core/match/test/impl.clj |
| 22:54 | dnolen | anyways, I'm pretty excited about core.match again, removed so much cruft |
| 22:55 | futile | removing cruft is the funnest part of programming probably |
| 22:55 | jasonjckn | dnolen: awesome I remember running into alot AOT issues, eventually I just gave up on AOT |
| 22:55 | SegFaultAX | futile: You must not have worked on very crufty code. |
| 22:55 | futile | SegFaultAX: o contrare |
| 22:56 | futile | SegFaultAX: simplifying overcomplexity is half of programming |
| 22:56 | Apage43 | au contraire? |
| 22:56 | futile | the other half is making things from scratch (and trying to make them not overcomplex) |
| 22:56 | futile | Apage43: yeah that |
| 22:56 | SegFaultAX | futile: a) no b) that isn't what you said. |
| 22:56 | jasonjckn | as Johnny Ive would say "bringing order to complexity" |
| 22:56 | Apage43 | i'm in a boat now where i want to go and gut a bunch of stuff |
| 22:56 | SegFaultAX | You said it was the funnest part |
| 22:56 | futile | jasonjckn: yeah that |
| 22:57 | Apage43 | but it's such a daunting prospect that noone else wants me to spend the time |
| 22:57 | SegFaultAX | There is nothing fun about ripping through hundreds of thousands of lines of shit code. |
| 22:57 | futile | SegFaultAX: dont listen to me i just make stuff up all the time |
| 22:57 | futile | SegFaultAX: i know, trust me i know. |
| 22:57 | futile | SegFaultAX: but it is fun to rip 50 lines of code into 5 |
| 22:57 | futile | SegFaultAX: thats fun and rewarding :) |
| 22:57 | SegFaultAX | futile: Heh, true. |
| 22:57 | Apage43 | less fun is watching it pile up |
| 22:57 | SegFaultAX | futile: Code golfing (aka masturbation) is awesome! |
| 22:58 | futile | SegFaultAX: ugh |
| 22:58 | futile | <-- catholic |
| 22:58 | loliveira | SegFaultAX: https://www.refheap.com/15807 |
| 22:58 | Apage43 | had to watch three multi-hundred line commits of really icky C code go into a project this week |
| 22:58 | futile | sometimes i think i take documentation too seriously |
| 22:58 | futile | re: https://github.com/evanescence/test2/blob/master/SPEC.md |
| 22:59 | futile | (and long ago https://github.com/mattgemmell/zephyros ) |
| 23:00 | futile | Apage43: im sorry. |
| 23:02 | SegFaultAX | loliveira: So that for loop is lazy, but you're basically forcing it to expand. |
| 23:03 | loliveira | to measure the time spent |
| 23:03 | tomjack | does this show that the Applicative morphism is broken for relative-time Reactives? https://www.refheap.com/0aed9ee1fc291ea0948e0a6a3 |
| 23:04 | SegFaultAX | loliveira: And the while-fn, that's just the number of values you need right? |
| 23:05 | loliveira | SegFaultAX: In test-mode, yes. |
| 23:05 | tomjack | oh, no.. |
| 23:06 | SegFaultAX | loliveira: I would break this down. Separate the processing from the tracing/logging |
| 23:06 | SegFaultAX | loliveira: (def parsed-things (map parse-thing things)) |
| 23:07 | SegFaultAX | loliveira: Now you have a lazy list of parsed things. You can do stuff like (doseq [thing parsed-things] (trace ...)) |
| 23:07 | tomjack | oh, and wrong channel :) |
| 23:07 | SegFaultAX | loliveira: Or if you want to time the parsing: (time (doall parsed-things)) |
| 23:07 | loliveira | SegFaultAX: nice idea. Thank you. |
| 23:08 | SegFaultAX | loliveira: Or if you want to take some fixed number: (take 10 parsed-things) |
| 23:08 | SegFaultAX | loliveira: Or take items based on some predicate (take-while #(thing-test (:value %)) parsed-things) |
| 23:10 | loliveira | SegFaultAX: I like it. It is a whole new way to think about programming. This is why I choose clojure. |
| 23:10 | SegFaultAX | loliveira: Neat! Why don't you try refactoring it then report back and we can help you some more. |
| 23:11 | loliveira | SegFaultAX: Thank you. |
| 23:11 | loliveira | SegFaultAX: i'll keep you updated. |
| 23:13 | SegFaultAX | loliveira: Good luck. |
| 23:13 | SegFaultAX | loliveira: Oh one other thing, don't do side-effecty stuff in let-bindings. It makes no sense especially since you can just move it to your do-block. |
| 23:14 | SegFaultAX | (And you did) |
| 23:14 | loliveira | SegFaultAX: =) |
| 23:19 | futile | technomancy: yo |
| 23:20 | futile | oh wait nm i ping'd you earlier |
| 23:20 | callen | futile: it's a little rude to cherry pick people for pinging |
| 23:20 | callen | futile: if you have a Clojure question, you should just ask it. |
| 23:20 | futile | callen: right |
| 23:21 | futile | callen: also rude to guess why someone's pinging someone |
| 23:21 | futile | callen: what do you think of this spec? https://github.com/evanescence/test2/blob/master/SPEC.md |
| 23:23 | futile | callen: ignoring the Roles section at the bottom |
| 23:29 | callen | futile: kill the nouns |
| 23:30 | futile | callen: ok besides that? |
| 23:40 | futile | ,(partial + 1 1) |
| 23:40 | clojurebot | #<core$partial$fn__4192 clojure.core$partial$fn__4192@4615fb> |
| 23:40 | futile | ,(let [f (partial + 1 1)] (f)) |
| 23:40 | clojurebot | 2 |
| 23:40 | futile | so it's like #() |
| 23:44 | xeqi | ,(let [f (partial + 1 1)] (f 7)) |
| 23:44 | clojurebot | 9 |
| 23:48 | futile | xeqi: well sure, that too :) |
| 23:58 | ddellacosta | not really a CLJS question, but anyone know how to trigger events on a goog.editor.Field when you only have the element that it is tied to? This inside of a test. |