#clojure log - Mar 04 2016

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

0:46 michaelrose: so stupid question time, I'm just starting to learn clojure and know some basic stuff however I'm not going to have a proper internet connection for probably a matter of weeks at least is it reasonable to just download a copy of clojars so that if I decide to check out insert library here I have a local copy of some relatively recent version of it?

0:50 TimMc: michaelrose: That would do part of the job -- but there are plenty of things on Maven Central that you'd need as well.

0:51 michaelrose: how much space would be required for both?

0:53 TimMc: Good question!

0:54 michaelrose: so resyncing clojars data part of the way through afterglow and at 500MB

0:54 TimMc: OK, just my personal computer's .m2/repository is 435 MB, for reference.

0:54 michaelrose: but there is no reason to suppose anything should be evenly distributed

0:55 TimMc: right

0:55 and my work computer's m2 is 3.6 GB

0:56 We're probably talking in the 100s of GB range.

0:56 yonatankoren: michaelrose: I did most of the 4clojure problems and that was really fun and taught me a lot about the language. You can download the website from github and run it on your local machine. I highly recommend you do that.

0:57 michaelrose: The website gives you a bunch of challenges and verifies your answers

0:57 michaelrose: kinda wanted to do more than misc exercises but perhaps I should just peruse some stuff and pick up things I would be most likely to be useful

0:57 yonatankoren: michaelrose: and they're not dead-simple problems or narrow problems either, they allow you to be very creative at times and in my opinion it's a great way to learn the language

0:59 michaelrose: it all depends on what you wanna be coding. If you have ideas in mind for programs you wanna create then go right ahead and jump into it. But my recommendation is clone the repo and have apache handy anyways before you leave your internet access

0:59 you may change your mind and try them later

1:04 TimMc: michaelrose: Heh, I let myself get sidetracked by the question of how much of clojars + central would you have to download to get good coverage. yonatankoren is right, just get a set of tutorials or problem sets to play with. :-)

1:05 amalloy: yonatankoren: note that 4clojure's problem set is stored in a database, not in the source on github. there's a "starter kit" of problems in the source you can use when debugging, but it's not all of them

1:05 yonatankoren: amalloy: oh... Didn't know that. Oh and thanks for creating 4clojure lol, I had a lot of fun with it

1:06 amalloy: So what would you recommend if you were to try doing all the problems offline?

1:06 amalloy: download https://github.com/aengelberg/lein-4clj and write a quick little script that uses it to download all the problems in advance

1:07 though it looks like it doesn't download the problem descriptions, which is a bit of a bummer

1:08 michaelrose: I'm checking out the idea of running a local copy of 4clojure

1:09 amalloy: and there are quite a few problems in the starter kit; you could get some mileage out of running a local copy

1:09 you wouldn't do all the problems, but you'd do a lot

1:09 yonatankoren: doing all the problems would take a few months unless you go full hermit

1:10 well... in my schedule it looks like it would take months

1:10 maybe i'm not hardcore enough

1:11 michaelrose: so if I add libraries foo bar and baz to a test project and run a repl it will cache a local copy of everything and then I can use lein's offline variable to ensure lein doesn't hang forever trying to go online right?


1:12 amalloy: that's the idea, yeah

1:13 michaelrose: well I guess with a decent set of problems, supply of books, and enough downloaded to enjoyably test the above I should be able to stay occupied without internet access for some weeks

1:17 yonatankoren: michaelrose: are you a geologist?

1:17 michaelrose: no a povertologist

1:19 aka known as working in the retail sector, wifes out of work due to health issues, hours are garbage atm, and internet is expensive here

1:20 costs $80 for 12Mbps dsl

1:21 yonatankoren: michaelrose: Ah i see

1:22 Hope you enjoy Clojure though, it's a wonderful language. Really good community and also 4clojure is an amazing problem set

1:22 oh and that all is well in your personal life

1:25 michaelrose: its ok just not rich in material goods

1:25 building the prerequisites to running 4clojure locally

2:12 renl: in play-clj how do i draw an additional dot in an existing shape?

3:07 hi im trying to expand an vector into a macro's argument list, I tried (eval (concat '(thatmacro) [args...])) but i get this Caused by: java.lang.RuntimeException: Unable to resolve symbol: shape in this context, where shape is the macro

3:45 michaelrose: experiencing a tad bit of trouble running 4clojure locally

