#clojure log - Sep 04 2015

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

1:16 neoncontrails: ,((fn [lum] (loop [sum 0 lum lum] (if (not (seq lum)) sum (recur (+ sum (first lum)) (drop 1 lum))))) '(1 2 3))

1:16 clojurebot: 6

1:16 neoncontrails: Is there a more natural way to destructively update a list on which you're recursing? I get errors when I omit the step of setting lum to itself

1:17 ,((fn [lum] (loop [sum 0] (if (not (seq lum)) sum (recur (+ sum (first lum)) (drop 1 lum))))) '(1 2 3))

1:17 clojurebot: #error {\n :cause "Mismatched argument count to recur, expected: 1 args, got: 2"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6891]}\n {:type java.lang.IllegalArgumentException\n :mes...

1:17 neoncontrails: Or rather

1:18 ,((fn [lum] (loop [sum 0] (if (not (seq lum)) sum (recur (+ sum (first lum)))))) '(1 2 3))

1:18 clojurebot: eval service is offline

1:18 neoncontrails: Sorry clojurebot. :( That expression never terminates

1:19 gcommer: ,(+ 1 1)

1:19 clojurebot: 2

1:19 gcommer: he's fine :)

1:24 neoncontrails, not sure I understand the question

1:24 what do you consider not natural?

1:26 neoncontrails: lum is itself, of course. I'll set it to itself if I have to, but is there a better syntax?

1:27 (do ... (dosync [sthg])) maybe?

1:28 gcommer: that's the "cost" of coding in a tail recursive style

1:29 Any reason not to just use reduce?

1:31 neoncontrails: this is just a toy example of a slightly more complicated problem, which is less amenable to reduce

1:33 (predicate testing the uniqueness of elements in a list without creating a new data structure)

1:34 gcommer: Why no new data structure?

1:35 er, assuming that you meant optimizing for storage

1:35 neoncontrails: it's just the constraint of the problem (from cracking the coding interview)

1:37 gcommer: so just O(n^2), right?

1:38 neoncontrails: uhh I believe my solution to it actually runs in O(log N), depending on the time complexity of clojure's sort fn

1:38 but I *could* be wrong

1:39 gcommer: ... if you're sorting then you're over n log n anyways

1:39 though maybe I don't understand the full problem

1:39 neoncontrails: i just sort the list and compare two elements at a time

1:39 gcommer: yeah, n log n then

1:39 neoncontrails: if they're equal, then short circuit and return false

1:42 gcommer: I've done a loop like that recently actually

1:43 ,(partition 2 1 (range 6))

1:43 clojurebot: ((0 1) (1 2) (2 3) (3 4) (4 5))

1:47 gcommer: (sorry if I gave it away, but that's how I'd do it, no loop'ing required :p)

1:55 neoncontrails: interesting. Is it correct to say the lower-bound time complexity of that approach is higher than it would be if you used an inner loop?

1:56 gcommer: I think asymptotic complexity should be equivalent

1:56 neoncontrails: My intuition says that will work unnecessarily hard on inputs like, say

1:57 gcommer: Whether (loop ..) vs (parition ..) is faster should be left to profiling

1:57 neoncontrails: ,(partition 2 1 '(0 0 1 2 3 4))

1:57 clojurebot: ((0 0) (0 1) (1 2) (2 3) (3 4))

1:57 gcommer: Parition should be lazy

1:57 I hope

1:58 yep it's lazy

2:00 neoncontrails: Gotcha. So it's equivalent to iteratively, say, (take 2 (repeatedly ...))?

2:01 ben_vulpes: is it insane to want to be able to squirt clojure at a running instance from, say, bash?

2:02 gcommer: neoncontrails, I believe so

2:02 ben_vulpes: no, it totally is. nevermind.

2:02 gcommer: ben_vulpes, not at all

2:13 amalloy: gcommer: it's mostly lazy. try (ffirst (partition-by identity (repeat 1e7 0)))

2:15 gcommer: that's a good edge case to know to be careful about

2:15 (though I was using parition with a fixed split :p)

2:15 amalloy: partition is the same

2:15 (ffirst (partition 1e7 (repeat 1e8 0)))

2:16 specifically, partitions can be requested lazily, but once you request a partition all the items in it have to be realized eagerly

2:18 gcommer: I see, they do (doall (take n s))

2:19 I wonder why they chose to do the doall

2:23 kavkaz: oh hey amalloy, a few days ago you were helping me and I thought your name was familiar. I just realized you're the creator of 4clojure (: the problem I was having was one of the challenges from your site

2:23 amalloy: i remember

2:23 (and i knew it was a 4clojure problem)

2:23 kavkaz: I've been really enjoying them

2:24 gcommer: man I gotta catch up with the new 4clojure problems

2:25 amalloy: there have been very few new ones in the last few years

2:27 kavkaz: Well, there's also Lisp problems out there, Project Euler too

2:27 amalloy: Do you do project euler problems?

2:28 I've done about 24, some of them I would rather do without BigInteger, things like that

2:28 amalloy: i've done a few

2:29 kavkaz: Clojure kind of has a few things built in that I fear may take away from the experience and the challenge. Have you ever done these problems using clojure?

2:29 Ah okay

2:29 I guess I'll just start using Clojure with the remaining problems and see

2:29 I've really fallen in love with the language, it's been very interesting and fun to learn and to use it

3:04 Empperi: cfleming: we are facing a problem with Cursive and latest ClojureScript

3:04 suddenly Cursive doesn't recognize any of the core ClojureScript libraries or APIs

3:04 eg. 'defn' is unknown to Cursive

3:05 with an older version (the 0.0-xxx series) it works

3:34 crocket: I wrote a book review on clojure programming(2012) by O'Reilly Media. https://generalai.wordpress.com/2015/09/04/book-review-clojure-programming2012-by-oreilly-media/

3:35 Go check it out

4:23 Leonidas: I am trying to include a javascript library into my code, but I can't get the compiler to pick it up :-(

4:25 I've added :foreign-libraries to my deps.cljs but it is not picking up the file. Any ideas?

4:53 mavbozo: Leonidas, ideally the javascript library already packaged in http://cljsjs.github.io/

4:54 Leonidas, but you can try to package your javascript library according to instruction here https://github.com/cljsjs/packages/wiki/Creating-Packages

5:15 Leonidas: mavbozo: no, it isn't yet. It is a react datetime picker.

5:16 It seems like it just ignores everything about my deps.cljs

5:28 cfleming: Empperi: That's strange, I'll take a look

5:30 Leonidas: I've added a (prn "Hello") into my deps.cljs but it never got displayed anywhere

5:30 Empperi: cfleming: just as a headsup, a co-worker says it works for him

5:30 cfleming: Empperi: Does File->Invalidate caches help?

5:30 Empperi: but another co-worker has the same problem

5:30 don't know, will try

5:33 indexing.... will tell when it's ready :)

5:35 cfleming: Think of the indexing as forced hammock time :-)

5:35 Empperi: unfortunately it did not help

5:36 where can I tell Cursive the version of ClojureScript to use?

5:36 cfleming: Can you send the cljs dependency vec from your project.clj to make sure I'm using the same one to test?

5:36 Empperi: or does it just parse it from project.clj?

5:36 [org.clojure/clojurescript "1.7.48"]

5:36 cfleming: It uses whichever CLJS lib is attached to your project.

5:36 Thanks

5:37 Empperi: hmm, I might have an idea

5:38 let me check that one

5:38 we have a multi module project with several project.clj files

5:38 just opened the "External Libraries" branch in project view

5:38 inside it it says clojurescript:0.0-3196

5:38 not 1.7.48

5:39 cfleming: If you open your lein toolwindow and hit refresh, does that help?

5:40 Empperi: just updated all project.clj files to have the exact same version (the latest), refreshed via lein tool window

5:40 now it shows correct cljs version in external libraries

5:40 will tell if it helped since right now idea is totally frozen :D

5:40 I see only grey screen after switching back to the desktop where my idea is

5:41 cfleming: That's not good.

5:41 Empperi: had to kill it

5:42 and now restarted it and now it shows the old version in external libraries again

5:43 also reindexing yet again

5:44 but now it's ok

5:44 and now it recognizes 1.7.48 and it's API

5:44 cfleming: Ok, go to File->Project Structure->Modules->(your problem module)->Dependencies and check that the right CLJS lib is attached there. The problem with the External Dependencies is that it shows the deps for the whole project.

5:44 That's weird.

5:44 Empperi: so it must have originated from having multiple modules with different versions in their project.clj files

5:44 cfleming: I suspect that the indexes got funky somehow... right.

5:44 I'll set up a project to test that and see if I can reproduce it.

5:45 Empperi: yeah

5:45 cfleming: Do the modules that had the different versions depend on each other?

5:45 Empperi: anyway got it working and can instruct my coworker how to fix his environment too

5:45 yes

5:45 there is a library module which has clojurescript defined as dev dependency

5:45 oddcully: Empperi: once it goes grey it takes a while but at some point will gather itself

5:46 cfleming: Ok, yeah, that might cause weirdness. I'll check that.

5:50 Empperi: https://github.com/cursiveclojure/cursive/issues/1056 so I don't forget about it

5:50 Empperi: great :)

7:10 noncom: did anyone try to do modal windows with reagent + bootstrap on cljs ?

7:11 Empperi: yeah

7:11 or well, bootstrap...

7:11 modal windows with reagent though, yes .)

7:34 noncom: Empperi: what do you mean?

7:34 noncom: i am trying to build a web app with cljs + bootstrap + reagent.. getting into many difficulties..

7:35 Empperi: do you know how to make a table row clickable?

7:35 Empperi: [:rw {:on-click (fn [e] (js/alert "I was clicked!"))} [:td "some value cell"]]

7:36 and :tr of course

7:36 not :rw

7:36 I wonder where that came from

7:37 noncom: oh, right! thanks for this one!

7:38 Empperi: did you use the reagent-modal library ?

7:38 Empperi: i am using it as in the example and getting an error

7:38 Empperi: nope

7:38 we built our own

7:38 which isn't that hard

7:39 noncom: Empperi: yes, the code of this library is under 100 LOC

7:39 but i am so noob in web

7:40 Empperi: you know the om library? is it a full-scale solution so that i don't need reagent and other things if i use om and its accompanying om-* libraries?

7:43 Empperi: om and reagent solves the same problem at the same level so yes

7:43 both are built on top of react.js as a clojurescript interface for using react.js

7:44 dnolen is the author of Om

7:44 noncom: i see...

7:44 is everyone moving to om now?

7:44 i mean, is it considered superior?

7:45 if i start a new project, do i chose om whatever i have in mind?

7:46 Empperi: no it's not superior

7:46 it's different

7:46 and besides, Om New is coming which changes some fundamental concepts in Om

7:46 or was it Om Next :)

7:46 whatever .)

7:47 noncom: oh, so i better then stick with what i have now and then look at on next when it arrives..

7:47 what is the eta?

7:47 Empperi: no matter which one you use, Reagent, Om or Quiescent you'll get nice experience

7:48 all have their strenghts in different kinds of applications

7:48 and I have no idea what's the eta for Om Next

7:49 I'd say though that Reagent is the easiest

7:50 noncom: yes, reagent is cool

7:50 Empperi: there's very few concepts to learn

7:50 noncom: the only downside is that i still cannot get modal to work

7:50 now it silently does nothin

7:50 __djo__: Om Next is at least a few months away

7:51 noncom: oh, looks like i fixed the modal!

7:51 __djo__: is there any article about that?

7:51 __djo__: For now Om and Reagent are pretty good and fine for most projects.

7:51 dstockton: i think om next will also force you to use datomic, unless someone writes a compatibility layer between your database and datomic pull syntax

7:51 __djo__: noncom: Don't call where I saw it, might've been HN.

7:51 noncom: ah...

7:51 yeah, i'll google :)

7:52 hmmm datomic.. and it is paid for any real use

7:53 dnolen: dstockton: this is absolutely not true

7:53 datomic pull syntax is just recursive select-keys

7:53 you can interpret it however you like - this idea is very similar to falcor

7:54 noncom: wow

7:54 dnolen: if you want to actually understand Om Next read through Relay and Falcor documention, I'm just stealing ideas wholesale.

7:54 __djo__: Besides, Om Next remains in development, no point getting worked up about perceived features or flaws until there's a real public release.

7:55 Empperi: that would kinda wierd if Om Next would force you to use datomic :)

