#clojure log - Apr 18 2015

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

0:59 lexi-lambda: Anyone up for a simple code review? ;D http://codereview.stackexchange.com/q/87277/12229

1:12 seancorfield: lexi-lambda: I'm curious about the maybe fn -- seems to only be used with string? and (string? nil) is false so that seems safe without (maybe string?)

1:13 lexi-lambda: seancorfield: But ((maybe string?) nil) is true.

1:13 seancorfield: oh, i see

1:14 interesting... i misunderstood the intent...

1:14 the only other thing would be making the functions public instead of private -- they might be useful to users of the library

1:15 the community consensus seems to be to prefer public over private unless there's a really good argument to keep something private

1:15 looks pretty clean to me apart from that

1:15 lexi-lambda: Okay, good to know. I think you're right that query-string->map and those sorts of functions should probably be public.

1:15 What about `maybe`? I don't think making that public would make much sense.

1:16 It would make sense to put it in a separate utils lib or something, but I didn't do that for that one function.

1:18 seancorfield: perhaps create a specific fn for the intended "maybe string?" where nil is true?

1:18 clojurebot: Pardon?

1:19 seancorfield: (unless you use maybe with something other than string?)

1:20 lexi-lambda: seancorfield: I used to, I think, but it ended up getting unused. I like the way (maybe string?) expresses the "string-or-nil" concept, though.

1:21 seancorfield: how about (defn may-be-string? [s] (or (nil? s) (string? s)))

1:21 hard to pick a good name for that

1:22 optional-string?

1:30 lexi-lambda: "maybe" is definitely the Haskell-y way to phrase it, so "optional" might be a better name

1:34 seancorfield: lexi-lambda: naming is hard :)

3:50 kaiyin: does core.typed boost performance?

3:56 atomi: anyone know a good blog post for a getting started with http-kit?

3:56 I'm new to clojure all together and I just did the lein new hello

3:57 I got -main going and did lein uberjar

3:57 worked just fine :)

4:01 the http-kit examples aren't complete from a new user context

4:04 amalloy: kaiyin: it's just a static analysis tool. it doesn't make any difference to the compiled code

4:05 atomi: I added http-kit "2.1.19" to :dependencies in my project.clj

4:08 okay how about a good getting started book for clojure

4:12 haha nevermind I got some good one

4:12 s

4:57 lbradstreet: Is it possible to use with-redefs for defmethods?

5:13 darthdeus: is there an ordering guarantee on channels? such as if 3 producers are blocking to put a value in, and I take one out, do I take out the first one?

5:22 * wwwBUKOLAYcom

5:28 amalloy: darthdeus: i don't see how you could even observe whether that is actually happening or not, from within the channel ecosystem. how do you know which one is first?

5:28 darthdeus: amalloy: I'm using channels to synchronize some stuff in my tests, and I need to have some ordering guarantees

5:29 so I'm asking if core.async already does this, or if I need to roll my own

5:29 * wwwBUKOLAYcom

5:31 amalloy: darthdeus: what i'm getting at is, there's no way oyu can tell whether ordering is preserved or not. try to devise an experiment which will behave one way if channels are ordered in the way you describe, and behave differently if they're not

5:31 darthdeus: amalloy: well I've done that, but I'm not sure if I'm just getting lucky, or if this is by design

5:31 and I can't find it anywhere in the docs

5:31 amalloy: what is your experiment?

5:33 darthdeus: amalloy: http://stackoverflow.com/questions/29715462/if-multiple-subscribers-block-on-a-core-async-channel-is-the-order-in-which-the

5:35 amalloy: mmm. well yes, you can observe the difference if you're using the super low-level stuff like put! and take!. but you're not supposed to, right, in general? like you can't write this test with <! and >!

5:36 anyway i don't know the answer to the question you're asking, but i'm encouraging you to think aobut whether it is really a question that's good to ask

5:38 darthdeus: amalloy: well, what I'm really doing is a writing a test, where multiple websocket clients (which are in clojure) talk to a server, and then I need to assert on the messages they get

5:39 and I'm using channels to gather incoming responses for each client, and then assert on them

5:40 I'm not really sure how to do this in any other way

5:40 I mean, I need the clients to run both at the same time, and individually collect incoming events in the order in which they come

