#clojure logs

2016-03-04

00:46michaelroseso 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?
00:50TimMcmichaelrose: That would do part of the job -- but there are plenty of things on Maven Central that you'd need as well.
00:51michaelrosehow much space would be required for both?
00:53TimMcGood question!
00:54michaelroseso resyncing clojars data part of the way through afterglow and at 500MB
00:54TimMcOK, just my personal computer's .m2/repository is 435 MB, for reference.
00:54michaelrosebut there is no reason to suppose anything should be evenly distributed
00:55TimMcright
00:55TimMcand my work computer's m2 is 3.6 GB
00:56TimMcWe're probably talking in the 100s of GB range.
00:56yonatankorenmichaelrose: 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.
00:57yonatankorenmichaelrose: The website gives you a bunch of challenges and verifies your answers
00:57michaelrosekinda 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
00:57yonatankorenmichaelrose: 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
00:59yonatankorenmichaelrose: 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
00:59yonatankorenyou may change your mind and try them later
01:04TimMcmichaelrose: 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. :-)
01:05amalloyyonatankoren: 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
01:05yonatankorenamalloy: oh... Didn't know that. Oh and thanks for creating 4clojure lol, I had a lot of fun with it
01:06yonatankorenamalloy: So what would you recommend if you were to try doing all the problems offline?
01:06amalloydownload https://github.com/aengelberg/lein-4clj and write a quick little script that uses it to download all the problems in advance
01:07amalloythough it looks like it doesn't download the problem descriptions, which is a bit of a bummer
01:08michaelroseI'm checking out the idea of running a local copy of 4clojure
01:09amalloyand there are quite a few problems in the starter kit; you could get some mileage out of running a local copy
01:09amalloyyou wouldn't do all the problems, but you'd do a lot
01:09yonatankorendoing all the problems would take a few months unless you go full hermit
01:10yonatankorenwell... in my schedule it looks like it would take months
01:10yonatankorenmaybe i'm not hardcore enough
01:11michaelroseso 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?
01:11michaelroseLEIN_OFFLINE
01:12amalloythat's the idea, yeah
01:13michaelrosewell 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
01:17yonatankorenmichaelrose: are you a geologist?
01:17michaelroseno a povertologist
01:19michaelroseaka known as working in the retail sector, wifes out of work due to health issues, hours are garbage atm, and internet is expensive here
01:20michaelrosecosts $80 for 12Mbps dsl
01:21yonatankorenmichaelrose: Ah i see
01:22yonatankorenHope you enjoy Clojure though, it's a wonderful language. Really good community and also 4clojure is an amazing problem set
01:22yonatankorenoh and that all is well in your personal life
01:25michaelroseits ok just not rich in material goods
01:25michaelrosebuilding the prerequisites to running 4clojure locally
02:12renlin play-clj how do i draw an additional dot in an existing shape?
03:07renlhi 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
03:45michaelroseexperiencing a tad bit of trouble running 4clojure locally
03:47michaelrosemongod 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
04:04michaelroseoh duh it needs /data/db to exist not a data/db inside the project dir
04:15michaelroseok 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
04:17amalloymichaelrose: follow the steps in the readme
04:17amalloyspecifically you have neglected to follow the third bullet point in https://github.com/4clojure/4clojure#setup-instructions-for-running-locally
04:17michaelroseactually I did
04:18michaelroseactually I may have made a small typo
04:19amalloyhaha
04:20michaelroselol right I didn't just not bother to read and expect you to read it to me though
04:20amalloyyou'd be surprised
04:32michaelrosewhoah uses a gig of ram
04:39qsyshey... 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
04:40qsys- or maybe I should ask this in datomic chat :p
04:40lokien_Hello guys. How big can one atom be?
04:41lokien_Will it collapse when I overload it with data?
04:43amalloymichaelrose: just set your -Xmx to something reasonable
04:43michaelroseso did notice that the local copy doesn't have the exact same problem set though
04:43amalloy4clojure 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
04:45lokien_amalloy: really? sweet!
04:45amalloythe real server runs with -Xmx80m i think, but a development copy can easily run with -Xmx40m
04:46amalloyeven 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
04:48lokien_ah, it wasn't for me
04:53michaelroseok dataset.clj is where the problems are stored
04:56schmirlokien_: don't worry. atom's take any value you put into them.
05:05michaelroseso maybe I'm missing something but the official 4clojure has more problems but I don't quite see how additional sources would be configured
05:09lokien_schmir: even like 80-meg nested vector?
05:44schmirlokien_: 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)
05:58lokienschmir: thanks!
07:49nicola1i'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?
07:53nicola1i could cheat i guess and write (type (into-array [""]))
07:53nicola1but is there a better solution?
07:54nicola1(actually no, that's an array, not a list)
08:00nicola1from what i understand, i can say java.util.List, but can't really express java.util.List<String>
08:08hyPiRionnicola1: Do you want an array or strings, or a list of strings?
08:09hyPiRionAh, well, I guess this should answer your question: http://stackoverflow.com/questions/3688730/how-to-pass-a-typed-collection-from-clojure-to-java
08:10hyPiRionClojure 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
08:10hyPiRionruntime code*
08:34nicola1thanks hyPiRion
08:35nicola1for now i'm settling on assuming that the caller knows the return type
08:35nicola1pretty much the map is always string to double, sometimes to array
08:36nicola1but the interface trick seems very interesting!
08:41hyPiRionYeah, that's usually fine, at least from my experience
09:19AkabanderAnyone up for answering a Liberator question?
09:21AkabanderWe'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
09:22AkabanderWe 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.
09:31brokenrobotI 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)
09:33ridcullybrokenrobot: the thing is built with java 8
09:33ridcullyyou are running it with java < 8
09:35brokenrobotridcully: 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?
09:38brokenrobotach, was in ~/.lein/profiles.clj
10:41sdegutisHi yall.
10:41Sys32Greeting
11:10sdegutisHow are you.
11:11justin_smithnicola1: 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:11justin_smitherr, I mean array or list of course
12:57sdegutisWell, look.
12:57sdegutisSee, it's just that.
13:03sdegutisHi.
13:10WorldsEndlessI have a javadoc jar file. I want to read some javadocs. What should I do?
13:20justin_smithWorldsEndless: have you checked out the stuff in clojure.java.javadoc?
13:21justin_smith,(require 'clojure.java.javadoc)
13:21clojurebot#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:21justin_smith:P
13:22justin_smithWorldsEndless: clojurebot won't cooperate, but there's a function clojure.java.javadoc/add-local-javadoc that likely helps
13:22justin_smithand then clojure.java.javadoc/javadoc
13:39sdegutisHow are you tho
13:39sdegutiswhere'd lazybot go?
13:55OscarZwhen do you need letfn ? i have some trouble understanding the docs
13:56rcassidyletfn gives you the ability to define mutually recursive functions
13:57rcassidyaka two functions that each reference each other.
13:58OscarZoh i see.. they will be just local functions visible inside body of letfn ?
13:59OscarZtheres no other use case except mutually recursive functions?
14:00sdegutisOscarZ: mutually recursive anonymous functions
14:00sdegutisOscarZ: correct, that's the only use
14:00sdegutisOscarZ: if you need two mutually recursive functions but they can be named, defn is still sufficient
14:01sdegutisOscarZ: 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:01sdegutis,((fn foo [x] (if (neg? x) x (foo (dec x)))) 10)
14:01clojurebot-1
14:02amalloyhaha, i know it's only an example, but that is a pretty funny recursive function
14:02sdegutisamalloy: which one, the broken one or the working one?
14:02amalloythe broken one
14:02sdegutisamalloy: the broken one's funny cuz its broken, that's for sure
14:02sdegutisamalloy: otherwise i dont see whats funny about the working one
14:02OscarZi thought that with defn you need to introduce all other functions above where you use it
14:03sdegutisOscarZ: no, you can use (declare) to fix that
14:03sdegutisOscarZ: or just def nil probably
14:03OscarZok
14:03amalloy(def nil (fn [x] (inc x))
14:04sdegutis,(do (declare foo) (defn bar [x] (foo x)) (defn foo [x] (if (pos? x) (bar (dec x)) x)) (foo 10))
14:04clojurebot0
14:04sdegutisI have no idea how to do recursion properly as you can plainly see.
14:04sdegutisBut I can fake it well enough to pass an interview, so meh.
14:05OscarZok i see
14:08sdegutisdo you?
14:08sdegutisdo you really?
14:08sdegutisOscarZ: pop quiz: how do you define an anonymous recursive function in Clojure?
14:09OscarZok i see a glimmer of light in the end of the tunnel :)
14:09OscarZi ment i understood the declare part :)
14:11OscarZi dont know how to do anonymous recursive .. i suppose i kinda understand how the letfn works with named functions
14:13sdegutisOscarZ: hint: i just explained it
14:15TMA,((fn [x] (x 1)) (fn [x] (+ x 2)))
14:15clojurebot3
14:15TMAsdegutis: why, with Y combinator of course
14:15sdegutisTMA: sorry i dont know what that is
14:16sdegutisTMA: also your example really confuses me please use proper indentation and lines for enhanced readability thanks
14:17OscarZsorry which one was anonymous recursive ?
14:19OscarZi misunderstood.. i was thinking mutually recursive anonymous :) yeah i understood the (fn foo [x] ...) thing
14:19sdegutisOscarZ: ok
14:20sdegutisTMA: that's kind of neat how that works
14:20sdegutisTMA: why is that such an important line of code?
14:21rcassidybecause recursion!
14:22TMAsdegutis: 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:22sdegutisTMA: oh. well there kinda is a gotcha
14:22sdegutisTMA: i mean, name-resolution has some gotchas
14:23sdegutisTMA: the clojure-code "foo" seems to translate into "(var-get '#foo)" or something at compile-time
14:23sdegutisTMA: so that if you update the root of foo, all instances of "foo" in the code reflect the new one
14:24TMA,( ( (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:24clojurebot#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:29sdegutisTMA: wowsers
14:29TMAoh, I transcribed it in a pointless style, which in clojure it is not posible
14:29TMA*pointfree
14:29postpunkjustinsame difference
14:33TMA,( ( (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:33clojurebot24
14:34TMAthe abomination (fn [g] ((fn [f] (g (fn [x] ((f f) x)))) (fn [f] (g (fn [x] ((f f) x)))))) is the Y-combinator
14:34TMAthe (fn [fact] ...) is a factorial generator
14:36TMAit 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:37TMAthe Y-combinator is a function that gets a generator and returns its fixed point
14:39TMAsdegutis: 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:40fantazowhen would someone need a y-combinator in real life?
14:42TMAfantazo: real word usage is exceedingly rare. I gather it might prove useful in certain limited circumstances like exploit payload
14:42fantazoexploit payload?
14:42TMAfantazo: on the other hand, it might even be useful somewhere in compiler guts
14:43justin_smithfantazo: 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:43TMAfantazo: if clojurebot were more restricted (say disallowing named fns, def, defn, ...) you could still make use of recursive functions
14:43fantazowhat 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:45fantazook, I wasn't sure if you use a different meaning of "exploit payload" or the common one.
14:45ystaelfantazo: have you read 'Structure and interpretation of computer programs'? that's where I learned my lisp basics, anyway
14:46fantazoystael, I had that book open multiple times, but I found it too boring to actually read it.
14:47ystaelwell, 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:47TMAfantazo: 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:48TMAfantazo: 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:49aep-shoutlethow do i dynamically query the current namespace? e.g. (println namespace) should print "boo" inside of a (ns boo) clojure file
14:50ystaelfantazo: 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:50ystaelthey get fairly foundational about recursion, its meaning and its practical realization
14:50hiredmanaep-shoutlet: the "current namespace" is only a thing for compilation
14:51aep-shoutletis there a way to access the current clojure class?
14:51hiredmanaep-shoutlet: what do you mean by that?
14:51aep-shoutletclj equivalent of this.getClass().getSimpleName() ?
14:51hiredmanaep-shoutlet: every clojure function is compiled to its own class
14:52TMAfantazo: 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:52aep-shoutletcan i get the namespace of the current function?
14:52hiredmanaep-shoutlet: functions don't have a namespace
14:52TMAfantazo: but the vanilla Y is rare
14:52hiredmanaep-shoutlet: names are namespaced, and functions are values that van be bound to names
14:53aep-shoutlethigh level goal: have a Clojure CLI program know how to print its own name, e.g. for usage messages
14:53aep-shoutletrather than hardcoding it
14:54hiredmanwhat does the name of the executable (the cli program name) have to do with namespace names?
14:54aep-shoutletmeh, 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:01fantazohmm, 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:04aep-shoutletis there a way to prevent -main from leaking out of a ns into another ns? like a ns excludes list?
15:04hiredmanwhat does that mean?
15:04aep-shoutletor :use x.y.z but hide some function f?
15:05hiredmandon't use :use
15:05hiredmanuse :require
15:05sdegutisAlso, prefer :as
15:05sdegutisI wish I'd learned that years ago, cuz :as is way better than :refer [...]
15:06sdegutisAnd everything is better than :refer :all, since that's basically :use.
15:08aep-shoutletrequire with as works like a charm
15:08sdegutisYeah it's great.
15:08rcassidythere's also :refer with :exclude
15:08rcassidyjust in case!
15:08sdegutisrcassidy: but.. but...
15:09rcassidyi'm actually still learning the nuances on this so feel free to edumacate me
15:11sdegutisrcassidy: I've used :refer [...] for a few years almost exclusively, and it's had problems
15:11sdegutisrcassidy: for one thing, the (:require) block gets ridiculously, unreasonably wide
15:12sdegutisrcassidy: 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:12sdegutisrcassidy: 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:12rcassidymakes sense!
15:13sdegutisI much prefer doing like (:require [cleancoders.util.css :as css]) and then later (css/transform ["h3" {:font-size "150%"}]) for a few reasons
15:13rcassidythe code i'm working with mostly uses :require, I was just looking around the clojure docs for ways to explicitly exclude particular names
15:13rcassidyyep, that's the form i'm used to as well.
15:13sdegutisOne major benefit is that this style allows you to keep your symbol names real short, like (transform).
15:14sdegutisOtherwise it'd have to be something dumb like (defn transform-css [...] ...)
15:14sdegutisPerhaps I should just write stuff in blogs instead of in giant blocks on IRC
15:14sdegutisBut the problem with that is nobody would see it, whereas at least in IRC about 3 people end up reading it.
15:15rcassidyheh
15:15rcassidyheh
15:15rcassidyoops
15:15amalloyjoke's on you, sdegutis, i shadowbanned you long ago. nobody can see what you write
15:15sdegutisamalloy: that explains a lot
15:16miliaamalloy: who are you talking to ?
15:16miliaah, ok
15:18lokiensdegutis: start a blog! start a blog!
15:18sdegutislokien: no.
15:18lokiensdegutis: sadface.png
15:18sdegutislokien: meh.png
15:19rcassidystart a blog that's explicitly IRC log snippets
15:19sdegutisok
15:20lokienlike.. bash.org?
15:20rcassidyno, like, sdegutils explains clojure line by line
15:20sdegutisoh man
15:20sdegutilshow could i forget
15:20lokiensdegutils: :D
15:22lokienrcassidy: I'm sure many people would pay for that
15:22sdegutilsTechnically I have sdegutis.github.io
15:22sdegutilsBut that was a stupid idea.
15:24lokiensdegutils: I'd read that and became sad because of too little things to read :/
15:24lokienlike, no 2016 stuff
15:24sdegutilslokien: lol you actually read that?
15:24sdegutilsman, you must b bored
15:24lokiensdegutils: no, I wanted to read something cool
15:25sdegutilsHow's Github Pages as a blog engine lately?
15:25sdegutilsIs it easier than it used to be yet?
15:26lokiensdegutils: you can use something like this guy, static blog in haskell https://artyom.me/
15:26sdegutilslokien: way too much work plus not compatible with github pages and not having to install anything locally
15:27rcassidybeen meaning to put a blog on rcassidy.net but haven't yet
15:27sdegutilsrcassidy: you can do it! i believe in u!
15:27rcassidymaybe I will!!
15:27rcassidyall that's on there now is an old doodle
15:28lokiensdegutils: 'kay >:c
15:39TimMcrcassidy: One of these days I'm going to replace my WordPress blog with a static site.
15:40TimMcmaybe a Clojure-based generator
15:42sdegutilsTimMc: why not just use github pages like everyone else?
15:43TimMc"everyone else"
15:43sdegutilsyep
15:43sdegutilsand i stand by it
15:44TimMcBecause I like having some modicum of control over my words and expression and URLs.
15:44aep-shoutlethelp, this hangs: (defn -main [& args] (doall (pmap print "Hello World!\n")))
15:44TimMcAs it is now, it's just between me and my hosting provider.
15:44sdegutilsTimMc: github pages doesnt not give yo uthose
15:44rcassidyI loved how all the NEU profs used weird racket site generators for their neu.edu pages.
15:44sdegutilsTimMc: ok whatever floats your boat
15:45sdegutilsaep-shoutlet: why are you using pmap?
15:45amalloyaep-shoutlet: google around for "shutdown-agents"
15:45aep-shoutletit's just a hello world exercise, printing each char in parallel (scrambled)
15:45sdegutilsaep-shoutlet: and why are you using doall? and why print?
15:45amalloyyou'll find many people with the same question, and some good answers
15:45sdegutilsoh
15:45sdegutilsok
15:45amalloyyou forgot to ask why -main
15:46aep-shoutletthis used to work in an earlier clojure version, maybe 1.7 changed things?
15:48amalloyaep-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:48aep-shoutletamalloy: with gradle, it mostly just hangs on silent output
15:49amalloygradle? huh?
15:49aep-shoutletafter about 60 seconds, it finally quits, still no output. do i need a flush or two in there?
15:49amalloyoh, yeah, since you're using print instead of println
15:49amalloySystem/out flushes on newlines by default
15:51aep-shoutletjust needed flush, thanks
16:03cortexmancan a let bound variable be modified by a function without re-letting it?
16:03justin_smithit cannot be modified period
16:03justin_smithre-letting is simply shadowing, it doesn't change it, just hides it
16:04justin_smith,(let [a 0 b (inc a) a 2] b)
16:04clojurebot1
16:04cortexmanin order to avoid side effects (ie an atom) i am doing (let [some-lookup-table {} ...
16:04cortexmani 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:04cortexmanin a defn
16:05justin_smithbest bet is usually to make another binding in the same let block, using the return value of a function
16:07justin_smith,(let [m0 {} m1 (assoc m0 :a 0) m2 (assoc m1 :b 2)] [m0 m1 m2])
16:07clojurebot[{} {:a 0} {:a 0, :b 2}]
16:08cortexmanspecifically the if sections
16:08cortexmanhmm.
16:47Kamuelai think clojure has made me think about how almost any good language is domain specific