#clojure logs

2014-03-25

00:00FrozenlockIt's very basic. I still haven't made a redo function.
00:00zspencerI love how clojure/script makes things like 'undo/redo' a non-issue
00:01Frozenlockzspencer: I want a tree undo/redo, but I don't even know where to begin :-(
00:01bostonaholic^^^ that'd be killer
00:01zspencerExplain the use case a bit more? Tree undo/redo doesn't click immediately with me
00:01arrdemzspencer: you back out changes and then want them back
00:01Frozenlockzspencer: http://briancarper.net/blog/568/emacs-undo-trees
00:03zspencerAh, interesting.
00:03FrozenlockI don't use it often in emacs, but when I do, I'm REALLY happy to have it.
00:04zspencerNever realized vim did that
00:07zspencerundo/redo in vim always just seemed so natural that I didn't need to think about the interactio nmodel.
00:08Frozenlockhttp://www.bestofvim.com/plugin/gundo/
00:11zspencerFrozenlock: such beauty
00:24ben_mAnyone if there's a plugin for lazybot to enable aliases? Something like !alias add bot !echo I'm a bot
00:24ben_m^Anyone^Anyone know
00:26arrdem~anyone
00:26_ericif I have a function that takes [a & b] and I have an array, how do I pass the values of the array so that they end up in b?
00:28Frozenlock(apply my-fn (cons a? my-array))?
00:28Frozenlocka? --> whatever your `a` is.
00:29_ericinteresting
00:29_ericwhat does the ? do?
00:29_eric(is there a name for it?)
00:29FrozenlockNothing, it was me pointing the `a` out :p
00:29_ericoh
00:29Frozenlock(apply my-fn (cons some-argument my-array))?
00:30_ericgot it
00:31_ericthanks
00:32Guest52004did you write the function?
00:33_ericyes
00:33bob2(remember you can change it to take a vector as the second arg instead)
00:34_ericwell, most of the time I want it to not take a vector
01:15ben_mWhat's the most idiomatic way to remove a character from the start of the string, if it exists. ie. (if (= (nth s 0) \@) (subs s 1) s)
01:18Raynesben_m: I'd use (first s) instead of nth, but otherwise looks fine to me.
01:19ben_myeah i changed it to that
01:19ben_malright
01:54dissipateis random number generation considered to be a 'side effect'?
01:56ben_mIt depends where you get the seed from.
01:56dissipateben_m, /dev/urandom
01:57ben_mYeah, reading that is the side effect.
01:59dissipateben_m, is it possible to do random number generation without side effects?
01:59ben_mWell you'd always get the same result.
02:01ben_mPure functions are by definition deterministic, so they give the same result when you call them with the same parameters. You can see how that wouldn't work for random numbers.
02:01RaynesNo.
02:01RaynesIt's not really possible.
02:02ben_mWhat Haskell does, for example, is that the random number generation itself is pure. You provide it a StdGen and the generator functions return another StdGen and a value, and you thread that to the next generator, etc.
02:02ben_mThat part is pure, and then you supply it with a StdGen you get through side effects.
02:04dissipateben_m, would that be like a lazy sequence in clojure?
02:04ben_mI don't know how lazy sequences are implemented in clojure
02:07ben_mIt would be something like (defn [seed] (let [[value1 seed'] (rand-float seed) [value2 _] (rand-float seed')] (+ value1 value2 ))
02:08ben_mUh, don't mind the missing function name - you get the point I hope.
02:10dissipateben_m, looks pure to me
02:10dissipateben_m, but that's a psuedo-RNG
02:10ben_mYeah that's the pure part.
02:10ben_mAnd then you'd seed it with something with side effects
02:10ben_mlike reading /dev/urandom
02:11ben_mAnd yeah, that's just conceptual.
02:11dissipateben_m, but anything reading from /dev/urandom isn't pure
02:11ben_mThat's what I said :)
02:15dissipateben_m, this is good actually. it also means no one can claim their RNG is referentially transparent
02:19ambrosebsholy crap the clojure/west videos are up already
02:19dissipateambrosebs, from last year?
02:20ambrosebshttps://www.youtube.com/watch?v=KhRQmT22SSg
02:20ambrosebsno!
02:20ambrosebsfrom yesterday!
02:23dissipateambrosebs, did you see this? http://www.infoq.com/presentations/fp-languages-bug-free-fault-tolerant
02:23ambrosebsno?
02:23clojurebotno is tufflax: there was a question somewhere in there, the answer
02:37jph-anyone know if i can use postgres enum types with lobos migrations?
02:55Cr8ambrosebs: !
02:55Cr8slides synced up and all even this is pretty wild to have already available
02:57Cr8oh nice its recorded straight off the laptops i'm guessing
03:06jph-anyone familiar with timbre for logging?
03:10gyimnot super familiar, but i've used it
03:11jph-im getting some log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog) message
03:11jph-i think log4j is being used by jdbc or related... but i haven't told it where to send logs
03:11jph-and googling has not given me any love so far
03:12gyimdo you have a log4j.properties file?
03:12jph-nope, haven't needed one
03:12jph-for the other stuff
03:12jph-i dont even know what specifically is generating the com.mchange stuff
03:12devnqueues in cljs... what do people use?
03:12jph-some library in my webapp
03:13gyimok, then i guess it's not related to timbre
03:13gyimput a log4j.properties file into resources/
03:13devnspecifically i'm thinking of keyboard events. I want to be able to capture a kind of sliding/logging buffer of keystrokes
03:13devnso i can group keystrokes within, say 10ms of one another as a single vent
03:13devnevent*
03:14gyimjph-: this is a simple starting point for log4j config: http://www.mkyong.com/logging/log4j-log4j-properties-examples/
03:14Cr8if you're up for core.async that'd be pretty amenable to that
03:14jph-gyim, i dont know how to apply the java log4j stuff in the context of a clojure project
03:14jph-i can figure out what to include, but not where and why i need it
03:15jph-i dont even know what damn library is triggering the message :P
03:16Cr8that is it has sliding buffers built in, and you can do debounce-y things fairly easily with timeout channels
03:16Cr8&alts
03:16lazybotjava.lang.RuntimeException: Unable to resolve symbol: alts in this context
03:16Cr8heh
03:18gyimjph-: clojure is not different from java here: if one of your libraries depends on log4j, you need a log4j config. If you put a config into the resources/ directory, it will be put into your jar file => it won't complain about missing appender config
03:18jph-gyim, ok
03:18jph-i'll start there
03:18gyimthe alternative, of course, is to find the library that depends on log4j and remove it
03:18jph-i think it's one of the database-related libraries
03:18jph-im using a luminus template, and another webapp using same template isnt complaining... so i'm trying to compare between them
03:20jph-looks like an older luminus template explicitly added a log4j config in project.clj, i removed it and it's fine
03:20gyimgreat
03:20jph-just... annoying :P
03:20gyim:)
03:20jph-debugging clojure stuff can be a real PITA sometimes
03:20jph-especially when it's in java land
03:44augustlcljs question. Does it make sense to somehow extend the cljs protocols for JVM types? The use case being running cljs in nashorn, and passing in clojure values directly
03:44tomjackfellow univalence amateur?
03:47tomjackI wonder why the query "nashorn interop" seems fruitless
03:55tomjackit is rather interesting to see noms in http://arxiv.org/pdf/1401.7807v1.pdf
04:02jph-i'm getting an exception when firing up a repl, but there's nothing in *e or (pst). Any way to make the repl more informative at launch?
04:03cYmen_jph-: Have you tried lein repl in the terminal and looked at *Messages*?
04:04cYmen_Wait, which environment is this?
04:07jph-cYmen_, i'll check
04:07jph-cYmen_, it's a ring handler repl
04:08cYmen_jph-: But are you starting it from emacs or some other IDE?
04:09jph-cYmen_, command line
04:09cYmen_Huh...and there is nothing in the messages about why it fails?
04:10jph-nope
04:11jph-#<ClassCastException java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.Symbol>
04:11jph-nREPL server started on port 47229 on host 127.0.0.1
04:11jph-REPL-y 0.3.0
04:11jph-...
04:12cYmen_but the repl starts?
04:12jph-correct
04:13cYmen_hmhmhm
04:14cYmen_probably something about ring trying to start the server in the background :/
04:14jph-oh
04:14jph-ooooooooooooooh
04:14cYmen_Sorry, can't really help you I'm afraid.
04:14jph-i found it
04:14jph-in my repl.clj
04:14jph-(:require [cheshire.core :refer :all]
04:14jph- [criterium.core :as :crit]
04:14jph-:as :crit
04:14jph-helpful error messages again
04:15cYmen_Yeah, it is indeed a Keyword not a Symbol.
04:15cYmen_Not your fault.
04:15jph-heh
04:15jph-wasnt there a clojure linter
04:15cYmen_I've been complaining about exactly this kind of problem just yesterday.
04:15jph-i wonder if that'd pick that crap up
04:16jph-the other fun one... leave an empty () in your code somewhere
04:16cYmen_Wait, I need to take notes.
04:16cYmen_:p
04:16jph-yeh
04:16jph-for messing with your clojure colleague
04:16clojurebotI don't understand.
04:16jph-for leaving his terminal unlocked
04:16cYmen_hahaha
04:18ddellacostajph-: clojure linter is https://github.com/jonase/eastwood
04:18jph-thats the one
04:19cYmen_Is it any good?
04:19jph-well it's complaining about a lot of stuff
04:19jph-so i guess i should look deeper heh
04:23ambrosebsjph-: there is dynalint which injects code to give better runtime errors.
04:23ambrosebsjph-: much less complete tho
04:24ambrosebseastwood relies on code compiling correctly before linting also
04:28atyzIs anyone using new relic with pedestal and NOT on heroku
04:28atyz?
05:01sm0keso guys i have this macro where i want to evaluate form outside the usual `()
05:02sm0keso my macro looks like (defmacro mm [a & body] (let [ea ~a] `(...)))
05:02sm0kebut this obviously fails
05:02opqdonutyou're doing it wrong
05:03opqdonutdo you really want to compute stuff read-time?
05:03opqdonutif so, you need to use eval
05:03opqdonutbut using eval in your macros is a code smell
05:03sm0keyea i am kind of not sure
05:03gkoIn Emacs nrepl-jack-in, how to make it follow :repl-options defined in project.clj, such as :init-ns? In command line, it works OK, but in nrepl-jack-in, I always land in user...
05:04opqdonutsm0ke: what does the macro do?
05:04sm0keso i what i want is this my macro used to look like (with-objects [o1 o2 o3] (..))
05:05sm0kebut now i have a new requirement where it can takes an optional object (with-objects [o1 o2 o3] o4 (..))
05:05sm0kei am not sure how to go about writing it
05:05sm0keo4 can be a form as well as an object
05:05sm0keit can ideally be a form returning an object
05:06sm0kehurm
05:06opqdonutcouldn't you just have two arities of your macro? 2 and 3?
05:06opqdonutif the body of with-objects can be multiple expressions, then you can't really disambiguate between the o4 and the normal case
05:07opqdonutbut if it's just one expression, yay
05:07sm0keopqdonut: yes but form can be multiple so this is not possible right ( [a b & body] [a & body])
05:07opqdonutyeah
05:07sm0keyes
05:07opqdonutso you can't know whether you have o4 or a body expression
05:07opqdonuthow about just (with-objects [o1 o2 o3 o4] ...)?
05:07sm0kei wish i had something like (with-objects [o1 o2] :optional o4 (...))
05:08opqdonutthat is doable but slightly ugly
05:08sm0keopqdonut: its an entirenly different entity
05:08opqdonut(just check if body begins with a keyword)
05:08sm0kehmm yea, ugly macro
05:09sm0keseems like i would have to sacrifice & body to body
05:09opqdonutsome suggestions: (with-objects [:objects o1 o2 o3 :the-other-thing o4] ...) (with-objects-simple [o1 o2 o3] ...) (with-objects-complex [o1 o2 o3] o4 ...)
05:09opqdonutor maybe (with-objects {:objects [o1 o2 o3] :other-thing o4} ...) ?
05:10sm0keyep
05:10sm0kesensible
05:10opqdonutadded bonus: by using a map literal you avoid any parsing in the macro body
05:11opqdonuterr s/body/implementation/
05:11sm0ketrue
05:26atyzHas anyone got new-relic working with a pedestal app?
05:40tomjack`what was the clojure in make named?
05:43quotemstrWhat's the preferred way of representing Clojure forms with Emacs sexps?
06:02dsrxquotemstr: i've been using (print-to-string '(whatever (quote blah blah)) t) to some success
06:02dsrxthe t argument is crucial to avoid escaping dots
06:03dsrxin the wild I see a lot of clojure forms as string constants in emacs lisp... i just hate not being able to paredit them
06:06scottjdsrx: there's probably some fancy way to narrow the buffer to just the string area and have it in clojure-mode w/ paredit
06:06dsrxyeah, there is something like that in emacs I think
06:07dsrxah here we go acebook.com
06:07dsrxerr
06:07dsrxargh, I don't know why chrome does that all the time. anyway here we go http://www.emacswiki.org/emacs/IndirectBuffers
06:09scottjdsrx: just selecting the entire contents of the string (w/o quotes) and running narrow-to-region seems to allow paredit to work, though the content is all still highlighted as a string
06:10dsrxright, seems straightforward enough to write something that creates an indirect buffer w/ clojure-mode and then narrows to the region
06:10dsrxand switches to it
06:44jph-the penny has finally dropped re thread-first thread-last
06:44jph-im now in heaven
06:49CookedGryphonrhow do I get rid of reflection warnings in proxy-super calls?
06:49CookedGryphoninside a proxy, surely it should know what super is
06:59fikuszhow could I call a series of functions on the same object?
06:59CookedGryphondoto
07:00fikuszCookedGryphon: thanks, checking
07:04mskoud_In the compojure routing DSL fx (GET "/product/:id/" [id] (str "<h1>Product " id "</h1>")) the (str ...) is not evaluated right away, but is it good practice that a macro handles the quoting? It would be easy to understand it it was quoted '(str...) like "normal" code i think.
07:06clgvmskoud_: the macro does not necessarily do any quoting. usually macros generate code. in this case I'd assume that a function with destructuring is generated so that all symbols are bound and thus no quoting is needed (but I have not checked the code)
07:07mskoud_maybe, just trying to come to terms with reading clojure :-)
07:08clgvmskoud_: perhaps what you mean with "the macro does the quoting" is the effect that parameters to a macro are not evaluated so that the macro is called with the original forms
07:11mskoud_and thats clever, but being a noice, reading the code, it looks like a form which will be evalueated right away.
07:12clgvmskoud_: but that's the general principle of macros. otherwise you couldnt use them for code transformation, e.g. for new control flow macros
07:13clgvmskoud_: eventually it comes down to read the documentation on the macro to learn what it does - but you have to do the same for functions as well
07:16mskoud_yes, i see. thanks.
08:00krasHi, any good tutorial or suggested readings on zippers?
08:02danielszmulewiczkras: http://josf.info/blog/2014/03/21/getting-acquainted-with-clojure-zippers/
08:04krasdanielszmulewicz: thank you !!
08:05danielszmulewiczkras: you're welcome.
08:48felherHey folks. Is there a way to find out whether some code is run in nrepl or not?
08:54clgvfelher: you can check whether nrepl namespaces are loaded. but why do you want to do that?
08:59felherclgv: I have the problem that when I use clojure.java.shell/sh, my application won't quit anymore. I know that everything is done, though. So I thought about just invoking System.exit when everythings done. But that gets me into trouble if I launch my application from the nrepl.
09:03felherAnother approach would be using the main function as a wrapper like (do (run-main-application) (System/exit 0)) and just run run-main-application from the nrepl, I guess.
09:03clgvfelher: how do you use `sh` - I guess you either do something wrong or found a bug
09:04clgvfelher: do you use agents as well?
09:05felherclgv: No. Just using this program http://bpaste.net/show/193414/ and doing "clojure-1.5 program" doesn't quit on my machine.
09:06clgvfelher: what is "clojure-1.5" in that case?
09:07felherclgv: the clojure from my gentoo package manager 'emerge' with the version 1.5.1
09:08felherclgv: which is a wrapper that executes clojure.main in the clojure jar, I guess.
09:08clgvfelher: since clojure is a java jar what exactly is "clojure-1.5"? a bash script doing what?
09:09clgvfelher: that `sh` scenario should work like a charm
09:09felherclgv: okay, i'll try it with the jar manually. Maybe it is different then. :)
09:12felherclgv: nope, "java -jar clojure-1.5.1.jar program" does exactly the same thing. And this is the jar from my local maven repository ( http://bpaste.net/show/193418/ )
09:12clgvfelher: I just tried it. seems to be a problem with that shell namespace.
09:15clgvfelher: ok the problem is that `sh` uses futures and thus the threadpool is still alive and prevents the program from exiting
09:15clgvfelher: you could use a dynamic binding *in-repl* which is usually true but gets bound to false in your "-main" function
09:16felherclgv: yeah, I think that would work. Thanks. :)
09:17clgvI do that for programs as well, when they need to return non-zero exit values on error but I still want to test on repl
09:28mikerodIs there a simple way to use 'clojure.core/load' or clojure.lang.RT#load in a way that does not affect the class path of the caller?
09:29mikerodI'd like to load/compile the necessary clj to calculate some result, then allow it to all be GC'ed away. If that makes sense. So on-the-fly compile clj lib in a temporary context that can be thrown away later.
09:30mikerodI'm skeptical that the use of the clojure.lang.DynamicClassLoader may already give me this behavior, or close to it if I set the correct context ClassLoader perhaps.
09:32clgvmikerod: maby with that one? https://github.com/ninjudd/classlojure
09:33atyzHas anyone had new relic running with pedestal?
09:34mikerodclgv: I forgot about this lib. It is probably somewhat applicable, but I don't actually need an "alternative" class path. I just don't want to affect the ClassLoader my lib is called from.
09:34clgvmikerod: well that lib would do that ;)
09:34mikerodI'm thinking of a scenario where a service on a long-running server calls my lib with some .clj source passed to me. I want to compile it and then calculate some return data from it.
09:35clgvmikerod: it is probably the easiest solution since otherwise you probably end up implementing all the behaviour yourself with the disadvantag to have to find the sparse classloader documentation ;)
09:35mikerodclgv: hah, ok. I'll look at it a bit more in depth then.
09:35clgvmikerod: another approach is to use the stuff of immutant
09:36clgvsince you mentioned server, I remembered that they have some classloader isolation as well
09:36vermamikerod, isn't http://tryclj.com/ already doing sort of this? and its opensource
09:37clgvverma: not really it is probably only running a jail and a namespace per user
09:37mikerodverma: tryclj may be using the classlojure lib, I am not positive though.
09:37mikerodHmm.
09:37mikerodYeah, I could look at what immutant is doing too.
09:37clgvjust guessing though..
09:38clgvmikerod: yeah immutant is probably safer since they are pretty actively maintaining it
09:38vermahmmm
09:38mikerodI've dug into DynamicClassLoader a bit before, and based on what I've seen there, I'm not sure it actually adds any new class definitions to the parent ClassLoader anyways though.
09:39mikerodI was sort of wondering if I get this behavior for "free" from Clojure compilation.
09:39mikerodAs long as I don't release any references to classes that were loaded during the compilation back into the wild, preventing the DynamicClassLoader to be GC'ed.
09:40clgvbut if you require namespaces they are globally loaded and only need to be refered to in different namespaces
09:40mikerodI'm sure it is valuable to look at these libs to make some more sense of this.
09:40clgvif the files do not contain namespaces and you create the surrounding namespace on the fly it would be possible with usual clojure
09:41mikerodclgv: ah, you mean they would have references held via the Namespace of the Clj runtime
09:41mikerodSuch as Namespace#namespaces
09:42mikerodThey do contain :require's, so I would infect the Clj env around me. booo
09:42clgvyes you would.
09:42clgvyou need the kind of isolation used in immutant or classlojure to prevent that
09:42mikerodThere is the Namespace#remove option. Maybe that's how these libs are doing it.
09:42mikerodclgv: Yep, it seems like we are back to that. I'll take your advice on it then. :)
09:43mikerodI appreciate the feedback.
09:45clgvI should be able to override hashCode and equals in a deftype right? but it seems my implementation is not called since I do not see the printlns I added there
09:46mikerodclgv: how are you trying to call it?
09:46mikerodclojure.core/hash?
09:46clgv(= a b)
09:47clgvor directly (.equals a b)
09:48mikerodoh
09:48mikerodHmm, I thought you could override them.
09:49clgvvery simple example:
09:49clgv,(deftype Bla [x] Object (hashCode [this] x) (equals [this, y] (= x y)))
09:49clojurebotsandbox.Bla
09:49clgv,(= (Bla. 42) (Bla. 42))
09:49clojurebotfalse
09:49clgv,(.equals (Bla. 42) (Bla. 42))
09:49clojurebotfalse
09:49clgv:/
09:50llasramclgv: Well, 42 != (Bla. 42)
09:50clgvllasram: right and?
09:50llasramUm, that's what your equals method is testing :-)
09:50clgvups lol
09:50mikerodyeah, you are falling back to Obj equals
09:51clgverror in the minimal example that does not translate to the actual code...
09:52clgvso suppose there is a println in there for debugging what could possibly prevent it from being printed? in the minimal example it works
09:52clgv,(deftype Bla [x] Object (hashCode [this] x) (equals [this, y] (println "equals") (= x (.x y))))
09:52clojurebotsandbox.Bla
09:52clgv,(.equals (Bla. 42) (Bla. 42))
09:52clojurebotequals\ntrue
09:53clgvguess I ask the decompiler ^^
09:55clgvhumm damn, restarting the repl helped after compiling
10:03clgvsomehow redefining the deftype on the repl does not work consistently :(
10:07mdrogalisWooo. 1.6 shipped
10:12Morgawrcongratulations for Clojure 1.6! :D
10:12Morgawrsomeone has to change the topic now :P
10:17Averellman why is there still no update in arch? god i hate using this obsolete stuff.
10:18AimHereYeah, clojure 1.6 is *minutes* old now!
10:19clgvAverell: you cant complain about arch before it's visible on the maven repository ;)
10:34bhenrywhy in the world is some? the name of (not (nil? x))
10:34bhenryin 1.6
10:40mathw1.6! Woo
10:41mathwThis was a great time to pay attention to the channel
10:41TimMcThat's bizarre!
10:43llasramYou people need to subscribe to the mailing lists :-)
10:44llasram(wrt to `some?`)
10:44TimMcNah, it's a total opinionfest in there.
10:45llasram*snork*
10:45TimMcBut seriously, what's the deal?
10:48TimMcThat's one of the worst bits of naming I've seen in a while. :-(
10:48llasramIt lets you write (some some? sums)
10:48clgvprobably "some" was misnamed in the first place and now we have to live with it ;)
10:49clgvTimMc: the alternative suggestions on the ML have not been much better ...
10:49llasramI think `some` is fine. `some->` is where we lost our way. But now the Holy Names granted by Hickey may not be questioned.
10:49cYmen_Should add some utf8...
10:49cYmen_Like a tiny car or some klingon...
10:51TimMcclgv: I'll take your word for it; I can't actually search the ML.
10:51menguhi. is anyone here taking care of clojure.org web site? there are no books listed at http://clojure.org/books
10:53wafmengu: looks like it requires javascript
10:53wafif you're running ghostery or something try pausing it
10:53clgvTimMc: https://groups.google.com/forum/#!searchin/clojure/%22some$3F%22/clojure/tseJgAi3HC4/0jyJ2BsUlB0J
10:54menguwhich i have :)
10:54mengulet's check with another browser
10:54wafworks for me in chrome with no adblock/ghostery running
10:55menguah, i got adblock
10:55mengudidn't even notice it blocked.
10:55menguthx waf
10:56clgvyeah seems somehow stealthily blocked
10:56TimMcclgv: Thanks.
10:57TimMcsomething? and value? and even exists? look way better
11:02TimMc(map (comp (partial some some?) list) [true false nil 1]) ;; (true true nil true)
11:13scgilardiI'll be thinking "some?" means "some-value?" just like "contains?" means "contains-key?" (and consider sets a container of keys)
11:33coredhi
11:33coredis there a list resources books/articles for beginners ?
11:35clgvTimMc: hm ok, I forgot about "exists?". I'd use that as well^^
11:36cbpcored: You can start here http://clojure-doc.org/ There are a few free books such as http://www.braveclojure.com/ and aphyr's posts are good too http://aphyr.com/posts/301-clojure-from-the-ground-up-welcome For non free books Clojure Programming is good
11:36cbpcored you can also try doing exercises at 4clojure
11:37clgvcored: "Clojure Programming" is recommended frequently here.
11:38coredcbp: got it; thanks
11:38coredcbp: I will check that out
11:38coredcbp: I read Clojure Made Simple and I have Functional programming for object oriented programmers
11:39coredin queue; I was doing 4clojure ex. also but I want to retake it
11:46alexyakushev_Hello, is there anyone proficient with core.match?
11:50clgv~anyone
11:50clojurebotJust a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..."
11:54synkte,(println "Good morning")
11:54clojurebotGood morning\n
11:55alexyakushev_Yep, good point
11:56alexyakushev_I have this function that refuses to be compiled: https://www.refheap.com/65410
11:56alexyakushev_Says "Invalid method Code length 72934", which means that method grew bigger than 64k
11:57alexyakushev_I wonder if it is a bug, or such usage of core.match is considered an abuse
11:58edbondalexyakushev_, did you try macroexpand?
11:59alexyakushev_edbond: Yep, gives 11k LoC
12:00edbondhow big is the query?
12:00TimMcA colleague ran into this problem with some midje tests the other day.
12:01alexyakushev_edbond: It doesn't matter, it fails to compile, not to run
12:02clgvalexyakushev_: isnt there a warning that core.match has problems with AOT? at least it was on the project site in the past
12:03clgvhumm it is not there anymore. so maybe that one got fixed
12:03alexyakushev_clgv: It might be, but my problem is not AOT-related, I can't compile it in the REPL
12:04alexyakushev_It seems like the generated code just gets too big for the JVM to hold in one class
12:04clgvalexyakushev_: in one method I'd say.
12:04alexyakushev_The question is, is it my wrong usage of core.match, or a bug somewhere
12:05gtrakcore.match does gen a lot of code
12:05alexyakushev_clgv: Pretty sure it's class limitation: http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#9279
12:05gtrakbut you could split things up into methods, no?
12:05clgvalexyakushev_: ping dnolen
12:06clgvalexyakushev_: but a function implementation without closures ends up in one java method, except for all the static constants
12:07clgvand there is definitely a limit on method implementation size on the vm. it was mentioned in the context of generated state machines
12:07alexyakushev_clgv: Yes, I know. Well, it doesn't matter much since a class for function contains just one method for this function
12:08alexyakushev_OK, I just have never seen this kind of error before, so only now figured out about these constraints
12:08alexyakushev_gtrak: There ain't much to be split since it is just one macro
12:09clgvdoes reordering clauses in core.match has an influence on the generated code?
12:09gtrakalexyakushev_: the right side?
12:11mpenetclgv: if that's like in haskell order does matter
12:11alexyakushev_gtrak: It might help a bit, but wouldn't solve the problem conceptually
12:11gtrakyea
12:11mpenetclgv: code size will prolly be very close though
12:11alexyakushev_clgv: OK, it compiles now that I moved "limit" to the top
12:11clgvmpenet: ah ok. I just guessed in that direction since it does with performance in logic programming ;)
12:12alexyakushev_Apparently the more elements there are in the clause, the lower you should put them
12:12clgvalexyakushev_: interesting
12:12clgvyeah so you got a specialization order
12:13TimMcThat makes me sad.
12:13alexyakushev_I still think I'm doing something wrong
12:13alexyakushev_Or perhaps core.match is grossly inadequate for this exact task
12:14clgvalexyakushev_: maybe that documentation helps https://github.com/clojure/core.match/wiki/Understanding-the-algorithm
12:15clgvalexyakushev_: but your original code could be interesting for dnolen, maybe there is some bug causing the huge size
12:15alexyakushev_clgv: It was my initial idea to write to him directly, but he's not online
12:15alexyakushev_I will try to catch him later
12:16alexyakushev_Thank you for your help, clgv and gtrak!
12:58CookedGryphonalexyakushev_: that doesn't look right...
12:58CookedGryphonperhaps the recur is recurring to the wrong point?
13:00alexyakushev_CookedGryphon: Doesn't seem to be the case. The function works now that I reordered clauses, and it works correctly
13:01nbeloglazovalexyakushev_, I suggest to file a bug in this case.
13:02alexyakushev_nbeloglazov: I will, probably after I ask David whether he is aware of such problem
13:02CookedGryphonalexyakushev_: I'm curious, what's your rewrite and what does it generate
13:04alexyakushev_CookedGryphon: Now it looks like this https://www.refheap.com/65502, and macroexpanded it yields 4k loc instead of 11k in the first case
13:05CookedGryphonalexyakushev_: I got 790k lines when I macroexpanded and pprinted it...
13:06CookedGryphonbut yeah, either way it's too much !
13:07alexyakushev_Yes, definitely looks excessive :)
13:31AlwaysBCodingHey guys, I'm using datomic and getting an error message "Boot datoms cannot be altered" - I have absolutely no idea what this is supposed to mean and can't find a single resource on google. Anyone have any insight on what it means?
13:32cbpAlwaysBCoding: I don't know but you can also try asking in the #datomic channel
13:32_Pate_how does the new cond-> macro work? https://github.com/clojure/clojure/blob/master/changes.md#24-new-threading-macros
13:32_Pate_(cond-> 1, true inc, false (* 42), (= 2 2) (* 3)) => 6
13:33_Pate_why does that output 6?
13:33cbp_Pate_: because 1 is true
13:33gtrakit gets inc'd then multiplied by 3
13:34cbp_Pate_: and also because 2 equals 2
13:34hyPiRioncbp: What do you mean by 1 is true?
13:34cbpso it first goes through the true clause and the result of that goes through the 2 == 2 clause
13:34_Pate_I see, so it threads 1 through all the expr where the clause evals to true?
13:34hyPiRion_Pate_: yes
13:34cbper I mean because true is true..
13:34hyPiRionah
13:35cbpit's a pretty terrible example..
13:35_Pate_so in this case: -> 1 inc (* 3) => 6
13:35_Pate_coool
13:36_Pate_I can't count the amount of verbose code I have written to conditionally execute stuff like that.
13:36AlwaysBCodingcbp: Is there a #datomic channel?
13:36cbpAlwaysBCoding: yes
13:49sdegutisHi. You have (def m {"a" "y", "b" "z"}) and you want to use it to turn "bad" into "zyd". How would you do this?
13:51cbpsdegutis: replace?
13:52sdegutisAhh yes, great! Thanks!
13:52sdegutisHmm no wait, that seems wrong, completely wrong.
13:53ToxicFrog,(def m {"a" "y" "b" "z"}) (->> "bad" (map str) (replace m) (apply str))
13:53clojurebot#'sandbox/m
13:53sdegutisclojure.core/replace works on a collection, but I'm working with strings.
13:53ToxicFrog,(->> "bad" (map str) (replace m) (apply str))
13:54clojurebot"zyd"
13:54ToxicFrogsdegutis: strings are ordered collections of chars.
13:54sdegutisAh yes, I see what you mean.
13:54ToxicFrogThere's probably a better way to do it than what I just did
13:54sdegutisSurely there is a name for the error I made by now.. I used too specific a dataset and didn't convey how general I meant it to be.
13:54ToxicFrogThere definitely is if you can fill your map with chars rather than single-char strings; that lets you drop the (map str)
13:54sdegutisI'm dealing with any-length strings anywhere a string is mentioned here.
13:55ToxicFrogOh, so m might be { "foo" "FOO" "bar" "
13:55ToxicFrogOh, so m might be { "foo" "FOO" "bar" "BAR" }\
13:55ToxicFrog?
13:55sdegutisRight.
13:55sdegutisWell, except that might imply that I only want capitalization ;)
13:55TimMcsdegutis: The question is still underspecified. What about conflicts?
13:55sdegutisThus leading to another round of me clarifying :D
13:56TimMc(Overlaps.)
13:56gtraknow it's sounding like you want a lexer
13:56sdegutisTimMc: there won't be any
13:56TimMcsdegutis: Then use reduce and .replace
13:56sdegutisThe pattern I've used before is to make a custom function for use with reduce, which takes [string [key val]] as its args, and does whatever work (this time being clojure.string/replace) to return a new [string] for use as the first argument in the next (reduce) call.
13:57_Pate_I'm looking for a great image that depicts structural sharing in Clojure's memory model for an intro talk I'm doing, preferably vector-based image (like SVG). Any ideas?
13:57sdegutisI've just used that pattern enough times, and it's so strange looking, that I figure there surely must be a better way.
13:57justin_smith_eric: Frozenlock: regarding something you guys were taling about a while back
13:57justin_smith,(apply + 1 '(2 3 4))
13:57clojurebot10
13:58justin_smithyou don't need cons to use apply on a single element and a collection at the same time
13:58sdegutiserc-hl-nicks is great btw
13:58gtrak_Pate_: people always use this one: http://www.cs.uiuc.edu/~jeffe/teaching/datastructures/Fig/clojure-trees.png
13:59gtrakat least it seems really familiar
13:59_Pate_thank you! I just had a crummy version of that. This is a better resolution.
13:59clgv_Pate_: easily replicatable via LaTeX/TikZ ;)
14:00Frozenlockjustin_smith: *mind blown*
14:00cbpsdegutis: I would probably just use a loop, a stringbuilder (or two) and a replacements map
14:00arrdem-! is for stm. so why the hell does 1.6 have assoc! and soforth as part of the transient system.
14:01gtrak! is for dangerous! or mutable!
14:01arrdemif -! is suddenly for side-effect annotation I'm gonna be moderately annoyed
14:01cbpI just used ! for ..
14:01cbpyeah
14:01gtrakarrdem: see: reset!
14:01sdegutisGreat, this works, albeit a little unreadable: (reduce (fn [s [k v]] (str/replace s (format "[%s]" k) v)) url config)
14:01arrdemgtrak: but that's an STM op
14:01gtrakreset! works on atoms
14:01arrdemgtrak: so far all the -!s are stm ops
14:02gtrakwhich aren't stm?
14:02Bronsaarrdem: isn't ! used for ops that are not safe to be used inside a dosync?
14:02gtrakalso set! works on vars and java fields
14:02iwilcoxI've wondered about using ! for "I generate random numbers", but I'm super-new here.
14:02cbpoh yeah I remember Bronsa's statement now
14:02cbpfor non
14:03gtrakset-validator! 'Sets the validator-fn for a var/ref/agent/atom'
14:03arrdemBronsa: maybe. that's a more sane definition if that's the case
14:03clgvarrdem: assoc! is as old as transients and nothing new in 1.6 ;)
14:03arrdembrb flipping my desk
14:03clgv,(meta #'assoc)
14:03Bronsagiven that side-effecting ops are implicitly not safe to be used within a transaction that would make sense
14:03clojurebot{:ns #<Namespace clojure.core>, :name assoc, :arglists ([map key val] [map key val & kvs]), :column 1, :added "1.0", ...}
14:03clgv,(meta #'assoc!)
14:03clojurebot{:ns #<Namespace clojure.core>, :name assoc!, :arglists ([coll key val] [coll key val & kvs]), :column 1, :added "1.1", ...}
14:04clgvah clojure 1.1^^
14:04cbpI have a terrible memory..
14:04gtrak! means that, * means a more primitive version of the non-*, ' means I don't know what.
14:05justin_smithdsrx: regarding what you and scottj were talking about, there is string-edit-at-point which takes the current string the point is inside, and opens it in a secondary buffer for unescaped editing, and C-c C-c then insterts the edited version, escaped, back into the string
14:05gtrakif I'm doing math it would mean the next step, like x and x'
14:05cbpidempotent that's the word
14:06cbpthank you based google
14:06gtrakone time I used | in place of a / and my coworkers flipped out
14:06arrdemgtrak: in a symbol name?
14:06gtrakheh, yes
14:07arrdemhaha
14:07gtrak(def some-domainmodel-ns|Constructor)
14:07gtrakor maybe it was even (def some-domainmodel-ns|->Constructor)
14:07gtrakto mirror the records stuff
14:10TimMc☃ on the end of a symbol means congratulations, you are probably using the correct character set on your computer!
14:12justin_smith🏂 <- slightly harder mode of the above
14:12arrdemTimMc: dat snowman...
14:12arrdemjustin_smith: you broke emacs :c
14:13justin_smithsnowboarder
14:13arrdemjustin_smith: correctly identified as snowboarder, but no glyph
14:13justin_smithI was gonna say, M-x describe-char
14:14justin_smith💩 at the end of a name means "this is terrible and should not exist"
14:14arrdemI'll use λ in my comments... but utf8 fn names just don't buy a lot IMO
14:14arrdemsome days I just have to break out vim and edit from not a real editor :c
14:17Bronsagtrak: at some point in a tools.analzyer pass I had pass, pass*, -pass and pass'
14:17BronsaI just suck at naming
14:17gtraknice
14:18gtrakarbitrary-construct1,2,3
14:18arrdemBronsa: so long as you don't have f, f', f'', f''' and soforth...
14:18Bronsawell now that you mention it.. https://github.com/clojure/tools.analyzer.jvm/blob/master/src/main/clojure/clojure/tools/analyzer/jvm/utils.clj#L216-L221
14:19arrdemI suppose to go along with my bro encoding I should build a tools.analyzer pass to rewrite all symbols into ([bB]ro)*...
14:20arrdemBronsa: haha... I've definitely done (let [a .., a₀ ..., a₁ ...] ..)
14:20arrdemsubscripts++
14:20justin_smith,(let [x¹ 4 x² 1 x³ 2] (* x³ (+ x² x¹)))
14:20clojurebot10
14:20arrdem(inc justin_smith)
14:20lazybot⇒ 29
14:21arrdemI need to build a latex frontend for expresso...
14:22TimMcjustin_smith: Was that a non-BMP character?
14:22justin_smith¹ <- "SUPERSCRIPT ONE"
14:22justin_smithworks through "... NINE"
14:22TimMcNo, 10 minutes ago.
14:22justin_smith⁰works two
14:23justin_smithoh, the snowboarder? I dunno, depends on your font support I guess?
14:24justin_smithTimMc: wait, I misunderstood that question
14:24justin_smithyeah, I think that is definitely non-bmp
14:26justin_smithTimMc: it is in the block "miscellaneous symbols and pictographs"
14:27justin_smithinserted via M-x insert-char
14:41mlb-is there a well known way to shell out from Clojure, that work well on Windows? My google-fu has only revealed clojure.java.shell and clj-commons-exec
14:42justin_smithconch is decent
14:42justin_smithhttps://github.com/Raynes/conch
14:42justin_smithit has a nicer API than the other stuff, using process-builder which is nice and very powerful
14:48mlb-thanks, will check out =]
14:50pyrtsaDo people have experiences with the Quartzite library here? Any idea why it requires a specific type (created e.g. with the defjob macro) to define jobs? Why not just an IFn?
14:52sdegutisWhat's that site that lets you search for Clojure code snippets? I looked and looked and can't find it.
14:53justin_smithpyrtsa: I'd blame the underlying java lib http://quartz-scheduler.org/
14:54pyrtsajustin_smith: I can believe that. But why wouldn't Quartzite just define a generic subtype of org.quartz.Job that helds a user-defined Clojure function?
14:54pyrtsahttp://clojurequartz.info/articles/jobs.html
14:55justin_smithfrom that page "Unfortunately, due to certain Quartz implementation details and the way Clojure loads generated classes, many approaches to using functions do not work."
14:56pyrtsaIncredible.
14:56pyrtsaOkay, thanks.
14:57sdegutisAh yes! It's http://getclojure.org/
14:59justin_smithsdegutis: (fn [] (loop [i (int 0)] (recur nil))) -- what is this supposed to be exemplary of? cargo cult spin loop?
15:02cbphahah (loop [] (let [recur 5] recur))
15:03justin_smithat least that demonstrates something useful about clojure's binding rules
15:21alewpyrtsa: Immutant uses quartz underneath for scheduling and actually allows you to specify arbitrary functions
15:21alewpyrtsa: without doing that record stuff
15:21alewpyrtsa: http://immutant.org/tutorials/jobs/index.html
15:23alewpyrtsa: Not that you would want to pull all of immutant in for just scheduling, but it shows that it's possible
16:04clojure-usera
16:05clojure-usertest
16:05asdHi clojure user
16:07clgvwhat are the common pitfalls when you use a LinkedBlockingQueue in a multi producer single consumer scenario?
16:07clgvI seem to be loosing items in that queue
16:08clgvllasram: to what I said?
16:08llasramThat you'd be losing items
16:08llasramOnly pitfall I can think of is that it's unbounded unless you provide one
16:11clgvwell running the whole thing in log level trace now
16:11TimMcI wonder what happens if you create 2 queues, fill one with stuff, and then try to drain each to the other.
16:13RaynesTimMc: http://i.imgur.com/5sQO8hJ.jpg
16:13RaynesWARNING: Snake ^
16:13tcrawleypyrtsa: Immutant 2 will let you use quartz outside of the container, so you can just bring in that lib
16:13TimMchee
16:14tcrawleyand using functions with quartz means you can't use a JobStore
16:15clojure-userhello
16:17clgvllasram: I use a combination of "take" and "poll" to block until there are elements in the queue and then take as much as there are
16:18clgvand I do not think that I observed that problem in the past...
16:23edwHas anyone yet written an EDN parser in elisp? It's beginning to look like the world needs such a thing, and I may heed the call...
16:24TimMcRaynes: I think it's "smart" enough to only drain the number of elements that were in the queue when draining started.
16:25TimMchttps://www.refheap.com/65637
17:02sdegutisI just realized that you can't do further destructuring inside {:keys [...]}
17:04sdegutisI just kind of expected it allowed you to destructure infinitely deep.
17:04brehautreally?
17:05justin_smithsdegutis: but of course :keys is redundant, just more concise
17:05brehautthat would just make the keys, syms, strs shorthands a more complicated way of not usign those shorthands
17:05justin_smithregular destructuring goes very deep (arbitrarily deep?)
17:05brehautyes
17:06abpsdegutis: how should that work? maps aren't positiional so you need some names to bind.. would basically be like what you can always do
17:07TimMcsdegutis: You don't have to list everything in :keys anyhow.
17:11TimMc&(let [{:keys [a b], [c] :c} {:a 1, :b 2, :c [3 4 5]}] [a b c])
17:11lazybot⇒ [1 2 3]
17:12trap_exitis (into {} (map side-effect lst)) lazy or not lazy ?
17:13Bronsanot lazy
17:13brehauteasy way to check ;)
17:13brehaut,(into {} (range))
17:13trap_exithow do I test?
17:13clojurebot#<ExceptionInfo clojure.lang.ExceptionInfo: Don't know how to create ISeq from: java.lang.Long {:instance 0}>
17:13brehaut,(into {} (map + (range)))
17:13trap_exit,(into {} (map (fn [x] x) (range)))
17:13clojurebot#<ExceptionInfo clojure.lang.ExceptionInfo: Don't know how to create ISeq from: java.lang.Long {:instance 0}>
17:13clojurebot#<ExceptionInfo clojure.lang.ExceptionInfo: Don't know how to create ISeq from: java.lang.Long {:instance 0}>
17:13brehautoh duh
17:13brehaut,(into [] (range))
17:13clojurebot#<OutOfMemoryError java.lang.OutOfMemoryError: Java heap space>
17:13trap_exitwell wait
17:14trap_exit,( ... ) forces it to be printed, which is what causes it to be not lazy
17:14clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Malformed member expression, expecting (.member target ...)>
17:14trap_exit,(range)
17:14clojurebot(0 1 2 3 4 ...)
17:14Bronsatrap_exit: no, into is not lazy
17:14trap_exit,(let [a (into {} (map vector (range) (range)))] 23)
17:14brehauttrap_exit: as you can see above, clojurebot has its print vars set so that it wont print an infinite sequence so no, it wont realize it all
17:15TimMctrap_exit: into walks the entire collection eagerly
17:15clojurebotExecution Timed Out
17:15sdegutisTimMc: fantabulous
17:16trap_exitBronsa, brehaut, TimMc: I believe you now
17:17trap_exitthanks!
17:17trap_exitif we were in dogecoin, I'd tip you 10 dogecoins
17:18brehauttrap_exit: the other thing to think about is that into is filling a strict datastructure; those structures have no way of representing laziness so its intrinsicly going to be a strict operation
17:18Bronsatrap_exit: another way to notice that that was eager: the only sequences that preserve lazyness are lazyseqs and cons, there's no lazy map/vector/set in clojure
17:18TimMctrap_exit: One of the bots has a karma module. :-P
17:18Bronsatrap_exit: also, if the docstring doesn't say "returns a lazy sequence" then the operation is not lazy :)
17:19trap_exithmm, wait, so are assoc/dissoc both eager ?
17:19Bronsayes
17:19trap_exithmm, for some dumbass reason, all these years I thought maps were lazy as were assoc/dissoc
17:19trap_exitI'm glad we clarified this up
17:29arrdemBronsa: hum... how is infinite determined then...
17:30arrdemBronsa: I know there are techniques for doing print bounding, but it seems like proving the infinite property of a lazy sequence is hard
17:31Bronsaarrdem: what do you mean? there's no way in clojure to determine if a non-realized lazy-seq is infinite
17:31arrdemoh. sorry. that was brehaut not you.
17:31Bronsanp
17:31arrdem"clojurebot has its print vars set so that it wont print an infinite sequence ..."
17:32justin_smitharrdem: all that means is that he only prints the first N elements
17:32justin_smiththus never attempting to realize an infinite sequence
17:33justin_smith,(clojure.repl/doc *print-length*)
17:33Bronsahe was talking about *print-lenght*/*print-level*
17:33arrdemjustin_smith: yeah I knew about that
17:33Bronsaprint-lenght alone shouldn't suffice. suppose you have a vector with one element of infinitely nested vectors
17:35clojurebot"; *print-length* controls how many items of each collection the printer will print. If it is bound to logical false, there is no limit. Otherwise, it must be bound to an integer indicating the maximum number of items of each collection to print. If a collection contains more items, the printer will print items up to the limit followed by '...' to represent the remaining items. The root binding is...
17:35justin_smith,(clojure.repl/doc *print-level*)
17:35clojurebot"; *print-level* controls how many levels deep the printer will print nested objects. If it is bound to logical false, there is no limit. Otherwise, it must be bound to an integer indicating the maximum level to print. Each argument to print is at level 0; if an argument is a collection, its items are at level 1; and so on. If an object is a collection and is at a level greater than or equal to th...
17:35Bronsathat was about time clojurebot
17:36cbpyou can just (doc ..) :P
17:36cbp(doc inc)
17:36clojurebot"([x]); Returns a number one greater than num. Does not auto-promote longs, will throw on overflow. See also: inc'"
17:37TimMc,(let [v [1 2 3 4 5 6 7 8]] (aset (.tail v) 0 v) v)
17:37clojurebot[[[[[[[[[[# 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...] 2 3 4 5 ...]
17:37arrdemlolz
17:37TimMc^ That demonstrates both print-length and print-level.
17:37BronsaTimMc: don't do that ever again plz
17:37TimMchaha
17:38arrdem(inc TimMc)
17:38lazybot⇒ 56
17:38trap_exit(inc TimMc)
17:38lazybot⇒ 57
17:38trap_exit(int ardem)
17:38TimMcI can't believe .tail got exposed in 1.6. Just awful.
17:39arrdemTimMc: why?
17:39TimMcShenanigans.
17:39arrdemclearly demonstrated above, got it...
17:40arrdemthat you can do silly things with it I don't consider much of a STL bug tho.
17:40TimMcAlthough... I guess it's not like you could trust PV before.
17:41TimMc&(let [a (object-array 1) v (vec a)] (aset a 0 v) v)
17:41lazybotjava.lang.StackOverflowError
17:41TimMchum
17:41arrdemyou've also got the self-referential promise...
17:42TimMcI don't have a problem with that, actually.
17:42Bronsa,(let [a (object-array 1) v (vec a)] (aset a 0 v) v)
17:42clojurebot[[[[[[[[[[#]]]]]]]]]]
17:42Bronsalooks like lazybot forgot about *print-level*
17:43rasmusto,[[[[[#]]]]]
17:43BronsaTimMc: there's to be said that the doc for `vec` explicitely states that the array should not be modified
17:47clojurebot#<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]>
17:47rasmusto(inc clojurebot)
17:47lazybot⇒ 36
17:54TimMcBronsa: Huh! Looks like that warning came in on 1.5.0.
17:58hyPiRionTimMc: I love it, that feature is the best thing ever
17:59hyPiRionI don't know if I can use it in Swearjure though
18:04TimMc,(let [v [0 0]] (aset (.tail v) 0 v) (aset (.tail v) 1 v) v) ;; sorry Bronsa
18:04clojurebot[[[[[[[[[[# #] [# #]] [[# #] [# #]]] [[[# #] [# #]] [[# #] [# #]]]] [[[[# #] [# #]] [[# #] [# #]]] [[[# #] [# #]] [[# #] [# #]]]]] [[[[[# #] [# #]] [[# #] [# #]]] [[[# #] [# #]] [[# #] [# #]]]] [[[[# #] [# #]] [[# #] [# #]]] [[[# #] [# #]] [[# #] [# #]]]]]] [[[[[[# #] [# #]] [[# #] [# #]]] [[[# #] [# #]] [[# #] [# #]]]] [[[[# #] [# #]] [[# #] [# #]]] [[[# #] [# #]] [[# #] [# #]]]]] [[[[[# #] [# #]...
18:05Bronsa:(
18:10TimMcBronsa: I couldn't take you seriously after you used aset up there as well. :-P
18:10TimMcand isn't it a thing of beauty?
18:11AnderkentBronsa: missed an opportunity to use [# #] as the emote there
18:12rasmusto''[# #]
18:12BronsaI was just thinkint that there must be a way to use this to make some cool ascii art
18:24TEttingerBronsa: heh. just / and \, screenshotted and areas filled: https://dl.dropboxusercontent.com/u/11914692/AngleMazeColorful.png
18:28dsrxoh whoa, 1.6.0 was released?
18:28justin_smithis it stable? if so time to update the room topic
18:29Averellthere needs to be consensus by top analysts
18:29brehautjustin_smith: it is stable, but uh, probably all the ops are at clojure/west :P
18:33rlbassume I'm missing something obvious -- "lein new app foo; cd foo; lein uberjar; java -jar target/uberjar/foo-0.1.0-SNAPSHOT.jar" fails with NoClassDefFoundError, but the project.clj has a :main, and core.clj has a gen-class.
18:47mikerodCan a Symbol only `resolve` to nil, a Var, or a Class?
18:47PupenoI seem to able to run lein new luminus myapp and it works... how do I make sure I have the latest version of that luminus plug in or whatever it is that makes that possible?
18:48justin_smithlein new should find the latest
18:50Pupenojustin_smith: so, everytime I run lein new it checks for updates?
18:51technomancyPupeno: it checks once every 24h
18:51PupenoCool.
18:58stormehi #clojure, I'm new an learning... what's the best way to iterate over a vector, pull out data from it, and add each iteration of data to a new vector?
18:58stormewould a recursive loop work?
18:59justin_smithmapv?
18:59justin_smith,(mapv + [0 1 2 44])
18:59clojurebot[0 1 2 44]
18:59justin_smith,(mapv inc [0 1 2 44]) ; better example
18:59clojurebot[1 2 3 45]
19:00stormejustin_smith: that just might work
19:00stormethanks!
19:01justin_smithmind you if the output doesn't need to be a vector, and may benefit from laziness, then map is better than mapv
19:01Pupeno(map inc [1 2 3])
19:01Pupeno,(map inc [1 2 3])
19:01clojurebot(2 3 4)
19:01PupenoAh.
19:01PupenoOf course.
19:02stormenice
19:02justin_smithmapv is not lazy, it really depends on which data structure is better
19:02stormebut I plan on iterating over the new vector for something else
19:02justin_smithwell, that's neither here nor there as far as laziness is concerned
19:02justin_smithin fact laziness can speed that up by doing both maps in one go
19:03stormesorry still new to clojure coming from ruby, could you eli5 laziness?
19:03justin_smith,(do (mapv print (range 5)))
19:03clojurebot01234[nil nil nil nil nil]
19:03rasmusto,(take 10 (range))
19:03clojurebot(0 1 2 3 4 ...)
19:03justin_smith,(do (map print (range 5)))
19:03clojurebot(01234nil nil nil nil nil)
19:04justin_smithhmm, that will show a difference with a larger range argument in your repl
19:04justin_smithoh wait
19:04justin_smith,(do (map print (range 5)) nil)
19:04clojurebotnil
19:04justin_smith,(do (mapv print (range 5)) nil)
19:04clojurebot01234
19:04justin_smiththat's the difference
19:04justin_smiththe printing of the result of print was forcing it :)
19:05justin_smithwith laziness, if you don't use the result, no calculations are made
19:05stormeah
19:05stormeid like to return the result
19:05gfredericksBronsa: ping
19:05justin_smithand once you use it, it is calculated (it is slightly more complex than this given chunking for example, but that's the basic)
19:05stormeso another function can evaluate over it
19:05justin_smithright, but that can be lazy or non lazy
19:05Bronsamikerod: I can't think of anything else
19:05Bronsagfredericks: pong
19:06justin_smiththe question is does it need to be evaluated immediately, or can you wait until the value is used
19:06Bronsatechnomancy: time to update the topic :)
19:06justin_smithif you can wait, laziness means the map need only walk the input once, applying both functions
19:06mikerodBronsa: me neither
19:07gfredericksBronsa: I'm sitting here w/ tbaldridge trying to debug an NPE thrown by tools.analyzer.jvm when using my lib on a codebase with a deftype
19:07gfredericksgithub.com/fredericksgary/clj-usage-graph
19:07justin_smithstorme: also, it allows a style of programming where you describe how a long (or even infinite) lazy sequence is constructed, and use as much of it as you need at runtime
19:07justin_smiththis can often replace a mutable state with walking over a lazy structure
19:08Bronsagfredericks: one sec
19:10Bronsagfredericks: I see one obvious problem with that code but I don't know if that's the culprit for this bug
19:10stormejustin_smith: okay I think I understand
19:10stormethanks :)
19:10justin_smithnp
19:10Bronsagfredericks: actually two problems
19:11Bronsagfredericks: 1- you're using the same env for every analyze
19:11justin_smithstorme: example of state / lazy seq: a lazy seq of the lines in a file, you get the "next line" as the next element in the lazy seq, and you simple stop taking new items in order to stop reading (instead of putting *current-line* in some stateful container that mutates)
19:11Bronsagfredericks: unfortunately that won't do it, you need to use a new empty-env for every top-level form since namespaces might mutate at runtime
19:12gfredericksBronsa: oh interesting
19:12gfredericksI assumed since it was a PHM it was a value
19:12Bronsagfredericks: the other problem is that you're analyzing the whole file but not evaluating the form you're evaluating as you go
19:12Bronsayou're analyzing*
19:12Bronsajvm.tools.analyzer did that implicitely I believe
19:12gfredericksso I should evaluate each form before or after analying?
19:13Bronsagfredericks: I helped ambrosebs writing an analyze-ns function, one sec
19:14Bronsagfredericks: https://github.com/clojure/core.typed/blob/tools-analyzer/src/main/clojure/clojure/core/typed/analyze_clj.clj
19:14Bronsagfredericks: the env *is* a value, but empty-env recreates it every time you invoke it
19:15gfredericksBronsa: why would a value need to be recreated?
19:16Bronsagfredericks: suppose you are analyzing (do (intern 'foo) foo)
19:17Bronsaif you 1- don't eval the first form after analysis
19:17Bronsa2- don't refresh the environment to include the newly created var in the :namespaces atom
19:18Bronsaanalyzing the second form will fail
19:21Bronsagfredericks: this is a limitation inherent of how clojure works, cljs doesn't have this problems since it lacks runtime reified namespaces & "proper" macros
19:21gfredericksBronsa: okay, thanks; my battery's dying so I have to go, but I'll come back to this
19:21Bronsagfredericks: I will put an analyze-ns function in t.a.j in the next days btw
19:25Bronsagfredericks: also c.t.a.ast already has a lazy `nodes`
19:42PupenoIs there a way for lein to show which jars can be upgraded to a new version?
19:43bob2_Pupeno, lein ancient?
19:44Pupenobob2_: I got "'ancient' is not a task. See 'lein help'."
19:46bob2_Pupeno, you'd need to install the lein ancient plugin, I mean
20:04Bronsagfredericks: I just added analyze+eval that does the right thing for you, no need to rebuild the env https://github.com/clojure/tools.analyzer.jvm/blob/master/src/main/clojure/clojure/tools/analyzer/jvm.clj#L462-L485
20:34ivanvery pleasantly surprised to see all the talks up this early https://www.youtube.com/playlist?list=PLZdCLR02grLp__wRg5OTavVj4wefg69hM&amp;feature=c4-feed-u
20:34cbp^
20:37FrozenlockThere goes my productivity. Thanks ivan :p
20:38hfaafbbest clojure web app cloud hosting go
20:39ivanany linux server?
20:40ivanat which point you're trading off normal bandwidth/cpu/memory/disk requirements
20:40ivanand network reliability and price
20:42bob2heroku is pretty convenient
20:47krasivan: glad to see instaparse video in the list
21:05krasAny traditional Lex/Yacc implementation in clojure? like PLY in python?
21:07brehauti dont think anyone has been particularly keen; things like instaparse or perhaps the antlr bindings are more popular
21:07brehautyou can of course just use the java lex and yacc
21:09krasI have been using antlr but found it difficult since I don't completely understand Java
21:09krasprobably I am the only one using clojure without a background in Java :-)
21:09brehautunlikely
21:10brehauta lot of people have come to clojure from python and ruby
21:10brehautbut it is worth learning at least the basics of java
21:10krasThats good to know
21:10brehautas interop is idiomatic
21:10Frozenlockkras: My only background before clojure was emacs lisp :-p
21:16krasJava seems to be very verbose unfortunately :-(
21:17krasFound a clojure wrapper for antlr called clj-antlr but again its a work in progress
21:17honskras: if you already know a language wich C-ish syntax and some OOP language then Java is very easy to pick up
21:17brehautlooking at clj-antlr it doesnt seem like you need much java knowledge at all
21:18arrdemWhy use clj-antlr.. we have instaparse...
21:18brehautarrdem: speeeeed
21:18brehautarrdem: and existing grammers
21:18krasyes speed
21:19krasantlr from my initial experiments seems to be atleast 10 times faster
21:19arrdemnot totally shocking... but are your inputs large enough that parse time is significant?
21:19brehautpersonally i would reach for instaparse for most small parsing tasks, and antlr for the bigger ones (larger files, or hot paths)
21:20arrdembrehaut: Agreed. Hence why I'm not using instaparse for my modular tools.reader rework.
21:20krasYeah I have some very big files to parse and the grammar I have has several rules
21:20brehautoh yeah arrdem re yesterdays discussion: seniority can shove it; interesting ideas and engaging your brain are what is important
21:20arrdemkras: define several....
21:21krasThe only issue I have with clj-antlr is I do not know how to take some actions if a rule is triggered
21:22krasand there is not documentation yet which explains this
21:22arrdembrehaut: lolz. I think `Bronsa and `Raynes are the only people younger than me in here.. and both of them out experience me. I'm over it.
21:24brehautarrdem: i still dont think its important
21:25brehautyou can be old as the hills and worked in software all your life and still be as ignorant as someone who has never seen a line of code before
21:26patchworkHmm… how do I use js `===` from cljs?
21:26brehautpatchwork: = i think?
21:26patchworkOr rather, how do I test js object equality from cljs?
21:27patchworkI don't want to test value equality, I want reference equality
21:27patchworkthe dirty js kind of equality
21:27technomancyarrdem: did you just backquote their nicks in order to fully qualify them?
21:28patchworkI have two references to potentially the same js object, does regular (= obj1 obj2) work for that?
21:28krasrequest to clj-antlr developers, please put some documentation in place. Its a great project and I am guessing there are lot of people like me without java background who wnat to use this
21:28arrdemtechnomancy: I backquoted in the hope of not notifying them :P
21:28brehautpatchwork: do you know about https://himera.herokuapp.com/synonym.html ?
21:28technomancyarrdem: oh, I thought maybe you intended to resolve to bronsa.it and raynes.me or something
21:28brehaut(not that i know if its there or note but handy)
21:29patchworkbrehaut: Yeah that has a lot of good comparisons
21:29patchworkIn there equality is not the same between cljs and js
21:29brehautpatchwork: maybe it doesnt want you to ;)
21:30technomancy.us is overrated
21:30brehautnot as overated as .shirts
21:30brehautor .drycleaning
21:33patchworkbrehaut: That is probably true, though annoying in this case
21:33arrdemtechnomancy: says the only person I know with a .us domain :P
21:36brehautthat sounds like a qualification to me
21:38ddellacosta.to is cool
21:42RaynesI own raynes.sexy.
21:43RaynesI'm working on setting up a new blog, wanted to point that at it, but it'll inevitably be deemed inappropriate.
21:43RaynesNeed to find some use for it that can't be turned into a Thing™.
22:19dissipatei figured it out
22:20dissipate,(and)
22:20clojurebottrue
22:20dissipate,(or)
22:20clojurebotnil
22:20dissipatei figured out why (and) is true, but i still don't get why (or) is nil. i think it should be false.
22:22dissipatedoes anyone here know why (and) evals to 'true'? :D
22:24brehautpresumably the same reason (*) evaluates to 1; its the identity of true
22:24brehauterr, of and
22:24brehautvariadic and ~= (reduce binary-and identity-value args)
22:24dissipatebrehaut, right. but why does (or) evaluate to 'nil'?
22:25brehautfor the same reason
22:25dissipatebrehaut, right, but why is it 'nil' and not 'false'?
22:25brehautnil and false are both falsey
22:25brehautand nil punning with or is an idiomatic language thing
22:26brehautor is a true and falsy operation, not a true and false op.
22:26brehautit would lose its defaulting behaviour otherwise
22:27dissipatebrehaut, i see. well, mystery solved then
22:29brehautthe real question is why
22:29brehaut,(and 1 2)
22:29clojurebot2
22:29brehaut,(and 1)
22:29clojurebot1
22:29brehaut,(and)
22:29clojurebottrue
22:29brehautor is actually the more consistent version
22:30dissipate,(or 1 2
22:30clojurebot#<RuntimeException java.lang.RuntimeException: EOF while reading>
22:30dissipate,(or 1 2)
22:30clojurebot1
22:31brehautor returns the first truthy thing, or nil (nothing)
22:31brehautexcept in the circumstance where a false is present and no truthy thing is present
22:31dissipatebrehaut, where is the inconsistency?
22:32brehautor will return nil if all its expressions evaluate to nil
22:32brehautand returns the last expression if they are all truthy
22:33dissipatebrehaut, you mean if all the expressions evaluate to nill or false?
22:33brehautcorrect
22:33dissipate,(or false false true)
22:33clojurebottrue
22:33dissipate,(or false false)
22:33clojurebotfalse
22:33dissipatehmm, that's somewhat inconsistent
22:33dissipatewhy not nil?
22:34brehautsort of
22:34brehautbecause and and or are both weird in the presence of actual true and false
22:34brehaut,(and 1 2 false)
22:34clojurebotfalse
22:34brehaut,(and 1 2 3)
22:34clojurebot3
22:34brehaut,(and 1 2 nil)
22:34dissipatebrehaut, why?
22:34clojurebotnil
22:34brehauti presume its some kind of weird polymorphism
22:35brehautif you are dealing with truth values you probably want truth values back
22:35brehautotherwise you are dealing with objects and want objects back
22:35brehaut(and nil is the absense of an object)
22:35dissipatebrehaut, is it the case that only predicate functions should return 'true' or 'false'?
22:35dissipateoh heck no. i don't want objects. maybe data structures, not objects
22:36brehautits the case that predicates should return only true or false, but other functions that are not predicates may reasonably return them too
22:36brehautwhat do you think a datastructure is?
22:36dissipatebrehaut, are you referring to what it is in Java or in the theoretical sense?
22:36brehautboth
22:36dissipatebrehaut, what non-predicate function should return true or false?
22:37brehauthow about get
22:37brehautor first
22:37brehaut,(first (repeat true))
22:37clojurebottrue
22:37dissipatebrehaut, yeah, i see your point there. if you are iterating over true or false themselves
22:37technomancyhttps://lein-survey-2014.herokuapp.com <- this year's edition of the lein survey is out
22:38technomancyplease fill it in if you use leiningen
22:38brehauttechnomancy: are you not westing this year?
22:38dissipatebrehaut, a data structure is definitely not an object though. an object bundles functions with data. a data structure is just data.
22:38technomancybrehaut: sadly not
22:38brehauttechnomancy: sorry to hear
22:39brehautdissipate: a closure bundles function and data
22:39brehautis that an object?
22:40hfaafba map can have keys that point to both data and functions
22:41dissipatebrehaut, no, a closure is a function that has access to data
22:41brehautdissipate: you need to get your zen on then
22:41brehautclosures and objects are isomorphic to each other
22:41brehautthere is nothing inherently evil about objects
22:42brehautmerely the default statefulness people use in objects
22:42brehaut(let [a (atom 1)] (fn [] (swap! a inc)))
22:43dissipatebrehaut, you do have a point. in Python, an object is just a dictionary with special stuff in it.
22:43brehautis exactly as dangerous and problematic as any other object with statefulness
22:44dissipatebrehaut, i'm thinking more along the lines of classes with inheritance, polymorphism and encapsulation. the biggest fail in software ever.
22:44brehautinheritance sure, encapsulation reasonable case. polymorphism definately not a fail
22:45brehautin spite of technomancy’s best efforts polymorphism is a fundamental part of clojure
22:45technomancyI don't mind a good polymorphic function
22:46technomancy(as long as it's part of clojure.core)
22:46brehaut:)
22:46brehauta little, well considered, polymorphism goes a very long way
22:46brehautnot to mention higher order functions are polymorphic
22:47taliosbrehaut++
22:47technomancytransitive polymorphism??
22:47lazybottechnomancy: Uh, no. Why would you even ask?
22:47brehauthi
22:47brehauthaha
22:47taliosbrehaut - if you don't use lein, what are you using?
22:48brehaut /ˈbriːəʊ/
22:48brehauthaha were did you get the idea i wasnt using lein?
22:48taliosplease not be saying Make :)
22:48brehautMake‽ Make!!
22:48brehautmake is for kids
22:48technomancyI wrote a makefile the other day
22:48brehautreal developers use batch
22:48taliosewps - misread the scrollbuffer :)
22:48brehautare you going to recinde my ++ now?
22:48taliostechnomancy - did it just call lein? :)
22:49technomancytalios: nah, it was for forth
22:49technomancy
22:49taliosgood lord :)
22:49technomancywell, for a program that implements forth
22:49taliosI'm not sure thats much better :) hah
22:49brehauttechnomancy: apparently i have been using lein for too long “What annoys you about Leiningen?” nothing to check; have i become innerred to the problems?
22:49taliosmore hardcore for sure
22:50dissipatebrehaut, well then clojure is doomed. might as well join the Haskellers pursuing purity at all cost.
22:50technomancybrehaut: I left out the "spoils me for other stuff" check, sorry
22:50taliosdissipate: idris!!
22:50brehauttechnomancy: lol indeed :)
22:50brehauttechnomancy: seriously though, its been in public since 2009?
22:51technomancybrehaut: 1.0.0 was that december
22:51technomancyI think the `git init` happened on halloween
22:51brehautit seems like it shouldnt be that long ago
22:51talios<oldname> i remember a time before leiningen - and that time was clojure-maven-plugin :) oh wait, still is.
22:52talioss/name/man/
22:52brehauti scrabbled stuff together with bash scripts :P
22:52arrdemtalios: typically kicking your hands doesn't improve your touch typing
22:52brehautnone of this maven nonsense
22:53taliosarrdem - true true. maybe that's the problem.
22:54dissipatebrehaut, i want none of this Java nonsense. i'm switching to Arc
22:55brehautif you wanted non of java, clojure was the wrong choice
22:59dissipatebrehaut, how about clojure on the GHC?
22:59brehauttechnomancy: this forth, did you day its running _on_ your keyboard?
23:00brehauts/day/say/
23:00brehautapparently talios isnt the only one who cant type today. i blame the late hour
23:00technomancybrehaut: not yet
23:00technomancybrehaut: I don't have conditionals implemented yet
23:00brehautyet
23:00technomancywell
23:00brehauthah
23:00technomancyI have if, but not endif
23:01taliosdissipate - how about newlisp?
23:01technomancywhich makes things awkward
23:01dissipatetechnomancy, why are you implementing Forth?
23:01technomancydissipate: because my keyboard firmware is currently written in C
23:02technomancyI want to hack it, but I don't like programming in languages that aren't interactive
23:02dissipatetechnomancy, interesting
23:02technomancyhttps://github.com/technomancy/orestes https://github.com/technomancy/atreus
23:03dissipatetalios, how big is the library for newlisp? i'm guessing it is pretty small.
23:03brehauttechnomancy: every time you name a project i feel like i am underread
23:03technomancybrehaut: you're in luck; these are both named from the same book
23:04brehauti feel like i should recognise this; the former is some relation to agamemmnon right?
23:04taliosdissipate - no idea, small I think. I only came across it a few months back and only briefly looked at it.
23:04technomancybrehaut: yeah
23:04technomancyboth are, actually
23:04brehautboth parents?
23:04technomancyno, son and grandfather
23:04brehautah
23:04technomancyatreus is where we get atriedes from Dune
23:05brehautoh true
23:05brehautpresumably also atreus from myst
23:05technomancyoh yeah
23:05technomancythe father?
23:05brehauti think so yeah
23:06technomancycool; I had forgotten that
23:06brehautacenar and something are the sons?
23:06technomancysirrius
23:06brehautthats right
23:06brehauti need to play riven
23:06technomancyit's pretty good
23:06technomancyI didn't get into the third one, but I didn't give it much of a chance
23:07arrdemtechnomancy: so what you're telling me is that when I try and do an embedded Clojure compiler, it's gonna be codenamed Corrino....
23:07tmciverI just finisehd playing realMyst. Not bad but the 3D graphics look like they're from 10 years ago.
23:07dissipatetalios, same problem that Graham has with his Arc language: not enough libs
23:07brehauttmciver: yeah i only played realMyst a couple of years ago and frankly only look 10 years old is an improvement ;)
23:07tmciverI think the names were Atrus, Sirrus and Achenar.
23:07technomancyarrdem: you could do Ordos
23:08technomancytmciver: oh, right. close enough.
23:08brehautdissipate: i wonder how clojure got all libs so quickly? surely its not all this java stuff we can leverage for free…
23:09tmciverI was dissappointed by the 'new' Rime age.
23:09brehauttmciver: the little snow place ?
23:09tmciverbrehaut: yup
23:09brehauti wasnt expecting a real age so i wasnt too disappointed
23:09brehautbut i had hoped it would have a bit more story in it
23:10dissipatebrehaut, but there is actually a big cost there. there is little incentive to write enough native libs to ever escape the JVM.
23:10tmciverNow I'm going to have to play Riven . . . again . . . for like the fourth time.
23:10brehauttmciver: sorry man
23:11brehautdissipate: every tradeoff comes with costs and benefits. news at 11?
23:11dissipatebrehaut, the goal is to eventually ditch the JVM, right?
23:11brehautno
23:12brehautthe jvm is a serious advantage
23:12brehautits not suitedto every task but when it is it kicks a lot of arse
23:13dissipatebrehaut, we need a lighter weight VM written in clojure itself
23:13brehautdissipate: perhaps you need to go aquaint yourself with the strengths of the JVM before you make such comments
23:14dissipatebrehaut, the startup time is horrendous. that's problem enough.
23:14technomancydissipate: so target racket or something
23:14technomancystarting from scratch is a waste of time
23:15dissipatetechnomancy, actually, clojurescript might start dominating in the future.
23:15arrdemdissipate: .... or not.
23:15brehautlol
23:15technomancyheh
23:16dissipatebrehaut, are you saying the JVM is better than the javascript VMs?
23:16brehautfor all tasks? no. for many tasks? yes
23:16technomancynot having integers or standardized file IO is kind of a deal killer for most people
23:17brehautand having a memory model designed to handle concurrency is nice to have too
23:17dissipatebrehaut, what about Parrot VM?
23:18brehautrhymes with pipe dream
23:18dissipatebrehaut, good enough for Perl 6, right?
23:30seangrove~bbloom
23:30clojurebotbbloom is a dendrologist
23:30seangroveboom
23:30brehautO_o
23:32brehautooooh
23:32brehaut~gfredericks
23:32clojurebotgfredericks is polluting your memory and must be destroyed
23:32dissipateinc clojurebot
23:33dissipate,(inc clojurebot)
23:33clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol: clojurebot in this context, compiling:(NO_SOURCE_PATH:0:0)>
23:42TEttinger(inc clojurebot)
23:42lazybot⇒ 37
23:43zspencer(swap! lazybot 5)
23:43Rayneslol
23:43zspencerI... I think I broke it?
23:44dissipate(inc clojurebot)
23:44lazybot⇒ 38
23:44Rayneszspencer: (inc ..) entirely fake.
23:44Raynesis entirely fake*
23:44dissipate,(slurp 'http://www.www.com')
23:44clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Cannot open <http://www.www.com'> as an InputStream.>
23:44RaynesIt's parsed manually. The formatting is more of a joke than anything. No actual code is excuted there. :P
23:45zspencerRaynes: I figured; I was oping that maybe; just maybe....
23:47skelternetI've encountered something I do not understand. I cannot seem to pprint an instance of java.util.GregorianCalendar
23:47skelternetI get an arityException
23:49beamsosame
23:49beamsoprint works though
23:50skelternetnice to have company. think it's a bug?
23:51skelternetdo I need to write a new writer function?