5:42 I guess I could do the asserts in a (go) block, hmm

5:42 but that wouldn't really change much

5:42 since I need to synchronize across multiple async clients

6:29 H4ns: can anyone recommend a very simple, serverless, file backed persistence library for clojure?

6:31 expez: H4ns: spit, slurp and edn/read-string

6:31 H4ns: expez: right. i can roll my own, but i'd prefer not to.

6:33 expez: What functionality do you need which isn't provided by that solution?

6:33 H4ns: expez: serialization that works even when i have *print-length* set, for example

6:34 expez: there are several fine points that one needs to get right.

6:36 expez: also, when you're serializing all data into one file, you'll probably want to make sure that your writes succeed, and maybe keep a few previous versions etc. etc.

6:38 expez: H4ns: https://github.com/alandipert/enduro this might fit your bill. I haven't tried it out myself but it's in my "hammer looking for nail" pile :)

6:39 H4ns: expez: ah, that looks neat, thanks!

6:51 expez: enduro is precisely what i needed, thank you again!

7:10 _1_: hyy anyone from patnaa

8:46 kaiyin: how do you exit a running function in lein repl?

8:47 TEttinger: kaiyin, ctrl-d on windows exits the whole repl

8:47 not sure if there's a way to only kill the current fn

8:47 (there might be?)

8:47 not sure if ctrl-d also works on linux/mac

8:48 (I guess it probably does since ctrl-c is force kill everywhere)

8:52 kaiyin: doesn't work, neither c-d nor c-c.

8:52 darthdeus: hey guys, any thoughts? https://github.com/technomancy/leiningen/issues/1884

8:53 TEttinger: kaiyin, try c-c c-c

8:53 kaiyin: TEttinger: tried that, too. not working.

8:53 TEttinger: that's uh not good. linux?

8:54 kaiyin: osx.

8:54 TEttinger: oh were you pressing cmd?

8:54 ctrl-c is the actual key on osx

8:54 kaiyin: no, ctrl.

8:54 TEttinger: ok

8:55 I am not sure then, there's probably some osx users who can answer better than I can

8:55 kaiyin: ok, thanks. :)

9:00 anyways, i had to shut down the terminal to exit that function. Is there a function out there for exiting its enclosing function when certain conditions are met?

9:00 I tried (System/exit 0), but it also shuts down the repl.

9:10 TEttinger: kaiyin, like break in loops in C-like languages, or an early return statement?

9:10 the closest equivalent to break for reduce calls is reduced, which is generally handy for lots of stuff

9:10 (doc reduced)

9:11 clojurebot: "([x]); Wraps x in a way such that a reduce will terminate with the value x"

9:11 kaiyin: TEttinger: yeah, like an early return statement.

9:12 TEttinger: I mean ideally clojure code is structured into lots of small fns, but that isn't always practical...

9:13 do you know what wasn't terminating?

9:13 like an evaluation of an infinite lazyseq?

9:14 if you specifically want to denote that there is an error state in your program, you can just throw an exception

9:14 (doc throw)

9:14 clojurebot: Gabh mo leithscéal?

9:14 TEttinger: I think it's a built-in

9:15 (throw (Exception. "Some text"))

9:17 kaiyin: TEttinger: ah, indeed, that's a nice idea.

9:17 TEttinger: an advantage of being built with Java, kinda :)

9:17 plenty of Exception classes to choose from, jhaha

9:18 H4ns: we're using slingshot instead of raw java exceptions: https://github.com/scgilardi/slingshot

9:19 TEttinger: indeed. there are lots of solutions out there, I've heard good things about slingshot

9:19 how do you like it, H4ns?

9:20 H4ns: TEttinger: much better than raw exceptions because in those cases where we wanted to catch some specific error, we did not need to subclass Exception. so it does what we need so far.

9:20 clojurebot: Titim gan éirí ort.

9:20 TEttinger: great!

9:20 (inc H4ns)

9:20 lazybot: ⇒ 3

9:20 TEttinger: (inc scgilardi)

9:20 lazybot: ⇒ 1

9:54 justin_smith: TEttinger: you can't do anything involving throw with clojurebot, not even ask for docs

9:54 *security*

9:55 TEttinger: wow

