#clojure logs

2012-12-31

00:09dcbgiven two sets of maps, what is the best way to union the sets, but only on a subset of the keys of the maps, i.e., only compare maps for equality on a subset of their keys?
00:28tomojdcb: you want a seq out?
00:29dcbtomoj: no, the union of the sets, which should be a set. I think I'm going to have to use either core.logic or a datomic query for this.
00:30tomojthat doesn't make sense to me
00:30tomojcall it (fn projected-union [ks & maps])
00:31tomojwhat should (projected-union [:foo :bar] #{{:foo 1 :bar 2 :baz 3}} #{{:foo 1 :bar 2 :baz 4}}) be?
00:31technomancymuhoo: if you replace the :repl profile with a profile that doesn't have nrepl then there's no way for it to work
00:31tomoj#{{:foo 1 :bar 2}} ?
00:31dcbtomoj: hmm right I see what you mean.
00:32tomojyou can't have a set with some modified notion of equality
00:32tomojI guess you could make maps with a modified notion of equality, but that would almost certainly be a bad idea
00:35dcbtomoj: hmm. you are definitely right, what I originally said doesn't make any sense. I can picture what I mean relationally (like sql), but I'm having trouble putting it in words. I'll ask again if I come up with something more concrete
00:45muhootechnomancy: don't the profiles merge?
00:47muhooanyway, i beat on it brutally for the last 2 hours, and got it to work, so yay.
00:48technomancymuhoo: additional profiles you specify will be merged
00:49technomancybut if you add one with the same name it shadows the built-in one
00:50muhoospecify?
00:50technomancyotherwise you could never use a different version of nrepl from the one Leiningen uses
00:50muhoooh, isn't there a ^#merge meta?
00:50technomancythere's ^:replace and ^:displace
00:50technomancybut that only gets applied if there's a conflict inside profile values, not if you shadow a profile
00:51muhooso maybe i should ask a different question. what profile should i use to have stuff load just when running a repl?
00:51muhooshould i even have a :repl profile, or am i using it not for its intended purpose?
00:52muhoothanks for answering on a holiday weekend, and apologies if i'm just trying to do something stupid.
00:53technomancywell, there's an open ticket for making this more obvious
00:53technomancyit's a bit opaque currently
00:53technomancyis there stuff you want in the repl but not in other development contexts like tests?
00:54muhoolike, dependencies
00:54muhooexample: i have a bunch of tools i use in the repl, my own stuff, and stuff like handy
00:54muhoobut i do not want those to be transitive dependencies in a released or deployed project, i.e. to a webserver
00:54technomancygotcha; sure
00:55technomancytypically those would go in the :user profile
00:55muhooi tried that, and there was some problem with it, i'm not sure i remember what
00:55technomancythat's applied in all projects by default except for when you do jars/uberjars or when running with-profile to pick different profiles
00:55muhoook, well then maybe i was in fact misusing the :repl profile. will try :user. thanks!
00:58muhoo:user works, problem solved. thanks again!
01:02wingyclj fucking rocks
01:06callenwingy: you need to eat Indian food. 4rlz.
01:07wingyyeah i will
01:07wingya lot of meat!
01:07callenmeat is gooooood
01:07callenwingy: I made curry chicken last night after I got hungry :P
01:07wingyi have a box full of chicken now .. good for programming long night
01:08callenI'm starving, have a sandwich on the way.
01:12wingyu can just take the mc to castro
01:14callenwingy: nah, food's already otw.
01:15callenplus I'm too grouchy to put up with the cold.
01:22frozenlockI'm having some difficulties with the cljs repl and Chrome extensions... Is there something in how clojure.browser.repl is written that prohibits the REPL from being used as an extension?
01:23frozenlockEvery tests I've done works perfecly (alerts, dom manipulations...), but the REPL just won't start: "Uncaught TypeError: Cannot read property 'Af' of undefined " (I guess Af is from the google compiler)
01:33Raynestomoj: Just rewrote adjacent-to, descendant-of, and child-of in terms of a new generalized function. I added complex enough tests for all of these that I'm pretty sure this one actually works. ;)
01:33Raynes(descendant-of worked before since I told you it worked, but it has been rewritten and now the other functions take arbitrary args too)
01:34tomojtomoj's tenth rule: Any sufficiently complicated Clojure program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Datomic :P
01:34brainproxytomoj: :D
01:34Raynestomoj: You should take a look at the new implementations. I like how it turned out.
01:35RaynesAssuming you care at all. Totally fine if you don't. :p
01:35RaynesBut you're the only other person who cares about laser since brehaut isn't here, so I have to be all excited about new things to *someone*.
01:38tomojit's cool. that's good for me, it means you'll wait till I'm around and tell me when to `git pull`
01:41alexbaranoskyis there a way to explicitly indicate which versions of Clojure yor library supports?
01:42alexbaranoskyRaynes: make sense to me
01:42tomojproviding lein multi profiles for those versions is pretty explicit to people who read your project.clj, but I guess you want an error if people use the wrong version or something?
01:43tomojis lein multi outmoded?
01:43alexbaranoskyRaynes: if I can find at least one other person that's excited about what I'm doing, in addition to myself, then that is a good day :)
01:44alexbaranoskytomoj: that'd be ideal, but I don't think that exists
01:44alexbaranoskytomoj: lein-multi is out-moded for lein2, but since I mostly still use lein1, I use lein-multi on a ton of projects
01:45tomojis the reason why (constantly true) vs (fn [result _] result) explainable in a paragraph?
01:45Raynesalexbaranosky: Don't know if he is excited, but he was using it, so close enough.
01:46alexbaranoskytomoj: you mean why use one over the other?
01:46tomojI mean in laser's descendant-of/adjacent-to/child-of
01:46alexbaranoskytomoj: use constantly true is nice, because it will accept any arg count
01:46alexbaranoskyoh I see :)
01:51Raynestomoj: It's the 'continue?' function. In descendant-of, you want to continue walking up the tree and checking the selector as long as the selector isn't matched and there are still higher nodes in the tree. In the other two functions, you want to stop the first time a selector doesn't match.
01:51RaynesThe 'loc' argument might never be necessary, but I added it in case I or anyone else every has some god awful reason for needing it in a similar selector.
01:52Raynes(the loc argument being the one that I used _ for, since it isn't used)
01:52RaynesI was envisioning more complex stopping rules.
01:53RaynesI'll have to implement more selectors to see what I really need there.
01:53RaynesI'll update the docstring on select-walk to explain the arguments.
01:53Raynes(later)
01:56tomojhttps://www.refheap.com/paste/09d197a26c467b5a1a891ed5a
01:56tomojis that right?
01:58Raynestomoj: Looks right.
01:59Raynestomoj: You're a confusing man. You used 'Seq Selector' and 'Selector...' both to indicate 'sequence of selectors'
01:59RaynesI got all cross-eyed for a minute.
02:00callenRaynes: he's making everyone go cross-eyed so that nobody can stop him with their poor vision during the world takeover.
02:00Raynestomoj: Your Haskell-fu is weak. It should have been [Selector]
02:01RaynesOn both counts.
02:01tomojsure, it's a pidgin
02:01tomojI started typing `Maybe (U Loc (Seq Loc))` here
02:01RaynesHahaha
02:02tomojsome clojureisms need to be introduced (like ...), and I prefer to stick closer to clojure types
02:02tomojI guess it would be convenient to have [Selector] denote the type of seqs of selectors
02:03tomojI also write stuff like `<Bool, Loc> -> Bool` for (fn [result loc] result') :/
02:03tomojneed to just learn typed clojure's syntax
02:04tomojactually I kind of like `[Selector]` for vectors of selectors
02:06tomojRaynes: I meant ... to mean that the function is variadic
02:09tomojseems odd for lzip/next to do (= :end (loc 1))
02:09tomojwhich is zip/end?
02:10Raynestomoj: I did not write that one. I copied it from tinsel.
02:10tomojah
02:10RaynesSo I never saw it.
02:12tomojwhat does select do when the loc passed is not the leftmost descendant of its root node?
02:14Raynestomoj: It kills kittens, probably.
02:14tomojI tried that when I experimentally made select return Seq Loc
02:15RaynesIn all seriousness, it walks post-order, so it'll walk backwards.
02:15RaynesIf you start with the top and you walk backwards, you end up in space or some shit.
02:15RaynesThere is no actual reason for select to walk post-order, fwiw. I was just so used to doing it by then that it's what my fingers spit out.
02:16RaynesBut I added a 'zip' function that you can use to get a thingy from a hickory node/collection of nodes to pass to it or fragment.
02:16RaynesOr document, I guess.
02:33tomojRaynes: this is more like what I meant https://www.refheap.com/paste/f11c0cf95cb10a330c573a680
02:34Raynestomoj: I'm not sure I get what you're trying to communicate. :p
02:34RaynesOh.
02:35tomojI just don't understand why it returns Baz
02:35RaynesYou're asking
02:35RaynesOkay.
02:35RaynesGive me one moment to process.
02:35Raynestomoj: is z/next clojure.zip/next?
02:36callenRaynes: you can't look at the ns?
02:36callenoh, you can't
02:36callenderp.
02:36tomojyeah, it's clojure.zip
02:36Raynescallen: I can not, since he did not put it in the paste.
02:36callenRaynes: yes.
02:36Raynestomoj: Well, you're starting at the left-most descendant of the root and then trying to move on to the next node but there is no next node. You've hit the bottom, sir.
02:36RaynesSo all your next calls are just returning the same thing.
02:37tomojthat does not appear to be the case
02:37RaynesWhat is the loc that parse gives you?
02:37tomojthe head
02:38RaynesOh, okay.
02:38Raynestomoj: In that case, you're walking from the head down to a baz, right?
02:38tomojhttps://www.refheap.com/paste/d0d0e06ef322027dd9b597aa3
02:39tomojmy walk with z/next ends at (first (l/select loc (l/element= :section))) (as the equality in the first refheap shows), which is the section with h2 "Bar"
02:40tomojthen I select (element= :h2) from that loc and get the "Baz" h2
02:41Raynestomoj: Well, all select does is walk with lzip/next regardless of what loc you give it.
02:41RaynesSo it just walks normally starting from the loc you give it.
02:43Raynestomoj: Does that answer your question?
02:44tomojprobably, I'm still processing
02:44tomojI took out the whitespace to make it easier to see what the walk was doing, and the answer changed
02:44tomojof course..
02:44RaynesOh yeah, whitespace is a bitch when you're walking with zip/next.
02:45RaynesIt preserves whitespace in textual nodes, so you get that in there.
02:47Raynestomoj: I've got to take off. If you have any other questions, ping me with them and I'll respond asap.
02:47tomojwell, my questions aren't urgent
02:51tomojso you have to cut off the top of the tree to do further selects
03:06tomojI see, if you take the leftmost descendant of the bar section, the loc of the text "Bar", and select h2 from there, you get both h2's
03:06tomojbecause it selects from everything after
03:06tomojif you don't take the leftmost descendant, you just skipped over part of the tree
03:08tomojhave you used xml->?
03:08dbushenkois ckirkendal around here?
03:20tomojhmm
03:21tomojoh!
03:21tomojI was struggling with how :: is hard to read
03:21tomojwith day-of-datomic style .dtm schemas
03:22tomoj{:requires [:some/schema] :tx [...]}
03:22tomojI realized you could just do {:requires [:some/schema :as s] :tx [{:db/ident :s/foo ...} ...]}
03:23tomojand just write some function to go resolve the aliases
03:40Raynestomoj: I have not used xml->
03:40RaynesOr, well, I have.
03:41RaynesBut not really 'used' it for anything.
03:48tomojit's a preorder walk, (fn descendants [loc]) returns a lazy seq of a locs in preorder. so you do (xml-> loc descendants (class= "foo")). a selector is a function that takes a loc and returns either a loc, seq of locs, or nil
03:49tomoj(there is no class= there but it'd be easy to write..)
03:49tomojwait, I'm wrong
03:49tomojselectors can return booleans
03:49tomojand attr= does so, just like yours
03:50tomojbut the args to xml-> can also return locs or seqs of locs
03:50tomojif so, the remaining selectors are run starting from {that,those} loc{,s}
03:51tomojbeing able to mix selectors and movement seems simpler to me, but it could be I'm just more familiar with data.zip
03:53tomojand then when you select/move down to a loc or some locs, you still have access to the entire document, and you can perform further select/movement in those subtrees or other subtrees
04:00RaynesIt seems pretty unsimple to me.
04:02Raynestomoj: Could you show me an example of this, or something?
04:04Raynestomoj: I think I see what you mean. You likely want a clojure.data.zip.xml but for html.
04:05RaynesLaser's select just builds on what is already there in the templating stuff, similar to enlive.
04:06RaynesDeviating much from that = a new library.
04:06tomojdoes enlive do postorder?
04:06Raynes*shrug*
04:06tomojI guess I could try it, I don't understand the code at all..
04:06tomojwonder if you have to cut off the tree to continue selecting, as well
04:06RaynesI'm pretty sure enlive's select works exactly the same as mine.
04:08Raynestomoj: Have you showed me what you're trying to do yet? I don't really have any context in my head for the tree cutting off stuff and what not.
04:09Sgeohttp://pastie.org/5601436
04:09tomojthe refheap earlier showed pretty much what I was trying to do I think, with the two sections
04:10SgeoRaynes, will refheap ever get Racket syntax hilighting?
04:10RaynesSgeo: It doesn't have it?
04:10Raynestomoj: So... you're trying to select the h2 elements?
04:10SgeoIt has Scheme, but not Racket
04:11RaynesSgeo: Why won't Scheme work?
04:12RaynesSgeo: There is apparently a racket lexer in pygments. If it isn't on there, it's merely an oversight.
04:12SgeoYou know what would be awesome: If it actually ran Racket to determine the actual colorings
04:12SgeoSo that it wouldn't be just for the Scheme-y Racket languages
04:13RaynesYeah, whatever pygments does.
04:13tomojI have a document zipper. and a selector that matches some node inside it, foo. now I want to select foo, then maybe inspect its attributes, save it away in a local, whatever. then I want to select inside foo's descendants with some other selectors. laser can do this, but in order to do the second select, you have to call zip/node on foo, cutting off the rest of the tree above foo (then laser/zip)
04:13tomojso when you select foo's descendants, you can't navigate back up and inspect anything above foo
04:14RaynesSgeo: https://bitbucket.org/birkenfeld/pygments-main/src/f6d0af39cb770bb38020107f0f3c6b2d8d5f40a9/pygments/lexers/functional.py?at=default#cl-24
04:15SgeoBah, if I posted #lang planet dyoo/bf code, it wouldn't colorize that properly
04:16Raynestomoj: Why do you have to call node on foo?
04:16tomojwell, laser/select does that
04:17RaynesGotcha
04:17RaynesCould have a version that returns locations.
04:17tomojif you don't (just remove the call to zip/node from select, call this select-locs), then the trouble is that selecting on the leftmost descendant a loc returning by select-locs isn't restricted to the originally selected subtree
04:18tomojer, s/a loc returning/of a loc returned/
04:18tomojso in my example, if you select-locs to the bar section, then select h2 from there, you get both the bar and baz h2's
04:19tomoj(select h2 from the leftmost descendant of the bar section, I mean)
04:19Raynestomoj: So, a select-loc that does pre-order would help?
04:20tomojmaybe a fix could be to have laser/zip use zipper? to act as lzip/leftmost-descendant on zippers
04:21tomojand then somehow make the walk stop in the right place?
04:21tomojI'm not sure you need to switch to pre-order to get that
04:22RaynesSeems like that'd be more complicated than just doing a pre-order walk.
04:23RaynesI don't think there is any real reason to do a post-order walk in select. It is necessary in document and fragment to prevent scanning over elements you inject into the tree and what not. This problem doesn't exist in select, because you're just scanning.
04:23RaynesWhich is why I was asking if it'd help.
04:23tomojI see
04:23RaynesIf I'm not following, smack me.
04:23tomojmaybe it would
04:25RaynesYou're trying to walk the tree, select a bit, do something with it, and then select on that bit but it doesn't quite work because it doesn't walk from there down, but instead walks upwards through the whole tree. Right?
04:25RaynesAlso, I've just discovered I hate talking about zippers.
04:25RaynesThey're so hard to think about.
04:26tomojit seems to walk through everything to the clojure.zip/next of the loc I first select, if I take leftmost descendant
04:26tomojif I don't, it jumps to the clojure.zip/right
04:26tomojthe latter makes sense to me
04:26tomojI haven't thought enough about the former yet
04:28tomojwhy don't document/fragment/etc just call leftmost descendant?
04:28RaynesNo particular reason, I guess.
04:29tomojlaser/zip could be hickory-zip on nodes, the identity on zippers, and also work on seqs of zippers/nodes ?
04:30RaynesI think so, yes.
04:30RaynesIs this related to what we were just talking about?
04:30tomojyes, because I want to use that without it calling leftmost descendant, if select were preorder
04:31RaynesOh, yeah, if I made select preorder I'd definitely do some rejiggering.
04:32Raynesfragment and document can call leftmost-descendant afaict.
04:32RaynesI'll play with that tomorrow night.
04:33nbeloglazovIs it possible to use jars in lein that are not in repo (remote or local), local jars. I had about 5 jars that aren't in any repo and I don't want to manually install all of them to local repo.
04:35tomojhope I'm not keeping you - I'll still be thinking about this for a while tonight, but can save all my thoughts for later
04:44Raynestomoj: Nah, I'm just messing around.
05:41Ralthow do I place a breakpoint in nrepl?
06:46alexbaranoskyman, that is a giant pile of pull requests for Korma, what have I gotten myself into :D
06:53borkdudealexbaranosky just reject a bunch of them, because of your opinion as benevolent dictator?
06:58alexbaranoskyborkdude I will in due time <evil/benevolent laugh>
07:18tomojlol is .lein-classpath a secret?
07:19tomojoh, it doesn't do what I thought
07:26malcolmdoes anyone know if there's an 'unparse' capability in Parsley - ie. to render the original string from a parsed representation of it.?
07:35malcolm(in answer to my own question, I don't think there is - but it's easy enough to create a custom version for a specific grammar using multimethods)
08:11tomojhow should as-> be indented?
08:12callenRaynes: threatening people on twitter? tsk tsk.
08:12callenyogthos: cljs.
08:13yogthoscallen: heyah
08:13yogthoscallen: what about cljs? :)
08:13callenyogthos: needs a template extension.
08:13callenyogthos: I'm futzing around with lein-cljsbuild right now.
08:13yogthoscallen: ah that's a good idea
08:14callenyogthos: also Raynes is pimping Luminus on his twitter.
08:14yogthosawesome :P
08:14yogthoscallen: http://yogthos.net/blog/32-ClojureScript+Adventures
08:14yogthoscallen: things I figured out about cljs so far :)
08:15yogthoscallen: btw you have a chance to look at the new setup for the template, is it more of what you were thinking?
08:15callennot yet, was too busy in cljs-land. I can take a look at it after I write a quick PR for lein-cljsbuild.
08:16yogthoscallen: yeah that'll be cool
08:16yogthoscallen: what did you fix up in lein-cljsbuild? :)
08:16malcolmPR = pull request, not press release, right?
08:17yogthosmalcolm: yup
08:19callenyogthos: nothing, just clarifying some documentation.
08:19callenyogthos: you know how I am.
08:19yogthoscallen: that's pretty handy too :)
08:22cemericktomoj: https://twitter.com/cemerick/status/279165823438954496 :-P
08:24callencemerick: is it bothersome because people will nitpick over contributed code?
08:24tomojyeah yeah
08:25cemerickcallen: what, other indentation schemes? None can be applied statically.
08:26cemerickThe thread linked there has the fuller discussion.
08:26cemerickWelcome, all, to the cemerick flamewar hour! :-P
08:26callencemerick: I know of the thread, I'm just trying to determine the impetus behind this.
08:26tomojif someone has something to stick in init.el for always-2-spaces, I would try it
08:26callenI just use the default clojure-mode indentation.
08:27cemerickcallen: being able to automatically format code without worrying about macros vs. special forms vs. fns vs. whatever other runtime-only considerations might apply in a particular scheme.
08:28callencemerick: is the varied indentation designed to express intent as to the type of the data?
08:28tomojhmm, why not 'always prior arg' ?
08:29cemerickThe only thing I can see as being a reasonable exception are ns forms.
08:29cemerickcallen: I'm not sure I've ever seen a principled argument for the variability.
08:29cemericktomoj: and have indentation determined by the length of one's fn names in each fn position?
08:30tomojyes
08:30cemerickor interop method names
08:30callencemerick: I just constructed one. Enjoy.
08:30tomojunless you newline after the fn
08:30Ralthm, people, in Common Lisp, I can use the `break` function, it breaks at some point in the debugger (with slime) and allows me to inspect some variables and stuff. A breakpoint in a debugger, that is. Is there a way to have this kind of stuff with emacs/nrepl?
08:30callenRalt: https://github.com/pallet/ritz
08:31Raltyay!
08:31Raltthanks :)
08:31callenRalt: hi, I'm a former CL'er too.
08:31cemericktomoj: that incentivizes people to use shortest-possible fn names, is brutal w.r.t. buffer width otherwise, and produces more irregularity in formatted code than any other option.
08:31Raltcallen: hi :-)
08:31cemerickProbably a net loss for readability.
08:32callenI never had an opinion before, but the status quo sounds good to me.
08:32cemerickcallen: formatting variability is never related to the nature of data, only the nature of the thing in fn position (macro, fn, special form, etc)
08:32tomojit is brutal wrt buffer width, unless you break up the code a bit more
08:32RaltI have to say, I liked CL parens-only. Clojure is somehow less pretty than CL about this ([], {}, etc). But the ecosystem is just way better.
08:32callencemerick: still conveys information about the code.
08:33tomoj(or newline before the first arg..)
08:33callenRalt: I like the varied syntax better myself.
08:33Raltheh, syntax is a matter of opinions btw :P
08:34cemerickcallen: Not sure if it's useful information. Also, it requires a runtime to format code, cannot be applied consistently across projects, etc.
08:34cemerickAgain, all things I pointed out in the linked thread.
08:35Chousukewell, clojure's syntax gives you more options options when you're writing macros
08:36tomojI guess you may be right
08:36callencemerick: that makes sense.
08:36Chousukeyou can use the different data structures for different purposes
08:36tomojthe style guide says prior-arg helps readability so I thought it did
08:36Ralthm? not sure why
08:36tomojbut trying it out a tiny bit I'm not sure
08:38tomojI don't think I really care whether it can be applied statically
08:39tomojgiving up automatic indentation when you don't have the code loaded seems not much worse to me than giving up arglist hinting or completion when you don't have the code loaded
08:39cemericktomoj: I have no data. But insofar as regularity in published text is generally accepted as good w.r.t. readability (e.g. columnation, justification, etc), I presume the same applies to code.
08:40tomojthe irregularity of always-2-spaces is that the first arg is not vertically aligned with the remaining args
08:42tomoj(unless you newline after the fn? do you do 2 spaces there or 0?)
08:43tomojs/0/1/
08:44cemerick2
08:44cemerickLooks like I'm not consistent w.r.t. newlining after the fn or not
08:46tomojnever much liked the former, but I don't like the latter any better: https://www.refheap.com/paste/c530dd4c1469b1bb5f7dff26a . not very common anyway
08:47cemerick1-space seems Just Wrong™ in any circumstance. :-)
08:47tomojvectors?
08:47cemerickno, no, only ever talking about lists in this whole conversation
08:48Raltemacs has always chosen the right indentation for me. Never had to even think about it
08:48cemerickset, vector, map formatting is regular and standard and easy
08:48tomojand one "1-space" means there is a space in the same column as the opening paren?
08:48tomojs/one //
08:49cemerickright
08:49cemerickIn the end, I'd rather hew to context-free rules divorced from taste
08:49tomojsmall example https://www.refheap.com/paste/b22b32c8f9136dc25ec92f478
08:50tomojprior-arg with-open is a bitch
08:50tomojthere's probably worse out there
08:50cemerickYeah. My code has always looked like the former.
08:50tomojguess I'll side with you for now :)
08:51cemerickMan, prior arg indenting for let is *really* unpleasant
08:51cemerickMy eye assumes that anything even close to column where the binding vector starts is a binding
08:52tomojah, indeed
08:52cemericke.g. "what, the second example is let-binding `if`?!"
08:52cemerickI'm sure warty examples can be found for either option.
08:54Ralthow can I run the -main function from nrepl?
08:54Raltjust (-main) crashes, when I'm in the namespace
08:56Raltnamely, I want to run noir from within the nrepl (and not through lein run) so that nrepl-ritz can handle the exceptions himself.
08:58tomojcrashes?
08:59Ralthm, it doesn't anymore. the server isn't started either though.
09:00Raltoh well. Looking into that...
09:05Raltgot it back: unable to resolve symbol -main...
09:05tomojyou're in the wrong ns, or you didn't load it
09:05tomojyou didn't just do (in-ns 'whatever), did you?
09:05Raltmy, I'm gonna get scolded.
09:05tomojnor just (ns 'whatever) in the repl? you need to load the file
09:06Ralthahaha, ok
09:06Raltwith (load "~/path/to/file") ?
09:06Raltgoogling :)
09:06tomojyou have nrepl.el?
09:07tomojif not, (require 'whatever)
09:07tomojfor src/foo/bar.clj, (require 'foo.bar)
09:07Raltthanks
09:07Raltgoogle told me to use nrepl-load-file
09:07Raltbut it doesn't look like it's working
09:07tomoj('whatever is a bad example - don't make namespaces with only one segment)
09:08tomojthat should work I'd think, but I haven't switched to nrepl yet, so dunno. good luck :/
09:08Raltk, thanks :)
09:08tomojonly thing I think to suggest is to be sure that, if the file says (ns foo.bar), it's in src/foo/bar.clj
09:09Raltis there a way to see the classpath used?
09:09tomojunless you overrode the :source-paths
09:09RaltI'm having some FileNotFound exceptions, trying to find out why
09:09RaltI didn't
09:09tomoj`lein classpath`, or sometimes when I'm paranoid or in a repl, (System/getProperty "java.class.path")
09:09Raltoh... wait
09:10Raltmy namespace is my-website.server
09:10Raltin src/my-website/server.clj
09:10Raltbut it's looking for my_website/server.clj
09:10tomojyeah.. :/
09:10tomoj&(munge 'my-website.server)
09:10lazybot⇒ my_website.server
09:11tomoj(munge '&k)
09:11tomojoops
09:11Raltha.
09:11chousersome jvms can't deal with dashes in class names, so we get to convert dashes to underscores when we hit the file system.
09:11Raltusing nrepl-load-file doesn't seem to work either
09:12Raltnrepl-load-file itself doesn't throw any error -- looks like the file is correctly loaded
09:12Raltbut when using in-ns + (-main), still the same error.
09:13Raltchouser: heh, I haven't seen this information anywhere :p
09:14Raltoh well... I'm too lazy to deal with this right now. And I spent way to much time on it already.
09:15RaltI'm sure the error is quite stupid, but what's wrong in those 5 lines of code? https://github.com/Ralt/web-account-clojure/blob/master/src/my_website/views/welcome.clj#L25
09:15tomojhttp://clojure.org/libs
09:15Raltthe destructuring part doesn't seem to go well.
09:17Ralttomoj: thanks :)
09:17tomojI dunno defpage, but {:as data} looks wrong
09:17tomoj[data]?
09:17clojurebot,(let [testar (fn [x y] (cond (= (reduce + (filter odd? (range 0 x))) y) (str y " is a")) )] (testar 11 25))
09:18Raltoh, that's a function?
09:18tomojI dunno, but {:as data} never makes sense
09:19Ralttomoj: tbh, I took the example from here http://www.webnoir.org/tutorials/forms/
09:19chouserRalt: you're not using the latest beta of Clojure 1.5 are you?
09:19Ralt(it doesn't use the data symbol, but well.)
09:19Raltchouser: not AFAIK
09:19tomojoh, I guess it could make sense
09:19chouser& (clojure-version)
09:19lazybot⇒ "1.4.0"
09:20tomojno. nevermind
09:20Raltyeah, no, using 1.4.0
09:20chouserRalt: I came in late. Do you have an exception message? A stack trace?
09:21Raltyep. Let me get this back up.
09:21Ralthttp://localhost:8080
09:21Raltoh wai--- :P
09:21Raltj/k, I get this error: nth not supported on this type: PersistentArrayMap
09:21Raltline 26/25 in the stack trace
09:22chouserah, of course
09:22RaltI knew it! stupid error?
09:22chouserby saying {:as data} you're binding the local 'data' to a map
09:23chouserthen on line 26 you're destructuring data as if it were sequential
09:23chouserso on line 26 you might want something like [{:keys [my-salary her-salary total]} data] instead
09:23Raltoh, got it
09:23Raltthanks, trying that
09:25Raltbut wait, this works?
09:25RaltI mean. It's like a statement.
09:26tomojdoes '{:as data} ever do something different than 'data ?
09:26tomojI mean, other than erroring for some values
09:27chousertomoj: Yes. I've was mistaken about that for a long time myself.
09:27tomoj&(let [{:as foo} '(:foo 3)] foo)
09:27Raltman, my classpaths are broken...
09:27lazybot⇒ {:foo 3}
09:27tomoj&(let [{:as foo} [:foo 3]] foo)
09:27lazybot⇒ [:foo 3]
09:27tomoj..interesting
09:27chouserwhoa
09:27tomojah, it's already associative
09:28chouserah!
09:28chouserhehe. ok.
09:28tomojI tried a vector first, threw me off
09:28Ralt&(let [foo [:foo 3]] foo)
09:28lazybot⇒ [:foo 3]
09:28tomoj&(let [{0 foo 1 bar :as baz} [1 2 3]] [foo bar baz])
09:28lazybotjava.lang.Exception: Unsupported binding form: 0
09:29tomojuh, you know what I mean
09:29chouseryeah, backwards. :-)
09:32Ralteff it, I'm giving up.
09:32chousersame error?
09:32Raltnrepl-ritz-jack-in doesn't even start up anymore
09:32Raltno, it can't find my files anymore...
09:33Raltso... I'm going to take a break. :)
09:34Raltcan't find my files = (require) not working anymore, when they worked just fine an hour ago. So I'll take a break, come back and start everything back up. After some git reset.
09:46allsystemsaregoHi all, how can I run a .clj program without leiningen? I couldn't figure this one out just by googling
09:47chouserwithout leiningen means you get to fetch your dependencies and set your classpath yourself. You really want to do that?
09:49allsystemsaregochouser, yes, I want to understand the inner workings before I start using leiningen
09:51chouserallsystemsarego: Here's how to get a repl without lein: http://clojure.org/getting_started
10:06Raltalright!
10:07Raltgot the thing working https://github.com/Ralt/web-account-clojure/blob/master/src/my_website/views/welcome.clj
10:07Raltbut it does look ugly :-)
10:07Raltwell, at least I got some concepts straight
10:07Raltthat's the fun of having plenty of errors: you learn :-)
10:09Raltalright, let's see how I can get cleaner code now...
10:31tomojwow, (and (= x y) (not (= (into {} x) (into {} y))))
10:31tomojx and y are datomic entities
10:31tomoj:/
10:38tomoj&(let [x [[1 2]] y '((1 2))] (= (into {} x) (into {} y)))
10:38lazybotjava.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map$Entry
10:47bprtomoj: yeah, datomic is great isn't it?
10:47bprtomoj: oh i misread your statment lol
11:11IceD^probably silly question - I want to apply sideeffects on original state of the atom after atom update
11:12IceD^example: (def foo (atom [1 2 3])) (swap! foo pop)
11:13IceD^and I want it to println popped value (so I need original value to find out what to print)
11:13TimMcIceD^: Have you looked at watchers?
11:14IceD^ehm?
11:15IceD^agents?
11:17TimMcIceD^: http://clojuredocs.org/clojure_core/clojure.core/add-watch
11:19IceD^it'll add some complexity to my simple code
11:19IceD^trying to avoid
11:19TimMcIt may not be appropriate.
11:19IceD^well, I can replace vector by set actually
11:19TimMcIceD^: Perhaps what you want is a ref.
11:20IceD^ok - add-watch - considered. how ref would help me?
11:21Ember-IceD^: with refs you can use STM?
11:22Ember-and dosync
11:22TimMc&(let [foo (ref [1 2 3])] (println (dosync (let [top (peek @foo)] (alter foo pop) top))) (println @foo))
11:22lazybot⇒ 3 [1 2] nil
11:22IceD^make sense. too tired
11:22Ember-STM == transactions
11:22Ember-thus you can do everything in a single transaction
11:22Ember-thus what you are asking is possible if I understood correctly
11:23Ember-thus TimMc's comment about refs is correct
11:23Ember-but that's enough of clojure for now, it's new year's eve
11:23IceD^atoms are stm as well
11:23TimMcNope.
11:23Ember-happy new year everyone!
11:23Ember-and no, atoms are not STM
11:23TimMcIceD^: Atoms are uncoordinated.
11:23IceD^I know
11:23Ember-but now, new year is waiting :) ->
11:23TimMcEmber-: NZ?
11:24Ember-Finland
11:24Ember-18:14 here
11:24TimMcOh, I see.
11:24Ember-guests are arriving soon :)
11:24TimMcNew Year *party* is waiting.
11:24TimMcHave fun!
11:54SgeoIs yogthos someone who comes here regularly?
11:54citizenparkerAnyone had luck in using lein uberjar with an alternate main argument? I've been trying lein uberjar NAMESPACE with seemingly no luck
11:57dnolennow you can use core.logic for theoretical computer science! :) http://github.com/clojure/core.logic/commit/b46b8c077360095c72eaa00a6a4aa843dc9136ff
11:57pepijndevosdnolen, I seem to remember a POS tagger in core.logic, but I can't find it. Any ideas?
11:57dnolenpepijndevos: hmm, don't recall
11:58TimMcSgeo: According to my chalogs, more or less.
11:58TimMc*chatlogs
11:59pepijndevosdnolen, what makes core.logic suitable for computer science now?
11:59dnolenSgeo: Racklog doesn't do Constraint Logic Programming as far as I know.
12:05pepijndevoshm, some nominal binding stuff... very... theoretical.
12:07pepijndevosdnolen, do you think it would be easy to do POS in core.logic? I've been thinking about a system similar to wolframalpha.
12:11dnolenpepijndevos: nominal logic programming lets you reason about abstract syntax, it's very theoretical but very cool.
12:12pepijndevos:)
12:12dnolenSgeo: Prolog is just a very specific kind of constraint logic programming (unification as the only constraint) + search
12:12dnolenpepijndevos: POS tagger http://skillsmatter.com/podcast/scala/building-the-web-of-data-with-clojure
12:12dnolenpepijndevos: and yes you can do that stuff
12:15pepijndevosdnolen, awesome. I'm ging to keep it simple, with a set of nouns based on the data and some other sentence structures coupled to types of results.
12:21SgeoCan someone please explain to me if the Clojure page on Facebook uses some kind of algorithm or if it's actually human-curated?
12:23teromI didn't even know that Clojure has a FB page.
12:24weavejesterA quick question: is anyone using Ring with Clojure 1.2?
12:30TimMcweavejester: Thinking of removing 1.2 support?
12:32weavejesterTimMc: Yep. I'm going to release Ring 1.2 in Janurary, but I was wondering if I should update to Clojure 1.3 to take advantage of the new tools.namespace versions, which are 1.3 and above.
12:38SgeoI don't know how calling a Racket function that uses keywords would work, though :(
13:30sveduboisHow I can translate this java line to clojure?
13:30sveduboisImage image = subtractimagefilter.execute(image1, image2);
13:35sveduboisI suppose is: (-> (new subtractimagefilter)(.execute image1 image2))
13:40Sgeosvedubois, new would correspond to new in Java
13:41SgeoIs subtractimagefilter a class or a variable?
13:42sveduboisclass
13:43ToxicFrogIn that case, isn't subtractimagefilter.execute a static method?
13:43ToxicFrogIn which case it would just be (subtractimagefilter/execute image1 image2)
13:52svedubois@ToxicFrog: It is not a static method
13:54amalloysvedubois: in that case you're trying to translate java that doesn't work into clojure that does
13:54ToxicFrogsvedubois: then how can you call it without an instance of subtractimagefilter to call it on?
13:57frozenlo`Ahhh I hate myself! Spent hours trying to get a REPL working in a chrome extension, only to discover this http://www.mail-archive.com/clojure@googlegroups.com/msg58069.html
13:57frozenlo`Should have used my google-fu before anything else.
14:04ppppaulhappy new clojure
14:32arrdemhas anyone worked with nested maps using clojure.zip?
14:34amalloyclojurebot: zippers |are| probably not what you want, unless you're already sure you want them: they're great for modifying maps (for certain kinds of access patterns), but usually just get-in and update-in are easier.
14:34clojurebotOk.
14:35amalloyhiredman: any chance we can get clojurebot to recognize some kind of inline analogue to ~? it'd be convenient to say something like: "arrdem: ~~anyone"
14:39arrdemheh. No, sadly zippers seem to be the best tool for the job here as I'm working with arbitrary ASTs.
14:40callenarrdem: sadly?
14:41arrdemcallen: ^sarcasm sadly because it means I have to go learn something new
14:42callenarrdem: zippers are one of those things that are good to know in general because they up your game and give you a new toy to work with.
14:42callenarrdem: so uh, cheer up.
14:42callenarrdem: http://www.youtube.com/watch?v=6c4DJX2Xr3k
14:44arrdemcallen: ooh thanks. I was looking for that, good talk.
14:44sveduboisI would like to create a destructuring function with different parameters to use different visual effects. I have paste my question here with the code
14:44sveduboishttps://www.refheap.com/paste/7982
14:45callenarrdem: does a better job of explaining the "why?" of zippers than other resources I've seen.
14:46arrdemsvedubois: looks like you're gonna have to do some argument parsing of your own here.
14:46arrdemI don't think that you're gonna get away just with destructuring.
14:56amalloyyou'll also need a general approach that works: the import-inside-defn is nonsense, and 'new is a special form; you can't pass a variable to it
15:00aaelonyi have a function that creates a line-seq from a file in an s3 bucket… if the file is too large though, it runs out of memory :( … want to do this in a lazy manner if possible so large files work too… https://www.refheap.com/paste/7983
15:01aaelonyhas anyone done this?
15:01amalloythis code doesn't run out of memory. only if you are consuming it in a non-lazy way would that be a problem
15:01aaelonyhmm
15:01amalloywell, maybe that's not true
15:02amalloyio/reader on a stream might conceivably slurp it, although i doubt it
15:02aaelonymaybe BufferedReader would be better/
15:02aaelony?
15:02amalloyio/reader makes a bufferedreader
15:03aaelonyif I take say 5000 at a time, in my case, it works
15:03aaelonybut would be nice if it were a true line-seq
15:03amalloyhuh? it is one. if taking 5000 from it works, then it is lazy, and the nonlaziness of your consuming code is the problem
15:05tomojare clojure namespaces really in their own little namespace-namespace?
15:05aaelonyok, so i need to repeatedly consume it in chunks?
15:06amalloyi don't know, man. this line-seq will work like a seq in every way, so long as you don't close the input stream before you're done reading
15:07tomojI mean, e.g. 'aws.sdk.s3 ? I guess it's not that likely to cause conflicts outside of clojure since other languages seem to mostly respect the reverse-domain convention. I'm tempted to go for a 'project-name.core ns, because everyone else is doing it, but..
15:07aaelonywell, closing the input stream is another thorn bug. if it is too large a chunk, I get "Unexpected end of ZLIB input stream"
15:09technomancytomoj: .core is kind of lame
15:09tomojaaelony: which stream are you closing?
15:09technomancyif your project name is already segmented, use that instead
15:09technomancyslam.hound
15:09tomojsure, mine's not
15:09tomojunless I call it dee.zee
15:09tomojwhich would be fine if it means I get to nab :dee/keywords too
15:10technomancytaking the name of an existing service like aws or s3 is in poor taste though
15:10aaelonytomoj: I'm open to changing it, currently it uses (java.util.zip.GZIPInputStream.) io/reader line-seq) … https://www.refheap.com/paste/7983
15:11aaelonyI'm using https://github.com/weavejester/clj-aws-s3, perhaps improperly...
15:11tomojaaelony: but which stream are you closing? or you're saying just walking through the entire seq produces that error when line-seq tries to close it?
15:12tomojaaelony: this _may_ be relevant to your interests https://www.refheap.com/paste/bc1e79fa78a0998f516bee34d (emphasis suggests that I'm not sure)
15:13amalloytomoj: line-seq never tries to close its reader
15:13tomojoh, I think I see what your problem is - you're closing the stream before finishing?
15:13tomojright, the reader just closes automatically when it's done?
15:13amalloyno
15:13aaelonytomoj: I'll study your link. I'm not sure what stream I'm using. I'm simply consuming the line-seq via a pmap call. If the line-seq is too big, I get an out of memory error. If I take 5000 at a time and repeat, no errors
15:13amalloythe reader is not closed unless you do it yourself
15:13aaelonymaybe I need a with-open in there somehow
15:14amalloyalso: just checked the source of line-seq. can't believe it eagerly consumes the first line even if you never seq it
15:14aaelonyI'm trying to understand it better, I'm not making eager/lazy claims, but something causes mem issues when it gets large
15:15tomoj:dee.zee/foo I guess. OK. thanks tëchnomancy. seems even more presumptuous but weee
15:15amalloyyou're probably hanging onto the head of the sequence somewhere, aaelony
15:15aaelonysuppose it is lazy, how can I consume it lazily and avoid mem issues?
15:15tomojare any lines really really big? :)
15:15aaelonyno lines are really big
15:16aaelonywhat's the best way to avoid hanging onto the head
15:16aaelony?
15:17tomojas soon as you create the line-seq, (doseq [line it] ...) or (reduce f init it), or.. anything else that doesn't hold the head :)
15:17amalloydon't keep a reference to it in one place, while you process it in another. eg, don't do: (let [lines (line-seq ...)] (doseq [line lines] ...) (do something else with lines))
15:17aaelonyah! that's pretty much what I am doing!
15:17aaelonyhow can I *not* do that?
15:17amalloytype in different code which is not that. too general a question to be answered
15:18aaelonyone example?
15:18tomoj(doseq [line (-> .... line-seq)] ...) does not hold the head
15:18aaelonythanks, I'll try that
15:19bjais creating a binding with let considered an acceptable way of getting a "tee" for a sequence? i.e. (fn [r] (let [x r] (flatten (list x r))) (range 10)) => ((0 1 2 3 4 5 6 7 8 9) (0 1 2 3 4 5 6 7 8 9))
15:19tomojif you give the line-seq a name, then look at the lexical scope of that name - where throughout your code could you refer to it?
15:19tomojyou will be leaking memory in all of that code
15:19aaelonyI've actually seen many places stating "not to hold onto the head" but never seen examples of how not too..
15:20tomoj(maybe what I just said is too pessimistic because of locals clearing?)
15:20aaelonytomoj: that is helpful, thx
15:20amalloytomoj: correct, too pessimistic
15:21xeqibja: just use r in both places ##((fn [r] (list r r)) (range 10))
15:21lazybot⇒ ((0 1 2 3 4 5 6 7 8 9) (0 1 2 3 4 5 6 7 8 9))
15:22amalloyor, at any rate, more pessimistic than necessary. it's never possible to be too pessimistic, when working with computers
15:22arrdemooh lazybot'll pick out ##(inc 5)
15:22lazybot⇒ 6
15:23tomojso it's actually, what, "the places where you actually do refer to it, plus some places where you could and where clearing didn't help"?
15:23tomojor just "the places where you actually do refer to it"?
15:25amalloyi don't think any statement so simple can be right all the time
15:25amalloymost of the time, i'd say "the places where you refer to it after starting to consume the sequence"
15:25tomojwell, I'm just wondering where clearing occurs I guess
15:26tomojit's "pervasive", but that doesn't mean it will always clear a local in a scope in which you don't refer to that local, right
15:26tomojso you have to worry about all the scopes where you obviously hold, plus the ones where clearing may be failing?
15:26amalloyuhhh
15:26amalloyi don't understand the question
15:27tomojnevermind, I guess I can fairly easily just write some tests
15:27amalloywhat is an example of "a scope in which you don't refer to the local"
15:28tomoj(let [lines (line-seq ...)] (trampoline (fn foo [] (println "blah") foo)))
15:28amalloyanyway, in general locals are cleared the last time you refer to them. so in (let [x 1] (let [y 2] (+ x y))), the x is set to nil before the addition is performed, as soon as its value is gotten
15:29tomojmaybe my example is trivially OK?
15:29amalloyprobably
15:29amalloyi always find it entertaining to look at the disassembly for such functions
15:30aaelonyin my case, i was definitely holding onto the head. changing that now, thanks, guys :)
15:31aaelonyit was something like: (def x (pull-first-sample-data-from-s3 my-bucket))
15:32aaelonyi wonder if (def x (partial pull-first-sample-data-from-s3 my-bucket))) is just as egregious
15:32tomojit's nice in chrome to be able to track references through the profiler
15:32tomojwonder if you can do similarly for the jvm
15:33tomojdebugging clojurescript like that in chrome you would have wound up at a reference from x (..of course there is no line-seq there)
15:46TimMctechnomancy: lein should reject new projects whose names begin with "clj-". :-/
15:49weavejesterIn retrospect I wish I had named clj-aws-s3 differently...
15:50weavejesterBut I have no problem with clj-time and clj-http
15:51amalloyTimMc: new lein plugin? clj-picky-naming
15:51thorwilclj-no
15:54TimMcamalloy: Needs more jure.
15:54amalloyclj-badname-abjure
15:55xeqijury-clj
15:57arrdemis there a gg=G equivalent for emacs?
15:57hiredmanweavejester: clj-aws-s3 is not very punny
15:58hiredmanbut I am surprised how often I have to explain the props3t pun
15:58aperiodic(in case you don't know that much vim, arrdem wants to know how to reformat the entire buffer)
15:58weavejesterhiredman: I have a lot of repos. Not all of them can be puns :)
15:58arrdem(inc aperiodic)
15:58jkkramerI thought about naming a lib cljwkhtmltopdf the other day
15:58lazybot⇒ 6
15:58TimMcj3
15:58jkkramerfor maximum acronym density
16:00tmciverarrdem: C-M-\ reformats region.
16:00xeqiC-x h C-M-\
16:01arrdemtmciver: thanks
16:08uvtcTimMc: maybe also ones ending in "-clj"
16:08uvtc?
16:08TimMcyep
16:08mabesarrdem: FWIW, evil-mode does great vim emulation in emacs
16:08arrdemcallen: just implemeted a BST with zippers. this is a cool library!
16:09uvtcThough I'm still waiting to find buried-treajure.
16:09arrdemmabes: so I've heard.
16:10arrdemand given how I'm reflexively reaching for <esc> half the time I may resort to it.
16:10Raynesarrdem: Don't *resort* to it. It's perfectly fine to use it. I was an Emacs user that tried Vim and went back to Emacs with evil-mode simply because I enjoy modal editing and text objects.
16:11RaynesIt isn't just a way for vim users moving to Emacs to cheat. :p
16:11RaynesIt's just a nice way to do things.
16:13amalloyevery time i hear Raynes go on about how amazing text objects are, i feel like emacs must be a Blub that i'm trapped in, not realizing i'm missing something clever
16:14Raynesheh
16:15arrdemyou guys... it's a joy to hang out here and get good advice from library contributors.
16:15TimMcamalloy: I don't know what you're on about, text functions are clearly the pinnacle of editing.
16:15Raynesamalloy: I mostly just like being able to type '=ab' and have it reindent the form I'm in.
16:15amalloyM-q, son
16:16tmciveramalloy: awesome. Didn't know about that.
16:17Raynesamalloy: Yeah, but it's a general thing. You can do other things with it.
16:17Raynesamalloy: Like, dab = delete current sexp, cib = delete all text in current sexp and go back to insert mode so you can fill it back in.
16:18RaynesWorks in strings and what not as well.
16:18RaynesBut yeah, most of it likely have regular Emacs counterparts.
16:18TimMcRaynes: uuddlrlrba
16:18amalloytmciver: when i see someone hitting tab,down,tab,down,tab,down...to reindent a function, i feel like...i can't find the comic i'm thinking of, but it's someone watching, incredibly frustrated, as an old person types "google.com" into the google search bar
16:19TimMcamalloy: I'm sure technomancy can find it.
16:19amalloygood point. i'm only an apprentice in this art
16:20tmciveramalloy: and I feel old having been typing 'C-x h M-C-\' all this time.
16:20Raynesamalloy: I still do that sometimes and then realize I'm an idiot half way through.
16:20amalloytmciver: well that reindents the whole file
16:21amalloyi feel very meta, searching google for "searching google for google"
16:21tmciveramalloy: yup, but I've been doing that because I didn't realize I could do it with defn granularity.
16:23amalloyah, http://i.imgur.com/6ETb4.gif is what i was thinking of
16:26Raynesamalloy: http://stackoverflow.com/questions/14105546/why-can-i-not-access-my-leiningen-dependencies-with-clojure-code/14106115
16:26Raynesamalloy: Does :include actually work? O.o
16:26amalloyyeah, i think refer has include/exclude
16:26RaynesInteresting.
16:26RaynesAlso, syntax quoted. Hah.
16:31bmaddyI'm using crate to create dom nodes in cljs. Does anyone know of a good way to put raw html in there? I'd like to do something like this: (crate/html [:div "<span>foo</span>"])
16:33bmaddyOh, the problem is that crate seems to escape the html, so I get &lt; in there.
16:43gfrederickshmmm; I feel like that used to work for me
16:43gfredericksmaybe the escapement is a recent change; but I'd expect recourse for your use case
16:43gfrederickslike a (raw ...)
16:45tomojtechnomancy: so if I made a ns slam.keys, am I stepping on you? I'm not really asking whether you plan to use that ns, but whether you've effectively claimed slam.* by creating slam.hound
17:01TimMcslam.dunk
17:02RaynesTimMc: crowed.goes.wild
17:02Raynescrowd, even
17:04tomoj&(namespace 'foo/foo/foo)
17:04lazybot⇒ "foo/foo"
17:10tomojwould it be so bad to have ::f/foo read to :f/foo when it doesn't resolve?
17:11TimMcyeah
17:11TimMcA bit too much magic.
17:11tomojI can see it being bad if you forgot to alias and now you have this weird keyword you didn't expect instead of an error
17:12gfredericks,:f/foo
17:12clojurebot:f/foo
17:12tomojhow about if you have to (binding [*allow-unresolvable-keywords* true] ...)
17:12gfredericksoh right
17:12amalloytomoj: that's not possible
17:12tomojwhy not?
17:13gfredericksamalloy: could enable it for explicit calls to the reader?
17:13amalloyoh sure, if you were using the reader manually, which i guess you would be
17:14tomojyeah, the use case is say you're trying to read a .clj file which uses ::
17:14tomojactually there you could maybe just only read the ns decl if you e.g. modified slam.hound
17:14arrdemherm... I'm getting an "equal arity" exception using destructuring for the argument cases [x [y z]], [x [y]]. How should I be doing this?
17:15tomojI was thinking of .edn files which have only one form, and that form tells you how to resolve the :: contained in it
17:16tomojso the first time you read you just want to ignore any :: errors
17:17bbloomtomoj: should as Bronsa about it
17:17bbloomask*
17:17bbloomhim and i were talking about dynamic vars to control namespace alises
17:18bbloommaybe there could be a dynamic var that resolves a keyword.. (defn ^:dynamic resolve-keyword [qualified? namespace name] ...)
17:18tomojlike a data reader
17:19bbloomyeah
17:19tomojI've considered #k :alias/foo or something
17:19tomojbut that's two too many characters :P
17:20tomojand you lose the qualified? distinction unless you have two tags
17:21tomojI guess the tag would only be used for qualified
17:22tomoj:: breaks slamhound, naturally I suppose
17:22bbloomtomoj: double colon isn't part of edn apparently :-P
17:23tomojmakes sense I suppose
17:23tomojI was thinking just use one colon and do manual resolution, but #db/fn etc make that inconvenient - need to bind special data readers which do the resolution before proxying to the original reader
17:24tufflaxAbout vim-foreplay: "With Leiningen 2, it connects automatically based on target/repl-port, otherwise it's just a :Connect away." I don't really get this. I'm using lein 1.7. What do I need to do to use nrepl with foreplay?
17:24tomoj..or I'll claim dz.* and use :dz/foo
17:24amalloytpope: a user is in need!
17:24tufflax:p
17:24arrdemlol
17:24amalloyalthough, tufflax: upgrade to 2.x. 1.x is pretty ancient
17:25citizenparkerragtime
17:25tufflaxamalloy, yeah maybe that's a good idea
17:25TimMcamalloy: "ancient"
17:25amalloydespite there still (i think?) not being a 2.0
17:25citizenparkerIgnore that last comment, please. =)
17:27arrdemamalloy: correct. we're still on 2.0.0-PREVIEWs
17:27amalloycallen: there's no need for smug/holy wars in here. vim is perfectly usable, and people have emacs questions all the time
17:28callenamalloy: I'm actually a dual-user, although my actual coding happens in Emacs. Won't pass up an opportunity to pick on a minority though. :)
17:28tomojdatomic and codeq make it look not so bad by using :db/fn, :tx/commit, :repo/uri, etc
17:29callenare there any CMSs or blog engines in Clojure yet? (not static site generators)
17:29tomoj:com.datomic.codeq.repo/uri
17:29tomoj:'(
17:29arrdemcallen: ... I built one off of ibdknox's Noir-blog
17:30callenarrdem: sounds like I'd better make a post-noir one.
17:30arrdemcallen: yeah. my blog (the abovementioned hack) is still 1.2.2 Noir.
17:31arrdemshould fix that.
17:32callenarrdem: well it'll give me a good way to shake out the new changes to Luminus anyway.
17:32tomojon one hand I feel like this is a minor problem, since it's just convenience. on the other, it seems like the utility of namespaced keywords (especially in the context of datomic, where a conflict is a big fucking problem) are diminished by people naturally going for convenience anyway
17:33tufflaxIf I do :Doc reverse in vim-foreplay, I get an error. But, how do I copy that error? :p Can I see that thing that foreplay brings up as a buffer?
17:33arrdemcallen: lemme know if/when you get such a post-noir CMS booting... I confess to having gotten lost in Ring when I tried to do a new post-noir site in the last 72
17:34callenarrdem: fair warning, I'll be meddling with some weird shit. Good news is, I've actually spent a decent chunk of my professional life implementing CMSs.
17:35callenso this is fully within my specialties, haha.
17:35tomojsure, I can use a separate db when I clobber :repo/uri in my own project. ?!
17:35arrdemhaha. no worries, I just want to read through a full ring site. who knows, I could learn something else new XD
17:36yogthoscallen: yeah this is a good plan, making a site will help figure out how to move the template forward ;)
17:38tufflaxHm, "Unsupported escape character: \U" what's \U? And why do I get that error in vim? :P
17:38tufflax(Clojure reader says it)
17:39amalloy&(read-string "\Usdfsdf")
17:39lazybotjava.lang.RuntimeException: Unsupported escape character: \U
17:40tufflaxyeah but what is \U? I guess my vim put's it into the string that's sent off for evaluation or something
17:40tufflaxs/put's/puts
17:41ToxicFrogUnicode? \U1234 for codepoint 0x1234, maybe?
17:41amalloywell, that's supposed to be \u
17:41chouserUnescape for a regex?
17:41amalloyeh?
17:41callenyogthos: are you simply permanently around like I am or do you have a flag set for luminus?
17:42amalloyis that \Q and \U? i thought it was \Q and...something else, like
17:42yogthoscallen: haha just happened to look in and saw you guys talking about it :)
17:42yogthoscallen: I just leave the client on in the background now
17:43chouseramalloy: you're right, I'm wrong. It's \Q and \E
17:43yogthoscallen: btw finally figured out how I want to go about the templating business, without overlaps
17:43amalloywhew. you had me convinced, because i couldn't think what the other one was
17:43yogthoscallen: I think stuff like +bootstrap will simply add the extra files, but then I'll have these site templates, where it's a batteries included business
17:43amalloyi was like...\R? that doesn't make any sense except in that r is after q
17:44yogthoscallen: it could have users, authentication, common stuff like that and leverage bootstrap and whatever for it
17:44yogthoscallen: then if you just want the js/css or database definition you can grab those and then roll your own thing easily
17:45callenyogthos: sounds promising. If you don't already, you might want to consider having a persistent IRC session. They're incredibly useful.
17:45callenparticularly because it means having a /lastlog worth a damn.
17:46yogthoscallen: yeah I should set that up :)
17:46callenyogthos: I've been a permanent resident of GNU Screen for a decade, myself. It takes 1 minute to get rolling.
17:46callenI use that with mosh for the actual connection.
17:46yogthoscallen: yeah screen is pretty awesome
17:46callenI don't use screen in the 1,001 ways some other users seem to, but it serves a very real need.
17:47yogthosit's very handy indeed
17:48arrdemer... I just managed to make my EMACS core.clj buffer r/o. halp?
17:49arrdemC-x C-q. got it.
17:51callenHate that shortcut.
17:55arrdemC-x C-l is the one that's killing me, 'cause I'm trying to C-c C-l to reload my core.clj
17:59Raynesyogthos: Note that that latest release is apparently not promoted because clojars is lying and saying it isn't signed. https://clojars.org/lib-noir
18:00tpopetufflax: still in need?
18:00RaynesI can't fix it until technomancy sees what I said in #leiningen.
18:00yogthosRaynes: ok cool thanks for the heads up
18:00RaynesIs yogthos your clojars username?
18:00yogthosyup :)
18:01yogthossame tag everywhere makes it easy :)
18:01Raynesyogthos: You can release now. Just make sure you sign releases (or use lein deploy clojars).
18:01yogthosRaynes: sure let me try
18:02Raynesyogthos: Well, there isn't anything to release.
18:02Raynes:p
18:02callenMyself and another managed to bug abaranosky into fixing the release tagging/clojars for Korma.
18:02callenso if that's been bothering you as much it has me, it'll be fixed soon.
18:02yogthosRaynes: yeah good point :)
18:02RaynesI already released that new stuff, it just didn't get promoted because clojars is a liar.
18:02callenI think he's a little overwhelmed at the moment though. He should've checked the pull requests before accepting responsibility :P
18:02yogthoslol
18:03Raynesyogthos: Anyways, in the future, feel free to release whenever you want as long as we've reviewed changes together. Obviously we'd want to talk about releasing any major versions increments or anything.
18:03RaynesO
18:03yogthosRaynes: yeah that sounds like a plan, I definitely want a second pair of eyes for anything I release :)
18:03yogthosRaynes: I'm exceptional at missing stuff :P
18:03RaynesI am pretty wild with third segment version increments.
18:04RaynesI release a new version of laser every 10 seconds when I add something new or change something small. :p
18:04RaynesOf course that'll slow down when it is more complete and stable, but still.
18:04yogthosRaynes: haha that's how I usually do it :)
18:05yogthosRaynes: I actually ran out of pre 1.0 versions on my pdf lib that way before it was mostly bug free :)
18:05yogthoswent with a x.x.x scheme and just kept releasing :P
18:05RaynesMuch to callen's chagrin, I rarely tag releases.
18:06RaynesI actually wrote a leiningen plugin for doing it too, so I'm just a lazy asshole.
18:06yogthoslol if it can be automated it's computers job! :P
18:06yogthoslazy programmers are best programmers :P
18:06Raynesyogthos: I'm so happy to be working with you on lib-noir. <3
18:06callenI concur.
18:07callenRaynes: there isn't much that isn't to my chagrin.
18:07yogthosRaynes: yeah I'm having a blast, it's a lot more fun than doing solo projects
18:07yogthosRaynes: and we seem to have a really good thing going :)
18:09yogthosRaynes: oh btw I'm squeezing a lot of juice out of newnew with multimethods :) https://github.com/yogthos/luminus-template/blob/master/src/leiningen/new/luminus.clj
18:10RaynesWow, that's all pretty cool.
18:10yogthosI think I finally found a fairly legit use for them :)
18:10tufflaxtpope, yes. When I run for example :Doc reverse without an nrepl, I get the error java.lang.RuntimeException: Unsupported escape character: \U (from the clojure reader) and when I have connected, the nrepl says "user=> Exception in thread "nREPL-worker-1" java.lang.NullPointerException". I'm on Windows btw.
18:10tpopetufflax: I was wondering when I'd get my first windows user
18:11tufflax:p
18:12tpopeI'm unsurprised it didn't work, but the \U failure in particular is ... odd
18:12tufflaxHm yeah, I have no ideas myself :p
18:12callenRaynes: it merited the cleverness, I saw the infernal pit of despair the templating was headed for
18:12tpopeguess I'll need to boot up the old vm
18:12yogthosRaynes: I should add a template for laser next :)
18:13callenRaynes: that's why I backed off after making some quick fixes, I wanted to muse about it.
18:13gfredericks"I wish I could see something that clojure did that was really fundamentally different than what I could do with C++ and templates."
18:13tpopetufflax: if you do cqp1<CR>, does that fail too? both ways
18:14yogthosyeah I think the main limitation is that templating is done by file, so you can't share a common file between multiple templates and add to it
18:14yogthosbut that kind of a template would be a whole different kind of animal
18:14Raynescallen: What are we talking about?
18:15yogthosRaynes: we tried to get clever and have a progressively built template, like you make a base site and then you slap bootstrap on top and then db
18:15callen^^ that.
18:15yogthosRaynes: but then you run into these cases that 2 templates have the same file and both need different stuff in it
18:15RaynesIt's really just hard to build something that will be perfect for everyone.
18:16callenRaynes: yes/no, it depends on how you look at the problem.
18:16yogthosmy compromise now is to not have anything overlapping and then provide top level templates which provide more functionality
18:16callenRaynes: package management is a mostly solved problem, for all practical purposes.
18:16Ember-Happy New Year everyone!
18:16tufflaxtpope, yes in the same way
18:16Ember-it's been 2013 for one hour here now
18:16yogthosstill got 6 hours to go here :)
18:17tufflax...as :Doc
18:17callenEmber-: с новом годом!
18:17Ember-callen: Finland, GMT+2 during winter, GMT+3 during summer
18:17callenEmber-: sorry, I've been learning your enemy's tongue.
18:17Raynescallen: For fun, here is where someone completely rewrote lein-newnew https://github.com/Raynes/lein-newnew/pull/54
18:17yogthoshaha
18:18Ember-callen: swedish?
18:18Ember-or russian
18:18RaynesI haven't merged it because I haven't had time to look it over and understand it, and I really don't want to break everyone's templates.
18:18Ember-they are both our fierce adversaries!
18:18callenEmber-: I just spat Russian at you.
18:18yogthoswell that was new year in russian :)
18:18Ember-callen: ah, my bad. I just saw ?
18:18yogthosmostly correct :P
18:18Ember-it's due to the fact that my client doesn't speak UTF-8 for now
18:18callenyogthos: is was perfectly correct so I thought :(
18:18Ember-it will change soon though, changing my server soon
18:19Ember-and when I do that I also upgrade stuff like that
18:19bmaddygfredericks: in case you were interested, it looks like others were having that same crate/escaping issue that I was: https://github.com/ibdknox/crate/issues/12.
18:19yogthoscallen: would be с Новым годом
18:19yogthoscallen: one letter off :P
18:19callenso close.
18:19Raynesyogthos, callen: I would welcome any changes you guys would like to make to the existing templating stuff that would be backwards compatible and we could probably get it in before the final release of lein 2. I think we'd have to wait until the next major version of lein for backwards incompatible changes, or we'd have to require that people add the updated plugin on the top of the old one (you've seen the "Did you just tell me to go fuck myself?"
18:19Raynes comic).
18:19callenyogthos: Вы русский?
18:20yogthoscallen: yup
18:20Ember-I'm sensing an evil russian yogthos
18:20yogthosEmber-: :)
18:20Ember-I'm sending our Winter War Veterans to smite you!
18:20callenyogthos: Я счастлив! I'm learning because I love Russians and Russian culture.
18:20Ember-fortunately for you, most of them are dead and the rest are holding canes while walking
18:20tpopetufflax: can you open a github issue? I can't get into it this very second
18:20yogthosbetter not send this guy :P http://en.wikipedia.org/wiki/Simo_H%C3%A4yh%C3%A4
18:21Ember-hehe, that one is a one tough son of a bitch
18:21yogthoscallen: I still speak fluently, but my writing proficiency leaves a lot to be desired :P
18:21yogthosEmber-: yeah that's pretty impressive ;)
18:22Ember-same military rank during the war as mine currently
18:22tufflaxtpope, ok
18:22Ember-although, corporal is soooo misleading
18:22Ember-sergeant would be more accurate in many ways
18:22callenEmber-: you serve in the finnish military?
18:22Ember-I served, like 95% of Finnish males
18:22Ember-mandatory military service for 6 months to one year
18:22yogthosRaynes: I'm going to keep playing around and building stuff around it for now, and we'll see if anything generic enough to merge in falls out of it :)
18:23Ember-I served for a year
18:23callenEmber-: makes sense, given such a land-hungry neighbor next door.
18:23Ember-yeah, that's the main reason :P
18:23yogthoshehe
18:23Ember-we have an army of 500 000 men
18:23callenRaynes: I tend to be of the same mindset. I don't eagerly reify things into libraries/genericisms until it comes naturally.
18:23Ember-sure, not as many working at the military
18:24callenEmber-: I didn't know your country even had that many people.
18:24Ember-but when we call the reservers, we get those 500k at the borders etc
18:24Ember-5.3 million currently I think
18:24Ember-or maybe 5.4, dunno
18:25Ember-I know few russian guys who live in Finland currently
18:25Ember-all of them are superbly great guys
18:25Ember-but of course they are - they live in Finland
18:25Ember-rest of the russian people are jerks
18:25Ember-;P
18:25yogthoshaha that's why I moved, jk :)
18:25Ember-where do you live then
18:25Ember-?
18:26yogthosToronto, Canad
18:26yogthosa
18:26Ember-ah, cool
18:26RaynesUnder your bed.
18:26yogthosROFL!
18:26Ember-not as cool as Finland
18:26Ember-but cool still ;P
18:26yogthosactually it's one of the milder places in canada
18:26yogthoscause we have the lake next to us
18:26Ember-yeah, it's +2C here in Helsinki currently
18:26yogthosabout the same here
18:26Ember-unusually warm new year's eve
18:27yogthoswhen I lived in new brunswick we got serious winters there
18:27Ember-but we've had unusually cold december
18:27yogthosI think currently it's 40cm snow :)
18:27Ember-we have over 70cm here
18:27Ember-in Helsinki
18:27yogthosepic snow
18:27Ember-if it hasn't melted today that much (which I seriously doubt)
18:28Ember-ah, I once thought I'd go abroad
18:28Ember-after all, I'm educated, have an educated wife and speak english pretty much fluently
18:28Ember-but alas, here I am
18:28Ember-:)
18:28yogthosI moved around quite a bit, now I'm getting lazy :)
18:29Ember-I'm making pretty good money currently, sure I'd make more in US but then again, living expenses are also WAY more there
18:29tpope
18:29Ember-so no financial needs to move
18:29yogthosI did like like living in europe though, I was in prague for about 3 years that was fun
18:29Ember-prague is nice
18:29tpopeI don't know how or why I sent that blank line
18:29Ember-I've only lived in Finland, but my brother lived 3 years in UK
18:30yogthoshow'd he like it? I've heard very mixed reviews
18:30Ember-well, exactly that
18:30Ember-he loved some things and *hated* many others
18:30Ember-like the overly bureacratic society
18:31Ember-like, in order to get a pay check you need a bank account. Ok, that's reasonable enough
18:31Ember-but in order to get a bank account you need a gas bill
18:31Ember-???
18:31lazybotEmber-: How could that be wrong?
18:31Ember-wtf
18:31Ember-you needed a gas bill to prove that you are living in UK
18:31yogthosthat's kind random
18:31yogthoskinda even
18:31Ember-what if you happened to live in an apartment which wasn't using any gas?
18:32Ember-well, my bro was living in one using gas, so no problem there but still
18:32callenit's a good thing Germans have a fetish for privacy.
18:32callenOtherwise they'd be like the UK
18:32Ember-it took 3 months until he got single pay check due to the fact that the gas company sent bills once in three months...
18:32yogthosgermany is on the list of countries I'd move to :)
18:32Ember-how insane is that?
18:33Ember-and soooo many other things which are just *wierd* in UK
18:33yogthosyeah that's epic, I guess douglas adams wasn't exaggerating about that :)
18:33yogthoshe even made a game on the subject :) http://en.wikipedia.org/wiki/Bureaucracy_(video_game)
18:33Ember-but then again, many things are way better than in Finland
18:33Ember-but in the end, he wanted to come back
18:34callenEmber-: what was better?
18:34callenabout the UK > Finland, that is.
18:34Raynesyogthos: Figured out the issue and got the release promoted.
18:34Ember-bigger country, bigger possibilities
18:34oskarth*joining in* how is prague compared to say, berlin?
18:34yogthosRaynes: what was it?
18:34Raynesyogthos: I had to add my public pgp key to my profile.
18:34RaynesOn clojars.
18:35yogthososkarth: haven't been to berlin, but vienna was nicer in my opinion
18:35yogthosRaynes: ahh
18:35Ember-oh, vienna
18:35RaynesAnd apparently you have to hit a 'promote' button.
18:35Ember-*that* is a city I'd like to live in
18:35callenEmber-: I really love being an American.
18:35RaynesSo I guess it didn't need to be promoted yet anyways.
18:35Raynes*shrug*
18:35yogthosRaynes: I should keep that in mind next time I release stuff
18:35RaynesI don't know how any of this clojars crap works these days.
18:35oskarthyogthos: vienna was nicer than prague? how were they different? (been to vienna but not prague)
18:35Ember-callen: my only visit to US was in the JFK while flying to Mexico
18:35callenEmber-: Biiiiig country, wide selection of cultures to indulge in. Lots of career opportunities.
18:35callenEmber-: you should take a vacation here at some point.
18:36Ember-your rule of having to check in to your country even when you are just in transit is just STUPID
18:36Ember-wtf, really
18:36Ember-WTF
18:36callenEmber-: terrorism stuff, we don't like it either.
18:36Ember-we had to queue in passport line for like 2 hours
18:36callenEmber-: we're all very grumpy about our TSA.
18:36Ember-and almost missed our flight
18:36yogthososkarth: I thought vienna felt more grand, cleaner, just overall seemed like a really cool city, can't really put it to any specific thing
18:36oskarthi see
18:36Ember-but I do want to visit US for real
18:37yogthososkarth: that said I still think prague is pretty nice overall
18:37Ember-my friend had a smoke in NY just for the reason he had to be in that friggin' queue for t2h
18:37oskarth(from stockholm, currently in nyc but have to go back, thinking about moving to berlin or prague or something similar)
18:37oskarthyogthos: cheap I imagine? how is the internet / "expat" community?
18:38Ember-prague is cheap considering "western" standards
18:38yogthososkarth: definitely cheaper, but I was there almost 10 years ago so kind of outdated info wise
18:38yogthosand I gotta run here guys, dinner calls :)
18:38oskarthI see, thanks anyway :)
18:39Ember-but if you're living in there, then your paycheck is according to local expenses
18:39Ember-naturally
18:39callenyogthos: cheers.
18:39oskarthEmber-: true, but... remote work
18:39Ember-yogthos: and beers
18:39callenEmber-: unless you'r---what oskarth said.
18:39yogthoscallen: probably gonna be back soon anyways... Ember-: and definitely beers :P
18:39yogthoscheers all
18:39oskarthcheers
18:39Ember-ah, I think I need to head for bed soon
18:39Ember-my wife is already brushing her teeth
18:40Ember-it's 1:30 here
18:40Ember-have huge amount of beer, whisky, wine, mexican tequila and stuff
18:40Ember-but a wise man does not open any of those at this hour when our guests have left :P
18:41Ember-I bid you farewell for the night and wish you all a very pleasant new year!
18:42Ember-it's 2013 folks, the year Clojure will break through and kick some major ass!
18:42Ember-:P
18:42callenEmber-: cheers.
18:42Ember-night ->
18:43FrozenlockEmber-: Isn't clojure already kicking asses? :P
18:44callenFrozenlock: depends on your expectations. It's serving a lot of startups well. Some people want to see it go mainstream. I'm ambivalent myself. I care about the onboarding experience of noobies, but I don't care to cater to corporate interests.
18:47arrdemwell, I've been clojuring since July and that onboarding experience is pretty well covered :)
18:49sveduboisIs it possible to write this in other way, without repeating image?
18:49svedubois(.getWidth image)
18:49svedubois(.getHeight image)
18:49svedubois(.getDepth image)
18:49arrdem(doto image (.getWidth) (.getHeight) (.getDepth))
18:49Frozenlockwill doto return a seq?
18:50arrdemneg.
18:50arrdemmap would be inappropriate...
18:50arrdemherm.
18:50arrdemFrozenlock: speak o great one.
18:50Frozenlockfor?
18:50clojurebotfor is not used enough
18:50arrdem,(doc for)
18:50clojurebot"([seq-exprs body-expr]); List comprehension. Takes a vector of one or more binding-form/collection-expr pairs, each followed by zero or more modifiers, and yields a lazy sequence of evaluations of expr. Collections are iterated in a nested fashion, rightmost fastest, and nested coll-exprs can refer to bindings created in prior binding-forms. Supported modifiers are: :let [binding-form expr ...], ...
18:51sveduboisarrdem the output it is not the same
18:51oskarth,(doc doto)
18:51clojurebot"([x & forms]); Evaluates x then calls all of the methods and functions with the value of x supplied at the front of the given arguments. The forms are evaluated in order. Returns x. (doto (new java.util.HashMap) (.put \"a\" 1) (.put \"b\" 2))"
18:52arrdemsvedubois: correct. I'm n00bing over here ignore me.
18:55sveduboisWhith (.getWidth image) I obtain a number
18:56sveduboisBut with (doto image (.getWidth) (.getHeight) (.getDepth)) I obtain the information about image (all the information, not only the numbers of ...)
18:58arrdemsvedubois: Okay. doto evaluates the argument forms eagerly for side-effects, then returns the first argument, a (presumably modified) object.
18:58amalloyjava methods aren't first-class, so that's not easy to do
18:59amalloyyou could do something like (for [f [(memfn getWidth) (memfn getHeight) (memfn getDepth)]] (f image)), but...really that's more work, not less
19:00sveduboisamalloy it works with "for"
19:01callenarrdem: hence the nomenclature...doto.
19:01arrdemcallen: right. I was attempting to explain for svedubois's benifit since he seemed to have missed the ,doc fest.
19:01callenarrdem: I know, I was making an amused note. :)
19:02arrdemXP yay being wrong in channel!
19:09arrdemamalloy: herm... so what'd I do wrong here? https://www.refheap.com/paste/7987
19:09amalloywell try macroexpanding it and see
19:10amalloythough i suppose this might be messed up enough that it refuses to macroexpand
19:10arrdemhehe when I macroexpand (fnmap 1 [toString]) I get a load of gensyms from the (for) that's pretty unreadable.
19:11amalloywell, macroexpand-1
19:12arrdemyeah... the -1 isn't right at all. foo.
19:12amalloythe main problem is your #() lambda is totally wrong
19:12amalloyeverything else is mostly fine, although not the way i'd write it
19:14amalloytry calling #(quote (memfn %)) on a symbol and see what you get out. poke on that until it does what you want, and then the macro will work
19:15arrdemwould you approach this via the for, or would your gut be to generate (list (.foo a) (.bar a) (.baz a)...)?
19:15amalloyi suppose either one is fine
19:15ravsterhello everyone
19:15callenravster: hi!
19:15amalloywell, i certainly wouldn't generate (.foo a)
19:16amalloybut (. a foo) would be fine
19:16ravsteris there a command I can use in nrepl.el that will allow me to call the previous output?
19:26scottjravster: other than M-p in the repl? (just guessing, haven't used nrepl.el)
19:26gtraktry *1
19:28gtrakhttp://clojure.github.com/clojure/clojure.core-api.html#clojure.core/*1
19:35ravstersweet, *1 is awesome. thanks gtrak
19:36callenman I can really wile away the hours when I read. Anybody in here read a good book lately? This seems like a good crowd to ask, although I have plenty in my queue.
19:37gtraktaken a look at the clojure bookshelf yet?
19:37callengtrak: actually, I was one of the first people to ask Hickey to enumerate his recommended books.
19:37callengtrak: so yes, I've taken a look. I was hoping for something more unrelated yet appropriate.
19:38gtrakfogus put out a reading list recently, blogs and papers and things
19:39callenSaw that too. Still looking for something a little more out there.
19:39callenI'd be willing to make an aggressive guess at the intersection between Fogus and dnolen's reading lists.
19:47gfredericksin the future will pre/postcondition assertion errors have ex-data? :/
19:48arrdemamalloy: okay. this works but comments https://www.refheap.com/paste/7988
19:48gtrakand risk breaking all the the code that relies on them?! :-)
19:49gtrakarrdem: map map is a lot like map comp
19:49gfredericksgtrak: :'(
19:49gfrederickshopefully core.contracts will...
19:51arrdemgtrak: that's cute! thanks XP
19:52amalloyarrdem: well, of course it's not terribly easy to read. more importantly you are multiply-evaluating the input object: try (fnmap (do (println "computing...") 10) [toString hashCode]), for example
19:52gtrakgfredericks: oo I didn't know that existed! I wonder if he's thought about introspection? That sort of thing would be useful to me at this very moment.
19:52amalloyi would address both of those problems by writing it as https://www.refheap.com/paste/7989
19:53dcbarrdem: not sure if your looking for suggestions, but (apply vector (map ...)) can be replaced with mapv
19:54arrdem~@ ?
19:54clojurebot@ is splicing unquote
19:54amalloyi just had a funny idea. instead of ##(let [sym (gensym 'obj)] sym), i suppose i could write ##(let [sym '`obj#] sym), couldn't i?
19:54lazybot(let [sym (gensym (quote obj))] sym) ⇒ obj126350
19:54lazybot(let [sym (quote (quote obj__126339_... ⇒ (quote obj__126339__auto__)
19:54amalloy&(let [sym `obj#] sym), i guess
19:54lazybot⇒ obj__126371__auto__
19:55arrdem~~@
19:55clojurebotI forgot that ~paste is gist.github.com
19:55gtrakclojurebot: what are you talking about?
19:55clojurebotHuh?
19:55arrdemclojurebot lies like a rug
19:58arrdemamalloy: so the ~@ unquotes the for, but how is it splicing the quoted dot?
19:59rlbfwiw, I just tried lib-noir using the lein plugin mentioned here (http://yogthos.net/blog/33-Moving+to+Compojure), and "lein ring server" throws an exception (though it still works): "No X11 DISPLAY variable was set, but this program performed an operation which requires it". In this case, the message is accurate (it is running headless), and the server still works.
19:59amalloysplicing the quoted dot?
20:00weavejesterrlb: You can set :ring {:open-browser? false} in your project.clj file
20:00gtrakrlb: I would guess it's the code that starts a browser
20:00weavejesterrlb: Or run lein ring server-headless
20:00weavejesterWhich will probably become lein ring server :headless in some future version
20:01rlbahh, ok, thanks
20:01arrdemamalloy: nvm got it. cute! I didn't know about ~@.
20:02arrdemamalloy, gtrak dcb thank you for entertaining this asside.
20:07technomancyit throws an exception when it can't open a browser? =\
20:10gtrakweavejester: got a question for you, how do I separate the args-binding to the capturing of route definitions? It's sometimes annoying when things fall-through, like a route def "/:id" not matching "/3/5"
20:11weavejestergtrak: I'm not sure I completely understand you. Do you want to change how keywords match?
20:11gtrakIn this case, I would want the handler to throw an exception or something instead of falling through and returning nil.
20:12weavejestergtrak: e.g. (GET ["/:id" :id #".*"] [id] …)
20:12weavejestergtrak: Throw an exception? Why would you want to do that?
20:13gtrakTo know that anything under a certain path is being handled by the relevant handler, to escape the 'some', I guess.
20:14weavejesterHow would you determine the difference between a route that doesn't match, and a route that should generate an exception?
20:15weavejesterAnd I'm not sure an exception is the right solution.
20:15gtrakexception is more a stand-in for arbitrary code for the sake of example. I would want to ensure a route matches things, to prevent other routes from matching.
20:16callengtrak: you realize that what you're asking for is highly ambiguous, yes?
20:16callengtrak: you can match partial versions of the routes and throw your own exceptions. I'm a little dubious of trying to inject some tricky behavior somewhere in-between simply matching a route and returning 404.
20:17gtrakinject isn't what I'm looking for, decouple, rather
20:17gtrakI will try to grok that regex syntax, it might work for me
20:17callengtrak: you could add middleware that handled this
20:18weavejesterIf the routes have a common prefix, you could group them together and add a 404 for if the prefix doesn't match
20:18weavejesterThe regex syntax just gives you the ability to change the way route parameters match
20:19weavejesterSo: (GET ["/user/:id" :id #"[0-9]+"] …)
20:19weavejesterWould match /user/1 and /user/9 but not /user/foo
20:25gtrakthe way I've been doing it thus far is by just using wildcards, is there a function or something I can call to parse params out of a string once I've done that? I'
20:25gtrakI'm staring at clout/core.clj and it seems to be all bound up in the CompiledRoute record
20:28gtrakfor example, I'd want to write something that takes a Uri-encoded string as a param, if it has a slash in it, I'd like to kick back an error, but keep that logic within the same handler.
20:30gtrak* is pretty ok, but I'm wondering if there's a better way to deliberately prevent control-flow at that point.
20:32weavejestergtrak: That's kinda beyond the scope of clout. It just matches routes; it doesn't determine whether a part of a route is correct
20:32weavejesterBut you can generate an exception within the route itself
20:32weavejesterOr pass it to a function with preconditions.
20:37gtrakhmm, yes, wrapping it in something might do the trick, I could possibly create wrappers around the compojure verb macros to steal the matching logic.
20:37gtrakit's just so darn convenient, I want to use it for everything :-)
20:37weavejestergtrak: Be careful you don't resort to macros too soon. You can do a lot with functions.
20:38weavejesterAlso, exceptions are for exceptional circumstances. I'm not sure errors in input data count. You may want to return the correct response status code instead.
20:40gtrakthis is more relevant for development, like preconditions, and that's how I mean to use it
20:40gtrakbe able to say things like, any input that matches x.. needs to be handled by this handler now, not any other.
20:41weavejestergtrak: You might be making your routes too "fat"
20:41weavejesterIn my view, routes are there to match URIs, and to filter data from the request
20:42gtrakthey are quite fat, but it seems avoiding it makes it worse so far.
20:42weavejesterIf you did something like...
20:42weavejester(GET "/:id" [id] (get-id id))
20:42weavejester(defn get-id [id] {:pre …} ...)
20:44gtrakRight, like I said, in my example, that whole thing will be skipped if there's a slash in the URI, unless I did a wildcard. The checks should be on the outside of the route, ensuring that it never returns nil if it's really supposed to match a path.
20:44weavejesterWell… that sounds like an unusual use-case. Usually if you give a web server a bad path, it's a 404.
20:45weavejesterThrowing an exception if there's something wrong with the path sounds a bit wrong.
20:46gtrakhmm, maybe wrong in the http sense.
20:51gtrakin our case, it would return a 500 by our default exception handler middleware, which is better than the information provided by nil. Upon seeing it, we could decide what to do. As of now, I have to speculate what happened and insert print statements where I think things might have gone wrong.
20:57RaynesWe almost made it to 8000 pastes by years end in central time.
20:57RaynesWe are 9 refheap pastes away, guys.
20:57RaynesQuick, find shit to paste.
20:57gtrakof course I agree that in the end-product, the user should never see that error, it should be handled tastefully, but given how much variance there is in implementation over http, I'm not sure saying that '404 is the right response' is always applicable.
20:58gtrakRaynes: your server says Jan 1 already!
20:58RaynesIt lies!
20:58RaynesThat is peculiar. It should be PST...
20:59amalloyRaynes: are you still on heroku?
20:59RaynesOh. Duh.
20:59RaynesI'm returded.
21:00RaynesI should outsource my time.
21:00RaynesTo crisis.
21:00RaynesAnyways, too late now.
21:00RaynesDidn't make it to 8k, technically.
21:00tomojhmm, but it's jan 1 in neither central nor pacific
21:00tomojUTC?
21:00Raynes*shrug*
21:01tpopeheroku config:set TZ=America/Los_Angeles
21:01tomojM-x refheap-paste-region-private
21:01tomojC-u 1001 C-x C-z
21:01tomojuh
21:02tomojC-x z I mean
21:02RaynesYeah, don't do that.
21:02tomoj:D
21:02RaynesIsn't worth it.
21:03Raynespenumbra:refheap raynes$ heroku run date +%Z
21:03RaynesRunning `date +%Z` attached to terminal... up, run.1905
21:03RaynesUTC
21:03callenis there a more reliable non-Amazon alternative to Heroku out there?
21:03Raynestomoj: ^
21:03Raynescallen: Openshift maybe?
21:03callenRaynes: because I have to confess, even though dev-ops is one of my knacks in my day job, I don't like doing it for side projects if I can avoid it.
21:04callenmaybe pallet could change my mind, but I'd rather reserve my willpower for code.
21:04Raynesopenshift is less easy than Heroku to set up.
21:04RaynesBut it might be better.
21:04callenthe issue with openshift is that it's no different than my own dev-ops stuff
21:04callenthe effort to integrate it and amortized efficiency would be identical to me doing my own typical stuff.
21:05tomojwhat do you bind to refheap-paste-*?
21:13hyPiRionHappy new year from all of Europe :)
21:19cemerickcallen: you can deploy source repos via elastic beanstalk these days, too
21:20tomojI despise js that automatically selects all every time I click in a textarea
21:20p_lseconded
21:20p_lit plays hell with Xselection
21:22tpopeyes
21:22tpopebitbucket can go fuck itself
21:22cemerickRaynes: are you shoving off of heroku for refheap?
21:23cemericktpope: ?
21:23cemerickWhoa, synchronicity.
21:24tpopecemerick: the way it autoselects the repo url makes it impossible to copy to the primary selection on linux
21:25cemerickPlease tell me there's a tertiary selection. That'll end 2012 nicely.
21:26tpopeall I know of is primary and clipboard
21:26tpopebut X11 is a beast
21:27p_lI think there was third one ;)
21:27tpopecemerick: hey, I was trying to figure out if there was an elegant way to get a backtrace out of an nrepl connection
21:27callencemerick: staying the hell away from amazon was one of the prime motivators, sadly.
21:28tpopecemerick: I mean more elegant than evaling (.getStackTrace *e) (which will clobber the user's *1)
21:30cemerickp_l, tpope: yup, there's a tertiary selection
21:30cemerickessentially unused, afaict
21:31cemericktpope: I'll go see how ccw does it, can't remember
21:31mpanin general, are most clojure libraries implicitly clojure-jre only?
21:31mpanerm, clojure-jvm, rather
21:31tomojtpope: impossible? I usually can manage to click at one end and drag all the way across, although with some difficulty
21:32p_lmpan: I think most that are "pragmatic" and not just language specific libs
21:32tpopetomoj: then you are a more persistent man than I
21:32tpopelet me try
21:32tomojbitbucket actually seems better than most
21:32mpanp_l: thanks
21:32tomojit seems to only auto select all on focus
21:33cemericktpope: nope, ccw uses .printStackTrace / pst
21:33tpopetomoj: about one in 6 attempts I can get most of it, but it still fails to copy
21:34cemerickThere's a TODO in the code to add some default middleware to support getting all of *e's data
21:34tpopecemerick: I saw that :)
21:34tpopeif it helps I can open an issue and add some +1 emoji
21:35cemericksure, feel free
21:35cemerickeven better if you write (or convince someone else) to write the middleware ;-)
21:35cemerickIt'll have to happen at some point. There's just too much value to be had in getting useful error data.
21:35cemerickstack traces are shite
21:35cemerickcallen: why are you down on aws?
21:37callencemerick: it doesn't align with my priorities and I find the irrational exuberance distasteful in a career track that should favor sober decision making more prominently.
21:37callencemerick: it has its purpose. I'm not irrationally opposed to using it. I've various AWS services quite a bit.
21:37tpopecemerick: is there an easy way to get an nrepl server booted within the nrepl source itself, so that I might play around with it?
21:38cemerickcallen: Fair. I'm all for more capable competition; I keep waiting and waiting, though.
21:39cemericktpope: Sure, you can start a new server while editable nREPL sources are on your classpath without a problem.
21:39callencemerick: I wouldn't expect something identical to AWS to arise and I'm not 100% convinced the non-EC2 parts of the service are an especially good idea.
21:39tpopeokay, was just wondering if there was a convenient shortcut for it
21:39callenI'd expect their business model to get picked apart by specialties like VPS SSD providers, Heroku-alikes, etc.
21:40callennot by another full-house provider. Especially since Rackspace is persistently incompetent.
21:40cemericktpope: I'm open to suggestions. Short of cloning the repo and starting an initial REPL for your actual interactions, it's as easy as starting any other nREPL server.
21:40cemerickI'm open to suggestions, of course.
21:41tufflaxVim users: How do you debug clojure code? This looks nice in emacs http://vimeo.com/15462015 is there something similar for vim?
21:42cemerickcallen: Yeah, I figured the same would happen as well...but even, what, 6 years out, there's not even a credible S3 competitor around.
21:42tpopecemerick: well I was thinking there might be a maven task equivalent to lein repl. No idea if that's the sort of thing people might do with maven
21:42mpantufflax: I'm also interested in options for debugging that aren't emacs or eclipse
21:42callencemerick: I don't know about that. Riak + bitcask and a simple API wrapper == S3
21:42cemericktpope: oh, I see what you mean
21:42mpantufflax: I've been looking at https://github.com/GeorgeJahad/cdt but I'm not sure how I feel about it
21:43mpanI just really wish there were a standalone graphical stepping debugger
21:43cemericktpope: that's not really going to help you hack on nrepl though
21:43cemerickcallen: well, that's Riak CS, which is interesting in its own right, but definitely not a service.
21:43tpopecemerick: well if that maven task happened to be available inside the tools.nrepl project (and it used the local sources), it would, right?
21:44mpantufflax: like, it should be possible to use standalone, but even then I dunno how I feel about it
21:44tpopecemerick: I wasn't talking general purpose. I was talking a specific one-off for this use case
21:44tufflaxI tried cdt once... the only thing i remember is that i wasn't satisfied :P
21:44tpopecemerick: but if you haven't needed it, then I presumably won't either
21:45tufflaxI mean just cdt
21:45cemericktpope: right, just hacking on nREPL? My workflow is to start one nREPL, connect to it, hack hack hack, load, see what happens
21:45tufflaxcdt is what that guy in the video is using in emacs
21:45callencemerick: part of the problem is that programmers evaluate everything on the basis of cost and nobody can really compete with Amazon's capacity save for Google.
21:45mpanyea that's what I was thinking of trying, but just historically, I haven't been too comfortable with interactive command-line debuggers
21:45callencemerick: I don't even find S3 to be all that compelling to begin with.
21:46tpopecemerick: then I will try the same
21:46cemerickcallen: except aws is extraordinarily expensive...?
21:46callencemerick: I was referring primarily to EC2
21:46mpantufflax: if you find something I'd be interested in hearing about it too
21:46tufflaxmpan: sure
21:46callencemerick: S3 is the most price-competitive service they have.
21:46tufflaxsame here :P
21:47cemerickS3 is *super* expensive, compared to just about anything else
21:47callenyou said nothing competed with it, what alternative are you thinking of?
21:47mpanalso, I heard some people say they were using just regular java debuggers connected to a jvm with a repl inside
21:47mpanbut I can't find specific instructions on that; maybe I'm googling the wrong keywords
21:48cemerickcallen: rackspace, rack-and-stack, whatever else there is
21:48cemericknothing competes with it w.r.t.: it works, it's easy, and it doesn't break
21:48tufflaxmpan: How is the debugger in eclipse/ccw?
21:48mpantufflax: overall ccw feels a lot like eclipse for java dev
21:48callenwhen I described it as price competitive, I wasn't comparing it to self-hosting.
21:49mpanbut eclipse in general gives me performance related issues sometimes
21:49callenmpan: use Emacs.
21:49tufflaxmpan: I've never used it. I was only thinking of the debugger
21:49cemerickI use ccw 24/7 FWIW. I'm biased, but I like it.
21:50mpanthe debugger in ccw feels a lot like the eclipse debugger for regular java
21:50cemerickmpan: it is!
21:50mpanand I was already familiar with that from school so I was ok with it
21:50mpancemerick: wait, there's no layer of magic in between?
21:50cemerickzero
21:50tufflaxI'll have to try it. Emacs or ccw is gonna have to become my debugger I think
21:50cemerickWhich is why clojure collections aren't displayed super-nicely yet.
21:51mpanthey're just toString()'d, right? but even that's kinda nice
21:51mpancallen: I've been trying to learn occasionally
21:51callenmpan: my advice? keep it simple. Failing that, you can learn from my dotfiles.
21:51callenmy dotfiles repo is pretty shake-n-bake as far as it goes.
21:52cemerickcallen: Wow, s3 is now *cheaper* than Rackspace cloud files.
21:52cemerickAt some point, that wasn't true IIRC.
21:52mpanI've just honestly been a mouse-and-graphics person all my life
21:52callencemerick: spend some time on HN, they'll crow for 24 hours straight everytime Amazon does a price-drop.
21:52tomojcljs spoils me. IDeref isn't a protocol on the jvm!
21:52callenmpan: seems a good time to break that habit, get with the unix and lisp traditions of yore. :)
21:52cemerickcallen: I try not to. :-)
21:53callencemerick: you're a wiser man than I.
21:53cemerickDoesn't mean I'm immune, of course.
21:53tomojI wanted @conn for (datomic.api/db conn) and thought "hurray for protocols" :(
21:53muhoos3 is the cheapest storage i've been able to find in about 3 years now.
21:53muhooi think i pay pennies a month
21:54mpancallen: where are your dotfiles? are you a different name on github, if that's what you were referring to?
21:54callenmpan: http://github.com/bitemyapp/dotfiles/
21:54cemerickmuhoo: there was a chart a couple of years ago that was contra that, but clearly that's changed
21:54callenmpan: about 400,000 lines of Emacs Lisp. You only need to care about 20 or so of them.
21:54muhooRaynes: btw, and speaking of selection, refheap doesn't like tablets too well, not sure why
21:54mpanah thanks!
21:54muhooon android at least, you need to long-click in order to paste. refheap seems to eat the long click
21:55muhoolong-touch, not long click, there ain't no clicks.
21:56mpancallen: wait, how much of your .emacs.d/ was manually vs automatically generated?
21:56tomojwonder why we haven't started turning more interfaces into protocols? waiting for c-in-c?
21:57callenmpan: it's mostly manually curated, but I most certainly did not write but a very small fraction of it.
21:57callenonly one or two packages are automatically integrated.
21:57callenI still resent package.el
21:57gfrederickstomoj: weird how cljs makes clj look all cruddy
21:57mpanshould I be worried about learning curve here?
21:58tomojcljs has different crud :)
21:59callenmpan: not if you keep it simple like I advised. There are a ton of tutorials out there.
22:00mpanall right; thank you
22:10RaynesAnd on this New Years evening, I give you the big wet ball we live on: https://pbs.twimg.com/media/A_fRA-1CMAAjOEz.jpg:large
22:18cemerickRaynes: A worthy pairing to that: https://en.wikipedia.org/wiki/Pale_Blue_Dot
22:19Raynescemerick: It's kind of sad that you can still see earth from that distance. It's like "Come the hell on, how do I get my bloody spacecraft where I want it to go before I die!?!?!"
22:20cemerickheh
22:20RaynesIt must haunt scientists that they have such a limited range of vision with no hope of ever seeing anything more.
22:20gfredericksthrough fictional technology of course!
22:20cemerickRaynes: of course, we can see planets in other star systems from here.
22:20Raynescemerick: It haunts me and I'm not even a scientist.
22:20RaynesYes, but it isn't good enough. We only see our galaxy.
22:21cemerickRaynes: I have a story for you
22:21RaynesI bet it is depressing.
22:21gfrederickscemerick: frustrating to only be able to look at anything from one angle?
22:22cemerickRaynes: hardly. http://filer.case.edu/dts8/thelastq.htm
22:22cemerickgfredericks: frustrating?
22:24gfrederickscemerick: like spending 30 years in a room not allowed to move from your chair
22:24gfrederickstotally unable to get up and look at something from another angle
22:24tmcivercemerick: thanks for the link. Going on the kindle.
22:25cemerickgfredericks: man, that sounds like what I've done! :-P
22:26gfrederickscemerick -- the astronomer of his own room
22:28gfredericks&(sort (range))
22:31gfredericksI'm not sure magit does a good job replacing `git add -p`
22:42tomojhow not?
22:42tomojthe only problem I have with that part of magit is when the hunks don't come out like I like
22:43gfrederickstomoj: instead of hitting single keys I do a bunch of scrolling and tabsing
22:43gfredericksgotta go find the next thing of interest instead of it being automatically presented to me
22:47tomojyou already know n, p, ^, M-n, M-p, 4, and M-4?
22:48tomojoh, I see
22:48gfredericksnope. this is why I come here to complain about these things
22:48gfredericksI usually learn something helpful :)
22:49tomojwell, those may help some. the navigation for basics, 4 (while focused on, say, Unstaged changes:, or M-4 anywhere) to show everything so that you don't have to tab open the diffs
22:49tomojbut you don't get add -p's thing where you mark certain files as interesting
22:49gfredericksthat's a feature I haven't heard of
22:49tomojI mean git add -i
22:50gfredericksooh
22:50gfredericksI've never tried that
22:54tomojit's silly that if you don't have all the unstaged diffs expanded and you stage in one, point may end up after the staged changes
23:01gfredericksit's silly that I can't think of a better way to write laws than to elect a few hundred lawyers to negotiate with each other in whatever manner they see fit.
23:02tomojindeed
23:04Raynescemerick: Hah.
23:04Raynescemerick: The computer is God. Nice.
23:11cemerickRaynes: or, god is life, etc
23:12cemerickthere's a lot of meta-allegories to be sussed out
23:41mpani'm kind of getting mixed signals from google about what is the current standard setup for clojure in emacs
23:42mpanthe top few search results flat out say there's newer stuff than what they were recommending at the time
23:42mpanwould the current recommendation be clojure-mode, nrepl.el, and ritz?
23:44mpanwell and a few random experiments with trying to learn it since, I guess
23:44gfrederickswoah man if I had learned emacs in high school I would have spent a lot less of my life programming in notepad
23:44Frozenlockthey showed you emacs in HS?
23:44FrozenlockI must have children to be able to send them there.
23:44mpanwell, the only key sequences they taught us were ^x^f , ^x^s , and ^x^c
23:45mpannot sure that counts as learning emacs tbh
23:45Frozenlockwell they showed you the application, even if they didn't show you how to use it.
23:46FrozenlockAnyway learning how to use emacs is a life-long job
23:47mpanbleh, real life interruptions