#clojure logs

2014-06-01

00:04duck1123:( minimal aleph test-case works fine. It's my birthday, shouldn't this work for me today?
00:06rhg135duck1123, it's never that easy
01:54tolstoyduck1123: If it comes to it, http-kit might be a good alternative.
02:23hadronzooWill leiningen use credentials.clj.gpg to authenticate not only on deploy, but also when searching for artifacts?
02:36tolstoyI'm guessing cljsbuild is not quite a good citizen in this case.
02:36tolstoyOops. (cljsbuild hook is, uh, problematic for me)
04:13no7hingis this still the canonical way to get a record’s type in clojurescript? http://stackoverflow.com/questions/17190575/how-do-i-get-the-type-of-a-record-in-clojurescript
04:26martinklepschare there other clojure devops things than pallet?
06:45AeroNotixhttps://gist.github.com/AeroNotix/334e54e5b11ce6a608ac
06:46AeroNotixCaused by: java.lang.RuntimeException: Unable to resolve symbol:  in this context
06:46AeroNotixwhat's going on there?
06:46blur3d, (def track1-data ["B4000000000000002^CardUser/John^131210100000019301000000877000000?" "B4000000000000002^CardUser/John ^131210100000019301000000877000000?"])
06:46clojurebot#<CompilerException java.lang.RuntimeException: Unable to resolve symbol:  in this context, compiling:(NO_SOURCE_PATH:0:0)>
06:48TEttinger "B4000000000000002^CardUser/John ^131210100000019301000000877000000?"
06:48TEttingeruh sorry
06:48amalloyyou probably have a non-breaking space or other weird whitespace character in there
06:48AeroNotixhm
06:49AeroNotixffs
06:49blur3dthe double quotes are being evaluated
06:50AeroNotixwhen I copied the strings to a new def, it works...
06:50AeroNotixlolunicode
06:50AeroNotixOr something
06:50AeroNotixin other news, I need to generate track1 cc information, does anyone have a list or some code to generate this?
06:50TEttingeryeah there's probably an unprintable garbage char in the string
06:50blur3dyeah, something weird.. I got it working with single quotes and alphanum chars only
06:51AeroNotix#FuckIt
06:51AeroNotixnext problem
06:51TEttingercopying pasting might remove the unprintables haha
06:51wagjoAeroNotix: you have an EF BB BOM between last string and ])
06:51AeroNotixwagjo: lol
06:52AeroNotixI really don't know how that happened
06:53blur3dtry typing it out by hand from scratch
06:53AeroNotixblur3d: I did, already said I did. It works
06:54blur3dkk
06:54AeroNotixI need some Track1 CC info now, the one I pasted above, works. But I need MOAR
06:54AeroNotixjust for unit testing
08:12enenhey guys iv been meaning to get into clojure for some time now. while i can google on how to get started and wont bother you with that, i cant decide if i should try and learn also vim or emacs in the process. would it be worth my time?
08:14Rhymorenen: emacs has a great lisp integration. Vim is good for text editing (as opposed to text authoring)
08:15RhymorIf all you want to do is program, start with LightTable
08:15enenyes, light table looks great, i was thinking to go with it
08:15RhymorIt has an emacs and vim keybinding plugin. So you can experiment with these.
08:15enenyeah exactly
08:16Rhymorenen: in short, emacs is a programmer’s editor, vim is a system administrator’s.
08:17enenRhymor: thats an interesting thought
08:17locks+1 for Light Table
08:18locksI was trying clojurescript the other day
08:18locksopened a browser tab on LT, connected, bam live reload
08:18enenim a fan of bret victors stuff, thats why id like to try light table
08:19enenlocks: coming from an ios dev background where i have to wait 30 secs to a minute for my simulator to run my code this looks like a dream haha
08:22locksyeah can't wait for some of the LT updates
08:23ambrosebsenen: also check out Cursive Clojure if you're shopping.
08:24wagjo,(+ 2 2)
08:24clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
08:25ambrosebs,+
08:25clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
08:27wagjoseems like I've broken clojurebot (again), sorry
08:30locks,)
08:30clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
08:30locks,)
08:30clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
08:30locksNooOoo
08:48scapeopinions/feedback welcome :) https://github.com/viperscape/kuroshio/blob/master/examples/chan.clj
09:19AWizzArdrhg135: please check your priv query windows
11:55irctchi everyone, I have a question about using nREPL (cider) in Emacs. In my clojurescript project, I start the repl server using cider-jack-in command. However, whenever I try to execute a function from the clojure file, a compilerexception is thrown with the message unable to resolve symbol. What could be the problem? Does cider load all dependencies automatically?
11:56irctcanyone is there?
12:02yotsovirctc: you could try asking this in #clojurescript I guess. I don't use emacs so can't help
12:07hyPiRionirctc: It's silent on sundays
12:22visofhello is the best way to write concurrent fast code is using future?
12:45agumonkeyhello aliens
13:54mindbender1
13:54Jaood
14:11andyfambrosebs: Is it time to change the recommendation at this link, given that tools.analyzer(.jvm) might be ready to build tools now? https://github.com/clojure/jvm.tools.analyzer#future-deprecation
14:21bbloomamalloy_: burned by zero arity assoc AGAIN
14:23andyf0 arity, or 1 arity?
14:27fifosine1Quick question: I'm looking at the function definition "(defn thumbnail-link [{:keys [userid name]}]", what's going on here with the map?
14:31jeremyheilerfifosine1: map destructuring. you can call it like: (thumbnail-link {:userid "foo" :name "bar" :somethingelse "baz"}) and it will pull the specified values out for you.
14:31mindbender1fifosine1: That's destructuring. You can read more here and research further: http://blog.jayfields.com/2010/07/clojure-destructuring.html
14:31fifosine1ok, will read, thank you
14:36fifosine1mindbender1: Oh wow, the :keys directive is pretty cool
14:37mindbender1Yes it is. There are many cool stuff in clojure as you'll soon find out.
14:58pwiki_What is recommended for working with dates and time in ClojureScript? Is cljs-time mature enough, or should I use a JS library like MomentJS? Does someone has experience with this?
15:00benmosspwiki_: i recommend using the Google Closure classes
15:00benmossi’m not familiar with cljs-time really
15:00jeremyheilerbenmoss: it appears that is what cljs-time does.
15:01benmossso to the extent that it’s just a wrapper it’s probably “mature"
15:01clojurebotIt's greek to me.
15:01jeremyheileryeah probably.
15:02pwiki_ok, then I will give cljs-time a try, thanks
15:17benmossdo people use chunked-seq stuff directly in their code much?
15:17benmosschunk-buffer chunk-append chunk-cons etc
15:18benmossi would guess its just an implementation detail that maybe you see in the wild in some deftypes but otherwise pretty rare?
15:45fifosineHas anyone here worked through Web Development in Clojure?
16:08platzAnyone tried Caribou?
16:08platzlooks like kind of a batteries-included web framework as opposed to a minimal one
16:08platzfor better or worse
16:11amalloybenmoss: i have never used chunk-*
16:14benmossyeah all i could find was some stuff about using custom chunk sizes for optimization
16:16serendipity1why did Rich Hickey ultimately chose jvm over clr?
16:17turbofailbecause he didn't want to be trapped on windows?
16:17turbofaildon't even bring up mono
16:18bbloomturbofail: seems like he did a fair bit of professional c# development, so i'm not so sure that he's super worried about windows
16:18AWizzArdWell, the C in CLJ stands for C# actually.
16:18bbloomthere's an old interview w/ fogus where he said he wanted to do twice as much, not the same stuff twice
16:18AWizzArdC#, Lisp, Java
16:18bbloomand the jvm version was dramatically more popular, hence jvm wins
16:18turbofailthat too
16:19turbofailpart of the reason the JVM was more popular though was because it was more cross platform
16:20serendipity1thanks bbloom, that clears up things. I was wondering because he earlier was implementing dotLisp or smthg like that
16:21bbloomserendipity1: iirc he said in interviews that dotlisp was his "everybody's first lisp" project... presumably during the time he was writing C# professionally
16:21benmosscan someone explain to me why `chunk` isn’t idempotent? https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/ChunkBuffer.java#L30
16:22serendipity1If interop with c# is my prime concern should I choose IronScheme or ClojureClr?
16:22bbloomserendipity1: they are very different languages
16:24bbloombenmoss: once you call chunk, you've shared the private buffer... so you can't reuse it
16:24serendipity1I want to learn a homoiconic language but have ability to interact with c#
16:25benmossbbloom: so just to enforce the pattern it makes the buffer unusable?
16:25arrdemserendipity1: I picked up several Scheme dialects, then Common Lisp, then Clojure. Clojure is the only one I use. homoiconicity is overrated, langage communities and semantics make all the difference.
16:25bbloombenmoss: yeah, when you call "chunk" on the buffer, you're releasing that resource, effectively
16:25bbloomserendipity1: we're bias in here, but learn ClojureCLR
16:25benmosscool, thanks
16:26bbloomserendipity1: and if you're just learning, i suspect interop is relatively unimportant... unless you've got something in particular in mind you want to build with it
16:26bbloomserendipity1: IronScheme attempts to confirm to the scheme spec, which makes interop harder. clojure is designed to be hosted, so it's interop support will be much smoother
16:28serendipity1in my regular c# code i find myself in place where language starts getting in the way. i have higher order templates, lambdas, code generation all over the place and it just feels a little bit too verbose
16:28bbloomserendipity1: you won't find anybody disagreeing here :-P
16:29serendipity1:)
16:31serendipity1but as far as I understand I could also do all these fun lisp-macro magic in IronScheme, right?
16:32arrdemAs an SRSN | n >= 5 compliant Scheme IronScheme definitely has macros, so yes but macros are overrated.
16:33bbloomserendipity1: yes... with the caveat that i don't know anything about iron scheme... although traditionally scheme has a more complex macro system than clojure or common lisp, and so you may wish to prefer to learn about macros in a simpler context
16:33arrdems/SRSN/RNRS/g
16:40serendipity1arrdem, why do you find homoiconicity and macro system overrated? I've some experience with homoiconicity (coding in mathematica, which is great but slow as hell) and it's the exact thing that makes me consider lisp for some auxiliary coding. In C# there's a mismatch between regular code and code generation. And then there is the generator for the code generator :)
16:43arrdemserendipity1: for some problems runtime code generation is awesome. I'm building a compiler for clojure this summer. Runtime code generation is what I do. That Clojure and other lisps have support for this baked in is awesome. However, after reading a ton of books on macros and runtime code generation I have yet to sit down on a problem and go "ah yes I can just generate code and eval it". There was one instance where I actually did do clojure code generati
16:44turbofailrun-time code generation is great for transmitting functions over the wire
16:44platzThe ugliness of code gen in non-homoiconic languages serves as a deterrent to over-use, and in C# or Scala it's not *that* bad, only requires an up-front learning investment
16:45arrdemyeah. Honestly I think that partial is probably the only runtime code generation that gets used "regularly".
16:46arrdembut that's just my 2c.
16:46Bronsaarrdem: your previous message cut at "I actually did do clojure code generati"
16:46arrdemBronsa: :/ I gotta get ERC to resume splitting long messages.
16:47arrdemon I have yet to sit down on a problem and go "ah yes I can just generate code and eval it". There was one instance where I actually did do clojure code generation, but that was a parser generator and arguably not a nice one either.
16:47Bronsaarrdem: tell me how to do it once you figure it out :)
16:48turbofailpartial?
16:48arrdemBronsa: I think it's something to do with channel spam protection settings.
16:48turbofaili don't think partial does any code gen
16:50andyfinc Bronsa
16:51andyfHow does one do that? It's been so long since I've seen an example I've forgotten.
16:51arrdemturbofail: functions in jvm clojure exist only as IFn classes. In order to express a partial application you have to generate a new one-off class instance which serves to wrap the partial'd arguments together with the apply machinery to insert the application arguments.
16:51andyf(inc Bronsa)
16:51lazybot⇒ 22
16:52andyfNot for something just now, but for enhancements and fixes to tools.analyzer(.jvm) throughout Dec and Jan :)
16:52Bronsahah, thanks
16:53gastoveOkay room, question: can you pass a namespace as an argument to a function?
16:53andyfSounds like those libs are getting use by core.async and core.typed now?
16:53turbofailarrdem: are you sure? i don't think that's what partial actually does
16:53turbofailer ok it does make a new instance
16:53turbofailbut not a new class
16:54Bronsaandyf: yep
16:54andyfgastove: Yes, you can, but that doesn't necessarily mean you can do anything you might want to be able to do with it.
16:54turbofailthus not really code-gen
16:54turbofail,(map class [(partial + 3) (partial - 5)])
16:54clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
16:54andyf,(the-ns 'clojure.core)
16:54clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
16:54turbofailinteresting
16:54Bronsawat
16:54arrdemwat
16:55arrdemhow did map just do that..
16:55gastoveandyf: hrm, okay. Thanks! I'm probably better off defining some sort of attribute map and loading _that_ instead.
16:56arrdemturbofail: you're right, because in generally you could write a single partial that just does (fn [& args] (apply f (concat partial-args args))) which makes the generated f just an instance with a seq and an ifn.
16:56amalloysomeone probably broke all of clojurebot's eval again
16:56amalloy,1
16:56clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
16:56arrdemturbofail: so not really code gen, just instance creation.
16:56andyfgastove: The expression I attempted to evaluate above (the-ns 'clojure.core), successfully returns a Java object of type clojure.lang.Namespace in my REPL. What were you hoping to do with that namespace arg in the function?
16:56amalloyhe'll recover. in the mean time, lazybot's eval is more fun anyway, right???
16:56lazybotamalloy: How could that be wrong?
16:56clojurebotPardon?
16:59gastoveandyf: uh, honestly, probably something that isn't idomatic Clojure (I'm newish to this). I was defining a namespace that describes several pieces of an MVC-esque model -- then in a controller, I wanted to load that namespace, then pass it to a function that checks to see if migrations have already been done for that model.
17:00gastoveandyf: so something like (defn migrate [model] (if-not (migrated? model/table-name) (do-db-things-with model/spec))
17:00andyfgastove: ok. I don't think I have any experience to say whether that would be a good approach or not.
17:01serendipity1arrdem, For me code generation mainly comes here: I find that when I heavily adhere to SRP I often need to abstract away the whole pattern of wiring between objects. And IoC containers come somewhat short for that. What often changes when I find a better solution to the problem is also the whole pattern of communication between objects.
17:01gastoveandfy: Honestly, I don't either :-P
17:02serendipity1So when the wiring/communication pattern is generated then only localized change in the generating code is required. So when I work towards more robust abstractions it also pushes me towards code generation more and more, and code generation in non-homoiconic languages, I feel, doesnt hack it
17:08serendipity1anyways, g'night everyone, thanks for some lisp/scheme clarifications
17:11arrdemBronsa: ever consider core.typed-ing tanal? I've been kicking the idea around and I'm not sure it's possible since you want to support host local tanal AST extensions and ctyped would probably require a total AST definition.
17:17Bronsaarrdem: ambrose started working on annotating taj a while ago but I believe he decided core.typed is not suited for validating its ast (I may remember wrongly though)
17:18Bronsaarrdem: I don't know if that changed but core.typed is'nt really suited for validation of runtime emitted data, that's more of a job for something like Schema
17:18Bronsaisn't*
17:20Bronsaarrdem: also since core.typed depends on taj that would probably cause circular dependency issues
17:22arrdemBronsa: the reason I say this is a typing problem is that a type system lets you say no other datastructure could ever exist where schema just says "well it looks good for now" which is much weaker.
17:22arrdemBronsa: definitely WRT the circular dependencies, probably even using the new lightweight build.
18:06noncom|2is java interop of form Class/staticMember resolved during runtime or compile time?
18:07bbloomcompile time
18:08noncom|2how can i take it to realtime?
18:08noncom|2would (constantly Class/m) work?
18:08bbloomnoncom|2: the simplest thing to do is:
18:08bbloom#(Class/m %)
18:09noncom|2but the static member is a variable, it is not a method...
18:09noncom|2it can change in runtime though, so compile time does not cut it
18:09bbloomoh, you want a field?
18:09noncom|2aha
18:09bbloomthere are some methods on clojure.lang.Reflector
18:10noncom|2no simpler way? :)
18:10bbloomnot w/o more details about what you're trying to accomplish
18:11noncom|2i have a java library which relies on a static variable. this variable is assigned after ini (it is OpenGL context). i want to have a simple function to get it like (my-ns/gl-context).
18:12noncom|2the task is to make the function return the current value not the compile-time one..
18:12bbloomi'm not sure i follow
18:12bbloomis there only one such static variable? or many of them?
18:12noncom|2hmm.. maybe i misunderstand something..
18:12noncom|2one variable
18:12noncom|2the global open gl context
18:13bbloomit's a public static field?
18:13noncom|2yes
18:13bbloomcalling it like a function with no arguments should just get the field
18:13bbloom(TheClass/theField)
18:13noncom|2ok, will try now
18:15noncom|2hmmm... nope. it returns a opengl context instance, just like with calling plain Class/method (w/o parens) but it does not give a desired result. maybe there is another mistake somewhere, i have to look for
18:16noncom|2but, hey, (Class/field) and Class/field give seemingly same results..
18:16noncom|2so i think what you adviced is right, but i have some other error in the code to look for. this was not the cause, as it looks like
18:16bbloomyes
18:18noncom|2found it! yep was another place :) thanks for helping though!
18:30whilohi, in clojure i cannot override the pr serialisation of a record, right? in cljs it is a protocol: IPrintWithWriter
18:32bbloom(doc print-method)
18:32clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
18:32whiloin clojure it is a multimethod: print-method
18:32bbloom,(doc print-method)
18:32clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
18:32bbloom&(doc print-method)
18:32lazybot⇒ "; "
18:32bbloomargh.
18:35iwillig1okay
18:35arrdemis someone ddosing the bot with REPL breaking code?
18:36locksbot is still broken?
18:37arrdem,(+ 1 2)
18:37clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: clojure.core/with-open requires an even number of forms in binding vector in clojure.core:>
18:38arrdemlocks: I'll take that as a yes...
18:38locks:(
18:43whilobbloom: hmm, print-method in core.clj has no docstring, do you know a way to overwrite the behaviour of a multimethod?
18:44whilojust curious, i am doing it wrong probably anyway
18:44whiloso i hopefully don't need it
18:44whilo(i have to rethink my current attempt)
18:44bbloomwhilo: google it, it's kinda a weird ugly spot in clojure core, but works fine once you get it down
18:45whilook, thx. nice dendrology talk btw.
18:48whilobbloom: got it, thx
18:48bbloomwhilo: glad you liked it, thanks!
19:04noncom|2does nrepl have any dependencies besides clojure and java?
19:05noncom|2there is no project.clj, so i am not sure
19:05noncom|2but it look sso
19:05noncom|2*so
19:07noncom|2looking at the sources seems like proving that
19:09kschraderanyone know how to use the #uuid reader with a Var?
19:10kschraderit works fine if I pass it a UUID String
19:10kschraderbut as soon as I put that same sting in a Var it blows up
19:11kschraderExample: https://gist.github.com/kschrader/c41891bd6bc78dd2b653
19:11noncom|2maybe @a?
19:12kschradernope, can't deref a String
19:13whodidthis(def a #uuid "538ba7b2-5034-4146-a1d0-884eebfce27f")
19:13hiredmankschrader: reading and evaluating are different things
19:14hiredmanwhen you (def a "foo") a is read in as the symbol a, but evaluated to the string "foo"
19:14hiredman#uuid "..." is transformed by the read (before evaluation has happened) in to a uuid object
19:14kschraderah, that makes sense
19:14kschraderthanks hiredman
19:19noncom|2kschrader: (read-string (str "#uuid \"" a"\""))
19:19noncom|2works
19:20kschradernoncom|2: that's helpful, thanks
19:20kschradermakes sense now
19:27noncom|2kschrader: although i'd use something like (java.util.UUID/fromString a)
19:31gfredericksnoncom|2: the pom.xml isn't that hard to read
19:33noncom|2gfredericks: yeah, but i never read one before :D
19:33noncom|2but still it looks like there is nothing external, from whata i can say
19:33noncom|2looked at the pom too
19:33gfredericksI think contrib projects tend to be pretty low on dependencies
19:34gfredericksat worst they depend on another contrib project? not 100% sure about that
19:34noncom|2looks like nrepl is clear on that - nothing external
19:34noncom|2this is very good for me
19:40gfrederickshow long can GC pauses get?
19:41gfredericks<8GB of ram
19:52munderwoHi all. Im trying to :require a defrecord from another namespace. code here https://www.refheap.com/86178
19:54munderwoIt seems like im not doing the correct :require somewhere or :import. Any ideas?
19:59tolstoymunderwo: Just a guess, but might you need to (:require [raft.log :refer [->LogEntry]])
19:59tolstoyOr maybe just use (LogEntry. 0 0 "Foo")?
20:04yediare their any clojure libs / interfaces that make weka not terrible to use
20:06yediahem, there*
20:09munderwotolstoy: hmm. didnt seem to do the trick. I've got a work around for now. I tried the (LogEntry. 0 0 "Foo") as well. but same error. Not sure what the dealio is. would like to work it out for future tho.
20:18tolstoymunderwo: The way I've done similar things is to have a "make-log-entry" function in the original namespace.
20:18tolstoymunderwo: Then just use that to construct new entries.
20:20tolstoyThe record definition stays in its own namespace, etc.
20:20munderwotolstoy: ahh ok fair enough. I've got an "append" in that namespace. so I guess I could just change that around to take the vaues rather than the record. thanks!
20:20tolstoymunderwo: For what it's worth, I also tend to define a "protocol" that the record implements for additional functions that take that record. Then just import the protocol.
20:21tolstoyBut that's probably over-engineering for my uses. I like to practice, though. ;)
20:21munderwoYeah I looked at protocols. And it looked like It could do what I wanted. But then it didnt seem like you could specify the record that you wanted it to work on? I might have missed something though
20:22munderwoYou could when you did the extend-protocol but not the base?
20:22tolstoy(defrecord Blah [p1 p2] IProtocol (fn-1 [_]) (fn-2 [_])))
20:23tolstoyI use it for service lifecycle stuff.
20:23tolstoyA protocol with "start" and "stop".
20:23tolstoyThen I have different records, each implement (at last) that protocol.
20:23tolstoydefrecord WebService or defrecord LogService and so on.
20:26tolstoyEach of those records held the "state". DB conns, or web-server instance, whatever. And each with a (make-web-server <port>) fn.
20:27tolstoyNot much better than, say, using atoms in a map. *shrug*. protocols seems more useful to library writers.
20:27munderwofair call.
20:28munderwoHey any idea why '=' doesnt work on a defrecord after persisting to disk and reading it back? (in edn format?) is it because = is memory based not value based?
20:28munderwoand if so how do I make it memory based? apart from a function?
20:29tolstoyDon't know. Maybe try == instead?
20:29hiredmantolstoy: == is only form numbers and the docstring for it says so
20:29tolstoyOh, maybe that's number only.
20:30hiredmanmunderwo: = on defrecords considers types, which on the jvm depends on which classloader loaded the class
20:30hiredmanin clojure that can all get very tricky
20:31hiredmanso likely the reader is instaniating a different jvm class for your defrecord when you read it in than it has for what ever you have in memory
20:31hiredmanwhich could happen a few different ways
20:32hiredmanif you created an instance of a defrecord, (def foo (->Foo)) then reloaded the definition of Foo, new instances of your Foo record won't be equal to the one defed in foo
23:59pcnHas anyone else had problems with tutorial-05 in modern-cljs? I'm getting emitted code that's somewhat different from the example, but I don't know enough js to know if it's kosher