7:55 dnolen: Neither require any specific backend

7:55 Empperi: after all, datomic is a database and Om Next is a frontend library

7:56 dnolen: that said, yes if you use Datomic - Om Next is party time.

7:56 noncom: Empperi: +1 :)

7:56 dstockton: right, i didn't really mean force

7:56 i just understood that if you use datomic, the backend is more or less done for you

7:56 dnolen: dstockton: but it won't even be hard

7:56 noncom: yeah, but nice that thanks to this now i know more of om next, datomic and them together

7:56 dstockton: fair enough, that's good

7:56 dnolen: unlike Relay which requires some ridiculous interaction to work out of the box. Om Next is more like Falcor

7:57 integration with whatever backend you have won't be hard - microservices, SQL, whatever.

7:57 dstockton: i'll read more into falcor then, i was thinking along the lines of graphql

7:58 noncom: i'll too be reading

7:59 dnolen: the primary ideas taken from Relay are colocating the query with the component and using a compositional query form - in our case not graphql which does a lot more - just pull syntax.

8:00 but the cache and local/remote model is much more like Falcor

8:00 Empperi: dnolen: I love the idea btw, we did that few years back in this product we built (back when backbone was in alpha, we built everything on top of jquery)

8:00 made our lives so much easier

8:00 expez: dnolen: how likely is it that om.next comes out this year?