3:47 mongod dies complaining that data/db doesn't exist, there is a load-data.sh but it fails for lack of connection to mongo I think

4:04 oh duh it needs /data/db to exist not a data/db inside the project dir

4:15 ok so I can run 4clojure and interact with the website with my browser but I get java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader") trying to run anything

4:17 amalloy: michaelrose: follow the steps in the readme

4:17 specifically you have neglected to follow the third bullet point in https://github.com/4clojure/4clojure#setup-instructions-for-running-locally

4:17 michaelrose: actually I did

4:18 actually I may have made a small typo

4:19 amalloy: haha

4:20 michaelrose: lol right I didn't just not bother to read and expect you to read it to me though

4:20 amalloy: you'd be surprised

4:32 michaelrose: whoah uses a gig of ram

4:39 qsys: hey... anyone got datomic running on openshift? - if so, how? I'm running into https://groups.google.com/forum/#!searchin/datomic/openshift/datomic/Dvf8B3-ZMFQ/IHJybXb9jngJ , but there doesn't seem to be a solution

4:40 - or maybe I should ask this in datomic chat :p

4:40 lokien_: Hello guys. How big can one atom be?

4:41 Will it collapse when I overload it with data?

4:43 amalloy: michaelrose: just set your -Xmx to something reasonable

4:43 michaelrose: so did notice that the local copy doesn't have the exact same problem set though

4:43 amalloy: 4clojure doesn't need anywhere near a gig of ram, but if you let java have as much memory as it wants it'll take a lot

4:45 lokien_: amalloy: really? sweet!

4:45 amalloy: the real server runs with -Xmx80m i think, but a development copy can easily run with -Xmx40m

4:46 even the real server should be fine with 40m, but there's some dumb code that runs at startup that uses a bunch of unnecessary memory

4:48 lokien_: ah, it wasn't for me

4:53 michaelrose: ok dataset.clj is where the problems are stored

4:56 schmir: lokien_: don't worry. atom's take any value you put into them.

5:05 michaelrose: so maybe I'm missing something but the official 4clojure has more problems but I don't quite see how additional sources would be configured

5:09 lokien_: schmir: even like 80-meg nested vector?

5:44 schmir: lokien_: sure. the only problem you may run into is when updating concurrently from multiple threads (and if those updates conflict, i.e. have to be retried)

5:58 lokien: schmir: thanks!

7:49 nicola1: i'm generating a java class with :gen-class, and i'm having trouble figuring out how to specify a function's argument as "list of strings"; any idea where to look?

7:53 i could cheat i guess and write (type (into-array [""]))

7:53 but is there a better solution?