9:55 justin_smith: H4ns: it's not super hard to directly use ex-info

9:56 H4ns: justin_smith: yes. it is not super hard to use slingshot either. why should i not?

9:56 justin_smith: H4ns: I only mention this because dep creep

9:56 but if you are OK using slingshot that's fine, of course

9:56 TEttinger: ,((fn rec [] (if (= (rand-int 100) 0) (throw (Exception. "wowza bo bowza!")) (rec))))

9:56 clojurebot: #error{:cause "wowza bo bowza!", :via [{:type java.lang.Exception, :message "wowza bo bowza!", :at [sandbox$eval25$rec__26 invoke "NO_SOURCE_FILE" 0]}], :trace [[sandbox$eval25$rec__26 invoke "NO_SOURCE_FILE" 0] [sandbox$eval25$rec__26 invoke "NO_SOURCE_FILE" 0] [sandbox$eval25$rec__26 invoke "NO_SOURCE_FILE" 0] [sandbox$eval25$rec__26 invoke "NO_SOURCE_FILE" 0] [sandbox$eval25$rec__26 invoke "NO_...

9:57 justin_smith: TEttinger: hrm, so that's not the thing I thought it was...

9:57 mavbozo: ,(throw (ex-info "wowza bo bowza!" {}))

9:57 clojurebot: #error{:cause "wowza bo bowza!", :via [{:type clojure.lang.ExceptionInfo, :message "wowza bo bowza!", :at [clojure.core$ex_info invoke "core.clj" 4591]}], :trace [[clojure.core$ex_info invoke "core.clj" 4591] [sandbox$eval51 invoke "NO_SOURCE_FILE" 0] [clojure.lang.Compiler eval "Compiler.java" 6792] [clojure.lang.Compiler eval "Compiler.java" 6755] [clojure.core$eval invoke "core.clj" 3079] ...]}

9:57 TEttinger: &((fn rec [] (if (= (rand-int 100) 0) (throw (Exception. "wowza bo bowza!")) (rec))))

9:57 lazybot: java.lang.Exception: wowza bo bowza!

9:57 TEttinger: heh

9:58 mavbozo: &(ex-info "wowza bo bowza!" {})

9:58 lazybot: ⇒ #<ExceptionInfo clojure.lang.ExceptionInfo: wowza bo bowza! {}>

10:02 mavbozo: &(throw (ex-info "wowza bo bowza!" {}))

10:02 lazybot: clojure.lang.ExceptionInfo: wowza bo bowza! {}

10:03 mavbozo: what's the difference between & and ,

10:25 kaiyin: why does this tic tac toe program fail to print the board? https://gist.github.com/kindlychung/bd9e46eda02784cec68d

10:27 xeqi: kaiyin: L42. map is lazy, so won't realize any of the printing unless the returned nil is needed

10:27 (doc doseq)

10:27 clojurebot: "([seq-exprs & body]); Repeatedly executes body (presumably for side-effects) with bindings and filtering as provided by \"for\". Does not retain the head of the sequence. Returns nil."

10:27 xeqi: try doseq instead

10:28 kaiyin: xeqi: ok, i'll try that.

10:31 xeqi: cool, now it works.

10:32 TEttinger: mavbozo: & executes the next form with lazybot, while ',' uses clojurebot. clojurebot is running almost the latest 1.7 master, lazybot isn't as recent but doesn't restrict printlength

10:32 mavbozo: ,*clojure-version*

10:32 clojurebot: {:major 1, :minor 7, :incremental 0, :qualifier "master", :interim true}

10:32 mavbozo: &*clojure-version*

10:32 lazybot: ⇒ {:major 1, :minor 7, :incremental 0, :qualifier "alpha1"}

10:33 TEttinger: you can also use lazybot mid-message ##(take 1000 (range)) like that