8:00 Empperi: it was nowhere as sophisticated as what you are planning for Om Next

8:00 but it was essentially the same thing

8:01 expez: dnolen: and if someone wanted to increase the likelihood of that happening...Contribute patches to clojurescript?

8:03 __djo__: Same, the concepts behind Om Next are awesome.

8:04 dnolen: expez: pretty likely but it will come out when it comes out

8:05 __djo__: dnolen: Thanks

8:06 noncom: since js people are here, dare i ask: when i'm modifying my modal and i change the cljs code and figwheel updates everything, the modal window itself disappears, but the gray locking remains

8:06 i cannot do anything unless i f5 the page

8:06 is there any cure for that?

8:15 dstockton: noncom: there is a js-onload hook, maybe you can use that to close it

8:15 im not familiar with this particular modals implementation

8:16 noncom: hmmmm....

8:18 dstockton: it's probably reloading your app-state which is storing whether the modal should be visible but the backdrop is triggered by something else

8:19 noncom: yeah, likely so

8:30 luxbock: which interface is the .get method located in?

8:31 java.util.Map I guess

8:36 dstockton: luxbock: clojure.lang.ILookup is the clojure protocol for implementing get semantics

8:37 luxbock: dstockton: yeah that's what `get` uses, but I was wondering about `.get`

8:37 ILookup uses .valAt

9:08 roelof: any midje expert here ?

9:29 any midje expert here ?

9:30 oddcully: roelof: sometimes it takes no expert. could you describe your problem and maybe someone is able to help

9:33 roelof: if I have this fact : (facts "do-a-thing" {:exercise 1 :points 1} can I make it work that only this test is shown

9:41 I tried lein midje :filter exercise 1 but then I still get all the output

10:02 wombawomba: I'm trying to write a macro for managing resources. Basically, I want the resources to live only for the scope of the macro (I've got this working). However, I also want to be able to nest the macro, and for 'inner' macro invocations to be able to know which resources have been previously allocated. What's a good way of accomplishing this?

10:04 (i.e. if I do (mymacro [thing] ... (mymacro [other-thing] ...)), I want to, in the second invocation, be able to access the results of the first invocation)

10:05 chouser: ah, communication between macros. fun stuff.

10:05 wombawomba: :)

10:06 chouser: I think Racket has suite of powerful tools for this sort of thing. You have a few options in Clojure.

10:14 wombawomba: one thing I'm thinking I could do is just define some kind of collection, and rebind it with new results in each macro invocation

10:14 would this be a good idea?

10:15 TMA: wombawomba: where are you going to use the outer resources? in the ... or in the invisible part generated by your macro?

10:17 wombawomba: if you need to use them in the body (i.e. in the "..." part), you can just let the user name the resource. it then becomes easy to refer to them by their name

10:17 wombawomba: well, I want the calling code to be able to access the resources, but I also want the invisible part generated by my macro to know precisely which resources have been allocated

10:18 TMA: wombawomba: think of (let [a 1] (let [b 2] (+ a b)))

10:18 wombawomba: yeah, I do let users name resources; in my example there would be a binding called 'thing' in the body of the outer macro invocation

10:19 but in the inner invocation, I also want to be able to access some kind of collection to tell which resources are currently allocated