7:54 (actually no, that's an array, not a list)

8:00 from what i understand, i can say java.util.List, but can't really express java.util.List<String>

8:08 hyPiRion: nicola1: Do you want an array or strings, or a list of strings?

8:09 Ah, well, I guess this should answer your question: http://stackoverflow.com/questions/3688730/how-to-pass-a-typed-collection-from-clojure-to-java

8:10 Clojure has no explicit way to handle generics, as it works directly on the jvm. Only Javac handles generics, but that's in the compilation phase, and it's not stored in the runtime

8:10 runtime code*

8:34 nicola1: thanks hyPiRion

8:35 for now i'm settling on assuming that the caller knows the return type

8:35 pretty much the map is always string to double, sometimes to array

8:36 but the interface trick seems very interesting!

8:41 hyPiRion: Yeah, that's usually fine, at least from my experience

9:19 Akabander: Anyone up for answering a Liberator question?

9:21 We're trying to figure out how to get a response back from a POST request. It seems like only GET resources actually send a response back through :handle-ok

9:22 We can execute code via the resource using the :post! clause and print params to the REPL from inside the code, but it doesn't return anything to the curl that made the connection.

9:31 brokenrobot: I pulled in a Java dependency, and when I try to import it I get the Unsupported majjor.minor version 52.0 error. Any tips on how I can fix this (using leinigen, cursive)

9:33 ridcully: brokenrobot: the thing is built with java 8

9:33 you are running it with java < 8

9:35 brokenrobot: ridcully: thanks, how can I change it to run in java 8? is that a setting in leinigen, or is that the environment variable lein_java_cmd?

9:38 ach, was in ~/.lein/profiles.clj

10:41 sdegutis: Hi yall.

10:41 Sys32: Greeting

11:10 sdegutis: How are you.

11:11 justin_smith: nicola1: wait, array or string? with array your type is "[Ljava.lang.String;" (inside quotes because of the unbalanced brace), for List it's java.util.List

11:11 err, I mean array or list of course

12:57 sdegutis: Well, look.

12:57 See, it's just that.

13:03 Hi.

13:10 WorldsEndless: I have a javadoc jar file. I want to read some javadocs. What should I do?

13:20 justin_smith: WorldsEndless: have you checked out the stuff in clojure.java.javadoc?

13:21 ,(require 'clojure.java.javadoc)

13:21 clojurebot: #error {\n :cause "denied"\n :via\n [{:type java.lang.ExceptionInInitializerError\n :message nil\n :at [java.lang.Class forName0 "Class.java" -2]}\n {:type java.lang.SecurityException\n :message "denied"\n :at [clojurebot.sandbox$enable_security_manager$fn__835 invoke "sandbox.clj" 69]}]\n :trace\n [[clojurebot.sandbox$enable_security_manager$fn__835 invoke "sandbox.clj" 69]\n [clojurebo...

13:21 justin_smith: :P

13:22 WorldsEndless: clojurebot won't cooperate, but there's a function clojure.java.javadoc/add-local-javadoc that likely helps

13:22 and then clojure.java.javadoc/javadoc

13:39 sdegutis: How are you tho

13:39 where'd lazybot go?

13:55 OscarZ: when do you need letfn ? i have some trouble understanding the docs

13:56 rcassidy: letfn gives you the ability to define mutually recursive functions

13:57 aka two functions that each reference each other.

13:58 OscarZ: oh i see.. they will be just local functions visible inside body of letfn ?

13:59 theres no other use case except mutually recursive functions?

14:00 sdegutis: OscarZ: mutually recursive anonymous functions

14:00 OscarZ: correct, that's the only use

14:00 OscarZ: if you need two mutually recursive functions but they can be named, defn is still sufficient

14:01 OscarZ: and if you need one recursive anonymous function, you can give (fn) a name, like (fn foo [x] (if (pos? x) x (foo (dec x))))

14:01 ,((fn foo [x] (if (neg? x) x (foo (dec x)))) 10)

14:01 clojurebot: -1

14:02 amalloy: haha, i know it's only an example, but that is a pretty funny recursive function

14:02 sdegutis: amalloy: which one, the broken one or the working one?

14:02 amalloy: the broken one

14:02 sdegutis: amalloy: the broken one's funny cuz its broken, that's for sure

14:02 amalloy: otherwise i dont see whats funny about the working one

14:02 OscarZ: i thought that with defn you need to introduce all other functions above where you use it

14:03 sdegutis: OscarZ: no, you can use (declare) to fix that

14:03 OscarZ: or just def nil probably

14:03 OscarZ: ok

14:03 amalloy: (def nil (fn [x] (inc x))

14:04 sdegutis: ,(do (declare foo) (defn bar [x] (foo x)) (defn foo [x] (if (pos? x) (bar (dec x)) x)) (foo 10))

14:04 clojurebot: 0

14:04 sdegutis: I have no idea how to do recursion properly as you can plainly see.

14:04 But I can fake it well enough to pass an interview, so meh.

14:05 OscarZ: ok i see

14:08 sdegutis: do you?

14:08 do you really?

14:08 OscarZ: pop quiz: how do you define an anonymous recursive function in Clojure?

14:09 OscarZ: ok i see a glimmer of light in the end of the tunnel :)

14:09 i ment i understood the declare part :)

14:11 i dont know how to do anonymous recursive .. i suppose i kinda understand how the letfn works with named functions

14:13 sdegutis: OscarZ: hint: i just explained it

14:15 TMA: ,((fn [x] (x 1)) (fn [x] (+ x 2)))

14:15 clojurebot: 3

14:15 TMA: sdegutis: why, with Y combinator of course

14:15 sdegutis: TMA: sorry i dont know what that is

14:16 TMA: also your example really confuses me please use proper indentation and lines for enhanced readability thanks

14:17 OscarZ: sorry which one was anonymous recursive ?

14:19 i misunderstood.. i was thinking mutually recursive anonymous :) yeah i understood the (fn foo [x] ...) thing

14:19 sdegutis: OscarZ: ok