10:33 lazybot: ⇒ (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 ... https://www.refheap.com/99759

10:33 mavbozo: TEttinger, ah, so that's the difference

10:33 w00t!

10:33 TEttinger: the refheap pasting is extremely handy

10:33 but clojurebot's restricted printlength lets it deal with infinite lazyseqs without dying

10:34 (by forgetting the "infinite" part :D)

10:37 mavbozo: really awesome

10:40 ##(take 1000 (cycle [0 1 2]))

10:40 lazybot: ⇒ (0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 ... https://www.refheap.com/99760

11:02 si14: is there any better way nowadays to hint object array type other than using string representation?

11:03 into-array somehow kinda works sometimes, but I can't understand why and why it fails sometimes

11:04 https://gist.github.com/si14/c5d584bf622e6de91348 here is an example — without that ugly array hint it warns me about reflection on that .set

11:09 Guest67: I'm trying to get transducers to work for first time, but when I call (map somefn) i get an arity exception. i'm using clojure 1.6. Any hint what i am missing?

11:09 mavbozo: Guest67, use clojure 1.7

11:10 ,*clojure-version*

11:10 clojurebot: {:major 1, :minor 7, :incremental 0, :qualifier "master", :interim true}

11:10 mavbozo: ,(map somefn)

11:10 clojurebot: #error{:cause "Unable to resolve symbol: somefn in this context", :via [{:type clojure.lang.Compiler$CompilerException, :message "java.lang.RuntimeException: Unable to resolve symbol: somefn in this context, compiling:(NO_SOURCE_PATH:0:0)", :at [clojure.lang.Compiler analyze "Compiler.java" 6543]} {:type java.lang.RuntimeException, :message "Unable to resolve symbol: somefn in this context", :at [...

11:10 mavbozo: ,(map +)

11:10 clojurebot: #object[clojure.core$map$fn__4528 0x1dcd1bd6 "clojure.core$map$fn__4528@1dcd1bd6"]

11:10 mavbozo: &(map +)

11:10 lazybot: ⇒ #<core$map$fn__4338 clojure.core$map$fn__4338@5442634c>

11:11 Guest67: thanks

12:02 nooga: Can I use locking with values like strings, eg. (locking "someid" ...) ?

12:10 greoih: Hi! I'm sorry if this is a newbie question. I'm trying to get started with Clojure & Clojurescript. Making a webapp with the lein template reagent-template (https://github.com/reagent-project/reagent-template). My problem is with Emacs Cider integration. Running `lein test` works fine, but when I from core.cljs (with cider jacked in) hit `C-c ,`, I get the error `No tests namespace: list-paddan.core-test`, even if that namespace does

12:10 exist.

12:10 So I wonder, how can you tell cider where to look for tests namespaces, or how does that even work? Thank you very much.

12:14 sdegutis: Are transducers just a new name for the common map-reduce pattern?

12:27 kaiyin: why does the snake stand still? https://gist.github.com/kindlychung/93b50754d75b8056b7eb

12:33 noncom|2: sdegutis: no, i is a more general thing

12:34 J_Arcane: ... Hmm. How do you push something to the top of an atom? doing swap! with cons takes the arguments in the wrong order, and I get a mess.

12:36 noncom|2: J_Arcane: refs are for this

12:36 use a ref + dosync i guess

12:37 J_Arcane: however, i did not get into such a situation with atoms

12:37 consing was always in the right order if i had just one thread to do this

12:37 kaiyin: why don't you use seesaw?

12:38 kaiyin: noncom|2: I am following some tutorial on the web, they didn't use seesaw.

12:38 I also think seesaw is a better option.

12:39 but that's something else to learn.

12:40 J_Arcane: noncom|2: What I found is that if I've got a vector of strings in an atom, doing (swap! atm cons "string") actually tries to cons the contents of the atom onto "string", rather than the other way around in ClojureScript.

12:43 nuwanda__: J_Arcane: that's because:

12:43 ,(doc cons)

12:43 clojurebot: "([x seq]); Returns a new seq where x is the first element and seq is the rest."

12:43 noncom|2: kaiyin: where is the update loop for your game?

12:44 nuwanda__: J_Arcane: you can do (swap! atom #(cons item %))

12:46 kaiyin: noncom|2: i am not really sure, it's probably not there. Is that the problem?

12:46 I don't understand the gui part very well.

12:46 J_Arcane: nuwanda__: Ah! Right. I thought maybe that was the case with the argument order, just couldn't figure out a way around it.

12:46 noncom|2: kaiyin: i cannot see where should it happen. i guess that the Timer is to be used to schedule updates on a regular basis...

12:47 kaiyin: noncom|2: yeah, it's supposed to update the game state every 100 ms.

12:49 J_Arcane: IS there a 'flip' function in Clojure?

12:50 tomjack: there isn't a defined function for that in core, no

12:50 I would call this _a_ flip function: (fn [f] (fn [x y] (f y x)))

12:51 but then you might ask "what if f doesn't take two args?"

12:51 and you will maybe understand why there is no defined 'flip' function in core :)

12:51 noncom|2: kaiyin: well, it is not employed anywhere

12:52 probably a piece of the program is missing

12:52 kaiyin: ok

12:52 tomjack: er, not "what if f doesn't take two args?" really, but "what if f also takes (not= two) args?"

12:56 noncom|2: tomjack: the word "flip" implies duality

12:57 tomjack: so, the case for more args would be like "scroll-args" or "reverse-args"

12:57 tomjack: or other things

13:03 I was thinking 'flip' is less good a fit in an uncurried world, but I'm not sure that's really true

13:03 noncom|2: tomjack: yeah, other things too

13:19 kaiyin: why does used-id contain duplicated entries here: https://gist.github.com/kindlychung/8770cc28cc76250071cd ?

13:23 lalaland1125: kaiyin, Don't you need to use an atom for uid?

13:25 NVM, didn't see the ref.

13:25 kaiyin: lalaland1125: why?

13:25 ok

13:28 Since Refs are for Coordinated Synchronous, I don't understand why used-id should contain duplicated numbers.

13:29 tomjack: is commute the only thing you've tried?

13:31 I think the answer to your question is "that's how commute works". if you are just learning refs, use alter or ref-set instead

13:31 if you are learning commute, then I guess maybe you just did :)

13:36 kaiyin: how does commute work then?

13:36 postpunkjustin: I have some acceptance tests that I don't necessarily want to run all the time. They're marked with ^:acceptance, but "lein test" still runs them by default. Is there some way I can skip those by default?

13:36 kaiyin: tomjack: unfortunately I am still struggling with it.

13:39 tomjack: did you read the docstring?

13:42 the in-transaction value you read by `@uid` may not be the same as the one committed by your `(commute uid inc)`

13:42 kaiyin: tomjack: I have read some posts on SO, now I seem to have some idea of how alter and commute differ.

13:44 alter will retry if some other thread came along and made changes during the transaction, while commute just commit the change.

15:00 fritzl: hey, is there a clojure function like haskells scan{l,r}?

15:03 TEttinger: (doc reductions)

15:03 clojurebot: "([f coll] [f init coll]); Returns a lazy seq of the intermediate values of the reduction (as per reduce) of coll by f, starting with init."

15:03 TEttinger: fritzl, I'm not sure if that's what you're after

15:03 ,(reductions + (range 10))

15:03 clojurebot: (0 1 3 6 10 ...)

15:05 fritzl: TEttinger: that was what I was looking for, thanks

15:05 TEttinger: cool!

15:07 fritzl: kind of a better name as well

15:08 TEttinger: that's one of the things that I think clojure did a really good job on in the early design

15:13 mfikes: The names are good. I find the noun vs. verb aspect interesting. `reduce` or `reduction`

16:15 kaiyin: how do you add some file to classpath, after you add a new dependency in project.clj and run lein deps?

16:16 I mean before that the repl was already running.

16:17 noncom|2: kaiyin: i think this is not supported by default (not recommended?)

16:17 however, try pomegranate maybe

16:17 or vinyasa

16:18 i have some problem with lein: i run lein uberjar, but it keeps starting and then telling me, it cannot find some older version of java

16:18 why lein tries to uberjar with a different java?

16:19 how to fix?

16:26 kaiyin: noncom|2: vinyasa looks cool. thanks.

17:07 how do you remove an var in repl?

17:12 for example (def lb (listbox :model (-> 'seesaw.core ns-publics keys sort))) and set up some listeners for the listview. after that this list just won't go away even though i redefine it to a number (def lb 3).

17:32 imanc_: hope clojure one day gets as popular as scala

18:02 ticking: imanc_: not going to happen, a huge part of scalas popularity comes from its java-esque-ness

18:03 imanc_: from what I gather, scala is a pretty mad language though and many don't like using it

18:07 ticking: imanc_: yeah, interestingly the new spark sql stuff from apache spark uses a pattern matching graph transformer and macro based code emitter, so it feels very clojurish in its implementation

18:31 sobel: imanc_: what makes it mad?

18:32 imanc_: sobel: overly complex in places, and many ways of doing things, plus the possibly to royally screw yourself wiht things like implicits

18:33 apparently Odersky plans to simplify the language a fair bit

18:33 sobel: i am finding the composability of clojure addictive

18:33 and the metacoding tools are great.

18:34 imanc_: here's a scala core committer talking about why he binned scala and felt he wasted 5 years of his life working on it: https://www.youtube.com/watch?v=uiJycy6dFSQ

18:34 i really like clojure - hope I can get a job working with it

18:36 sobel: imanc_: i took a java job that looked like a place i could shoehorn clojure into the mix

18:38 er..scAHla or scAYla?

18:38 imanc_: sobel - i'm in a similar situation. I have potential for a job that requires either scala or java 8, and I don't have commercial experience in either. But I'm thinking about trying to learn java quickly, and then seeing if I can introduce some clojure

18:38 scaHla

18:38 sobel: i know enough java to wing it on a regular basis

18:39 especially including clojure usage

18:39 interop

18:40 well, now i have no desire to learn scala :)

18:40 imanc_: sobel: I've coded for years including some strongly typed langs, and the java lang looks pretty straight forward, but it's all the ecosystem and using it in an idiomatic way that takes time to get up to speed with. I'm wondering though, how long do you think i'td take to get to that sort of mid weight level with java?

18:41 yeh, scala has some nice stuff, but it looks f'kin nasty in other ways.

18:41 sobel: if you know clojure but have to use java, learn to compose your implementations using Spring (XML or annotation, doesn't matter that much)

18:41 imanc_: 'k

18:42 annotatoin sounds preferable to xml

18:42 :)

18:42 sobel: ymmv

18:42 i prefer xml because it is the most succinct way to yank all the creation code out of java

18:44 my generic-ish pattern was to replace important classes with interfaces (even eclipse can automate that refactoring) to make it easier to insert test impls/mocks with test versions of the xml object maps

18:44 imanc_: are you talking about IoC/dep injecion?

18:44 sobel: and to augment/replace most 'configuration' code with instructors

18:45 constructors

18:45 pretty much

18:45 imanc_: ah

18:45 sobel: closest thing to composition you get w/java :)

18:45 imanc_: yeh - going to suck going from python and clojure to java

19:00 xeqi: Bronsa: thanks for the formatting updates. No preview button, unknown formatting, and no easily seen edit button once created made me hope someone else would come along and fix it

19:02 Bronsa: xeqi: np, the preview button actually exists though, it's that blue icon next to the help one, underneath the textarea (took me a year to notice it)

19:04 xeqi: haha, so it does

19:08 brianpWins: Having some problems doing string replacemnts with escaped quotes: (string/replace (str "\"MARY\"") #"\"" #"") returns regex.Pattern cannot be cast to clojure.lang.IFn

19:53 sritchie: anyone know the elisp equivalent of “do"?

19:53 can’t figure out how to write sequential forms

19:57 amalloy: progn

19:57 sritchie:

19:57 sritchie: thanks

20:00 brianpWins: I still can’t find a way to do this string replacement: (string/replace "\"MARY\"" #"\"" #"") throws exceptions

20:01 amalloy: #"" is a regex, not a string. it doesn't make sense to replace with a regex

20:02 brianpWins: snap

20:02 i can’t believe I’ve been staring at this for like 2 hours lol

20:02 thanks amalloy

21:44 justin_smith: imanc_: what I have seen many places is people being able to convert ruby shops to use more and more clojure

22:46 myguidingstar: someone plz help explain why the two results here are different https://gist.github.com/myguidingstar/d7d2f03db35b2bcb7646

22:47 (sorry about the function name, it's a simplified version)

23:57 mfikes: myguidingstar: Forcing realization of the sequence returned by index-symbols* man cause mutation of `result`. In the global case, the result of index-symbols* is not wrapped with dorun (so it is perhaps realized differently simply owing to printing at the REPL). If you wrap it with dorun, the results become the same.

Logging service provided by n01se.net