#clojure logs

2016-05-19

02:31expezWhy is target on classpath? I sometimes get weird behavior during development if I've forgot to do lein clean and there's an uberjar of my app lying around in target. Can I remove target from cp, or will everything break then?
02:34hiredmanon uberjar in target wouldn't do it
02:35hiredmanthat isn't who the classpath works, only jars directly on the classpath have classes loaded from them, not jars in directories on the classpath
02:36hiredmantarget is on the classpath because the clojure compiler requires that the directory where compiled class files are being written be on the classpath
02:36hiredmanyou should just stop aot compiling, your life will instantly be better
02:37expezwhat determines where clojure writes it's compiled classes?
02:38hiredmanjust stop aot compiling
02:38expezI'm guessing it's lein/boot. Perhaps I can just change this dir, so the build artifacts and 'working set' are in different dirs?
02:39hiredmansure, you can do all kinds of stuff, but most likely if you are having issues it is because of stale class files in target (not from an uberjar in target) and if you don't aot compile you won't have that issue
02:40hiredmangenerally, if someone is aot compiling, it is because they mistakenly believe a. it is the only way to launch an app b. the generate code has better performance
02:41hiredmanneither of those things is true, and the downside of aot compilation is it leaves you open to all kinds of odd issues
02:42expezyeah, I got that part. Thanks
02:42expezUnfortunately, handing out the source code isn't always an option
02:44expez(inc hiredman)
02:44expez,(inc hiredman)
02:44clojurebot#error {\n :cause "Unable to resolve symbol: hiredman in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: hiredman in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6688]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: hiredma...
02:45TEttingerI miss lazybot :|
02:45hiredmanah, in that case I recommend creating a build profile in lein that does aot compilation, and use that for doing releases, and using a profile without aot compilation for developement (althought that is not without its dangers)
02:45expezthat doesn't work anymore?
02:46TEttingerclojurebot is a different bot and during the friggin' DDoS storm that hit Freenode a few months back it needed perpetual hand-rebooting
02:46TEttinger*lazybot needed
02:46TEttingerso the person in charge of lazybot took it down, I can't remember who it... was... Raynes?
02:47TEttingeryou can still run a lazybot, I run one on quakenet. apparently some plugins have stopped working due to google changing an API
02:49hiredman~google clojure
02:49clojurebotFirst, out of results is:
02:49clojurebotnull
02:49clojurebotnull
02:49hiredmandamn, no kidding
02:49hiredman(shows you how much that gets used)
04:04ben_vulpesi have finally lost a finger to aot
04:04ben_vulpesor at least an hour
04:05ben_vulpesbut hey at least i REFACTORED THE WHOLE PROJECT and MANUALLY TRAVERSED THE NS GRAPH
04:05ben_vulpeswhole project is an exaggeration
04:05ben_vulpesbut definitely the reset toolchain
08:25KneivaIs there a existing function to map with a function that can return a nil and that returns only non-nil values?
08:25dysfunkeep
08:29Kneivagreat, thanks!
08:31dysfunyw :)
09:08ilevdIs boot-clj good for shell scripting?
09:09dysfunhow do you mean? as a replacement for bash?
09:10TMAis there a way to manhandle clojuredocs.org into a non-mobile view? the blue thingy on the right covers half of the screen at all times and there is no search box in the mobile version
09:13ilevddysfun, yes, something like this. The most important thing is its startup time
09:16dysfunstartup time is about the same as lein
09:16dysfunif you want a bash script... write a bash script
09:19ilevdI want to have an opportunity to run ./hello.clj ilevd and get "Hello, ilevd!" immediately :)
09:19dysfunsorry, you're out of luck
09:20dysfunyou can sort of fake it by keeping a jvm open
09:20dysfunthere are a few tools to help you with that
09:22ilevdYes, I'm looking for them now
09:23dysfunhttps://github.com/technomancy/grenchman
09:27MasseRilevd: however afaik you won't have a proper CWD with them, it's shared with the jvm instance
09:27dysfunah yes, that sounds probable
09:28yazirianilevd: if cljs is acceptable http://planck-repl.org/ is probably what you're looking for
09:28ilevdYeah, I've found it too, what is CWD?
09:29dysfuncurrent working directory
09:29ilevdAh
09:37ilevdYet another reason to buy Mac)
09:37dysfunodd you should mention that, i've just jumped from a mac
09:38ilevdWhy?
09:38clojurebotwhy not?
09:38dysfunbecause reliability is not what it used to be and neither is 'just works'
09:39MJB47can confirm that
09:39dysfunand because i'm sick of the constant tin-rattling
09:39MJB47os x has been increasingly annoying me since lion :(
09:39dysfunyes, snow leopard is clearly the best release they ever made
09:40dysfunthey keep pestering me to upgrade my laptop (which has been relegated to web browsing device) to el capitan
09:41dysfunand oh wow, i should totally get on that update that improves support for some hardware i don't own
09:41dysfunthanks for telling me several times a day
09:42ilevdAnd what do you use now? Debian?
09:42dysfunno, i've been on FreeBSD for a few weeks
09:43dysfuni can honestly say it's a lot lower maintenance than OSX now
09:43MJB47im using mint at home
09:43MJB47im happy enough with it
09:43dysfuni'm planning to move back to linux, but i hate all linux distributions
09:43dysfunand i really don't like systemd
09:43dysfunthat limits my distro choice somewhat
09:43dysfuni wouldn't move except that freebsd is a joke for doing GPU work
09:43ridcully_gentoo (or one of the binary-only-offsprings) are quite close to the way at least ports behave
09:44dysfunwell they called it 'portage' for a reason :)
09:44ridcully_isn't there the nvidia blob anymore?
09:44dysfuni should note i moved from gentoo to freebsd
09:44dysfunoh i don't any any nvidia. fuck that
09:44dysfunown*
09:44dysfunexcept my knackered old craptop
09:45dysfuni want to play with the new vulkan stuff which is intel/linux only at the minute
09:45dysfunor windows. yeah no thanks
10:00iwohey, does anyone know why someone would do this in their code: (<!! (go ...)) if there were no operations inside the go-block that could be parked?
10:01iwoit seems like calling go creates a new channel but <!! immediately causes the thread of execution to block anyway - no different to removing the (<!! (go ...)) wrapping altogether
10:13justin_smithiwo: if you want to block on some code that includes various non-blocking channel ops inside it
10:22iwojustin_smith: I don't have any non-blocking operations inside the go-block. Maybe they existed at some point but were removed - I think the (<!! (go ...)) was probably useful at some point but is no longer the case
10:22iwo(in the code I'm looking at)
10:22dysfunaww, clojure is old enough to have legacy code
10:23iwowithout non-blocking operations, this construct effectively pointless, am i right?
10:32justin_smithso there are no channel reads or writes? if so, yeah it is pointless
10:35iwoonly reads and writes inside the go are !!> and <!!
10:36kwladyka,(-> {:1 2 :3 4} (keyword (str 1)))
10:36clojurebot#error {\n :cause "clojure.lang.PersistentArrayMap cannot be cast to java.lang.String"\n :via\n [{:type java.lang.ClassCastException\n :message "clojure.lang.PersistentArrayMap cannot be cast to java.lang.String"\n :at [clojure.core$keyword invokeStatic "core.clj" 595]}]\n :trace\n [[clojure.core$keyword invokeStatic "core.clj" 595]\n [clojure.core$keyword invoke "core.clj" 595]\n [sandbox$e...
10:36kwladykahmm in ClojureScript it does strange thing
10:39kwladyka,(-> (keyword (str 1)) {:1 2 :3 4})
10:39clojurebot2
10:40justin_smith,(macroexpand '(-> {:1 :a} (keyword (str 1))))
10:40clojurebot(keyword {:1 :a} (str 1))
10:40justin_smiththat's why that breaks
10:40justin_smithalso, :1 is terrible
10:42kwladykaanyway it behave different here, http://clojurescript.net/ and in app what i am working on, perhaps different versions
10:42kwladykayes :1 is terrible, but i can do nothing about that
10:43justin_smithkwladyka: where does it come from?
10:43TimMcThis is why it's terrible to keywordize random data.
10:43kwladykajustin_smith from other software developer :)
10:43justin_smithkwladyka: you should stop using their code
10:44kwladykajustin_smith i can't i participate in this project :) it is very chaos project :)
10:45kwladykait is much more complex to explain why that you think in the first moment :)
10:45kwladyka*then
10:45justin_smithas TimMc mentions, stupid things like that get created all the time when people auot-keywordize. And you shouldn't be auto-keywordizing things for that very reason.
10:46justin_smith,(keyword "\n") could be worse, though
10:46clojurebot:\n
10:46kwladykajustin_smith i agree, but i can't save the whole world :)
10:46TimMcjustin_smith: It is my personal crusade.
10:47kwladyka,(keyword " ")
10:47clojurebot:
10:47kwladykathis one is the worst
10:48justin_smith,(keyword "\ufeff") ; even worse
10:48clojurebot:
10:50TimMc,(keyword "\u0000")
10:50clojurebot:
10:50ridcully_,(keyword "\u00ad")
10:50clojurebot
10:51TimMcLet's get more creative.
10:52justin_smith,(keyword "f\ufeffo\ufeffo\ufeff")
10:52clojurebot:foo
10:52TimMc,(read-string (pr-str (keyword "abc ;; HELLO")))
10:52clojurebot:abc
10:52ridcully_if only i was not to lazy to look up the vertical tab
10:53justin_smith,(let [foo (keyword "f\ufeffo\ufeffo\ufeff")] [foo :foo (= foo :foo) {:foo :foo foo foo}])
10:53clojurebot[:foo :foo false {:foo :foo, :foo :foo}]
10:53ridcully_i pitty the f\u
10:53kwladykaSomebody use atom editor with Clojure in everyday work? I found it is very perspective but the part about Clojure is not really mature yet. Some small things have to be improve.
10:54MJB47its not as good as cider
10:54kwladykaheh i see how you like doing this "kitten butcher" :)
10:54MJB47but it works well enough
10:55yazirian,(keyword "🖕")
10:55clojurebot:🖕
10:56kwladykaMJB47 I have for example bad syntax highlight for #{"one" "two" "three"} and some small other things.
10:57kwladyka:require-macros is shown as an error etc.
10:57MJB47im not sure what a bad syntax highlight is
10:58MJB47but you can change all the syntax highlighitng really easily
10:58MJB47its just css
10:58MJB47well, LESS (or is it SASS? fuck)
10:58kwladykaMJB47 highlight #{...} as #() so the first element in set has one color like a function and other different color
10:58MJB47and require-macros is not shown as an error for me
10:58ilevd,(keyword ")")
10:58clojurebot:)
10:58MJB47my sets dont look like that
10:59MJB47perhaps its just your theme?
10:59MJB47regardless, just fiddle with the css if its an issue
10:59kwladykaMJB47 i use the default one for now
11:00kwladykaMJB47 do you use linter-clojure? It shows me this error about :require-macros
11:00MJB47i dont
11:00MJB47is the linter for clojure only? (and not clojurescript)
11:00kwladykaMJB47 can you paste me what packages do you use?
11:01MJB47clojure related: proto-repl and lisp-paredit
11:01kwladykaMJB47 not sure about that, but it activate in ClojureScrupts file
11:01MJB47oh and swackets, but its not great
11:01MJB47i need to make a pr for it at some point
11:02MJB47or do my own
11:02kwladykaMJB47 why not great?
11:02kwladykado what?
11:02MJB47only works for 1 type of bracket at a time
11:02MJB47sometimes bugs out
11:02kwladykaoh
11:02MJB47is slow
11:03MJB47do my own rainbow parens thing
11:03MJB47or fork it... idk
11:03kwladykalinter-clojure, language-clojure, proto-repl, lisp-paredit, ink <- i use this
11:04kwladykaMJB47 ambitious.... i just want use editor, not code it :)
11:04MJB47swackets is just rainbow parens, its not that complicated
11:04MJB47or needed
11:04MJB47its just a nice to have
11:05MJB47but if you want a clojure editor that works out the box, i would recommend looking at cursive
11:05kwladykaMJB47 do you use default theme?
11:05MJB47yes but ive modified it
11:06MJB47enough that i probably shouldnt call it the default theme
11:06kwladykaMJB47 i use cursive, looking something else where i don't have to touch mouse, but modern solution, not emacs.
11:07MJB47then use atom, but its new and so the tooling around it isnt as mature
11:07kwladykaMJB47 atom is the only one i think which can be the closest of my needs
11:07MJB47this is to be expected
11:07kwladykayes i see it, i am thinking i should wait or not to use it :)
11:08kwladykatesting it
11:08kwladykafor now i don't like some shortcuts... but i can set my own
11:09kwladykaand i didn't find something like alt+cmd+L in cursive, did you?
11:09MJB47idk what that does
11:10kwladykaMJB47 reformat the code
11:10kwladykaindent
11:10kwladykafor selected text or a whole file when nothing selected
11:11kwladykathe closest is ctrl+alt+i if i remember in atom
11:11ilevdhttp://spacemacs.org/
11:23kwladykaMJB47 ah sorry this problem with syntax higlight apperat with code like that (#{"fds" "fdsa" "fdsf" "fdsf"} "fds")
11:30TMAilevd: i have had some trouble with the key mapping described in the docs not present
11:33ilevdTMA, oh, I haven't used it yet, only want to
11:35TMAilevd: maybe it works fine outside of Windows
11:36ilevdIt would be good
11:37TMAilevd: give it a try, maybe I did something really wrong
11:44ilevdok =)
12:04sdegutisWhile Hiccup is pretty convenient to write literally, it's actually very inconvenient to manipulate raw Hiccup data structures.
12:05sdegutisGood luck figuring out whether [:form#quux.bar {:class "foo"}] has a given class.
12:06sdegutisEspecially considering the {} is optional. And given his other projects, I wouldn't be surprised if the attributes thing is allowed to be a function that returns a map.
12:07Bronsawhat's wrong with that example? it seems to be obvious what classes and ids it will produces
12:08dysfunto a human, not to a machine
12:08Bronsathere's no need to diss like that an established community member
12:09Bronsadysfun: luckly neither of us is a machine?
12:09dysfunhe mentioned manipulating it
12:09sdegutisdysfun: I tried writing some helper functions that take a Hiccup thing and add to it, and it's a lot more code than I expected.
12:09dysfunyeah, i tried to write a library to ease autogenerating sql and i've realised why all the other aren't great for autogenerating - it's sql's fault
12:10sdegutisdysfun: that's where datomic comes in
12:10Bronsadoesn't seem to me like it'd take that long to normalize that form
12:10Bronsahiccup really doesn't have a lot of syntax
12:10sdegutisdysfun: where does he mention manipulating it? just read through the wiki and it's got nothing
12:10dysfunno, you mentioned manipulating it
12:11sdegutisoh
12:11sdegutisugh
12:11dysfunas it is i've concluded that sql is only manipulable in the sense that as long as you have all the conditions in some sensible form you can turn them into sql. good luck working with an already written query and changing it though
12:12Bronsayeah, transpiling to sql is a nightmare
12:12dysfunyes. i have spent many many hours with the postgres manual in the last few weeks
12:13Bronsathat doesn't sound like fun at all :)
12:13dysfunfun? maybe for five minutes :)
12:13dysfunsince then it's been that project that i want to forget about
12:13Bronsahaha
12:14dysfunhave rewritten it once
12:14dysfunit just about generates select queries now but i'm so sick of hacking on it
12:15CStormif i want to write a little commandline interface with clojure, is there any suggestions to good libs?
12:15dysfunthere's tools.cli, but it's not amazing. the startup time of clojure has meant not many people have done it
12:16ridcully_as in parsing args or ncurses style UI?
12:16CStormmostly the last part, ridcully_.
12:17CStormmostly i want to make a small tool to keep a eye on a few webservices on the server
12:17CStormare they running, if not restart etc etc.
12:18CStormits manly just for fun, nothing serious why the startup time does not matter that much
12:47Bronsayou can easily get a clojure repl in ~.5s which is not *too* bad
12:48dysfunand once you load all your dependencies in, it won't be .5s any more
12:48dysfunnot to mention you actually want a repl with readline and such
12:49dysfuni used to put up with 45 second repl startup times on my laptop before i nicked my friend's pc
12:50Bronsathere's still tons that can be done to improve startup performances even when loading libraries.
12:51Bronsabare clojure + rlwrap loads in 0.45s on my machine, lein repl takes 6s
12:55jeayelein repl is often over 15s for me
13:07tolstoyI created a jar with tons of deps embedded in it and it takes very little time to get to a repl, or run a script.
13:33bsamorimguys, I know this i totally off-topic, but I wanted to get opinions from functional-programmers
13:34bsamorimhas any1 of you ever read "Concepts, Techniques and Models of Computer Programming", by Peter Van Roy?
13:49amoeI have a test fixture that needs to set up some state for the test
13:50amoeIs there any way for the test fixture to pass arguments to the test so that the test can manipulate the state?
13:50justin_smithno
13:51justin_smithit can use a dynamic binding, or set an atom or var before the test starts
13:51justin_smithbut not pass args directly
13:51kwladykaamoe you should have different fixtures then i guess
13:51sdegutisDynamic binding is probably the safest idea.
13:51sdegutisIn our case though, we just construct the state we need within each test.
13:52amoesdegutis: Ah, I actually didn't conside that for some reason. I might just do that
13:52ben_vulpesarrange->act->assert
13:52sdegutisThat may be more difficult if a traditional DB is involved (though still possible). But if you use Datomic then a memory-db is a good fit.
13:52justin_smithamoe: one thing that can help is you can write a function that calls test/is, and if you call that within a test those is will run as things that belong to that test
13:52justin_smithamoe: so instead of test/fixture you have function/test - and the test can pass args to that function
13:53kwladykaamoe or maybe write some high order function as fixture function where you can put something and it will return the function
13:54justin_smithkwladyka: that doesn't offer data to the test though
13:54amoethanks all
13:54kwladykajustin_smith what do you mean? (use-fixtures :once wrap-test) if wrap-test will be high order function it should work to do anything?
13:55justin_smithkwladyka: the test is passed to wrap-test, wrap-test cannot pass data to the test
13:56kwladykaoh probably i miss the main point of amoe question
13:57sdegutisjustin_smith: that can get messy quick tho
13:57kwladykait is very strange needs i think
13:57kwladykaprobably bad design?
13:58sdegutiskwladyka: I prefer the phrase lifelong continuous learning, as applied to design
13:58sdegutisor rather "lifelong continuous learning as applied to good design"
14:02amoekwladyka: the case is greenmail java lib for integration testing of SMTP things. need to start a fake server and then query that same java object in an assertion
14:10justin_smithamoe: sounds like something you could do by calling with-redefs in the fixture
14:11justin_smithwith-redefs pretty much exists just for setting up tests
14:14dimon_Hi. what's an idiomatic location for storing user uploaded images on the same server and if it's not AWS? should it be a separate path from the static images used for css or design?
14:14dysfunyes, ideally
14:16dysfuni just have a /static/upload directory that i dump things into as a directory forest
14:17dysfun(based on random uuids)
14:19dimon_Hi. what's an idiomatic location for storing user uploaded images on the same server and if it's not AWS? should it be a separate path from the static images used for css or design?
14:20dimon_I can't see it because I've re-logged in
14:21dysfunbasically, yes and you should use a directory forest
14:21dimon_what's a forest? where should that directory be located? separate from my app?
14:22dysfunif you want to serve those images, it'll have to be somewhere the webserver can see
14:22dysfunput them in their own directory subject to that
14:22dimon_ok. so doesn't really matter where?
14:23dysfunno
14:23dysfuna file forest is a way of organising a directory to get around crap performance when you have a huge number of files in a directory
14:24dysfunessentially you take a name such as 'abcdefghij' and make it 'ab/cd/ef/gh/ij'
14:24dimon_ok. how is it recommended to name those images or to which directories to put them? for example, should it be something like /some_folder/{article_id}/1.jpg or what?
14:24dysfunyou can create whichever directories are necessary at the time of writing
14:24dimon_yes, how to better organize them?
14:24dysfunuse random uuids for names
14:25dysfunas for 'organise', well that's metadata that you should store in your database, surely?
14:25dysfunoh, and don't forget to preserve the filetype suffix (.png, .jpg etc.)
14:26dimon_sorry, I didn't get you. I mean, what directory forest should look like? something like /main_img_folder/year/month/day/article_id/img_id.jpg or what?
14:27dimon_dysfun: cc
14:27dysfunassign random uuids and store them as a forest
14:28dimon_yes, uuids for images file names. what do you mean by forest? it is /dir1/dir2/dir3? if so, how is it recommended to build those names of the directories?
14:28dysfunso this is a random uuid that duckduckgo just generated for me: 7C21E258-1DEF-11E6-88F8-F5976FA2A08B
14:29dysfunso let's take the dashes out first
14:29dimon_do you mean, I should put them all in the same directory?
14:30dysfunwell, how many images will you be allowing to be uploaded?
14:30dimon_theoretically, a hundred every day
14:31dysfunright, so that's 36.5k images a year. after 3 years, you'll find that things start to get slow
14:31dimon_ok. and?
14:31dysfunand that's because large numbers of files in one directory tank performance
14:31dysfunwhere 'large' typically ~=100k
14:32etiagohey everyone, Clojure beginner here... I have the following code http://pastebin.com/czZ7P0us . :on-receive takes a function which it will call, with one argument, upon receiving a message. However, I wanted to have the 'socket' variable available inside that function (which is called message-received). I thought using a partial would be the solution to my problem but... obviously, socket will only evaluate once ws/connect returns, and
14:32etiagoby the time it does, :on-receive has already been assigned to.
14:32etiagoany clever ideas to solve this without using global scope variables?
14:33justin_smithetiago: def inside defn is bad, and do inside defn is redundant
14:33etiagojustin_smith: noted :)
14:33dimon_dysfun: and that leads us to my initial question: how would I organize or name the directories of a forest to avoid having over 100 k in the same directory?
14:34dysfunyou decide first what your granularity is. if you're using uuids, 2-4 digits is sensible
14:34dysfunthen you split the name up into groups of that many digits. each one becomes a directory node
14:34dimon_tnx
14:34dysfunand the final part of it is the remaining digits plus the file extension
14:35dysfunyou create the directories on demand as required
14:36dysfunor you can even hash the file contents and use that as the filename instead
14:36dysfunlike git does
14:37justin_smithetiago: one option is (let [socket (promise)] (deliver socket (ws/connect ... :on-receive (partial message-received @socket))))
14:38justin_smithafter that you can put socket in an atom or pass it forward to whoever else needs to use it, or whatever
14:39justin_smithetiago: in fact, a def is allowed to access itself, but def inside defn still isn't a good idea
14:39etiagojustin_smith: alright, I haven't used promises or atoms yet... I'll go read about it then :) thx!
14:39justin_smith,(def recursive (cons 42 recursive))
14:40clojurebot#error {\n :cause "Don't know how to create ISeq from: clojure.lang.Var$Unbound"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Var$Unbound, compiling:(NO_SOURCE_FILE:0:0)"\n :at [clojure.lang.Compiler$InvokeExpr eval "Compiler.java" 3657]}\n {:type java.lang.IllegalArgumentException\n ...
14:40justin_smithergh
14:40justin_smith,(def recursive (lazy-seq (cons 42 recursive)))
14:40clojurebot#'sandbox/recursive
14:40justin_smith(nth recursive 1000)
14:40justin_smith,(nth recursive 1000)
14:40clojurebot42
14:41etiagohah interesting :)
14:41justin_smithetiago: this is how self-calls are possible
14:41justin_smithso a function is always allowed to pass itself as an arg to something it calls
14:41justin_smith,(defn narcissus [] narcissus)
14:41clojurebot#'sandbox/narcissus
14:42etiagojustin_smith: but still, in my case it doesn't make much sense right? because I need the defined value for the evaluation of the inner function
14:42justin_smith,(= narcissus (narcissus) ((narcissus)))
14:42clojurebottrue
14:42etiagobrb
14:42justin_smithetiago: it is defined
14:42justin_smithetiago: it's the thing you are defining
14:43justin_smithetiago: implementation wise, as soon as (def x ...) exists, x is available - even if (def x ...) is inside a form, even if (def x ...) itself refers to x
14:44justin_smithbut order of definitions in a file is still important - to preserve file/repl compatibility
14:48etiagojustin_smith: it exists, but how can it have a value if, e.g., (def x (foo x)) foo hasn't finished evaluating?
14:48justin_smithetiago: see my definition of narcissus above
14:48justin_smithetiago: by the time you use it it is available
14:51etiagolet me experiment a bit and see if I can wrap my head around this... :)
14:55justin_smithetiago: actually inside the body of the def the thing being defined exists but is still unbound
14:56justin_smithbut anyway, it's better not to do that with def - counting on runtime def (other than via repl in development) is usually a bad idea
14:56etiagojustin_smith: a-ha! that's exactly the same conclusion I just reached: #object[clojure.lang.Var$Unbound 0x22553faa Unbound: #'fun-bot.core/v]
14:57etiagojustin_smith: agreed :) I will read up on promises and atoms, that seems to be a better option
14:57etiagothanks again!
15:01amalloyi don't think you need a promise for that
15:02amalloyjust use a lambda instead of a partial, and the delayed evaluation of fn will combine with var lookup to solve your problem
15:02amalloy(def socket (ws/connect ... :on-receive (fn [message] (message-received socket message))))
15:03justin_smithamalloy: I was suggesting a promise or atom instead of def inside defn
15:03amalloybut you don't need any of those things. just an ordinary lambda inside a def is fine
15:03justin_smithamalloy: but then you have a def with side effects
15:03amalloywell that's certainly true, and a problem. good point
15:04amalloybut your promise/deliver has the same issue
15:04amalloyoh, i guess i didn't read the original code
15:04amalloyall this is happening inside a function already
15:04amalloyi retract my suggestion
15:05justin_smithamalloy: I think I might have sketched that too roughly I was imagining (defn -main [] (let [socket (promise)] (ws/connect ....) (foo socket) ...)
15:05justin_smithright, now we are on the same page
15:05amalloytruly it is the page of champions
15:06justin_smithetiago: btw stuartsierra's component library is meant for managing things like this
15:06justin_smithetiago: it might seem a bit odd at first but it make a nice foundation for putting together various stateful things sanely - he has some good vids on youtube about using it
15:06justin_smith*makes
15:10dysfunand while we're at it, https://github.com/irresponsible/oolong wraps component quite nicley </unplug>
15:15amoethanks for that rec dysfun
15:17dysfunyw :)
15:23CStormhas anyone used spacemacs?
15:27kungiCStorm: It looks neat if you like the control scheme
15:27CStormit does looks nice.
15:28kungiCStorm: I prefer my emacs config which has been evolving for the last ~7 years :-)
15:28CStormyeah, i guess many will have it that way =)
15:29CStormi only use emacs for clojure, and clojure is only a spare time project :)
15:29kungiCStorm: I think spacemacs is a very nice and probably sane entry point to emacs
15:29kungiCStorm: What are you using at work?
15:30CStormmobile developer, writing swift, objective-c and java
15:30CStormso intellijs
15:30CStormive used emacs for a little under a year so still tons to learn
15:30CStorm:)
15:30CStormmight give spacemacs a go!
15:30kungiCStorm: tons doesn't even describe it properly :-)
15:32CStormthe biggest problem is that i have learned most of the shortcut i use etc.
15:32CStormhowever depending on mood, interest etc there goes 1-2 weeks in between
15:32CStormthen it get hard to remember again :)
15:32CStormusing emacs at work?
15:32kungiCStorm: building muscle memory always is hard
15:32kungiCStorm: I use clojure at work so I use emacs
15:33kungiCStorm: I started my personal "living in emacs" project about a year ago
15:33CStormsounds awesome
15:33kungiCStorm: It is :-) currently I am using emacs to chat
15:34CStormand cook your meal? ha ha :)
15:34kungiCStorm: no! I use my kitchen a stove and a pot for that.
15:34CStormoh... right, silly me. :-)
15:37kungiCStorm: I think whether you use spacemacs depends on your opinion on the control scheme.
15:37kungiSo choose one and stick with it
15:37CStormand by control scheme you mean keyboard shortcuts?
15:37kungiCStorm: yes
15:37kungiCStorm: Spacemacs provides a completely different set of shortcuts
15:38CStormalready gotten quite use to emacs as i wrote to what i need to use
15:38CStormmight be just yet another hill to climb if i change hehe
15:39kungimaybe
17:11TimMcThis should be enough to make OpenJDK 8 produce a Sun Java 6-compatible jar, yeah? :javac-options ["-target" "1.6" "-source" "1.6"]
17:11ben_vulpesis there a...slightly flatten?
17:11ben_vulpeseg just the first level of nesting?
17:11TimMcben_vulpes: mapcat identity
17:12ben_vulpesclass
17:12ben_vulpesclassy*
17:12ben_vulpesthanks TimMc
17:12TimMcIdeally you'd avoid producing something like that in the first place, by adding another clause to your #'for or something, but it happens.
17:13TimMcUsually one of those two answers is what people really want when they reach for flatten. :-P
17:14TimMc(Aha, I was including a jar that had been compiled on OpenJDK 8 without those options. I can fix that.)
17:47sdegutisI've been toying with the idea of making full-fledged Records for each model, rather than a bunch of helper functions that have the first parameter in common.
17:47sdegutisAnd each presenter, and each view function, etc.
17:47sdegutisThe reason actually being inspired by stuartsierra's Reloaded Workflow: when you reload a function, it's available right away. But not a record.
17:52hiredmansource and target tell javac how to interpret java source code, and which bytecodes to emit, but that is not enough to ensure compatibility if you have any kind of reflection happening at compile time (which could be the result of any kind of annotation processing in java, and clojure does a lot of in its compiler)
17:53amalloyhiredman: that's why javac wants you to set the bootstrap classpath as well when using -source and -target, right?
17:53hiredmanyep
17:54hiredmanit is, on the whole, a royal pain, although often things will be fine with just source and target
18:15cflemingkwladyka: I'm interested - where do you find you have to touch the mouse in Cursive?
18:15lumamoving focus from editor to repl?
18:16cflemingThere's now an action for that you can bind keys to.
18:16cflemingTools->Repl->Jump to REPL editor/output pane
18:16lumaooh
18:16lumanice
18:17cflemingYou can jump to the output too and cut and paste from it.
18:18cflemingkwladyka: In general, if there's something in Cursive you can't do without the mouse I consider that a bug, and an issue would be very welcome.
18:20kwladykacfleming hi, not really in curisve, it is more about Intellij Idea. For example i don't think it is possible to jump between REPL window, terminal window and code etc.
18:20kwladykaor i am in mistake as i can read :)
18:21cflemingWell, in your defence those actions are pretty new :)
18:21cflemingFrom any toolwindow (including the REPL), ESC will always jump back to your code.
18:22cflemingFor the terminal window, check the menu at View->Tool windows->Terminal - that should have a shortcut bound to it (alt-f12 on OSX)
18:22cflemingAgain, you can rebind that if you want to.
18:22whilo_I have a weird problem with core.async and thread bindings: https://gist.github.com/whilo/4946cb4a018065aafed8a1db8d952407
18:22kwladykai will try it maybe tomorrow. Now it is time to sleep. I see you always watch the topic about editors :)
18:23cflemingYes definitely :)
18:23kwladykacfleming i don't know how you do it but you catch the topic with high precision :)
18:23whilo_The main problem is that I am not sure how to best debug it. It only happens when I run the uberjar. lein run or REPL with the same code works fine
18:23cflemingBut do let me know either here or in an issue if you find there are things that require the mouse.
18:24cflemingkwladyka: It's easy, my IRC client tells me whenever anyone is talking about Cursive
18:24cflemingLike when someone mentions your name
18:25kwladykacfleming oh i didn't realise somebody use cursive. I thought you observe also atom editor and others
18:25whilo_Any suggestions of how to debug this, so maybe I could open a ticket. I haven't debugged a jar file app with clojure before.
18:25clojurebotTitim gan éirí ort.
18:25cflemingWell, I'm generally interested in those discussions too, but I don't get notified of them.
18:25cflemingI follow the editors channel in Slack, for example
18:26justin_smithwhilo_: do you have defs that do core.async operations in their body? I would expect that to cause an issue like that.
18:26kwladykacfleming i believe atom editor when will became mature can be your big competitor in the future
18:27whilo_justin_smith: yes
18:27justin_smithwhilo_: in general def should not have side effects - because the body gets run at compile time
18:27justin_smithI would expect that to screw up core.async's state machine
18:27whilo_Hmm, why does it work with lein run then?
18:27cflemingkwladyka: Yes, possible, especially for CLJS since web devs are more likely to be familiar with it, and less likely to use IntelliJ/Webstorm
18:27justin_smithyou can replace it with a defn or (def foo (delay ...)) and force it later
18:28justin_smithwhilo_: lein run does not run a separate compilation step
18:28justin_smithwhilo_: clojure always compiles your code as it loads it, but with uberjar it compiles when creating the jar, and then it loads (and often does more compilation) at runtime
18:30kwladykacfleming thx you for your reply and information about shortcut to focus REPL windows.
18:30kwladykagoodnight all :)
18:31cflemingGoodnight!
18:31whilo_justin_smith: ok, yes i know. is it reasonable that the stack trace pops up somewhere else?
18:31justin_smithwell, it's not neccessarily an error when you build the uberjar - it's a runtime error caused by what you built
18:32justin_smithwhilo_: for a very silly example, if you had (def bye-bye (System/exit 0)) the uberjar process would exit without finishing creating your jar, but would not show any error
18:33whilo_ok, interesting. can you elaborate a bit how aot breaks core.async?
18:33justin_smithwhilo_: aot runs all your code - there is no "compile only mode" in clojure
18:33whilo_ok
18:35justin_smithwhilo_: so, that means that if your def has side effects, and does things that manipulate the state of core.async, the objects in the uberjar will have dirty state - and like I said, some things get re-evaluated at runtime but it's slightly unpredictable (maybe someone else can elucidate the paths / rules there) - and this leads to the core.async state machine (core.async is a lib that turns go blocks into state machines for cooperative multitasking)
18:35whilo_justin_smith: this one i know https://github.com/whilo/full.monty/blob/master/full.async/src/full/async.cljc#L58
18:36justin_smithyeah - I would say if it's going to be a dynamic var anyway, create it as nil in the def, then bind it inside main with a function that does that whole let block and starts the go-loops
18:36justin_smithbind using the binding macro, of course
18:37justin_smithbut then anything that uses it needs to be created inside the binding body - which might not make sense with your app design
18:38justin_smithanother option is to make it a delay that gets forced / derefed (this would mean wrapping the let in (delay ...) and putting an @ before every usage of the var
18:38justin_smith)
18:39justin_smith,(def later (delay (do (println "hi") :done)))
18:39clojurebot#'sandbox/later
18:39justin_smith,later
18:39clojurebot#object[clojure.lang.Delay 0x1f7e25f1 {:status :pending, :val nil}]
18:39justin_smith,@later
18:39clojurebothi\n:done
18:39justin_smith,@later
18:39clojurebot:done
18:42whilo_hmm, ok. the binding is really painful. i have already hit issues in core.async and cljs. i am wondering whether it is worth the effort. it would make sense for a supervisor thought, i think
18:43whilo_though
18:43whilo_even considering all the arguments of stuart sierras binding warning
18:44whilo_otherwise i have to pass the supervisor argument to all go blocks
18:44justin_smithyou could also have a component for the supervisor, that provides it to the things that start other go blocks
18:45justin_smithor, create channels in defs (which is safe) and just write the code to read/write those channels
18:46whilo_hmm, this def doesn't seem to be it.
18:49whilo_justin_smith: thx! this was really helpful, will try to pin it down :)
18:49justin_smithwhilo_: I forget what it is called, but there's a channel that acts like a delay - it blocks until you write, and after that it returns the same first value that was written every time you read it
18:50whilo_a promise channel?
18:50justin_smithI bet that's the one, yeah
18:50justin_smithso you could make the channel at the top level, and write s to it in -main
18:50whilo_promise-chan it is
18:51justin_smiththen you are safe for aot (for that block of code at least) - just change usages of that s to reads from promise-chan
18:51justin_smithmight be the simplest thing since you are in async-land already
18:54whilo_justin_smith: i'll think about it. but first i'll try to find where the dirty state comes from
19:14justin_smithwhilo_: the dirty state comes from creating go loops while compiling
20:10bsamorimto paraphrase dimitry karamazov : "the path of the non typing nor object-oriented programmer is too wide"
20:13bsamorimit's really frustrating to see that something that takes forever in clojure would be nipped in the bud with OOP
20:14bsamorimi guess the other way around happens way more often, tho
20:20jasonmasonbsamorim can you provide more details
20:22bsamorimbasically I have a pattern that I can't abstract away, and it occurs all along my code
20:24bsamorimI am dev'ing a trading app. A lot of functions have a dual where I would exchange some computation happening with the bids list with an almost (and that almost is what fucks me) equal computation with the offers list
20:26bsamorimfor instance, the set of both lists (the "book") is stored as a hash-map, and when a new order comes, i have to do a bunch of stuff that differ only slightly depending if this new order is a bid or an offer
20:29bsamorimit would be super easy to model that with a OO language.....but with clojure it is impossible to find an all-encompassing solution....the best I could come up with was to write a dispatcher that would work kinda like an object...
20:30bsamorimeh, i guess no language is perfect....
20:30sdegutisbsamorim: what's the problem? I just got here
20:30bsamorimi'll resend the message
20:30bsamorimI am dev'ing a trading app. A lot of functions have a dual where I would exchange some computation happening with the bids list with an almost (and that almost is what fucks me) equal computation with the offers list
20:30sdegutisBtw I'm totally about to use Clojure to duplicate files because Emacs is incapable of such a complex task.
20:31bsamorim for instance, the set of both lists (the "book") is stored as a hash-map, and when a new order comes, i have to do a bunch of stuff that differ only slightly depending if this new order is a bid or an offer
20:31sdegutisbsamorim: sounds easy
20:32bsamorimhmmm...how would you solve it? I mean, i'll give a more rigid context
20:34bsamorimwrite a function (fn [book new-order] ...) that finds the opposing orders list to "new order" (if it's a bid, the offers, and vice versa) and returns a new book, removing the matched orders from the opposing list and inserting the unmatched quantity from new order into its corresponding list
20:36bsamorimwith no control flow to check the order type....
20:37bsamorimideally, it would be a ( fn [ var-fun_1 var- fun_2...var-fun_k book new-order] ...) where the var-fun's would be encapsulate all order type-dependency
20:38bsamorimwould encapsulate*
20:42bsamorimsdegutis: do you think there's a concise way to do this?
21:03sdegutisbsamorim: I don't know the whole context so I can't come up with a solution; and it sounds like it could take a few hours, so you'd have to pay me to come up with it in the first place
21:03sdegutisbsamorim: but yeah it doesn't sound very complex
21:06bsamorimsdegutis: haha, relax dude, I don't expect you to give me a .clj or anything like that
21:06bsamorimsdegutis: of course it isn't very complex, especially if you think specifically about this function...
21:07bsamorimsdegutis: the problem is thinking about an _abstraction_, useful for any function that could come up in my app....not just some taylor-made hack
21:08amalloybsamorim: just write a function that takes in a function as an argument
21:08amalloythat's polymorphism
21:08amalloyso then you have like (defn handle-computation [f ...]), and (handle-computation bid-handler ...) ... (handle-computaiton offer-handler ...)
21:09bsamorimamalloy: that's what i've been doing so far, higher order functions as "abstract functions" and partials as its implementions
21:09bsamorimimplementations
21:09amalloywell, not necessarily partials, since you can be a lot more general
21:09amalloybut sure
21:10bsamorimyeah, one could extend it indefinetely...but it starts to get ugly....and, when you see it, you're writing some totally auxiliary data structures and functions with 5+ arguments
21:11bsamorimI mean, I just read SICP....the elegance in it!!!!!!
21:11bsamorimi guess that my question, in the end, is this: can one write programs that are 100% elegant?
21:11amalloyin any language? no
21:11bsamorimnot a single stinking function or script
21:12bsamorimregardless of the language...i mean, you could pick one
21:12amalloyyeah, what i'm saying is, in no language can you do that
21:12bsamorimi am just a beginner software dev, but i'm starting to think that this is just not possible
21:13bsamorimamalloy: hahah, yeah, that's very frustating!!
21:14bsamorimamalloy: in the end, there's no such thing as an "elevated profession"....everything's a trade..we're the same as shoemakers from the middle ages..
21:15bsamorimI mean, specially software development...how much creative can it really be?
21:16bsamorimyou can be proud of some part of your source code....but most of it is very down-to-earth, automatic stuff....
21:17bsamorimeither that, or I'm just too high hehe
21:21philwhite`reduce` isn't a transducer, right? But it seems to me that it could be, and that the only reason it's not a transducer is that it wasn't implemented that way. The reason I ask is that i'm trying to implement a `map-reduce` transducer, but then i thought that if reduce wasn't implemented as a transducer, than maybe i shouldn't be implementing `map-reduce` as a transducer. Am i saying nonsense?
21:22philwhiteI think i understand what transducers are (an abstraction for transforming processes, as opposed to sequences), but i think i'm still a little confused about when to implement a new one, or how to piggyback on existing ones
21:23philwhitedoes `map-reduce` have to be implemented as a transducer?
21:23amalloybsamorim: imo software dev is very creative. it's certainly not science, or engineering, when you compare to how good hose guys are at getting things that work
21:26namraare fixtures in other test namespaces evaluated when i refer the tests in another namespace?
21:26namrabasically i want to run all tests from cores-test
21:26amalloythe fixtures are evaluated, but they don't wrap tests in other namespaces
21:27namraso: (ns app.core-test (:require [app.other-tests :refer [a-test]])) (deftest test-all (a-test))
21:28namrathis would also evaluate the fixtures in app.other-tests when (a-test) is evaluated?
21:28namrafrom within app.core-test
21:28amalloyi mean, the answer to that is definitely yes, but i am not sure you really know what evaluating fixtures mean
21:29amalloyso yes might not be the answer you want
21:32hiredmanphilwhite: the terminology around transducers is not clear, and that causes trouble with any discussion about them
21:32hiredmanphilwhite: a transducer is generally a function that takes a step function and returns a new step function
21:33hiredmana step function takes an accumulator and a single item and returns the accumulator
21:33philwhiteokay, that makes sense. so reduce could easily be implemented as a transducer, right?
21:33hiredmanreduce folds a collection of values in to a single value, which doesn't fit in to a step function
21:34philwhitehmmmm, let me think about this
21:34turbofail`reduce' is what will be calling the step function
21:35philwhitewait, a transducer returns a new step function?
21:35turbofailyep
21:35hiredmanyeah, it is a function that takes a step function in, and returns a step function
21:35philwhitethat's a little confusing
21:35ben_vulpeswhat's an expedient way to optimistically do math on a value that might be null without wrapping everything in a try/except?
21:35hiredmanthat is why they compose
21:35amalloyben_vulpes: check whether it's null
21:35philwhiteoooh, that is a good point
21:35amalloyyou have literally no other option
21:36ben_vulpesi hate programming
21:36ben_vulpesthank you amalloy
21:36amalloyi mean, you can use some->, or decide to reimplement the maybe monad in clojure
21:36ben_vulpesno i kid programming is fun
21:36ben_vulpesI MIGHT
21:36ben_vulpesamalloy: I JUST MIGHT
21:36ben_vulpesraa
21:37amalloybut those are the same as chekcing for null, just more convenient
21:37ben_vulpesyeah well i'd need type based polymorphism too i imageine
21:37ben_vulpesin clojure
21:37amalloyand really some-> only helps if there's only one of the values that might be null, and the others are known-good
21:37ben_vulpesnope we're doing it c-style
21:38turbofailphilwhite: for example, the map transducer looks basically like (defn map [map-fun] (fn [step-function] (fn [acc value] (step-function (map-fun value)))))
21:38ben_vulpes(if (and thinger-wont-break-my-code-this-way thinger-wont-break-my-code-that-way thinger-wont-break-my-code-the-other-way) (stuff-with thinger))
21:38ben_vulpesmaybe it's just the internet
21:38philwhitehiredman: so i think it's a little clearer now, but i'm still not sure what to do with `map-reduce`
21:38philwhiteturbofail: i'm actually literally looking at the map source right now
21:39philwhitei think you just made me more confused :)
21:39philwhiteoh, wait, never mind i was looking at ben's code too
21:40ben_vulpesphilwhite: don't do that
21:40ben_vulpesnever a good idea
21:40philwhitehaha
21:41turbofailiir the terminology correctly, the return value from (map -) is the actual transducer, i.e. the function that actually transforms the step function
21:41hiredmanphilwhite: in a reducers model, you use reduce (or something like it) to driver the application of the step function to values
21:42hiredmantransducers
21:42sdegutisamalloy: its a pretty weak form of polymorphism though, but yeah its technically a kind
21:42amalloy"weak" in the sense that it is as powerful as any other, yes
21:42philwhitedo you understand what map-reduce should do, or should i explain it before i keep going
21:42hiredmanso turning reduce "in to" a transducer doesn't make sense
21:42turbofailbrb heading home
21:42hiredmanI understand map reduce
21:43philwhiteyeah, i get that now
21:43hiredmantransducers and reducers get rid of map-reduce and replace it with just reduce
21:43philwhitereally?
21:43hiredmanyes
21:43hiredmanhttps://vimeo.com/45561411
21:43sdegutisisn't map-reduce a mongodb thing?
21:43hiredmanrich gave a talk at euroclojure a few years back about reducers, which are sort of a precursor to transducers
21:44amalloyi'm gonna go out on a limb and say someone probably thought of map-reduce before mongodb
21:45philwhitei'll watch the talk, but one last thing
21:47philwhitei just remembered that map-reduce isn't actually what i'm trying to do...it's just a means to an end. What i'm actually trying to do is a map-while, but i was going to implement it as a map-reduce with a boolean state. Does that change anything. I'm gonna have to think more about this whole subject
21:47ben_vulpessdegutis: nice
21:47hiredmanuh
21:47sdegutisben_vulpes: erm, wrong username?
21:47hiredmanmap while isn't a thing
21:48sdegutisbut it /could/ be
21:48hiredmanfilter is a thing, and take-while are things
21:48sdegutis,(defn map-while [f coll] (->> coll (map f) (take-while f)))
21:48clojurebot#'sandbox/map-while
21:48hiredmanboth of which have transducer forms which transform a steping function
21:48philwhiteit would map a sequence until the func returns false, and then it leaves the rest of the sequence alone
21:49sdegutis,(map-while not-empty [[1 2 3] [2] [] [3])
21:49clojurebot#<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )>
21:49hiredmanthat is take-while + map
21:49sdegutis,(map-while not-empty [[1 2 3] [2] [] [3]])
21:49clojurebot([1 2 3] [2])
21:49sdegutiswoo it works
21:49sdegutishiredman: ok yeah map-while is a thing now
21:49hiredmanif you can, you should avoid while type constructs, they force a linear run
21:49philwhiteruntime?
21:49hiredmanno
21:50hiredmanyou have to evaluate linearly
21:50philwhitewhat's a linear run?
21:50philwhitewhat's wrong with that?
21:50ben_vulpessdegutis: oh i thought you were making a good joke about map/reduce being a mongodb thing
21:50amalloyyour joke is sdegutis's reality
21:50sdegutisben_vulpes: oh no, not at all
21:50sdegutisben_vulpes: i was making a bad joke about that
21:51ben_vulpesi found it quite entertaining
21:51sdegutisuh oh
21:51sdegutisyou may wanna get that checked out
21:51hiredmanphilwhite: guy steele has a talk, I forget the actual title, but the subtitle is something like "cons considered harmful"
21:51hiredmanwhich addresses exactly that
21:51sdegutisrule #4 of #clojure is that sdegutis's jokes are not to be considered funny by anyone ever
21:52philwhitethere are just so many hours in the day to watch talks, but whatever, haha
21:52amalloyhiredman: https://vimeo.com/6624203
21:52sdegutisrule #1 is do not talk about #clojure, rule #2 is okay actually you can talk about #clojure but not too loudly
21:52amalloyOrganizing Functional Code for Parallel Execution; or, foldl and foldr Considered Slightly Harmful
21:52hiredmanhttp://xahlee.info/comp/i/ICFPAugust2009Steele.pdf
21:52hiredmanI misremembered
21:52hiredmanbut that
21:52sdegutisnobody's quite sure what rule #3 is but we can't just go and renumber all the rules after it
21:52sdegutis(cuz immutability)
21:53sdegutisand only ben_vulpes knows what rule #5 is, an he's not allowed to say
21:53philwhitehiredman: ahh, slides, thank you
21:53ben_vulpesit's trivially deduceable though from that i can't say
21:53sdegutisbut rule #6 is too well known, no haskell discussions allowed after midnight on the third and first tuesdays of the year
21:53ben_vulpeswe have a monad for it too!
21:53ben_vulpessdegutis: related, from corpslack today: http://i.imgur.com/gw7vIml.png
21:54sdegutisahh
21:54sdegutisben_vulpes: acknowledged.
21:54ben_vulpesi believe that's spelled 'ack'
21:55amalloydang. @channel. the height of rudeness.
21:55amalloy"i have a question so important and urgent i need everyone's attention right now"
21:56ben_vulpesamalloy: manners are contextual
21:56ben_vulpesDON'T TELL ME HOW I FEEL
21:56ben_vulpesDON'T TELL ME HOW I LOOK LIKE I FEEL
21:56ben_vulpesYOU DON'T HAVE GETTERS OR SETTERS FOR MY INTERNAL STATE OKAY
21:56ben_vulpesthat's /private/
21:56sdegutisben_vulpes: i actually have no idea how to spell it
21:57sdegutisamalloy: what is @channel?
21:57sdegutisoh, right, in the screenshot
21:57sdegutisit must be some Slack thing, right?
21:57ben_vulpesyes
21:57amalloyyes
21:57sdegutisben_vulpes: was that slack?
21:57ben_vulpesthe chat app that takes 4gb of ram
21:57ben_vulpesyes
21:58sdegutis#clojure?
21:58clojurebot#clojure is a clojure IRC channel for asking python questions
21:58ben_vulpeshoho clojurebot
21:58sdegutisnot anymore
21:58ben_vulpessdegutis: $corpslack
21:58ben_vulpes#clientproj
21:58sdegutisoh
21:58sdegutisim gonna assume $prefix is some kind of like server-delimiting prefix?
21:59sdegutislike $freenode?
21:59sdegutisSadly I have not kept up with Slack or how it works at all.
21:59ben_vulpesno it's a bashism
21:59ben_vulpesquit trolling me sdegutis
21:59sdegutisFortunately, my employer's efforts to incorporate Slack into our workflow did not work.
21:59sdegutisWe still use Skype, yay.
22:00ben_vulpesinadequate command and control.
22:01amalloyslack is pretty cool
22:02ben_vulpesburn the heretic
22:06sdegutisben_vulpes: whats cmd & ctrl
22:06sdegutisamalloy: I wouldn't be surprised to find you in #clojure on Clojurians.slack
22:07sdegutisYou seem like the kind of guy to get behind new tech stacks pretty quick
22:07ben_vulpessdegutis: you know, that thing mgmt does, intimidating dev and imposing flashy new pointless tools
22:08sdegutisben_vulpes: oh right
22:08TEttingermgmt the band or mgmt the management?
22:09sdegutisyes
22:09ben_vulpesno troll
22:09ben_vulpesplz no trolly
22:19philwhitehiredman: literally the first real slide of the Guy Steele talk has the point "MapReduce is good."
22:19philwhiteso there
23:04dimon_hi, does luminus has helper methods for rendering urls like Rails does: link_to "name", controller: , action: , id: ?
23:30sdegutisWelcome to #clojure.
23:40ben_vulpessdegutis: talking to himself again
23:40sdegutisben_vulpes: no he isn't
23:40ben_vulpesnobody else is
23:50sdegutisben_vulpes: you are :)