2013-08-06
| 00:03 | diphtherial | hey, can i have leiningen installed for both windows and cygwin at the same time? it seems they both use the profile's .lein directory, and i'm concerned that they'll conflict |
| 00:10 | diphtherial | apparently not, thankfully; i ran lein in the ~/bin directory after adding it to the path and it seems like things worked out ok... |
| 00:11 | diphtherial | verified, lein is now usable both from cygwin and the standard windows command prompt |
| 00:56 | Foxboron | using vim-fireplace, trying to eval code but the only thing i get is "ClassCastException java.lang.Character cannot be cast to clojure.lang.IObj clojure.core/with-meta (core.clj:214)" |
| 00:57 | Foxboron | i can't seem to find any reasonable explenation why as it works in lein repl, but not inside vim |
| 01:00 | zeroem | offending code? |
| 01:01 | Foxboron | impossible, evaling (def test "hello world") |
| 01:01 | zeroem | oh |
| 01:01 | zeroem | erm |
| 01:02 | zeroem | one sec, installing fireplace |
| 01:05 | zeroem | hrm |
| 01:05 | zeroem | worked fine for me |
| 01:05 | zeroem | everything up to date? |
| 01:06 | zeroem | I'm using Lein 2.2, clojure 1.5.1 |
| 01:06 | zeroem | and I just grabbed fireplace from git |
| 01:07 | Foxboron | just pulled the latest changes, but no luck |
| 01:07 | Foxboron | i did however test with another project, and it works |
| 01:08 | Foxboron | so obviously something i have fucked up now |
| 01:08 | clj_newb_2345 | fireplace is awesome |
| 01:08 | clj_newb_2345 | I like fireplace |
| 01:09 | Raynes | It's warm and cozy, ain't it? |
| 01:11 | Foxboron | zeroem: rmed the dir and made a new project. |
| 01:11 | Foxboron | suddenly it works |
| 01:11 | zeroem | when all else fails, start over, right? |
| 01:12 | Foxboron | or force push. |
| 01:12 | Foxboron | solved every problem possible |
| 01:49 | futile | crap |
| 01:49 | futile | ive gone insane. |
| 01:49 | futile | dangit |
| 01:50 | futile | and on a day like this! |
| 04:13 | clgv | I have a problem with using data_readers.clj, the function specified for a tagged literal is initialized as Unbound but it remains Unbound even after requiring the implementation namespace |
| 04:26 | ro_st | is it possible to stop clojure's pr-str / println / pprint from including commas? |
| 04:26 | clgv | how is data_readers.clj supposed to work if it interns all specified functions as clojure.lang.Var$Unbound and requiring the implementation namespace does not replace Unbound with the actual implementation??? |
| 04:26 | lazybot | clgv: How could that be wrong? |
| 04:31 | tomjack | clgv: /shrug works for me |
| 04:31 | clgv | tomjack: you got a minimal example? |
| 04:31 | clgv | I tried with plain leiningen |
| 04:32 | tomjack | gist is down :( |
| 04:32 | clgv | refheap? |
| 04:32 | clojurebot | refheap is gist |
| 04:32 | clgv | ~gist |
| 04:32 | clojurebot | gist is http://gist.github.com/ |
| 04:32 | clgv | lol |
| 04:32 | clgv | refheap.com |
| 04:33 | tomjack | https://www.refheap.com/0695892d84b594cbea1e04ccd |
| 04:34 | tomjack | you're not trying to use a tagged literal inside ns, are you? :> |
| 04:35 | clgv | no. |
| 04:41 | clgv | tomjack: well if I do not require the implementation namespace in the file it does not work when requiring it manually in repl |
| 04:42 | clgv | tomjack: before requiring the function symbol is set to Var$Unbound and after that as well |
| 04:44 | tomjack | you need to require it before starting the repl |
| 04:44 | tomjack | if you want to test it in the repl you will have to read-string |
| 04:44 | clgv | why? |
| 04:44 | clojurebot | Why is why |
| 04:44 | tomjack | hmm |
| 04:45 | tomjack | I'm full of shit |
| 04:45 | clgv | if that is really a requirement, it is even more impractical that the implementation namespaces are not loaded |
| 04:45 | tomjack | maybe that is true, maybe it isn't, I don't know |
| 04:46 | clgv | I should be able to redefine the function as any other function in the repl. but it seems not like it |
| 04:47 | tomjack | hmm |
| 04:47 | tomjack | I just tested at the repl, seemed to work |
| 04:47 | clgv | I tested in a fresh project... |
| 04:48 | tomjack | I happened to have a data reader sitting around in this project that I forgot about |
| 04:49 | tomjack | https://www.refheap.com/aa4c65ba3d60c7595dd09f9cb |
| 04:50 | tomjack | I'm in swank /blush, no clue if that matters |
| 04:51 | clgv | damn I had a typo in the fresh project, so it did not work there but now works. so bug search in the real project... :( |
| 04:53 | clgv | oh found the typo in the real project... :/ |
| 05:02 | cemerick | squidz: Thanks, glad it's working out for you. :-) |
| 05:06 | noidi | cemerick, thanks for doing the austin screencast. austin looks very promising, I can't wait to try it out! |
| 05:06 | cemerick | I hope it lives up to expectations :-) |
| 05:13 | shdwprince | oh, debuging macroses is completely horrible |
| 05:14 | shdwprince | maybe there is some useful tools, not only macroexpand? |
| 05:14 | ro_st | macroexpand-1 ? :-) |
| 05:14 | ro_st | also, do as much of the work in normal functions as you can |
| 05:15 | shdwprince | ro_st: I'll bet there is solution for indenting macroexpand output :) |
| 05:15 | supersym | how do I remove the outside parens of a form? e.g ([a b c][d e f]) so I remain with the inner part? |
| 05:15 | ro_st | very often macros can be tiny wrappers around otherwise normal functional code |
| 05:15 | ro_st | supersym: with code or in emacs? |
| 05:15 | supersym | newb question, can't for the love of god figure it out, must still be half sleeping |
| 05:15 | supersym | with code |
| 05:15 | supersym | flatten is for inner |
| 05:15 | ro_st | what do you want it to look like afterwards? |
| 05:16 | ro_st | [a b c d e f] ? |
| 05:16 | supersym | (syntax-quote ...) from backtick only takes a single form so I have to wrap it |
| 05:16 | supersym | ofc I can do first, rest map over it |
| 05:16 | ro_st | ~@ unwraps seqs |
| 05:16 | clojurebot | seqs and colls is http://www.brainonfire.net/files/seqs-and-colls/main.html |
| 05:16 | shdwprince | ~@ in macroses should expand (a b c) into a b c |
| 05:16 | ro_st | in macros |
| 05:16 | supersym | was just wondering if there is a function for it |
| 05:16 | supersym | ah |
| 05:16 | supersym | its a defn atm still |
| 05:16 | supersym | explains |
| 05:16 | shdwprince | sypersym, that function should return 3 results, or,.. syntax? |
| 05:17 | ro_st | what data structure do you want to end up with? |
| 05:17 | ro_st | ,(apply concat [[1 2] [3 4] [5 6]]) |
| 05:17 | clojurebot | (1 2 3 4 5 ...) |
| 05:18 | supersym | ah |
| 05:18 | supersym | thnx |
| 05:42 | schmir | I need to import two classes with the same name from two different namespaces. can I somehow use :import with :as or something like that..? |
| 05:43 | clgv | schmir: that's a missing feature I guess |
| 05:50 | schmir | looks like I can use the fully qualified name for that... |
| 06:02 | muhoo | weird, why would friend/authenticate only work BEFORE compojure.handler/site, and not after it? |
| 06:03 | muhoo | when using context in compojure, that is. |
| 06:03 | muhoo | if i don't use context, i can stick wrap-authenticate way at the end of the chain, and wrap-authorize anywhere before it |
| 06:04 | muhoo | but if i've got context up in the mix, then it has to be (-> app wrap-~authorize wrap-authenticate handler/site) |
| 06:07 | muhoo | sorry (-> app handler/site (friend/wrap-authorize #{::stuff}) friend/authenticate) works, but if i've got context in there, handler/site must come after friend/authenticate |
| 06:09 | Raynes | muhoo: You be workin' the late shift homeboy. |
| 06:09 | muhoo | yeah, deadlines and committments |
| 06:09 | Raynes | Well, 'fraid my ability to help you ended as soon as you said 'friend' |
| 06:09 | ro_st | cemerick is around, muhoo |
| 06:10 | Raynes | I forgot that cemerick was a morning person. |
| 06:10 | muhoo | i'll try him in the am east coast time |
| 06:10 | Raynes | This is the AM east coast time, muhoo. |
| 06:10 | muhoo | means, like, in a few hours |
| 06:10 | cemerick | is this not AM? |
| 06:10 | Raynes | muhoo: It's 6AM. cemerick gets up this early. |
| 06:10 | muhoo | ah, there he is |
| 06:10 | Raynes | I know it's wild, but it happens. |
| 06:10 | cemerick | Raynes: dude, been cranking for 2 hours. |
| 06:11 | Raynes | I haven't even slept yet, man. |
| 06:11 | Raynes | Albeit it's only 3AM here, but still. |
| 06:11 | muhoo | anyways, i'm baffled by something that maybe if i had sleep would make more sense |
| 06:11 | cemerick | muhoo: friend requires various ring middlewares; the order of application matters |
| 06:12 | cemerick | Raynes: Sounds like I'm a solid 12 hours ahead of you, then ;-) |
| 06:12 | muhoo | i've noticed that. and it appears authenticate does not like being at the end of the chain, if context is uses at the beginnign of it. |
| 06:13 | cemerick | muhoo: authenticate establishes the scope of friend's control; if you put stuff outside of that scope, then friend can't do much about that :-) |
| 06:13 | muhoo | that's why i'm having heartburn over this |
| 06:13 | muhoo | i want to put authenticate at the end, to secure the WHOLE app |
| 06:13 | muhoo | but it hates that. it insists on being before handler/site. |
| 06:13 | muhoo | ONLY if i have some context routes though. if i pull out context, then i can stick authenticate at the end. |
| 06:13 | cemerick | muhoo: handler/site isn't any part of your app |
| 06:14 | muhoo | handler/site is compojures stock wrappers |
| 06:14 | cemerick | yeah, I'm aware |
| 06:14 | muhoo | and i have other stuff like wrap-file-info, wrap-resource, etc, after handler/site |
| 06:14 | muhoo | hmmm, maybe i can stick those before handler/site. |
| 06:15 | muhoo | i dunno, what bothers me is the voodoo nature of this; just moving stuff around without understanding why it works or doesn't makes me.... uncomfortable |
| 06:15 | cemerick | muhoo: well, don't do that, then :-P Determine what each middleware requires, or not, and place them appropriately. |
| 06:15 | cemerick | They're not meant to be shuffled willy-nilly. |
| 06:16 | muhoo | indeed. i vaguely remember someone working on some kind of dependency management for ring middlewares |
| 06:16 | cemerick | yeah, nREPL has a similar system for its middlewares that automates all this |
| 06:16 | muhoo | ah, that's right, it was nrepl not ring. |
| 06:17 | cemerick | muhoo: short rule of thumb: handler/site or handler/api is *always* last/outer, followed by friend, then contexts, then your actual bare ring handler/routes |
| 06:18 | muhoo | ok, it's coming back to me now. because handler/site has things like wrap-query-params that friend will need, i.e. for reading user/password info out of posts, etc |
| 06:18 | cemerick | If you have other middlewares that are strictly transformative (most are), then putting them between handler/site and friend generally makes sense |
| 06:18 | muhoo | thanks, i think i'm back in reality now. |
| 06:19 | muhoo | btw that austin thing looks very cool, will play with it as time permits |
| 06:20 | cemerick | sounds good :-) |
| 06:40 | muhoo | ok, everything cool now with friend and compojure. next, i will have to integrate friend with https://github.com/cmiles74/bishop . after some sleep first though :-) |
| 06:42 | noidi | ambrosebs, is the new HMap syntax documented somewhere? (:mandatory, :optional, :complete?) |
| 06:42 | ambrosebs | noidi: maybe... :) I'll have a look. |
| 06:44 | ambrosebs | noidi: doesn't look like it. I'll update the types wiki. |
| 06:46 | noidi | ambrosebs, thanks |
| 06:47 | ambrosebs | noidi: I was thinking of making a clojure.core.typed/HMap var with some doc metadata. |
| 06:49 | noidi | that's a good idea |
| 06:50 | noidi | ambrosebs, is there a way to tell core.typed that the map should not contain extra keys beyond the ones listed in the type definition? |
| 06:51 | ambrosebs | yes HMap takes a set of keywords with the :absent-keys option. |
| 06:51 | ambrosebs | oh |
| 06:51 | ambrosebs | :absent-keys is saying these particular keys don't occur, but :complete? true says "there are no more entries". |
| 06:53 | noidi | (t/cf {:foo 123, :bar 456} (HMap :mandatory {:foo Long}, :complete? true)) |
| 06:53 | noidi | ;= (HMap :mandatory {:foo Long} :complete? true) |
| 06:54 | ambrosebs | that's a bug |
| 06:54 | noidi | ok |
| 06:54 | ambrosebs | I'll write up the docs then I'll fix that :) |
| 06:54 | noidi | great, thanks! |
| 07:00 | clgv | ambrosebs: how much of clojure.core can you cover with core.typed now (approximately)? |
| 07:02 | ambrosebs | clgv: do you mean unchecked types? |
| 07:03 | harja | In Fireplace's documents it says that it should autoconnect to nREPL when Leiningen is in use. In practice this never happens, I have to type in :Connect nrepl://localhost:<port> if I want to connect |
| 07:03 | harja | What am I doing wrong? |
| 07:03 | clgv | ambrosebs: rephrased: what are the critical open problems atm? |
| 07:04 | ambrosebs | clgv: I don't think there are any gaping holes left. |
| 07:04 | clgv | ambrosebs: oh. interesting. |
| 07:05 | ambrosebs | clgv: perhaps metadata. There's half assed support there currently. |
| 07:06 | ambrosebs | clgv: nothing crazy though. |
| 07:06 | clgv | ambrosebs: ok. so I probably should try it out on one of my projects... |
| 07:07 | ambrosebs | clgv: I'm sure there's many little issues waiting to be found, but no showstoppers. It's a good time to start using core.typed. |
| 07:07 | harja | never mind, I guess reinstalling leiningen did something to fix it. now it works. |
| 07:08 | andrewmcveigh|wo | harja: I'm no expert with fireplace, but I had the same issue. Ensure that the file $project-dir/target/repl-port is being created, and that it has the port number in it. |
| 07:08 | andrewmcveigh|wo | ... oops, too late. |
| 07:08 | ambrosebs | clgv: what kind of project are you thinking of checking? |
| 07:08 | clgv | ambrosebs: just private ones. I have a small website scraper which might be a good start |
| 07:09 | ambrosebs | clgv: cool |
| 07:09 | clgv | but interesting for the features around checking maps |
| 07:09 | clgv | ambrosebs: is there any (blog) article you'd suggest for starting? |
| 07:11 | ambrosebs | clgv: I don't think there's much out there. My fault. |
| 07:12 | ambrosebs | There's the official docs, that gives a start |
| 07:12 | ambrosebs | https://github.com/clojure/core.typed/wiki/User-Guide |
| 07:12 | clgv | ok. I just thought I ask since for other libs there are often several blog posts introducing them^^ |
| 07:13 | noidi | ambrosebs, a feature request: when typechecking fails for a map's value, I'd like the error to be reported for the value (mentioning the value type's alias) and not the outermost map |
| 07:13 | noidi | (that might not make much sense so I'll give an example) |
| 07:14 | noidi | suppose I have an object like {:foo {:bar {:baz 123}}}, and corresponding type aliases Foo, Bar and Baz |
| 07:14 | noidi | and a type alias M for the whole map |
| 07:14 | noidi | if baz's value has an incorrect type, currently core.typed reports that {:foo {:bar {:baz 123}}} is not of type M |
| 07:15 | noidi | while I'd want it to tell me that 123 is not of type Baz |
| 07:16 | ambrosebs | noidi: hmm. I'll have to think about (how to do) that. |
| 07:20 | ambrosebs | noidi: I don't think that would make sense if you had an expected type like (U M N O P). You'd have to just pick a random union member, and there might be multiple errors per member.. |
| 07:21 | ambrosebs | My suggested solution if you ever get stuck like this is to use ann-form to do some static debugging. |
| 07:21 | ambrosebs | Keep annotating inner maps until something blows up that you recognise. |
| 07:22 | noidi | makes sense, thanks |
| 07:22 | ambrosebs | np |
| 07:23 | ambrosebs | clgv: I'm very actively on the mailing list and developing core.typed, so don't hesitate to query. |
| 07:24 | clgv | ambrosebs: ok thanks. :) |
| 09:00 | Anderkent | heh, the error when you get docstring order wrong is very useful :P |
| 09:00 | Anderkent | ,(ns "docstring?" foobar) |
| 09:00 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol> |
| 09:00 | Anderkent | no line information obvsly |
| 09:00 | clgv | they usually are^^ |
| 09:11 | harja | argh "goog.require could not find: clojure.browser.repl" |
| 09:12 | harja | does someone have ideas on how to fix that? |
| 09:14 | ro_st | nothing on the google? |
| 09:14 | chrisrossi | speaking of error output, is there an easy way to produce stack traces that leave out the java frames? |
| 09:14 | chrisrossi | it can be kind of a pain searching the strack trace for the few clojure frames. |
| 09:15 | ro_st | chrisrossi: you might want to look at the source of https://github.com/jaycfields/expectations |
| 09:15 | ro_st | it culls java and clojure lines from straces when presenting output |
| 09:15 | kmicu | https://github.com/mmcgrana/clj-stacktrace |
| 09:15 | ro_st | or that :-) |
| 09:16 | ro_st | that still prints all the lines though |
| 09:17 | chrisrossi | the former functionality would be great if it were packaged independently from a unittest framework. |
| 09:18 | chrisrossi | i suppose if i get ambitious i can steal that code and package it separately. |
| 09:18 | harja | ro_st: nope :( |
| 09:19 | kmicu | Do not use that word here. |
| 09:19 | kmicu | harja: How you get it? |
| 09:21 | kmicu | Refheap your project.clj |
| 09:27 | harja | kmicu: https://www.refheap.com/c1221b89bb65ec1b773e01524 |
| 09:27 | wakeup | hi all |
| 09:27 | supersym | hello :) |
| 09:28 | wakeup | Whats clojures pendant to REMOVE-DUPLICATES? |
| 09:28 | clgv | wakeup: distinct |
| 09:28 | ro_st | or set |
| 09:28 | wakeup | but I cant pass it a test function? |
| 09:28 | clgv | ,(distinct [1 1 2 1 3 3 1 5]) |
| 09:28 | clojurebot | (1 2 3 5) |
| 09:29 | clgv | no. it is based on sets not on comparison functions |
| 09:31 | hyPiRion | hm |
| 09:31 | hyPiRion | ,(distinct [1.0 1 1.0 1]) |
| 09:31 | clojurebot | (1.0 1) |
| 09:31 | harja | I solved that error by just requiring clojure.browser.repl in my cljs-script |
| 09:31 | harja | however, now the error is "Cannot call method 'appendChild' of null " |
| 09:31 | harja | in goog.net.xpc.CrossPageChannel |
| 09:38 | harja | ah, that code needed to be at the body, it did not have a parent element when I included the script in head... |
| 09:51 | tbaldridge | wakeup: perhaps group-by? |
| 09:51 | tbaldridge | ,(group-by pos? [0 1 2 3 4 5 6]) |
| 09:51 | clojurebot | {false [0], true [1 2 3 4 5 ...]} |
| 09:52 | tbaldridge | ,(group-by even? [0 1 2 3 4 5 6]) |
| 09:52 | clojurebot | {true [0 2 4 6], false [1 3 5]} |
| 09:52 | tbaldridge | that's better |
| 09:53 | tbaldridge | ,(group-by (partial / 4) (range 10)) |
| 09:53 | clojurebot | #<ArithmeticException java.lang.ArithmeticException: Divide by zero> |
| 09:53 | tbaldridge | ,(group-by (partial / 4) (range 1 10)) |
| 09:53 | clojurebot | {1 [4], 4/5 [5], 2/3 [6], 2 [2], 4/7 [7], ...} |
| 09:53 | tbaldridge | okay, nevermind, I was trying to show more than one group |
| 09:56 | hyPiRion | ,(group-by #(mod % 3) (range 10)) |
| 09:56 | clojurebot | {0 [0 3 6 9], 1 [1 4 7], 2 [2 5 8]} |
| 09:59 | gavri | how do I reduce a map to get the map entry with the smallest number as its value? |
| 10:01 | tbaldridge | , (reduce #(min %1 (second %2)) {:a 1 :b 2 :c 3}) |
| 10:01 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.MapEntry cannot be cast to java.lang.Number> |
| 10:02 | tbaldridge | ack, scratch that |
| 10:02 | tbaldridge | , (reduce min (vals {:a 1 :b 2 :c 3})) |
| 10:02 | clojurebot | 1 |
| 10:02 | hyPiRion | ^ |
| 10:02 | gavri | that just gives me the value, doesn't it? |
| 10:02 | gavri | I'd like the corresponding map entry |
| 10:02 | gavri | specifically, I'd like the key |
| 10:03 | hyPiRion | ,(reduce (partial min-key val) {:a 1 :b 2 :c 3}) |
| 10:03 | clojurebot | [:a 1] |
| 10:03 | gavri | thanks, hyPiRion and tbaldridge |
| 10:04 | noncom | hi, is there any (time) function that returns simply a double of ms, without printing anything to the console? |
| 10:04 | kmicu | ,(reduce (partial min-key val) {:a 1 :b 2 :c 3 :d 1}) |
| 10:04 | clojurebot | [:d 1] |
| 10:16 | stuartsierra | noncom: not built-in, but easy to write with System/currentTimeMillis |
| 10:17 | noncom | yeah, no problem |
| 10:33 | wakeup | what are the requirements for IS (clojure.test) to be not ignored? |
| 10:33 | gfredericks | ignored by what? |
| 10:34 | wakeup | I don't know |
| 10:34 | kmicu | ;] |
| 10:34 | wakeup | I have a function which loops over randomly generated test values and checks them with IS |
| 10:34 | wakeup | so far so good, only they don't show up when I run lein test |
| 10:34 | tbaldridge | wakeup: code? |
| 10:35 | gfredericks | wakeup: are you using deftest? |
| 10:35 | wakeup | unless I wrap the function call with (is (= (distinct (test-func)) |
| 10:35 | wakeup | ... |
| 10:36 | wakeup | The test is defined using deftes, but the test itself calls the function which uses IS repeatedly |
| 10:36 | tbaldridge | wakeup: that should be fine |
| 10:36 | wakeup | I can see how the architect of the test suite fucked this up, what I don't understand is why it works when I wrap the call with said code |
| 10:36 | tbaldridge | wakeup: are you sure you aren't returning a lazy seq that isn't getting relized? |
| 10:36 | wakeup | but for iunstance not if I just wrap it with an IS |
| 10:37 | tbaldridge | distinct would realize the lazy seq... |
| 10:37 | wakeup | ah |
| 10:37 | wakeup | of course |
| 10:37 | wakeup | ok |
| 10:37 | wakeup | is there some idiom for ensuring stuff is evaluated? |
| 10:37 | tbaldridge | what you can do is wrap it in dorun or doall |
| 10:38 | wakeup | ah ok |
| 10:38 | tbaldridge | yeah, it's odd at first, but after a time, using lazy seqs in this way will start to give you a |
| 10:38 | wakeup | whats the difference between dorun and doall? |
| 10:38 | gfredericks | wakeup: doall returns the seq |
| 10:39 | tbaldridge | dorun returns nil |
| 10:39 | gfredericks | wakeup: my preferred method is to use doseq instead of map |
| 10:39 | tbaldridge | so doall keeps the entire seq in memory, dorun will throw parts of the seq away as it goes. |
| 10:39 | gfredericks | I don't like combining map with side effects, and clojure.test/is is a side effect |
| 10:40 | wakeup | I am mapping over (keys ...) now it complains its result isn't a vector and thus can't be used with doseq |
| 10:40 | gfredericks | doseq has different syntax |
| 10:41 | gfredericks | (doseq [k (keys ...)] ... do something with k) |
| 10:41 | tbaldridge | doseq is like a foreach |
| 10:41 | wakeup | ah |
| 10:41 | wakeup | like CL's DOLIST |
| 10:42 | wakeup | thanks for the help |
| 10:42 | TimMc | tbaldridge: I don't think doseq holds the head. |
| 10:42 | TimMc | Sorry, misread. |
| 10:42 | tbaldridge | no |
| 10:42 | tbaldridge | *np |
| 11:29 | ambrosebs | noidi: just pushed 0.1.22, with lots of fixes for HMap. Docs: https://github.com/clojure/core.typed/wiki/Types |
| 11:32 | ambrosebs | noidi: 0.1.21 rather |
| 11:40 | wakeup | is there an easy way to use org.apache.commons.codec.binary.Base32 with leinigen? |
| 11:41 | llasram | wakeup: In what sense? |
| 11:41 | wakeup | I'd like to :import it and add it to :dependencies? |
| 11:42 | wakeup | have leinigen figure out where to fetch the source? |
| 11:42 | gfredericks | if you can find its maven coordinates |
| 11:43 | TimMc | Find the Maven coordinates of the Apache Commons project on http://search.maven.org/ |
| 11:44 | TimMc | then put the [group/artifact "version"] in your project.clj's :dependencies vector. |
| 11:45 | gdev | I always try lein search first because then you can let that run while you get a cup of coffee and come back and there it is |
| 11:47 | noidi | ambrosebs, looks good! |
| 11:47 | ambrosebs | noidi: cool! |
| 11:47 | llasram | gdev: I think the most-recent (or next?) release of Leiningen includes significant improvements for `lein search` |
| 11:47 | noidi | ambrosebs, you're missing a question mark at the end of the keyword here: "Finally, :complete says that there are no further entries in this map." |
| 11:47 | ambrosebs | thx |
| 11:48 | gdev | llasram, aww so it's going to break my workflow? |
| 11:49 | llasram | gdev: Yep! You can always write your own `lein frobnicate` plugin which just spins the CPU for a bit though |
| 11:57 | gdev | lein goldbrick, prints random quotes from bladerunner in a format that looks like a dependency (i.e Downloading tell-me-about-your-mother "1.0.1 RC1" from feux-maven-central...) |
| 11:59 | gdev | llasram, seriously though that sounds exciting |
| 12:00 | gdev | with lein search and lein-try together you can ramp up an experimental repl in no time |
| 12:02 | zerokarmaleft | gdev: or just delete lein's index every time you want a cup of joe |
| 12:03 | zerokarmaleft | but a plugin specifically for being lazy seems to be the more elegant solution |
| 12:04 | dnolen | tbaldridge: any chance of fixing the core.async set! bug, I think that's the last locals related thing that's really busted. |
| 12:07 | tbaldridge | dnolen: yeah, I have a fix in mind, I'm traveling later today, so I'll see if I can't whip it out while waiting on the plane |
| 12:07 | dnolen | tbaldridge: sweet! |
| 12:28 | ddellacosta | how do you reference instance properties of a Java object within a proxy call? |
| 12:28 | ddellacosta | oh, seems like you can't maybe: "Note that while method fns can be provided to override protected methods, they have no other access to protected members, nor to super, as these capabilities cannot be proxied." |
| 12:28 | ddellacosta | hmm |
| 12:54 | mikerod | ,(list? (cons 'a '(1 2))) |
| 12:54 | clojurebot | false |
| 12:54 | mikerod | This came somewhat a surprise to me. |
| 12:55 | mikerod | ,(list? (list* 'a '(1 2))) |
| 12:55 | clojurebot | false |
| 12:56 | TimMc | Yeah. :-( |
| 12:57 | dnolen | mikerod: IPersistentLists have guarantees that Cons does not. |
| 12:58 | TimMc | dnolen: TRWTF is that list* does not return a list?. |
| 12:59 | dnolen | TimMc: who uses list*? |
| 12:59 | TimMc | *shrug* |
| 12:59 | TimMc | It's a public fn in core. |
| 13:00 | mikerod | dnolen: I can accept that. I still can't say I expected that. However, list* not being a list?, that's a bit of a stretch. I know that list* isn't necessarily popular. |
| 13:00 | gfredericks | dnolen: I use it a lot |
| 13:00 | gfredericks | especially in any macro where I'm avoiding backtick for some reason |
| 13:02 | technomancy | list? is bad =( |
| 13:02 | dnolen | gfredericks: right, but then you'd probably use seq? anyway |
| 13:02 | technomancy | #(and (counted? %) (seq? %)) is much clearer |
| 13:03 | gfredericks | dnolen: sure, I'm not complaining about list? I'm just saying that I use list*, since you asked :) |
| 13:04 | gfredericks | I should add this to my nonexistent list of gotchas though |
| 13:05 | dnolen | technomancy: you would also need to check ISequential, IPersistentStack, ICollection etc |
| 13:07 | mikerod | Yes, I am going to avoid using list? anymore. |
| 13:08 | mikerod | ,(list? (concat '(1 2) '(3 4))) |
| 13:08 | clojurebot | false |
| 13:10 | shdwprince | &(type (concat (list 1))) |
| 13:10 | lazybot | ⇒ clojure.lang.LazySeq |
| 13:11 | shdwprince | &(type (list 1)) |
| 13:11 | lazybot | ⇒ clojure.lang.PersistentList |
| 13:11 | shdwprince | (seq? (concat (list 1))) |
| 13:11 | shdwprince | &(seq? (concat (list 1))) |
| 13:11 | lazybot | ⇒ true |
| 13:13 | shdwprince | Someone knew tools for debuging macroses? Something like indenting macroexpand output? |
| 13:14 | shdwprince | *knows |
| 13:14 | dnolen | shdwprince: some dev envrionments do this for you. |
| 13:14 | shdwprince | dnolen: currenly my dev environment is REPL |
| 13:15 | dnolen | shdwprince: you can use clojure.pprint |
| 13:19 | shdwprince | dnolen: thanks, forgot about it |
| 13:20 | ro_st | dnolen: how do you cope with raw javascript in your day job? |
| 13:21 | ro_st | if i was you i'd be itching to use Cljs instead :-) |
| 13:22 | dnolen | ro_st: I don't mind raw JS for simple stuff, which is what I usually to write. Less fun as the problem scope grows. |
| 13:24 | ro_st | do you see Cljs making its way into your day job at some point? |
| 13:40 | callen | ro_st: that's like asking a grad student how their thesis is going. Kinda rude. |
| 13:40 | callen | unless you're intentionally trying to produce a Hnnnnggggg reaction. |
| 13:41 | dnolen | ro_st: just depends on the project. I introduced CoffeeScript here 2 1/2 years ago, so it's not outside the realm of possibility. |
| 13:44 | dnolen | ro_st: one things that's missing for me is a sensible CLJS templating solution. I'd like to see something innovative in this area - like something adaptive, string building for initial render, individual element update otherwise. |
| 13:48 | ro_st | callen: i'm merely curious. dnolen is doing phenomenally awesome things with cljs and i think it'd be a pity if he didn't get to use it on his day job, is all :-) |
| 13:50 | callen | dnolen: we're considering making Selmer CLJS compatible. |
| 13:50 | callen | dnolen: http://github.com/yogthos/Selmer/ |
| 13:50 | callen | re: templating |
| 13:51 | dnolen | callen: I'm not interesting in a traditional templating system - I want a tunable rendering pipeline |
| 13:51 | dnolen | template should produce some that leads toward that goal |
| 13:51 | callen | Selmer was designed around server-side rendering at scale, so you'll have that I suppose. |
| 13:51 | dnolen | s/some/something |
| 13:52 | dnolen | callen: yeah not interested in that, client side rendering is what I'm talking about |
| 13:52 | callen | anything along the lines of an incremental templating system for the frontend that I've considered has led me to say "just use AngularJS" |
| 13:52 | callen | or, two-way binding in the abstract. |
| 13:52 | dnolen | callen: AngularJS is busted in too many ways |
| 13:52 | callen | dnolen: such as? |
| 13:53 | ddellacosta | dnolen: super interested in a new CLJS templating solution. Have been talking with my boss about something that does partial evaluation of functions, ending up with simple str concat functions |
| 13:53 | dnolen | callen: no real notion of modularity or time |
| 13:53 | callen | ddellacosta: dommy is the vanilla choice. |
| 13:53 | tbaldridge | dnolen: have you taken a look at the custom template engine in Pedestal? It seems like it would be a bit closer to what you are looking for |
| 13:53 | callen | dnolen: that doesn't really prevent you implementing things with it. It's a philosophical objection not an engineering one with concrete implications. |
| 13:53 | dnolen | tbaldridge: but is it all client side? |
| 13:53 | callen | ddellacosta: dommy is nearly isomorphic with Hiccup AFAIK |
| 13:53 | tbaldridge | dnolen: yes |
| 13:53 | dnolen | callen: there's also nothing else I like about AngularJS |
| 13:53 | bhauman | i really like the solution proposed by webfui and pedsetal |
| 13:53 | cemerick | my tinkerings with react have been surprisingly pleasant; have gotten much further than I ever did with angular, FWIW |
| 13:53 | ddellacosta | callen: yeah, we're not even at the point where we are *using* CLJS templates, so not sure what we'll move to. We have to really think about optimization first, since we are supporting older browsers |
| 13:54 | callen | ddellacosta: gad help you. |
| 13:54 | ddellacosta | callen: yeah, when we get to that point I'll ping ya. ;-) |
| 13:54 | dnolen | tbaldridge: interesting I should take a look at, but I'm really interested in something highly tunable |
| 13:54 | dnolen | tbaldridge: i.e. different render strategies should be simple to insert |
| 13:55 | dnolen | tbaldridge: if there's a global render strategy then I'm not interested |
| 13:55 | callen | ddellacosta: you can ping me besides anyway. but sounds good. |
| 13:55 | ddellacosta | callen: haha, thanks. |
| 13:55 | bhauman | dnolen: there is no global render strategy only a global difference strategy |
| 13:55 | tbaldridge | dnolen: when I last worked with it there wasn't a strategy, it's more based on the idea of a kv store, when you render things they are given ids, you can the replace those items using templates and those same ids |
| 13:56 | tbaldridge | dnolen: that being said, you're talking to the guy who hates UI design, and works on compilers for fun, so I could be making most of this up :-P |
| 13:57 | dnolen | tbaldridge: does it let you identify initial render vs. incremental updates? note I'm also not convinced about the diff stuff, for some applications you'll want need to work with faster data structures. |
| 13:58 | ro_st | dnolen: it dovetails with the app model's deltas, such as :node-create (initial) and :value/:attr (incremental) |
| 13:58 | tbaldridge | dnolen: the render engine of Pedestal is completely detached from the dataflow stuff. So it's possible to use one without the other. |
| 13:59 | dnolen | ro_st: ok I should look at it, I'm also turned off because I only care about client side - looking a Pedestal docs there a lot of other stuff to consider. |
| 14:00 | bhauman | dnolen: I played around with it for three weeks and never touched the backend |
| 14:00 | dnolen | bhauman: ok cool |
| 14:00 | bhauman | dnolen: didn't need a backend at all |
| 14:01 | ro_st | yeah. it's also very easy to simulate a backend if you'll need one later |
| 14:01 | bhauman | dnolen: even so I'm not sure I am advocating it |
| 14:01 | tbaldridge | dnolen: the thing I thought was cool, was that it allows you to mark up your html with extra attributes. That html then gets cut up into CLJS functions where the custom attributes are the arguments to the function |
| 14:02 | ro_st | yes. and those attribs are used both when rendering from template and when updating the live dom |
| 14:02 | tbaldridge | I don't know if it's the best way either, but I like it better than any of the other clojure template libs I've worked with. |
| 14:02 | tbaldridge | Anyone here ever worked with XAML in .NET, now that's what I want. It had warts (tons of them), but it blows the clojure stuff out of the water. |
| 14:03 | bhauman | tbaldridge: i think the rendering part of pedestal is straight from clojurescript one |
| 14:03 | tbaldridge | bhauman: yeah, could be |
| 14:13 | `fogus | I think it re-purposes the CLJSOne rendering, but it's not tied to it right? |
| 14:13 | ro_st | correct. rendering is isolated to a place where you respond to 6 kinds of delta across whatever topics you define |
| 14:14 | ro_st | :node-create :node-destroy :value :attr :transform-enable :transform-disable. last two govern when event handling is enabled/disabled, and what those events do |
| 14:14 | ro_st | you could render ascii, swing, html, whatever you please |
| 14:15 | bhauman | `fogus: that's correct |
| 14:16 | dnolen | bhauman: would it be simple to coalesce render updates a la my 100,000 updates example? |
| 14:16 | dnolen | that's the other bit I'm interested in which a a lot of JS MVC eff up |
| 14:17 | justin_smith | is there a straightforward way to plug an environment property into project.clj without using environ? |
| 14:17 | justin_smith | I mean java property, not shell environment var (though I guess I could use either) |
| 14:17 | bhauman | dnolen: I am assuming that you are thinking about different processes rendering into a render pipeline |
| 14:18 | bhauman | dnolen; pedestal really doesn't do that |
| 14:18 | llasram | justin_smith: You can specify properties via the appropriate command-line arguments in :jvm-opts |
| 14:19 | justin_smith | yes, but lein-beanstalk wants properties to be in either .lein/init.clj or project.clj |
| 14:19 | justin_smith | we don't want passwords in the repo, so in project.clj is out |
| 14:19 | justin_smith | the same tool builds many projects, so init.clj is out |
| 14:20 | justin_smith | I want the var in the command line to end up in project.clj where lein-beanstalk wants it |
| 14:21 | justin_smith | or maybe I can make lein-beanstalk look at a jvm property instead of the project.clj / init.clj? |
| 14:21 | bhauman | dnolen: you could coordinate at an abstract application state level though quite easily {:button1 :disabled} |
| 14:21 | technomancy | justin_smith: you can have a profiles.clj file that you don't check in, or you can unquote. |
| 14:21 | justin_smith | unquote? as in start project.clj with `(defproject ...) |
| 14:22 | technomancy | justin_smith: defproject has an implicit ` already |
| 14:22 | justin_smith | or is there an implicit syntax quote and I qould just put ~ |
| 14:22 | technomancy | or you can use read-eval |
| 14:22 | justin_smith | ahh |
| 14:22 | justin_smith | cool! |
| 14:22 | justin_smith | thanks |
| 14:22 | technomancy | #=(System/getenv "YEAH_WHATEVER") |
| 14:24 | callen | technomancy: the proper way to do app configuration :P |
| 14:24 | `fogus | dnolen: I don't think anything in Pedestal would prevent the kind of scenario that you want. |
| 14:25 | technomancy | callen: yeah, this plugin sounds a bit suspect |
| 14:27 | callen | technomancy: anything involving AWS is questionable. |
| 14:29 | technomancy | AWShucks |
| 14:29 | hiredman | software: the goal is not actively preventing people from doing what they want |
| 14:30 | justin_smith | is there a way to have a init-<app>.clj in ~/.lein that can be set up in project.clj? |
| 14:31 | technomancy | justin_smith: the goal of lein is to get out of the way during project execution |
| 14:31 | cemerick | justin_smith: use a profile? |
| 14:31 | futile | technomancy: thoughts on chicken scheme vs racket? |
| 14:31 | justin_smith | yeah, I probably want a profile |
| 14:31 | callen | futile: this is #clojure |
| 14:32 | futile | callen: and technomancy was talking about racket in here before, so why dont you direct your "shut up that's off topic" to him? |
| 14:32 | technomancy | futile: probably racket, unless you need to use a lot of C libs? |
| 14:32 | futile | technomancy: hmm good point |
| 14:32 | cemerick | justin_smith: just like the README says ;-) |
| 14:32 | futile | callen: /ignore'd, bye |
| 14:32 | technomancy | futile: it's pronounced "plonk" |
| 14:33 | futile | o, thx. never did /ignore before, dunno the ettiquette |
| 14:33 | futile | *didnt know |
| 14:33 | squidz | cemerick: did you use react together with clojurescript? |
| 14:33 | justin_smith | cemerick: read a README? well I never! (in all seriousness, thanks) |
| 14:33 | dnolen | `fogus: yes, I was just trying to understand what pedestal contributes as far as tunable client side rendering pipeline - sounds like not too much :) |
| 14:33 | zenoli | It's been ages since I've seen a good, old-fashioned plonking. |
| 14:33 | nDuff | zenoli: you clearly don't spend much time in #bash |
| 14:34 | futile | anyone try out Nightcode seriously? |
| 14:34 | callen | http://en.wikipedia.org/wiki/Plonk_(Usenet) |
| 14:34 | technomancy | futile: I did finally write up an overview on my adventures with other lisps: http://technomancy.us/169 |
| 14:34 | technomancy | but the answer, as always, is "it depends" |
| 14:34 | futile | technomancy: I saw that a few days after you asked someone about racket in here, was a good read |
| 14:34 | zenoli | nDuff: I'll just keep hiding in #zsh. |
| 14:35 | futile | technomancy: although I think you were too gentle and forgiving to elisp |
| 14:35 | nDuff | zenoli: ...learning habits that get you in trouble as soon as you try writing POSIX-compliant scripts? Fair 'nuff, as long as you don't ever leave that corner of the world. :) |
| 14:35 | cemerick | squidz: Yeah, though I don't think that's notable. I wasn't using their wacky HTML-in-javascript preprocessor, if that's what you're after. |
| 14:35 | technomancy | futile: it's an interesting composition of the really terrible and unsurpassingly wonderful |
| 14:36 | squidz | yeah i was wondering what parts you used |
| 14:36 | futile | :D |
| 14:36 | technomancy | juxtaposition, I should say |
| 14:36 | zenoli | nDuff: My rule-of-thumb: if you think you've written a portable shell script, you haven't. I'll take my interactive improvements and suffer the consequences happily. |
| 14:36 | squidz | cemerick: why did it work better for you in the end in comparison to angularjs? |
| 14:37 | technomancy | zenoli: rule 7 of shell scripts: solaris users will yell at you. |
| 14:37 | technomancy | there are no exceptions |
| 14:37 | futile | heh, comp and juxt used in English |
| 14:37 | nDuff | zenoli: Eh. There's "portable", and then there's "full of subtle bugs, as opposed to fail-fast ones". |
| 14:37 | cemerick | squidz: I dislike special semantics hiding in HTML's clothing. Just give me a data model, etc. |
| 14:37 | nDuff | zenoli: ...string-splitting during unquoted expansion will get you the former type. |
| 14:38 | cemerick | squidz: really, it's just the framework vs. library argument for the thousandth time. :-) |
| 14:38 | cemerick | I've heard nothing but good things about angular from people that have embraced it. *shrug* |
| 14:39 | squidz | okay I see. I haven't seen it before until you mentioned it but was trying some stuff out with angularjs and was wondering what would be a better match with clojurescript. Maybe ill give it a try and see |
| 14:40 | ro_st | squidz: http://keminglabs.com/blog/angular-cljs-weather-app/ |
| 14:40 | cemerick | squidz: lynaghk had a good post about angular + cljs a little while ago http://keminglabs.com/blog/angular-cljs-mobile-weather-app/ |
| 14:40 | cemerick | heh |
| 14:42 | muhoo | the single most annoying thing about hiccup, is that it seems un-possible to build up a vector and pass it to hiccup/html. i.e. (h/html [:p "foo] [:p "bar"]) works, but (h/html [[:p "foo"] [:p "bar"]]) does not, afaict |
| 14:42 | gdev | IMHO you should use whatever technology the business users are comfortable having their app written in |
| 14:42 | zenoli | technomancy: From my experience, I think they do that even if you haven't written a shell script. |
| 14:43 | ro_st | muhoo: what about (apply h/html [[] …])? |
| 14:43 | squidz | gdev: and if you are the only one in the project? |
| 14:43 | cemerick | I feel the phrase "business logic" coming on any second. ;-) |
| 14:43 | muhoo | ro_st: can you apply a macro? |
| 14:43 | technomancy | zenoli: hehe |
| 14:43 | ro_st | muhoo: oh. no. |
| 14:43 | gdev | squidz, i never have that problem |
| 14:43 | ToxicFrog | You can't? Ick |
| 14:44 | squidz | gdev: I wouldn't neccesarily call it a problem |
| 14:44 | muhoo | "business logic" reminds me of "military intelligence", etc |
| 14:44 | cemerick | "business logic" reminds me of PL/SQL and Oracle Reports. |
| 14:44 | muhoo | i think the word is "oxymoron" |
| 14:45 | hiredman | gdev: that is of ridiculous, right? letting problem space domain experts dictate choices to solution space domain experts? |
| 14:45 | zenoli | OK, at some point my emacs autocomplete started completing on Enter...it's horrible. I've unset C-m and \r in ac-completing-map and ac-menu-map. Where else do I need to stomp it? |
| 14:45 | hiredman | you don't tell your plubber what kind of pipes he should use |
| 14:45 | zenoli | Particularly annoying in nrepl. |
| 14:45 | hiredman | plumber |
| 14:45 | hiredman | plubber |
| 14:47 | hiredman | you are an expert on how much of a pain that leaky faucet is, so you should be able to tell your plumber what kind of gasket to use, right? |
| 14:47 | gdev | hiredman, well when your pipes are part of the porcelain you have to |
| 14:47 | cemerick | ,(apply #'dotimes nil nil '[[x 5] (println x)]) |
| 14:47 | clojurebot | (clojure.core/let [n__4340__auto__ (clojure.core/long 5)] (clojure.core/loop [x 0] (clojure.core/when (clojure.core/< x n__4340__auto__) (println x) (recur (clojure.core/unchecked-inc x))))) |
| 14:47 | cemerick | ToxicFrog: ^^ |
| 14:48 | gdev | enterprise politics, wish there was a library for dealing with that |
| 14:48 | Foxboron | So, i got a macro, and i want to assoc a value in the vector containing the args, what would be the propper way? |
| 14:49 | llasram | Foxboron: with `assoc`? |
| 14:49 | gfredericks | Foxboron: that's a little vague |
| 14:50 | Foxboron | llasram: i am unsure how to write it really. Example code would be awsome. |
| 14:50 | Foxboron | gfredericks: i know |
| 14:50 | gfredericks | Foxboron: I don't think it's obvious what you mean; could you provide an example macro call and expansion? |
| 14:50 | llasram | Foxboron: Well... how about you provide a gist showing the structure of what you want? |
| 14:50 | llasram | Yeah, what gfredericks said |
| 14:53 | hiredman | gdev: I am all for understanding the problem domain, but letting бизнес guys choose which technology they want is a horrible idea, and it is how you end up in a situation where someone can say "software is a fashion driven industry" |
| 14:53 | Foxboron | This isnt really that great of an explenation. I am just unsure how to really write the macro when i want to assoc anything into the vector before i return the list. http://hastebin.com/gakivohoqe.clj |
| 14:53 | Foxboron | i know how i want to write the bodt of the code, but it the args vector that bothers me |
| 14:54 | hiredman | the choice of software stack becomes not about solving problems but signalling in the market |
| 14:54 | Raynes | yogthos: I got a bone to pick with you. |
| 14:54 | hiredman | "we use rails, so we are cool" |
| 14:55 | llasram | Foxboron: ##(let [args '[some args]] `(defn any [~@(cons 'map args)] )) |
| 14:55 | lazybot | ⇒ (clojure.core/defn clojure.core/any [map some args]) |
| 14:55 | llasram | Foxboron: Like that? |
| 14:55 | Foxboron | llasram: awsome, yes. |
| 14:55 | yogthos | Raynes: what's up :) |
| 14:56 | yogthos | Raynes: what'd I do this time ;P |
| 14:56 | llasram | Or really: ##(let [args '[some args]] `(defn any [map ~@args] )) |
| 14:56 | lazybot | ⇒ (clojure.core/defn clojure.core/any [clojure.core/map some args]) |
| 14:56 | llasram | Oh, right |
| 14:56 | llasram | hah |
| 14:56 | gdev | hiredman, agreed. |
| 14:56 | diphtherial | um, quick question about the clojure koans; do they assume that you're following some other reference, or are you just supposed to know/experiment enough to determine the syntax? |
| 14:57 | llasram | Foxboron: So that first symbol in that context should be gensym'd, unless you really want ti to be the literal name "map" (although that is unadvisable) |
| 14:57 | nDuff | diphtherial: they expect you to be using other references. |
| 14:57 | diphtherial | nDuff: ah, heh, great :) i got as far as sequence comprehensions and realized i didn't know enough about 'for' to proceed |
| 14:57 | diphtherial | thought i was being daft, thanks |
| 14:57 | fgh | a |
| 14:57 | Raynes | yogthos: Global atoms in selmer. |
| 14:58 | Raynes | yogthos: I ought to pop you one, boy. |
| 14:58 | yogthos | Raynes: hehe oh that :) |
| 14:58 | muhoo | (map #(hiccup/html %)) ;; miserable hack |
| 14:58 | Foxboron | llasram: yes, i know. Was just unsure how to actually do the cons part :) |
| 14:58 | yogthos | mostly for configuration :) |
| 14:58 | justin_smith | technomancy: cemerick: yeah, creating a profile in my ~/.lein/profiles.clj did it cleanly, I had never really grokked profile usage before, thanks for the help |
| 14:58 | cemerick | np :-) |
| 14:58 | llasram | Foxboron: Cool beans |
| 14:58 | yogthos | I didn't really like it either, the other option would be to use a closure to initialize the renderer |
| 14:59 | Raynes | yogthos: In general though, you should really never have global atoms like this in a library. It can get bad real fast. Why not just pass in a configuration to the library? Let users give you the atoms. At that point your'e letting users have control of the state at least. |
| 14:59 | Raynes | That's what I've always done with libraries that needed atoms/state/etc. |
| 14:59 | callen | a closure would be ugly and it'd still have to be a global. |
| 14:59 | yogthos | Raynes: that's actually not a bad idea |
| 14:59 | yogthos | but I do like letting the user manage it |
| 15:00 | justin_smith | how do I programmatically access the value of a key in a profile? right now I am passing the credentials as a jvm system property while creating the uberwar, so that the uberwar can store the credentials for usage, and then providing the credentials via profiles.clj for deployment of that uberwar |
| 15:00 | diphtherial | ah, sorry for the excessive joins/parts...do people use lighttable as a main editor around here, or is it not quite there yet? |
| 15:00 | Raynes | yogthos: Perhaps you could store the atoms in metadata on something or something or something. Just some ideas. |
| 15:00 | diphtherial | if not, is there a preferred IDE? |
| 15:00 | callen | diphtherial: the most popular editor is Emacs |
| 15:01 | yogthos | Raynes: yeah for sure, I do agree it's kinda icky ;) |
| 15:01 | diphtherial | ok, makes some sense...closely followed by vim, i'm sure |
| 15:01 | callen | diphtherial: Eclipse + CounterClockWise is another popular choice as well as Vim + Fireplace. |
| 15:01 | justin_smith | it would be nice if project.clj could grab the value from the profiles.clj so that it could pass them to the aws environment config |
| 15:01 | nDuff | diphtherial: not that closely, no. |
| 15:01 | Raynes | Some people use Vim. I bounce around between Vim and Emacs when I get bored. |
| 15:01 | Raynes | nDuff: Pretty closely. |
| 15:01 | callen | diphtherial: most people use Emacs, if you don't have any strong opinions, you should as well. |
| 15:01 | nDuff | diphtherial: I'm a vim user for every other language except Java, but emacs has a big enough advantage for Clojure that it's what I use here. |
| 15:01 | diphtherial | well, i don't mean to start a debate about it, heh |
| 15:01 | diphtherial | thanks for the information |
| 15:01 | nDuff | diphtherial: http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/ |
| 15:02 | diphtherial | ah, that's helpful |
| 15:02 | llasram | Oh, time for cemerick to do another one :-) |
| 15:02 | Raynes | nDuff: That survey says that Vim is the second most used editor. |
| 15:03 | cemerick | llasram: that's what people keep saying :-| |
| 15:03 | nDuff | Raynes: ...with less than 1/3 the marketshare. |
| 15:03 | cemerick | I have no reason to believe that any of the results will be any different |
| 15:03 | Raynes | *shrug* |
| 15:03 | Raynes | Vim has gotten a lot better for Clojure in recent memory thanks to tpope. |
| 15:03 | Raynes | FWIW. |
| 15:03 | callen | but it's still a terrible editor. |
| 15:03 | Raynes | callen: Don't you use Vim? |
| 15:04 | callen | Raynes: occasionally. |
| 15:04 | nDuff | If it's getting close on nrepl and paredit support, it might be worth looking into again. |
| 15:04 | callen | Raynes: I use it for quick strikes against config files. |
| 15:04 | Raynes | nDuff: vim-fireplace uses nrepl and paredit has been there for a while now. |
| 15:04 | callen | Raynes: I check into the ecosystem occasionally and update my .vimrc as well. |
| 15:04 | nDuff | ...but I'm picky there -- couldn't tolerate the CCW or IntelliJ nrepl/paredit implementations either |
| 15:04 | callen | Raynes: that doesn't mean I think it's remotely close to Emacs in terms of usability or usefulness though. |
| 15:04 | nDuff | so not sure I want to try another not-all-there one. |
| 15:04 | Raynes | I mean, I like Emacs just as much as the next guy. |
| 15:05 | muhoo | subtle. |
| 15:05 | callen | muhoo: ? |
| 15:05 | ystael | I have a vague memory of people saying that extending protocols to interfaces is a bad idea. Can someone point me to an explanation? |
| 15:05 | technomancy | cemerick: the last State of Clojure survey still had huge slime numbers |
| 15:06 | callen | I'm still mad about losing slime/swank. |
| 15:06 | callen | just because you landlubbers didn't get your Emacs legs. |
| 15:06 | technomancy | it's still there |
| 15:06 | callen | technomancy: sorta. |
| 15:06 | technomancy | use it |
| 15:06 | tbaldridge | * gets of callen's lawn * |
| 15:07 | callen | I'd rather improve nRepl even if I'm resentful about it. |
| 15:07 | clojurebot | Gabh mo leithscéal? |
| 15:07 | cemerick | technomancy: True. Maybe we can put the nail in the coffin. |
| 15:07 | nDuff | diphtherial: if you're looking for a curated editor configuration that has everything you need out-of-the-box, you might poke at Emacs Live. https://github.com/overtone/emacs-live |
| 15:08 | technomancy | cemerick: would be cool to measure the growth even if little else has changed =) |
| 15:08 | muhoo | personally, my life is massively pleasant with nrepl and i'm very glad it exists. |
| 15:08 | futile | So anyone tried Nightcode yet? |
| 15:08 | gdev | futile, yes, i like it a lot |
| 15:08 | futile | gdev: you don't miss paredit? |
| 15:09 | futile | I thought I saw some mailing list post about a paredit plugin that fits in any editor. |
| 15:09 | futile | It'd be cool if that integrates with Nightcode |
| 15:10 | technomancy | I heard nightcode is pretty modern |
| 15:11 | muhoo | fwiw, the brutal hack to make hiccup work was (->> [[:p "foo"] [:p "bar"]] (map #(hiccup/html %)) (apply str)) |
| 15:11 | Raynes | God help you muhoo. |
| 15:11 | gdev | futile, yeah paredit and rainbow parens would be nice |
| 15:11 | Raynes | The problem with nightcode is that it's named nightcode. |
| 15:11 | gdev | futile, I'm sure that's something that could easily be added |
| 15:11 | futile | Raynes: while I don't usually care about names, I have found Nightcode difficult to type every single time I've had to. |
| 15:11 | futile | No idea why. |
| 15:12 | futile | gdev: :) |
| 15:12 | gdev | Raynes, yeah, pretty soon it'll be LightTable vs NightCode |
| 15:12 | Raynes | I highly doubt that. :) |
| 15:12 | futile | Is there something line lein-exec for clojurescript? |
| 15:12 | gdev | Light vs Night the great debate |
| 15:12 | futile | gdev: ha |
| 15:12 | mischov | Raynes: I just sing "Nightcoding nightcoding" to the tune of "Nighttiming" |
| 15:12 | technomancy | oss vs kickstarter monies |
| 15:13 | futile | maybe a better name would be "ClojureTextEditor" |
| 15:13 | gdev | technomancy, good point =o |
| 15:13 | muhoo | i stay as far away from IDE's as possible. |
| 15:13 | futile | https://github.com/sdegutis/ClojureTextEditor |
| 15:13 | technomancy | futile: that's stuartsierra's secret project, shhh |
| 15:13 | futile | ha |
| 15:13 | futile | now i need to rename that repo |
| 15:13 | futile | maybe "TextEditor4Clojure" |
| 15:14 | Raynes | Wolfhack. |
| 15:14 | stuartsierra | eh? wha? |
| 15:14 | callen | There are 143 text editors. There are no perfect text editors. I'll write a new one! There are now 144 text editors. |
| 15:14 | Raynes | Because everything cool has wolf at the beginning of it. |
| 15:14 | gdev | well my nieces are visiting next week to test out my "clojure4kidz" repl. will be interesting |
| 15:14 | futile | Owltext. |
| 15:14 | yazirian | clj-editjure |
| 15:14 | callen | stuartsierra: you were writing a text editor in Clojure. |
| 15:14 | Raynes | stuartsierra: Carry on. Nothing to see here. |
| 15:14 | stuartsierra | No I wasn't. |
| 15:15 | Raynes | yogthos: So, about that selmer. It looks pretty nice good work on it. Please don't put global atoms in lib-noir though. :P |
| 15:15 | technomancy | but if you were, that's what you'd call it, right? |
| 15:15 | callen | stuartsierra: you are now. |
| 15:15 | callen | stuartsierra: YOU DUN BEEN VOLUNTEERED |
| 15:16 | stuartsierra | clojurebot: stuartsierra |
| 15:16 | clojurebot | stuartsierra is volunteering |
| 15:16 | stuartsierra | clojurebot: forget stuartsierra is volunteering |
| 15:16 | clojurebot | Ok. |
| 15:17 | bosie | why doesn't Reduce take more than one collection? |
| 15:17 | futile | clojurebot: futile |
| 15:17 | clojurebot | Pardon? |
| 15:17 | futile | clojurebot: futile is resistance is futile |
| 15:17 | clojurebot | You don't have to tell me twice. |
| 15:17 | futile | clojurebot: futile |
| 15:17 | clojurebot | futile is resistance is futile |
| 15:17 | futile | uhh |
| 15:18 | gdev | futile, circular reference |
| 15:18 | Raynes | Head explodes. |
| 15:18 | futile | :D |
| 15:19 | stuartsierra | bosie: Probably because reduce has different implementations for different collection types; it doesn't necessarily create a sequence. |
| 15:19 | bosie | stuartsierra: hm, wouldn't that still allow me to pass more than one of the same collection type? |
| 15:20 | stuartsierra | bosie: Theoretically, if it had been implemented that way. :) |
| 15:20 | bosie | stuartsierra: k thanks |
| 15:30 | hyPiRion | clojurebot: futile is <reply>resistance is futile |
| 15:30 | clojurebot | Roger. |
| 15:30 | hyPiRion | ~futile |
| 15:30 | clojurebot | resistance is futile |
| 15:31 | TimMc | clojurebot: forget futile |is| resistance is futile |
| 15:31 | clojurebot | I forgot that futile is resistance is futile |
| 15:31 | TimMc | ~futile |
| 15:31 | clojurebot | I don't understand. |
| 15:31 | TimMc | ! |
| 15:31 | TimMc | Oh, did hyPiRion's factoid overwrite futile's? |
| 15:31 | mattmoss | Resistance is a vegetable? Fruitless... |
| 15:34 | hyPiRion | TimMc: you made it forgot everything |
| 15:35 | hyPiRion | ~futile |
| 15:35 | clojurebot | Huh? |
| 15:35 | futile | heh |
| 15:35 | mattmoss | ~derp |
| 15:35 | clojurebot | Gabh mo leithscéal? |
| 15:35 | hyPiRion | ~juxt |
| 15:35 | clojurebot | juxt is a little hard to grok but it's the best thing ever |
| 15:36 | gdev | should be able to give it a time instance so it will respond the way it knew to in that point in time |
| 15:37 | arcatan | 6 |
| 15:37 | gdev | ~futile #inst "2013-08-06T13:00:00.666" |
| 15:37 | clojurebot | excusez-moi |
| 15:40 | konr | What cool clj/functional/programming podcasts are there besides the relevance one? |
| 15:40 | shdwprince | ~test |
| 15:40 | clojurebot | ,(let [testar (fn [x y] (if (= (reduce + (filter odd? (range 0 x))) y) (str y " is an square perfect")) )] (testar 10 25)) |
| 15:41 | shdwprince | ~clojurebot |
| 15:41 | clojurebot | clojurebot is pretty cool |
| 15:41 | gdev | lol an square |
| 15:41 | shdwprince | ~shdwprince |
| 15:41 | clojurebot | I don't understand. |
| 15:41 | futile | wut |
| 15:41 | shdwprince | ~badass |
| 15:41 | clojurebot | excusez-moi |
| 15:43 | TimMc | clojurebot: futile is <reply>resistance is futile |
| 15:43 | clojurebot | 'Sea, mhuise. |
| 15:43 | TimMc | ~futile |
| 15:43 | clojurebot | resistance is futile |
| 15:43 | futile | hi |
| 15:43 | futile | i see im mentioned quite a bit lately |
| 15:43 | TimMc | Don't mind me! |
| 15:43 | futile | am i suddenly popular? |
| 15:43 | TimMc | ~resistence |
| 15:43 | futile | its the hair, isnt it |
| 15:43 | clojurebot | Huh? |
| 15:45 | shdwprince | clojurebot: shdwprince is <reply>russky paren |
| 15:45 | clojurebot | Ik begrijp |
| 15:45 | shdwprince | ~shdwprince |
| 15:45 | clojurebot | russky paren |
| 15:46 | shdwprince | I use lazybot often, but now I'll change my mind |
| 15:46 | justin_smith | clojurebot: justin_smith is <reply>☃ |
| 15:46 | clojurebot | 'Sea, mhuise. |
| 15:47 | justin_smith | ~justin_smith |
| 15:47 | clojurebot | ☃ |
| 15:47 | justin_smith | cool tricks |
| 15:47 | kmicu | -> /query BOT in private buffer |
| 15:47 | yogthos | Raynes: thanks, and yeah I actually want to pull out some globals from lib-noir :) |
| 15:47 | Raynes | yogthos: There are globals in lib-noir? |
| 15:47 | Raynes | o.o |
| 15:47 | yogthos | Raynes: yeah sessions and cookies :) |
| 15:47 | Raynes | Oh, that's different. |
| 15:48 | Raynes | They aren't global atoms. They get bound to atoms within a scope. |
| 15:48 | Raynes | I'm okay with that for these purposes. |
| 15:48 | Raynes | But by all means, if you can get rid of them then... |
| 15:48 | yogthos | Raynes: I haven't thought of a good way around that yet :) |
| 15:53 | gdev | how many template libraries are there now? |
| 15:54 | srruby | How do I turn [:key1 "val1" :key2 "val2"] into a hash map ? |
| 15:54 | nDuff | ,(into {} (partition 2 [:key1 "val1" :key2 "val2"]) |
| 15:54 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 15:54 | nDuff | ,(into {} (partition 2 [:key1 "val1" :key2 "val2"])) |
| 15:54 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.util.Map$Entry> |
| 15:55 | srruby | Thanks!! |
| 15:55 | akhudek | ,(apply hash-map [:key1 "val1" :key2 "val2"]) |
| 15:55 | clojurebot | {:key2 "val2", :key1 "val1"} |
| 15:56 | arohner | ,(into {} (map vec (partition 2 [:key1 "val1" :key2 "val2"]))) |
| 15:56 | clojurebot | {:key1 "val1", :key2 "val2"} |
| 15:56 | arohner | I'd use apply hash-map |
| 15:57 | srruby | arohner: Thanks |
| 16:21 | wei | how would you write this fn summarize: (summarize [{:from "A" :to "B" :amount 3} {:from "B" :to "A" :amount 1}]) => {:from "A" :to "B" :amount 2} |
| 16:21 | wei | i came up with an ugly solution but #clojure is always full of elegant ones |
| 16:25 | Raynes | I can't really tell what that function is doing. |
| 16:26 | Raynes | My preliminary example is (fn [& _] {:from "A" :to "B" :amount 2}) given my current information. |
| 16:26 | noprompt | :) |
| 16:26 | Raynes | noprompt: Hi! |
| 16:26 | Raynes | noprompt: Wanna go to a concert in Santa Barbara on the 18th? |
| 16:26 | noprompt | it looks like he's trying to do something with a graph afaict |
| 16:26 | yogthos | so something like this? |
| 16:27 | hyPiRion | wei: how do you end up with 2 |
| 16:27 | yogthos | (let [[[from x] [to y]] |
| 16:27 | yogthos | (->> [{:from "A" :to "B" :amount 3} {:from "B" :to "A" :amount 1}] |
| 16:27 | yogthos | (group-by :from) |
| 16:27 | yogthos | (map (fn [[k v]] [k (reduce + (map :amount v))])))] |
| 16:27 | yogthos | {:from from :to to :amount (- x y)}) |
| 16:27 | mischov | refffheap |
| 16:27 | noprompt | Raynes: a concert? |
| 16:27 | Raynes | noprompt: http://www.stubhub.com/panic-at-the-disco-tickets/panic--at-the-disco-santa-barbara-velvet-jones-8-20-2013-4323247/ |
| 16:27 | Raynes | Huh, the 20th. |
| 16:27 | yogthos | hehe yeah should've :P |
| 16:27 | Raynes | Okay, the 20th noprompt, not the 18th. |
| 16:28 | shdwprince | I thought santa barbara was a tv series from 90x |
| 16:28 | noprompt | Raynes: i'm moving in to my new house on the 19th :( |
| 16:28 | Raynes | Where at? |
| 16:28 | shdwprince | oh, in |
| 16:28 | shdwprince | lol |
| 16:28 | noprompt | Raynes: still here in sunny fresno. |
| 16:28 | Raynes | noprompt: Well you suck etc etc. |
| 16:28 | hyPiRion | noprompt: that's great, isn't it? Then you can celebrate with Raynes the 20th :D |
| 16:29 | noprompt | Raynes: i got me a orange and a lime tree on a 1/3 of acre lot. |
| 16:29 | chrisrossi | where does leiningen download jars to? |
| 16:29 | Raynes | ~/.m2 |
| 16:29 | hyPiRion | chrisrossi: ~/.m2 |
| 16:29 | clojurebot | I don't understand. |
| 16:29 | Raynes | noprompt: Live a little man. |
| 16:29 | Raynes | It's only a holy shit that's a long drive. |
| 16:29 | chrisrossi | that explains why i couldn't find it. ;) never woulda guessed. thanks! |
| 16:29 | Raynes | Still shorter than visiting me in LA. |
| 16:29 | noprompt | Raynes: i know dude. this summer did not go the way i planned. buying a home is such a pita. |
| 16:30 | Raynes | chrisrossi: Leiningen doesn't put them there though, the underlying maven stuff does. |
| 16:30 | chrisrossi | ah, gotcha. |
| 16:30 | Raynes | noprompt: That's why you shouldn't have bought a house. |
| 16:30 | chrisrossi | onion. |
| 16:30 | Raynes | Silly. |
| 16:30 | Raynes | chrisrossi: Bell pepper. |
| 16:30 | wei | hiPiRion: A pays B 3, B pays A 1, so the equivalent transaction is A pays B 2 |
| 16:30 | noprompt | Raynes: lol, i know! |
| 16:31 | chrisrossi | I was referring to layers. (lein -> maven -> turtles ...) ;) |
| 16:31 | Raynes | noprompt: Well, I forgive you. |
| 16:31 | noprompt | Raynes: i'm planning to take some time off soon though, i still wanna come down and visit. |
| 16:31 | hyPiRion | clojurebot: /.m2 is <reply>~/.m2 is where Leiningen puts its local repository. |
| 16:31 | clojurebot | Ack. Ack. |
| 16:31 | wei | bonus points if you can keep the amount positive in the summary |
| 16:31 | hyPiRion | And yes Raynes, it's technically wrong as it is maven which does that |
| 16:32 | technomancy | ahem... aether |
| 16:32 | Raynes | hyPiRion: It's okay. |
| 16:32 | Raynes | technomancy: Gtfo hipster. |
| 16:33 | xeqi | eh, theres a flag to override it in pomegranate, so its lein's fault |
| 16:33 | aaelony | what do people recommend when you need a function that takes variadic arguments but needs a let statement that is almost identical regardless of whether it is invoked with 2 args or 3 args… example: (defn foo ([a b c] (let […] …)) ([a b] (let […] …)) ) ? |
| 16:33 | noprompt | Raynes: just fyi, the reason i haven't been here the past couple months is that i was working with an intern everyday during that time. |
| 16:33 | wei | (inc yogthos) |
| 16:33 | lazybot | ⇒ 1 |
| 16:33 | Raynes | noprompt: Nice. |
| 16:33 | noprompt | i had #clojure withdrawals for a while. |
| 16:33 | yogthos | w00t |
| 16:33 | hyPiRion | aaelony: I just do (foo a b default-value-for-c) ? |
| 16:34 | hyPiRion | but it depends on the work done within the function I guess. |
| 16:34 | aaelony | hyPiRion: I could do that. The let statement is a couple lines long, but not too unwieldy... |
| 16:34 | Raynes | noprompt: http://www.youtube.com/watch?v=LUc_jXBD9DU What you're missing by not going to this concert though. |
| 16:35 | noprompt | Raynes: the most living i've done this summer is watching battlestar galactica from start to finish lol. |
| 16:35 | aaelony | hyPiRion: actually, I like that approach.. thanks :) |
| 16:36 | hyPiRion | aaelony: np |
| 16:38 | noprompt | Raynes: if you and callen can't decide who drives up/down you guys could always meet in the middle at my house now haha. |
| 16:38 | Raynes | noprompt: callen already visited me. |
| 16:39 | Raynes | You're the odd man out now. |
| 16:39 | Raynes | :p |
| 16:39 | noprompt | Raynes: i was thinking i might've been able to come down this week since my family is visiting my sister in the OC, but i can't find a dog sitter. |
| 16:40 | Raynes | Awww doggie. |
| 16:40 | Raynes | Now I want to drive to Fresno and pet the dog. |
| 16:40 | Raynes | :( |
| 16:40 | noprompt | yeah. here name is ruby lol. |
| 16:40 | noprompt | *her |
| 16:40 | Jasoncof | Hello, is there a function that will rename keys of a map by the return value of a function that accepts the key as an argument? |
| 16:41 | noprompt | funny thing is i didn't name her that. |
| 16:41 | Raynes | Jasoncof: clojure.set/rename-keys |
| 16:41 | Raynes | Kind of. |
| 16:41 | dnolen | Jasoncof: you can combine Raynes' suggestion with reify |
| 16:42 | Jasoncof | Raynes: does that accept a function? It seems like it only accepts another map. |
| 16:42 | hyPiRion | Jasoncof: Closest would be (into {} (for [[k v] the-map] [(f k) v])) where f is the function |
| 16:42 | Raynes | dnolen: Whoa, you be talking magic. |
| 16:42 | noprompt | Raynes: oh what? i didn't know that was there. |
| 16:42 | Raynes | noprompt: I'm an encyclopedia of shit you didn't know Clojure had, bro. |
| 16:42 | noprompt | i actually wrote that function by hand :( |
| 16:42 | dnolen | (defn foo [f] (reify ILookup ...)) |
| 16:42 | noprompt | time for some ------ action |
| 16:42 | Jasoncof | hyPiRion: thank you, I will give that a shot |
| 16:43 | Raynes | dnolen: I'd have never thought of that. |
| 16:43 | Raynes | That's pretty darn cool. |
| 16:43 | yogthos | yeah that's slick |
| 16:44 | hyPiRion | Hmm, it would be interesting to see if you could make a function which takes a function and returns an ILookup. |
| 16:44 | gfredericks | clojurebot: Raynes is an encyclopedia of shit you didn't know Clojure had, bro |
| 16:44 | clojurebot | Ack. Ack. |
| 16:44 | ztellman | unfortunately that doesn't implement the whole host of other things that a map needs to be a map |
| 16:45 | ztellman | that would have a different hash, probably not equal an equivalent map, etc. etc. |
| 16:45 | ztellman | you'd need to make sure you don't pass that into code where people are actually expecting a map |
| 16:45 | hyPiRion | ztellman: And iterating over/seqing it is not going to work. |
| 16:45 | ztellman | and invoking it as a function won't work |
| 16:45 | ztellman | you need to use get |
| 16:46 | ztellman | bare minimum you need to create a map-like object: https://github.com/ztellman/potemkin/blob/master/src/potemkin/collections.clj#L21-L164 |
| 16:46 | dnolen | ztellman: implement IFn, ILookup is usually good enough in IME for many use cases no need to bother with all the other crap |
| 16:47 | ztellman | dnolen: not disagreeing, but that's only true if only your code touches it |
| 16:47 | ztellman | who knows what other people are expecting |
| 16:47 | ztellman | non-equal hash codes, for instance, could cause insanely hard to debug situations |
| 16:47 | supersym | strap on yer armor |
| 16:47 | supersym | defensive programming ftw :P |
| 16:48 | dnolen | ztellman: no argument, this is a bit of code golf :) |
| 16:48 | ztellman | dnolen: understood, and it's an undeniably nice round of golf :) |
| 16:48 | tbaldridge | more correctly, people should just stop calling things maps that aren't IPersistentHashMaps, we should be using "will return a fn that implements ILookup" or something of that nature |
| 16:49 | noprompt | code horse. |
| 16:49 | noprompt | :P |
| 16:49 | dnolen | fn->ILookup |
| 16:50 | ztellman | tbaldridge: that would have been a great standard to have instituted years ago, I think most people conflate being able to call 'get' with all other IPersistentCollection stuff |
| 16:50 | ztellman | or IPersistentMap/Set, at least |
| 16:50 | ztellman | I certainly do, anwyay |
| 16:51 | tbaldridge | yeah, I did as well, until I implemented my first ILookup then I changed :-P |
| 16:51 | ztellman | haha, I just wrote this: https://github.com/ztellman/potemkin/blob/master/src/potemkin/collections.clj#L214 |
| 16:52 | ztellman | and all the other borderline awful stuff in that namespace |
| 16:52 | Raynes | ztellman is the encyclopedia of doing horrible things with map interfaces. :p |
| 16:52 | tbaldridge | To be honest though, we can't rail against the gigantic Java interfaces, and then go and say "a map must implement these 20 things...." </rant> |
| 16:52 | nDuff | ztellman: nitpick: "be have" -> "behave" |
| 16:52 | Raynes | Not that it's his fault it's so convoluted to map something that looks and tastes like a map, but is more like a GPS device. |
| 16:52 | ztellman | nDuff: ha, thanks, I'll fix that |
| 16:53 | ztellman | tbaldrige: I dunno, it's pretty easy to distill maps down to get/assoc/dissoc/keys |
| 16:53 | ztellman | tbaldridge, rather |
| 16:53 | futile | Who has interesting Clojure blogs these days? |
| 16:53 | stompyj | planetclojure |
| 16:53 | ztellman | it would also be way easier if we could use APersistentMap |
| 16:53 | ztellman | rather than having to reimplement it each time |
| 16:53 | stompyj | sorry http://planet.clojure.in/ |
| 16:54 | stompyj | super solid aggregation |
| 16:58 | dnolen | ztellman: yeah I think the Java interfaces muddy the waters - in CLJS it's much clearer that protocols like ILookup are meant to be a la carte. |
| 16:59 | hiredman | ztellman: apm should be broken up in to static methods (functions) as a library for concrete implementations to use |
| 17:00 | ztellman | hiredman: then you still need to implement the umpteen different functions yourself |
| 17:00 | hiredman | ztellman: fortunately we have macros that make that sort of thing easy |
| 17:00 | ztellman | in the code I linked I use macroexpansion to handle the 21 different arities of IFn and the case statement in applyTo |
| 17:00 | hiredman | sure |
| 17:00 | ztellman | hiredman: agreed, but some sort of abstract type would be nice all the same |
| 17:01 | dnolen | ztellman: IFn is the definitely the place where it feels like an abomination, I've contemplating monkey patching JS Function native more than once |
| 17:01 | ztellman | I mean, I wrote my own, so that scratches my itch, but something that has the official imprimatur would be way better |
| 17:02 | hiredman | reusing implementation doesn't and shouldn't require inheritance |
| 17:03 | ztellman | hiredman: under the covers it's just merging maps of functions |
| 17:03 | hiredman | sure |
| 17:03 | ztellman | so there's no diamond anything to worry about |
| 17:04 | hiredman | but in the java code base you end up using abstract classes like apm for that |
| 17:17 | solussd | does clojurescript not have defstruct? |
| 17:18 | dnolen | solussd: it does not |
| 17:18 | shdwprince | solussd: humm.. clojure on jvm have not too |
| 17:18 | dnolen | solussd: but defstruct has been deprecated for some time now |
| 17:18 | solussd | dnolen: i wasnt aware that it was actually deprecated. thanks |
| 17:19 | solussd | hrm.. if it's deprecated, shouldnt that be in the metadata or docstring? |
| 17:20 | solussd | sometimes I want something that really is a persistentmap and has its keys declared somewhere |
| 17:20 | hyPiRion | solussd: records?? |
| 17:20 | lazybot | hyPiRion: Uh, no. Why would you even ask? |
| 17:20 | hyPiRion | ugh, double question marks |
| 17:21 | solussd | hyPiRion: records arent persistentmaps and don't play well with walk |
| 17:22 | stuartsierra | solussd: I have a fix for walk, see github.com/stuartsierra/clojure.walk2 and tickets on JIRA. |
| 17:22 | futile | I bet Clojure is great for static analysis. |
| 17:22 | solussd | stuartsierra: I've been watching that ticket for awhile now, thanks |
| 17:23 | shdwprince | How to handle cyclic dependency in clojure? require or in-ns && declare seems to work properly only in repl |
| 17:23 | nDuff | futile: played with Typed Clojure? |
| 17:23 | futile | Never. |
| 17:23 | futile | is it great? |
| 17:23 | futile | nDuff: hey weren't you in #python? |
| 17:23 | solussd | I 'patched up' the cond in walk, but still, i liked having create-struct/defstruct because of what it is |
| 17:23 | nDuff | futile: Were and am. |
| 17:23 | futile | oh |
| 17:23 | hyPiRion | I've done some static analysis, but I'm tempted to jump that stuff over to OCaml actually. |
| 17:24 | futile | ocaml? i heard something was written in that.. maybe E |
| 17:24 | futile | yeah E lang |
| 17:24 | hyPiRion | But it's heavily dependent on the problem domain, to be fair. |
| 17:25 | hyPiRion | FFTW uses it for analysis and code generation as well |
| 17:25 | stuartsierra | shdwprince: You can't have cyclic dependencies between 2 namespaces in Clojure. |
| 17:25 | onr | futile: haxe |
| 17:26 | onr | and probably much more |
| 17:27 | shdwprince | stuartsierra: not with ns's, but in function |
| 17:27 | shdwprince | (resolve) do the job |
| 17:28 | shdwprince | but i'll think about project architecture |
| 17:28 | hyPiRion | shdwprince: (declare func-2) (defn func-1 (something with func-2)) (defn func-2 (something with func-1)) |
| 17:29 | shdwprince | hyPiRion: dont work with vars in another namespace |
| 17:29 | stuartsierra | shdwprince: That implies a cyclic dependency between namespaces. |
| 17:30 | hiredman | ,(doc intern) |
| 17:30 | clojurebot | "([ns name] [ns name val]); Finds or creates a var named by the symbol name in the namespace ns (which can be a symbol or a namespace), setting its root binding to val if supplied. The namespace must exist. The var will adopt any metadata from the name symbol. Returns the var." |
| 17:30 | hiredman | ,(doc create-ns) |
| 17:30 | clojurebot | "([sym]); Create a new namespace named by the symbol if one doesn't already exist, returns it or the already-existing namespace of the same name." |
| 17:31 | shdwprince | hiredman: thanks, but i'll stay with (resolve) |
| 17:31 | hiredman | https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L6884-6917 go nuts |
| 17:33 | hiredman | resolve (the name is a big hint) involves the cost of var resultion everytime, if you are going to do something kind of gross, at least do it in a performant way |
| 17:40 | futile | What do you do when your trusted colleague mentions that he finds it frustrating that the Mac OS X menu bar (and OS X in general) has so many processes running all the time, and that he thinks a good solution would be to have a background job start and stop them every few seconds instead? |
| 17:40 | eckse | you can't get much 'simpler' than a mac |
| 17:40 | technomancy | futile: recommend gentoo |
| 17:41 | eckse | perhaps he should write his own os? |
| 17:41 | eckse | *mac user |
| 17:41 | eckse | :3 |
| 17:42 | eckse | sadbox: :| |
| 17:42 | futile | I think I said it wrong. He says he's bothered that he has so many processes running (citing all the ones with a task bar icon, presumably like Dropbox and Gmail) and wants them spun up 'on demand'. Is this a reasonable thing to be bothered by? |
| 17:43 | eckse | but then they're not collecting your data |
| 17:44 | eckse | isn't that the true purpose of processes? |
| 17:44 | eckse | :| |
| 17:44 | bts- | is it still generally advised not to use core.async in production yet? or is it just that the interface is going to change a bit |
| 17:44 | solussd | futile: well, if the app isn't doing anything it'll get 'swapped out' and is effectively not using any memory or cpu resources. starting and stopping an app every few seconds just to see if it needs to do anything is ridiculous. |
| 17:45 | solussd | bts-: just do it. :D |
| 17:45 | futile | solussd: okay that's what I thought too |
| 17:45 | futile | Thanks for the sanity check. |
| 17:45 | bts- | solussd: that's what I'm leaning towards :) |
| 17:45 | solussd | it's too much fun not to |
| 18:03 | zilti | What are the currently available clojurescript testing frameworks? I tried specljs (seems to be uncompleted and broken) and cemerick/clojurescript.test (outdated?). |
| 18:05 | dnolen | zilti: that's it really I think, I don't think cemerick's lib is outdated |
| 18:18 | timvisher | anyone know if it's possible to control the canvas size of a chart in incanter? |
| 18:19 | timvisher | (view :width … :height …) isn't quite what I want as it seems to scale things almost exactly like it would if I had started with as smaller chart and simply expanded the window |
| 18:19 | timvisher | I'm trying to actually make the chart larger |
| 18:21 | zilti | Argh, that whole cljs testing stuff is totally broken... |
| 18:21 | xicubed | zilti: kerodon? |
| 18:22 | zilti | kerodon? |
| 18:22 | xicubed | https://github.com/xequ/kerodon |
| 18:22 | zilti | That does not even exist |
| 18:22 | xicubed | whoops https://github.com/xeqi/kerodon |
| 18:23 | zilti | No, I mean clojurescript testing, not ring testing |
| 18:24 | zilti | I now spent almost 2 hours trying to set up either clojurescript.test or specljs together with cljsbuild test, and all I get are error messages |
| 18:25 | atyz | I'm trying to do an integration test of some routes in pedestal using: (response-for service :post "/accounts" :json-params {"account" {"name" "sonata00"}}), it is not allowing me to post this. any ideas? |
| 18:27 | zilti | I mean, aren't people testing their clojurescript code? |
| 18:41 | dnolen | zilti: I think people probably were testing the same way the CLJS tests were done, just a function w/ many asserts |
| 18:50 | clojure-newb | hi if I wanted to ping 30 something ips in parallel so that I know the results of all the pings in roughly the timeout time (5 secs). How would I do it in clojure? Do I need to use an atom? |
| 18:51 | justin_smith | clojure-newb: https://github.com/neotyk/http.async.client |
| 18:51 | justin_smith | I think - maybe not for pings come to think of it |
| 18:52 | justin_smith | you could create an agent or future for each ping, and test all the status after the timeout passes |
| 18:52 | noonian | you could do something that returns a sequence of futures, and then deref the futures for the individual values |
| 18:53 | justin_smith | yeah, futures |
| 18:53 | lgs32a | is there a certain guideline when i should use reducers? most of my performance test (especially with collections where i don't need order) favor the clasical map or pmap |
| 18:53 | noonian | hmm, could return a single future that derefs all the other futures :P |
| 18:54 | clojure-newb | Could i have an agent or something that kept the status of all the ips and modify it in parallel? |
| 18:55 | justin_smith | clojure-newb: with futures, it would execute them in parallel, giving you a handle, when you deref the handle it hands you the result (if the future is ready - there is a function that tests if a future is realized) |
| 18:56 | noonian | could have an atom like (atom {"ip1" "status1", "ip2" "status2" ...}) and have each future update the atom associng the returned status |
| 18:56 | clojure-newb | I will try that thank you both |
| 18:57 | gtrak | or a map of futures.. |
| 18:57 | justin_smith | or (map #(future (ping %)) (ip-list)) |
| 18:57 | gtrak | why make it more complicated with an atom? |
| 18:58 | cemerick | zilti: outdated? |
| 18:58 | noonian | derefing the atom will never block, so its easier to query the current statuses without worrying about blocking, idk it probably depends on your use case |
| 18:58 | justin_smith | noonian: (map deref (filter realized? futures)) |
| 18:59 | zilti | cemerick: I noticed that there were some new commits. Well, I won't touch any clojurescript testing frameworks for the next weeks, I wasted too much time on it already. |
| 18:59 | clojure-newb | could i have futures that conj to an atom then add a watch to the atom that checks for the count or is mapping deref better? |
| 18:59 | noonian | justin_smith: thanks, I haven't used futures much |
| 19:00 | clojure-newb | mapping realized?* |
| 19:00 | gtrak | you could.. but why not just treat futures as values instead of side-effects? |
| 19:00 | cemerick | zilti: is it that the last release was 3 months ago that's throwing you off? |
| 19:00 | clojure-newb | ok ty all |
| 19:00 | zilti | cemerick: I had that issue that it used an older clojurescript version, but I solved that using :exclusions |
| 19:01 | cemerick | oh my |
| 19:01 | zilti | 3 months isn't unusual at all, I'm using libs here which are much "older" |
| 19:01 | justin_smith | clojure-newb: mapping deref - deref gets the value from the future, realized? checks if the process is done calculating |
| 19:02 | clojure-newb | kk |
| 19:02 | justin_smith | you often don't want to deref a future that is not done yet |
| 19:02 | noonian | clojure-newb: yeah if you forced evaluation on mapping deref it would block on the values that hadn't been realized yet |
| 19:02 | gtrak | you could loop the seq in passes, separating realized futures from unrealized ones |
| 19:02 | justin_smith | also, there is future-cancel "cancels the future if possible" which is a beautiful concept if you forget the context |
| 19:04 | clojure-newb | could i have a (while (not (every? realized? futures)).. ? |
| 19:04 | justin_smith | sure |
| 19:05 | justin_smith | but if you just want to wait for all of them, just (map deref futures) |
| 19:05 | justin_smith | that will block on each unrealized one until it is realized |
| 19:05 | clojure-newb | ok |
| 19:05 | ztellman | or use http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorCompletionService.html |
| 19:06 | clojure-newb | :-o |
| 19:06 | noonian | (map deref futures) should return a lazy seq so it shouldn't actually block until you look at it |
| 19:06 | justin_smith | noonian: good point |
| 19:06 | ztellman | unless you really, really care about doing it in order of completion, though, use (doall (map deref futures)) |
| 19:08 | clojure-newb | I don't care about order |
| 19:20 | technomancy | anarchist? |
| 19:21 | Raynes | technomancy: An antisocial anarchist that sounds like so and so. They say I'm just a stupid kid. Another crazy radical. Rock n roll is dead, I probably should have stayed in school. Another generation x who somehow fell in through the cracks. They'd love to see me fall but I'm already on my back. |
| 19:21 | technomancy | Raynes: what, so you don't care about order either? |
| 19:22 | technomancy | I have proof that could ruin your street cred: https://github.com/flatland/ordered/graphs/contributors |
| 19:22 | Raynes | Bahahaha |
| 19:23 | technomancy | there you have it. Raynes is "pretty okay" with the establishment. |
| 19:25 | hyPiRion | Raynes: The school/college/university system over in the US of A sounds expensive |
| 19:25 | Raynes | hyPiRion: I wouldn't know. |
| 19:26 | Foxboron | So, i wrote a clojure version of the hackernews hated VerbalExpressions lib: https://github.com/Foxboron/ClojureVerbalExpressions writing tests atm and comments on the code would be awsome. |
| 19:28 | justin_smith | Foxboron: first example, where is the www coming from in the source of the tester? is that a typo? |
| 19:28 | Foxboron | justin_smith: that is actually a typo. |
| 19:29 | Foxboron | well, yes and no. I copied the example from the python version and i somehow left out 2 functions |
| 19:29 | hyPiRion | Raynes: I just felt like responding to "I probably should have stayed in school" by hinting to the fact that it's expensive in the US. Don't mind me. |
| 19:29 | Raynes | hyPiRion: You know that those are song lyrics, right? |
| 19:29 | Raynes | I've got song lyrics for everything. |
| 19:30 | hyPiRion | Raynes: No, I thought you were awesome and made it up on the fly. |
| 19:30 | hyPiRion | Thanks for crushing my dreams. |
| 19:30 | hyPiRion | :( |
| 19:30 | Raynes | hyPiRion: http://www.youtube.com/watch?v=DPgWNuUkuA8 |
| 19:30 | Foxboron | justin_smith: fixed. |
| 19:31 | hyPiRion | Raynes: "This video is unavailable." ahah, region blocks |
| 19:31 | Raynes | Evil. |
| 19:31 | hyPiRion | I'll look it up on Spotify instead |
| 19:38 | Raynes | hyPiRion: I was gonna mirror it for you, but they've changed bloody encryption signatures 6 bazillion times in the last two months. |
| 19:38 | Raynes | So yeah, spotify may be your best bet. |
| 19:42 | hyPiRion | Raynes: I just found another vid, so no worries anyway |
| 20:00 | hyPiRion | Ugh, so I need to reify a class with a single method: meta. To make matters worse, that method takes one argument. How would I handle that? |
| 20:01 | hyPiRion | (http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MetaEventListener.html for reference) |
| 20:01 | hiredman | use deftype |
| 20:02 | hiredman | I think, I'm not sure what deftype implements "for you", but I think it may be nothing |
| 20:02 | hyPiRion | hiredman: I'll have a stab at it anyway |
| 20:03 | Bronsa | deftype doesn't implement IObj, only reify/defrecord do |
| 20:04 | justin_smith | hyPiRion: helpful flow chart I saw on this channel from cemerick about deciding on interop style http://chasemerick.files.wordpress.com/2011/07/choosingtypeforms2.png |
| 20:04 | gfredericks | afaik the main restrictions are some munged reserved field names? |
| 20:09 | hyPiRion | Well, it seems like I just forgot to add in `this` in the call. |
| 20:31 | futile | Is it insane to say my next project will be "my perfect text editor"? |
| 20:31 | futile | Okay scratch that, perfect is a moving target. |
| 20:32 | futile | Is it insane to say my next project will be "a usable text editor"? |
| 20:36 | robink | I have a hashmap (generated from JSON) that is still using strings as keys. The keys are static and the string contents are keyword-compatible. Is there a single-call way to turn all string keys into keywords w/o having to reassociate the values as well? |
| 20:37 | hiredman | most clojure json libraries will do that for you |
| 20:37 | robink | I'm happy even to feed in a {"stringkey" :stringkey "stringotherkey" :stringotherkey} map as a hint. |
| 20:37 | robink | hiredman: Ah, OK, I'm probably just misusing data.json. |
| 20:38 | hiredman | consider cheshire https://github.com/dakrone/cheshire |
| 20:40 | robink | hiredman: It looks like you pass clojure.data.json/read-str a function that gets mapped over all of the keys, so you can transform them to keywords via clojure.core/keyword. |
| 20:40 | robink | hiredman: but yeah, I'll look at Cheshire. |
| 20:45 | robink | Heh, you just pass 'true' to Cheshire (it accepts a key transform function too, but true is synonymous for 'keyword', apparently). |
| 20:54 | muhoo | another friend question: default-unauthentcated-handler, which is supposed to redirect to unauthorized-url, isn't. |
| 20:54 | muhoo | it always goes back to / |
| 20:54 | muhoo | afaict it's never getting added to the :session |
| 20:54 | muhoo | (this with login form workflow) |
| 20:59 | robink | Is there a Clojure HTTP client that will negotiate for a certificate with the same CN as the HTTP Host: when connecting via https? |
| 21:00 | robink | clj-http just asks for whatever the default certificate is, and since I'm serving multiple certs, it ends up being given the wrong one and throws a certificate mismatch error. |
| 21:00 | muhoo | robink: i'm pretty sure you can customize clj-http to do that |
| 21:00 | muhoo | it's apache under the hood IIRC |
| 21:01 | robink | muhoo: and I started in on the Apache HTTP client docs and still couldn't find an easy way of having it try to request a cert with the same CN as the host you're connecting to, or at least override it manually. |
| 21:08 | patchwork | Using pantomime to get a content type given a file extension… how do I go in reverse? |
| 21:08 | patchwork | Get a file extension given a content type |
| 21:13 | noto2 | patchwork: you mean jpg/jpeg for a photo, for example? |
| 21:14 | TEttinger | there isn't always the same nice mapping of file extensions to mime types, I would think |
| 21:15 | muhoo | robink: i've done it, in java, on android. it sucked, but it was possible |
| 21:15 | robink | muhoo: Hm :( |
| 21:16 | muhoo | clj-http uses the same underlying apache lib, again, memory is hazy |
| 21:16 | justin_smith | TEttinger this is the reverse mapping |
| 21:16 | justin_smith | so given image/jpeg he wants .jpg |
| 21:16 | TEttinger | or .jpeg I mean |
| 21:17 | TEttinger | there is a range of possibilities for each mime type |
| 21:17 | justin_smith | yeah |
| 21:17 | muhoo | robink: it was some stupid FactoryHelperSingleton thing |
| 21:17 | justin_smith | but one of them should suffice |
| 21:17 | robink | muhoo: Aha |
| 21:18 | muhoo | and you pass it in, and you have your custom logic in there to do client side verificafion |
| 21:19 | futile | technomancy: partly inspired by your lispology post, I wrote this: https://gist.github.com/sdegutis/6168999 |
| 21:22 | robink | muhoo: Seems like it also might be possible to fix in :client-params. |
| 21:35 | robink | Heck, I can't figure out how to make Java's SSL support request a particular CN for a SSL/TLS connection. |
| 21:46 | callen | "aphyr: @ztellman @cemerick @planetclojure DECOMPLECT YOUR CODE, DECOMPLECT YOUR LIFE. http://t.co/DEWDVx63nC" |
| 21:54 | cemerick | robink: if you're doing HTTP, you're almost surely better off using clj-http (a.k.a. apache http clients) |
| 21:55 | kristof | Hi! Quick question: in typed clojure, there is no type inference, right? What's to stop someone from doing type inference on only a single block of code or a function? |
| 22:20 | muhoo | nb, fixed friend. one may not put wrap-anti-forgery after friend/authenticate, otherwise Bad Things Happen |
| 22:21 | muhoo | so (-> routes wrap-resource wrap-file-info wrap-anti-forgery handler/site) appears to be the win |
| 22:22 | muhoo | sorry (-> routes wrap-resource wrap-file-info wrap-anti-forgery authenticate handler/site) |
| 22:22 | muhoo | one goat sacrificed. |
| 22:22 | muhoo | poor goat. |
| 22:25 | justin_smith | I wonder if deploys to production will ever stop feeling like I am walking on the edge of a very steep drop |
| 22:37 | hlprmnky | justin_smith: In my experience, no. There's always that chance, no matter how slim, that it will end up all on fire. :| |
| 22:43 | hlprmnky | so here's a question: I'm trying to teach myself Luminus, and I got to the default test/project/test/handler.clj which tests the routes. Is it really the case that the best practice for testing a route's content is (is (= (:body response) [a ginormous blob of hand-coded HTML]))? |
| 22:44 | hlprmnky | I mean, I can see how I might go about building an object that had the desired response content for a given route input and then asking (is (= (:body response) (:expected response)) but I'm surprised that isn't always already the way to do it, and so I dimly suspect that I might have Missed Something™ |
| 22:45 | justin_smith | hlprmnky: I usually check the status is of the response, the headers, and maybe a regex on the body |
| 22:45 | pandeiro | i am trying to realize a lazyseq for spitting purposes and having no luck with the obvious doall solution... what else can i do? |
| 22:45 | justin_smith | which is enough to catch 500 / 404 / random controller problems mostly |
| 22:45 | hlprmnky | right |
| 22:46 | pandeiro | i want to do (spit file (clojure.string/join "\n" lazy-lines-seq)) |
| 22:46 | hlprmnky | hm - I wonder if what I really want to be doing is something more like build a DOM object from the response and then ask it if it has all the parts I expect the response to have |
| 22:47 | hlprmnky | I just see that pile of HTML and think "hey, there's a test failure I will not see until 3am some Wednesday, just waiting for me" |
| 22:47 | justin_smith | you could destructure the html into a datastructure and check for some of the basic shape / features you want |
| 22:48 | justin_smith | better yet, make the controller take a "render" argument, which is the rendering function, and then pass in identity when testing |
| 22:49 | justin_smith | pandeiro: how are you using doall to force it? |
| 22:49 | TEttinger | pandeiro: (spit file (clojure.string/join "\n" (vec lazy-lines-seq))) |
| 22:50 | justin_smith | yeah, that is what I would try if doall was being used properly and did not make it fully realize |
| 22:50 | pandeiro | TEttinger: i'm sure i tried that but i think somewhere my lazyseq is getting cast to string before |
| 22:51 | justin_smith | string/join does not expect a string, it expects a collection |
| 22:51 | TEttinger | strings are kinda collections |
| 22:51 | TEttinger | but not how you'd prefer |
| 22:53 | pandeiro | oh damn. ok nvm. |
| 22:53 | pandeiro | thanks |
| 22:53 | TEttinger | pandeiro, there's a way to do it though |
| 22:54 | TEttinger | what kind of string is it becoming? |
| 22:54 | pandeiro | TEttinger: my code was fine, i was calling the processing fn twice |
| 22:54 | pandeiro | :-/ |
| 22:54 | pandeiro | it's late |
| 22:54 | TEttinger | oh heh |
| 22:54 | pandeiro | yyyeah |
| 22:54 | TEttinger | yeah, I'm actually having a similar issue myself |
| 22:55 | TEttinger | except in reverse :| |
| 22:55 | pandeiro | i think i really need to learn awk for this stuff |
| 22:55 | TEttinger | I have a function that operates on arrays, and repeated applications don't do anything |
| 22:55 | TEttinger | clojure's great for string processing |
| 22:56 | TEttinger | java has potent regexes |
| 22:56 | pandeiro | yeah, it is... but it's not great for one-off scripts imo |
| 22:56 | pandeiro | i end up writing this stuff over and over again |
| 22:56 | TEttinger | hm, that's my main usage for clojure tbh |
| 22:56 | TEttinger | one-off large scripts |
| 22:57 | TEttinger | like this fake greek generator https://www.refheap.com/15489 |
| 22:57 | TEttinger | (fits in a small enough space to be run by lazybot over IRC) |
| 22:58 | pandeiro | TEttinger: cool |
| 22:59 | TEttinger | since then I've written fake english generators that slurp a wordlist and find the most common consonant combinations |
| 22:59 | pandeiro | yeah there is a ton you can do with so many function combinations, you are right |
| 23:02 | justin_smith | so markov chains on the letter rather than word level |
| 23:05 | TEttinger | justin_smith, I used the function frequencies a fair bit in that one |
| 23:06 | TEttinger | not sure if it's a markov chain |
| 23:13 | justin_smith | a markov chain uses the statistical likelihood of x followed by y within some set of tokens to construct a sequence superfically resembling the input set |
| 23:24 | justin_smith | https://github.com/prismofeverything/gort irc bot, in clojure, that does markov chain restructuring of channel activity |
| 23:54 | Raynes | callen: You should write rap lyrics with me. |