14:20 TMA: that's kind of neat how that works

14:20 TMA: why is that such an important line of code?

14:21 rcassidy: because recursion!

14:22 TMA: sdegutis: that is not the y-combinator ... that was just a quick test for me to make sure clojure is a lisp-1 and that there is no gotcha

14:22 sdegutis: TMA: oh. well there kinda is a gotcha

14:22 TMA: i mean, name-resolution has some gotchas

14:23 TMA: the clojure-code "foo" seems to translate into "(var-get '#foo)" or something at compile-time

14:23 TMA: so that if you update the root of foo, all instances of "foo" in the code reflect the new one

14:24 TMA: ,( ( (fn [f] ((fn [x] (f (x x))) (fn [x] (f (x x))))) (fn [fact n] (if (< n 1) 1 (* (fact (dec n)) n))) ) 4)

14:24 clojurebot: #error {\n :cause nil\n :via\n [{:type java.lang.StackOverflowError\n :message nil\n :at [sandbox$eval53$fn__54$fn__57 invoke "NO_SOURCE_FILE" -1]}]\n :trace\n [[sandbox$eval53$fn__54$fn__57 invoke "NO_SOURCE_FILE" -1]\n [sandbox$eval53$fn__54$fn__57 invoke "NO_SOURCE_FILE" 0]\n [sandbox$eval53$fn__54$fn__57 invoke "NO_SOURCE_FILE" 0]\n [sandbox$eval53$fn__54$fn__57 invoke "NO_SOURCE_FILE" ...

14:29 sdegutis: TMA: wowsers

14:29 TMA: oh, I transcribed it in a pointless style, which in clojure it is not posible

14:29 *pointfree

14:29 postpunkjustin: same difference

14:33 TMA: ,( ( (fn [g] ((fn [f] (g (fn [x] ((f f) x)))) (fn [f] (g (fn [x] ((f f) x)))))) (fn [fact] (fn [n] (if (< n 1) 1 (* (fact (dec n)) n)))) ) 4) n)))) ) 4)

14:33 clojurebot: 24

14:34 TMA: the abomination (fn [g] ((fn [f] (g (fn [x] ((f f) x)))) (fn [f] (g (fn [x] ((f f) x)))))) is the Y-combinator

14:34 the (fn [fact] ...) is a factorial generator

14:36 it is a function, that takes a function and returs another such that if you provide a factorial function as an input, you get factorial function as an output, hence factorial is a fixed point of the generator

14:37 the Y-combinator is a function that gets a generator and returns its fixed point

14:39 sdegutis: there is no free variable (not counting cojure.core/if clojure.core/< ...) so there shall be no problem with var-get getting into way

14:40 fantazo: when would someone need a y-combinator in real life?

14:42 TMA: fantazo: real word usage is exceedingly rare. I gather it might prove useful in certain limited circumstances like exploit payload

14:42 fantazo: exploit payload?

14:42 TMA: fantazo: on the other hand, it might even be useful somewhere in compiler guts

14:43 justin_smith: fantazo: when you haxor someones computerz you need to make it run your code, which is in the payload, and needs to be injected into some context

14:43 TMA: fantazo: if clojurebot were more restricted (say disallowing named fns, def, defn, ...) you could still make use of recursive functions

14:43 fantazo: what are good reading resources for picking up concepts like the y-combinator? I only now it from the name, but I haven't yet understood it.

14:45 ok, I wasn't sure if you use a different meaning of "exploit payload" or the common one.

14:45 ystael: fantazo: have you read 'Structure and interpretation of computer programs'? that's where I learned my lisp basics, anyway

14:46 fantazo: ystael, I had that book open multiple times, but I found it too boring to actually read it.

14:47 ystael: well, if you're interested in learning more about things related to the Y combinator and other foundational ideas of lambda calculus/functional programming, but you found SICP boring, I don't know what to tell you

14:47 TMA: fantazo: it is quite hard to understand. I thought I had understood it in the past but now, it is as arcane as it was in the beginning

14:48 fantazo: this is as easy derivation as you can possibly get: http://dangermouse.brynmawr.edu/cs245/ycomb_jim.html [it is in scheme, so read (lambda (a...) b...) as (fn [a...] b...) if you need clojure]

14:49 aep-shoutlet: how do i dynamically query the current namespace? e.g. (println namespace) should print "boo" inside of a (ns boo) clojure file