10:20 so I'm thinking I'd both define the resources by name, *and* have something like (def ^:dynamic defined-resources #{}) that I can rebind at will

10:20 TMA: wombawomba: that's tricky; perhaps you would like to implement your own macroexpanding tree walker, treating your own macro specially

10:21 wombawomba: there is a problem with that scheme you are proposing

10:21 roelof: oke, apperently nobody who can help me ? :(

10:21 TMA: wombawomba: it is easy to add them to the defined-resources set

10:23 wombawomba: it is nigh impossible to remove them -- there is no hook you can use [that I know of] to tell you the moment "I am done with macroexpanding the form that came out as a result of expansion of this macro"

10:26 wombawomba: I think it's fine.. e.g. this seems to work:

10:26 (def ^:dynamic x #{}) (defmacro m [y & b] `(binding [x (conj x ~y)] ~@b)) (m "a" (println x) (m "b" (println x)))

10:27 I think maybe I was unclear with what I wanted to do, but yeah that does seem to do the trick

10:28 is there any way to tell if a certain binding is defined or not? that way I could avoid defining x in advance

10:31 TMA: ,(def ^:dynamic x #{})

10:31 clojurebot: #'sandbox/x

10:31 TMA: ,(defmacro m [y & b] `(binding [x (conj x ~y)] ~@b))

10:31 clojurebot: #'sandbox/m

10:31 TMA: ,(m "a" (println x) (m "b" (println x)) (m "c" (println x)))

10:31 clojurebot: #{a}\n#{a b}\n#{a c}\n

10:31 TMA: hmm

10:32 wombawomba: oh, I misunderstood. I thought you want to be able to have the info during the macroexpansion

10:33 ,(defmacro m2 [y & b] (println x) `(binding [x (conj x ~y)] ~@b))

10:33 clojurebot: #'sandbox/m2

10:33 TMA: ,(m2 "a" (println x) (m2 "b" (println x)) (m2 "c" (println x)))

10:33 clojurebot: #{}\n#{}\n#{}\n#{a}\n#{a b}\n#{a c}\n

10:58 troydm: what is a name of a function that checks all pred against collection?

10:59 gilliard: ,(doc every?)

10:59 clojurebot: "([pred coll]); Returns true if (pred x) is logical true for every x in coll, else false."

10:59 troydm: gilliard: yeah right, thx, tend to forget the name

10:59 gilliard: me too. I want to call it "all"

11:02 sdegutis: Is it normal that a lexer for an INI file is about 120 lines of Clojure code?

11:02 It seems way long.

11:06 gilliard: That does seem like a lot of code but IDK how many quirks there are in ini format to account for. Is this code public?

11:08 sdegutis: Nope.

11:10 My technique was to use a recursive function taking in a single context-map including :state, :tokens, :characters, and :partial-string, and to do a top-level (case) based on state, with a (cond) inside each state to check the first (and sometimes second) current characters, and (usually) recur with an updated context-map with new tokens and (next characters).

11:10 Those (cond)s definitely made it feel bulky and slightly redundant, but I don't know how else to do it.

11:11 gcommer: doing character-by-character parsing is usually overkill

11:12 I prefer something more like: read in the file as a list of lines; filter out comments/blanks; map a string split over them

11:21 gilliard: INI format seems very line oriented so you can reduce over the seq of lines as gcommer says. A line is either: comment or blank, start of a new section, definition a kv pair.

11:45 sdegutis: gcommer: Thanks.

11:45 gcommer, gilliard: in this specific INI-variant, sometimes the line bleeds onto the next line, and I have to check for that.

11:45 It's a confusing situation, similar to INI in some ways, different in others.

11:57 chouser: wombawomba: sorry, got distracted by, you know, work.

11:57 I think you actually want a lexical variable, not a dynamic one, for communicating from the outer macro to the inner.

12:01 ,(def x #{}) (defmacro m [y & b] `(let [~'x (conj ~'x ~y)] ~@b))

12:01 clojurebot: #'sandbox/x

12:01 chouser: ,(m 1 (prn x) (m 2 (prn x)) (m 3 (prn x) (m 4 (prn x))))

12:02 clojurebot: #error {\n :cause "Unable to resolve symbol: m in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: m in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6704]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: m in this context"\n ...

12:02 chouser: Hm, well, that worked for me.

12:02 oh, I see.

12:02 ,(defmacro m [y & b] `(let [~'x (conj ~'x ~y)] ~@b))

12:02 clojurebot: #'sandbox/m

12:02 chouser: ,(m 1 (prn x) (m 2 (prn x)) (m 3 (prn x) (m 4 (prn x))))

12:02 clojurebot: #{1}\n#{1 2}\n#{1 3}\n#{1 4 3}\n

12:04 chouser: ...depends on what you want to happen when fn f uses your macro and inside calls fn g which also uses your macro.

12:43 felipedvorak: (map inc #{1 2 3}) => (2 4 3)

12:43 Can somebody explain this to me?

12:44 hiredman: since that is how map works you will have to explain which part of it you find surprising and need an explanation on

12:44 felipedvorak: If I run (inc #{1 2 3}) it outputs an error, but that map inc somehow outputs that value and I can't understand

12:44 hiredman: sure, inc works on numbers, and a set of numbers is not a number

12:45 map takes a sequable collection and a lazy sequence result in apply the given function to each element in the seq of the collection

12:47 felipedvorak: But, if the inner function outputs an error, why would map work with the output of that? Sorry, I'm only two days in

12:47 hiredman: why would it generate an error?

12:48 ,(doc map)

12:48 clojurebot: "([f] [f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & ...]); Returns a lazy sequence consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments. Returns a transducer when no coll...

12:48 emauton: felipedvorak: It's not an inner function, it's a function being passed as an argument and then applied to each element of the set you pass.

12:48 felipedvorak: What resource(s) are you learning from?

12:48 felipedvorak: Alright, I get it now :D

12:49 Thanks, I'm learning from braveclojure.com

12:50 But I'm in love with the language so I'm twisting it and just stumbled upon this. This isn't in the websites material

12:51 emauton: Cool. Chapter 3, search for "higher-order functions" and there are some notes on this that might help (including a map example like yours).

12:53 felipedvorak: great, I'll get there. I've been strugling with learning to program for a long time... I've tried so many stuff online, and this is the first resource that clicks me in.. I sleep thinking about it and wake up excited to continue, very high quality

12:54 emauton: That's wonderful!

12:55 pcn: felipedvorak: you're lucky if this is working for you. This is a fine language to get started with.

12:58 felipedvorak: pcn: I've tried many, many other languages before

12:58 And yes, this language is ridiculously sexy

13:06 blake__: Is Seesaw a reasonable way to build a GUI for a modern Clojure app?

13:10 justin_smith: blake__: I've heard great things about reagent+atom shell

13:10 don't google that, you just get a bunch of chemistry stuff

13:11 blake__: https://github.com/Gonzih/cljs-electron

13:11 blake__: justin_smith: Ha! And electron is very cool.

13:13 But it's Clojurescript and webby, and I'm looking for something I can use in my class without going into all that. We've JUST got the basics, and I want to build on those by introducing clojure + java libraries.

13:14 At the same time if seesaw is moribund, I don't want to go into that too much, either.

13:15 justin_smith: blake__: it uses the chrome engine for a local app - it's not a web thing

13:15 but yes, it does use cljs

13:16 blake__: seesaw should be good if you want to have a jvm focused class though

13:16 blake__: I didn't realize yourother parameters

13:16 blake__: justin_smith: Yeah, my vagueness is often a hindrance to...things.

13:17 wink: woo, I need offtopic help. again :/ Any of you guys a) an American b) without BSc/MSc c) and working as a programmer who could query me for a few non-personal questions? :)

13:17 justin_smith: lol README typos - "npm install electron-prebuilt -g # install electrob binaries"

13:17 blake__: wink: I'm an American without a BSc/Msc working as a programmer.

13:18 wink: As is my son. And was my father. =P

13:20 wink: blake__: It's about a German trying to get a grasp on CVs written by Americans. (If you ever saw a German one, you'd probably know already where I'm comign at)

13:21 blake__: wink: I actually wrote for Toolbox for years, so I have some familiarity with German antics.

13:23 wink: I'm just curious if it's pure coincidence or meaningful if someone puts a high school degree before their arts degree - because I've never eevr seen that before in the (few) CVs by Americans I read

13:23 or if it's already integration here

13:26 and apparently roughly 56% of Germans have a driving license, whereas 75%+ of Americans have one, that's why it's on the CV :P

13:27 blake__: wink: Never seen it. I would go so far as to call it "weird". Unless the high school was very prestigious, or maybe more relevant to the job somehow.

13:27 wink: And I've never seen driver's license on a CV.

13:27 wink: blake__: that's what I meant. It's pretty common here

13:27 justin_smith: blake__: I'd put it on there if I was applying to deliver pizza

13:28 wink: blake__: what if you're delivering... cookies?

13:28 err

13:28 s/blake__/justin_smith/

13:28 blake__: I confess I've never reviewed CVs for a pizza job. I was a driver and I didn't put it on my resume because OF COURSE I have a license.

13:28 But then, I live in L.A.

13:28 wink: does that mean anything for pizza? :P

13:30 emauton: wink: I'd try not to read too much into cultural CV differences; try to pick out whether the candidate looks like someone you want to interview despite them. :o)

13:31 wink: emauton: well sure, but if you stumble over something, why not try to get more info to be a better judge the next time? :)

13:31 blake__: wink: We have the best pizza. Don't tell the rest of the country.

13:31 wink: blake__: too bad I don't see myself being able to confirm that anytime soon

13:31 emauton: wink: Because human systems are even weirder than computer ones and life's too short? ;o)

13:32 blake__: I once reviewed a resume where the applicant had put on: 22" chrome rims.

13:32 wink: I was counting on that.

13:32 Frozenlock: blake__: but did he even lift?

13:33 blake__: Frozenlock: He did say he was "the total package", so, I would assume so. I told him we were going with a guy with 23" rims.

13:33 wink: emauton: we're not a huge shop. we don't have an HR machinery filtering them :P

13:33 rofl

13:34 blake__: Honestly, I've always sided with aptitude and attitude above all. I hate the whole "You have to have X years of experience with Y..."

13:35 emauton: blake__: It's the short way of saying "we'd like the rest of the industry to train people for us", which to be fair seems to be working out fairly well for lots of the big shops. ;o)

13:35 Okay, er, *cough*Clojure*cough*

13:37 blake__: So, yeah, seesaw says "replace x.y.z with version (see below)" and below is no version info. But it looks like daveray is still working on it.

13:38 wink: blake__: agreed. but "I've never used anything of what you're using" is also a bit lacking :P

13:38 but no, that's also not a no per se, but if someone has an informed opinion about a piece of tech it's a lot easier to talk about it

13:39 justin_smith: on the other hand, if someone applied for a clojure job with my company and had a good haskell / scheme cv, I'd vote for hire

13:39 blake__: It's a dark art.

13:39 justin_smith: you at least want to know they have some existing interest in the right ballpark though

13:40 wink: yep

13:40 blake__: I'm doubtless biased. I was a music major. =)

13:40 wink: blake__: oh, in many people's opinion that would qualify you a lot more than me (having done PHP for many years)

13:40 justin_smith: blake__: I'm double-biased, I'm a "never enrolled"

13:41 blake__: So, you guys know.

13:44 emauton: /j #clojure-adhoc-careers if you'd like to talk of such things without feeling like we're ruining #clojure's scrollback. :o)

14:45 chomwitt: i have simple file with a simple ring handler. starting repl in the src dir being in the namespace i use other simple function defined in it. changed the handler a little (adding a with-out-str (clojure.pprint ...) and now my other functions are unresolved symbols not existing in the namespace as ns-intern shows to me. how could that happen?

14:48 hiredman: you have a source file on disk that contains code for a namespace and you didn't load that source file

15:01 sobel: can anyone recommend a howto/example for using dbcp (connection pooling) w/clojure?

15:16 amalloy: sobel: that seems like the kind of thing that you want a library for, not a how-to or example

15:17 if you do it yourself it's not hard to mess up, whereas (for example) bonecp probably has the features you need implemented fairly well. maybe there's even something in the jre already

15:17 http://stackoverflow.com/q/2835090/625403

15:22 sobel: amalloy: yeah, i poked around for libraries and found more than a few. i was hoping to get a recommendation from someone that uses it.

15:22 i already have dbcp in my app environment

17:37 Rurik: what does '*fn*' mean in clojure

17:38 chrchr: It means lambda

17:39 amalloy: Rurik is probably asking about earmuffs

18:24 thiagofm: testing.

18:51 nice_music: Hi, I am trying to send Midi messages from Clojure to a sequencer like Reason and Ableton, is this possible using Overtone?

18:53 devn: nice_music: sure!

18:54 nice_music: Good to know, I'm having quite some trouble setting it up devn.

18:54 devn: nice_music: whatcha doing currently? I haven't messed with overtone for awhile, but I did get it to pass midi IIRC.

18:55 nice_music: devn: I have Reason open and a REPL with Overtone autoloaded by Leiningen. Whenever I try to find find MIDI devices it doesn't find any..

19:00 devn: nice_music: im firing up a new project

19:00 ill see if i can make something work

19:00 1sec

19:00 nice_music: devn: awesome!

19:01 devn: nice_music: what OS?

19:01 nice_music: devn: Mac OS X.

19:03 devn: nice_music: go into audio/midi preferences, then open up the MIDI studio (command+2 or select it under the Windows menu)

19:03 Window* menu

19:03 Create a network session

19:04 double click network, click the + under sessions

19:04 nice_music: devn: in what program should I open these audio/midi prefs?

19:05 devn: it's a built in preference thing, a GUI

19:05 open up spotlight, then type Audio, and select "Audio MIDI Setup"

19:06 or in the terminal type: open /Applications/Utilities/Audio MIDI Setup.app

19:06 nice_music: devn: got it.

19:06 devn: now open a network session?

19:06 devn: k, so create your session with the + button

19:06 under Sessions

19:07 the details there don't really matter

19:07 just make sure you can connect from "Computers in my directory"

19:07 in the lower left

19:08 nice_music: devn: check.

19:08 devn: then, if you restart your overtone REPL, (midi-connected-devices) should now show you something like this:

19:08 {:sinks 0, :info #<MidiInDeviceInfo Session 1>, :name "Session 1", :overtone.studio.midi/dev-num 0, :version "Unknown version", :device #<MidiInDevice com.sun.media.sound.MidiInDevice@2b5ccb9>, :sources 2147483647, :vendor "Unknown vendor", :description "Network Session 1", :overtone.studio.midi/full-device-key [:midi-device "Unknown vendor" "Session 1" "Network Session 1" 0]}

19:09 and in overtone, if you look at midi preferences, you'll see your network midi

19:10 err sorry not in overtone, in ableton

19:10 nice_music: devn: I see the information. Where can I see midi prefs in Overtone?

19:10 Ah, I was trying Reason.

19:10 devn: ah, well i bet it's similar

19:10 either way the deal is this

19:10 you now can see the network midi session from overtone, and you can put events into it

19:10 nice_music: devn: true.

19:11 devn: on a midi channel in reason or ableton or whatever, make sure that the input for that channel is the network session

19:11 nice_music: devn: ah.. care to share an example? On how to send one note?

19:12 devn: and how to hook it up to that particular channel/session in Overtone?

19:12 devn: I did select it in Reason.

19:13 devn: heh, im working through this now, gimme a few

19:14 nice_music: devn: cool.

19:32 devn: nice_music: alright small change of plans

19:33 nice_music: devn: okay.

19:33 devn: nice_music: go drop that network session that you created in audio midi settings

19:33 nice_music: devn: ok.

19:33 devn: download this: http://notahat.com/midi_patchbay/

19:35 nice_music: devn: done.

19:40 devn: nice_music: okay, so in midi patch bay click "Add Patch"

19:40 nice_music: devn: yes.

19:40 devn: then for the MIDI input dropdown, click "Edit virtual inputs"

19:41 click New Input, name it Overtone

19:41 nice_music: devn: yes.

19:41 devn: click on the Outputs tab, and name that Reason

19:41 or whatever you want

19:41 nice_music: devn: done.

19:41 devn: restart your overtone session and verify you see "Overtone" as one of the options when you run (midi-connected-receivers)

19:42 in reason or ableton or whatever, set the channel to receive midi from the Overtone input on All channels

19:42 (the channel with your instrument on it)

19:42 TEttinger: it's interesting how we don't often get overtone questions here, but a lot of people have experience with overtone it seems. I'm glad you can provide detailed help, devn!

19:42 (inc devn)

19:42 lazybot: ⇒ 25

19:43 devn: happy to help, it's a fun way (and if im being frank, a pretty difficult way) to get started with Clojure

19:43 but for simple enough stuff it's fun to start making noises

19:43 just using midi or whatever

19:44 nice_music: i made a typo above

19:44 nice_music: devn: I see it in the REPL yes.

19:44 devn: in reason, you'll see "Reason" or "Ableton" or whatever you named it

19:44 and in Overtone you'll see "Overtone" in that list

19:44 nice_music: devn: yes.

19:45 abhir00p: is it possible to have a function that only returns a value if the predicate is satisfied otherwise doesnt return anything(not nil)

19:46 constraint without using remove and filter

19:48 devn: nice_music: https://gist.github.com/devn/691aa4f98912ea144468

19:48 justin_smith: abhir00p: no, the only way not to return is to throw

19:48 abhir00p: if you return, you return something

19:49 devn: nice_music: did that work for you?

19:51 nice_music: devn: I can see notes being scheduled. Also I can play the song, but I don't receive them yet at the Reason end. Might have to fiddle a bit there.

19:52 devn: nice_music: you ever share your screen? happy to help you out quick

19:52 nice_music: zoom.us is an option

19:53 nice_music: devn: that's fine by me. Or maybe Skype?

19:53 devn: sure, ill ping you my skype info

20:17 Rurik: ,(def foo ([] []))

20:17 clojurebot: #error {\n :cause "Key must be integer"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Key must be integer, compiling:(NO_SOURCE_FILE:0:0)"\n :at [clojure.lang.Compiler$InvokeExpr eval "Compiler.java" 3661]}\n {:type java.lang.IllegalArgumentException\n :message "Key must be integer"\n :at [clojure.lang.APersistentVector invoke "AP...

20:17 justin_smith: Rurik: what are you trying to do there?

20:17 Rurik: justin_smith, just trying to understand clojure source code

20:18 abhir00p: i am trying to write a function which filters out all the elements which stisfies a predicate

20:18 constraint: not using filter or remove

20:18 Rurik: it does something like (defn vector ([] []) ...

20:18 justin_smith: Rurik: I think you are misreading it

20:18 abhir00p: the code i wrote is here http://pastebin.com/QXWhzUYf

20:19 justin_smith: also defn and def are very different

20:19 amalloy: justin_smith: well, (defn vector ([] []) ...) is perfectly reasonable

20:19 Rurik: ah

20:19 justin_smith: ,(defn foo ([] []))

20:19 clojurebot: #'sandbox/foo

20:19 justin_smith: ,(foo)

20:19 amalloy: probably the actual definition

20:19 clojurebot: []

20:19 justin_smith: amalloy: right, he did def above, which is the confusion

20:19 amalloy: right

20:19 it's just that you said he'd misread it *and* said def and defn were different

20:20 justin_smith: amalloy: there was a write skew on the "misreading it" comment

20:20 Rurik: I keep using def in place of defn and keep getting confused

20:20 amalloy: ha

20:21 justin_smith: abhir00p: what have you tried so far?

20:21 abhir00p: http://pastebin.com/QXWhzUYf

20:21 but i end up using remove in the end

20:22 basically i want to know if its possible to have a function which returns nothing if predicate is not supplied

20:22 justin_smith: abhir00p: what about not doing the cons if the pred returns false?

20:22 abhir00p: no, as I said before, if you return, you return a value

20:24 abhir00p: (if (pred? (first aseq) (cons (first aseq) (my-filter pred? (rest a-seq))) (my-filter pred? (rest a-seq)))

20:24 that's the long clumsy version, there are ways to make that more succinct

20:24 oh and I got my parens wrong up there

20:26 abhir00p: i though of this approach

20:26 but it seems a little clumsy

20:27 justin_smith: less clumsy than walking the whole list a second time to remove nil results

20:27 abhir00p: true that

20:28 justin_smith: abhir00p: you can turn your if on line 7 to a cond

20:28 first test aseq

20:28 then test pred

20:28 you don't need predfun

20:29 you can eliminate the repetition of (my-filter pred? (rest aseq)) via let

20:29 abhir00p: is (first a-seq) O(1)?

20:29 if not we can let that too

20:30 justin_smith: yes it is O(1)

20:30 oh, but using let to bind the recursive call could blow the stack :(

20:30 unless you use delay

20:33 or maybe not...

20:36 amalloy: justin_smith: if you're not using lazy-seq you're blowing the stack anyway

20:36 justin_smith: amalloy: oh, right, if course

20:36 amalloy: and if you are, then adding a let-binding will not cause you to blow the stack

20:37 justin_smith: awesome, one day I'll get that stuff

20:37 abhir00p: @justin_smith beginner question is there any constrct similar to continue in clojure

20:37 justin_smith: (inc amalloy)

20:37 lazybot: ⇒ 298

20:37 abhir00p: so what would you suggest @amalloy

20:37 justin_smith: abhir00p: no - not really - I mean we have reduced in the reduce function for "early escape" which is kind of similar...

20:38 amalloy: abhir00p: there's not much call for continue when you don't have while or for

20:38 (we do, of course, have both of those, but they are quite different)

20:48 raspasov: hey guys, anyone using docker here?

21:03 domokato: in the docs for pmap it says "Semi-lazy in that the parallel computation stays ahead of the consumption, but doesn't realize the entire result unless required."

21:03 i'm not sure what this means

21:04 justin_smith: domokato: it will realize N items at a time, but won't realize the whole thing. N is derived from a calculation that includes things like how many CPUs you have

21:04 domokato: ah okay

21:05 justin_smith: because how else could it go full parallel, right? it needs a bit of eagerness for that

21:05 also

21:05 ~pmap

21:05 clojurebot: pmap is requires syntax quoting which most of the time

21:05 justin_smith: man that factoid sucks

21:05 domokato: wat

21:05 justin_smith: anyway, pmap is kind of a gimick and usually you should be doing your own parallelization logic if you really need parallelization

21:06 domokato: oh okay

21:06 justin_smith: domokato: there's another factoid liek "pmap isn't the right thing usually"

21:06 domokato: ah

21:06 yeah, i'm trying to kick off a few parallel computations but not block the thread i'm on waiting for completion

21:07 justin_smith: like if you can get and use results out of order, there's optimizations you can do that are not available with pmap. Or if you have your own idea of how many threads should be active with your collection.

21:07 domokato: does pcalls fall under the gimmick umbrella as well?

21:08 justin_smith: I don't actually know that one

21:08 looking at the docs it looks OK - it just uses the future pool though

21:09 oh haha - check out the def https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj#L6744

21:09 ROFL

21:09 domokato: according to the docs...it might work. i just need to bind it to a symbol and dorun it at the end of the thread I'm on to join everything

21:09 haha dammit

21:10 well, nevermind then

21:10 i want them all to run immediately and as fast as possible

21:11 justin_smith: domokato: the most flexible solution is to use a queue (I like the one from java.util.concurrent but there is one in clojure too) and a thread pool where every thread reads from the in queue and writes to an out queue

21:11 or some similar construction

21:11 amalloy: domokato: you don't really, though

21:11 because what if there are like a thousand items in the list. you don't want to start up a thousand threads

21:12 domokato: amalloy: sorry, that's not what i meant

21:13 amalloy: from my understanding of pmap, some of the computations may not run as soon as possible, instead waiting for realization to start

21:14 amalloy: well yes. for example, if there are a thousand things, only some smallish N of them will run, until you start consuming

21:14 domokato: amalloy: i'd rather they all run as soon as possible (one per thread per core, not all at once on different threads)

21:14 justin_smith: domokato: right, so really what you want is to figure out what your ideal parallelism is for the given code, and set up the workers that will maintain that effectively. pmap uses a default, but you can refine this with your own pool

21:14 chomwitt: i start 'lein repl' , i'm in my projects main namespace but my namespace dont have any symbol in it! http://paste.ofcode.org/NNAqEDveX2NYXhb3B4GvGn if i remove the (with-out-str .. ) part then my namespace is ok!

21:15 amalloy: the thing about pmap is, it has to balance a lot of different concerns to be applicable in wildly differing use cases

21:15 if you have a specific use case, you usually have a better answer available with your own thread pool

21:15 chomwitt: what dont i get?

21:15 justin_smith: chomwitt: for starters, you should require clojure.pprint if you are going to use it

21:15 it's not automatically present

21:16 (though I guess lein often loads it)

21:16 domokato: okay, i'll try that. thanks guys!

21:16 chomwitt: justin_smith: one moment to try ..

21:20 (require clojure.pprint) didnt help. i still get nothing in my ns (i check with (ns-interns *ns*)

21:21 justin_smith: chomwitt: and no errors?

21:21 what ns does it start you in?

21:21 Jabberz: anyone have a recommendation for monitoring a clojure app on heroku? Any of the standard java offerings (like new relic) work okay or ?

21:21 chomwitt: i get 'unable to resolve symbol: foo' if i try to evaluate in in repl

21:22 justin_smith: chomwitt: what ns is the repl in

21:23 chomwitt: sorry i did get an error

21:23 i missed it (fast scrolling.. )

21:24 #error {

21:25 :cause clojure.pprint /nl :via /nl [{:type clojure.lang.Compiler$CompilerException

21:25 :message java.lang.ClassNotFoundException: clojure.pprint, compiling:(basic_clj_ring_webapp/core.clj:2:1)

21:25 and a page full trace follows!

21:25 justin_smith: chomwitt: your ns block should looke something like (ns foons.core (:require [clojure.pprint :as pprint]))

21:26 require at the top level is only for the repl, but it would look like (require '[clojure.pprint :as pprint])

21:26 with the '

21:26 ClassNotFoundException clojure.pprint would usually be caused by doing that repl version wrong

21:27 chomwitt: i see. the require must be part of the ns expreassion

21:27 justin_smith: it should be - the second form is valid, but I think you should only use that in the repl

21:29 chomwitt: thanks!!

21:29 * chomwitt thanks justin_smith

21:29 justin_smith: so did that fix it?

21:29 chomwitt: justin_smith: yep

21:32 amalloy: chomwitt: also, while it's polite to not do multi-line pastes into the channel, when giving an error message it is usually helpful to put the whole stacktrace on a pastebin site (eg, gist.github.com) and link to it

21:32 justin_smith: luckily that error has an easy to identify common cause though

21:33 chomwitt: i'm learning and the site i got the idea for the small ring program didnt say how to do that rigth. it had a simple (ns .. ) command

21:33 domokato: actually, pmap has all the logic i need for splitting the task onto separate cores, and i can dorun on it to get it to run immediately...if i just stick all that in a future and deref the future at the end of my main thread, I should get the desired effect

21:33 chomwitt: amalloy: u r right . i'm sorry

21:33 amalloy: chomwitt: no harm done. you didn't make a big paste, and justin_smith found your error without needing a full trace

21:34 justin_smith: I still need to make that "common error messages in clojure and what they usually mean" website

21:34 god damned day jobs and laziness make it so nothing gets done

21:36 amalloy: error message #1: website delayed by laziness

21:36 justin_smith: haha

22:39 mistabiz: say I have a set of dominoes, [ 0 , 0 ] to [ 6 , 6 ], how would i write it to give me each dominoe combo

22:41 TEttinger: &(for [a (range 6) b (range 6)] [a b])

22:41 lazybot: ⇒ ([0 0] [0 1] [0 2] [0 3] [0 4] [0 5] [1 0] [1 1] [1 2] [1 3] [1 4] [1 5] [2 0] [2 1] [2 2] [2 3] [2 4] [2 5] [3 0] [3 1] [3 2] [3 3] [3 4] [3 5] [4 0] [4 1] [4 2] [4 3] [4 4] [4 5] [5 0] [5 1] [5 2] [5 3] [5 4] [5 5])

22:41 TEttinger: &(for [a (range 7) b (range 7)] [a b]) ; rather

22:41 lazybot: ⇒ ([0 0] [0 1] [0 2] [0 3] [0 4] [0 5] [0 6] [1 0] [1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [2 0] [2 1] [2 2] [2 3] [2 4] [2 5] [2 6] [3 0] [3 1] [3 2] [3 3] [3 4] [3 5] [3 6] [4 0] [4 1] [4 2] [4 3] [4 4] [4 5] [4 6] [5 0] [5 1] [5 2] [5 3] [5 4] [5 5] [5 6] [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6])

22:42 mistabiz: so [0,1] [1,0] are the same dominoe

22:42 clojurebot: Huh?

22:43 TEttinger: ah, now we're talking

22:45 &(distinct (for [a (range 7) b (range 7)] (sort [a b]))) ;; naive way

22:45 lazybot: ⇒ ((0 0) (0 1) (0 2) (0 3) (0 4) (0 5) (0 6) (1 1) (1 2) (1 3) (1 4) (1 5) (1 6) (2 2) (2 3) (2 4) (2 5) (2 6) (3 3) (3 4) (3 5) (3 6) (4 4) (4 5) (4 6) (5 5) (5 6) (6 6))

22:45 mistabiz: so now make the magic with no alternating pairs [0 1] [1 0] [1 2] [2 1]

22:45 oop

22:46 distinct huh

22:46 TEttinger: very useful, similar to how sets work in clojure

22:46 &(into #{} (for [a (range 7) b (range 7)] (sort [a b]))) ;; naive way

22:46 lazybot: ⇒ #{(2 2) (0 0) (2 3) (2 5) (0 6) (3 3) (1 1) (0 5) (3 4) (6 6) (4 6) (1 4) (1 3) (1 5) (0 3) (5 6) (5 5) (2 4) (3 6) (4 5) (0 2) (0 4) (1 6) (4 4) (2 6) (1 2) (3 5) (0 1)}

22:46 TEttinger: looks like the same length, right?

22:46 same collection just unsorted

22:47 mistabiz: cool

22:55 thanks

23:28 reutermj: How do you get metadata of a var from a macro?

23:29 amalloy: TEttinger: it's easier to just not generate the duplicates to begin with

23:29 TEttinger: yeah, I forgot how to do that

23:29 amalloy: ,(for [a (range 7) b (range (inc a))] [a b])

23:29 reutermj: doing (meta sym) gives me line number and files

23:29 clojurebot: ([0 0] [1 0] [1 1] [2 0] [2 1] ...)

23:29 TEttinger: ah!

23:29 amalloy: &(for [a (range 7) b (range (inc a))] [a b])

23:29 lazybot: ⇒ ([0 0] [1 0] [1 1] [2 0] [2 1] [2 2] [3 0] [3 1] [3 2] [3 3] [4 0] [4 1] [4 2] [4 3] [4 4] [5 0] [5 1] [5 2] [5 3] [5 4] [5 5] [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6])

23:30 TEttinger: (inc amalloy) ;; the usual

23:30 lazybot: ⇒ 299

23:30 TEttinger: getting close!

23:30 justin_smith: reutermj: ##[(meta +) (mega #'+)]

23:30 lazybot: java.lang.RuntimeException: Unable to resolve symbol: mega in this context

23:30 justin_smith: err

23:30 reutermj: ##[(meta +) (meta #'+)]

23:30 lazybot: ⇒ [nil {:added "1.2", :ns #<Namespace clojure.core>, :name +, :file "clojure/core.clj", :inline-arities #<core$_GT_1_QMARK_ clojure.core$_GT_1_QMARK_@35abfed1>, :column 1, :line 945, :arglists ([] [x] [x y] [x y & more]), :doc "Returns the sum of nums. (+) returns 0. ... https://www.refheap.com/109201

23:30 amalloy: i'm more looking forward to when justin_smith catches up, so i can give him the honorary final +1

23:31 justin_smith: aww, shucks

23:31 (identity justin_smith)

23:31 lazybot: justin_smith has karma 293.

23:31 justin_smith: SO CLOSE

23:32 rhg135: I should go find a problem

23:43 reutermj: justin_smith: Thanks!

Logging service provided by n01se.net