#clojure logs

2013-02-23

00:10Raynesalandipert: That's like a two hour drive.
00:30alandipertRaynes: yeahbutlike dude you're there :-)
00:30Rayneslol
01:29RaynesMan, antares_ thinks that Clojure documentation is ba
01:29Raynesd
01:29Rayneshttps://github.com/mozilla-servo/rust-http-client doesn't even have a readme.
02:10frozenlockRaynes: *troll* the code IS the documentation!
02:10RaynesIt's also a bit of a buggy mess, sadly.
02:10RaynesGuess I'm setting Rust aside for now.
02:11RaynesDarn. I'm running out of fun languages to write refheap-related stuff in.
02:11RaynesI guess I could do OCaml just to appease technomancy, but meh.
02:11frozenlockGuile?
02:12frozenlockHmmm.. I wonder if I could my webserver as a NAT traversal third party.
02:13frozenlockDealing with customers network config is a pain.
02:14Raynesfrozenlock: If I did Scheme it'd be racket
02:15frozenlockYeah DrRacket seems to be a nice environment.
02:16frozenlockEspecially with scribble that looks like a sane latex.
02:17pppaulwake
02:18pppaulsleep
02:34MacCoasterCan I forward declare something in another namespace? Trying to figure out how to be able to (load-file) something and refer to definitons found within the .clj i'm loading?
03:36nonubyin compojure I submit a search with several variables, i need to coerve the values of params from strings to bool for (checkboxes), jodas for datepickers, int for number of rooms etc. whats the best approach for this?
04:31borkdudeyesterday I read about emacs muse… darn, another option to explore. has anyone used it and good experiences with it?
05:42Pure_loulouhello room :) do you know any macro tutorial with examples?
06:39sveduboisI would like to write a simple 3d viewer (hide/unhide objects, shaders, import wavefront obj ...). I think http://www.jpct.net/ or http://jmonkeyengine.com/ are good options. Can you recommend me any 3d library?
06:44borkdudeI'm strugling with this elisp
06:44borkdudehttps://www.refheap.com/paste/11716
06:45borkdudedefine-counter gets called with the symbol counter, but I want to call it with the string represented by counter
06:45borkdudehow do I do it...
08:55meegoflHi, can anyone help me with why (union [1 2] [3 4]) - works and (difference [1 2] [2 3]) throws the following error?
08:55meegoflClassCastException clojure.lang.PersistentVector cannot be cast to clojure.lang.IPersistentSet clojure.core/disj (core.clj:1419)
08:56meegofli've applied (use 'clojure.set) as needed
08:58danierouxmeegofl: Because [] creates vectors, not sets
08:59meegofldanieroux: Thanks, is there any way to apply union/intersection/difference to list of vecs?
09:02danieroux,(set [1 2])
09:02clojurebot#{1 2}
09:02danierouxmeegofl: No, it operates on sets. But you can convert to sets
09:03meegofldanieroux: Thanks i saw the answer (set [1 2]) and it works!
09:41meegoflif i have a ref to set of refs to sets - any short way to deref all inner refs to a list?
09:42meegoflfor ex: #<Ref@65fe28a7: #{#<Ref@2f26f304: #{2 4}> #<Ref@4eb0a518: #{2 3}> #<Ref@3f6ff2d9: #{1 2}>}> -> { {1 2} {2 3} {2 4} }
10:48TimMc(dosync (map deref @top-thing))
10:49TimMcmeegofl: ^
10:55sturnerGetting started with clojure here -- is there a good current guide for getting going with emacs, slime, nrepl etc? Counterclockwise seems OK but after watching some experts in emacs… I was amazed.
10:58kryftsturner: Where did you watch experts in emacs?
11:01bbloomsturner: http://clojure-doc.org/articles/content.html#emacs_for_clojure_development
11:03sturnerI went to a clojure group.. and was amazed by the presenter(s) fluid movements in code/repl
11:03gilliesi have redis.clj and core.clj. in core.clj, redis.clj is required as r. how do i get to a method like r/car/ping
11:03gillieswhere car is carmine required in redis.clj
12:17clojure-newbhey guys… I'm hitting some performance issues in my code using vectors, specifically 'mapv' in one area, and 'into []' in another… can anyone explain why this may be happening ?
12:19mpenetclojure-newb: put the code on refheap or some other pastebin
12:20clojure-newbmpenet: ok, I will put sample code up, thx
12:35gfredericksdoes subvec give you an efficiently conj-able vector?
12:37tomojyes
12:38gfredericksI do not understand how that works.
12:38tomojit just assoc's or conj's onto the original vector
12:38tomojAPersistentVector$SubVector
12:38gfredericksoh.
12:38gfredericksthat makes crazy sense.
12:39gfredericksI knew it kept a reference to the original vector but it didn't occur to me it could update it
12:49gilliesis there a way to tell if the current code is being evaluated by repl?
12:49gilliesi want to have a message output if in repl
12:54ivangillies: why not just write another function or add an argument?
12:54gilliesivan: i could do that, was just curious if its possible
12:55ivanthrow an exception and check if the stack contains a "repl" but do not ever do this
12:56gilliesheh ok
12:56ivanthere might be a binding that is different in REPL too, I don't know
12:56gilliesthnx
12:56clojure-newbmpenet: hi, I put together a samples of my problems with performance (vector related I think) : https://www.refheap.com/paste/11721
12:59tomojconkeror+refheap'ers: https://www.refheap.com/paste/f2f3afe8c98bc786983f899ad
13:20clojure-newbjust wondering if transients… type hints or something else entirely would help me out with the performance problem I have tried to document at : https://www.refheap.com/paste/11721
13:24gfredericksclojure-newb: that should get you a vector of lazy seqs; should be fast.
13:25clojure-newbgfredericks: 'mapv' ?
13:25gfredericksclojure-newb: do the reported times include printing the datastructure at the repl?
13:26clojure-newbgfredericks: no… I've seen ~ 1000 take ~ 25 seconds no printing
13:26clojure-newband the 'into []' comparable
13:26gfredericks,(time (into [] (repeat 10000 {})))
13:26clojurebot"Elapsed time: 33.102355 msecs"\n[{} {} {} {} {} ...]
13:26clojure-newbmore commonly I am dealing with ~ 40,000-50,000 items and it is unusable
13:27gfredericksare you obtaining the data via some sort of I/O?
13:28clojure-newbgfredericks: yes, I have already read it in via a 'tsv' file into a vector
13:29gfredericksfyi, into already uses transients
13:29clojure-newbgfredericks: oh
13:30gfredericksI don't have any ideas just looking at this. I'd try to bisect the difference between the code you're running and the code I plugged into clojurebot above
13:33clojure-newbgfredericks: you mean figure out what my data structure is like compared to your '(repeat x {})' ?
13:34gfredericksyeah; figure out the essential difference that makes yours slow and mine fast. Both the data and the transformation.
13:34clojure-newbgfredericks: I'll dig deeper, thx
13:38holohu
13:42clojure-newbgfredericks: how do I get and debug/print the first item of a LazySeq ?
13:42luxbockhow do I use Incanter from Emacs' nrepl? I installed Incanter with git clone and then downloaded all the dependencies with 'lein deps', and I can get it working if I run 'lein repl' from the folder to which Incanter was cloned to
13:43luxbockbut if I try to run it from Emacs or a repl started from some other directory then (use '[incanter]) doesn't find it
13:44holowith a multiple arity function definition, i want to use a let after the function name and before declaring the arguments and expressions so that i can alias code that i need to use in multiple expressions. is this possible? i don't want to write a defn- for that alias
13:45clojure-newbI think my data structure is a sequence of maps, but it is lazy (probably why I was calling 'into [] my-data'
13:45nightflyholo: You can do the function definition inside of a let
13:45holoclojure-newb, first doesn't work?
13:46holonightfly but the function input arguments have to come before, afaik. i want them to go after
13:48holonightfly, here's a sample of what i want. obviously this doesn't work https://gist.github.com/ccfontes/5020842
13:48clojure-newbholo: yes thx
13:48gfredericksholo: you can put the let around the defn
13:49nightflyhttps://gist.github.com/nightfly19/5020848
13:49hologfredericks, genious! thanks
13:50holonightfly, thanks
13:51gfredericksnightfly is a faster genius
13:55clojure-newbgfredericks: I'm starting to suspect something else is going on here… if I shunt eval'ing the LazySeq to some other operations, the bottleneck is suddenly there… so 'into []' is probably not to blame… my map has elements retrieved from diatomic… including refs etc…. and is taking ~ 25 seconds for ~ 1000 items
13:57clojure-newbif I take 'first my-data' from my program…. move it into an editor and reapply it outside the program environment with your 'repeat 1000 x' example it is quick enough
13:57gfredericksdatomic being slow maybe?
13:58clojure-newbgfredericks: I've already got the results out of datomic I thought… but wondering if refs are hanging on to some execution thread…. or I've not got results in the right way...
13:58clojure-newbthink I will try getting my results out a different way,,, see how I do
13:59clojure-newbgfredericks: sorry for vagueness, thx for helping me think my way out of this deadend
14:03gfrederickssure
14:11pepijndevosclojurescript one is quite outdated, right?
14:16gfredericksprobably
14:19frozenlockWe should update it to add an outdated warning.
14:21gfredericksor upgrade it and rename it "clojurescript two"
14:21frozenlockAren't we funny
14:22gfrederickssoooo funny
14:29gfredericksoh man I have a (doseq [... :let [... (for [... :let [...]])]])
14:30pepijndevosgrm, this browserscript repl is not easy to get going :(
14:31pepijndevosI'm using cljsbuild, and a simple file that is supposed to connect tot he localhost
14:31pepijndevosthe local repl is listening, but the browser is just spewing errors.
14:32pepijndevoshttp://localhost:9000/repl?xpc=%7B%22cn%22%3A%22Sz2qth0Pns%22%2C%22tp%22%3Anull%2C%22osh%22%3Anull%2C%22ppu%22%3A%22file%3A%2Frobots.txt%22%2C%22lpu%22%3A%22http%3A%2F%2Flocalhost%3A9000%2Frobots.txt%22%7DFailed to load resource: Could not connect to the server.
14:32pepijndevosBefore that it gave some dom error, so I found out you had to wrap it in a callback when the dom is ready. This stuff is hard without jquery.
14:41pepijndevosIn all examples it doesn't show this onload crap. I must be doing something terribly wrong
14:44pepijndevosI removed the onload and moved the script to the bottom of the page, which has the same effect as before: Failed to load resource: Could not connect to the server.
14:48pepijndevos"REPL will not work with mixed protocols" ahhhh, so I will have to set up a web server to serve this piece of html.
14:49tomojwhat's the lamina operator for setting up siphon-like closing between two channels?
14:50tomojwell I guess (l/on-closed ch #(l/close ch')) works
14:52tomoj..or rather (l/on-closed ch' #(l/close ch))
14:54actsasgeekis anyone using emacs + evil and nrepl and re-bound the keys to something more like slimv's (which I think are swank's) bindings?
15:08augustlwhen I use logback + clojure.tools.logging, is there a way other than having "logback.xml" in classpath to configure it?
15:22pepijndevosdoh, all this trouble of setting up a http server for my silly js file. ragequit
15:30pepijndevosThe problem is clearly that it's just not listening on port 9000. curl also thinks it can't connect.
15:31augustlwhat's the easy mode way of writing clojure data/EDN to a file?
15:31gfredericksspit with pr-str?
15:31pepijndevosaugustl: spit?
15:31pepijndevossounds about right
15:32rhg135Hello, how's a good way to structure, say, an irc bot? I'm quite new to functional programming, although I want to great at object oriented design lol.
15:33rhg135S/want /wasn't /
15:33augustlgfredericks, pepijndevos thanks :)
15:33pepijndevosrhg135: maybe have a look at the source code for lazybot.
15:33xeqirhg135: you could look at lazybot or clojurebot
15:33antares_rhg135: take a look at https://github.com/hiredman/clojurebot, although it's not exactly the smallest or simplest project
15:33rhg135It's a lesson in design for me
15:37rhg135I still would like to know some design patterns
15:38hcumberd`rhg135: design patterns?
15:38gfrederickshttps://strange-loop-2012-notes.readthedocs.org/en/latest/monday/functional-design-patterns.html
15:38gfredericksrhg135: ^
15:39rhg135Thank you.
15:39clojurebotexcusez-moi
15:42rhg135Sorry to ask more, how do you manage mutable java objects, say java sockets, in a multiple threads?
15:43michaelr525hello
15:44bbloomrhg135: you manage mutable java objects using java's normal concurrency primitives
15:44bbloomrhg135: but only if you have to. if you can help it, you should prefer to use immutable data structures & clojure's concurrency primitives
15:45rhg135I'm not a Java programmer, can you elaborate.
15:49gfredericksusing enlive like it's hiccup is a terrible idea :(
15:52dimovichhello ppl
15:53dimovichI'm trying to do this tutorial on core.logic: http://jrheard.tumblr.com/post/43575891007/explorations-in-clojures-core-logic
15:53dimovichbut seems featurec function is missing from core.logic
15:53dimovichhas it been replaced, or am I missing some steps?
15:53gfredericksdimovich: what version of core.logic are you using?
15:53dimovich0.7.5
15:53gfredericksI think that one's old
15:58dimovichgfredericks: indeed, latest dev version works fine
15:58dimovichthanks
15:58gfredericksyep
15:59gfrederickscore.logic has had a _lot_ of work since the last stable release
15:59gfredericksevery week dnolen invents a totally new kind of logic and makes it run faster on clojurescript than equivalent assembly code impls
15:59gfredericksthen he has breakfast
15:59ChongLihopefully that stuff will find its way into a new release :)
16:14aibI'm simply doing (:use [clojure.tools.logging]) - but debug and trace messages are not displayed by default. how can I enable them? do I have to do this? : http://www.paullegato.com/blog/setting-clojure-log-level/
16:22tmciverCan someone explain to me how clojure.java.io/resource is supposed to work? When I run 'lein uberjar' on my web app, I can see the resource file of interest has been copied from my resource dir to the root of the jar, but c.j.io/resource does not seem to find it. Any ideas?
16:23gfrederickstmciver: for the file /resources/foo.txt, (resource "foo.txt") should find it
16:25tmciverIn the interest of full disclosure this is a .clj file of a data structure that has been prn'd. It is originally in a /data directory and I've set :resources-path to "data". In any case the file seems to make it into the root of the jar.
16:26tmciverBut (resource ...) does not seem to find it.
16:26tmciverI'm probably doing something studid.
16:26tmcivers/studid/stupid !
16:27gfredericksI have no ideas. all that sounds reasonable.
16:28tmcivergfredericks: you let me down, man.
16:28gfredericks(dec gfredericks)
16:28lazybotYou can't adjust your own karma.
16:29tmciverNo! I won't hear of it.
16:29tmciver(inc gfredericks)
16:29lazybot⇒ 15
16:29gfredericksfrom one semiprime to another
16:30jeremyheilertmciver, Are doing (resource "/foo.clj") or (resource "foo.clj")?
16:30tmciverjeremyheiler: the latter, I believe.
16:30tmciverLet me be sure.
16:31jeremyheilerThe latter is the correct way.
16:33zackzackzackAny idea why a clojure process wouldn't be able to max out CPU on an aws box?
16:33gfredericksis it IO bound?
16:33gfrederickslots of random memory access?
16:34zackzackzackProbably IO bound.
16:34zackzackzackh/o
16:35zackzackzackhttps://github.com/zmaril/bumi/blob/master/src/bumi/core.clj#L79
16:35zackzackzackLoading in a git repo into a graph database via pmap
16:46Bronsagogit
16:46Bronsabut irc is not my firefox windows.
16:46Bronsasorry.
17:15modulusSo guys, a question about hiccup. on other template systems i can override common elements like a title from another view, in a sort of inheritance way. is this possible to do with hiccup and how?
17:16bbloommodulus: create a function
17:16bbloommodulus: pass it arguments, it's that simple
17:16bbloom(defhtml header [title] [:h1 title])
17:19modulushmm ok, i think i probably didn't convey what i mean very well. i'm using noir and there's this common view that comes by default with a defpartial
17:20modulusso this view has a set [:title "bla"] element. is there a clean awy to make it so that this title is overridden from another view which uses this, but only if there's a different title to set? or should i maybe instead of pass content pass some kind of map with potential overridings, or what's the sane way to do this?
17:21frozenlockI would go with functions and argument too on this one...
17:21bbloommodulus: yeah, you can pass a map of overrides and just merge in the defaults at some point
17:21bbloomeither via (merge defaults overrides)
17:21bbloomor use (get overrides :title default)
17:21frozenlock(defn my-fn [x] (html [:title (or "blah" x)]))
17:21frozenlock(or x "blah") rather
17:22bbloomor do what frozenlock suggests if you want positional arguments
17:22moduluspositional arguments are the evil, i don't want to remember every bit of the page that may be overridable
17:22modulusthanks, i think that's doable like you say, bbloom
17:22bbloommodulus: agreed, prefer an override map
17:23bbloomand even consider using namespaced keys!
17:23moduluswhat would (get overrides :title default) return? default if there's no :title on overrides?
17:23bbloommodulus: however, positional arguments are useful in many cases here. consider if you had exactly one argument that you *always* wanted to override. like say a header partial that always takes a title argument
17:24bbloom,(let [overrides {:foo :overridden}] (get overrides :foo :default))
17:24clojurebot:overridden
17:24bbloom,(let [overrides {:foo :overridden}] (get overrides :bar :default))
17:24clojurebot:default
17:24bbloomalternatively, call the keyword directly:
17:24bbloom,(let [overrides {:foo :overridden}] (:bar overrides :default))
17:24clojurebot:default
17:24bbloom,(let [overrides {:foo :overridden}] (:foo overrides :default))
17:24clojurebot:overridden
17:25bbloom"layouts" and fill-in-the-blank content_for templating are exceedingly complex
17:25bbloomyou can, however, achieve very similar behavior using a dynamic variable: (def ^:dynamic regions {})
17:26bbloom(defn content_for [region] (get regions region))
17:26modulusthat use of maps is pretty shiney, hadn't seen it before.
17:26bbloom(binding [regions (assoc regions :title "foo")] ...)
17:27modulusit's pity that there's no simple way to do hierarchical templating, that's a really good part in django imo
17:28bbloommodulus: no, it's a pity that python and ruby lack the necessary abstractions such that a hierarchical templating system must be created
17:28bbloom:-P
17:28bbloomyou can trivially implement everything django's templating does with maps, dynamic variables, function calls, macros, etc
17:28bbloomit's so simple that hiccup et al don't provide tools to do that
17:29bbloomb/c it would be a waste
17:29modulusoh, i agree; but i'd have expected to have been implemented already
17:29bbloomit *is* implemented already. in clojure
17:29bbloomclojure itself, i mean
17:29bbloomclojure has a powerful namespace system with flexible scoping, binding, resolution, etc
17:29moduluslet clojure be, and there was light ;-) i agree the language is well suited to adding this, but it's still something one must do on top.
17:30modulusanyway this stuff with maps is really neat, i think i'll probably do something like that.
17:31bbloommodulus: not really.... templates are just functions tuned for a different syntax. there's nothing to build "on top"
17:31bbloomif you find yourself writing a complex templating system, you're likely recreating a feature clojure already has
17:33moduluswell, imagine i have v1 that has title "my title". on view v2, i want to add ": my user page" and view v3 which calls v2, i want to add ": profile". while i'm sure i can do this with care, it seems the sort of place a DSL would do considerable good, no?
17:34modulusso v3 would produce [:title "my title: my user page: profile"]
17:35bbloommodulus: hiccup will stitch together seqs of neighboring strings and will omit nils, so just do (defhtml [title-parts] [:title title-parts])
17:35bbloomand you can abstract over it:
17:35bbloomer that needed a name:
17:35bbloom(defhtml v0 [title-parts] [:title title-parts])
17:36bbloom(defhtml v1 [title-parts] (v0 (cons "my title" title-parts)))
17:36bbloomor whatever
17:36modulusright, i will look into this, so far i have only see html produced with (html5) function
17:56tcscwhat's the rationale for clojure having separate types for symbols and keywords?
18:00katoxhi, I've been trying to up some clojurescript running
18:00katoxfor starter I tried to use M0003 of clojurescriptone
18:00katoxthe dev-server is up, the app is alive but I have trouble running repls
18:01bbloomtcsc: there are several
18:01bbloomtcsc: keywords are just symbols that are guarented to resolve to themselves
18:01katoxnrepl is fine, but cljs-repl writes "ClojureScript:cljs.user> java.io.IOException: Write end dead" indefinitely
18:01bbloomtcsc: that's convenient for a lot of use cases, but it also means that keywords can be interned for fast equality comparisons using `identical? instead of using `=
18:02tcscbbloom: thats not that different than quoting them though, is it?
18:02bbloomtcsc: it is *subtly* different
18:02bbloomquoting it is what you'd do in common lisp, generally
18:03bbloomhowever, it's like quoting it AND also defining it to itself:
18:03bbloom(def foo 'foo) ....... 'foo
18:03bbloomthis way if you ever resolve 'foo, you get 'foo
18:03bbloombut since it's a different type, you can skip the resolve-to-self step and just not do anything
18:03katoxsomething in the settings or should I disregard clojurescriptone project for now and start elsewhere? (and where if so?)
18:04bbloomadditionally, symbols have metadata, but keywords do not, since keywords with a particular qualified name are only ever instantiated once
18:04bbloomtcsc: does that all make sense?
18:05tcscyes, but i guess i'm fuzzy on the why of it
18:05bbloom,(= 'foo 'foo)
18:05clojurebottrue
18:05bbloom,(= :foo :foo)
18:05clojurebottrue
18:05bbloom,(identical? 'foo 'foo)
18:05clojurebotfalse
18:05bbloom,(identical? :foo :foo)
18:05clojurebottrue
18:05tcscoh, that's surprising
18:05bbloomit's not surprising when you consider:
18:05bbloom,(meta ^:foo 'bar)
18:05clojurebotnil
18:05bbloomer rather:
18:06bbloom,(meta (with-meta 'bar {:foo true}))
18:06clojurebot{:foo true}
18:06bbloom,(= (with-meta 'foo {:x true}) (with-meta 'foo {:x false}))
18:06clojurebottrue
18:06bbloom,(= (meta (with-meta 'foo {:x true})) (meta (with-meta 'foo {:x false})))
18:06clojurebotfalse
18:07bbloomhowever:
18:07bbloom,(istance? clojure.lang.IMeta :foo)
18:07clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: istance? in this context, compiling:(NO_SOURCE_PATH:0:0)>
18:07bbloom,(instance? clojure.lang.IMeta :foo)
18:07clojurebotfalse
18:07bbloomcompared to:
18:07bbloom,(instance? clojure.lang.IMeta 'foo)
18:07clojurebottrue
18:07bbloomthat should cover all the important differences :-)
18:08bbloomRaynes: someday soon, there will be a decent GUI toolkit library... i promise :-)
18:08Raynesbbloom: Seesaw is very nice though.
18:09RaynesI just don't know how to use it is all.
18:09bblooms/soon/in the medium to distant future/
18:09RaynesI'm learning.
18:17rhg135Hello again, i'm trying to composes two functions with comp, but the first might return nil, Is there is a simpler way to not throw an exception similar to -?> or haskell's >>=
18:18bbloom(doc fnil)
18:18clojurebot"([f x] [f x y] [f x y z]); Takes a function f, and returns a function that calls f, replacing a nil first argument to f with the supplied value x. Higher arity versions can replace arguments in the second and third positions (y, z). Note that the function f can take any number of arguments, not just the one(s) being nil-patched."
18:19bbloomprobably doesn't help you tho
18:19bbloommaybe it does
18:19bbloomyou can probably define a comp-maybe pretty easily
18:20rhg135No, I'm looking for -?> composition
18:20bbloomdo you want a macro or a function?
18:20bbloompresumably a function
18:20rhg135Okay I could write a macro.
18:21bbloomwell -?> is already a "maybe" macro
18:22rhg135Yeah just thought they're might be a composition function.
18:22bbloomrhg135: not one in core, but it's really easy to make one
18:23rhg135I'll write one based on -?>
18:23bbloom(defn propegate-nil [f] (fn [x] (when-not (nil? x) (f x)))
18:24bbloom(defn comp-maybe [f g] ((propegate-nil f) (g f)))
18:24bbloomand you can make a variadic version of comp-maybe quite trivially
18:24bbloomshould do the trick
18:25bbloomalthough, most of the operations that normally require maybe-style logic, tend to do it automatically... like lookups:
18:25bbloom,(-> {} :foo :bar :baz)
18:25clojurebotnil
19:00shriphanihi everyone. I am new to clojure, lein and the jvm in general. I am trying to find out what the best way to search for repos is. Is there something like python's pip or easy_install for clojure ?
19:01bbloomshriphani: https://clojars.org/
19:01bbloomshriphani: and http://www.clojuresphere.com/
19:01bbloomprobably some others
19:02bbloomsee also: http://clojure-doc.org/ for ecosystem & tools info
19:04shriphanibbloom: so those sites don't do java .jars I am guessing ?
19:05bbloomclojure libs are just jars
19:06shriphanibbloom: but if there's a java jar you add it to your lib directory yourself ?
19:07bbloomyou just add to your project.clj a dependency and, if necessary, a repository
19:07bbloomsee the lein docs
19:07bbloomwiki on github
19:10rhg135quick question again, is there an easy way to namespace keywords? Say I have bot.message required as msg, is there something like :msg/msg or do I have to type it out each time as :bot.message/msg?
19:10bbloomrhg135: if you have an "alias" in your 'ns form, then you can use :: like this:
19:10bbloom,::foo
19:10clojurebot:sandbox/foo
19:11rhg135?
19:11bbloomif you had (ns (:require [some.long.name :as short]))
19:11bbloomyou can do ::short/foo
19:11bbloomand that is the same as :some.long.name/foo
19:12rhg135oh, use :: not : Thank you. i'm such a noob sometimes
19:12bbloomrhg135: nah, i didn't know about how :: worked for MONTHS
19:12bbloomrhg135: dnolen had to set me straight :-
19:12bbloom))
19:13rhg135yeah I'm writing an IRC message parsing code for my IRC bot
19:17gfrederickscan somebody who understands encodings better than me explain what is wrong with http://upload.gfredericks.com/apostrophe.html ?
19:17gfredericksit displays incorrectly in the browser
19:17gfredericksdespite the header having utf8
19:18nightflyit displays fine for me
19:18gfredericksO_O
19:18gfredericksconsarnit.
19:18gfrederickswhat browser?
19:19gfredericksthe file displays fine in emacs for me, but in chrome it's garbled
19:19nightflyChrome on linux
19:30gfrederickshexl-mode and `od -x` disagree about the contents of the file !?!
19:32gfredericksoh they have different endianness :(
20:00ryanfis there good idiom in clojure for saying, "if this thing is a seq, do nothing, but if it's not a seq, make it into a seq of one element"?
20:00ryanf+a
20:00ryanfactually maybe wanting something like that is a sign of disordered thinking :)
20:24yedi_what non blocking database solutions exist in clojure?
20:28gfredericksryanf: yeah it's a bit weird
20:28gfredericksryanf: easy to implement though
20:32arrdemso after looking at some of my code I realized that I was faking a type system by performing implicitly typed operations on maps which were equivalent to an object from any other language. Is this expected and normal? 'cause I consider it fairly strange while workable.
20:32gfrederickswhat are implicitly typed operations?
20:33arrdem(foo x) where x is expected to be a map with some keys of types due to stuff like (update-in x [:foo :bar] assoc :x 1)
20:34arrdemI'm assuming that the argument X is a map following the form of my pseudo-type
20:38shriphaniHello everyone. I am possibly not thinking right here. Clojure complains that it can't see warc-file-stats: https://www.refheap.com/paste/11724
20:38TimMcarrdem: Quite common.
20:41arrdemTimMc: why is this the common pattern tho? seperation of transformations from state?
20:41shriphaniI can do def foo(): foo1(); \n\n def foo1() in Python. Is this not allowed in clojure ?
20:42arrdemshriphani: your syntax is all wrong but something like that is possible.
20:42arrdemshriphani: (declare foo foo1) (defn foo [] (foo1)) (defn foo1 [] .... )
20:43shriphanioh I need the declare at the top ?
20:44arrdemshriphani: so declare is weird.
20:44arrdemordinarily you will never (declare) anything if avoidable
20:44arrdemhowever you can only use symbols which have been defined or declared
20:44TimMcarrdem: I'd like to see a helper fn that makes pre-/post-conditions easy to write for testing pseudo-types.
20:45arrdemso you can ether (defn foo1 [] ... ) (defn foo [] ... (foo1)) which is common
20:45shriphaniarrdem: so you put main at the bottom of the file ?
20:45arrdemusuallu
20:45arrdem*usually
20:45arrdemthe hope is that you read from top to bottom building context
20:45TimMcarrdem: As for why, it's more dynamic. Formal types are restrictive, even if they do have some big benefits.
20:46arrdemTimMc: so would I... I have a blog post on its third or fourth draft revision about this
20:46arrdemand just wanted to test the waters here as it were
20:46TimMcarrdem: I'd like to be able to say "This is an object (or pseudotype) that *must* have such and such keys and *may* have such and such keys."
20:46arrdemTimMc: sold./
20:47TimMcI think the real value (besides catching the occasional bug) would be the documentation possibilities. :-)
20:48arrdemor more "the code is the documentation" and here's the specification for the arguments
20:48arrdemherm.. (defpseudotype)?
20:48arrdemew.
20:49TimMc(def (
20:51TimMc(def a-foo (soft-type :needs #{a b c} :allows #{d e}))
20:52TimMcand then {:pre [(a-foo x)]} or maybe a more explicit predicate
20:53TimMcI haven't looked into the opt-in typing work that some folks have done with Clojure, so my suggestions are uninformed by prior work.
20:53arrdem(def foo (typedfn [a a-foo b b-bar] (or (:foo a) (:bar b))))
20:53TimMcAnd that would expand to have the appropriate pre-/post-conditions?
20:54arrdemthat'd just give you preconditions on the type(s) of the arguments using let-ish semantics
20:54arrdem[name, predicate]+
20:54arrdempostconditions...
20:54arrdemherumph
20:57TimMcYou'd want a form that expanded to defn, by the way -- defn is unfortunately not simply a convenience macro. The Clojure compiler uses it to arrange some optimizations.
20:57gilliesi have a vector of maps like [{:foo "bar" :biz "baz"} {:foo "sds" :biz "sdasdasd"}]. How do i map over the vector and return the values of whos key is :foo?
20:57TimMcgillies: for
20:57gilliesTimMc: thanks
20:58TimMcgillies: Wait, I misunderstood.
20:58TimMcThe output here would be ("bar" "sds")? Just (map :foo ...)
20:58gilliesTimMc: the keys are strings
20:59gilliesi guess i could convert them to keywords
20:59arrdemTimMc: yeah understood, I just hated the name (deftypedfn <identical usage> ) so I tried to do the (def) thang
20:59TimMcgillies: I don't understand. What would the output be for the input you listed?
20:59gilliesTimMc: i made a typo in my example
20:59gillieskeys are "foo" not :foo my bad
21:00gilliesoutput is what you said it was
21:00gilliesbut mapping over string map keys is evading me
21:01TimMcYou could do it the boring way... (map #(get % "foo") ...)
21:01TimMc...or the fun way, with juxt.
21:02TimMc&(let [my-maps [{:foo "bar" :biz "baz"} {:foo "sds" :biz "sdasdasd"}]] ((apply juxt my-maps) :foo))
21:02lazybot⇒ ["bar" "sds"]
21:02TimMc(I used :foo instead of "foo", but it would still work.)
21:03gilliesi ended up using (map :foo (keywordize-keys the-hash-map))
21:04gillieswhat &(...) syntax?
21:04gilliesnot familiar with that
21:05arrdemgillies: it's so that the #clojure bots will eval the code
21:05arrdemgillies: &(println "Lazybot here")
21:05arrdem&(println "Lazybot here")
21:05lazybot⇒ Lazybot here nil
21:05arrdem,(println "Clojurebot here")
21:05clojurebotClojurebot here\n
21:06gillies&(doc map)
21:06lazybot⇒ "([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls]); Returns a lazy sequence consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhaust... https://www.refheap.com/paste/11725
21:06gilliesheh
21:06gilliesnever seen juxt before
21:07gilliesoh juxtaposition is an actual functional term
21:09TimMc~juxt
21:09clojurebotjuxt is the bestest option though if it doesn't weird you out
21:10arrdem,(doc juxt)
21:10clojurebot"([f] [f g] [f g h] [f g h & fs]); Takes a set of functions and returns a fn that is the juxtaposition of those fns. The returned fn takes a variable number of args, and returns a vector containing the result of applying each fn to the args (left-to-right). ((juxt a b c) x) => [(a x) (b x) (c x)]"
21:11arrdemoh baller
22:21ryanfany obvious suggestions for making this code more idiomatic? https://gist.github.com/rf-/7bdbc47e54ab17188513
22:21ryanfit feels super procedural :(
22:21ryanfit's probably partly because the stuff I've implemented so far is just state manipulation
22:25gfredericksryanf: curious why players is a ref rather than an atom
22:25ryanfhmm
22:26arrdem,(doc fmap)
22:26clojurebotCool story bro.
22:26arrdemwat
22:26ryanfwell earlier I was recording the last message (because I will need to do stuff with it later)
22:26ryanfso I kind of felt like it was a good idea to make the player list and last message both be refs and update them in a transaction
22:26ryanfbut that turned out to be pretty awkward with the message-sending anyway, so I just dropped it for now
22:27arrdem,(doc map)
22:27clojurebot"([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & ...]); Returns a lazy sequence consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments."
22:30arrdem,(doc comp)
22:30clojurebot"([] [f] [f g] [f g h] [f1 f2 f3 & fs]); Takes a set of functions and returns a fn that is the composition of those fns. The returned fn takes a variable number of args, applies the rightmost of fns to the args, the next fn (right-to-left) to the result, etc."
22:30ryanfI guess maybe a more functional way to do this would be to build up a list of pending messages and send them after returning from the message handler?
22:30ryanfmaybe that's overkill
22:30ryanfI'm just flailing around really :)
22:32arrdemTimMc: predicates on :allows ? or just existance for a draft...
22:38arrdem,(doc and)
22:38clojurebot"([] [x] [x & next]); Evaluates exprs one at a time, from left to right. If a form returns logical false (nil or false), and returns that value and doesn't evaluate any of the other expressions, otherwise it returns the value of the last expr. (and) returns true."
22:39arrdemdoes clojure protect against recursive macros?
22:39gfredericksprotect against?
22:40arrdem,(defmacro a [] `(b)) (defmacro b [] `(a)) (b)
22:40clojurebot#<Exception java.lang.Exception: SANBOX DENIED>
22:40gfrederickswhat's wrong with that?
22:40arrdemdepending on how clojure does macro expansion it could mutually recur ad infinitum
22:41gfredericksit will
22:41arrdemgood!
22:41arrdemwhat I'm writing will work!
22:41gfredericks:)
22:42arrdemX-P the time I failed at writing a recursive OR in C macros because it's not a real macro system
22:46TimMcarrdem: Just existence of a predetermined set of keys.
22:47TimMcarrdem: There's already an infinite macroexpand you can do with core, due to a bug.
22:48arrdemTimMc: I just found a really cute syntax which'll let you specify predicate tests (optinally) for the keys
22:48arrdemexcept for the :needs and :allows keys
22:54TimMc&(macroexpand '(->> a b (->> c d)))
22:54lazybotjava.lang.StackOverflowError
22:55RaynesOh my.
22:55RaynesThat's cool.
22:55Raynes,(macroexpand '(->> a b (->> c d)))
22:55clojurebot#<StackOverflowError java.lang.StackOverflowError>
22:55TimMcIt's a 4-cycle loop.
22:55gfredericksthat's much nicer than the original one you found
22:56TimMcyeah
22:56gfredericksdoesn't look nearly as contrived
22:56TimMcIt's just a simplification of that one.
22:56gfrederickswell I guess nested ->> shouldn't ever be necessary like that
22:56gfredericksso still contrived
22:57RaynesTimMc: Oh man, I just realized how that works. I love you Tim.
22:59TimMcRaynes: gfredericks submitted a patch that fixes it.
22:59TimMcIt's *really* not supposed to do that.
22:59gfredericksbe careful with your recursive macros kids
23:00TimMcCLJ-1121 if anyone cares.
23:00arrdemvery cute tho
23:02TimMcRaynes: The amazing thing is that I stumbled onto it by accident, IIRC.
23:02preyaloneI'm teaching myself Clojure... FizzBuzz isn't printing correctly :( https://gist.github.com/mcandre/5022526
23:02TimMcI was doing some horribly nasty things in the name of swearjure.
23:03arrdem,(doc ident
23:03clojurebot#<RuntimeException java.lang.RuntimeException: EOF while reading>
23:03arrdem,(doc ident)
23:03clojurebotGabh mo leithscéal?
23:04arrdem,(map identity {:foo 1 :bar 2})
23:04clojurebot([:foo 1] [:bar 2])
23:05gfrederickspreyalone: it's not printing at all, correct?
23:05muhoo,(map type {:foo 1 :bar 2})
23:05clojurebot(clojure.lang.MapEntry clojure.lang.MapEntry)
23:06muhoointeresting. they look like vectors, but they ain't.
23:06gfrederickslike how seqs look like lists
23:06ivangfredericks: it's printing the nils from the map output as well as the right stuff
23:06gfredericksand finger trees look like fingers
23:07gfredericksivan: oh is that a `lein run` thing?
23:07ivannope
23:07preyalonegfredericks: correct
23:07ivanhuh
23:08gfredericksivan: I would expect the return value from main to be ignored
23:08ivanyeah, I'm a dummy, trying this in my nREPL
23:08gfrederickspreyalone: you should look at doseq instead of map; laziness is thwarting you here
23:08preyalonegfredericks: I thought so! Thanks!
23:11preyalonegfredericks: If I want to continue using lazy (range), should I be using something like (take) / (drop) ?
23:12gfredericksno your use of range is fine
23:12gfredericksthe problem is using map when the function has side effects
23:12gfredericksyou can use doseq with range
23:13arrdemwhat was the quote-dequote trick for symbols in macros?
23:13arrdem,`~foo
23:13clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:0:0)>
23:14preyalonegfredericks: Wow, I feel like I'm doing mapM_ from Haskell.
23:15gfredericksarrdem: ##`~'foo
23:15lazybot⇒ foo
23:15gfrederickspreyalone: maybe you are; I wish I could remember :(
23:15preyaloneThanks, it works now!
23:16preyalonegfredericks: I <3 Haskell, so I find Clojure interesting for its selective laziness.
23:16preyaloneDoes Clojure have anything like Haskell GADTs?
23:19preyaloneWhy do Clojure function arguments use vectors rather than lists?
23:20arrdemgfredericks: isn't ~'foo equivalent?
23:20Sgeovectors in syntax have the connotation of none of the elements being in a "special" position
23:20arrdem,(= ~'foo ##`~'foo)
23:20lazybot⇒ foo
23:20clojurebot#<RuntimeException java.lang.RuntimeException: Reader tag must be a symbol>
23:21TimMcarrdem: ## is a lazybot inline eval trigger
23:21muhooi'm still puzzling out the difference between ~'foo and '~foo
23:21gfredericks,~'foo
23:21clojurebot#<IllegalStateException java.lang.IllegalStateException: Attempting to call unbound fn: #'clojure.core/unquote>
23:22Sgeopreyalone, whereas, in function/macro application, the first element is "special", it names the function or macro
23:22gfredericksmuhoo: '~foo is going te evaluate foo
23:22SgeoWell, not "names" in the case of functions, Clojure does have first-class functions
23:23gfrederickspreyalone: no GADTs, I don't think they make as much sense with dynamic types
23:23preyaloneThanks
23:23arrdemTimMc: Ah thanks.
23:23muhoogfredericks: but ##(= '~foo foo)
23:23lazybotjava.lang.RuntimeException: Unable to resolve symbol: foo in this context
23:23muhoofine
23:23preyaloneAre Clojure trees specified with ((a . b) . (c . d)) as in Common Lisp?
23:23muhoogfredericks: but ##(let [foo "bar"] (= '~foo foo))
23:23lazybot⇒ false
23:23arrdemI don't think we even have cons cells..
23:23Sgeopreyalone, I know some Haskell and am trying to get back into it
23:24arrdem,(a . b)
23:24clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:0:0)>
23:24Sgeo(And have ranted about Haskell stuff in here in the past)
23:24arrdempreyalone: evidently not
23:24Sgeoarrdem, failure of that syntax only implies that the reader doesn't recognize that syntax, not that lists aren't made of cons cells
23:24arrdem[['a 'b] ['c 'd]]
23:24preyalonearrdem: If no cons, how does a Clojurer prepend an element to a list?
23:24Sgeo,(cons 1 (list 2 3 4))
23:24clojurebot(1 2 3 4)
23:25SgeoBut conj is preferred, it will append to the "fast" place to append for the data structure
23:25Sgeo,(conj (list 1 2 3) 4)
23:25clojurebot(4 1 2 3)
23:25Sgeo,(conj [1 2 3] 4)
23:25clojurebot[1 2 3 4]
23:25TimMcpreyalone: We have a fn called "cons", it's just that seqs and lists aren't always made of cons cells.
23:26TimMcpreyalone: What we *don't* have is pairs -- the cdr is always nil or a seq.
23:26Sgeo,(cons 1 2)
23:26clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long>
23:27preyalone,(head [1 2 3])
23:27clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: head in this context, compiling:(NO_SOURCE_PATH:0:0)>
23:27arrdemTimMc: is there any value in a (to-<pseudotype>) which just selects those keys?
23:27Sgeo,([1 2 3] 0)
23:27clojurebot1
23:27preyaloneNo (head) / (tail) either?
23:27arrdem(first) and (last)
23:27muhoopreyalone: ##(first [1 2 3])
23:27SgeoAlthough I think there is a function for head
23:27lazybot⇒ 1
23:27SgeoOh right
23:27TimMcarrdem: I can't think of any.
23:27Sgeo,(rest [1 2 3])
23:27clojurebot(2 3)
23:28preyalone(first) and (rest) are much appreciated.
23:28TimMcarrdem: Such transformations belong in application logic, not in pseudo-type-checking.
23:28muhooIIRC, first and rest are the basic building blocks of the whole seq abstraction
23:28Sgeopreyalone, do keep in mind that Clojure doesn't do TCO. For self-recursion, use recur/loop if it's a tail-call recursion
23:29arrdemTimMc: I agree, I'm just saying that the pseudotypedef could generate such transforming code for the application to use
23:29RaynesMan.
23:29RaynesTrying to debug a Haskell program while slightly intoxicated.
23:30arrdemRaynes: you sir are a brave man and I wish you well
23:30muhooRaynes: hey, you're not of drinking age in california :-)
23:30SgeoRaynes, hey, I recall you using Aeson, have you ever used the Template Haskell stuff for it?
23:30Raynesmuhoo: This is a fact.
23:30TimMcPerhaps you are insufficiently intoxicated.
23:30TimMcmuhoo: Maybe it's not alcohol.
23:30RaynesSgeo: Nope, Chris Done made me decide against that.
23:30preyaloneSgeo: As, replace the literal recursive call (my-func-again arg arg arg) with (recur my-func-again arg arg arg) ?
23:30RaynesTimMc, muhoo: Pretty sure drugs are illegal at any age.
23:30preyaloneRaynes: Gist it and I'll take a look
23:30Sgeopreyalone, don't mention my-func-again in the recur usage, but yes
23:30TimMcRaynes: Chocolate.
23:31Raynespreyalone: It's on Github. https://github.com/Raynes/refh
23:31muhooRaynes: not in california :-)
23:31TimMcMedical marijuana, perhaps.
23:31SgeoRaynes, hmm, what was wrong with it?
23:31muhooespecially the farther north you go.
23:31SgeoAs in, what did Chris Done say against it?
23:31RaynesSgeo: I don't remember.
23:31TimMcAlso, there are all sorts of exemptions with alcohol, such as serving a drink with dinner. (Varies by state.)
23:32muhooi lived in texas for a while. dry counties were a trip.
23:32preyaloneRaynes: I'd remove the prompt information in README. Just "$" is much clearer to people.
23:32RaynesSure. That was a copypasta.
23:33SgeoRaynes, I tried GHC under WINE once, seemed to work
23:33RaynesAnyways, cat foo.clj | refh is not working.
23:33preyaloneRaynes: As to Windows binaries, have you considered running Windows in a VM?
23:33RaynesI'm figuring out why.
23:33RaynesI have a Windows partition now, just haven't bothered to compile yet.
23:33RaynesAlso, don't give me the answer.
23:33RaynesI need this. :p
23:33muhooyou need to debug windows?
23:34RaynesNope.
23:34gfredericksmuhoo: did you figure out the ~' thing? I was away for a bit
23:35SgeoWithin `, ~'foo takes 'foo and pastes it in directly, so to speak. Whereas a bare symbol may get a namespace attached to it
23:35muhoogfredericks: naw, i probably need to re-read a bunch of stuff. this is one where i should sit down with the book i am reading and the ones i have already read, and my notes, and try to reconcile it all.
23:35Sgeo,`(1 ~(+ 2 3) 4)
23:35clojurebot(1 5 4)
23:35Sgeo,`(1 ~'foo 4)
23:35clojurebot(1 foo 4)
23:35Raynespreyalone: Found the issue. Thanks for the help.
23:36Sgeopreyalone, are you a rubber duck?
23:36preyaloneDaw, and I was just `cabal install`ing my new git fork of refh...
23:36RaynesYikes.
23:36gfredericksmuhoo: everything unquoted gets eval'd
23:36gfredericksso ~foo evals foo
23:36RaynesI thought I was still in paredit in this Haskell file so I did the C-u backspace trick to delete a bunch of shit.
23:37gfredericksputting the ' in front doesn't change that
23:37Raynespreyalone: Ouch. cabal sandbox-install!
23:37preyaloneWhat's the difference?
23:37RaynesI actually built cabal from master for this.
23:37RaynesI can't install anything without breaking my Haskell installation.
23:37preyaloneWell yeah
23:37preyaloneCabal is the worst part of Haskell.
23:37RaynesNot anymore.
23:37SgeoI am officially a pizzavore
23:38RaynesThey've added a sandbox mechanism to get you per-project package repositories.
23:38preyaloneI can't install MissingH and Random-Fu (or MissingH and GraphViz) at the same time :(
23:38RaynesSo you don't have to install things globally anymore.
23:38muhoogfredericks: i have to look at where fogus/chouser were doing '~foo then, and figure out why
23:38preyaloneSweet! Like npm then.
23:38gfredericksmuhoo: it's useful somethings
23:38gfrederickslike if you want to embed forms
23:39RaynesUnfortunately it isn't released yet but I've been using it for a few days now from master and it is working well.
23:39gfredericks(defmacro spy [expr] `(let [v# ~expr] (println '~expr "is" v#) v#))
23:39gfredericksmuhoo: ^
23:40muhoocool
23:41Raynespreyalone: Just pushed my fix if you're curious.
23:41preyaloneSure!
23:42preyaloneI like the POSIX support. cat | refh is cool.
23:43muhoowat? did you guys do a bash/curl implementation of refheap client?
23:43muhoogfredericks: that makes a lot more sense now, thanks
23:43gfredericksphew
23:44gfredericksTimMc: https://github.com/strangeloop/clojurewest2013/wiki/LightningSubmissions
23:44gfrederickshyPiRion: ^
23:45SgeoRaynes, putStrLn $ show parsedArgs = (putStrLn . show) parsedArgs = print parsedArgs
23:45preyaloneRaynes: So this: https://www.refheap.com/paste/11731
23:45RaynesOops.
23:45RaynesI didn't even mean to commit that, Sgeo.
23:45RaynesThat was for debugging.
23:46SgeoIncidentally, I know that that's in the IO monad, but for printf-debugging outside the IO monad, you know about Debug.Trace, right?
23:46preyaloneI've never had a chance to use the Mozilla Profiles SSO before. I think I'm in love.
23:47Raynespreyalone: No idea.
23:47Raynespreyalone: What version of GHC?
23:48TimMcpreyalone: They're still working on getting it to work with Firefox's password manager. Once it does that it might be OK. :-)
23:48Raynespreyalone: I built it in a sandbox a couple of days ago with 7.4.2
23:49Raynespreyalone: Nice. I like it to, hence why I used it.
23:49preyaloneGHC 7.4.1
23:49RaynesYour version obviously broke it.
23:50Raynesmuhoo: You should drive down to LA and visit me, you know. We could jam together.
23:51muhooi will be heading down that way this summer probably
23:52preyaloneFreakin yak shaving. I wrote a RubyGem devoted to grepping arbitrary software version information, and it's broken as well. More complete Haskell version info to follow.
23:53muhooRaynes: and i'm sure you will find your way up here for some reason or another too. if so, look me up for sure.
23:53Raynesmuhoo: I might go up to SF for recreation way late this year. You'll be here before I'm there.
23:53RaynesWhen you come down and you have time let me know and we'll have dinner or something.
23:54preyaloneThere! https://www.refheap.com/paste/11732
23:54muhooRaynes: absolutely.
23:56Raynesmuhoo: But you've got to bring a guitar.
23:56RaynesOr whatever you play.
23:56RaynesAnd learn Imagine Dragons songs for the occasion.
23:58preyaloneThanks all! As a Clojure newbie, I'm glad to see the #clojure community is as helpful as #lisp, but much nicer.
23:58RaynesAw, now he is gone and I miss him.
23:59frozenlockeh, he was lucky some weren't here... I'm not sure he would have found us 'nicer' than #lisp :p