14:50 ystael: fantazo: If you're interested specifically in studying functional programming languages and their implementation from a structural perspective, you could try Friedman & Wand, Essentials of programming languages

14:50 they get fairly foundational about recursion, its meaning and its practical realization

14:50 hiredman: aep-shoutlet: the "current namespace" is only a thing for compilation

14:51 aep-shoutlet: is there a way to access the current clojure class?

14:51 hiredman: aep-shoutlet: what do you mean by that?

14:51 aep-shoutlet: clj equivalent of this.getClass().getSimpleName() ?

14:51 hiredman: aep-shoutlet: every clojure function is compiled to its own class

14:52 TMA: fantazo: you can use modified combinator like in this example for logging and memoization http://www.viksit.com/tags/clojure/practical-applications-y-combinator-clojure/

14:52 aep-shoutlet: can i get the namespace of the current function?

14:52 hiredman: aep-shoutlet: functions don't have a namespace

14:52 TMA: fantazo: but the vanilla Y is rare

14:52 hiredman: aep-shoutlet: names are namespaced, and functions are values that van be bound to names

14:53 aep-shoutlet: high level goal: have a Clojure CLI program know how to print its own name, e.g. for usage messages

14:53 rather than hardcoding it

14:54 hiredman: what does the name of the executable (the cli program name) have to do with namespace names?

14:54 aep-shoutlet: meh, i'll use http://stackoverflow.com/questions/9694754/clojure-how-to-get-the-path-of-a-running-jar-root-source-directory/13276993#13276993 for now

15:01 fantazo: hmm, maybe I should try a epub version of sicp and not trying to read a webpage. I don't like it to read long webpages.

15:04 aep-shoutlet: is there a way to prevent -main from leaking out of a ns into another ns? like a ns excludes list?

15:04 hiredman: what does that mean?

15:04 aep-shoutlet: or :use x.y.z but hide some function f?

15:05 hiredman: don't use :use

15:05 use :require

15:05 sdegutis: Also, prefer :as

15:05 I wish I'd learned that years ago, cuz :as is way better than :refer [...]

15:06 And everything is better than :refer :all, since that's basically :use.

15:08 aep-shoutlet: require with as works like a charm

15:08 sdegutis: Yeah it's great.

15:08 rcassidy: there's also :refer with :exclude

15:08 just in case!

15:08 sdegutis: rcassidy: but.. but...

15:09 rcassidy: i'm actually still learning the nuances on this so feel free to edumacate me

15:11 sdegutis: rcassidy: I've used :refer [...] for a few years almost exclusively, and it's had problems

15:11 rcassidy: for one thing, the (:require) block gets ridiculously, unreasonably wide

15:12 rcassidy: also, if you have a clash between symbol-names between different namespaces, it gets ugly and you either have to rename things (sometimes with an ugly prefix), or just switch to using :as for that one require

15:12 rcassidy: and then there's the fact that it can become difficult to know where something is defined while looking in the source file that uses the refer'd symbols

15:12 rcassidy: makes sense!

15:13 sdegutis: I much prefer doing like (:require [cleancoders.util.css :as css]) and then later (css/transform ["h3" {:font-size "150%"}]) for a few reasons

15:13 rcassidy: the code i'm working with mostly uses :require, I was just looking around the clojure docs for ways to explicitly exclude particular names

15:13 yep, that's the form i'm used to as well.

15:13 sdegutis: One major benefit is that this style allows you to keep your symbol names real short, like (transform).

15:14 Otherwise it'd have to be something dumb like (defn transform-css [...] ...)

15:14 Perhaps I should just write stuff in blogs instead of in giant blocks on IRC

15:14 But the problem with that is nobody would see it, whereas at least in IRC about 3 people end up reading it.

15:15 rcassidy: heh

15:15 heh

15:15 oops

15:15 amalloy: joke's on you, sdegutis, i shadowbanned you long ago. nobody can see what you write

15:15 sdegutis: amalloy: that explains a lot

15:16 milia: amalloy: who are you talking to ?

15:16 ah, ok

15:18 lokien: sdegutis: start a blog! start a blog!

15:18 sdegutis: lokien: no.

15:18 lokien: sdegutis: sadface.png

15:18 sdegutis: lokien: meh.png

15:19 rcassidy: start a blog that's explicitly IRC log snippets

