2013-09-30
| 00:00 | ddellacosta | yes, but I'm really just testing existence in this specific instance, so could work. |
| 00:04 | ddellacosta | also, regarding something that returns the first item that satisfies a predicate, I suppose since filter is lazy, you could just take 1 |
| 00:05 | TEttinger | (fn [pred coll] (when (seq coll) (if (pred (first coll)) (first coll) (recur pred (next coll))))) does the same -- the source of some, that returns nil or the first match |
| 00:06 | TEttinger | ,((fn [pred coll] (when (seq coll) (if (pred (first coll)) (first coll) (recur pred (next coll))))) even? [1 3 5 7 9 4 6]) |
| 00:06 | clojurebot | 4 |
| 00:06 | TEttinger | ,((fn [pred coll] (when (seq coll) (if (pred (first coll)) (first coll) (recur pred (next coll))))) even? [1 3 5 7 9]) |
| 00:06 | clojurebot | nil |
| 00:31 | marcopolo2 | So I'm trying to understand pr-str in cljs, (pr-str [1,2,3]) => "[#<Array [1, 2, 3, 4]>]" , which can't be read by cljs.reader/read-string, shouldn't it return "[1,2,3,4]"? |
| 00:31 | marcopolo2 | ,(pr-str [1,2,3]) |
| 00:31 | clojurebot | "[1 2 3]" |
| 00:33 | jonasen | marcopolo2: (pr-str [1 2 3 4]) returns "[1 2 3 4]" for me. What version of cljs are you using? |
| 00:33 | marcopolo2 | jonasen: 0.0-1859 |
| 00:34 | marcopolo2 | jonasen: try calling cljs.core.pr_str.call(null,[1,2,3]) |
| 00:34 | marcopolo2 | jonasen: in the console, what do you get? |
| 00:35 | mullr_ | I get "[1 2 3 4]" with 1909 |
| 00:35 | jonasen | marcopolo2: [1,2,3] in that context is not a clojure vector, it's an java array |
| 00:35 | marcopolo2 | jonasen: you're right, cljs.core.pr_str.call(null,cljs.core.vector.call(null,[1,2,3,4])) that is a vector |
| 00:36 | jonasen | s/java/javascript |
| 00:36 | marcopolo2 | mullr_: I'm using core.async which I don't think has been updated to the newer cljs version |
| 00:37 | jonasen | marcopolo2: the newest cljs version works fine with core.async: http://cljsfiddle.net/fiddle/jonase.snake |
| 00:39 | jonasen | marcopolo2: clojurescript version 0.0-1909 and core.async 0.1.242.0-44b1e3-alpha |
| 00:40 | marcopolo2 | jonasen: kudos on cljsfiddle, I was using it earlier! Did you do something special with core.async, because other people had troubles too: https://groups.google.com/forum/#!topic/clojurescript/JxAxK4_cEyM |
| 00:41 | jonasen | marcopolo2: not that he was using 0.0-1889 and not 0.0-1909 |
| 00:41 | jonasen | s/not/note |
| 00:42 | marcopolo2 | jonasen: Huh, thought it was core.async's fault |
| 00:42 | marcopolo2 | jonasen: Let me update cljs, thanks! |
| 00:42 | marcopolo2 | Now I can get sourcemaps again :) |
| 00:46 | marcopolo2 | jonasen: You're using core.async version:0.1.242.0-44b1e3-alpha |
| 00:47 | jonasen | marcopolo2: yes |
| 00:48 | jonasen | and I had to explicitly include [org.clojure/tools.reader "0.7.8"] in my :dependencies |
| 00:48 | jonasen | otherwise it pulled the wrong version for some reason |
| 00:50 | marcopolo2 | jonasen: weird... maybe a some dependency is loading an older version? |
| 00:55 | marcopolo2 | jonasen: Figured it out, I had a js array sneak in there |
| 00:55 | marcopolo2 | jonasen: thank you |
| 01:05 | chord | anyone going to help with game yet? |
| 01:20 | chord | channel dead |
| 01:20 | chord | please someone tell me channel is not dead |
| 01:21 | chord | what happened with split? |
| 01:26 | chord | you guys are all stupid and dumb |
| 01:28 | nightfly | do your own work |
| 01:28 | nightfly | come ask for help when you actually have something real to show |
| 01:29 | chord | nightfly so lets talk about diablo 3 then |
| 01:29 | chord | you like diablo 3? |
| 01:30 | mullr_ | I don't think the channel is entirely dead, merely lacking a pertinent topic. |
| 01:32 | chord | mullr_ work with me help me revive the channel |
| 01:32 | chord | i'm so bored |
| 01:32 | mullr_ | If you're bored, I recommend http://projecteuler.net/ |
| 01:36 | chord | mullr_ I've already got A* on the queue that fixes programming boredom, but for non programming boredom there is nothing so i'm bored |
| 01:36 | mullr_ | very well, then I suggest /r/bored. Beyond that, you may have to look elsewhere. |
| 01:37 | chord | mullr_ work with me here, whats your favorite video game |
| 01:37 | dissipate | not the star craft crap again... |
| 01:37 | dissipate | i |
| 01:38 | dissipate | am so sick of that |
| 01:38 | mullr_ | chord: Not trying to be antisocial, but I imagine the channel denizens would appreciate it if most chatter was on topic. |
| 01:38 | dissipate | mullr_, he wants to make a starcraft clone in clojure |
| 01:39 | chord | mullr_ channel dead they're not even watching this window so it doesn't matter what we talk about |
| 01:39 | mullr_ | dissipate: In this case I look forward to the demo |
| 01:39 | chord | FINALLY someone who doesn't hate starcraft |
| 01:44 | chord | mullr_ what projects have you worked on |
| 01:45 | mullr_ | mullr_: In clojure? This and that. Some NLP / web data extraction, currently doing parser work. Outside of that, spent a lot of time doing consumer photo software. Yourself? |
| 01:46 | chord | mullr_ I'm a loser who gets no respect from this channel |
| 01:48 | mullr_ | chord: I'm going to go out on a limb here and assume I'm not just feeding the trolls. What have you worked on? |
| 01:48 | chord | www.github.com/chord-rts/rts |
| 01:49 | mullr_ | A noble goal, if far from a starcraft clone |
| 01:49 | chord | mullr_ i just learned how to make a window |
| 01:50 | chord | mullr_ these assholes in this channel won't help me get it to a full blown starcraft clone |
| 01:50 | TEttinger | mullr_: http://replygif.net/i/149.gif |
| 01:50 | mullr_ | chord: What's your programming background? |
| 01:51 | mullr_ | chord: This asshole isn't going to help you either... |
| 01:51 | chord | I use Go but I got banned from #go-nuts, then I read learn you a haskell but I got banned from #haskell, so that meant couldn't make a game in Go or haskell, so i came to this channel |
| 01:52 | chord | also got banned from #python and #ruby |
| 01:52 | chord | so clojure is my only language that I can use to assemble a team |
| 01:52 | mullr_ | And this is the day I got trolled on #clojure. Welcome to IRC, me! We're done here. |
| 01:52 | chord | mullr_ no bro I've changed |
| 01:53 | TEttinger | mullr_, /ignore has been wonderful for this |
| 01:53 | chord | mullr_ I don't troll anymore the code I showed you is proof that I've changed |
| 01:53 | dissipate | is there a failure here to ban trolls? |
| 01:53 | mullr_ | done |
| 01:53 | TEttinger | he's used different IPs. |
| 01:53 | chord | mullr_ come on bro I'm going to implement an A* demo to prove that I'm not trolling anymore |
| 01:53 | mullr_ | merely a failure to avoid feeding them, I apologize. |
| 01:54 | TEttinger | it's fine |
| 01:54 | chord | *cry cry cry* nobody likes me anymore *cry cry cyr* |
| 01:54 | TEttinger | *@*ip.50.47.83.14 is what I use for the filter |
| 01:56 | TEttinger | mullr_, I'm curious about this parser work. Do you use instaparse? |
| 01:57 | mullr_ | TEttinger: I'm in clojurescript, so I've been rolling my own. I have some unique requirements as well… I'm trying to get good integration with Codemirror, both syntax highlighting and completion |
| 01:58 | mullr_ | in principle instaparse would be quite good at this, or at least the parsing with derivatives idea in general, since it reifies its parser state so clearly |
| 01:58 | TEttinger | I know some of these words |
| 01:59 | TEttinger | parsing is pretty over my head at this point |
| 01:59 | mullr_ | hehe, sorry, I've been working on this for some time and tend to get caught up in it |
| 01:59 | chord | mullr_ if I get a demo of A* working will you help with starcraft clone project? |
| 01:59 | mullr_ | There's a good talk on the theory instaparse is based on, if you're interested: http://www.youtube.com/watch?v=ZzsK8Am6dKU |
| 01:59 | TEttinger | I've been wondering about clojure-in-clojure and how it could work on a different platform, like luajit |
| 01:59 | mullr_ | although that's not exactly what I'm using |
| 02:00 | mullr_ | TEttinger: what do you mean? |
| 02:01 | TEttinger | well outputting instead of JS, Lua, but since lua only has one data structure, it could use luajit's FFI types to have some data types implemented in C to use in clojure |
| 02:01 | ambrosebs | isn't there a lua target already? |
| 02:01 | TEttinger | the advantage would be easier interop with C in a dynamic way, I think. |
| 02:02 | TEttinger | :D |
| 02:02 | mullr_ | https://github.com/takeoutweight/clojure-scheme may meet some of the same goals |
| 02:03 | mullr_ | Indeed, https://github.com/raph-amiard/clojurescript-lua at least exists |
| 02:04 | TEttinger | mullr_, beat me to it :) |
| 02:04 | muhoo | for some reason i think the official music of lua should be goa |
| 02:04 | dissipate | mullr_, why not just compile for LLVM? |
| 02:06 | TEttinger | dissipate: was that meant for me? I do think LLVM is excellent, but so is LuaJIT |
| 02:06 | TEttinger | LLVM has some issues running on windows last I checked, or at least clang did |
| 02:06 | dissipate | TEttinger, with LLVM, clojure could compete with the GHC. |
| 02:07 | TEttinger | dissipate, hell it could interoperate |
| 02:07 | mullr_ | dissipate: Huh? You mean clojure code? Well, none of these projects are mine, but I'm sure someone's doing that too. The trouble with all these things is that clojure really wants a JIT with method inlining and puts lots of pressure on the GC. |
| 02:07 | TEttinger | F# has an LLVM port too |
| 02:07 | dissipate | TEttinger, i read GC support in LLVM is bad though |
| 02:08 | TEttinger | might be better to do it in LuaJIT, since you could (and someone already has) reused so much of cljs |
| 02:08 | TEttinger | I imagine targeting lua is much easier than targeting llvm opcodes |
| 02:09 | dissipate | mullr_, i see. i wonder how good the GC will be on LLVM |
| 02:09 | dissipate | TEttinger, but you get good optimization on LLVM, no? |
| 02:10 | TEttinger | I think on both |
| 02:10 | TEttinger | LuaJIT is scary fast, I've had it occasionally outpace MSVC even with aggressive optimization |
| 02:11 | dissipate | TEttinger, what architectures are supported for LuaJIT? |
| 02:11 | TEttinger | a lot now. |
| 02:11 | TEttinger | ARM and PPC as well as all common desktop arches |
| 02:11 | mullr_ | LLVM will give you *static* optimization. Clojure's design relies on the fact that virtual method calls will be optimized at runtime. |
| 02:12 | Pupnik__ | TEttinger: are you volunteering to write a lua output for the cljs compiuler :) |
| 02:12 | TEttinger | Pupnik__, I have a starcraft clone to right first |
| 02:12 | TEttinger | *write |
| 02:12 | mullr_ | no way, I'm writing it first :) |
| 02:12 | alisdair | TEttinger: it's ok, he's doing it in #erlang now |
| 02:13 | TEttinger | alisdair, thank you, you are an angel |
| 02:13 | dissipate | mullr_, what about clojure on the parrot vm? |
| 02:13 | mullr_ | beats me, I know very little about parrot. |
| 02:13 | TEttinger | parrot has some issues with speed I think |
| 02:13 | dissipate | mullr_, i think one of the main Perl 6 compilers is for parrot |
| 02:13 | mullr_ | Here's an interesting through experiment: if you were to design a VM especially for clojure, what would it look like? How would it be different from other VMs and why? |
| 02:13 | mullr_ | s/through/thought/ |
| 02:13 | TEttinger | I seem to recall they changed the way you called the VM so many times, that only Perl 6 could keep up with the changes |
| 02:14 | clojurebot | Titim gan éirí ort. |
| 02:14 | chord | alisdair wtf are you stalking me? |
| 02:14 | TEttinger | mullr_, ooh. |
| 02:14 | alisdair | no i was in #erlang when you joined |
| 02:14 | dissipate | mullr_, it could be a self hosted VM. |
| 02:15 | TEttinger | honestly, clojurescript comes close already, since it runs, everywhere. |
| 02:15 | TEttinger | which I think is the main demand |
| 02:15 | TEttinger | and the hardest thing, really |
| 02:15 | mullr_ | For reference, see http://www.cs.utah.edu/~mflatt/past-courses/cs6510/public_html/lispm.pdf, but also consider how immutably mostly everywhere can affect the garbage collector |
| 02:16 | TEttinger | mullr_, I think clojure really can use mutability for some things though |
| 02:16 | dissipate | TEttinger, yeah, but javascript is not desirable as a target, is it? |
| 02:16 | TEttinger | dissipate, maybe. a lot of things do target it |
| 02:16 | TEttinger | $google altjs |
| 02:16 | lazybot | [altJS - Web coding without JavaScript.] http://altjs.org/ |
| 02:16 | dissipate | TEttinger, yes, almost every language does. |
| 02:17 | dissipate | TEttinger, or rather there is a language X to JS compiler for almost every language X |
| 02:17 | mullr_ | TEttinger: *mostly*. I think a garbage collector that assumes everything is mutable is quite different than one that assumes most things are immutable. I particular, you can't build circular references out of immutable parts and thus can in principle use a native reference counting scheme with no chance of error. |
| 02:17 | TEttinger | heh indeed |
| 02:17 | mullr_ | *in* |
| 02:17 | mullr_ | *naive* |
| 02:18 | dissipate | mullr_, that's a great point, i never realized that. |
| 02:18 | dissipate | mullr_, since the JVM assumes mutability, it is not optimized for immutable data structures |
| 02:19 | mullr_ | dissipate: When you read about garbage collectors, they're mostly worried about cycles and about things changing out from under you; neither if which is a problem in immutable-land. But this is just a thought, not the result of experience or experiment. |
| 02:20 | TEttinger | dissipate, this could be very cool. the problem is you need to interop with mutable state in some way for most programs, and the OS probably isn't using CLJVM-compatible concurrency primitives for OpenGL access or whatever |
| 02:20 | Pupnik__ | TEttinger: if that lua target for the cljs compiler just outputs plain old lua theres nothing stopping you frmo running it on luajit |
| 02:20 | dissipate | TEttinger, what do you think about switching browsers over to a bytecode based virtual machine that can access the DOM? forget about javascript. |
| 02:20 | Pupnik__ | since it targets 5.1 |
| 02:21 | TEttinger | dissipate, oh man I have thought about alternate internet formats for a little while now |
| 02:21 | TEttinger | it's all pie-in-the-sky, but it has a lot of potential |
| 02:22 | TEttinger | (that would never kick in unless there's some SOPA-style crippling regulation on the WWW) |
| 02:22 | dissipate | TEttinger, what do you think of just streaming instructions? |
| 02:23 | dissipate | browsers would just be sandboxed thin apps that received instructions on the fly |
| 02:27 | TEttinger | I was thinking of a more declarative format, I dunno. Something that can be stored entirely on the client-side and thus be hosted by peers as well as servers |
| 02:28 | dissipate | TEttinger, S expressions no doubt |
| 02:28 | TEttinger | you bet. |
| 02:29 | TEttinger | the other advantage to using an S-Exp-based web format is how easily they could be piped from webpage to webpage |
| 02:29 | dissipate | TEttinger, you do know that the original author of javascript wanted to use Scheme, but that was rejected because it was too 'radical' of a language for developers? |
| 02:29 | TEttinger | yep |
| 02:30 | TEttinger | so he made a lot of scheme's qualities have a C-like syntax |
| 02:30 | dissipate | ok, just checking. :P |
| 02:30 | TEttinger | and then MS made VBScript and screwed up the net :P |
| 02:30 | TEttinger | "we can't be compatible, they're competitors!" |
| 02:31 | dissipate | i think the browser loading any kind of language is an old idea. i think it should all be some kind of bytecode. no more HTML, Javascript, CSS. |
| 02:32 | dissipate | compile your stuff server side with whatever tools |
| 02:32 | TEttinger | I like the idea of clojailing everything and just executing clojure for webpages. |
| 02:32 | echo-area | Isn't javascript being described as "the assembly language" in clojurescript's introduction? |
| 02:33 | dissipate | echo-area, yes, that's precisely what i am getting at. javascript is just turning into a bytecode, or 'assembly'. might as well just replace it with bytecode and get rid of this language war nonsense. |
| 02:35 | Pupnik__ | TEttinger: and peoples browser memory use will get even more crazy than it already is if they have to run JVMs instead of a JS vm |
| 02:35 | muhoo | idle wonderment: has anyone used instaparse to parse javascript and had it actually work? |
| 02:37 | dissipate | Pupnik__, i'm not talking about JVM. some other VM that can access the DOM directly. |
| 02:37 | TEttinger | dissipate, have you seen Google Native Client? |
| 02:37 | echo-area | dissipate: Maybe javascript would become the de facto "bytecode" language, because it's involved spontaneously |
| 02:37 | TEttinger | dissipate, I think that was in reference to when I said clojail, which uses the JVM |
| 02:37 | dissipate | TEttinger, nope, haven't tried it. |
| 02:38 | TEttinger | it's bytecode for chrome |
| 02:38 | TEttinger | and chromium |
| 02:38 | TEttinger | $google google native client |
| 02:38 | lazybot | [nativeclient - Native code for web apps - Google Project Hosting] http://code.google.com/p/nativeclient/ |
| 02:38 | dissipate | echo-area, that's what is happening. except there is a faction of developers who like javascript and they think it should be the 'everywhere' language. |
| 02:38 | Cua | TEttinger: isn't it native code for the platform? x86/arm/etc.. |
| 02:38 | Cua | where they use static analysis to make sure the binary behaves |
| 02:38 | dissipate | TEttinger, interesting. definitely checking it out. |
| 02:39 | echo-area | dissipate: Good to know |
| 02:40 | dissipate | TEttinger, looks like a competitor to asm js and HTML5 |
| 02:41 | TEttinger | heh. but it is meant to port complex C/C++ apps to the browser |
| 02:41 | dissipate | TEttinger, yeah, the language restriction is lame. |
| 02:41 | TEttinger | by running x86 in the browser, effectively |
| 02:41 | dissipate | TEttinger, what about ARM for mobile devices? |
| 02:42 | TEttinger | I think it interprets it actually, but I don't really know |
| 02:42 | TEttinger | However, to run on different instruction set architectures (such as x86-32 and x86-64), you currently have to build and supply a separate .nexe file for each architecture. See target architectures for details about which .nexe files will run on which architectures. Portable Native Client will remove the requirement to build multiple .nexe files. |
| 02:44 | TEttinger | https://developers.google.com/native-client/announcements ah, they're getting close |
| 02:44 | TEttinger | PNaCl is basically sandboxed LLVM opcodes |
| 02:45 | dissipate | TEttinger, Sounds pretty restrictive. sure it has its use cases though. |
| 02:45 | TEttinger | yeah, Bastion ported a large SDL app with it |
| 02:45 | TEttinger | I think Bastion was monogame actually |
| 03:41 | sm0ke | hello i am opening a number of sockets using (with-open (repeatedly n (open-socket..))) but problem is close is not called on each sequence, any nice solution to this? |
| 03:41 | sm0ke | i mean not called on each item in sequence |
| 03:43 | mullr_ | well, you'd want to do the open on the socket itself, not the sequence, right? |
| 03:43 | sm0ke | mullr_: yea i know whats wrong there.. |
| 03:44 | sm0ke | mullr_: just want a elegant way to open multiple sockets |
| 03:45 | mullr_ | Well, it's never easy to do that with open-socket unfortunately. |
| 03:45 | mullr_ | sorry, with-open |
| 03:45 | rhg^-1 | pmap an anonymous function |
| 03:45 | mullr_ | that's a good idea |
| 03:46 | sm0ke | the problem is that although i can call close on each one..but i also want to return something from the socket as functions return value |
| 03:46 | rhg^-1 | I tend to hands those at 2am lol |
| 03:46 | sm0ke | so close cant be last statement |
| 03:46 | SegFaultAX | Using map for side-effects is an anti-pattern. |
| 03:46 | sm0ke | although i guess i can use try finally |
| 03:46 | rhg^-1 | True |
| 03:47 | chord | So here is a question how do I do the pathfinding in starcraft 2 |
| 03:47 | rhg^-1 | do seq |
| 03:47 | SegFaultAX | chord: Start simple. |
| 03:47 | chord | SegFaultAX: how does that help |
| 03:48 | SegFaultAX | chord: Pathfinding on a large scale can be very challenging to do efficiently. |
| 03:48 | sm0ke | why is using map in side effect code an antipattern? |
| 03:49 | chord | SegFaultAX: I keep reading about A* on nav mesh, but what exactly does that mean |
| 03:49 | nightfly | I've wondered how path finding even works in a vector rather than a raster space |
| 03:49 | sm0ke | how will i generate a seq from each socket by reading data than? |
| 03:49 | metellus | sm0ke: map is lazy, so the side effects don't actually happen until the seq is realized |
| 03:49 | rhg^-1 | It's for processing lists to lists |
| 03:49 | dobry-den | why not (let [result ...] (close-sockets) result) |
| 03:49 | dobry-den | sm0ke: |
| 03:49 | rhg^-1 | Not effects |
| 03:49 | SegFaultAX | sm0ke: Why are you managing sockets directly? |
| 03:49 | rhg^-1 | Semantics |
| 03:49 | chord | SegFaultAX: tell me that you're a path finding expert |
| 03:50 | sm0ke | dobry-den: thanks for that ugly tip :D :) gonna us that |
| 03:50 | sm0ke | use* |
| 03:50 | SegFaultAX | chord: I'm not, but used to work in games. That wasn't really my area, but incremental pathfinding was a challenge. |
| 03:50 | SegFaultAX | (Especially on relatively resource constrained mobile devices) |
| 03:51 | sm0ke | i guess i can use (for) instead of (map) for side effect code |
| 03:51 | hyPiRion | no |
| 03:51 | dobry-den | doseq |
| 03:51 | hyPiRion | ^ |
| 03:51 | rhg^-1 | ^ |
| 03:51 | sm0ke | eee doseq doesnt 'yield' its just iteratoin right? |
| 03:51 | dobry-den | map and for will return a collection of intermediate values. doseq doesnt |
| 03:51 | sm0ke | why isnt there a yield in clojure |
| 03:52 | sm0ke | dobry-den: yes yes |
| 03:52 | dobry-den | well, if you have side-effect with a return value, i'd prob use for. |
| 03:52 | chord | SegFaultAX: what do you mean is a problem, starcraft 2 does pathfinding just fine it seems |
| 03:52 | sm0ke | dobry-den: thansk again for verifiying |
| 03:53 | hyPiRion | I'd probably use naov |
| 03:53 | hyPiRion | mapv* |
| 03:53 | rhg^-1 | I'd say it's a code smell |
| 03:53 | SegFaultAX | hyPiRion: Don't you hate when your fingers are a key off? |
| 03:53 | hyPiRion | SegFaultAX: haha, yeah |
| 03:53 | SegFaultAX | chord: I didn't say impossible, just challenging. |
| 03:53 | dobry-den | probably but sm0ke should prob arrive at version1.0 first |
| 03:54 | dobry-den | before dicking around with WWJD |
| 03:54 | sm0ke | whats WWJD? |
| 03:54 | SegFaultAX | I guessed "what would java do" |
| 03:54 | dobry-den | what would jesus do |
| 03:54 | sm0ke | Haha nice one... |
| 03:55 | sm0ke | WWSD: what would SegFaultAX do |
| 03:55 | rhg^-1 | K... |
| 03:55 | SegFaultAX | sm0ke: Not manage sockets directly. Use a library. |
| 03:55 | rhg^-1 | +1 |
| 03:56 | sm0ke | SegFaultAX: sorry but imo thats superficial to say unless you dont know what i am doing |
| 03:56 | SegFaultAX | sm0ke: Unless you're writing a socket library, it doesn't really matter to me. |
| 03:57 | SegFaultAX | Managing socket pools or [insert resource here] pools in general is a solved problem, particularly in Java land. |
| 03:57 | chord | ok team here is a next group project: figure out how starcraft 2 does path finding then produce a proof of concept working example |
| 03:57 | chord | ok teamt break lets go |
| 03:57 | sm0ke | i am just opening a number of ephermal sockets using (java.net.ServerSocket. 0) and getting their ports ... i'd say using a library for that is overkill |
| 03:57 | SegFaultAX | sm0ke: Ok, why are you doing this? |
| 03:57 | sm0ke | SegFaultAX: to get buch of free ports? |
| 03:58 | sm0ke | bunch* |
| 03:58 | dobry-den | (SocketServer. post) and then binding io/input-stream and io/output-stream to client sockets is pretty standard fare. |
| 03:59 | dobry-den | i think there's plenty of socket stuff you can do without needing a library |
| 03:59 | dobry-den | i thought java was the library |
| 04:00 | sm0ke | i agree...you can really make an irc client with a simple socket if you know what coming down the wire |
| 04:00 | sm0ke | dont need an irc library |
| 04:00 | dobry-den | yeah, so i imagine SegFaultAX is thinking of something more complex than some telnet shit |
| 04:00 | sm0ke | yes you never know WWSD |
| 04:01 | dobry-den | never a dull moment with WWSD |
| 04:04 | SegFaultAX | One of the traits I look for when hiring engineers is judgement. Some people like to use a library or framework for /everything/, others only when it's absolutely necessary (NIH syndrome). In my experience, discovering where someone falls on that continuum can tell you a lot about their judgement and overall experience. |
| 04:05 | dobry-den | in clojure, i find that it's too easy to find myself rolling everything myself. |
| 04:06 | dobry-den | shaving all the yaks |
| 04:08 | SegFaultAX | Well that's sorta my point though, part of growing as an engineer is learning how and when to pick your battles. No answer is objectively right in all situations, but knowing when to shave a yak or using a freshly shorn yak from someone else is an important skill. |
| 04:08 | SegFaultAX | Maybe one of /the/ important skills. |
| 04:09 | chord | starcraft 2 path finding |
| 04:09 | chord | come on guys help me |
| 04:09 | chord | just this one time |
| 04:09 | chord | then you can ignore me |
| 04:09 | SegFaultAX | So yea, if you're bullshitting around and writing something for fun, whatever. If you're building something that you actually anticipate using or maintaining for any length of time, it might be worth the extra 5 minutes of googling to see if someone else has already shaved your yaks for you. |
| 04:10 | Jarda | SegFaultAX: but with clojure you can achieve what you need in 15-25 lines of code, instead of going through the code of someone else that does effectively the same that you try to accomplish |
| 04:11 | chord | Jarda: you are a path finding expert right |
| 04:11 | Jarda | like input validation etc. Everything I've found is so massive that I find it easier to just write 20 lines of own input validation logic |
| 04:11 | sm0ke | chord: hey who told you to write a game in clojure? |
| 04:12 | Jarda | than to use half an hour trying to find out how to implement |
| 04:12 | sm0ke | i really think thats a strange decision |
| 04:12 | chord | sm0ke: how the hell does starcraft 2 do pathfinding, its something to do with a* and nav mesh but its hard to find gritty details |
| 04:12 | sm0ke | chord: i dont know starcraft sorry |
| 04:13 | chord | sm0ke: but you know path finding |
| 04:13 | sm0ke | yea i find my way to home everyday :D |
| 04:13 | sm0ke | what kind of path finding you can use dijkastras? |
| 04:14 | chord | sm0ke: i'm talking about not on a grid but on a polygonal area |
| 04:14 | sm0ke | there are fancy things like a*..but thats when you have grid layout with abstacles |
| 04:14 | dobry-den | i can't tell if this constant chord/sc2 thing is an endless joke or if you're really staking out #clojure for the offchance someone can spill the beans on sc2 implementation. |
| 04:14 | SegFaultAX | Jarda: Again, knowing when to invent and when to reuse is a _skill_ |
| 04:15 | chord | dobry-den: if you know how to do starcraft 2 like path finding i'm listening |
| 04:15 | sm0ke | wtf is pathfinding on plygon? |
| 04:15 | SegFaultAX | And it's very often that there isn't a right answer. Then you have to go on gut or team consensus. |
| 04:15 | chord | sm0ke: look in most modern 3d games you can move in any direction not just constrained to a grid right? |
| 04:15 | glosoli | hey folks, just want to make sure, the best way to check if something that should be a varchar field fetches from database is not nil, by invoking it as a parameter to nil? |
| 04:15 | Jarda | SegFaultAX: but in my short experience with clojure comparing to other languages I find doing stuff myself with clojure often quick and effective |
| 04:16 | Jarda | because the syntax is so powerful |
| 04:16 | sm0ke | SegFaultAX: eee man we got your point but lets be realistic some an already written library is not the nest anwser..that it! |
| 04:16 | sm0ke | sometimes* |
| 04:16 | sm0ke | best* |
| 04:16 | sm0ke | crap |
| 04:16 | SegFaultAX | Jarda: Sure, but it's not just about LOC. You're also trading off productiveness, time spent debugging, documentation, etc. |
| 04:17 | chord | OK LOOK CLOJURE IS JUST GOOD CAN WE GO BACK TO STRARCRAFT 2 PATHFINDING PROBLEM |
| 04:17 | sm0ke | chord: yes but why dont you divide your map into sectors than its grid with abstacles! |
| 04:17 | dobry-den | glosoli: maybe if it's an assertion, but usually db-fetches are done in something like a (when-let [user (db/find-user id)] ...) |
| 04:17 | SegFaultAX | chord: Please stop spamming. |
| 04:18 | Jarda | SegFaultAX: yeah but if your code is there visible to you and it's not complex debuggin is easy. If you are using something off-the-shelf you have a black box you would have to dive into to understand what happens |
| 04:18 | chord | sm0ke: how does that give you paths with arbitrary angles |
| 04:18 | glosoli | dobry-den: well table row is retrieved just fine, it's just the case where I am interposing description field (varchar) which might be nil at some point, what I was doing at the moment is (when-not (nil? |
| 04:19 | Jarda | but yeah, I'm of course using ring and compojure and friends to not invent the (complex) wheels |
| 04:19 | SegFaultAX | Jarda: Well, that all depends. Anyway, you get the idea. |
| 04:19 | sm0ke | chord: no it wont but once you have a sector to sector path..you can take two sectors in a path and do fancy stuff with optimal direction |
| 04:21 | SegFaultAX | chord: Just pre-compute the path finding nodes for each map. |
| 04:21 | chord | SegFaultAX: and how does that help |
| 04:21 | dobry-den | glosoli: do you have a code example |
| 04:22 | SegFaultAX | chord: You don't need to do pixel perfect pathfinding (you wouldn't want to anyway, it's too expensive and the precision doesn't buy you anything) |
| 04:23 | SegFaultAX | chord: If you precompute the pf grid, it's much less expensive to do large scale pathing. |
| 04:23 | chord | SegFaultAX: I found a blog on it http://www.third-helix.com/2011/03/gdc-2011-ai-summit/ |
| 04:23 | SegFaultAX | And potentially simpler to implement, since you can determine ahead of time static obstacles like terrain. |
| 04:24 | chord | SegFaultAX: need you to translate it to english |
| 04:24 | glosoli | dobry-den: http://bpaste.net/show/4kHN2dvh1KXn1HM6qxAS/ checking for retrieving row and etc, is done before, this is only part when I want to format the description field which contents are optional |
| 04:24 | glosoli | dobry-den: though I made a mistake in bpaste it's not doc but description |
| 04:25 | chord | SegFaultAX: I tried reading the blog it I had no clue what it was talking about http://www.third-helix.com/2011/03/gdc-2011-ai-summit/ |
| 04:27 | dobry-den | glosoli: that looks pretty standard although i'd just do (when description ...) unless you need to differentiate between nil and false |
| 04:27 | glosoli | dobry-den: aah I don't, ok thaks! :) |
| 04:28 | glosoli | thanks" |
| 04:34 | chord | SegFaultAX: did you read the blog post |
| 04:42 | chord | SegFaultAX are you there? |
| 04:42 | chord | dobry-den: did you read the blog? |
| 05:56 | chord | you are all dumb |
| 05:56 | chord | did you know that |
| 05:56 | chord | yah you didn't know it so I'm telling you |
| 06:31 | glosoli | Hmm I found some code where syntax quotes are used at the end of the var name, what's the purpose of it ? i.e. (status-change! db' id nil current-status initiator-id) |
| 06:34 | ciphergoth | Just run "slamhound" over my sources, and it's got rid of all the things that say eg (:require [foo.bar.baz]) |
| 06:34 | ciphergoth | where I refer to foo.bar.baz/quux in the sources |
| 06:35 | ciphergoth | Is there a way to prevent that? |
| 06:41 | ciphergoth | (:use [foo.bar.baz :only [quux]]) becomes (:require [foo.bar.baz :refer [quux]]) and that's fine, (:require [foo.bar.baz :as baz]) is copied over unchanged and that's also fine. |
| 07:43 | sm0ke | is it possible to figure out from where i am getting a dependency like log4j |
| 07:43 | sm0ke | in lein |
| 07:44 | mullr | sm0ke: I seem to remember a way to print the dependency tree |
| 07:44 | TEttinger | lein deps :tree ; ? |
| 07:44 | sm0ke | TEttinger: awesome |
| 07:45 | mullr | how delightfully legible :) |
| 07:45 | TEttinger | take out the ; ? |
| 07:45 | TEttinger | I don't know if it works or if it goes by a different command |
| 07:47 | TEttinger | wow nice, it works |
| 07:47 | sm0ke | its actually very nicely printed..god job lein |
| 07:47 | sm0ke | the best ive ever seen |
| 07:50 | utkarsh | what is the current preferred way to run small clojure scripts quickly (jvm boot)? "drip"? |
| 07:50 | utkarsh | or is there something better/new? |
| 07:55 | hyPiRion | not yet, afaik |
| 08:47 | s4muel | utkarsh: https://github.com/technomancy/grenchman |
| 08:51 | Jookia | Does Clojure handle Unicode in implementation or in its standard? Or not at all? |
| 08:52 | clgv | Jookia: the JVM handles Unicode ;) |
| 08:52 | Jookia | clgv: So if I write an application in Clojure, it's Unicode status is implementation defined, meaning moving to something like Javascript will ruin things? |
| 08:53 | clgv | Jookia: huh? what exactly do you mean? |
| 08:54 | utkarsh | s4muel: ah, thanks, will check it out. |
| 09:09 | john2x | I have a macro which defn's a function from a string. I want to apply it to a list of strings. I'm trying (doall (map)) but it's not working. https://www.refheap.com/19169 |
| 09:14 | Jookia | clgv: I mean, in C++ strings are made of chars which are usually 8 bits. What does Clojure define chars as? |
| 09:15 | clgv | Jookia: clojure does not define them. the JVM does with its String and Char classes |
| 09:15 | Jookia | clgv: Oh. |
| 09:21 | clgv | john2x: you cant do that via the functions doall+map |
| 09:22 | john2x | clgv: i'll have to call the macro for each string? |
| 09:22 | clgv | john2x: you need a macro to do it |
| 09:23 | john2x | ok, so a second macro which accepts a vector of strings? |
| 09:24 | clgv | john2x: yeah and maybe the macro you apply the strings to if that generality is useful |
| 09:26 | john2x | hmm how would this second macro look like? I still can't use doall+map to apply the first macro over the strings? |
| 09:33 | jagaj | is there somewhere that describes a basic and modern clojure + emacs setup (that isn't a video)? everything I'm finding is pretty old. |
| 09:38 | jstew | jagaj: Not really. There's a good very basic tutorial at http://www.braveclojure.com/using-emacs-with-clojure/. Doesn't tell you how to set up paredit/nrepl/clojure mode though |
| 09:43 | clgv | john2x: (defmacro mapply [m & args] `(do ~@(map (fn [x] `(m ~x)) args))) |
| 09:44 | clgv | oh little error |
| 09:44 | edw | I've been getting illegal access errors on starting nrepl recently with a 'pp does not exist' exception and stacktrace. Anyone else seen this? |
| 09:44 | clgv | john2x: (defmacro mapply [m & args] `(do ~@(map (fn [x] (list m x)) args))) |
| 09:45 | john2x | clgv: wow, thanks! |
| 09:47 | clgv | np |
| 09:52 | john2x | trying to understand the macro, why doesn't (do (map #((list m %)) args)) work? |
| 09:53 | john2x | i mean why does it need to be done in a macro? |
| 09:56 | clgv | john2x: because it needs to be executed at macro expansion time (or compile time) whereas your doall+map is executed at runtime |
| 09:57 | john2x | ah, makes sense. thanks again! |
| 10:02 | mimieux | |
| 10:24 | edw | I've been getting illegal access errors on starting nrepl recently with a 'pp does not exist' exception and stacktrace. Anyone else seen this? |
| 10:26 | seangrov` | Is there a good lein template for starting a new clojure web-server project? |
| 10:30 | jonasen | seangrov`: lein new compojure <name>? |
| 10:41 | sm0ke | hello i am using edn for configuring my project...do i write every property down in a giant map? is that idomatic? |
| 10:43 | clgv | sm0ke: you could. but if it is natural for your application you can also use nested maps |
| 10:44 | sm0ke | clgv: thanks that makes sense ...to nest ealted config props in one key as another map |
| 10:44 | sm0ke | related* |
| 10:46 | sm0ke | hmm i think someone should send a patch to fireplace to classify .edn also as a clojure source |
| 10:46 | mdrogalis | sm0ke: Sometimes I do [{..} {..} {..}] |
| 10:46 | mdrogalis | Akin to Datomic's schema format. |
| 10:49 | sm0ke | mdrogalis: how does that helps with reading simple config at all? |
| 10:50 | mdrogalis | sm0ke: It depends on your circumstances. It's just another option to know about. |
| 10:51 | sm0ke | yea i guess mix and match clojure data structures as needed |
| 10:54 | sm0ke | so another question...how do i get a file on classpath? easy clojure way |
| 10:55 | mdrogalis | sm0ke: Are you using Leiningen? |
| 10:55 | llasram | sm0ke: clojure.java.io/resource |
| 10:55 | lunk | ,(let-fn [(foo [x] (+ 5 x))] (foo 7)) |
| 10:55 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: let-fn in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 10:56 | sm0ke | llasram: thanks |
| 10:56 | Bronsa | lunk: it's letfn |
| 10:56 | Bronsa | ,(letfn [(foo [x] (+ x 5))] (foo 7)) |
| 10:56 | clojurebot | 12 |
| 10:57 | lunk | !!! |
| 10:57 | lunk | hah, it was a more basic error than i thought |
| 10:57 | lunk | thanks |
| 11:00 | wakeup | hi |
| 11:02 | sm0ke | i am getting a Cyclic load dependency among my namespaces what should i do? |
| 11:04 | sm0ke | i must be doing things the wrong way i gues |
| 11:04 | vijaykiran | sm0ke: separate out common functions into a different namespace |
| 11:05 | wakeup | Using compojure: How do I access ring's sessions? |
| 11:06 | sm0ke | vijaykiran: thanks |
| 11:07 | vijaykiran | wakeup: request should have a session key .. you can read it in handler functions |
| 11:07 | wakeup | Ah I got it |
| 11:08 | wakeup | was doing bad destructuring |
| 11:08 | wakeup | ok |
| 11:09 | wakeup | does anybody know by coincidence if/how I can get a list of all |
| 11:09 | wakeup | session maps? |
| 11:34 | seangrov` | How do I specify multiple dynamic class names in a hiccup template? |
| 11:35 | seangrov` | Right now I have something like [:a {:class (str name " " "logo")} "..."], but it seems pretty ugly |
| 11:41 | klrr_ | clojure vs racket, which is best |
| 11:42 | nDuff | Depends on what you want. |
| 11:42 | klrr_ | i want lisp |
| 11:42 | nDuff | Racket is probably a better teaching language. It certainly has a much more flexible parsing model. |
| 11:42 | nDuff | *shrug*. Too big a question to answer definitively. |
| 11:42 | klrr_ | im talking about #lang racket, not their HTDP book |
| 11:43 | nDuff | ...but if "I want LISP" means you care about purity over practicality, go with Racket. |
| 11:43 | klrr_ | purity as in pure functions or purity as in something else? |
| 11:44 | nDuff | About willingness to make design decisions that trade against practicality. |
| 11:44 | klrr_ | nDuff: well, i dont got problem thinking functionally if that's what you mean |
| 11:45 | klrr_ | so, racket is "more" functional than clojure? i thought clojure advocated FP |
| 11:45 | nDuff | I didn't say anything about that. |
| 11:45 | Chousuke | I don't think racket is less pragmatic than clojure, really |
| 11:45 | `cbp | I want to learn racket to study math as inspired by Sussman's talk. |
| 11:45 | Chousuke | Clojure just runs on the JVM which can be a major practical benefit. |
| 11:46 | nDuff | klrr_: ...Clojure's preference for immutible data by default probably makes it a bit more FP-friendly, though you can certainly do proper FP programming in Racket. |
| 11:46 | klrr_ | im not talking about ecosystem or implementation, im tlaking about language itself |
| 11:46 | klrr_ | okey |
| 11:46 | bbloom_ | klrr_: why don't you read http://clojure.org/rationale and a bit of http://racket-lang.org/ to get a feel |
| 11:46 | bbloom_ | then try one or both for a while for your particular use cases |
| 11:46 | Chousuke | klrr_: in Clojure's case, those are the same thing |
| 11:46 | bbloom_ | they are both great languages |
| 11:47 | sm0ke | lein guys why doesnt lein uberjar makes a runable one? |
| 11:47 | sm0ke | i meant hey guys |
| 11:47 | sm0ke | :/ |
| 11:47 | klrr_ | ive been writing a IRC bot in racket since last week, first i tried a proper functional design, but did not work, now im doing a trigger-event design, and program still dont work |
| 11:47 | `cbp | sm0ke: you can java -jar the uberjar |
| 11:47 | bbloom_ | klrr_: maybe spend some time studyign https://github.com/flatland/lazybot |
| 11:48 | klrr_ | gonna check it out, but i suck at reading code |
| 11:48 | Chousuke | klrr_: well, "don't work" really doesn't say much about what is wrong :P |
| 11:48 | bbloom_ | klrr_: then i suggest learning how to do that before learning clojure or racket ;-) |
| 11:48 | nDuff | sm0ke: if your OS is set up right, you don't need shebang magic for a jar to be runnable. |
| 11:48 | Chousuke | it's probably not a problem with the language though |
| 11:48 | nDuff | sm0ke: Linux has had the ability to pick interpreters based on file magic for ages, and Windows does the same based on extensions. |
| 11:48 | klrr_ | it compiles but dont work |
| 11:49 | Chousuke | well you have a bug, then |
| 11:49 | Chousuke | or several |
| 11:49 | sm0ke | `cbp: its doesnt run like that |
| 11:49 | klrr_ | thanks for info |
| 11:49 | nDuff | sm0ke: ...then we'd need a reproducer. |
| 11:49 | sm0ke | `cbp: i already have a :main in project.clj..and lein run also works |
| 11:49 | `cbp | sm0ke: then you're missing a main namespace, a -main function and a :gen-class on the main name space i think |
| 11:49 | llasram | nDuff: Most Linux distros these days have disabled that for JAR files though. In practice it doesn't work well for JARs, because you almost always need setup the environment or pass other command line options, etc |
| 11:50 | `cbp | sm0ke: then maybe you're missing the :gen-class |
| 11:50 | `cbp | sm0ke: an error message after you do java -jar would be helpful :P |
| 11:50 | sm0ke | wait ..i get this error ..Error: Could not find or load main class my_project.core |
| 11:51 | `cbp | sm0ke: you're missing (:gen-class) in that namespace |
| 11:51 | seangrov` | Is there a better way of destructuring this? https://www.refheap.com/a0bbfac3c320ab92aaafa878f |
| 11:52 | sm0ke | `cbp: but why doesnt `lein run` requires a gen-class |
| 11:52 | EchoBot1 | Echo: `cbp: but why doesnt `lein run` requires a gen-class |
| 11:52 | seangrov` | I thought the map would be coerced into a seqable and nth would work |
| 11:52 | EchoBot1 | Echo: I thought the map would be coerced into a seqable and nth would work |
| 11:52 | `cbp | seangrov`: you can use {:strings []} i think or maybe its :strs |
| 11:52 | EchoBot1 | Echo: seangrov`: you can use {:strings []} i think or maybe its :strs |
| 11:53 | seangrov` | `cbp: problem is I don't know the keys ahead of time |
| 11:53 | sm0ke | ,(print "/kick EchoBot1") |
| 11:53 | EchoBot1 | Echo: ,(print "/kick EchoBot1") |
| 11:53 | clojurebot | /kick EchoBot1 |
| 11:53 | EchoBot1 | Echo: /kick EchoBot1 |
| 11:53 | ambrosebs | seangrov`: I think you just want (let [[[k v]] map] ...) |
| 11:53 | EchoBot1 | Echo: seangrov`: I think you just want (let [[[k v]] map] ...) |
| 11:53 | nDuff | sm0ke: because ''lein run'' is using the Clojure compiler, so it doesn't need things to be compiled ahead-of-time? |
| 11:53 | EchoBot1 | Echo: sm0ke: because ''lein run'' is using the Clojure compiler, so it doesn't need things to be compiled ahead-of-time? |
| 11:54 | nDuff | /ignore EchoBot1!*@* ALL |
| 11:54 | EchoBot1 | Echo: /ignore EchoBot1!*@* ALL |
| 11:54 | sm0ke | nDuff: cant i just put an :aot in project.clj instead of modifying my code? |
| 11:54 | EchoBot1 | Echo: nDuff: cant i just put an :aot in project.clj instead of modifying my code? |
| 11:55 | seangrov` | ,(let [m {:a 10} [[k v]] m] k) |
| 11:55 | clojurebot | #<UnsupportedOperationException java.lang.UnsupportedOperationException: nth not supported on this type: PersistentArrayMap> |
| 11:55 | nDuff | sm0ke: better not to. |
| 11:55 | seangrov` | ambrosebs: I thought that would work, but seems like I was wrong |
| 11:55 | `cbp | ,(let [m {:a 10} [[k v]] (seq m)] k) |
| 11:55 | clojurebot | :a |
| 11:56 | llasram | sm0ke, nDuff: And that still won't create a class for the namespace |
| 11:56 | seangrov` | `cbp: Yeah, was trying to avoid an explicit seq call so I could put the binding form in the fn params |
| 11:56 | llasram | sm0ke: Instead of adding gen-class to your code, I suggest just launching via the Clojure library main class |
| 11:56 | llasram | sm0ke: Remove the `:main` key from your project.clj |
| 11:56 | seangrov` | Not the biggest deal in the world, but the difference between 2 lines and ~5 |
| 11:56 | sm0ke | oh googling shows that i only need to put (:gen-class) inside my ns |
| 11:56 | sm0ke | thats should be ok ..let me try |
| 11:57 | llasram | Then run like: java -cp my-project.jar clojure.main -m my.name.space |
| 11:57 | `cbp | seangrov`: I'm not sure if you really wanna destructure like that though shince, maps don't preserve order and all that. Maybe you just wanna use vectors? |
| 11:57 | `cbp | since* |
| 11:57 | sm0ke | llasram: thanks for that tip going to note that one down |
| 11:58 | sm0ke | but its really hairy..for that i need to remove :main? |
| 11:58 | seangrov` | `cbp: Yeah, this data structure is a little wonky - it's a vector of maps with only one k:v pair |
| 11:58 | seangrov` | I realize it's an edge case though, so not worried about it at all, thanks |
| 12:00 | sm0ke | crap ..now there seems to be probject with config file i put inside /resource folder.. |
| 12:00 | sm0ke | problem* |
| 12:01 | `cbp | sm0ke: use clojure.java.io/resource to get a path to files inside the jar |
| 12:01 | sm0ke | (io/file (io/resource..) fails for config file inside resource when run from uberjar |
| 12:01 | llasram | sm0ke: Just don't call `io/file` on it |
| 12:01 | llasram | The return value is a URL, which you can open a reader on etc just fine |
| 12:02 | sm0ke | can i (slurp (io/resouce)) ? |
| 12:02 | llasram | yes |
| 12:02 | sm0ke | nice |
| 12:03 | sm0ke | you guys are awesome.. |
| 12:03 | sm0ke | just one last thing..i get this warning..Warning: specified :main without including it in :aot. |
| 12:03 | sm0ke | Implicit AOT of :main will be removed in Leiningen 3.0.0 |
| 12:04 | mtp | ok |
| 12:05 | llasram | sm0ke: If you want it AOT'd to work with your main namespace `gen-class`ing, just make sure you have an `:uberjar` profile wich specifies `:aot :all` |
| 12:05 | llasram | The lein `app` template adds that for you even |
| 12:06 | llasram | If you have that, then you'll get everything AOTed whenever you build an uberjar anyway |
| 12:06 | sm0ke | llasram: i just did a :aot [myproject.core] ..it seems to remove that warning |
| 12:06 | llasram | Yeah, but also means your main namespace is always AOTed, even when launching a REPL |
| 12:07 | llasram | WHich is almost never what you really want |
| 12:08 | sm0ke | llasram: thanks ...:uberjar profile makes sense |
| 12:08 | sm0ke | llasram: why wouldnt you want aot compilation for repl btw? |
| 12:09 | llasram | sm0ke: Cool. If you still get the warning, hen you can add a :^skip-aot on your :main namespace symbol (in the project.clj) to explicitly disable the extra :main AOTing |
| 12:09 | CommandBot | Greetings! Send me a PM and I'll echo it back to you. If it contains the word 'die', I'll die as a bonus! |
| 12:11 | CommandBot | Greetings! Send me a PM and I'll echo it back to you. If it contains the word 'die', I'll die as a bonus! |
| 12:11 | llasram | sm0ke: It causes a number of problems. It means launching a REPL first has to compile, which means any compilation exceptions prevent your REPL from launching. |
| 12:12 | llasram | It creates concrete class files for any protocols and deftypes, which then can be found by class loaders instead of the potentially changed dynamic versions, causing hilarious mismatches |
| 12:12 | llasram | It can leave stale versions of the classes for functions you define, which in some cases can be picked up in preference to your Clojure code, even if your code has changed since |
| 12:13 | llasram | AOT is a fine optimization for deployment, but is bad bad news for development |
| 12:28 | `cbp | (inc llasram) |
| 12:28 | lazybot | ⇒ 10 |
| 12:37 | bbloom_ | ambrosebs: i find it entertaining how little some haskell proponents know about the fundamentals of type theory |
| 12:38 | ambrosebs | bbloom_: what have you seen now? |
| 12:38 | bbloom_ | ambrosebs: all the people who keep suggesting unsafeWhatever as a way to turn off type checking |
| 12:38 | bbloom_ | horrible. |
| 12:39 | indigo | Why would you want to turn off type checking in Haskell |
| 12:39 | ambrosebs | bbloom_: I'm surprised it's named so mildly after learning what it really does. |
| 12:40 | technomancy | ambrosebs: congrats on meeting your goal. curious: what made you go with indiegogo for the campaign? |
| 12:40 | bbloom_ | ambrosebs: it's not "mild" it's precise |
| 12:40 | bbloom_ | "safe" has a very particular meaning in type theory |
| 12:40 | bbloom_ | see http://msdn.microsoft.com/en-us/library/vstudio/t2yzs44b.aspx too |
| 12:41 | ambrosebs | technomancy: AFAIK kickstarter doesn't support australians |
| 12:41 | technomancy | oof; that sucks |
| 12:41 | bbloom_ | people don't seem to realize that you can enforce type safety separately from type correctness. and they double don't realize that you can enforce both using either static or dynamic means |
| 12:41 | ambrosebs | bbloom_: I assumed it meant "statically unsafe" |
| 12:41 | seangrov` | ambrosebs: Out of principle? |
| 12:41 | indigo | TIL you can use pointers in C# |
| 12:41 | bbloom_ | ambrosebs: ah i see |
| 12:41 | technomancy | seangrov`: ahaha |
| 12:41 | bbloom_ | indigo: C#'s native interop features are AMAZING |
| 12:42 | bbloom_ | indigo: unsafe code & Managed C++ are a fucking feat of engineering |
| 12:42 | indigo | Heh |
| 12:42 | justin_smith | didn't a bunch of the haskell people work on that vm? |
| 12:42 | bbloom_ | seriously. the CLR's design is stellar |
| 12:42 | bbloom_ | justin_smith: yup. heavily influenced by MSR |
| 12:42 | bbloom_ | and MSR is/was a major GHC contributor |
| 12:43 | technomancy | bbloom_: especially compared to JNI, I'll bet |
| 12:43 | bbloom_ | technomancy: no contest. |
| 12:43 | bbloom_ | technomancy: being able to pin memory and tell the GC to work around you is mega useful |
| 12:43 | bbloom_ | you can get crazy good perf out of your interop libs |
| 12:44 | technomancy | bbloom_: counting my blessings that I have never had to care about that |
| 12:44 | bbloom_ | however, the CLR is clearly tuned for a type system that is better than the JVMs, so their JIT isn't as good |
| 12:44 | bbloom_ | but it's a manhours limitation, not a design one |
| 12:45 | bbloom_ | technomancy: eh, pinning memory is fun. it's when you need to do COM that things get depressing :-P |
| 12:46 | technomancy | bbloom_: I've been interfacing with libreadline from ocaml recently and it's not as bad as I was expecting |
| 12:47 | bbloom_ | technomancy: yeah, if you have good facilities for it, it's no more painful than writing C |
| 12:48 | bbloom_ | except maybe a larger conceptual surface area |
| 12:48 | technomancy | that's some faint praise for you |
| 12:49 | bbloom_ | anyway, ambrosebs: when do we get a stretch goal that lets us infer type hints to prevent reflection in CinC? :-) |
| 12:50 | bordatoue | is there anyway to split string within double qoutes |
| 12:51 | `cbp | bordatoue: I'm not sure what you mean can you give an example? |
| 12:52 | ambrosebs | bbloom_: sounds like something we'd need CinC for :) |
| 12:52 | ambrosebs | bbloom_: oh |
| 12:52 | ambrosebs | bbloom_: didn't read that properly :P |
| 12:53 | bordatoue | `cbp: say i have a string "a","b","c,e" , i need to split them based on double quotes so that I get [a b ce] , i have tried regex but couldn't work it |
| 12:53 | ambrosebs | bbloom_: stretch goals will be core.typed from here on :) |
| 12:53 | justin_smith | bordatoue: something like |
| 12:53 | justin_smith | ,(clojure.string/split "this string \"has a quote\" in it" #"\"[^\"]*\"") |
| 12:53 | marcopolo2 | ambrosebs: Congrats on meeting your goal, I'm excited to see what you'll get done! :D |
| 12:53 | clojurebot | ["this string " " in it"] |
| 12:53 | ambrosebs | marcopolo2: thanks! |
| 12:54 | marcopolo2 | ambrosebs: How possible is core.typed on Clojurescript? |
| 12:54 | ambrosebs | I'm hoping to get maybe 8-10 months of dev time. I can get some serious work done then. |
| 12:54 | ambrosebs | marcopolo2: already possible. |
| 12:55 | marcopolo2 | ambrosebs: woah! Can I use it now? |
| 12:55 | ambrosebs | marcopolo2: kinda, you can certainly tell me where it breaks https://github.com/clojure/core.typed/blob/master/src/test/cljs/cljs/core/typed/test/dnolen/utils/dom.cljs |
| 12:55 | ambrosebs | marcopolo2: it's needs a lot more work but the basics are there |
| 12:56 | ambrosebs | I'll probably release a typed CLJS tutorial with my next stretch goal |
| 12:56 | `cbp | bordatoue: ##(map second (re-seq #"\"([^\"]+)\"" "\"a\", \"b\", \"c,e\"")) |
| 12:56 | lazybot | ⇒ ("a" "b" "c,e") |
| 12:57 | `cbp | oh or justin_smith's |
| 12:57 | marcopolo2 | ambrosebs: nice! |
| 12:57 | justin_smith | mine was almost there, yours is closer to what he wants |
| 12:58 | rasmusto | is this a reasonable use case for reduce? I want to make sure that the function is deterministic https://www.refheap.com/19176 |
| 12:59 | bordatoue | `cbp: thanks very much, I was trying to solve it using a single regex rexpression |
| 13:00 | marcopolo2 | rasmusto: What is this suppose to do? |
| 13:02 | `cbp | rasmusto: I think any operation that goes fully through a collection to get a single value is a reasonable case for reduce |
| 13:03 | AimHere | Why stop at single values. Reduce will handily turn a collection into another one if you ask it nicely! |
| 13:04 | `cbp | Ok I guess i shouldve said anything that goes through a collection fully is a good case for reduce :P |
| 13:04 | rasmusto | marcopolo2: I want to go through the collection and "pick" an element from each of the sub-collections, after "picking", all of the items in that elem are off limits, so I have to remove them as options from the remaining elements |
| 13:04 | rasmusto | marcopolo2: those are the :used items |
| 13:05 | rasmusto | `cbp: okay, thanks |
| 13:05 | bordatoue | `cbp: I can use re-seq while reading lines from the file , or should I use some other alternative that compiles to regex, then search for a pattern |
| 13:07 | marcopolo2 | rasmusto: gotcha, `cbp is right, as long as your are going through a collection, even if you result with a larger collection, reduce is fine |
| 13:08 | AimHere | Well if you have an infinite collection going in, you might not get anything out at all with reduce |
| 13:09 | `cbp | bordatoue: you can do something like (map #(re-seq..) (line-seq input)) |
| 13:09 | bordatoue | `cbp: thanks |
| 13:10 | `cbp | bordatoue: unless the file is huge then you might want something different from map |
| 13:14 | rasmusto | the code I pasted is something that I'd normally do with a loop/recur, I don't quite know why reduce hasn't really been in my toolbox |
| 13:25 | marcopolo2 | I've gotten to a stable point in my webworker library for clojurescript: https://github.com/MarcoPolo/servant |
| 13:26 | marcopolo2 | It uses core.async to deal with webworkers in a sane way. It's somewhat similar to core.async's thread call |
| 13:30 | arrdem | with ac-nrepl, is there a way to automagically populate the ac name trie with the symbols in my ns? |
| 13:30 | justin_smith | reduce can also be used if you don't want to traverse the whole input |
| 13:30 | justin_smith | ,(reduce (fn [a b] (if (number? b) (reduced a) (conj a b))) [] [:a :b :c :d 0 :e :f]) |
| 13:30 | clojurebot | [:a :b :c :d] |
| 13:31 | seangrov` | marcopolo2: Should the if-not in the readme be when-not? |
| 13:32 | marcopolo2 | seangrov`: yeah, it should |
| 13:33 | seangrov` | marcopolo2: Looks really interesting! Do I have to be using core.async in my project to use servant though? |
| 13:34 | marcopolo2 | seangrov`: You do because the call to a servant-fn will return a channel where the result will be |
| 13:34 | marcopolo2 | seangrov`: Also thanks :) |
| 13:35 | seangrov` | It's too bad there isn't a way to seamlessly combine core.async-using and non-core.async-using libraries :P |
| 13:35 | tbaldridge | seangrov`: it's called a callback |
| 13:36 | tbaldridge | seangrov`: (take! c (fn [val] ...dosomething...)) |
| 13:36 | rasmusto | justin_smith: oh, cool! |
| 13:36 | seangrov` | tbaldridge: Yeah, but I have to be pretty aware that the library is using core.async, and I can't just treat it as a normal callback-based library unless the author provides a separate interface for that |
| 13:37 | cored | http://www.indiegogo.com/projects/typed-clojure |
| 13:37 | cored | that looks interesting |
| 13:40 | muhoo | seangrov`: why? |
| 13:40 | muhoo | if it's referentially transparent, should it matter? |
| 13:42 | seangrov` | muhoo: I mean, to use a library that uses core.async internally (if my project isn't using it), then I either have to bring in core.async and learn it enough to write the line like tbaldridge, or the author has to write a separate set of interfaces for consuming "return" values via callbacks |
| 13:43 | seangrov` | It really feels like it's mixing things up and splitting the ecosystem a bit |
| 13:44 | seangrov` | Not the biggest deal in the world obviously, but and interesting problem I've been thinking over recently |
| 13:44 | tbaldridge | seangrov`: some might say it is the new ecosystem :-P |
| 13:44 | muhoo | indeed, core.async appears to be taking over the world |
| 13:44 | muhoo | but there's a way to make async things sync, by using promises/futures/etc, IIRC |
| 13:45 | geoffeg | i heard a talk on core.async at strangeloop this year, the speaker (rich hickey, i think) mentioned there's no support for networking, any change in that limitation? |
| 13:46 | muhoo | why couldn't you do network i/o in core.async? seems like it'd be ideally suited for it. |
| 13:47 | marcopolo2 | seangrov`: Webworkers use callbacks and that can get really ugly when you need to juggle several webworkers at once, I guess I choose to not have that ugliness leak out. |
| 13:48 | geoffeg | http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html (see the "Future Directions" section) |
| 13:48 | tbaldridge | geoffeg: it's a hard topic (channels over a network), and I don't think there is a good solution |
| 13:49 | mdrogalis | I was just going to summon you for an answer, tbaldridge :) |
| 13:49 | tbaldridge | geoffeg: core.async assumes messages are reliable, and nothing short of a system failure will drop a message, not so with networks. There are 1001 things that can cause a drop of a message |
| 13:49 | tbaldridge | not to mention that stuff like alt! is pretty much impossible to do over a connection. |
| 13:50 | tbaldridge | My advice? Wrap rabbit-mq or zero-mq, and interop via core.async. |
| 13:51 | geoffeg | tbaldridge: mostly i was thinking of how nice it would be to use core.async-style interop in the browser for browser to server communication |
| 13:52 | marcopolo2 | geoffeg: That isn't hard at all, I had to do something similar for the servant library |
| 13:52 | tbaldridge | geoffeg: that can be done, use web workers and put!/take! |
| 13:53 | tbaldridge | *web sockets |
| 13:53 | muhoo | i did something like that with web sockets and edn recently |
| 13:54 | geoffeg | thanks, i'll take a look |
| 13:54 | tbaldridge | (inc muhoo) |
| 13:54 | lazybot | ⇒ 3 |
| 13:54 | muhoo | it was long-polling, core.async wasn't out yet so i had a j.u.c queue instead |
| 13:54 | tbaldridge | yeah if you use http-kit it's about 30 lines of code total |
| 13:54 | muhoo | ah, right, looking, i migrated from web sockets to long polling |
| 13:55 | muhoo | for backwards compatibility |
| 13:55 | muhoo | sockets was easier tho. |
| 13:55 | marcopolo2 | muhoo: j.u.c. queue? |
| 13:56 | muhoo | marcopolo2: yep, looking up which one, there was a neat little hack i got from alan that helped |
| 13:59 | muhoo | https://github.com/flatland/useful/blob/develop/src/flatland/useful/state.clj#L54 i |
| 14:00 | muhoo | marcopolo2: i used clojure.core.cache/fifo-cache-factory |
| 14:00 | muhoo | not sure why |
| 14:01 | muhoo | so basically it was a blocking queue |
| 14:01 | marcopolo2 | muhoo: That's practically the definition of a channel! |
| 14:02 | muhoo | yeah, i was reinventing the wheel |
| 14:02 | muhoo | now i use lamina, and soon i'm sure i'll join the core.async bandwagon |
| 14:08 | `cbp | justin_smith: :-O I didn't know that |
| 14:09 | `cbp | (inc justin_smith) |
| 14:09 | lazybot | ⇒ 7 |
| 14:11 | marcopolo2 | `cbp: since 1.5 apparently https://github.com/clojure/clojure/blob/c6756a8bab137128c8119add29a25b0a88509900/src/clj/clojure/core.clj#L6139 |
| 14:12 | `cbp | :-) |
| 14:24 | rasmusto | how does reduced work with a parallel reduce? |
| 14:30 | llasram | rasmusto: Only `fold` may happen in parallel, not `reduce` |
| 14:30 | rasmusto | llasram: ah, okay. And I assume that "reduced" doesn't work there :) |
| 14:30 | callen | llasram: reduce reduce or Clojure foldy reduce? |
| 14:31 | borkdude | say I have a collection [ {:name "foo" :function nil} {:name "bar" :function nil}], what is the most idiomatic way of updating it to for example [ {:name "foo" :function string?} {:name "bar" :function nil}] |
| 14:31 | llasram | rasmusto: I don't believe so, although I think it could sanely end a part of the computation early |
| 14:31 | rasmusto | hmm, ok |
| 14:32 | llasram | callen: Does it matter? They're both in terms of the CollReduce protocol. They just have a different default for an unspecified initial reduction state parameter |
| 14:32 | callen | llasram: well, by your response, now I know the bit that matters. |
| 14:32 | callen | I should re-read the code in reducers |
| 14:33 | llasram | callen: fair enough :-) |
| 14:34 | borkdude | something like this? https://www.refheap.com/19181 |
| 14:35 | rasmusto | ,(map (fn [m] (if (= (:name m) "foo") (assoc m :function string?) m)) [{:name "foo" :function nil} {:name "bar" :function nil}]) |
| 14:35 | clojurebot | ({:name "foo", :function #<core$string_QMARK_ clojure.core$string_QMARK_@1d2d2c9>} {:name "bar", :function nil}) |
| 14:35 | rasmusto | whoooo, I matched my parens! |
| 14:35 | borkdude | rasmusto ok |
| 14:35 | rasmusto | borkdude: yeah, that seems about right |
| 14:36 | borkdude | I was wondering, maybe there is something like qpath expressions for clojure collections :) |
| 14:36 | rasmusto | borkdude: I don't know what those are |
| 15:04 | yedi | what are some good clojure cup entries |
| 15:04 | muhoo | link to the clojure cup entries? |
| 15:05 | callen | muhoo: http://clojurecup.com/apps.html |
| 15:06 | muhoo | huh, no apps there, in chrome on android anyway |
| 15:06 | yedi | callen, what was yours |
| 15:06 | `cbp | callen: which one did you guys make |
| 15:06 | Jarda | muhoo: you need to login (with a github id or something) |
| 15:06 | muhoo | :-/ |
| 15:07 | callen | `cbp: Simonides |
| 15:07 | callen | yedi: ^^ |
| 15:07 | muhoo | one day, people will have websites that you don't have to login to see the the content of. |
| 15:07 | callen | my team was myself, gf3, noprompt, and s4muel. |
| 15:07 | callen | muhoo: you don't need to be logged in |
| 15:07 | callen | muhoo: click my damn link I sent you |
| 15:07 | callen | I sent you the link to the clojure cup apps. |
| 15:07 | Jarda | callen: you can't see anything without login there |
| 15:07 | arrdem | damnit.. we didn't even get a ranking up :/ |
| 15:08 | callen | arrdem: er. ranking? what? |
| 15:08 | arrdem | callen: http://clojurecup.com/app.html?app=cloutjure |
| 15:09 | callen | oh damn. |
| 15:09 | callen | us: http://clojurecup.com/app.html?app=simonides |
| 15:09 | Jarda | I don't really like those sites |
| 15:09 | Jarda | it seems it's just buggy when you are not logged in |
| 15:09 | muhoo | Jarda: no anonymity for you! |
| 15:10 | muhoo | we must track everything you do, everything you see |
| 15:10 | Jarda | http://dl.dropbox.com/u/1815350/Selection_022.png |
| 15:10 | callen | muhoo: can you put off the 5 minutes of hate for another week? |
| 15:10 | Jarda | yeah but as you can see from my screenshot it's not apparent that I should login |
| 15:10 | Jarda | no 'Login to see this app' |
| 15:11 | Jarda | that screenshot is from http://clojurecup.com/app.html?app=cloutjure |
| 15:11 | `cbp | Jarda: I don't think you have to log in.. |
| 15:11 | callen | you don't have to log in... |
| 15:11 | callen | Jarda: please calm down. |
| 15:11 | Jarda | callen: yeah, I just don't see anything :) |
| 15:11 | muhoo | anyway, it doesn't matter. i'm sure the good apps will get attention in other ways and all have github repos anyway |
| 15:11 | TimMc | Jarda: Not seeing it, here. |
| 15:11 | gws | i wasn't either, but i went to the main page and then hit the back button and it worked |
| 15:12 | arrdem | so it looks like you have to hit clojurecup.com/ before anything else will render for you :| |
| 15:12 | callen | LOL |
| 15:12 | Jarda | oh yeah |
| 15:12 | Jarda | true |
| 15:12 | Jarda | if I navigate around there I see the stuff |
| 15:12 | TimMc | Nice. |
| 15:12 | gws | so don't worry about putting a "log in to see this page" just "solve this browser puzzle to see this page" :) |
| 15:12 | arrdem | callen: anyway. shiny! |
| 15:13 | Jarda | :D |
| 15:13 | Jarda | ok, sorry about misleading |
| 15:13 | callen | arrdem: the shinies were gf3's doing :) |
| 15:13 | callen | arrdem: I did the data collection, aggregation, and storage. |
| 15:14 | mtp | i read 'data aggravation' |
| 15:15 | arrdem | callen: yeah I did all the IRC log prep work and have everything yall've ever said in here along with every link posted in a huge mongo table. |
| 15:15 | callen | not too far from the truth. |
| 15:15 | arrdem | aand then we didn't manage to get it on the website :/ |
| 15:16 | mtp | good |
| 15:16 | mtp | i hate the web |
| 15:16 | mtp | :) |
| 15:17 | arrdem | I used to hate the web.. then I found clj-http, data.json and clj-tagsoup and the web became data :D |
| 15:17 | callen | arrdem: similar story here. All of the backend stuff works, the design is in place, but the dashboard itself is not really fully functional. |
| 15:18 | `cbp | arrdem: sort by lazybot's karma? :-D it surprisingly correlates! |
| 15:18 | arrdem | callen: aaand this is why systems ppl should not participate in hackathons :| |
| 15:18 | arrdem | `cbp: I actually didn't get around to pulling bot karma, I figured that it would indeed correlate and therefor wouldn't have a high information value |
| 15:19 | yedi | arrdem: cloutjure doesn't seem to listing any names |
| 15:19 | arrdem | yedi: yeah that's because gdev hard coded a list and we never got a data connection built |
| 15:20 | callen | arrdem: I think a similar story happened to a lot of teams. |
| 15:20 | callen | stuff got built but not hooked up. |
| 15:20 | llasram | arrdem: I had a really similar experience. We decided to do this old pen-and-paper turn-based strategy game we though we could get away with having a trivial interface for. |
| 15:20 | technomancy | back in my day we only had 24 hours |
| 15:21 | callen | I spent most of the contest writing JS. I am not happy about this. |
| 15:21 | llasram | arrdem: In the process of not getting it finished, wrote about 2x as much ClojureScript as Clojure |
| 15:21 | arrdem | technomancy: get back on your rocking chair grandp |
| 15:21 | callen | llasram: great idea for a project tho. |
| 15:21 | arrdem | llasram: that's cool! |
| 15:21 | callen | llasram: please finish it :) |
| 15:22 | callen | when Simonides is made release-ready, people will have an open source analytics option :) |
| 15:22 | `cbp | llasram: is yours the risk one? |
| 15:22 | llasram | `cbp: Oh, no. It's `spellcast` |
| 15:23 | octe | (java.nio.file.Paths/get (into-array String ["/"])) |
| 15:23 | octe | should that not work? |
| 15:23 | octe | it doesnt seem to find the correct method to match |
| 15:23 | technomancy | http://technomancy.us/47 <- didn't finish with 24 hours either |
| 15:24 | octe | two path methods on the class, one which takes varargs strings, the other which takes a URI object |
| 15:24 | hiredman | octe: it takes a string, and vararg strings |
| 15:24 | llasram | If I do a hackathon again, I'll either have a frontend person on the team or just do a library + advertipage |
| 15:25 | octe | hiredman: huh? |
| 15:25 | callen | llasram: we had a frontend person, but we needed 1 backend person with 3 frontend people instead of the other way around |
| 15:25 | arrdem | llasram: having UI sketches & shared knowlege of the data backend beforehand should make a real webapp doable.. barely. |
| 15:25 | hiredman | octe: pull up the java docs and look at the method signature |
| 15:25 | octe | yes, i'm looking.. |
| 15:25 | hiredman | get(String first, String... more) |
| 15:26 | octe | oh, doh |
| 15:26 | octe | i was reading it wrong.. |
| 15:26 | octe | thanks.. |
| 15:29 | octe | that was kind of stupid |
| 15:43 | dobry-den | yeah, i had to go to homepage first |
| 15:58 | chouser | Does anyone know how to get simple-check's string generator to generate empty strings along with whatever else it generates? /cc reiddraper |
| 15:59 | dobry-den | Clojure question: In a webapp, I have helper methods like (url-for <entity>) where different things happen based on which of these keys an entity has (:forum/uid, :topic/uid, :user/uid, etc.). And over time I realize all my helper functions are doing this. |
| 15:59 | reiddraper | chouser: you could use gen/frequency to alternatively generate (gen/return '') |
| 15:59 | chouser | reiddraper: ok, I'll try that. Why aren't empty strings included by default? or are they just unlikely? |
| 15:59 | reiddraper | chouser: (def my-string (gen/frequency [[9 gen/string] [1 (gen/return '')]])) |
| 16:00 | reiddraper | chouser: good question, lemme see |
| 16:00 | dobry-den | What's the general solution for when you have a bunch of functions dispatching on a key like that? |
| 16:00 | `cbp | dobry-den: multimethods |
| 16:02 | dobry-den | Multimethods, the few times i've used them, will group functions by function-name. I now have a dozen helper methods and it seems I would want to group them by the key (:forum/uid vs :user/uid vs :topic/uid etc) that they dispatch on. |
| 16:04 | dobry-den | I've never used anything like Records or Protocols or Interfaces. Could this be a time when I'd want to have a Forum, Topic, User, etc records that conform to an interface? |
| 16:04 | dobry-den | I don't really know when to use those kinds of constructs |
| 16:04 | reiddraper | chouser: looks like it's a combination of two things: the 'size' parameter should be starting at 0 during tests, but it's starting at 1 (a small bug), and further, the string generators always create a string of 'size', instead of randomly choosing 0..size |
| 16:05 | llasram | dobry-den: Having a group of multimethods which dispatch on the same values is just a matter of application-internal convention |
| 16:05 | reiddraper | chouser: mind submitting a github issue and i'll get it fixed up shortly? |
| 16:05 | llasram | Although you can add sugar to make it more obvious |
| 16:05 | chouser | reiddraper: ah, ok. I thought that's what I was seeing, but I wasn't sure. |
| 16:05 | `cbp | dobry-den: Protocols dispatch on type only, multimethods dispatch on a given function |
| 16:06 | dobry-den | In a convention db-driven webapp, could it make sense to represent your domain models with types, then? (i.e. wrap DB rows with a type - i guess that'd be a defrecord) |
| 16:07 | llasram | dobry-den: I don't really suggest it, but you could always do something like this: https://gist.github.com/llasram/6768951 |
| 16:07 | dobry-den | llasram: i'll play with that |
| 16:09 | dobry-den | does anyone know of a github repo for a conventional Compojure + relational DB webapp with "users" and other models? |
| 16:09 | `cbp | dobry-den: I don't think there's a conventional way to handle db data |
| 16:10 | dobry-den | fair enough, i really just mean "any" |
| 16:10 | indigo | I'm sure you can find something with Compojure and Korma |
| 16:11 | `cbp | dobry-den: many people use something like korma, I myself implement simple operations on single entities like create/update/delete/save in an orm-like fashion using records/multimethods and do more complicated stuff by writing the sql "by hand" |
| 16:13 | dobry-den | i actually have the db stuff working smoothly (datomic). i'm just trying to arrive upon a better way to represent the entity once it's been pulled from the DB and wrapped for my views |
| 16:14 | indigo | dobry-den: https://github.com/khanage/clojure-blog-test from a quick github search |
| 16:14 | indigo | Actually I should go ahead and write some sort of quick blog/wiki tutorial with Compojure and Korma |
| 16:19 | noncom | hi, i'm trying to evaluate an (ns) macro with (eval), and it fails, saying that it is impossible to change *ns* root binding with (set!). ok, i've googled and they say use (binding) to setup a namespace for (eval). but how do repls, like in counterclockwise, manage to eval (ns) so easily? |
| 16:19 | dobry-den | indigo: I'm working on a forum with Compojure + Datomic. I'm just trying to figure out how to handle this file which keeps growing https://github.com/danneu/clj-forum/blob/master/src/forum/helpers.clj |
| 16:20 | dobry-den | although the uncomitted changes have tripled the size of that file |
| 16:23 | dobry-den | I think i've been drinking too much anti-noun koolaid |
| 16:23 | indigo | Haha |
| 16:24 | indigo | dobry-den: You could always split up the handlers |
| 16:26 | indigo | dobry-den: Hahah... not n*sync with this repo |
| 16:26 | dobry-den | I've seen people split up the routes, but that has made it confusing for me to see the full endpoint profile of their app |
| 16:27 | rhg135 | Hello, i was wondering how you would parse html on nodejs, i found http://docs.closure-library.googlecode.com/git/closure_third_party_closure_goog_caja_string_html_htmlparser.js.html but i've never used sax is this the best way? |
| 16:28 | glosoli | rhg135: This is clojure room lol |
| 16:28 | dobry-den | rhg135: like jquery? |
| 16:28 | rhg135 | clojurescript is a thing :P |
| 16:30 | rhg135 | im trying to rewrite a small program in clojurescript because of the memory usage of the jvm among other things |
| 16:30 | arcatan | i can't quite tell, so do i need to have signed the clojure contributor agreement to contribute code to jvm.tools.analyzer? (ambrosebs?) |
| 16:31 | dobry-den | rhg135: why cant you use any of the libs people use on node.js with vanilla js? |
| 16:31 | dobry-den | for parsing html |
| 16:31 | dobry-den | like an embedded jquery |
| 16:32 | rhg135 | elaborate please |
| 16:32 | rhg135 | im new to js |
| 16:32 | dobry-den | rhg135: i just searched "node js parse html" and found https://github.com/MatthewMueller/cheerio |
| 16:33 | seangrov` | Anyone have fn showing in emacs as the greek symbol using font-lock mode for clojure? I have partial working, but can't figure out lambda |
| 16:33 | mtp | i think "prettify" does that |
| 16:33 | mtp | or some other emacs module |
| 16:33 | rhg135 | hm, deal with the jvm or learn js |
| 16:34 | seangrov` | rhg135: Learn js before you use cljs |
| 16:34 | rhg135 | i think ill just deal with the jvm |
| 16:34 | rhg135 | i get js, but not the language itself |
| 16:34 | dobry-den | rhg135: sorry, your "node.js" part of the question threw me off |
| 16:34 | rhg135 | i mean not the idioms |
| 16:34 | dobry-den | just use https://github.com/levand/domina |
| 16:34 | dobry-den | or https://github.com/Prismatic/dommy |
| 16:35 | dobry-den | if you know what $("#content h1") does, in domina it's (sel "#content h1") |
| 16:36 | icarot2 | dobry-den: is your name intended to mean "good day"? |
| 16:36 | rhg135 | but i don't have a dom to manipulate |
| 16:36 | dobry-den | rhg135: do you have a string of html? |
| 16:36 | rhg135 | yes |
| 16:37 | rhg135 | well no but ik node.js has a lib to download it |
| 16:37 | dobry-den | https://github.com/levand/domina/blob/b8ab7c5a616f059949fd78397636442b91a35882/src/cljs/domina.cljs#L66 |
| 16:38 | rhg135 | thx |
| 16:38 | rhg135 | thats perfect |
| 16:39 | ambrosebs | arcatan: yes |
| 16:39 | ambrosebs | arcatan: do you have a CA? |
| 16:39 | dobry-den | rhg135: (-> (html-to-dom "<h1>Hello</h1>") (sel "h1") (text)) ;=> "Hello" |
| 16:39 | arcatan | ambrosebs: no |
| 16:39 | rhg135 | mhm |
| 16:40 | rhg135 | you read my mind |
| 16:40 | callen | bryanwoods: Gradual type system for Ruby that, if enabled, converts your startup's code base to Scala upon raising a Series B |
| 16:40 | ambrosebs | arcatan: ah. what are you thinking of contributing btw? |
| 16:40 | dobry-den | rhg135: i think you get certain advantages by writing javascript via ClojureScript without much experience with javascript. |
| 16:41 | rhg135 | probably |
| 16:41 | rhg135 | js has an ideology oposite to clojure |
| 16:41 | callen | sorta. |
| 16:42 | dobry-den | i wrote my first client-side app recently to learn clojurescript and it was nice to focus on clojure abstractions instead of reverse-engineering "how would i do it in js?" |
| 16:42 | yedi | anyone wanna give me strangeloop login credentials for a user who went to strangeloop..? |
| 16:42 | yedi | =D |
| 16:42 | noncom | hi, i'm trying to evaluate an (ns) macro with (eval), and it fails, saying that it is impossible to change *ns* root binding with (set!). ok, i've googled and they say use (binding) to setup a namespace for (eval). but how do repls, like in counterclockwise, manage to eval (ns) so easily? |
| 16:44 | arcatan | ambrosebs: i'd have just submitted a fix for expr-seq, as it's broken and it'd be handy for me |
| 16:44 | rhg135 | i'm writing server-side just not on jvm |
| 16:45 | ambrosebs | arcatan: should be the children function instead of :children right? |
| 16:46 | callen | The important part of AOT is that vars get interned from def decls at compile-time right? |
| 16:46 | callen | are there any wrinkles I am missing? |
| 16:46 | gfredericks | ,(letfn [[foo [] :foo]] (foo)) |
| 16:46 | clojurebot | :foo |
| 16:47 | arcatan | ambrosebs: yeah |
| 16:47 | ambrosebs | arcatan: ok i'll push a release for you |
| 16:47 | arcatan | ambrosebs: thanks :) |
| 16:49 | callen | Would AOT affect the behavior of an embedded nrepl in an uberjar? |
| 16:51 | callen | TimMc: ^^ obliquely asking if I need lein-otf. |
| 16:52 | callen | ;_; |
| 16:53 | callen | fine, I'll do SCIENCE |
| 16:53 | TimMc | I don't actually know much about AOT *or* nrepl. :-P |
| 16:53 | dobry-den | rhg135: i don't know enough about domina or dommy or the cljs solutions to know if any of them are portable to the jvm |
| 16:53 | dobry-den | er nvm |
| 16:53 | dobry-den | you're using node on the server-side |
| 16:53 | rhg135 | they're not but it's alearning experiance |
| 16:54 | rhg135 | i hear nice things about node and want to learn |
| 16:55 | callen | rhg135: if you hear nice things about node you're talking to the wrong people :) |
| 16:55 | rhg135 | prob lol |
| 16:56 | rhg135 | well one guy does love perl so you may be on to somn |
| 16:56 | dobry-den | the nice thing to node for this community is that it's a platform to host cljs on |
| 16:57 | ambrosebs | arcatan: just posted a new version on the clojure mailing list |
| 16:57 | ambrosebs | let me know if it works |
| 16:57 | dobry-den | i'd like to experiment by porting some of my clojure cli tools to node |
| 16:58 | rhg135 | hmhm |
| 16:58 | rhg135 | thats what im doing |
| 16:58 | rhg135 | i tried shell scriipting but there's no nice way too call shell |
| 16:59 | rhg135 | clojure.java.shell/sh is nice |
| 17:01 | chouser | reiddraper: got another question for you. Is there a way to prevent gen/return from shrinking? |
| 17:02 | dobry-den | rhg135: it would be a fun toy project to implement shell commands with Java's io/shell libs https://github.com/danneu/captain-githook/blob/master/src/captain_githook/util.clj#L38 |
| 17:02 | chouser | That is, I'd like this to shrink only to ":hi", not to ":" (sc/quick-check 1 (prop/for-all [t (gen/return :hi)] false)) |
| 17:06 | ambrosebs | bbloom_: enjoying your opinionated HN responses |
| 17:08 | ambrosebs | chouser: what library is that? |
| 17:12 | chouser | ambrosebs: https://github.com/reiddraper/simple-check |
| 17:14 | bbloom_ | ambrosebs: damn static typing people :-P |
| 17:14 | arcatan | ambrosebs: it works. thanks again. |
| 17:15 | gfredericks | do we have a standard link for when people ask about clojure conventions (whitespace etc)? |
| 17:15 | ambrosebs | arcatan: great |
| 17:15 | ambrosebs | chouser: for-all caught my eye, is that way to seed a check? |
| 17:15 | rasmusto | gfredericks: this maybe? https://github.com/bbatsov/clojure-style-guide |
| 17:15 | bbloom_ | ambrosebs: it's pretty clear to me that "tagless" evaluation is pretty much just an optimization :-) |
| 17:16 | callen | gfredericks: batsov's guide is not authoritative or correct. |
| 17:16 | callen | gfredericks: do not use batsov's guide. |
| 17:16 | callen | rasmusto: stop linking batsov's guide. |
| 17:16 | rasmusto | reading through it, some seems a little dated, my bad |
| 17:16 | callen | Some of it is outright wrong. |
| 17:17 | ambrosebs | bbloom_: :) |
| 17:17 | chouser | ambrosebs: yeah, I'm not sure if that's the right description. It's how you collect up a top level of independent variables. I think. |
| 17:17 | Jarda | anyone familiar with core.async for clojurescript awake? |
| 17:18 | ambrosebs | chouser: ok |
| 17:18 | tbaldridge | Jarda: yes |
| 17:18 | Jarda | I'd like to implement single page application navigation on top of core.async signals |
| 17:19 | Jarda | so that I would have 'views' that are just loops listening to different view related signals |
| 17:19 | Jarda | one of them would be a 'navigate' signal |
| 17:19 | Jarda | that would tell the view-loop to abort and then initialize a new view loop |
| 17:19 | tbaldridge | Jarda: right, sounds normal |
| 17:19 | Jarda | does it make sense? |
| 17:19 | tbaldridge | Jarda: yes |
| 17:20 | Jarda | ok, cool |
| 17:21 | Jarda | just wanted to make sure I'm on right track before I dive too deep into this :) |
| 17:21 | Jarda | thanks tbaldridge |
| 17:22 | Jarda | it seems core.async might be the answer how to write client-side apps without these javascript frameworks (like angular or backbone etc) |
| 17:22 | rasmusto | callen: what'd you recommend for a conventions reference? clojure.core source? |
| 17:22 | gfredericks | callen: okay good to know, thanks :) |
| 17:23 | gfredericks | I saw the thing about not shadowing clojure.core vars. Seemed iffy. |
| 17:24 | technomancy | clojure.core is very unconventional |
| 17:25 | tbaldridge | Jarda: yeah there some research in that area to be done, I'm not sure that anyone knows all the answers |
| 17:25 | rasmusto | technomancy: I'm reading through it atm, and that's definitely true |
| 17:28 | technomancy | I like riastradh's style guide even though it's focused more on scheme |
| 17:29 | callen | rasmusto: anything official clojure |
| 17:29 | technomancy | http://mumble.net/~campbell/scheme/style.txt |
| 17:30 | glosoli | What do folks use for debugging Clojure under Emacs ? |
| 17:31 | callen | glosoli: generally, avoid debugging. |
| 17:31 | glosoli | callen: why > |
| 17:31 | glosoli | ? |
| 17:31 | callen | it's more time-consuming than better ways of solving most problems. |
| 17:32 | callen | debugging should be reserved for truly insane stuff. |
| 17:32 | scottj | glosoli: people defend the status quo. since there's no kickass debugging in emacs, people claim it's not necessary. |
| 17:32 | glosoli | scottj: I see heh |
| 17:32 | scottj | glosoli: there is ritz, but it's not polished |
| 17:33 | amalloy | (inc scottj) |
| 17:33 | lazybot | ⇒ 1 |
| 17:33 | Jarda | (dec Jarda) |
| 17:33 | lazybot | You can't adjust your own karma. |
| 17:33 | callen | glosoli: Ritz is the best way to do it, but learning to solve problems without a stepping debugger is useful. |
| 17:34 | glosoli | callen: Yeah but sometimes solving them without debugger and using println feels kinda weird... in a bad sense |
| 17:34 | callen | glosoli: particularly things like trace and just learning to read your code. |
| 17:34 | callen | I'm not saying use println. |
| 17:34 | callen | Why does everyone assume the only alternative to debuggers is println? |
| 17:34 | callen | an alternative to Ritz would be something like limit-break. |
| 17:34 | glosoli | callen: Well that's probably because I am novice, not that I am familiar with other stuff |
| 17:34 | glosoli | hmm |
| 17:34 | glosoli | limit-break |
| 17:35 | glosoli | Never heard of it |
| 17:35 | callen | glosoli: if you're a novice you should forgo debuggers and learn to use things like trace. |
| 17:35 | glosoli | callen: do you know any good resources on that or smth ? (being lazy... |
| 17:35 | callen | glosoli: https://github.com/clojure/tools.trace |
| 17:35 | technomancy | clojurebot: style? |
| 17:35 | clojurebot | style is http://mumble.net/~campbell/scheme/style.txt |
| 17:35 | technomancy | sweet |
| 17:36 | technomancy | clojurebot: botsnack |
| 17:36 | clojurebot | Thanks, but I prefer chocolate |
| 17:36 | rasmusto | callen: I was about to provide a counter example of official clojure being useful for style, but https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L266 is actually very very clean |
| 17:36 | glosoli | callen: thanks! :) |
| 17:36 | technomancy | this is a great guide |
| 17:37 | technomancy | I had totally forgotten that C-x [ and C-x ] let you navigate by page breaks <3 |
| 17:40 | borkdude | What is the default way of 'unescaping' html entities when I slurp or clj-http client/get some html? |
| 17:40 | borkdude | for example & -> & |
| 17:42 | glosoli | Hmm one more question anyone using Emacs knows what's required to be able to Jump into Java sources while doing interops ? |
| 17:42 | callen | glosoli: when my nrepl is connected, go to definition works fine for me. |
| 17:43 | glosoli | callen: hmm do you have your config published somewhere so I could try to look the differences ? |
| 17:43 | callen | there's no config |
| 17:43 | callen | it's just nrepl. |
| 17:43 | callen | github.com/bitemyapp/dotfiles/ |
| 17:43 | PntBlnk | Hi folks, quick question. Is there a way to hook a Clojure function call into the nREPL compile step? I'm using an LDAP connection pool ref and each time I compile I have to create a new pool, and if I don't close it before I compile the I end up with a pile of open connections to the LDAP server. I'm sure there's something very obvious I should be doing but it escapes me. |
| 17:44 | technomancy | callen: nrepl.el doesn't do that by default |
| 17:44 | callen | well. Then either I change something or I've gone crazy. |
| 17:45 | marcopolo2 | borkdude: I'm sure there are some Java libraries that will do that for you if there aren't any clojure ones |
| 17:45 | technomancy | usually the java source isn't even downloaded |
| 17:45 | chouser | PntBlnk: you can probably do that inside a macro definition |
| 17:46 | hyPiRion | PntBlnk: robert hooke may hooke your Clojure functions |
| 17:46 | borkdude | marcopolo2 do you know which java (std?) lib can do this? |
| 17:46 | PntBlnk | chouser: thanks for the tip. Can you think of an example I could try? |
| 17:46 | PntBlnk | to look for that is :) |
| 17:47 | borkdude | I'm finding StringEscapeUtils on google, but I'm a bit surprised I woudl need a special library for this |
| 17:50 | borkdude | java isn't a batteries included language in many ways ;) |
| 17:51 | chouser | PntBlnk: actually, just a top-level expression will be evaluated as the namespace is compiled. Can you just use like a defonce and then close and re-open it? |
| 17:51 | marcopolo2 | borkdude: I mean you could use a hashmap and just do (get escape-map char char) |
| 17:51 | borkdude | marcopolo2 yeah I could do that |
| 17:52 | chouser | Like (defonce conn nil) (when conn (disconnect conn)) (def conn (connect ...)) |
| 17:59 | PntBlnk | chouser: I'm not certain I understand your question, or for that matter if we're talking about Clojure or Emacs Lisp |
| 18:00 | seangrov` | callen: Trying to use core.typed in a project that also uses Korma - would you be up for a pr that added type annotations? |
| 18:00 | chouser | PntBlnk: heh, sorry. I may not have understood your question correctly. My sample code was meant for your .clj file. |
| 18:02 | PntBlnk | chouser: Oh I see where the confusion lies. IRC proper is blocked here at my work and I'm using a browser client and saw no code. |
| 18:05 | callen | seangrov`: I'm going to say yes, but only because I know you'll be thorough about it. Is it safe to assume this won't break anything for users that don't use core.typed? |
| 18:06 | callen | I'm afraid I haven't used it much, only read the literature. |
| 18:17 | seangrov` | callen: Yeah, it shouldn't affect anyone not using it |
| 18:17 | seangrov` | Not sure if I'll get around to it or not, but I'd like to for this part of the project I'm working on now |
| 18:18 | callen | seangrov`: well, it might take some cleanup or modification, but I'm friendly to the idea. |
| 18:21 | rhg135 | what do y'all think of objc (if it was more c++ like in availability) |
| 18:29 | muhoo | noprompt: what, you don't like manually figuring out }]})};});}] ? |
| 18:31 | hyPiRion | No need for a full-blown paredit for that though, just need a balancer |
| 18:31 | noprompt | muhoo: no i love it. i'm just looking for some sane people to troll. |
| 18:31 | noprompt | :P |
| 18:31 | technomancy | doesn't paredit work for js? |
| 18:31 | noprompt | technomancy: kind of. |
| 18:32 | technomancy | there's a thing you can do to stop it from inserting spaces where it doesn't make sense |
| 18:32 | hyPiRion | You can use hl-parens though, and then go full rainbow? |
| 18:32 | noprompt | hyPiRion: i do in fact, use rainbow parens for js. :) |
| 18:32 | hyPiRion | noprompt: ah, nice |
| 18:33 | `cbp | I think i stopped using paredit with js because it would put spaces where i didn't want them |
| 18:33 | noprompt | technomancy: probably should just dig in to this book on writing Emacs extensions and stop whining. :) |
| 18:33 | `cbp | like foo () |
| 18:33 | technomancy | the one from the 90s? |
| 18:33 | mtp | start hacking |
| 18:33 | hyPiRion | hah |
| 18:34 | technomancy | `cbp: (set (make-local-variable 'paredit-space-for-delimiter-predicates) '((lambda (_ _) nil))) |
| 18:34 | muhoo | i tried to love paredit, but it made me crazy with not letting me delete things when it screwed up and guessed wrong. |
| 18:34 | noprompt | technomancy: yes that one. didn't realize it was that old! |
| 18:34 | `cbp | :-o |
| 18:34 | technomancy | `cbp: merry christmas |
| 18:35 | `cbp | technomancy: =) |
| 18:35 | noprompt | technomancy: is it not a good book? |
| 18:35 | technomancy | noprompt: I don't know, actually |
| 18:35 | technomancy | the built-in docs are quite good though |
| 18:35 | muhoo | so i end up using mark-sexp and C-x C-x |
| 18:36 | TimMc | muhoo: Select and C-w to delete anything, prefix with C-q to insert anything. |
| 18:36 | noprompt | technomancy: the emacs rocks guy said he recommends it. also, i do like help as well. |
| 18:36 | muhoo | TimMc: i'll have to give it another go. i remember C-w not working. didn't know about C-q tho |
| 18:37 | rhg135 | is there anyway to use sockets, in browser side cljs? |
| 18:37 | muhoo | rhg135: websockets work ine |
| 18:38 | TimMc | (kill-region and quoted-insert. I should start learning the actual function names.) |
| 18:38 | rhg135 | if you have a server |
| 18:38 | rhg135 | i dont :c |
| 18:39 | rhg135 | so chromium webapp? |
| 18:39 | glosoli | Does having nrepl-ritz in emacs require some specific lein config to be able to navigate between Java sources from interop ? |
| 18:43 | amalloy | TimMc: select/kill is not really necessary; if you want to delete a single character, C-u C-d or C-u BACKSPACE works |
| 18:47 | TimMc | Oh, fair. |
| 18:58 | davidfstr | I am trying to install a 3rd party library for use in my code. In Python or Ruby I would use a package manager such as pip or gem to do this. How is this done is Clojure or what tool(s) should I look into? |
| 18:58 | davidfstr | (In case it matters, the library is: https://github.com/clojure/tools.trace ) |
| 18:59 | havenn | davidfstr: leinhttps://github.com/technomancy/leiningen#readme |
| 18:59 | havenn | davidfstr: Oops, I meant: lein: https://github.com/technomancy/leiningen#readme |
| 19:00 | glosoli | any ideas what could be wrong when I jack in nrepl, and then try to jump to some java source, I get http://bpaste.net/show/i18oeBXJ7aZkKpQTNmyL/ |
| 19:09 | akurilin | So with ring's wrap-file-info it looks like it will set the file content-type correctly in development, when the files are on disk, and it will fail to correctly identify MIME type in production when everything's in a .jar. Tricky quirk to spot :) |
| 19:09 | akurilin | I think weavejester's recommendation from before was to just use (wrap-content-type) only |
| 19:09 | davidfstr | havenn: Thanks. I'll take a look at lein. |
| 19:11 | akurilin | Hm, I guess I can't think of a specific use case where I would need to rely on file extension rather than the extension in the request url, so I'll probably roll with just wrap-content-type |
| 19:13 | akurilin | Apparently curl also implicitly guesses MIME type for you instead of default to text/plain, which seems pretty inconvenient for debugging. Inconsistent with browser behavior. |
| 19:21 | noonian | akurilin: chrome has a nice option from the dev console where if you right click on a captured network you can get a curl command that emulates what the browser used; it won't be a nice curl command though it will have tons of options |
| 19:22 | akurilin | noonian, I did use that as well actually, it was neat, but it was hitting that same problem of curl generating Content-Type header for me, while the browser wouldn't |
| 19:22 | akurilin | can't find an option to turn that off in curl |
| 19:22 | noonian | akurilin: ah, thats does sound annoying |
| 19:31 | mlb- | What's the most popular library for doing logging? Using "println" works, but it's beginning to feel a bit hackish. |
| 19:31 | akurilin | timbre |
| 19:32 | akurilin | There's spyscope as well, but I couldn't figure out what it has over timbre. |
| 19:33 | rhg135 | i can vouch for timbre |
| 19:33 | rhg135 | tis nice |
| 19:33 | technomancy | I like println |
| 19:33 | technomancy | with tools.trace |
| 19:33 | rhg135 | that too |
| 19:33 | technomancy | wrap it in a couple macros that check a dynamic var |
| 19:34 | rhg135 | mhm |
| 19:41 | hyPiRion | I tend to just hack up something for what I need. e.g. here's a smallish logging thing I made for command-line programs where I want to dump data out based on a logging level: https://www.refheap.com/19192 |
| 19:42 | hyPiRion | But it really depends on your use case |
| 19:47 | mlb- | akurilin, rhg135, technomancy: Thanks guys, I'll check these out |
| 19:47 | mlb- | hyPiRion: I'm tempted by that route, but I figured "logging things" is a problem possibly solved by some people smarter than me ;] |
| 19:48 | technomancy | mlb-: it really depends on how granular you need to be when turning sensitivity up/down |
| 19:48 | technomancy | personally I think those kinds of granular tweaks are better addressed by tools.trace |
| 19:49 | hyPiRion | mlb-: that, and well, people would reinvent the wheel all the time |
| 19:49 | technomancy | since any logging framework is never going to get close to what tools.trace can offer |
| 19:49 | technomancy | most of the time all you care about is "am I in verbose mode? how about quiet mode? ok, just normal then" |
| 19:50 | akurilin | technomancy, what exactly does tools.trace do over regular logging that dumps the value and returns it? Does it somehow track and print every change to that value? |
| 19:50 | akurilin | don't want to miss out on anything great in my toolbox when it comes to debugging. |
| 19:51 | technomancy | it logs all args and return values |
| 19:51 | technomancy | for every call of a given function |
| 19:51 | seangrov` | akurilin: Certainly worth trying out to understand it |
| 19:53 | akurilin | seangrov`, it's just tricky to relate to why it's awesome without it clarifying somewhere how one would use it and what kind of scenarios it enables that weren't possible before |
| 19:53 | akurilin | I'll play around with function tracking to get started. |
| 19:53 | indigo | What do you guys think of liberator |
| 19:53 | akurilin | *tracing |
| 19:53 | seangrov` | akurilin: quickly tracing/untracing functions is pretty nice |
| 19:53 | seangrov` | You can do it from outside of the function |
| 19:54 | technomancy | akurilin: with logging you typically need to redeploy to add it somewhere |
| 19:54 | technomancy | with tools.trace you just M-x turn it on when connected over nrepl |
| 19:54 | mlb- | I'm trying to sell Clojure at $DAYJOB, so... enterprise-tastic here. For better or worse. |
| 19:55 | seangrov` | mlb-: Datomic is apparently a good smuggling point |
| 19:55 | akurilin | technomancy, seanaway does this do some kind of alter-var-root behind the scenes to add the extra logging step? As in, can I untrace something in production after I do what you suggested? |
| 19:55 | technomancy | akurilin: right; typically you toggle tracing |
| 19:55 | akurilin | technomancy, that scenario does sound nice though |
| 19:55 | technomancy | if you forget to turn it off, it will be disabled next time the process restarts |
| 19:55 | akurilin | *seangrove, not seanaway. |
| 19:56 | technomancy | (vs leaving logging statements in and forgetting to take them out so they stay there for years) |
| 19:56 | rhg135 | dont you need to define fns differently? |
| 19:57 | akurilin | technomancy, when you say "turn it off", do you mean that running deftrace on a function will toggle it off? Couldn't find that mentioned in the docs/source |
| 19:57 | akurilin | *running a second time |
| 19:57 | technomancy | akurilin: no, I mean toggling trace |
| 19:57 | technomancy | I've never used deftrace |
| 19:57 | technomancy | would be wary of anything that put actual c.t.trace calls in the source itself |
| 19:59 | frozenlock | technomancy: Wasn't even aware of clojure.tools.trace, thanks dad! :D |
| 19:59 | technomancy | haha |
| 20:00 | akurilin | technomancy, I see, I found those trace/untrace in the source, thanks. |
| 20:03 | akurilin | Bitbucket just died :( |
| 20:07 | rasmusto | trace-ns seems pretty powerful for learning |
| 20:08 | hyPiRion | akurilin: fine here |
| 20:09 | akurilin | hyPiRion, yeah the dashboard just came back up. https://twitter.com/bitbucket/status/384821264965468161 |
| 20:09 | hyPiRion | ah |
| 20:11 | rhg135 | how would you use c.t.t in not-emacs? manual calls? |
| 20:11 | rasmusto | rhg135: do you have a repl? |
| 20:12 | rhg135 | yes ofc |
| 20:12 | technomancy | rhg135: I wrote a generic wrapper for it here: https://github.com/technomancy/nrepl-discover/blob/master/src/nrepl/discover.clj |
| 20:12 | technomancy | you can call the calls it makes or you can implement auto-discover for your editor/repl of choice =) |
| 20:12 | rasmusto | rhg135: it seemed pretty easy to just call (trace-ns 'my.ns) manually (I'm just learning the tool myself) |
| 20:13 | rhg135 | ya |
| 20:13 | rhg135 | i think so |
| 20:13 | rhg135 | manually then |
| 20:13 | muhoo | how do you UNtrace? |
| 20:13 | muhoo | like, i'm in the repl, i want to trace something, i do, i find the bug, now i want to turn the damn tracing off again? |
| 20:14 | rasmusto | muhoo: there's untrace |
| 20:15 | muhoo | ah, great, didn't see that |
| 20:15 | rasmusto | muhoo: er, wait |
| 20:15 | muhoo | yeah, i don't recall seeing an untrace |
| 20:15 | rasmusto | untrace-ns exists |
| 20:15 | muhoo | oh, thanks |
| 20:19 | akurilin | Anybody using runit here to daemonize their ring apps? I'm wondering if you *have* to have two separate services (folders, really) declared with runit to swap one running app for another. |
| 20:20 | akurilin | Or if you can get away with just one somehow. |
| 20:20 | mtp | akurilin‘ put a symlink in the runsvdir |
| 20:20 | mtp | switch the symlink around when you want to switch apps |
| 20:20 | mtp | also i <3 runit and you should convince more people of its utility |
| 20:21 | akurilin | mtp, Not sure I got the sequence right. You overwrite the existing .jar with a new version, then don't you need a 2nd symlink in /etc/service to boot the new version? |
| 20:22 | mtp | what no |
| 20:22 | mtp | i'm saying have a symlink to your active version in /etc/service |
| 20:22 | mtp | /etc/service/foo should be a symlink to /path/to/service-test; when you want to kick it over to service-prod, replace /etc/service/foo with a link to service-prod |
| 20:23 | akurilin | mtp, sure, but then won't it kill service-test and spin up service-prod, creating a gap of n seconds while the latter boots? |
| 20:24 | mtp | okay. it sounds you want to have them both running and handle the changeover some other way. |
| 20:24 | akurilin | mtp, I want there to be no service interruption. |
| 20:24 | mtp | <mtp> okay. it sounds you want to have them both running and handle the changeover some other way. |
| 20:24 | logic_prog | dnolen: where can I get a short 1-page description of the unification algorithm used by core.logic |
| 20:25 | logic_prog | dnolen: I don't need it to be fast; I just need to understand how it works |
| 20:25 | akurilin | mtp, okay, thanks for clarifying! |
| 20:47 | callen | Vote for simonides! http://clojurecup.com/app.html?app=simonides |
| 20:50 | Raynes | For your entertainment, folks, ScheduledThreadPoolExecutor.setContinueExistingPeriodicTasksAfterShutdownPolicy |
| 20:50 | indigo | callen: Voted! |
| 20:50 | muhoo | ok, i've got the clojure cup apps to show up in chrome on linux, yay, but where is the code for teh apps? |
| 20:50 | callen | indigo: thank you :) |
| 20:51 | callen | muhoo: we're not obligated to post the code unless we want to. |
| 20:51 | muhoo | Raynes: ThatIsANameOnlyAGermanCouldLove |
| 20:51 | callen | muhoo: I'm not posting the source to Simonides until things get cleaned up and the fucks per KLOC goes down. |
| 20:51 | callen | muhoo: if you really want to poke around, I could add you as a collaborator on my private github repo. |
| 20:51 | muhoo | http://www.vidarholen.net/contents/wordcount/ |
| 20:53 | chord | pathfinding problem starcarft |
| 20:53 | chord | we gotta figure out how to do this |
| 20:53 | chord | ok team brainstorm now please |
| 20:53 | muhoo | nah, just curious. i thought clojure cup was all open source, didn't know it wasn't |
| 20:54 | rhg135 | chord: the fact you're not banned is a testament to #clojure's patience |
| 20:54 | chord | rhg135: hey I'm trying to figure out how starcraft does the pathfinding that is constructive progress |
| 20:55 | rhg135 | it is |
| 20:55 | callen | muhoo: no, it's not obligatory because sometimes people want to do stuff that could turn into a business/startup for the competition. |
| 20:55 | callen | muhoo: the judges have access to the code though. |
| 20:55 | chord | rhg135: so you've done nothing? |
| 20:55 | rhg135 | no |
| 20:55 | rhg135 | i dont work for free :P |
| 20:57 | chord | rhg135: so you are clueless and useless at pathfinding in games |
| 20:57 | rhg135 | yup |
| 20:57 | rhg135 | and damn proud |
| 20:58 | callen | chord: can't you just...go die in a muddy creek or something? |
| 20:58 | rhg135 | lol |
| 20:58 | Raynes | lol |
| 20:58 | rhg135 | thats a polite version of my thoughts |
| 20:58 | indigo | chord: Go bother the Racket people or something |
| 20:58 | chord | if you guys don't know how to do something you all give up thats the difference between me and you guys |
| 20:58 | Raynes | chord: More a testament to the fact that nobody who is a mod pays any real attention to the channel. |
| 20:59 | Raynes | Er, rhg135 ^ |
| 20:59 | Foxboron | WOAHWOAHWOAHWOAH |
| 20:59 | Foxboron | Clam down people |
| 20:59 | Foxboron | Jeez |
| 20:59 | callen | Foxboron: you clam up. |
| 20:59 | Raynes | Yeah, clam the hell down. |
| 20:59 | rhg135 | that too |
| 20:59 | Raynes | callen: Clam down. |
| 20:59 | Raynes | Stahp. |
| 20:59 | callen | Raynes: I can mussel through this. |
| 20:59 | rhg135 | ... |
| 20:59 | Foxboron | This is an IRC channel. Winning arguments is like winning paralympics |
| 20:59 | Foxboron | we are here to spread love and knowledge |
| 20:59 | amalloy | Raynes: technomancy is an op. he gave chord a temporary kick a while ago, i believe |
| 20:59 | Foxboron | now, be awesome and friendly |
| 20:59 | rhg135 | k... |
| 21:00 | gfredericks | are kicks IP-based? |
| 21:00 | rhg135 | no |
| 21:00 | Foxboron | gfredericks: depends |
| 21:00 | technomancy | gfredericks: bans can be |
| 21:00 | rhg135 | hostname |
| 21:00 | mtp | kicks are nicked |
| 21:00 | mtp | bans are hostmasked |
| 21:00 | Foxboron | gfredericks: usually they follow a set regex pattern, but vhosts etc and nicks can make you avoid the ban |
| 21:00 | mtp | also i don't see chords's content |
| 21:00 | gfredericks | I still haven't figured out how to ignore on this client |
| 21:00 | metellus | there isn't any |
| 21:01 | TEttinger | callen, this simonides looks interesting, but it doesn't work for me |
| 21:01 | chord | if you guys know how starcraft 2 does pathfinding please talk |
| 21:01 | rhg135 | there |
| 21:01 | mtp | i mean, his words only show up on my screen when i want them to |
| 21:01 | mtp | which is "not often" |
| 21:01 | chord | or you guys are useless |
| 21:01 | rhg135 | no more chord |
| 21:01 | mtp | fools lists are better than ignore |
| 21:01 | chord | hey you guys are bashing on me its not my fault that you don't want to learn pathfinding |
| 21:01 | TEttinger | http://simonides.clojurecup.com/demo/playground/ gives me Not Found |
| 21:02 | callen | TEttinger: go through demo. |
| 21:02 | TEttinger | I did |
| 21:02 | callen | TEttinger: click the demo link? |
| 21:02 | callen | TEttinger: it wfm. |
| 21:02 | TEttinger | and I clicked submit, it took me there |
| 21:02 | callen | TEttinger: http://simonides.clojurecup.com/demo/playground?user-id=tettinger&submit=Submit |
| 21:03 | rhg135 | gfredericks: there is |
| 21:03 | TEttinger | gives me Not Found when I click Submit |
| 21:03 | callen | TEttinger: I don't know why it does that to you, but it works for me. |
| 21:03 | TEttinger | chrome latest, windows 7, ghostery, adblock |
| 21:03 | callen | TEttinger: are you blocking cookies? |
| 21:03 | callen | yes...ghostery... |
| 21:04 | TEttinger | not that I'm aware of |
| 21:04 | TEttinger | unless you fit the pattern of an existing tracker |
| 21:04 | callen | nuts. |
| 21:04 | TEttinger | Ghostery found 0 trackers |
| 21:05 | TEttinger | so it's not that |
| 21:05 | callen | ;_; |
| 21:05 | indigo | Yeah, playground is not found for me as well |
| 21:05 | indigo | :( |
| 21:05 | callen | it worked for all of us |
| 21:05 | callen | whyyyyyyy |
| 21:06 | callen | it worked for me just now when I tried it too |
| 21:06 | rhg135 | not me |
| 21:06 | TEttinger | it stored a cookie even |
| 21:06 | callen | I clicked demo in the top right |
| 21:06 | TEttinger | just checked |
| 21:06 | indigo | Is defining events supposed to work too |
| 21:06 | rhg135 | now its chugging |
| 21:06 | muhoo | there are some really good ideas in these apps |
| 21:06 | callen | indigo: that is not supposed to work |
| 21:06 | indigo | Ah kk |
| 21:07 | callen | demo/playground and the raw feed should work. |
| 21:07 | TEttinger | the cookie goes away when I click submit wat |
| 21:07 | seangrov` | callen: I tried it yesterday, couldn't get the querying to work or see any list of events |
| 21:07 | indigo | Ohh |
| 21:07 | indigo | demo/playground works |
| 21:07 | indigo | demo/playground/ doesn't ? |
| 21:07 | callen | oh. that's it. |
| 21:07 | callen | seangrov`: most of that isn't working. |
| 21:07 | callen | we're not allowed to touch it. |
| 21:08 | seangrov` | callen: Ok, no problem, was just curious |
| 21:08 | callen | clicks aren't showing up in feed. |
| 21:08 | callen | hrm. |
| 21:09 | indigo | That query builder is pretty slick, though |
| 21:09 | indigo | I remember implementing something like that via Backbone.js |
| 21:09 | indigo | (never again) |
| 21:11 | chord | is anyone working on figuring out how starcraft 2 does path finding |
| 21:11 | callen | events are definitely streaming in |
| 21:11 | callen | I wonder why feed isn't... |
| 21:13 | muhoo | "because nobody wants to type that crap every time they create an executor." as always, great docs Raynes |
| 21:14 | TEttinger | callen, is clojure cup over? |
| 21:14 | callen | I see events from "rustler" |
| 21:14 | callen | TEttinger: yes. |
| 21:15 | TEttinger | ah |
| 21:15 | TEttinger | that's me |
| 21:15 | callen | I see tet |
| 21:15 | TEttinger | that's also me |
| 21:15 | callen | yeah so events are streaming in |
| 21:15 | TEttinger | but I think it's sorted the wrong way in the display |
| 21:15 | callen | I wonder why the feed page is stuck |
| 21:15 | callen | I don't think so. |
| 21:15 | callen | It's the same thing I'm doing in _plugin/head |
| 21:16 | callen | I'm forwarding the port from the ES server on the DO VPS |
| 21:16 | callen | and querying it directly |
| 21:16 | callen | {"timestamp": {"order": "desc"}} |
| 21:17 | callen | (doc/search events-index events-type :filter {:limit {:value 50}} :sort [{:timestamp {"order" "desc"}}]))))) |
| 21:17 | callen | TEttinger: ^^ |
| 21:17 | callen | Something, somewhere is fucking me. |
| 21:17 | callen | but I don't know what. |
| 21:18 | TEttinger | what is doc? |
| 21:18 | callen | ES API |
| 21:18 | callen | Elastisch |
| 21:19 | TEttinger | could it be fetching 50 and THEN sorting? |
| 21:19 | callen | there's no way |
| 21:19 | callen | well |
| 21:19 | callen | it could be |
| 21:19 | callen | but that would be sadistic. |
| 21:19 | callen | that's clearly not the intent |
| 21:19 | callen | and I saw gf3's events stream in after it got deployed and I'm positive there were more than 50 events at the time |
| 21:20 | callen | TEttinger: but you might be right and it's worth testing. |
| 21:20 | gf3 | callen: Is it slow or something? |
| 21:20 | TEttinger | gf3, we see your events but nothing newer |
| 21:21 | TEttinger | well I do |
| 21:21 | TEttinger | callen has god mode on |
| 21:21 | gf3 | Awkward |
| 21:21 | gf3 | To be fair, I did hardcode my events, sooooo….. |
| 21:22 | muhoo | all i see is gf3 |
| 21:22 | TEttinger | last event is at "2013-09-30T07:22:36.531-00:00" |
| 21:22 | gf3 | Maybe everyone is just naming themselves gf3? |
| 21:22 | gf3 | :D |
| 21:22 | callen | gf3: no, that template should be the actual iterator in the template |
| 21:22 | muhoo | /nick spartacus |
| 21:22 | callen | gf3: it should be executing at runtime. |
| 21:23 | gf3 | muhoo: Heh |
| 21:23 | callen | gf3: unless you changed it out from underneath me |
| 21:23 | TEttinger | what happened at some hour, 36 minutes? |
| 21:23 | TEttinger | no that's 22 minutes...? |
| 21:24 | callen | I'm opening the jar in emacs to verify the template. |
| 21:24 | TEttinger | ,(.getMinutes (java.util.Date. 1380525756531)) |
| 21:24 | clojurebot | 22 |
| 21:25 | callen | gf3: http://i.imgur.com/0c8ln4J.png |
| 21:25 | callen | gf3: that's runtime yo. |
| 21:25 | gf3 | callen: Yeah man, I was kidding |
| 21:26 | callen | http://i.imgur.com/sdopxaN.gif |
| 21:26 | callen | gf3: I'm just pissed the parts I was sure were going to work don't. |
| 21:27 | gf3 | callen: If only we had 2 more hours |
| 21:27 | callen | no joke. |
| 21:27 | `cbp | :( |
| 21:27 | callen | well the project will get wrapped up regardless |
| 21:28 | callen | and be ready for public consumption soon. |
| 21:28 | gf3 | Ja |
| 21:31 | callen | Something that I thought was going to be slow: Execution time mean : 72.732372 µs |
| 21:31 | callen | FEELS GOOD MAN |
| 21:35 | chord | anyone here familiar with "funnel algorithms" |
| 21:35 | muhoo | you know what amusses me? when i write a fucked-up, complicated function that i don't even fully understand how it works, and i'm dreading having to debug the SOB, and it works the first time i test it. |
| 21:38 | chord | muhoo do you know about funnel algorithms in path finding? |
| 21:39 | callen | muhoo: ...success? |
| 21:41 | indigo | callen: Ew, emacs |
| 21:41 | indigo | ;D |
| 21:42 | callen | indigo: that's not my usual environment, I normally use a native emacs, but I was debugging a remote jar and too lazy to TRAMP it. |
| 21:42 | callen | Make fun of Emacs? That's a paddlin'. |
| 21:43 | indigo | Nah, I'm jk |
| 21:44 | nightfly | chord: from google http://digestingduck.blogspot.com/2010/03/simple-stupid-funnel-algorithm.html |
| 21:44 | TonyMontana | hello |
| 21:44 | indigo | Vim repl support is still kinda lame |
| 21:44 | `cbp | what's a good window tiler for mac os? Does xmonad work well? |
| 21:44 | TonyMontana | i am spanish |
| 21:44 | callen | `cbp: I use SizeUp |
| 21:44 | TonyMontana | is it an north american chat? |
| 21:44 | callen | `cbp: I love Xmonad, but Xmonad does *not* work well. |
| 21:44 | TonyMontana | USA or united kingdom? |
| 21:44 | callen | TonyMontana: there are Spanish speakers in North America too. |
| 21:45 | callen | also known as Mexicans, the country your people plundered. |
| 21:45 | callen | TonyMontana: just ask your question in here. |
| 21:45 | `cbp | callen: aw I'll try sizeup |
| 21:45 | `cbp | im mexican |
| 21:45 | callen | `cbp: then help me arouse racial tensions dating to centuries ago. |
| 21:46 | TonyMontana | mexicans are not spanish. mexicans are monkeys |
| 21:46 | callen | `cbp: also that explains the goddamn cactus on your github. |
| 21:46 | callen | 'ho damn. Tony goin' for the gold. |
| 21:46 | callen | TonyMontana: I happen to have some housemates that are mexican, they're nice and intelligent people. You should consider being nicer to other people :) |
| 21:47 | `cbp | callen: I couldnt find a sombrero pic i liked |
| 21:47 | mullr | `cbp: I use ShiftIt, which gives me a least a little control |
| 21:47 | `cbp | at least on wikimedia |
| 21:48 | `cbp | mullr: thanks |
| 21:48 | mullr | https://github.com/fikovnik/ShiftIt |
| 21:48 | TonyMontana | what is the topic of this channel? |
| 21:50 | TonyMontana | Mexico is a very dangerous country |
| 21:50 | rhg135 | clojure is awesome, TonyMontana |
| 21:50 | callen | TonyMontana: I believe there was a time 70 or 80 years ago when Spain was not such a safe place. ;) |
| 21:51 | TonyMontana | i agree with you, callen |
| 21:51 | callen | TonyMontana: but I don't need you to agree with me, I need you to be more polite and civilized and not insult entire countries of people. |
| 21:52 | muhoo | what is this, the new #clojure theme song now? http://www.youtube.com/watch?v=woySeSNBL3o |
| 21:52 | callen | TonyMontana: being rude is not how you get help. You will learn to be respectful of other peoples' feelings or you will learn to do without the company of others. |
| 21:52 | TonyMontana | are you a USA citizen? |
| 21:52 | callen | TonyMontana: it doesn't matter who you are and where you're from - only what you do. |
| 21:53 | callen | TonyMontana: do you have a Clojure question or not? |
| 21:53 | rhg135 | muhoo: possibly |
| 21:53 | TimMc | technomancy: Can we get an op up in here? |
| 21:53 | TonyMontana | i dont know that "clojure" means |
| 21:53 | muhoo | /ignore TonyMontana |
| 21:54 | TonyMontana | okey, ignore me |
| 21:54 | callen | Clojure is a programming language. |
| 21:55 | callen | well this is a new one for me: CompilerException java.lang.RuntimeException: Unable to resolve symbol: require in this context, compiling:(tardis/is/awesome/handler.clj:1:70) |
| 21:56 | TonyMontana | do you know a chat room for speaking english with others USA citiziens? |
| 21:56 | callen | TonyMontana: this would be the place. |
| 21:58 | TonyMontana | but you are talking about Clojure programming language" . I dont know this.I only know others languages, for example Java/C++ |
| 21:59 | callen | TonyMontana: well, learn Clojure if you like. |
| 22:02 | TEttinger | this is the channel for http://clojure.org . If you aren't talking about clojure or applications you are writing in clojure, you won't get much response. Many IRC channels on Freenode are centered around programming languages. |
| 22:03 | seangrov` | #clojure has been attracting strange people this last couple of months |
| 22:03 | callen | CoconutCrab: love your nick. |
| 22:03 | callen | even if those creatures are terrifying. |
| 22:05 | arohner | seangrov`: that's what happens when the channel doubles in size |
| 22:05 | TimMc | CoconutCrab: This is the image I will always see in my head when I think of that animal: http://creepyanimals.com/wordpress/wp-content/uploads/2010/02/coconut-crab.jpg |
| 22:06 | TonyMontana | what the fuck |
| 22:06 | callen | they are, in a "eats your face" sort of way. |
| 22:06 | rasmusto | it looks like a buff spider |
| 22:06 | callen | arohner: admire CCI for supporting Ambrose btw. |
| 22:06 | TEttinger | the way they move is freakier http://www.arkive.org/coconut-crab/birgus-latro/video-12.html |
| 22:06 | TEttinger | lunging |
| 22:07 | callen | TEttinger: egads |
| 22:07 | callen | scariest part? not the biggest crab. |
| 22:07 | callen | http://en.wikipedia.org/wiki/Japanese_spider_crab |
| 22:08 | callen | leave it to Japan to have the Godzilla crab. |
| 22:08 | CoconutCrab | biggest land anthropod, IIRC |
| 22:08 | seangrov` | arohner: Hopefully the SNR doesn't get too bad |
| 22:09 | seangrov` | It would be interesting to graph the channel size over time |
| 22:09 | callen | I think arohner has me ignored. Could someone please ask him nicely to unignore me? |
| 22:10 | chord | callen: I will if you ask the others to unignore me |
| 22:16 | chord | callen: why do you always ignore me |
| 22:18 | marcopolo2 | "Coconut crabs may be responsible for the disappearance of Amelia Earhart's remains, consuming them after her death and hoarding her skeletal remnants in their burrows." |
| 22:19 | callen | marcopolo2: LOL |
| 22:19 | marcopolo2 | That's enough of the internet for tonight, good night |
| 22:21 | seangrov` | hah |
| 22:23 | TimMc | Who runs the n01se.net logger? They desperately need NTP. |
| 22:23 | TimMc | CoconutCrab: I kind of want a giant land crustacean as a pet. |
| 22:27 | muhoo | TimMc: that's chouser, no? |
| 22:28 | callen | chouser is a giant land crustacean? |
| 22:35 | muhoo | n01se.net is chouser, IIRC |
| 22:36 | TEttinger | arohner: callen admires CCI for supporting Ambrose btw. |
| 22:43 | amalloy | TimMc: it's chouser for sure |
| 22:49 | chord | lets talk about starcraft 2 path finding |
| 23:02 | chord | so how would you implement path finding if you had to |
| 23:13 | chord | PATH FINDING |
| 23:13 | chord | you guys we can do this together |
| 23:14 | chord | we are all friends |
| 23:17 | AimHere | Well if you're emulating protoss dragoon pathfinding it's easy to do in clojure: (rand-nth [:north :northeast :east :southeast :south :southwest :west :northwest]) |
| 23:17 | AimHere | Call that every 2 seconds, you're golden |
| 23:18 | `cbp | lol |
| 23:23 | arohner | TEttinger: thanks! |
| 23:27 | muhoo | is there a conditional concat? i.e. (if foo (concat bar foo) foo) so i don't have to have foo in there 3 times? |
| 23:28 | muhoo | sorry, (if foo (concat bar foo) bar) |
| 23:30 | OtherRaven | muhoo: not that I know of, though that doesn't mean much |
| 23:30 | `cbp | muhoo: you could use cond-> i guess |
| 23:32 | `cbp | cond->> |
| 23:33 | muhoo | ah, good point, thanks. |
| 23:35 | TEttinger | there's a cond->> ? |
| 23:35 | TEttinger | ,(doc cond->>) |
| 23:35 | clojurebot | "([expr & clauses]); Takes an expression and a set of test/form pairs. Threads expr (via ->>) through each form for which the corresponding test expression is true. Note that, unlike cond branching, cond->> threading does not short circuit after the first true test expression." |
| 23:35 | muhoo | sure, and it's awesome |
| 23:36 | muhoo | i didn't know about it until i read the codeq source. then i was like "yeah..." |
| 23:37 | AimHere | muhoo, if foo returns a nice falsy nil, then doesn't (concat bar foo) work just dandy? |
| 23:38 | muhoo | AimHere: no, it concats nil into the list [1 2 3 4 nil] |
| 23:38 | AimHere | That shouldn't happen |
| 23:38 | TEttinger | ,(concat [1 2 3] nil) |
| 23:38 | clojurebot | (1 2 3) |
| 23:38 | AimHere | ,(concat '(1 2 3) nil) |
| 23:38 | clojurebot | (1 2 3) |
| 23:38 | muhoo | ,(concat [1 2 3 4] [nil]) |
| 23:38 | clojurebot | (1 2 3 4 nil) |
| 23:39 | TEttinger | ,(concat [1 2 3] (when false [1 2 3])) |
| 23:39 | clojurebot | (1 2 3) |
| 23:39 | metellus | that's only if foo is a vector containing nil |
| 23:39 | AimHere | (if [nil] (concat [1 2 3] [nil])) |
| 23:39 | AimHere | Oops |
| 23:39 | metellus | which won't work with if either |
| 23:40 | muhoo | i ended up with (cond-> bar foo (conj foo)) |
| 23:41 | muhoo | still some duplication there but golf is only fun for so long |
| 23:41 | AimHere | ,(conj [1 2 3] [nil]) |
| 23:42 | clojurebot | [1 2 3 [nil]] |