15:19 sdegutis: ok

15:20 lokien: like.. bash.org?

15:20 rcassidy: no, like, sdegutils explains clojure line by line

15:20 sdegutis: oh man

15:20 sdegutils: how could i forget

15:20 lokien: sdegutils: :D

15:22 rcassidy: I'm sure many people would pay for that

15:22 sdegutils: Technically I have sdegutis.github.io

15:22 But that was a stupid idea.

15:24 lokien: sdegutils: I'd read that and became sad because of too little things to read :/

15:24 like, no 2016 stuff

15:24 sdegutils: lokien: lol you actually read that?

15:24 man, you must b bored

15:24 lokien: sdegutils: no, I wanted to read something cool

15:25 sdegutils: How's Github Pages as a blog engine lately?

15:25 Is it easier than it used to be yet?

15:26 lokien: sdegutils: you can use something like this guy, static blog in haskell https://artyom.me/

15:26 sdegutils: lokien: way too much work plus not compatible with github pages and not having to install anything locally

15:27 rcassidy: been meaning to put a blog on rcassidy.net but haven't yet

15:27 sdegutils: rcassidy: you can do it! i believe in u!

15:27 rcassidy: maybe I will!!

15:27 all that's on there now is an old doodle

15:28 lokien: sdegutils: 'kay >:c

15:39 TimMc: rcassidy: One of these days I'm going to replace my WordPress blog with a static site.

15:40 maybe a Clojure-based generator

15:42 sdegutils: TimMc: why not just use github pages like everyone else?

15:43 TimMc: "everyone else"

15:43 sdegutils: yep

15:43 and i stand by it

15:44 TimMc: Because I like having some modicum of control over my words and expression and URLs.

15:44 aep-shoutlet: help, this hangs: (defn -main [& args] (doall (pmap print "Hello World!\n")))

15:44 TimMc: As it is now, it's just between me and my hosting provider.

15:44 sdegutils: TimMc: github pages doesnt not give yo uthose

15:44 rcassidy: I loved how all the NEU profs used weird racket site generators for their neu.edu pages.

15:44 sdegutils: TimMc: ok whatever floats your boat

15:45 aep-shoutlet: why are you using pmap?

15:45 amalloy: aep-shoutlet: google around for "shutdown-agents"

15:45 aep-shoutlet: it's just a hello world exercise, printing each char in parallel (scrambled)

15:45 sdegutils: aep-shoutlet: and why are you using doall? and why print?

15:45 amalloy: you'll find many people with the same question, and some good answers

15:45 sdegutils: oh

15:45 ok

15:45 amalloy: you forgot to ask why -main

15:46 aep-shoutlet: this used to work in an earlier clojure version, maybe 1.7 changed things?

15:48 amalloy: aep-shoutlet: it behaves exactly the same as it did before. it prints all the things, and then it waits around for a minute or two, and then your program finishes

15:48 aep-shoutlet: amalloy: with gradle, it mostly just hangs on silent output

15:49 amalloy: gradle? huh?

15:49 aep-shoutlet: after about 60 seconds, it finally quits, still no output. do i need a flush or two in there?

15:49 amalloy: oh, yeah, since you're using print instead of println

15:49 System/out flushes on newlines by default

15:51 aep-shoutlet: just needed flush, thanks

16:03 cortexman: can a let bound variable be modified by a function without re-letting it?

16:03 justin_smith: it cannot be modified period

16:03 re-letting is simply shadowing, it doesn't change it, just hides it

16:04 ,(let [a 0 b (inc a) a 2] b)

16:04 clojurebot: 1

16:04 cortexman: in order to avoid side effects (ie an atom) i am doing (let [some-lookup-table {} ...

16:04 i have some redundant code that is interacting with this lookup table (i.e., assoc'ing to it), that i'd like to wrap up

16:04 in a defn

16:05 justin_smith: best bet is usually to make another binding in the same let block, using the return value of a function

16:07 ,(let [m0 {} m1 (assoc m0 :a 0) m2 (assoc m1 :b 2)] [m0 m1 m2])

16:07 clojurebot: [{} {:a 0} {:a 0, :b 2}]

16:08 cortexman: specifically the if sections

16:08 hmm.

16:47 Kamuela: i think clojure has made me think about how almost any good language is domain specific

Logging service provided by n01se.net