2012-07-01
| 00:46 | pdk | hi, are there any known guidelines for dealing with null pointer errors on source lines during compilation? |
| 00:47 | pdk | i've got one function in a source fule that fails to compile with a null pointer on an unusual line |
| 00:49 | adu | null? |
| 00:49 | adu | what's the line? |
| 00:49 | pdk | i'll pastebin |
| 00:51 | pdk | http://pastebin.com/6ef5s6Ax this is the function in the source that fails to compile, i get CompilerException: NullPointerException on the location of line 17 in the actual file |
| 00:51 | pdk | so it seems to be throwing a null pointer on the binding list of the doseq of all odd places |
| 00:54 | michaelr525 | pdk: do you also get warnings? |
| 00:54 | pdk | nope, compilation stops right there when i (load-file) into a repl |
| 00:55 | pdk | should note it's the same story with 1.3 and 1.4 |
| 00:56 | wingy | what server do i have to run if i choose noir over aleph |
| 00:56 | wingy | jetty? |
| 01:04 | adu | wingy: I love noir |
| 01:04 | adu | wingy: all of the error messages that noir gives seem to contain the word Jetty |
| 01:06 | pdk | ok my stack trace doesnt show anything related to the source either it seems |
| 01:07 | pdk | just traces typical compiler funcionts |
| 01:07 | pdk | functions |
| 01:12 | wingy | adu: so if i run noir it will be jetty? |
| 01:12 | wingy | i have heard netty perform far better |
| 01:12 | wingy | and is a fit for web servers handling a lot of requests |
| 01:12 | wingy | i guess i should just try them both out and see for myself |
| 01:16 | wingy | guess i should read this one: http://brehaut.net/blog/2011/ring_introduction |
| 01:18 | xeqi | wingy: noir is independent of the server |
| 01:18 | xeqi | by default the noir templates use jetty |
| 01:19 | xeqi | but since ring has several adapter, you can run it with jetty, as a war in a servlet container, using aleph for netty, etc |
| 01:19 | wingy | right |
| 01:26 | ibdknox | netty does not perform better than jetty |
| 01:26 | ibdknox | unless you're doing long polling |
| 01:26 | ibdknox | wingy ^ |
| 01:27 | adu | wingy: that's my guess |
| 01:29 | ibdknox | in general, threaded servers are very, very good at serving short-lived requests |
| 01:30 | Raynes | ibdknox: I need to talks to yous |
| 01:31 | lynaghk | What's the story with dynamic vars in cljs? I should be able to use one as a simple variable pretty much, no? |
| 01:31 | ibdknox | Raynes: what's up? |
| 01:32 | Raynes | ibdknox: I added the middleware from refheap to lib-noir and released an alpha of 0.2.0. I considered having a 'noir.utils' namespace with the middleware because none of it is at all complex and it is all very small, but I went ahead and gave each middleware its own namespace because that's how ring itself does it. Feel free to veto this since it is only an alpha (I made it an alpha for the sole purpose of letting you veto this :p). |
| 01:32 | ibdknox | hm |
| 01:32 | ibdknox | they're so small |
| 01:32 | Raynes | I'm stuck between 'modularity is good and weavejester wont hate me' and 'jesus, they're so small'. |
| 01:32 | ibdknox | I dunno that having them in their own namespaces makes sense |
| 01:33 | amalloy | each middleware having its own namespace is annoying in ring, don't copy that |
| 01:33 | ibdknox | yeah |
| 01:33 | ibdknox | I agree |
| 01:33 | Raynes | I agree. |
| 01:33 | lynaghk | thirded. |
| 01:33 | Raynes | I'll change it tonight or tomorrow. |
| 01:33 | Raynes | ibdknox: noir.utils or something else? |
| 01:33 | ibdknox | hm |
| 01:33 | Raynes | amalloy: BTW, you should see if there is any middleware in 4clojure we should move to lib-noir, since 4clojure uses it too. |
| 01:34 | lazybot | I am revealing my sentience just to agree with amalloy on this. |
| 01:34 | Raynes | Hurr |
| 01:34 | kovasb | lol |
| 01:34 | ibdknox | lol |
| 01:35 | amalloy | $logout (...nothing to see here...) |
| 01:35 | lazybot | You've been logged out. |
| 01:35 | amalloy | there are a few neat middlewares but i don't know how generally-applicable they are |
| 01:35 | kovasb | is there a way to backchannel commands to lazybot? |
| 01:35 | amalloy | kovasb: only if you own him |
| 01:35 | kovasb | make sure it agrees with you :) |
| 01:35 | kovasb | haha |
| 01:35 | lynaghk | kovasb: Your distrust of automatically-adding-watches to atoms is well placed. That stuff has been catching up with me the past few hours. |
| 01:35 | amalloy | anyone can make him agree with you, though, or shoot down your opponents |
| 01:36 | Raynes | amalloy: I'll take a look myself when I do the other stuff. ibdknox gets decide what goes in in the end anyways. |
| 01:36 | Raynes | gets to decide, even |
| 01:36 | kovasb | lynaghk: getting too complicated, or something else? |
| 01:36 | amalloy | we have wrap-strip-trailing-slash, which is simple and probably useful |
| 01:36 | Raynes | amalloy: That was in refheap. Already moved to lib-noir. |
| 01:36 | ibdknox | yeah, that is really useful |
| 01:37 | lynaghk | kovasb: Been going in some debugging circles. I finally believe I've tracked it down, but I haven't been able to replicate in a minimal test case, so I could be way off |
| 01:37 | Raynes | ibdknox: So noir.utils? |
| 01:37 | Raynes | noir.utiddlware. |
| 01:37 | amalloy | wrap-debug, though you'd want a version that doesn't depend on useful |
| 01:37 | kovasb | lynaghk: ouch |
| 01:37 | ibdknox | noir.util.middleware? |
| 01:38 | Raynes | ibdknox: Ah! Excellent. |
| 01:38 | ibdknox | I used to have one with the wrap-utf8 thing, before that got included in ring by default |
| 01:38 | kovasb | lynaghk: 24 hours later, I've finished migrating to build 1424 :) |
| 01:38 | Raynes | ibdknox: I tried to get noir.session in ring, but weavejester didn't want it. |
| 01:38 | kovasb | the horrors |
| 01:38 | Raynes | Understandable I guess. |
| 01:38 | ibdknox | yeah |
| 01:39 | lynaghk | kovasb: if you look at how reflex is implemented, it captures deref'd atoms by having them register with a global when they're derefed. The issue is that this also catches atoms that are derefed in the watchers (which can have no effect on the state anyway). |
| 01:39 | lynaghk | kovasb: did you figure out what that index out of bounds thing was about? |
| 01:39 | amalloy | the client-side-caching features are pretty cool, actually, but maybe a little too complex to make part of lib-noir |
| 01:39 | kovasb | lynaghk: yes, the compiler was breaking in the worst possible way |
| 01:40 | kovasb | lynaghk: apparently was choking on innocuous stuff in some file |
| 01:41 | amalloy | ibdknox: there's a middleware that serves static files for git-version 1.2.3 (for example) as foo__123.js instead of as foo.js, and then sends the client a "cache this for as long as you want" header |
| 01:41 | lynaghk | kovasb: what was it? If you ran into it, we probably have some lil' time bombs waiting around too. |
| 01:41 | ibdknox | amalloy: oh neat |
| 01:41 | ibdknox | amalloy: that is also very useful stuff |
| 01:41 | amalloy | but it requires some cooperation from your hiccup or whatever, the way it's currently written. which is why i hesitate to suggest adding to noir |
| 01:42 | antares_ | hey Raynes |
| 01:42 | kovasb | lynaghk: my way of instantiating high charts was the culprit, was a hack due to some other limitation |
| 01:42 | Raynes | antares_: Sup? |
| 01:42 | Raynes | antares_: I saw your beta. |
| 01:42 | Raynes | Cool stuff. |
| 01:42 | Raynes | I'll add it tomorrow. |
| 01:42 | amalloy | perhaps you could take a look and suggest improvement? https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/version_utils.clj#L8 and https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/ring.clj#L37 |
| 01:43 | kovasb | lynaghk: i don't know what exactly about the syntax it was |
| 01:43 | antares_ | Raynes: you can just add me to the refheap repo instead, I will break things for you |
| 01:43 | Raynes | Haha |
| 01:43 | Raynes | Sec |
| 01:43 | kovasb | lynaghk: I'm not understanding what a " atoms that are derefed in the watchers" is |
| 01:44 | kovasb | you mean the downstream guys? |
| 01:44 | Raynes | antares_: Added. |
| 01:44 | Raynes | Break away |
| 01:44 | Raynes | How can I now add the Monger maintainer to my Monger app? |
| 01:44 | Raynes | ;p |
| 01:46 | lynaghk | kovasb: I wasn't distinguishing between atoms derefenced "on purpose" and those "by accident". E.g., imagine an atom A with a watcher that dereferences and prints atom B whenever A changes. |
| 01:46 | kovasb | i see |
| 01:47 | kovasb | and what happens when b is derefed? |
| 01:47 | kovasb | something bad? |
| 01:47 | antares_ | Raynes: migrate to monger, get the maintainer for free |
| 01:47 | antares_ | sort of |
| 01:47 | lynaghk | kovasb: potentially, yeah. I got some infinite loops out of it. |
| 01:48 | kovasb | its registering globally so you can have the dependency list? |
| 01:48 | lynaghk | kovasb: It's all a bit muddied in my head, still, which means I need to sit back and think more about this stuff. Especially that I can't reproduce the problem in a minimal example makes me think I'm seriously missing something. |
| 01:48 | kovasb | lynaghk: i was having the same problem today for about 3 hours |
| 01:48 | kovasb | lynaghk: then i rebooted the browser, and it worked |
| 01:49 | lynaghk | kovasb: yeah. Monkey-patching the Atom type is the only way I could think of picking up atom derefs automatically |
| 01:49 | lynaghk | kovasb: since @ is an unchangable reader macro that expands into cljs.core.deref, so I can't do a namespace-specific protocol thing. |
| 01:49 | kovasb | lynaghk: is the fact that B is making a side-effect irrelevant? |
| 01:49 | kovasb | to the example |
| 01:50 | kovasb | right |
| 01:50 | kovasb | you pretty much have to roll your own atom to do this |
| 01:51 | Raynes | antares_: It's nice for me just because I can ask you for help. |
| 01:51 | lynaghk | kovasb: I'm not sure if that would fix this particular problem. |
| 01:51 | Raynes | The work you're doing is a huge plus. |
| 01:52 | kovasb | lynaghk: yeah, if you can simplify the issue then you can look at what knockout did |
| 01:52 | simcop2387 | are there any recommended tutorials/guides online for learning clojure? I'd love something that walks through starting a project and putting all the pieces together to making something more complex than "hello world" |
| 01:52 | lynaghk | kovasb: how do you mean? |
| 01:52 | kovasb | it would seem semantically correct for B to be a dependency |
| 01:53 | kovasb | lynaghk: you are doing the same strategy as knockout? |
| 01:53 | lynaghk | kovasb: yeah, that's where I got the idea of implicitly registering in the first place. |
| 01:54 | lynaghk | kovasb: that project has really nice design-level documentation explaining how/why the internals work. |
| 01:54 | kovasb | lynaghk: if infinite loops are the problem, i imagine it had those too |
| 01:54 | kovasb | lynaghk: until they figured out how to fix it |
| 01:54 | lynaghk | kovasb: that's the thing, I can't replicate in a minimal example so I'm wondering if it's some weird namespace issue or some such. |
| 01:55 | kovasb | lynaghk: but it is repeatible? |
| 01:55 | lynaghk | kovasb: I'll give it another crack tomorrow, because I although I wrote some code and no longer have this problem it's a bit unsatisfying to leave this open. |
| 01:55 | kovasb | yeah for sure |
| 01:55 | lynaghk | kovasb: between cleaning out lein cljsbuild caches and stuff? Yeah. |
| 01:56 | kovasb | lynaghk: js/alert ftw |
| 01:56 | kovasb | sophisticated tools for sophisticated languages |
| 01:56 | lynaghk | I think I just need to suck it up and put metadata on all of these atoms so I can actually piece together the dependency graph |
| 01:57 | kovasb | lynaghk: that could be useful |
| 01:57 | lynaghk | instead of printing out 20-levels deep implementation details of cljs. |
| 01:57 | kovasb | lynaghk: also, I'm personally breaking down and resolving to learn to use the analyzer |
| 01:57 | kovasb | lynaghk: get get to the bottom of what's going on |
| 01:57 | lynaghk | kovasb: I'll break down and buy you a bottle of scotch next time I run into serious shit then =P |
| 01:57 | kovasb | lol |
| 01:58 | kovasb | it will be a function in session |
| 01:58 | kovasb | so it can be easily repeatible |
| 01:58 | kovasb | analyze this |
| 01:59 | adu | I read a book on clojure today |
| 01:59 | kovasb | give some nicely tooltiped/hilighted source representation |
| 01:59 | adu | I think it was called "The joy of Clojure" |
| 01:59 | kovasb | adu: you read the whole thing in one day?? |
| 01:59 | lazybot | kovasb: Uh, no. Why would you even ask? |
| 01:59 | adu | I had a lot of fun reading it :) |
| 02:00 | kovasb | glad it delivers on its title |
| 02:00 | adu | kovasb: I spent the day at a book store because I have no electricity |
| 02:00 | kovasb | cool |
| 02:00 | adu | but now I'm running a generator for my milk, meat, lettuce, and cheese, so I plugged my laptop and router into the fridge |
| 02:01 | kovasb | lol |
| 02:01 | kovasb | i see you like simplicity then |
| 02:01 | adu | yes, as long as I have cheese and internet I am a happy man |
| 02:03 | adu | so I've been slowly realizing that clojure is everything I could ever want |
| 02:03 | adu | I've been building a webserver in it |
| 02:03 | kovasb | its like a combination of cheese and internet |
| 02:04 | adu | yesssss |
| 02:04 | adu | my webserver is currently using noir+cheshire+clostache |
| 02:04 | adu | and I'm realizing that clostache and noir don't work well together |
| 02:05 | adu | you have to use {{{x}}} to substitude html in mustache, and then it works |
| 02:05 | kovasb | I'm a fan of hiccup myself |
| 02:05 | adu | I really want to separate my content from the logic |
| 02:05 | kovasb | hiccup is content |
| 02:05 | adu | and mustache has a zillion implementations |
| 02:06 | kovasb | i see |
| 02:06 | adu | so if I wanted to port my site to intercal, I could |
| 02:06 | kovasb | right |
| 02:06 | adu | but I probably won't |
| 02:06 | kovasb | you should be able to take from noir what you want, and use moustache |
| 02:06 | adu | the prototype for the site was in django, but I'm starting to hate django |
| 02:06 | kovasb | yes, once you've realized clojure is all you can ever need |
| 02:06 | adu | and I'm starting to love clojure |
| 02:06 | kovasb | why not just go native |
| 02:07 | adu | so you're saying I should write my templates in huccup, not clostache? |
| 02:07 | kovasb | my position is |
| 02:07 | kovasb | i think templating languages are like child-programming |
| 02:08 | kovasb | i really don't like non-universal sublangauges |
| 02:08 | adu | what I don't like about template languages is that they're one-way |
| 02:08 | kovasb | clojure can represent everything you need |
| 02:09 | kovasb | yeah, theres that problem. but its just a consequence of it not being a real programming construct |
| 02:09 | adu | I've also been looking into Perl6, and they've made a language that makes parser easy to write, and there are people working on inverse parsers, i.e. templates |
| 02:09 | kovasb | its a interesting field, lots of efforts at interesting stuff |
| 02:10 | adu | imagine, parser = G.parse(), template = G.inverse() |
| 02:11 | adu | the possibilities |
| 02:11 | adu | my at-work efforts are all about webde |
| 02:11 | adu | v |
| 02:11 | adu | my at-home efforts are all about my function database |
| 02:12 | adu | I truely believe in it |
| 02:12 | adu | that it could become a compiler-compiler-compiler |
| 02:12 | adu | my friends tell me that's too "meta" |
| 02:12 | adu | I don't case |
| 02:12 | adu | s/case/care/ |
| 02:18 | antares_ | Raynes: how can I delete a paste in refheap? |
| 02:20 | amalloy | Raynes: i think i hate browserid. refheap asks me for an email address, and then after i sign up it wants a username. can't use amalloy, though, because i used that last time i signed up with whatever different email address. and afaik i can't sign in using a username, so i can't figure out what email address i used? |
| 02:31 | wingy | what does the #' mean in: run-jetty #'app {:port 8080 :join? false}) |
| 02:33 | adu | wingy: I don't know |
| 02:34 | adu | wingy: in Common Lisp it means something, I don't know about Clojure |
| 02:34 | napping | #'app returns the Var that app refers to in the namespace, rather than looking up the value of app |
| 02:34 | napping | that means if you redefine app, run-jetty can see the new value through the var |
| 02:37 | wingy | napping: i see thx |
| 02:37 | wingy | napping: since everything is immutable right? |
| 02:37 | wingy | if we passed the app value instead it would still keep the old one even if we changed the var |
| 02:40 | napping | Yeah, if it's not picking up changes, forgetting that could be why. seems like run-jetty could be a macro to avoid that |
| 02:42 | Raynes | antares_: You can only delete pastes when you're signed in and created the paste while signed in. You click the 'delete' button in the upper left of the paste. |
| 02:42 | antares_ | Raynes: I figured why I cannot sign in |
| 02:42 | antares_ | I actually can |
| 02:43 | antares_ | but then something fails to authenticate as an SSL peer |
| 02:43 | antares_ | and fails |
| 02:43 | Raynes | amalloy: mmarczyk had a similar problem, his username had somehow become null. |
| 02:43 | amalloy | i'm probably just using a different email address |
| 02:44 | antares_ | Raynes: also, when I hit Command on any page, Refheap asks me to go to line…, it is super annoying because I can't easily navigate away from Safari |
| 02:44 | antares_ | to a different window |
| 02:44 | Raynes | antares_: That doesn't happen to me. |
| 02:44 | Raynes | amalloy: Oh, wait, you're complaining about something different. |
| 02:45 | Raynes | amalloy: You shouldn't sign up with an email address you can't remember. |
| 02:45 | Raynes | antares_: I'll try it in safari. |
| 02:45 | amalloy | well i'd rather not sign up at all. i was just trying to sign in to confirm for antares_ that there's a delete option |
| 02:46 | Raynes | amalloy: Anyways, I can change your account email for you if you want. |
| 02:46 | amalloy | meh. if i desperately need to sign in, i'll just find a way to hack your heroku account |
| 02:47 | antares_ | ah, wait |
| 02:47 | amalloy | probably by starting some kind of heroku-api project and convincing you to commit your password |
| 02:47 | Raynes | antares_: Yeah, I can't reproduce in any browser. mmarczyk had some issues like this though. Problem is, the js that handles the hotkeys is pretty complex and written by a guy who seems to have disappeared off the face of the planet. |
| 02:47 | antares_ | I think browserid redirects to an HTTPS page |
| 02:47 | Raynes | antares_: If you know js and want to take a look, feel free to punch it in the face and fix that issue. |
| 02:48 | Raynes | *shrug* |
| 02:48 | antares_ | Raynes: ok, I will take a look, I am trying to sign in somehow first |
| 02:49 | Raynes | antares_: I can't reproduce that either. I can sign in in any browser just fine. :| |
| 02:49 | Raynes | Or do you mean locally? |
| 02:49 | antares_ | locally |
| 02:49 | Raynes | In safari? |
| 02:49 | antares_ | in any browser |
| 02:49 | Raynes | Going to try. |
| 02:50 | Raynes | antares_: Also, that private yes no toggle button is off in safari. That js guy who disappeared did that too and was supposed to fix it. :\ |
| 02:50 | Raynes | Looks fine in every other browser. |
| 02:50 | Raynes | I need to look at it/get a css guy to look at it. |
| 02:50 | Raynes | Not necessarily you, just pointing it out in case it looks weird for you. |
| 02:52 | Raynes | antares_: Btw, does Monger have a special function for updating records? |
| 02:52 | antares_ | updating records? |
| 02:53 | antares_ | it has everything that mongo shell has |
| 02:53 | antares_ | like monger.collection/save coll document |
| 02:53 | antares_ | if that document has :_id, it will be saved |
| 02:53 | antares_ | updated |
| 02:53 | antares_ | if not, inserted |
| 02:53 | Raynes | Then that's probably what I'm talking about. congomongo has an update function that updates a document. |
| 02:54 | Raynes | Anyways, does it return a write result? |
| 02:54 | antares_ | yes, but we can add save-and-return |
| 02:54 | antares_ | but so far I have only seen you use regular updates |
| 02:54 | Raynes | Regular updates was what I was talking about. |
| 02:55 | antares_ | I found out what fails |
| 02:55 | Raynes | Sorry, I don't understand mongo that well. I'm probably sounding like a lunatic. |
| 02:55 | antares_ | http/post to "https://browserid.org/verify" |
| 02:55 | Raynes | So, refheap isn't working at all for me. |
| 02:56 | Raynes | https://www.refheap.com/paste/3397 |
| 02:56 | Raynes | That's what I get when I try to go to / |
| 02:56 | antares_ | ok, things work better on oraclejdk 7 which has a differnt set of SSL certificates |
| 02:56 | antares_ | yes, I am now seeing the same |
| 02:57 | antares_ | I think collection is passed as a keyword somewhere |
| 02:57 | antares_ | monger uses strings |
| 02:57 | Raynes | Y U BREAK MY REFHEAP |
| 02:57 | Raynes | :p |
| 02:57 | antares_ | but I am also redirected to /paste from the root |
| 02:57 | Raynes | I've got to take off. Do you need anything before I run? |
| 02:58 | antares_ | yeah, it's in the session store |
| 02:58 | antares_ | no, I think I am all set |
| 02:58 | Raynes | Cool. I'll mess with all of this stuff tomorrow. I'm going to hack until my fingers bleed tomorrow. |
| 02:58 | Raynes | Laters |
| 02:58 | antares_ | Raynes: wait, one question |
| 02:59 | Raynes | Sup |
| 02:59 | antares_ | Raynes: do you know what may be passing keywords instead of strings to the session store? |
| 02:59 | antares_ | I will probably just support keywords as collection names in monger but it is not immediate from the trace |
| 03:00 | Raynes | Good question. |
| 03:00 | Raynes | antares_: (monger-store :sessions) |
| 03:00 | antares_ | *immediately obvious |
| 03:00 | Raynes | server.clj, last line. |
| 03:00 | antares_ | ahh, yeah |
| 03:00 | antares_ | ok, thanks |
| 03:00 | Raynes | :) |
| 03:01 | wingy | is there a good way to look inside the deps my project is using |
| 03:01 | wingy | to see what namespaces and functions i can use |
| 03:02 | wingy | and their source code .. at the moment they are all .jar:s in .m2/ folder |
| 03:02 | amalloy | open up the jars in emacs |
| 03:02 | antares_ | tab completion in the REPL, it is also not hard to write a function that will list all namespaces under the given one |
| 03:02 | antares_ | listing functions is also not hard but some namespaces have quite a few |
| 03:02 | wingy | damn not using emacs |
| 03:03 | antares_ | wingy: no need to opening jars in emacs, that's too hardcore |
| 03:03 | antares_ | *open |
| 03:03 | wingy | i forgot i could look at their github repos |
| 03:06 | amalloy | antares_: what's hardcore about it? using emacs? reading the source? |
| 03:07 | antares_ | amalloy: asking newbies to do both |
| 03:07 | adu | github++ |
| 03:07 | antares_ | reading the source is very important but is also not an option early on |
| 03:07 | antares_ | and if you need to do it, like adu says, it is easier to browse the repo on github |
| 03:08 | adu | wingy: I've been trying to keep up with your questions |
| 03:08 | amalloy | reading the source is going to be easier than writing a function to list namespaces/functions |
| 03:11 | wingy | adu: i ask a lot dont i :) |
| 03:12 | adu | asking questions is good |
| 03:17 | wingy | "lein repl" starts my server immediately which makes me unable to use the repl |
| 03:18 | antares_ | wingy: lein repl compiles your code |
| 03:18 | wingy | what should i do to regain the repl |
| 03:18 | antares_ | this means that you are starting your server in the top-level ns code |
| 03:18 | antares_ | which is wrong |
| 03:18 | antares_ | start it in -main |
| 03:19 | wingy | i do |
| 03:19 | wingy | in my project.clj there is : :main yobistore.core |
| 03:19 | antares_ | anything that blocks cannot be used in the ns code |
| 03:19 | antares_ | otherwise lein or anything else that compiles that namespace will be blocked |
| 03:19 | antares_ | wingy: it may be one of the dependencies, too |
| 03:20 | wingy | (def -main |
| 03:20 | antares_ | quartzite once had this problem when it started the scheduler in the top level code |
| 03:20 | wingy | (run-jetty #'app {:port 8080 :join? false})) |
| 03:20 | wingy | i run it in the -main .. so the repl must behave like "lein run" it runs the -main immediately thus blocking the repl? |
| 03:21 | wingy | ok ill look into it |
| 03:21 | wingy | i should follow a guide |
| 03:24 | antares_ | wingy: lein repl does not invoke -main |
| 03:24 | antares_ | I am in the refheap's repl right now, for example |
| 03:25 | antares_ | but both of them compile your code |
| 03:25 | antares_ | so if there is anything in the namespace body and not functions, it will be executed after compilation |
| 03:26 | amalloy | wingy: (defn -main [& args] ...), not (def -main ...) |
| 03:28 | wingy | wii |
| 03:28 | wingy | amalloy: :D |
| 03:28 | wingy | that was the problem |
| 03:30 | wingy | ns-publics is quite good for listing everything |
| 03:31 | wingy | but github was better .. no ns-publics, then doc, then source etc |
| 03:39 | wingy | coming from node.js its pretty simple to get middleware and stuff |
| 03:39 | wingy | lein is like npm with superpower |
| 03:49 | amalloy | isn't npm just the package manager? that's only one of lein's tasks, and it delegates to maven/aether to do most of it |
| 03:56 | antares_ | wingy: most of that comes from sitting on top of a very large mature ecosystem that solved many problems many years ago |
| 03:57 | wingy | amalloy: yeah .. lein is package manager + build system? |
| 03:58 | amalloy | mostly it's a build system |
| 03:58 | wingy | cool |
| 03:58 | wingy | antares_: yeah i start to like using java now and looking at their std lib |
| 04:00 | antares_ | wingy: there are very poorly done parts in the JDK, too, but when it comes to various plumbing parts like security, sync and async I/O and especially concurrency, JDK is probably the most solid thing out there (that is open source) |
| 04:01 | antares_ | wingy: for example, dates in the JDK are only good if you want to get current date (instantiate java.util.Date). For anything else, use clj-time which uses a 3rd party date library (Joda Time) internally. |
| 04:01 | antares_ | so you can do things like (-> 2 months ago) |
| 04:02 | wingy | wow |
| 04:03 | amalloy | dates aren't even that good for the current date :P |
| 04:03 | antares_ | amalloy: I agree :) |
| 04:03 | wingy | i start to like jvm .. except the boot time |
| 04:04 | wingy | "the power of the sun in the palm of my hand" |
| 04:05 | wingy | clj/jvm that is |
| 04:08 | wingy | do you prefer enlive's or hiccup's way of doing templating? |
| 04:09 | wingy | feels that hiccup conform with clj very naturally since it's a DSL and enlive is cleaningly separating template from code |
| 04:10 | wingy | you have your .html files and then code that manipulates it |
| 04:10 | antares_ | I use stencil (a Mustache implementation) |
| 04:11 | antares_ | hiccup is fine but frontend developers probably won't like it |
| 04:11 | antares_ | mustache typically raises no issues, in fact, some really likei t |
| 04:12 | wingy | antares_: what about enlive? |
| 04:12 | wingy | wouldn't frontend devs like it |
| 04:12 | antares_ | I haven't tried it |
| 04:12 | antares_ | possibly, stencil works well for me and I am happy with it :) |
| 04:16 | wingy | seems not very up to date |
| 04:16 | wingy | 8 months ago |
| 04:16 | wingy | 7 |
| 04:17 | wingy | clojure 1.3 |
| 04:17 | ibdknox | stencil is solid |
| 04:17 | ibdknox | it hasn't needed updating |
| 04:18 | ibdknox | since the mustache spec doesn't change much :) |
| 04:23 | antares_ | wingy: stencil is very solid |
| 04:24 | antares_ | wingy: another thing about Clojure and JVM is that if something isn't updated for 7 months, it does not mean it is abandoned |
| 04:24 | antares_ | people just do not rush to add features. Clojure 1.3 does not matter, specify 1.4 for your project and it will work just fine |
| 04:24 | antares_ | all http://clojurewerkz.org projects are on 1.3, even though most apps that I use them with are on 1.4 |
| 04:24 | wingy | i like how light weight things are in clojure world |
| 04:24 | antares_ | we test against 1.4 and 1.5-master-SNAPSHOT |
| 04:25 | antares_ | but the default version will be 1.3 for probably at least 1.6 release |
| 04:25 | wingy | ok |
| 04:25 | antares_ | why? because some folks use 1.3 |
| 04:31 | amalloy | ibdknox: dsantiago was complaining about proposed changes to the mustache spec this morning |
| 04:31 | amalloy | which tbh look pretty horrible |
| 04:35 | dsantiago | amalloy: Like I (and Chris) said, the spec doesn't change much ,despite all the discussion. |
| 04:58 | otfrom | seancorfield: are you around? |
| 05:02 | wingy | for those of you that are using clojure with heroku, what server is heroku using to serve the clojure app? |
| 05:02 | wingy | or is it using whatever server (tomcat, jetty, netty) you are using yourself? |
| 05:03 | antares_ | wingy: with Heroku it is typically Jetty because it is embedded |
| 05:03 | antares_ | but I don't think Heroku provides you a container like tomcat |
| 05:03 | wingy | antares_: is netty embedded as well? |
| 05:04 | wingy | is jetty good for production? |
| 05:04 | antares_ | and netty is typically used as an I/O library, I don't think many projects use its HTTP server as is |
| 05:04 | antares_ | wingy: Jetty is at 8.0 or so |
| 05:05 | wingy | antares_: i mean is it fast/reliable enough for many concurrent conncetions in production mode? |
| 05:05 | antares_ | and is one of the fastest Web servers on the JVM, mostly because it is very small compared to Tomcat, JBoss AS and so on |
| 05:05 | antares_ | wingy: Yammer's production services run Jetty |
| 05:06 | antares_ | wingy: and they have gazillions users and $MSFT bought them out for 1.1 billion |
| 05:06 | antares_ | wingy: good enough for you? |
| 05:06 | wingy | wow |
| 05:06 | wingy | hm |
| 05:06 | wingy | yeah it'll do |
| 05:07 | antares_ | in general, just about anything should yield several thousands requests per second on hello world-ish apps |
| 05:07 | antares_ | people choose jetty because it is really easy to just embed and never worry about it |
| 05:08 | wingy | yeah |
| 05:08 | wingy | ill just use that then |
| 05:08 | wingy | and see where it gets me |
| 05:08 | wingy | in my ears embedded sounded weaker than stand alones |
| 05:08 | otfrom | heroku have nginx -> jetty, so the jetty isn't directly exposed to the internet |
| 05:09 | otfrom | which is also something you need to be aware of if doing SSL |
| 05:09 | otfrom | as the SSL is between nginx and the world, but the nginx -> jetty is normal http |
| 05:10 | antares_ | wingy: how? node.js' hyped HTTP server is embedded |
| 05:10 | antares_ | wingy: embedded just means "used as a library". Of course frontend Heroku is Nginx |
| 05:12 | wingy | antares_: i c |
| 05:12 | wingy | using things as a library is awesome |
| 05:13 | wingy | hate having to start things separately |
| 05:13 | wingy | or bind things through the shell |
| 05:13 | wingy | instead of in code |
| 05:18 | noidi | is there an equivalent of interface inheritance for protocols? |
| 05:19 | noidi | I'd like to state that my Connections (protocol) are java.io.Closeable |
| 05:20 | antares_ | noidi: no, any protocol can be implemented for any type, there is no hierarchy |
| 05:33 | antares_ | Finally got to documenting Monger's core.cache and Ring session stores, including a Noir integration example: http://clojuremongodb.info/articles/integration.html |
| 05:46 | wink | so it seems my one running clojure instance didn't choke on the leap second \o/ |
| 07:10 | wingy | do you feel i should use noir or compojure and hiccup directly in my ring app? |
| 07:12 | noidi | how can I call a protected method of a Java class? there seems to have been clojure.contrib.reflect/call-method. any idea if something like that is available on 1.4? |
| 07:16 | wingy | think i will go with noir |
| 07:16 | wingy | keep boilerplate code out of my app |
| 07:26 | wingy | is it ok to specify plugins in project.clj? |
| 07:29 | aperiodic | yes |
| 07:30 | aperiodic | only if it's really needed to do some sort of build/test/run thing, though |
| 07:31 | aperiodic | if it's just for development convenience (e.g. lein swank) then stick it in ~/.lein/profiles.clj |
| 07:35 | wingy | i would rather want everything in project.clj |
| 07:39 | hyPiRion | wingy: Problem with that is that you enforce dependencies which aren't needed to run the project. |
| 08:03 | wingy | i got FileNotFoundException Could not locate _main__init.class or _main.clj on classpath: clojure.lang.RT.load (RT.java:432) |
| 08:03 | wingy | when running lein repl |
| 08:03 | wingy | anyone knows what that means? |
| 08:05 | wingy | nvm |
| 08:05 | wingy | something wrong in project.clj that i fixed |
| 08:05 | wingy | by CTRL-Z |
| 08:09 | wingy | this is weird |
| 08:13 | michaelr525 | (GET "/place/:id" {{place-id "id"} :params headers :headers} |
| 08:13 | michaelr525 | does it look like a valid compojure route ^^^^^^^^^^ ? |
| 08:14 | weavejester | michaelr525: The compojure.handler/site function includes wrap-keyword-params, so if you're using that, it should be {place-id :id} |
| 08:15 | weavejester | michaelr525: You could also write it as [id :as {headers :headers}] |
| 08:16 | weavejester | michaelr525: Although more commonly, headers are handled by middleware. |
| 08:17 | michaelr525 | thanks! |
| 08:17 | michaelr525 | hope it will work, i think the compojure version used here is old |
| 08:18 | weavejester | michaelr525: You might want to upgrade then. Compojure hasn't changed that much, aside from bug fixes. |
| 08:20 | michaelr525 | i always like to use the latest version of everything but right now I want to make this project work first. I'm using clj-facebook-graph and it's not updated. so in the mean time i'm just holding my fingers and hope that everything will work until the project is finished and then i'll upgrade everything.. |
| 08:21 | michaelr525 | weavejester: the keyword syntax worked :) |
| 08:22 | michaelr525 | maybe the docs should be updated too, since they use the string convention.. |
| 08:22 | weavejester | michaelr525: Well, it depends on whether you've wrapped your routes in wrap-keyword-params or not. |
| 08:22 | michaelr525 | ok, got it |
| 08:44 | jayunit100__ | whats the advantage of having a separate file for each test file ? it seems like just more… files to maintain. |
| 08:45 | _ulises | jayunit100__: surely you wouldn't want a single file with all your tests either? |
| 08:46 | zaamkablam | Well, if you keep all your test in a single file, even in a mid-scale project you will soon end up with a 3-6 kloc behemoth. |
| 08:47 | jayunit100__ | no… i mean, each ns file could come with the tests in it. |
| 08:47 | jayunit100__ | so if I have 5 files in a project, then each file would have (i.e. at the bottom) several deftest entries. |
| 08:48 | _ulises | jayunit100__: wouldn't that include your tests in your software when you deploy/release it? |
| 08:48 | jayunit100__ | yeah i don't think thats the worst thing. |
| 08:48 | jayunit100__ | i mean, clojure is pretty compact. |
| 08:49 | jayunit100__ | but point taken nonetheless :) |
| 08:50 | _ulises | jayunit100__: sorry, I'm just trying to ask all the questions I can think of for why you'd want separate files for your tests, and one per ns/piece of functionality, etc. |
| 09:00 | jayunit100__ | speaking of tests..... |
| 09:00 | jayunit100__ | leon test outputs are difficult to read. any better test debugger tools for clj ? |
| 09:00 | jayunit100__ | s/leon/lein |
| 09:02 | _ulises | jayunit100__: I've recently started using midje and I find it wonderful |
| 09:02 | _ulises | jayunit100__: you also have the difftest lein plugin which tries to do a diff of the expected and actual values |
| 09:06 | jayunit100__ | do u use midge in lein ? |
| 09:07 | _ulises | jayunit100__: yup |
| 09:10 | jayunit100__ | ok cool maybe ill try it :) |
| 09:15 | _ulises | jayunit100__: there's a lein-midje plugin too :) |
| 09:15 | jayunit100__ | yup i assumed so :) |
| 09:24 | Drakeson | I noticed there are various projects with C, LLVM, etc. as the backend beside Clojurescript. Is there one with Haskell as the backend? |
| 09:37 | zaamkablam | Hey, anybody familiar with clojure.contrib.graph? |
| 09:39 | zaamkablam | Seriously, newb question here. Cheap karma, yo. |
| 09:42 | wingy | michaelr525: are you using clojure without noir? |
| 09:45 | Scriptor | zamaterian: go ahead and ask, someone might still be able to answer |
| 09:46 | zaamkablam | Is there a graph object? I mean, on clojuredocs.org I can see all the functions to work with graphs, but no mention, how a graph is actually made. |
| 09:47 | madsy | zaamkablam: There should be a git repo with sample code for those libraries |
| 09:47 | zaamkablam | Yeah, I'm looking for it now. |
| 09:47 | zaamkablam | Thanks. :) |
| 09:48 | madsy | After all, a lot of stuff in the main namespace are APIs that once was in contrib |
| 09:48 | madsy | were* |
| 09:49 | madsy | I still miss some platform-independent OpenGL bindings :/ |
| 09:49 | madsy | Using Swing for graphics is horrible |
| 09:50 | zaamkablam | ... or using Swing at all? :) |
| 09:53 | zaamkablam | So, yeah, turns out graphs are just structs with :neighbors and :nodes |
| 10:09 | ab3 | hi |
| 10:10 | ab3 | I installed clojure on osx with brew, i can eval cmds but when I press the up key I get this "^[[A" characters. |
| 10:10 | ab3 | any idea whats up with that |
| 10:14 | zaamkablam | Simple answer: no |
| 10:14 | zaamkablam | I have that as well. |
| 10:14 | zomg | As do I |
| 10:14 | zaamkablam | But, I suggest you get Leiningen. It's REPL is much more comfortable. |
| 10:14 | zomg | Fine on Ubuntu though |
| 10:16 | zaamkablam | You'd go like 'Computer-machine! Gimme `lein repl`, yo!' and it will be awesome. |
| 10:17 | ab3 | well that is annoying, is this leiningen normal clojure? |
| 10:18 | sirsublime | Yes, it's basically a lightweight build and development tool. |
| 10:18 | sirsublime | For Clojure that is. |
| 10:19 | kippy1 | for Java interop, are there any performance gains to be had via :gen-class as opposed to loading the script via RT and then invoking the functions? |
| 10:19 | ab3 | I'll try it out |
| 10:20 | sirsublime | Personally, I find it a delight to work with and all the cool kids are using it. So if you are going to mess around some OS projects, chances are that you will need to get it either way. |
| 10:35 | kippy1 | Guys, for Java interop, are there any performance gains to be had via :gen-class as opposed to loading the script via RT and then invoking the functions? |
| 11:21 | cshell | Is it bad that I had a nightmare last night where someone stole my nick? |
| 11:22 | kmicu | yes |
| 11:22 | borkdude | cshell I am wondering about this too sometimes, what if someone else starts using mine |
| 11:22 | cshell | that's what I thought |
| 11:22 | cshell | you can register your nick with nickserv |
| 11:22 | cshell | that's what I did |
| 11:22 | borkdude | that's on IRC only |
| 11:22 | cshell | but in the dream someone got it |
| 11:23 | cshell | ah |
| 11:24 | cshell | cshell is what i use on irc - elsewhere its 64BitChris but irc doesn't like that nick |
| 11:31 | rlb | Any idea why (Thread/sleep 1000) might be pegging the cpu(s) suddenly (used to work fine). |
| 11:32 | rlb | ...perhaps a java problem -- happens in 1.2, 1.3, and 1.4 now. |
| 11:32 | pdk | hey, i asked about this last night though i'm still trying to see if there's a compiler bug going on here: http://pastebin.com/QpbN17Hx |
| 11:32 | pdk | fails to compile with a null pointer exception on line 17 for me on 1.3/1.4 |
| 11:32 | pdk | when loading source from repl |
| 11:37 | rlb | pdk: here, repl doesn't matter even clojure -e '(Thread/sleep 1000)' pegs the cpu(s). |
| 11:38 | pdk | oh sorry i was asking about an unrelated issue actually |
| 11:38 | rlb | in my case, since it suddenly happens in all three clojure versions, I sispect some java change (and I did recently update openjdk). |
| 11:42 | rlb | yeah, it's java... |
| 11:42 | rlb | (current debian unstable openjdk 7, fwiw) |
| 11:42 | cshell | rlb: is it openjdk or does it happen on the oracle jvm? |
| 11:43 | rlb | happens to openjdk 6 too -- makes me wonder if there might be something strange happening on this machine... |
| 11:43 | pdk | actually |
| 11:43 | pdk | when you say pegs the cpu can you clarify there |
| 11:43 | pdk | runs at 100% load i'm assuming? |
| 11:44 | lynaghk | ping: dnolen |
| 11:44 | rlb | just looking at top -- runs at ~150% CPU |
| 11:45 | rlb | (noticed because the fan winds up) |
| 11:45 | pdk | yes oracle jvm here is fine |
| 11:54 | dnolen | lynaghk: pong |
| 11:54 | lynaghk | dnolen: morning dude. |
| 11:55 | lynaghk | dnolen: I was wondering what the roadmap for a new core.match release is. I noticed the new defpred stuff in there when I submitted some patches yesterday |
| 11:56 | dnolen | lynaghk: probably not until cKanren gets wrapped up. |
| 11:56 | lynaghk | dnolen: If I understand correctly, that's a bit of a breaking change since now end users have to declare the fns they want to use in :when clauses. |
| 11:56 | dnolen | lynaghk: once that's solid I'm planning on spending some serious time on core.match. |
| 11:56 | dnolen | lynaghk: you can use :guard for the old behavior. |
| 11:57 | dnolen | lynaghk: but yes breaking change. |
| 11:57 | lynaghk | dnolen: okay, cool. Do you have a sense of how long the cKanren stuff will take? I.e., more than a month? |
| 11:57 | lynaghk | dnolen: I'd like to use core.match, so I'm wondering if we should just maintain an internal fork for some of our projects. |
| 11:57 | dnolen | lynaghk: ~month? <month? It's getting close. |
| 11:58 | lynaghk | dnolen: okay, sweet. |
| 11:59 | dnolen | lynaghk: I'm happy to apply your two CLJS patches and cut another alpha if that would help you out. |
| 11:59 | lynaghk | dnolen: that would be super rad, thanks! |
| 12:00 | lynaghk | dnolen: With the cKanren stuff on core.logic, is that a speed thing, or is it adding new features for maths to the engine? |
| 12:01 | dnolen | lynaghk: not speed at all. yes arithmetic becomes sensible. |
| 12:01 | dnolen | lynaghk: but it also makes cKanren a generic extensible constraint solver. |
| 12:01 | dnolen | lynaghk: i mean "makes core.logic" |
| 12:02 | lynaghk | dnolen: ah. So that would move core.logic into the same problem domain as Cassowary (though since the latter is specific to linear constraints, it might |
| 12:02 | lynaghk | be faster. |
| 12:02 | dnolen | lynaghk: yes it'll be a generic solver so I don't think it'll compete with specialized solvers. But I'm also curious to see how well it compares. |
| 12:03 | dnolen | lynaghk: been adding cKanren functionality with an eye for perf. |
| 12:04 | lynaghk | dnolen: likewise. I still haven't really dug into the Cassowary stuff for any real projects. There's another fork with an eye on speed, and I'd be interested to see the relative perf and expresiveness. |
| 12:05 | rlb | The thread sleep problem is a kernel bug (thanks to nthykier on #debian-java): http://blog.windfluechter.net/content/blog/2012/07/01/1481-100-cpu-load-due-leap-second |
| 12:05 | rlb | resetting the date fixed it |
| 12:05 | lynaghk | dnolen: oh, by the way---I'm jealous that you might be running into Bostock in the hallways. NYT graphics are going to kill it next year. I might need to get a subscription just for the pictures. |
| 12:06 | dnolen | lynaghk: haha, yeah pretty cool. Not sure how much we'll see of him tho :) He'll stay in SF. |
| 12:09 | dnolen | lynaghk: patches applied, alpha11 going out. |
| 12:09 | dnolen | lynaghk: er alpha10 I mean. |
| 12:09 | lynaghk | dnolen: thanks a ton David! |
| 12:11 | lynaghk | dnolen: have you seen my C2-powered TodoMVC? I'd be interested to hear your thoughts (if any) on it; I'm thinking about submitting it upstream |
| 12:11 | lynaghk | dnolen: no idea what they would do with it, since it's not exactly JavaScript and definitely not MVC. Could be a good intro to folks for cljs though. |
| 12:11 | dnolen | lynaghk: link? |
| 12:12 | lynaghk | https://github.com/lynaghk/c2-demos/tree/master/todoMVC |
| 12:12 | dnolen | lynaghk: thanks, will check it out. |
| 12:17 | samrat | slimv users, how do i turn off autoclosing of parentheses in the REPL? it's preventing me from entering multi-line lists |
| 12:22 | hyPiRion | Hmm, people often complain that the result of conj is confusing. e.g. (conj [1 2] 3) vs (conj '(1 2) 3). What is the argument for having conj in this way? |
| 12:23 | hyPiRion | I've read it before, but I'm unable to find it. |
| 12:24 | rlb | hyPiRion: roughly, I believe it's so that you can use conj without having to know the exact nature of the underlying collection, and it will do the most effcient thing. |
| 12:25 | rlb | i.e. if you're creating a function that will operate on a collection (and the resulting order isn't critical) |
| 12:29 | hyPiRion | ,(doc conj) |
| 12:29 | clojurebot | "([coll x] [coll x & xs]); conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item). The 'addition' may happen at different 'places' depending on the concrete type." |
| 12:31 | pdk | hyPiRion |
| 12:31 | hyPiRion | ? |
| 12:31 | pdk | it always picks whichever end is going to have O(1) insertion for the type of collection given |
| 12:35 | hyPiRion | pdk: I know that, what I'm wondering about is why such a function was added into Clojure. It confuses a hell of a lot beginners. |
| 12:38 | treehug | hyPiRion: what function ? |
| 12:39 | hyPiRion | conj |
| 12:43 | rlb | hyPiRion: I'm not sure I understand what you're asking -- initially confusing or not, conj is a part of the collection abstraction. You need it for that abstraction to work. |
| 12:46 | hyPiRion | rlb: Of course. But is it because it's "impossible" to add an element in front of a vector, or "impossible" to add an element at the end of a list? |
| 12:46 | rlb | Say I ask you to write a function that *efficiently* adds the even numbered elements of a source collection to a destination collection. Without conj, you couldn't (at least not without inappropriate type testing). |
| 12:46 | _ulises | ,(doc cons) |
| 12:46 | clojurebot | "([x seq]); Returns a new seq where x is the first element and seq is the rest." |
| 12:46 | rlb | hyPiRion: and there are other functions that allow you to be more specific when it matters. |
| 12:47 | rlb | hyPiRion: btw, if you haven't seen it yet, you might find this useful - http://clojure.org/cheatsheet |
| 12:48 | hyPiRion | rlb: I'm using it everyday :) |
| 12:49 | hyPiRion | It's not about not understanding the function itself, I'm just trying to understand why it was added. Is it because of performance reasons, or because of the abstraction reasons? |
| 12:51 | ab3 | I can install leiningen with brew on osx |
| 12:52 | pdk | it behaves differently based on concrete type so it breaks sequence abstractions, pretty much just for performance in cases for doing things i |
| 12:53 | pdk | like using a structure as a stack |
| 12:53 | ab3 | I get a 502 error: Error: Download failed: http://github.com/technomancy/leiningen/tarball/1.7.1 |
| 12:53 | rlb | hyPiRion: both -- conj allows you to write something that doesn't need to know about what kind of coll you have, but needs to be efficient. |
| 12:53 | ab3 | anyone knows there I can find a working formula |
| 12:53 | rlb | i.e. if I'm writing (defn foo [coll] ...) and I want to add an element to coll *efficiently*, I can just use conj. |
| 12:54 | rlb | If it's a vector it'll get added to the end. If it's a list, it'll get added to the beginning, since the costs of the operation vary based on the actual type. |
| 12:56 | hyPiRion | rlb: Okay, so it's for efficiency reasons then. |
| 12:57 | rlb | absolutely |
| 13:05 | aniero | whoa, lein-tarsier is *awesome* |
| 13:05 | aniero | sattvik: ^^ |
| 13:07 | sattvik | aniero: Ah, thanks. Although i think it needs a couple updates to take advantage of new features in lein2. |
| 13:07 | aniero | which i'm not using yet, so hey :) |
| 13:07 | aniero | SO much easier than figuring out an "ng-server" shell command &c |
| 13:07 | aniero | and having a repl on the terminal with access to the same runtime state as my editor is <3 |
| 13:07 | aniero | so: thanks! |
| 13:16 | locojay | hi i m have a string ext. and would like to replace like following (clojure.string/replace stringtoreplace #(str "\." ext "$") "html") but does not like it . any idea? |
| 13:20 | gfredericks | &(clojure.string/replace "foooooo" #(str "\." "bar" "$") "html") |
| 13:20 | lazybot | java.lang.RuntimeException: Unsupported escape character: \. |
| 13:21 | gfredericks | well that's one problem at least |
| 13:21 | gfredericks | what did you intend by "\."? |
| 13:22 | locojay | gfredereicks change for example "test.xls" to "test.html" where i have e variable ext with the value "xls" |
| 13:23 | gfredericks | &(doc clojure.string/replace) |
| 13:23 | lazybot | ⇒ "([s match replacement]); Replaces all instance of match with replacement in s. match/replacement can be: string / string char / char pattern / (string or function of match). See also replace-first." |
| 13:23 | locojay | doing (str/replace "test.xls" #("\.xls$") "html") will work |
| 13:23 | locojay | but not it i do the above since my ext might change |
| 13:23 | gfredericks | I highly doubt that |
| 13:23 | gfredericks | but I think I know what you're asking |
| 13:24 | gfredericks | you'll either have to create a regex yourself, which seems to be what you're trying to do, or test the ending substring |
| 13:25 | gfredericks | &(apropos "pattern") |
| 13:25 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: apropos in this context |
| 13:25 | gfredericks | &(clojure.repl/apropos "pattern") |
| 13:25 | lazybot | ⇒ (re-pattern) |
| 13:25 | gfredericks | &(doc re-pattern) |
| 13:25 | lazybot | ⇒ "([s]); Returns an instance of java.util.regex.Pattern, for use, e.g. in re-matcher." |
| 13:26 | gfredericks | &(let [ext "xls"] (clojure.string/replace "test.xls" (re-pattern (str "\\." ext "$")) "html")) |
| 13:26 | lazybot | ⇒ "testhtml" |
| 13:26 | gfredericks | &(let [ext "xls"] (clojure.string/replace "test.xls" (re-pattern (str "\\." ext "$")) ".html")) |
| 13:26 | lazybot | ⇒ "test.html" |
| 13:26 | gfredericks | thar it is |
| 13:26 | locojay | thanks |
| 14:14 | SrPx | Am I the only one who thinks "+" is wrong? It should have an arity of 2. (reduce +) should be the same as the current + |
| 14:14 | SrPx | ): |
| 14:15 | tomoj | how exactly? you don't mean ((reduce +) 1 2 3) == (+ 1 2 3) I guess? |
| 14:15 | AimHere | Clojure complains because you're feeding the wrong arity to reduce, not + |
| 14:16 | SrPx | tomoj: yes thats what I mean |
| 14:16 | SrPx | AimHere: sigh reduce should have arity of 1 then |
| 14:16 | SrPx | tomoj: ((reduce +) [1 2 3]) actually |
| 14:17 | AimHere | That sounds very inconsistent though |
| 14:17 | SrPx | sounds perfectly consistent for me : s |
| 14:17 | AimHere | Reduce takes a function as it's first argument, and spits out whatever the result of that first argument is |
| 14:18 | SrPx | this way you can generalize the concept of what the current + does to any other binary mathematical function ou invent... |
| 14:18 | AimHere | You're saying that if there's no arguments, reduce returns a function '+', and if there are arguments, it returns a number |
| 14:18 | SrPx | by ((reduce my-func) [1 2 3]) |
| 14:18 | tomoj | maybe you mean (reduce my-func [1 2 3]) ? |
| 14:19 | tomoj | oh, I see |
| 14:19 | SrPx | tomoj: no, because if reduce has an arity of 2 |
| 14:19 | tomoj | (partial reduce my-func) ? |
| 14:19 | AimHere | Ah, shouldn't you just want to call this something other than reduce? |
| 14:19 | SrPx | tomoj: you cant do this: (send-action destination (reduce my-func)) |
| 14:20 | tomoj | (send-action destination (partial reduce my-func)) |
| 14:20 | SrPx | AimHere: fold maybe |
| 14:20 | tomoj | fold is already taken :P |
| 14:20 | SrPx | ): |
| 14:20 | AimHere | Also, there are questions of associativity here, aren't there? If your action isn't commutative, then you have two 'reduce' answers, depending on whether it's left- or right- associative |
| 14:20 | SrPx | tomoj: maybe a funny symbol |
| 14:22 | SrPx | AimHere: hmm yes |
| 14:23 | SrPx | (defn fl [func] (partial reduce func)) ... ((fl +) [1 2 3]) = 5 <- not sure if this is would work |
| 14:23 | SrPx | wow |
| 14:23 | SrPx | = 6* |
| 14:23 | tomoj | s/commutative/associative/ ? |
| 14:23 | SrPx | =p |
| 14:23 | SrPx | anyways |
| 14:23 | SrPx | is there a library for event dispatching and stuff on clojure? |
| 14:23 | tomoj | also for compatibility with clojure.core.reducers my-func should have a zero-arg identity |
| 14:24 | SrPx | wat |
| 14:24 | tomoj | I'm working on one at the moment |
| 14:24 | SrPx | tomoj: can I see it |
| 14:24 | tomoj | like (+) == 0 is the identity for additition |
| 14:24 | tomoj | (my-func) should return the identity for your operation |
| 14:25 | SrPx | tomoj: oh there is this, but is this necessary? the starting value can just be (+ element-1 element-2) |
| 14:25 | tomoj | if you don't use clojure.core.reducers you don't need it of course |
| 14:25 | tomoj | clojure.core.reducers/reduce uses (my-func) instead of element-1 as the starting value |
| 14:25 | SrPx | I know |
| 14:26 | SrPx | just asking if this is necessary for the reduce behavior? or a particular choice? |
| 14:26 | SrPx | I see it more natural if reduce can only receive a function w/ 2 arguments as it is always a "apply to consecutive neighbors" behavior |
| 14:26 | tomoj | not sure why they chose that. I suspect it is more general. maybe it is needed for fold? |
| 14:27 | SrPx | they do it in other languages too. idk |
| 14:27 | SrPx | tomoj: you are working on event dispatch? |
| 14:27 | tomoj | yeah, nothing to show yet though |
| 14:27 | SrPx | Hm okay |
| 14:27 | SrPx | guess I am too : s |
| 14:28 | SrPx | as I can't find one and I absolutely need this to start any useful project |
| 14:28 | tomoj | you're using clojure on the jvm? |
| 14:28 | pdk | if the function has multiple arities then reduce will always pass it only 2 arguments on each call |
| 14:28 | tomoj | (or js)? |
| 14:29 | SrPx | I guess so? I'm just starting at this point I've not passed the 'download leiningen and play with its repl phase' |
| 14:29 | SrPx | tomoj: oh jvm definitely not js |
| 14:29 | tomoj | have you looked at lamina? |
| 14:29 | SrPx | let me see |
| 14:29 | tomoj | https://github.com/ztellman/lamina/ |
| 14:30 | tomoj | maybe also relevant https://github.com/ztellman/aleph/ |
| 14:30 | SrPx | tomoj: not sure what he is doing on lamina o.o |
| 14:31 | pdk | additionally i'm still looking at what i can only conclude might be a compiler bug |
| 14:31 | tomoj | I think lamina has some fundamental problems (otherwise I'd be trying to port it to js), but I still liked it quite a lot |
| 14:31 | pdk | with a function that fails to compile throwing a null pointer on the binding list of a doseq |
| 14:31 | tomoj | http://www.infoq.com/presentations/Event-Driven-Programming-in-Clojure |
| 14:35 | SrPx | (reading about aleph atm, seems interesting) |
| 15:02 | SrPx | Is redefining default stuff disrecommended (forgot the eng. word) ? |
| 15:06 | amalloy | SrPx: discouraged. and yes, mildly: if you have a good reason go ahead |
| 15:06 | amalloy | assuming that what you mean is defining a new function named, say, `get` in your namespace, for example to do a database get |
| 15:07 | amalloy | if you actually mean overwriting clojure.core/get with a new function, then probably never |
| 15:07 | jweiss | i'm trying to see what's causing an NPE in my program, but as far as I can tell, the caught exception has an empty stack trace. (catch Exception e (into [] (.getStackTrace e))) returns []. i'm at a loss, anyone know what could cause that? |
| 15:09 | SrPx | amalloy: I'm trying to get some haskell flavor by enabling auto partial application and ease of composing, I'd have to redefine +, -, *, / to binary funcs and hack some of the functional functions (er..) |
| 15:10 | SrPx | would this break clojure's core stuff? |
| 15:10 | amalloy | you can do that in your own namespace if you want, and excluse all the clojure.core functions |
| 15:10 | amalloy | *exclude |
| 15:10 | amalloy | but if you try to replace the clojure.core functions your runtime will explode and ninjas (probably me) will murder you |
| 15:10 | SrPx | exclude it? |
| 15:10 | SrPx | lal |
| 15:11 | SrPx | its not even possible is it? |
| 15:11 | SrPx | to actually replace them |
| 15:11 | SrPx | o.o |
| 15:11 | TimMc | You can certainly *shadow* the fns. |
| 15:11 | SrPx | except if you change the source I guess |
| 15:11 | SrPx | but thats not what I meann |
| 15:11 | amalloy | you can replace them, and if you do then bad things will happen |
| 15:11 | amalloy | so you shouldn't |
| 15:12 | TimMc | (:refer-clojure [:exclude (+ - / * ...)]) or something, then (defn + ...) |
| 15:12 | borkdude | also some functions are inlined so shadowing won't work always, right? |
| 15:12 | amalloy | borkdude: shadowing would always work; replacing wouldn't always |
| 15:12 | borkdude | right |
| 15:13 | amalloy | (one of the bad things i alluded to) |
| 15:30 | jg__ | hi all, how should i interpret (def *now* (Date.)), i thought the dot should be the first element of the list for java interop |
| 15:31 | jg__ | ? |
| 15:37 | borkdude | jg__ (Date.) is the same as new Date() in Java |
| 15:38 | jg__ | borkdude: is the syntax documented somewhere? can't find it... |
| 15:39 | borkdude | http://clojure.org/java_interop, search for (Classname. args*) |
| 15:39 | borkdude | jg__ I see now you can also write (new Date), didn't know that |
| 15:39 | borkdude | ,(new Date) |
| 15:39 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: Date, compiling:(NO_SOURCE_PATH:0)> |
| 15:40 | borkdude | ,(new java.util.Date) |
| 15:40 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ExceptionInInitializerError> |
| 15:40 | borkdude | ,(java.util.Date.) |
| 15:40 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class java.util.Currency> |
| 15:40 | borkdude | ,(java.lang.Date.) |
| 15:40 | clojurebot | #<CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: java.lang.Date, compiling:(NO_SOURCE_PATH:0)> |
| 15:40 | borkdude | hmm |
| 15:40 | amalloy | &(java.util.Date.) |
| 15:40 | lazybot | ⇒ #inst "2012-07-01T19:40:00.608-00:00" |
| 15:40 | borkdude | &(new java.util.Date) |
| 15:40 | lazybot | ⇒ #inst "2012-07-01T19:40:16.202-00:00" |
| 15:40 | amalloy | hiredman: clojurebot seems broken again |
| 15:41 | SrPx | I have to work |
| 15:41 | SrPx | but clojure is so more awesome : ( |
| 15:42 | jg__ | yeah, the (new ...) syntax is in the java interop docs, i'm just wondering where people get their info about this weird dot constructor notation... |
| 15:42 | borkdude | jg__ it's there also |
| 15:43 | borkdude | jg__ I literaly posted the text |
| 15:43 | borkdude | jg__ again: http://clojure.org/java_interop, search for (Classname. args*) |
| 15:43 | jg__ | ohhh, that's true |
| 15:43 | jg__ | damn, i must be tired |
| 15:43 | jg__ | thanks! |
| 15:43 | borkdude | jg__ no problem, happens to me all the time ;) |
| 15:59 | wingy | hey guys |
| 16:00 | wingy | i wonder if it makes sense to use ring/compojure/hiccup directly without noir? the benefits i imagine 1. no middle guy since it seems to be stupid simple anyway with ring thus no need to first understand an abstraction and then the implementations 2. if i wanna change any stack in the future i can just switch without noir having to support it |
| 16:01 | wingy | the doc for the individual components seem to be pretty good |
| 16:01 | weavejester | I tend to prefer using Compojure directly |
| 16:01 | borkdude | wingy of course, the more knowledge the better |
| 16:01 | Raynes | wingy: Nothing wrong with using Compojure. |
| 16:02 | Raynes | wingy: I'm a maintainer of Noir and using Compojure in some of my projects. Probably even going to move Refheap to Compojure. |
| 16:02 | borkdude | Raynes that's what I was curious about, but it was too short to tweet lik you said |
| 16:02 | borkdude | Raynes what are the reasons to move? |
| 16:03 | wingy | Raynes: you dont like noir's abstraction over compojure and hiccup? |
| 16:05 | Raynes | borkdude: Noir is less flexible with middleware. Refheap doesn't have a very complex middleware scenario, but if it ever needed one, it'd be better to be using Compojure. Furthermore, with lib-noir around, the primary reason I was using Noir is now in lib-noir. My favorite things about noir are noir.session and noir.response and we can use those from any web framework now. Also, using lib-noir from a large site that isn't noir-based keeps me honest and |
| 16:05 | Raynes | sure lib-noir works with Compojure and doesn't accidentally acquire noir-specific behavior. |
| 16:06 | borkdude | Raynes ok cool |
| 16:06 | Raynes | wingy: It really isn't that much abstraction. What Noir gives you is a contained web framework with nuts and bolts and everything you need to get a website up and running. |
| 16:06 | Raynes | It is designed to help you get a website together that is organized well and keeps you from having to hunt for libraries. |
| 16:07 | borkdude | wingy Raynes right, abstraction over hiccup? it's just normal hiccup right? |
| 16:07 | Raynes | Abstraction over Compojure. |
| 16:07 | borkdude | ah.. don't you like (abstraction over compojure) and hiccup |
| 16:08 | borkdude | it would make life so much easier if people started using parens in natural language ;) |
| 16:08 | Raynes | Basically, Noir has 'defpage' which creates Compojure routes and stores them in atoms, and when you start the server it puts your middleware and routes together into a handler and throws it at the server and bang, website. |
| 16:08 | ivaraasen | Noir is great |
| 16:08 | Raynes | With Compojure, you just create Compojure routes and compose them into a handler yourself. It's about 3 extra lines of code. |
| 16:09 | pipeline | noir and korma are what drove me to learn clojure |
| 16:10 | ivaraasen | pipeline: yeah, i'm learning Clojure right now due to Noir |
| 16:10 | Raynes | The abstraction is very simple and it makes it super easy for people to put together routes and create a website. That's what is wonderful about Noir. |
| 16:11 | borkdude | and the docs are nice to read |
| 16:11 | borkdude | which is a big plus |
| 16:11 | Raynes | The only problem with the abstraction is that it takes away the raw flexibility of Compojure's routes because Noir handles the routes under the covers and there isn't a lot of magic you can do with them. Thing is, lots of people don't need that flexibility and don't care. Especially new people to Clojure. That's what makes Noir important. |
| 16:16 | Raynes | borkdude: So, Noir's abstraction was never what was really important to me. It was the contained nature. The fact that Noir has everything you need and you don't have to hunt through a bunch of libraries that haven't been updated since the latest incompatible hiccup release, etc, for basic things like stateful sessions. (defroutes handler (GET "/" [] (html [:h1 "Welcome to my website!"]))) vs (defpage "/" [] (html [:h1 "Welcome to my website!"])) is the |
| 16:16 | Raynes | difference -- 2 hours is the library hunting difference. ;) |
| 16:17 | Raynes | A day of frustration is the difference for someone new to Clojure, which is why Noir is adored by new people (and that's wonderful, because it means Noir is doing what Chris wanted, getting people into Clojure for web dev). |
| 16:17 | hyPiRion | Raynes: Yeah, as long you find out that Clojure is in fact nice for web devel, you've got them hooked. |
| 16:18 | gfredericks | the route definitions get sprinkled around the various defpages? |
| 16:18 | borkdude | gfredericks yes |
| 16:18 | hyPiRion | They can learn the more "amazing" stuff later on. |
| 16:18 | gfredericks | man; that acutally makes me like rails for something |
| 16:18 | borkdude | gfredericks explain |
| 16:18 | borkdude | (don't know rails) |
| 16:18 | Raynes | gfredericks: That's another reason I'm wary of it and some people plain don't like it. |
| 16:19 | gfredericks | borkdude: in rails all the routing goes in one file |
| 16:19 | cemerick | The community effect is great, but stateful sessions are evil (not surprisingly). </non-sequitur> |
| 16:19 | Raynes | It's mutable. defpage creates a route and stores it in an atom under the covers. Nothing but this links them together and there is no visible link in your code. |
| 16:19 | gfredericks | so when something's really fubared you can start there and follow the path of execution rather than not knowing where to start |
| 16:19 | borkdude | gfredericks you have that option of course with Noir: just put all the defpages in one file? |
| 16:19 | Raynes | You can just sprinkle defpages everywhere and they're automatically composed into the final routes in the end. |
| 16:19 | amalloy | cemerick: complex but easy |
| 16:19 | tomoj | I thought I was the only one who cared about that :) |
| 16:20 | gfredericks | borkdude: if you have a lot of them? |
| 16:20 | tomoj | relatedly it disturbs me that cljs-template sets up noir |
| 16:20 | borkdude | gfredericks you only need a couple of defpages, the rest is done through clojurescript :P |
| 16:20 | tomoj | maybe will create just-cljs-template... |
| 16:20 | gfredericks | borkdude: defpage complects the route with the response |
| 16:20 | cemerick | gfredericks: thanks for the pointer, BTW |
| 16:20 | gfredericks | cemerick: no probalo |
| 16:20 | gfredericks | (inc lazybot) |
| 16:20 | lazybot | ⇒ 7 |
| 16:20 | Raynes | cemerick: Man, we've been over that. |
| 16:20 | Raynes | cemerick: Get off my lawn. |
| 16:21 | gnarmis | Related question: what if I need a prefix url? A little new to noir |
| 16:21 | Raynes | You can take away my defpage, but you can't take away my noir.session. |
| 16:21 | cemerick | Raynes: I thought the lawn statement was supposed to go in the other direction on this topic? |
| 16:21 | Raynes | gnarmis: Prefix url? |
| 16:21 | hyPiRion | prefix url? Like, absolute url? |
| 16:21 | gnarmis | so sort of like "/api/foo", "/api/bar" |
| 16:21 | Raynes | cemerick: Get *on* my lawn. |
| 16:21 | Raynes | gnarmis: Oh, like Compojure's context macro. |
| 16:22 | Raynes | Yeah, I'm not sure you can easily do that in Noir. |
| 16:22 | cemerick | Raynes: Go mock out a ring request that depends on a particular mutable-in-place session state. Oh, right, that sucks. |
| 16:22 | Raynes | Might have to post on the mailing list and see if anyone else has done anything. |
| 16:22 | gnarmis | raynes: not familiar with that in compojure. hmm |
| 16:22 | hyPiRion | You could shadow defpage. |
| 16:22 | gnarmis | ah ok, for sure |
| 16:22 | Raynes | cemerick: muhoo implemented that behavior in noir.session specifically so it would work with Friend. |
| 16:23 | borkdude | gfredericks I don't see how you mean the complecting thing: compojure also combines routes and their responses? |
| 16:23 | Raynes | Actually, you might have just said something entirely different than I thought you did. |
| 16:23 | gfredericks | borkdude: I was comparing it to rails |
| 16:23 | Raynes | again* |
| 16:23 | cemerick | In other news, can we all please talk about something important, like making O(1) for argument types that support it? |
| 16:23 | cemerick | bah |
| 16:23 | cemerick | s/making/making second |
| 16:24 | hyPiRion | cemerick: You're talking about the last argument? |
| 16:24 | gfredericks | second is not O(1)? |
| 16:24 | gfredericks | for which types? |
| 16:24 | cemerick | it's O(2) for seqs!!!!1!1! |
| 16:24 | gfredericks | O(2) is O(1) |
| 16:24 | alindeman | Hehe |
| 16:24 | borkdude | cemerick take it easy, it's sunday and you're drinking a margarita ;-) |
| 16:24 | cemerick | gfredericks: dude, you're harshing my snark |
| 16:25 | cemerick | Sorry, I was late to the "last" thread. |
| 16:25 | Raynes | cemerick: Anyways, if you hate mutable sessions, I'd hate to make you use noir defpage for a day. |
| 16:25 | hyPiRion | Actually, it's O(1) for seqs, but O(log n) for anything else, right? |
| 16:25 | gfredericks | hyPiRion: wat |
| 16:25 | hyPiRion | or wait, it's probably O(log n) seqs as well. |
| 16:25 | cemerick | Raynes: I'm afraid I've never used noir |
| 16:25 | gfredericks | oh I supposed for vectors that might have to be true |
| 16:25 | borkdude | I'm off, bye |
| 16:26 | hyPiRion | gfredericks: Well, if we like to be very picky about the runtime ;) |
| 16:26 | gfredericks | assymptotics isn't too useful at this point |
| 16:26 | gfredericks | let's just say "Can we make second faster?" |
| 16:26 | gfredericks | s/faster/smarter and thereby faster/ |
| 16:27 | hyPiRion | We can if you can create a sufficiently smart compiler. |
| 16:27 | tomoj | clojure needs it's own asymptotics notation where O*(1) == O(log n)... |
| 16:27 | gfredericks | O(1) \subset O(log n) |
| 16:27 | cemerick | "sufficiently smart compiler" is the godwin's rule of PL discussion |
| 16:28 | alindeman | lol |
| 16:28 | gfredericks | tomoj: we could switch to #{:slow :medium :fast} |
| 16:28 | tomoj | :D |
| 16:28 | gfredericks | let's start now. Vectors are fast |
| 16:28 | alindeman | Can we just unroll all the loops? |
| 16:28 | gfredericks | is reversing a seq medium or slow? |
| 16:29 | tomoj | depends on the problem :( |
| 16:29 | hyPiRion | gfredericks: It's constant time. |
| 16:29 | hyPiRion | *vector, sorry |
| 16:29 | tomoj | #{:slow :fast-enough} |
| 16:29 | gfredericks | hyPiRion: reversing a vector is constant? |
| 16:30 | hyPiRion | gfredericks: yep, as far as I remember. |
| 16:30 | gfredericks | hyPiRion: perhaps a read-only version; but not a conjable version |
| 16:31 | hyPiRion | If you sprinkle some magic on, it's possible. |
| 16:31 | gfredericks | hyPiRion: I'll bet you forty things of value |
| 16:32 | ivaraasen | hyPiRion: how fast are we talking? O(MG)? |
| 16:32 | cemerick | hyPiRion: `reverse` is always linear. rseq can be constant-time. |
| 16:33 | gfredericks | &(doc rseq) |
| 16:33 | lazybot | ⇒ "([rev]); Returns, in constant time, a seq of the items in rev (which can be a vector or sorted-map), in reverse order. If rev is empty returns nil" |
| 16:33 | hyPiRion | cemerick: rseq it is, then. |
| 16:33 | amalloy | second is O(∞) for (lazy-seq (recur)) |
| 16:33 | gfredericks | hyPiRion: like I said; read-only, not conjable :P |
| 16:33 | amalloy | we should improve that |
| 16:33 | cemerick | thus, &(rseq '(1 2 3)) |
| 16:33 | gfredericks | &(rseq '(1 2 3)) |
| 16:33 | lazybot | java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Reversible |
| 16:33 | hyPiRion | &(rseq [1 2 3]) |
| 16:33 | lazybot | ⇒ (3 2 1) |
| 16:33 | cemerick | isn't & lazybot's inline eval char? |
| 16:34 | gfredericks | cemerick: ## |
| 16:34 | amalloy | cemerick: ##'(this is) |
| 16:34 | hyPiRion | It's ##nil |
| 16:34 | lazybot | ⇒ (this is) |
| 16:34 | cemerick | oh jeez |
| 16:34 | gfredericks | cemerick: ask again nobody heard you |
| 16:35 | gfredericks | surely you had to know this for the lazybot chapter of your book |
| 16:36 | cemerick | "comprehensive" has many interpretations |
| 16:36 | hyPiRion | "comprehensive" is relative. |
| 16:37 | gfredericks | ,(comp :re :hensive) |
| 16:37 | clojurebot | #<core$comp$fn__2453 clojure.core$comp$fn__2453@3129730f> |
| 16:37 | cemerick | gfredericks: also, don't blow my cover. Most people around here think (rightly) that I'm a regular shmoe. :-) |
| 16:38 | hyPiRion | ,((comp :re :hensive) {:re :ea :hensive :sy}) |
| 16:38 | clojurebot | nil |
| 16:38 | hyPiRion | oh yeah, I meant juxt. |
| 16:38 | gfredericks | cemerick: surely you had to know this when you read the lazybot chapter of that book you bought that one time I mean |
| 16:39 | gfredericks | hyPiRion: your code wasn't very juxtrehensive |
| 16:40 | hyPiRion | gfredericks: sadly. I'm getting rusty :( |
| 16:45 | cemerick | surely Raynes' book is going to mention lazybot? |
| 16:45 | cemerick | Raynes: speaking of, have you seen any attributable rise in tryclj traffic in the past 3 months? |
| 16:46 | Raynes | cemerick: I don't look at tryclj traffic. |
| 16:46 | Raynes | I certainly can if you like. |
| 16:46 | Raynes | I just mean that I don't make a habit of it. :p |
| 16:46 | gfredericks | who votes for pronouncing tryclj like "trickle" |
| 16:47 | Raynes | If it makes you happy. |
| 16:48 | Raynes | cemerick: When did your book release? |
| 16:50 | Raynes | cemerick: March got around 3.9k views. In April through today, it rose and remained at around 4.5k |
| 16:51 | Raynes | cemerick: 59% of page visits since April have been new visitors. |
| 16:52 | Raynes | amalloy: 4.2k of my visitors over those months has been referred from 4Clojure. |
| 16:52 | Raynes | Giggity. |
| 16:53 | amalloy | Raynes: prepare to experience a similar inflow to refheap :P |
| 16:53 | Raynes | Hah |
| 16:53 | Raynes | Huh. Do I even track refheap traffic? |
| 16:53 | Raynes | I'm totally insane if I don't. |
| 16:53 | Raynes | Analytics is like dope. |
| 16:54 | Raynes | Oh boy, looks like I do. |
| 16:54 | Raynes | Wow, this is depressing. |
| 16:54 | hyPiRion | Speaking of refheap, does anyone know if someone has ported/made a syntax highlighter for Clojure? |
| 16:55 | Raynes | hyPiRion: Nope. I use pygments. |
| 16:55 | hyPiRion | Raynes: I know, that's why I was asking ;) |
| 16:55 | Raynes | If someone made a highlighter for Clojure, I still probably wouldn't use it. |
| 16:55 | Raynes | Not until it supported at least the most useful subset of the languages pygments does. |
| 16:59 | amalloy | Raynes: what's depressing? |
| 17:00 | TimMc | Can't you use different highlighters for different languages? |
| 17:00 | Raynes | amalloy: Crappy traffic, but I'm not sure it is even working right since I think I'm only tracking refheap.com and not www.refheap.com |
| 17:00 | Raynes | TimMc: Sure, with a lot of work. Pygments also handles the generation of line numbers and such. |
| 17:01 | Raynes | And the theming. |
| 17:02 | SrPx | Oh |
| 17:02 | SrPx | You should send this to every newcomer around: http://chasemerick.files.wordpress.com/2011/07/choosingtypeforms2.png?w=640 |
| 17:05 | TimMc | Raynes: Hmm, I see. Seems complectated. :-P |
| 17:06 | hyPiRion | SrPx: That's messy. I'd just tell every newcomer to use a map. |
| 17:06 | SrPx | hyPiRion: I concluded that from the chart though. (: |
| 17:06 | wingy | i prefer cutting the middle men |
| 17:08 | SrPx | Wow. |
| 17:08 | solussd_ | could someone cryptographically inclined tell me if this password hashing function is adequate? :) https://www.refheap.com/paste/4ff0bc29e4b062b6746d14b0 |
| 17:09 | Raynes | https://github.com/noir-clojure/lib-noir/blob/master/src/noir/util/crypt.clj There's a lib-noir for that! |
| 17:10 | Raynes | Just a shameless plug. I'm neither cryptographically inclined nor have I actually read your code. |
| 17:10 | cemerick | Raynes: why pygments instead of syntaxhighlighter? More supported languages? |
| 17:10 | SrPx | So anyway, protocols are the equivalent of Common Lisp's classes and multimethods if I got it right? |
| 17:10 | Raynes | cemerick: And less hideous javascript. |
| 17:10 | cemerick | SrPx: Clojure multimethods are the equivalent of Common Lisp's multimethods. :-) |
| 17:10 | ivan | solussd_: is that a fixed salt? but anyway, use bcrypt or scrypt |
| 17:11 | solussd_ | ivan: I was thinking of using the time in milliseconds of the password creation date |
| 17:11 | solussd_ | Raynes: well, I happen to be using Noir, so, I guess I'll use that (pff. can't write any of my own code in clojure-- someone has done everything!) |
| 17:12 | cemerick | Raynes: does syntaxhighlighter imply more involved js? I just threw it into another site with one line? *shrug* |
| 17:12 | cemerick | Everybody does :-D |
| 17:13 | SrPx | cemerick: I was not aware of those |
| 17:13 | Raynes | cemerick: *shrug*. I just can't see syntaxhighlighter working out well for a pastebin site. |
| 17:13 | solussd_ | i gave a presentation on polymorphism at work and described multimethods as part of it… the .net programmers were unimpressed (or just didnt get it) |
| 17:13 | cemerick | Raynes: fair. js implementations of everything…meh. |
| 17:13 | cemerick | Python > js. |
| 17:14 | cemerick | Of course. |
| 17:14 | Raynes | cemerick: It actually isn't a huge bummer anyways, since I obviously don't highlight every single time a request is made to a paste page. |
| 17:14 | Raynes | I pre-highlight and store that for later consumption. |
| 17:14 | Raynes | Super dooper fast. |
| 17:15 | cemerick | do you store the original source too? |
| 17:15 | Raynes | Yes. |
| 17:15 | hyPiRion | I suppose, if they want to edit the original. |
| 17:16 | wingy | cool i dont have to reload server when i make changes |
| 17:17 | wingy | how is that done by compojure? |
| 17:17 | wingy | or ring |
| 17:17 | Raynes | Same way it is done in Noir, just more explicit -- wrap-reload |
| 17:17 | wingy | its reading the file for each request? |
| 17:17 | Raynes | Noir wraps wrap-reload under the covers for you. If you used compojure, you'd need to do it yourself. |
| 17:18 | Raynes | If something has changed since the last request, it just reloads the code. |
| 17:18 | weavejester | lein-ring automatically adds wrap-reload |
| 17:18 | Raynes | You'd want this turned off in production. |
| 17:18 | wingy | it detects file change? |
| 17:18 | weavejester | If you're using Compojure, using lein-ring is a good idea |
| 17:18 | wingy | and reload it? |
| 17:18 | wingy | yeah im using lein-ring |
| 17:18 | Raynes | weavejester: Really? Can I use lein ring to run my code in production? |
| 17:18 | weavejester | And lein-ring automatically removes wrap-reload in production. |
| 17:18 | wingy | what is wrap-reload? |
| 17:18 | weavejester | Raynes: Yep |
| 17:18 | Raynes | How does it know I'm in production? |
| 17:19 | weavejester | Raynes: The LEIN_NO_DEV environment variable being set. |
| 17:19 | wingy | where can i read about it |
| 17:19 | Raynes | Cool. |
| 17:19 | Raynes | You're my friend. |
| 17:19 | weavejester | wingy: It's in ring-core |
| 17:19 | wingy | ok |
| 17:20 | weavejester | er… ring-devel I mean |
| 17:20 | weavejester | wingy: http://ring-clojure.github.com/ring/ring.middleware.reload.html |
| 17:20 | weavejester | Raynes: Haha |
| 17:20 | weavejester | Raynes: I've also created a Heroku thing that automatically runs lein ring server |
| 17:21 | wingy | warpy: cool |
| 17:21 | wingy | weavejester: i meant |
| 17:22 | wingy | clojure stack is so dead simple and cool |
| 17:22 | wingy | lisp syntax fits all kind of DSLs |
| 17:26 | weavejester | Raynes: Incidentally, you can also use profiles to control production options in lein-ring as well. It just tries to have sensible defaults. |
| 17:27 | hiredman | amalloy: where you saying clojurebot is broken because it could find a class called java.lang.Date? |
| 17:28 | amalloy | hiredman: he couldn't find java.util.Date either, unless i was misreading |
| 17:28 | amalloy | (whew, i wasn't) |
| 17:28 | hiredman | are you sure? |
| 17:28 | brehaut | cemerick, raynes: re:syntaxhighlighter on refheap, it could make page load times really sluggish; if you include every brush thats a lot of bloat for each request, and the default dynamic loading system is a bit hairy with letting the page load properly first |
| 17:28 | amalloy | borkdude: ,(java.util.Date.) |
| 17:28 | amalloy | clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class java.util.Currency> |
| 17:29 | clojurebot | java.util.concurrent is "When I find myself in times of trouble / Prof. Doug Lea comes to me / Coding lines of wisdom / j.u.c." |
| 17:29 | technomancy | =D |
| 17:29 | hiredman | I see someone looking for Date (which needs an import), looking for java.util.Currency (which doesn't exist) and java.lang.Date (wrong package) |
| 17:29 | hiredman | ,(import 'java.util.Date) |
| 17:29 | clojurebot | java.util.Date |
| 17:29 | hiredman | ,(Date.) |
| 17:29 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class java.util.Currency> |
| 17:30 | hiredman | huh |
| 17:32 | TEttinger | ,(java.util.Date.) |
| 17:32 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class java.util.Currency> |
| 17:32 | TEttinger | ,(Integer.) |
| 17:32 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: No matching ctor found for class java.lang.Integer, compiling:(NO_SOURCE_PATH:0)> |
| 17:34 | TEttinger | &(java.util.Date.) |
| 17:34 | lazybot | ⇒ #inst "2012-07-01T21:34:01.026-00:00" |
| 17:35 | hyPiRion | &(java.sql.Date. 0) |
| 17:35 | lazybot | ⇒ #inst "1970-01-01T00:00:00.000-00:00" |
| 17:45 | pepijndevos | what algo is used by clojures persistent maps? (and what are alternatives?) |
| 17:46 | hyPiRion | pepijndevos: http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/ |
| 17:47 | pepijndevos | hyPiRion, 2009, is that still up to date? I seem to remember something was changed n there recently. |
| 17:47 | pepijndevos | but maybe I'm confusing hashmaps and treeemaps. |
| 17:48 | wingy | isn't it more pragmatic to use ":require .. :as" instead of ":use .. :only" .. the former gives you namespace and all functions in it rather than micro pick all parts and they could still collide with others in current namespace |
| 17:48 | wingy | the former is kinda like node.js where you require everything to a local variable |
| 17:49 | tomoj | false dichotomy: (:require [foo :as f :refer [bar]]) |
| 17:49 | brehaut | wingy: :require … :as … :refer gives you all three |
| 17:49 | tomoj | did I mean dilemma? hmm |
| 17:50 | wingy | brehaut: more recommended than using :use? |
| 17:50 | brehaut | probably |
| 17:50 | wingy | i see all functions colliding in one namespace is not a great thing |
| 17:50 | brehaut | use is still handy in a repl though |
| 17:50 | wingy | yeah |
| 17:50 | wingy | for fast access |
| 17:51 | brehaut | i think :require :refer going forward is the preferred option (it was only added in 1.4) to lessen the confusion around ns usage forms |
| 17:54 | hyPiRion | pepijndevos: It was brought up yesterday, so I suppose those links are still valid. But don't take my word for it. |
| 17:54 | amalloy | pepijndevos: i don't think clojure's maps have changed since then, either hash or tree |
| 17:54 | pepijndevos | amalloy, that's probably it. |
| 17:54 | pepijndevos | me finding treemap, and thinking "wow, this is new and awesome" |
| 17:56 | wingy | brehaut: so it makes more sense to either use :as OR :refer, not both at the same time right |
| 17:56 | wingy | (:require [compojure.core :as core :refer :all] |
| 17:57 | wingy | or perhaps you have reasons for using them at the same time |
| 17:57 | wingy | ok it depends |
| 17:57 | brehaut | wingy: not necessarily true. some NSs you will want a handful of functions from without the NS qualification, but others with |
| 17:57 | wingy | right |
| 17:58 | Raynes | brehaut: fwiw, I hate people (amalloy) who do that. |
| 17:59 | brehaut | Raynes: you are dead to me |
| 17:59 | amalloy | (dec Raynes) |
| 17:59 | lazybot | ⇒ 12 |
| 17:59 | Raynes | You were never alive to me. Get out of my internet. |
| 18:00 | hyPiRion | Raynes: /ignore amalloy ? |
| 18:00 | brehaut | hahah |
| 18:00 | Raynes | He's my best friend. :( |
| 18:00 | amalloy | Raynes treasures his abusive relationships |
| 18:01 | hyPiRion | You need to heal that Stockholm syndrome, Raynes. |
| 18:01 | nkraft | System: Host Yoda Kernel 2.6.38-8-generic-pae i686 (32 bit) Distro Linux Mint 11 Katya |
| 18:06 | ivaraasen | amalloy: (:abuse 'freenode.raynes.childhood)? |
| 18:28 | solussd_ | is there a Noir + Friend (authentication) tutorial somewhere? Looks like I can just plug it [friend] in as middleware, right? |
| 18:46 | SrPx | (on matching-function callback) ... (on (fn [event] (eq (event :name) 'click)) (hide (event :target))) ;; does that seems reasonable? |
| 18:48 | kovasb | why use symbols instead of keywords to indicate the event name? |
| 18:48 | amalloy | also (fn [event] (= (event :name) 'click)) is just (comp #{'click} :name) |
| 18:49 | gfredericks | is calling a one-element set fast? |
| 18:49 | kovasb | nice |
| 18:49 | gfredericks | do large data structure cache their hashes? |
| 18:50 | nicholasf | ooc, are you guys discussing clojurescript or clojure here? |
| 18:50 | SrPx | amalloy: #{} ? |
| 18:50 | kovasb | set literal notation |
| 18:50 | SrPx | kovasb: dunno, what is the difference? |
| 18:50 | kovasb | keywords are always inert, and have some useful features |
| 18:51 | SrPx | such as? |
| 18:51 | kovasb | you can use them as functions |
| 18:51 | SrPx | anyway I'm just asking about the 'on' thing, is it OK to use it? |
| 18:51 | kovasb | (:keyword {:keyword 1}) ---> 1 |
| 18:51 | SrPx | kovasb: oh , nice! |
| 18:51 | kovasb | and you don't have to quote them |
| 18:51 | SrPx | ({:a 1} :a) works too |
| 18:51 | kovasb | and they are more amenable to being treated as data |
| 18:51 | gfredericks | same character count though |
| 18:51 | SrPx | o.O |
| 18:52 | SrPx | how? |
| 18:52 | clojurebot | with style and grace |
| 18:52 | kovasb | using them as functions lets you compose more easily |
| 18:52 | kovasb | since keywords are inert there is no question about what the serialized data means |
| 18:53 | kovasb | whereas with symbols, you can to wonder if they are supposed to be bound to something or not |
| 18:53 | amalloy | SrPx: nobody can tell you whether it's "okay" to use your `on` function, lacking any context about where it came from, what it does, or anything. all i can do is recognize that, yes, it appears to be either a macro or a function |
| 18:53 | SrPx | amalloy: I still don't get what you have done exactly :s |
| 18:54 | kovasb | its equivalent to (fn [name] (#{'click} (:name event)( |
| 18:55 | kovasb | *) |
| 18:55 | kovasb | ) |
| 18:55 | kovasb | :) |
| 18:57 | SrPx | sure but |
| 18:57 | gfredericks | &(time (count (filter #{-1} (range 1000000)))) |
| 18:57 | lazybot | ⇒ "Elapsed time: 396.446818 msecs" 0 |
| 18:57 | SrPx | (#{'click'} (:name event)) õo |
| 18:58 | gfredericks | &(time (count (filter #(= % -1) (range 1000000)))) |
| 18:58 | lazybot | ⇒ "Elapsed time: 636.541203 msecs" 0 |
| 18:58 | gfredericks | o_O |
| 18:58 | SrPx | &(#{':click'} (:name {:name :click})) |
| 18:58 | lazybot | ⇒ nil |
| 18:59 | amalloy | too many 's |
| 18:59 | SrPx | &(#{:click} (:name {:name :click})) |
| 18:59 | lazybot | ⇒ :click |
| 18:59 | SrPx | 's? |
| 18:59 | gfredericks | amalloy: what is '} ? |
| 18:59 | SrPx | &(#{:click} :test) |
| 18:59 | lazybot | ⇒ nil |
| 18:59 | amalloy | gfredericks: an error |
| 18:59 | SrPx | &(#{:click} :click) |
| 18:59 | lazybot | ⇒ :click |
| 18:59 | gfredericks | amalloy: but it didn't crash |
| 19:00 | amalloy | the reader did the best it could |
| 19:00 | SrPx | [19:48] <amalloy> also (fn [event] (= (event :name) 'click)) is just (comp #{'click} :name) |
| 19:00 | SrPx | I don't get it amaloy, it will not return true on your form |
| 19:00 | amalloy | &(read-string "(#{'x'} x)") |
| 19:00 | lazybot | ⇒ (#{(quote x')} x) |
| 19:00 | kovasb | the value will serve as truthy |
| 19:00 | kovasb | nil and false serve as false |
| 19:01 | amalloy | indeed. you don't need true or false, you just need something that acts true or false in an if-test |
| 19:01 | kovasb | everything else is true, for the purposes of control structures |
| 19:01 | SrPx | kovasb: hm :S |
| 19:01 | SrPx | &((fn [a] (= (a :name) :bah)) {:name :bah}) |
| 19:01 | lazybot | ⇒ true |
| 19:01 | SrPx | kovasb: okay I guess o.o |
| 19:01 | SrPx | thanks |
| 19:01 | SrPx | this is really nice |
| 19:02 | kovasb | yes it all comes together pretty well |
| 19:02 | kovasb | i was a non-believer in nil punning until i started to use it |
| 19:02 | SrPx | &(#{:a :b :c} :c) |
| 19:02 | lazybot | ⇒ :c |
| 19:02 | SrPx | &(#{:a :b :c} :d) |
| 19:02 | lazybot | ⇒ nil |
| 19:02 | kovasb | but it really makes code better |
| 19:03 | SrPx | so this form above can be used as a "has-keyword" |
| 19:03 | amalloy | more like has-element |
| 19:03 | amalloy | &('#{a b 1 2} 1) |
| 19:03 | lazybot | ⇒ 1 |
| 19:03 | kovasb | set is a function from elements to themselves |
| 19:03 | SrPx | oh sure |
| 19:03 | kovasb | map is a function from elements to other elements |
| 19:03 | kovasb | map = {} |
| 19:04 | SrPx | this is a real cool definition ( = |
| 19:04 | kovasb | btw you can override the default return value to be something other than nil |
| 19:04 | kovasb | in the {} case |
| 19:05 | SrPx | I've just looked for curiosity; I don't really care about it; but there is almost no jobs for clojure and lisps. But I am positive they are the best languages I've seem and I've looked at all the common ones. |
| 19:05 | kovasb | &({:a 1} :b :c) |
| 19:05 | lazybot | ⇒ :c |
| 19:05 | SrPx | Why? |
| 19:05 | clojurebot | SrPx: because you can't handle the truth! |
| 19:05 | SrPx | kovasb: (: |
| 19:05 | SrPx | wait |
| 19:05 | amalloy | SrPx: to help you tell whether nil mean: "the value is nil" vs "there's nothing here" |
| 19:05 | SrPx | &({:a 1} :a) |
| 19:05 | lazybot | ⇒ 1 |
| 19:05 | SrPx | &({:a 1} :b) |
| 19:05 | lazybot | ⇒ nil |
| 19:06 | SrPx | wait '#{}? |
| 19:06 | SrPx | &('#{:a} :a) |
| 19:06 | lazybot | ⇒ :a |
| 19:06 | SrPx | &('#{:a} :b) |
| 19:06 | lazybot | ⇒ nil |
| 19:06 | SrPx | &(#{:a} :a) |
| 19:06 | lazybot | ⇒ :a |
| 19:06 | SrPx | &(#{:a} :b) |
| 19:06 | lazybot | ⇒ nil |
| 19:06 | SrPx | .-. |
| 19:07 | amalloy | &#{a b c} |
| 19:07 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: a in this context |
| 19:07 | amalloy | &'#{a b c} |
| 19:07 | lazybot | ⇒ #{a c b} |
| 19:10 | kovasb | SrPx: there are jobs out there once you become proficient |
| 19:11 | SrPx | kovasb: and how many years is that? (: |
| 19:11 | kovasb | SrPx: it took me about 1 year to become competent, but its only my second real language |
| 19:11 | SrPx | and probably not in my country though |
| 19:11 | brehaut | SrPx: its not how many years you've been using clojure, but how many hours ;) |
| 19:11 | SrPx | kovasb: what is your first |
| 19:12 | kovasb | mathematica |
| 19:12 | SrPx | kovasb: oh you have no experience in c-like langs? |
| 19:12 | brehaut | SrPx: ive been using clojure for years, but im not that proficient |
| 19:12 | kovasb | just school stuff really |
| 19:12 | amalloy | each month of clojure is a decade of programming something else. it's like narnia in a way |
| 19:12 | SrPx | kovasb: that should be really good for you. who told you about clojure |
| 19:12 | kovasb | the internet :) |
| 19:13 | kovasb | i probably saw it on hacker news or something |
| 19:13 | SrPx | the internet was not so kind for me |
| 19:13 | SrPx | I've learned extensively other languages for 10 years before hearing about lisps |
| 19:13 | kovasb | i mean, i was in the market for a high level language on the jvm so it was not a coincidence |
| 19:13 | ivaraasen | i've learned more about CS concepts and implementation in the last week reading up on Clojure and Haskell than I've ever learned throughout my studies |
| 19:13 | SrPx | amalloy: what are you doing on clojure if I might ask |
| 19:14 | kovasb | ivaraasen: coolness |
| 19:14 | amalloy | all of my programming :P |
| 19:14 | SrPx | are all you guys CS bachelors? :s |
| 19:14 | kovasb | i was math |
| 19:14 | SrPx | amalloy: *okay* |
| 19:14 | amalloy | i'm sure we have some PhDs in here somewhere |
| 19:14 | ivaraasen | kovasb: yeah. I study petroleum geology, so we mostly learn Matlab, maybe some basic C |
| 19:14 | SrPx | I mean, are you all people who completed college already? (not know the word again sorry) |
| 19:15 | SrPx | don't* |
| 19:15 | amalloy | SrPx: a lot of my code is at http://github.com/flatland, and i wrote a big chunk of www.4clojure.com |
| 19:15 | SrPx | amalloy: yay (: |
| 19:15 | rlb | SrPx: I imagine there's a substantial variety here... |
| 19:15 | SrPx | lazybot is yours |
| 19:15 | gfredericks | man that backwards smiley took me a second |
| 19:15 | amalloy | i know we have some people here who aren't college graduates (eg Raynes) |
| 19:16 | SrPx | gfredericks: what does that mean |
| 19:16 | gfredericks | I think in-school folk are frequent |
| 19:17 | kovasb | ambrose |
| 19:17 | gfredericks | working on bachelor's |
| 19:17 | SrPx | hmm your avg age? |
| 19:17 | kovasb | i don't think education level is that relevant for clojure mastery |
| 19:17 | kovasb | no idea :) |
| 19:17 | kovasb | i am 31 |
| 19:17 | SrPx | just curiosity |
| 19:18 | ivaraasen | SrPx: dunno. I'm 21 |
| 19:19 | gfredericks | my average age is ~13 |
| 19:19 | kovasb | lol |
| 19:19 | gfredericks | it keeps rising though |
| 19:24 | SrPx | gfredericks: lal! |
| 19:24 | SrPx | amalloy: noticed you basically don't use deftype, defstruct and those |
| 19:24 | gfredericks | finally somebody lalled |
| 19:24 | SrPx | gfredericks: ? |
| 19:24 | gfredericks | SrPx: lal? |
| 19:24 | SrPx | is this good? |
| 19:24 | SrPx | lal = lol |
| 19:25 | gfredericks | then yes it's good |
| 19:25 | SrPx | why? |
| 19:25 | clojurebot | why not? |
| 19:25 | gfredericks | because it's funny-spelt |
| 19:25 | SrPx | lal |
| 19:25 | amalloy | defstruct is awful/old, don't use it. deftype/defrecord are valuable but "advanced" features you shouldn't use without a good reason |
| 19:25 | SrPx | amalloy: all I wanted to hear ( : |
| 19:25 | SrPx | also that your source is basically a sequence of defn's |
| 19:26 | SrPx | and probably most of clojure projects |
| 19:26 | SrPx | is this correct? |
| 19:26 | amalloy | pretty normal |
| 19:27 | wingy | how do i convert this one: (GET "/categories/:id" [id] to use destructuring in compojure? |
| 19:29 | wingy | the example shows: {{id "id"} :params} but (GET "/categories/:id" [{{id "id"} :params}] didnt work out pretty well |
| 19:30 | SrPx | again for curiosity, if Clojure source is basically a sequence of defs and defns, couldn't we, instead of packages, organize all them in a big, categorized database? |
| 19:30 | SrPx | of functions |
| 19:30 | wingy | this worked: (GET "/categories/:id" {{id "id"} :params} |
| 19:30 | wingy | forgot that its a fn call and not fn declaration |
| 19:31 | SrPx | also, (derive ::rect ::shape) ::name evaluates to a namespace? we are deriving namespaces? o.o |
| 19:32 | TimMc | SrPx: ::name *reads* to :whatever.namespace/name |
| 19:32 | amalloy | &::rect |
| 19:32 | lazybot | ⇒ :clojure.core/rect |
| 19:37 | SrPx | TimMc: oh okay |
| 19:41 | TimMc | &'::rect ;; more specifically -- note the quoting |
| 19:41 | lazybot | ⇒ :clojure.core/rect |
| 19:42 | pepijndevos | why does clojure use 5 bits per layer of persistent* |
| 19:42 | TimMc | Chosen by fair dice roll. |
| 19:43 | amalloy | 5d1 |
| 19:43 | clojurebot | 5 |
| 19:43 | TimMc | haha |
| 19:43 | pepijndevos | ?? |
| 19:43 | lazybot | pepijndevos: Uh, no. Why would you even ask? |
| 19:43 | amalloy | "i threw five objects into the air, and by god five came back down!" |
| 19:43 | gfredericks | lol |
| 19:43 | TimMc | Seriously though, it was probably the result of some benchmarking. |
| 19:43 | pepijndevos | 5d1 |
| 19:43 | clojurebot | 5 |
| 19:43 | pepijndevos | I don't get it, what does that do? |
| 19:44 | TimMc | 1d6 |
| 19:44 | clojurebot | 1 |
| 19:44 | amalloy | pepijndevos: XdY rolls X Y-sided dice and adds together the result |
| 19:47 | amalloy | 5d5 |
| 19:47 | clojurebot | 19 |
| 19:47 | gfredericks | 834d234 |
| 19:47 | clojurebot | 96838 |
| 19:48 | brehaut | I call dibs on the half-orc barbarian |
| 19:48 | amalloy | yeah, those sound like pretty good hit dice |
| 19:49 | brehaut | lol |
| 19:50 | brehaut | gfredericks wants people to help him write a cljs-svg lib so that he can stop playing pointless games of chess |
| 19:53 | SrPx | ,({[0 0] :foo [1 1] :boo} [0 0]) |
| 19:53 | pepijndevos | TimMc, I guess, any smaller, and lookup would go up, any larger and copying would get expensive. tricksy |
| 19:54 | clojurebot | :foo |
| 19:54 | SrPx | /\ o.o that |
| 19:54 | amalloy | SrPx: what else would you expect? |
| 19:54 | SrPx | just surprised anything can be a key |
| 19:54 | amalloy | SrPx: didn't you come from haskell? languages without real anything->anything maps are pretty crippled |
| 19:55 | SrPx | amalloy: you are overestiming me... |
| 19:55 | gfredericks | ,{(atom (ref (Object.))) (ref (atom (Object.)))} |
| 19:55 | clojurebot | {#<Atom@33c06b38: #<Ref@231d8cb8: #<Object java.lang.Object@6901960a>>> #<Ref@6721a061: #<Atom@50a8752c: #<Object java.lang.Object@63a4c512>>>} |
| 19:55 | amalloy | &({[0 1] :foo} (range 2)) ;; doesn't have to be exactly the same |
| 19:55 | lazybot | ⇒ :foo |
| 19:56 | SrPx | &({(fn [x] x) 1 (fn [a b] (a b)) 2} (fn [x] x)}) |
| 19:56 | lazybot | java.lang.RuntimeException: Unmatched delimiter: } |
| 19:56 | amalloy | okay, that won't work |
| 19:56 | SrPx | &({(fn [x] x) 1 (fn [a b] (a b)) 2} (fn [x] x)) |
| 19:56 | lazybot | ⇒ nil |
| 19:56 | SrPx | heh |
| 19:56 | SrPx | I know |
| 19:57 | amalloy | but! ##(let [f (fn [x] x)] ({x :foo} x)) |
| 19:57 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: x in this context |
| 19:57 | pepijndevos | Hm, so what are the last 2 bytes used for? Just a mini-node, or just padding? |
| 19:57 | amalloy | &(let [f (fn [x] x)] ({f :foo} f)) |
| 19:57 | lazybot | ⇒ :foo |
| 19:58 | SrPx | f is a var? |
| 19:58 | dnolen | SrPx: that's an old idea. Java, Objective-C, Smalltalk all support. Perhaps even Smalltalk got it from elsewhere. |
| 19:58 | SrPx | dnolen: Java objc really? |
| 19:58 | dnolen | SrPx: ^ re: arbitrary keys. |
| 19:58 | dnolen | SrPx: yes. |
| 19:58 | SrPx | dnolen: by external libs you mean? |
| 19:59 | pepijndevos | The only reason why anything as a key seems problematic to me is mutable keys. |
| 19:59 | dnolen | pepijndevos: Java, Objective-C, Smalltalk all consider immutable types. |
| 19:59 | amalloy | dnolen: do you know how dynamic vars interact with core.logic? like if i do (binding [x 1] (run* [f] (...declarations using x...))) do i see x=1? |
| 20:00 | SrPx | dnolen: from my past langs, was pretty sure python, lua and javascript only accepted strings for example... and c++ didn't have hashes |
| 20:00 | SrPx | amalloy: was that for me? I don't know |
| 20:00 | SrPx | I don't even know what binding and run* are |
| 20:01 | jayunit100__ | how to add args to an anonymous function? |
| 20:01 | dnolen | SrPx: Lot of languages are neat yet still get so many details horribly wrong. |
| 20:01 | jayunit100__ | (reduce #([x y] (+ x y)) [1 1]) |
| 20:01 | amalloy | i guess in that case i could force it by putting a doall inside the binding, but what if i wanted to do (run* [x] (fresh [a] (binding [*focus-object* a] (...)))) to make a particular logic variable available throughout my program |
| 20:01 | dnolen | amalloy: you should, run* is not lazy. |
| 20:03 | amalloy | cool. and is that a horrible smell? i want to create the "universe of relevant objects" once, so that i can do stuff like (connecto a b) without having to repeat "btw, a and b are both members of this universe of interesting objects" |
| 20:04 | SrPx | that sounds pterodactly cool. |
| 20:04 | amalloy | jayunit100__: just use 'fn |
| 20:05 | jayunit100__ | how ok |
| 20:05 | cshell | hey, is the person who was having the 100% cpu problem with (Thread/sleep 1000) still here? |
| 20:05 | jayunit100__ | s/how/wow |
| 20:05 | jayunit100__ | thats odd - anonymous funcs dont support args ? |
| 20:05 | dnolen | amalloy: I don't see any problems at the moment with that. |
| 20:06 | gfredericks | jayunit100__: they do |
| 20:06 | cshell | I guess the leap second is causing a problem with Java and time taking a lot of cpu: http://bit.ly/N5NM2H |
| 20:06 | jayunit100__ | ,(#(+ % 1) 1) |
| 20:06 | clojurebot | 2 |
| 20:06 | amalloy | great, thanks |
| 20:09 | jayunit100__ | ahhh i see "The arity of an anonymous function is determined by the highest argument referenced inside." -from s.o. |
| 20:10 | jayunit100__ | amalloy: why did u suggest using fn ? is it unidiomatic to use multiple args in an agonymous function? |
| 20:23 | pepijndevos | are the last 2 bits in a persistent datastructure any special? |
| 20:23 | SrPx | java.lang.IllegalArgumentException: No matching method found: concat for class java.lang.String ? |
| 20:23 | SrPx | :s |
| 20:23 | SrPx | &(.concat "a" "b") |
| 20:23 | lazybot | ⇒ "ab" |
| 20:24 | gfredericks | pepijndevos: last two bits? |
| 20:24 | amalloy | &(doc str) |
| 20:24 | lazybot | ⇒ "([] [x] [x & ys]); With no args, returns the empty string. With one arg x, returns x.toString(). (str nil) returns the empty string. With more than one arg, returns the concatenation of the str values of the args." |
| 20:24 | wingy | i am trying to split my routes into separate files but i get an error: https://gist.github.com/3030168 |
| 20:24 | wingy | how do i do it correctly? |
| 20:25 | pepijndevos | gfredericks, yea, the hash is 32 bits, and then each level uses 5 |
| 20:25 | SrPx | amalloy: ty |
| 20:25 | SrPx | &(doc +) |
| 20:25 | lazybot | ⇒ "([] [x] [x y] [x y & more]); Returns the sum of nums. (+) returns 0. Does not auto-promote longs, will throw on overflow. See also: +'" |
| 20:25 | SrPx | &(doc list) |
| 20:25 | lazybot | ⇒ "([& items]); Creates a new list containing the items." |
| 20:25 | SrPx | &(str "a" "b") |
| 20:25 | lazybot | ⇒ "ab" |
| 20:25 | amalloy | categories/api |
| 20:26 | pepijndevos | gfredericks, so you end up with 2 bits at the end. I wonder if they are special, ignored, or just mini-nodes |
| 20:26 | wingy | amalloy: i always forget .. thx |
| 20:26 | gfredericks | pepijndevos: I don't know :( |
| 20:27 | TimMc | pepijndevos: There's an article explaining this... does it explain the 2 bits? |
| 20:27 | pepijndevos | TimMc, not as far as I can tell, but I did not study the code |
| 20:27 | pepijndevos | TimMc, these bits are arguably a bit of an edge case ;) |
| 20:28 | gfredericks | perhaps at level 7 you can only have 4 entries :) |
| 20:28 | pepijndevos | maybe... |
| 20:28 | pepijndevos | or you can wrap around and do the whole thing again, with the thing offset by 2 |
| 20:30 | pepijndevos | no, that would be silly |
| 20:32 | TimMc | Also, why does that article show 33 bits? http://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/ |
| 20:35 | pepijndevos | TimMc, I wondered that too, I assume it's an error. |
| 20:35 | amalloy | maybe it's a carry bit left over from someone's half-adder |
| 20:39 | wingy | if i want to work with browser DOM the choice seems to be between Domina, Enfocus and Jayq .. how do these compare to each other? the former 2 do not require jQuery at all? |
| 20:40 | wingy | seems like if i use enlive then i should use enfocus .. and if i use hiccup then domina |
| 20:40 | wingy | same style |
| 20:42 | pepijndevos | hm, where is this INode described in the blogpost? |
| 20:43 | pepijndevos | ah https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentHashMap.java#L325 |
| 20:49 | yoklov | using trampoline doesn't have any inherent limitations over true tail recursion, right? |
| 20:49 | gfredericks | it's hacky |
| 20:49 | yoklov | well, if I'm still getting a stack overflow, that means i'm not doing it somewhere I should be |
| 20:50 | yoklov | even if the stack overflow is very rare now |
| 20:54 | dnolen | yoklov: I don't think you should have problems with trampoline. |
| 20:55 | rlb | yoklov: in general, trampolines can be a bit less efficient. |
| 20:55 | rlb | yoklov: not sure it's significant in clojure. |
| 20:57 | yoklov | I'm using continuation passing style to get call/cc, and using a trampoline to stop from blowing the stack, which is working in most cases |
| 20:57 | dnolen | yoklov: have you looked at clojure-tco? |
| 20:59 | yoklov | I remember hearing about it a while back, this is actually older code which I'm trying to fix a bug in, so using it now would require rewriting pretty much everything |
| 21:01 | yonatane | Do you think libs like noir should make the session variable "injectable", for example when I want noir and sandbar to share the same session variable and not have two different ones? |
| 21:08 | devn | yonatane: do you need to synchronize sessions between the two sessions? |
| 21:08 | devn | yonatane: i dont know to be honest, but having two session vars around that need to be the same thing smells bad to me |
| 21:09 | devn | it seems like 1 is a good thing, but then again maybe there are too many eggs in one basket if that is the case |
| 21:11 | wingy | my research about DOM manipulation: jQuery seems to be very OOPish compareed to Closure's more FP style: http://blog.blazingcloud.net/2012/03/09/manipulating-the-dom-google-closure-vs-jquery/ |
| 21:11 | yoklov | i always agreed with the sentiment that jquery was somewhat monadic |
| 21:13 | wingy | there goes jayq and jquery .. left is domina, enfocus and closure .. since cljs is using the latter and the latter is far more used i think we have a winner |
| 21:14 | yoklov | err, what's wrong with jayq? |
| 21:15 | yoklov | (haven't used it recently, but iirc it was great) |
| 21:15 | wingy | just personal taste |
| 21:15 | wingy | i prefer fp style when coding |
| 21:15 | wingy | jquery returns objects with methods |
| 21:15 | yoklov | you think google closure is more functional than jquery? |
| 21:16 | wingy | according to the comparisons |
| 21:16 | yoklov | really? |
| 21:16 | brainproxy | wingy: you can use jayq together with threading macros to stay in a functional style |
| 21:16 | yoklov | google closure is extremely OOP |
| 21:16 | wingy | they have proper namespacing .. they use functions on elements |
| 21:16 | brainproxy | i think clojurescript supports doto also |
| 21:18 | yoklov | that article isn't really idiomatic for jquery |
| 21:18 | wingy | you guys seem to prefer jquery |
| 21:19 | yoklov | e.g. the example with adding and removing classes would better be $("#articles").addClass("mobile").toggleClass("hidden").removeClass("gerbil-bate"); |
| 21:19 | yoklov | method chaining is still stateful, but it lets you ignore that there's mutation going on, to a certain extent |
| 21:19 | dnolen | wingy: I jayq or domina is mostly a matter of taste. eventually I think CLJS specific libs will win out since they are subject to more optimizations. |
| 21:21 | wingy | yoklov: that looks oop |
| 21:22 | brehaut | method chaining doesnt have to be stateful |
| 21:22 | wingy | dnolen: clojure is still very weak in frontend .. all the UIs and stuff we benefit from other libs |
| 21:22 | brainproxy | wingy: I have something like this in a cljs script: |
| 21:22 | brainproxy | `(doto ($ "[name|=move]") (.val "") (.focus)))` |
| 21:23 | yoklov | That looks more OOP than `goog.dom.classes.add(element, 'mobile'); goog.dom.classes.remove(element, 'hidden'); goog.dom.classes.toggle(element, 'gerbil-bate');`? |
| 21:23 | yoklov | statements are very non-fp |
| 21:23 | wingy | i dont know if i can trust a small lib like domina to be well maintained and bug fixed when problems occur |
| 21:23 | wingy | and questions |
| 21:23 | dnolen | wingy: why? most Clojure libs are small :) |
| 21:24 | brehaut | dnolen: how many hundred lines is core.logic? |
| 21:24 | dnolen | brehaut: it's getting big now for a Clojure program. pushing near 3000 lines now. |
| 21:25 | wingy | dnolen: yeah .. but the question is why not use jQuery/Closure if they are really tested, well maintained and popular |
| 21:25 | brehaut | dnolen: a true behemoth for clojure then ;) |
| 21:25 | dnolen | wingy: domina is built on top of Closure. |
| 21:25 | brehaut | PHP is popular. should we be using that too? |
| 21:26 | brehaut | (theres nothing like a good slipper slope strawman) |
| 21:28 | brainproxy | i was thinking maybe you'd like ruby slippers... stupid wizard of oz reference :p |
| 21:28 | gfredericks | crap I forgot about the 1930's |
| 21:28 | TimMc | Wait, is it that old? |
| 21:29 | TimMc | Within my lifetime, that film will be a century old. |
| 21:29 | gfredericks | what? films can't be a century old |
| 21:29 | gfredericks | surely you jest |
| 21:29 | brainproxy | 1939, yeah... |
| 21:29 | brehaut | seriously daskeyboard? no international shipping‽ |
| 21:30 | gfredericks | brehaut: we're making time jokes; stay on topic |
| 21:30 | brehaut | lol timezones? |
| 21:30 | gfredericks | nothing funnier than time, whatever it is |
| 21:34 | rlb | brehaut: got a filco -- quite like it fwiw |
| 21:35 | yoklov | hm, if I'm getting a stack overflow error, my stacktraces should probably be… huge, right? |
| 21:35 | dnolen | yoklov: usually |
| 21:35 | devn | where does the {:pre} go with multiple arities? |
| 21:36 | devn | can you have it function definition-wide, or must it be tied to each arity? can it be tied separately to each arity? |
| 21:36 | yoklov | Hm. If they're tiny, e.g. 5 lines long, does it mean I probably have a memory leak somewhere? |
| 21:37 | brehaut | yoklov: that would also require everything to be stashed on the stack right? |
| 21:37 | brehaut | yoklov: doenst java in general prefer the heap? |
| 21:37 | yoklov | yeah |
| 21:39 | yoklov | I think the issue *could* be that I'm preventing GC accidentally with closures, but that would certainly be on the heap... |
| 21:58 | amalloy | it's 100% not a GC issue, yoklov |
| 21:59 | amalloy | small stacktraces could just mean that the JVM's stacktrace-printer is omitting repeated lines, in that (1000 more) way that it sometimes does |
| 21:59 | yoklov | hm |
| 21:59 | yoklov | dang. |
| 21:59 | amalloy | and stack space for a thread is preallocated long before that thread starts new'ing |
| 21:59 | amalloy | so gist your actual stacktrace |
| 22:00 | yoklov | it's different every time |
| 22:04 | yoklov | wait, got the real one, nm it's huge |
| 22:04 | Raynes | SrPx: Mine, actually. |
| 22:04 | amalloy | i'll fight you for it |
| 22:04 | SrPx | Raynes: yours... ? |
| 22:04 | Raynes | SrPx: I started lazybot years ago when I first started using Clojure. amalloy hopped on later on and we became bestest friends evars. |
| 22:05 | SrPx | yay . |
| 22:05 | Raynes | amalloy and I both work on flatland projects. |
| 22:05 | SrPx | I see |
| 22:06 | SrPx | hmm so, now that I'm here, why don't we forget that folder based filesystem, make a tag-based filesystem where you find your files by a real-time filter of their names/tags/type |
| 22:07 | SrPx | and then we define a filetype (I mean datatype, whatever) called clfunc |
| 22:07 | SrPx | make it searchable in awesome ways like "find function that will pass the test = (f [1 2 3]) [3 4 5] |
| 22:07 | SrPx | and then plug every function we make into a giant database of awesomeness |
| 22:08 | SrPx | hm hm hm ? |
| 22:08 | SrPx | : D |
| 22:08 | SrPx | ): |
| 22:09 | SrPx | nobody loves me t.t |
| 22:10 | kkreamer | I was just thinking of the first time I copy a file... same name, same tags, etc. |
| 22:11 | kkreamer | I guess the copied one has to sport a goatee |
| 22:11 | SrPx | Why do you need to copy a file? |
| 22:11 | yoklov | woohoo! fixed it! |
| 22:12 | kkreamer | To change the copy without affecting the original, I guess |
| 22:13 | kkreamer | or, onto removable media to give to someone |
| 22:13 | kkreamer | the latter use case probably isn't a problem, I suppose |
| 22:14 | SrPx | Hmm well you have the same problem on the folder based architecture, though. |
| 22:14 | SrPx | They just add "copy of " to the name so you just do it too? |
| 22:14 | SrPx | I don't see why you couldn't have 2 files with the same matching though |
| 22:14 | kkreamer | I usually copy to a different directory |
| 22:15 | SrPx | Anyway I don't know why people are relunctant but I think this would solve most of my problems today |
| 22:15 | SrPx | and I'm yet to find a tool that will do it in other way |
| 22:15 | SrPx | maybe they don't think it is a problem at all |
| 22:15 | SrPx | that they can't grab whatever file/function they want from their entire system/life (or even a huge database) in a few keystrokes |
| 22:17 | kkreamer | well, build it then, and if it's awesome and solves a problem, people will use it |
| 22:18 | kkreamer | until then, I'll keep using find |
| 22:18 | SrPx | I can't find the right way to build it. |
| 22:18 | SrPx | find? |
| 22:18 | kkreamer | be back in a bit... |
| 22:18 | SrPx | what is find ? u.u |
| 22:24 | amalloy | $google bash find |
| 22:24 | lazybot | [find Man Page] http://ss64.com/bash/find.html |
| 22:32 | uvtc | technomancy: ping |
| 22:42 | technomancy | uvtc: what's up? |
| 22:43 | uvtc | Hi techomancy. Those two lein-newnew issues. I was using the newest lein 2.0.0-preview7. I'd rm -fr'd my ~/.m2 and ~/.lein before use. |
| 22:44 | uvtc | I was just going through the process again, but for some reason it's taking forever to download the lein 2 jar again. |
| 22:44 | technomancy | do you have an old version declared in your user profile? |
| 22:44 | uvtc | Is that kept somewhere else besides ~/.lein or ~/.m2? |
| 22:44 | technomancy | ~/.lein/profiles.clj |
| 22:44 | clojurebot | /.lein/profiles.clj is nice, but it doesn't allow you to vary the profile for a specific project without checking it in to the repo |
| 22:45 | uvtc | I'd wiped that out completely before trying lein 2 preview 7. |
| 22:45 | uvtc | After I pinged you just now, I figured I'd wipe everything out and try again, but it's never taken this long to install the lein jar... not sure what's up. |
| 22:46 | technomancy | problems with github? |
| 22:46 | technomancy | someone mentioned they were returning 502 on tarball download |
| 22:46 | uvtc | 22% [==============> ] 2,362,606 8.51K/s eta 14m 30s |
| 22:46 | technomancy | weird |
| 22:46 | technomancy | it's supposed to just redirect to s3 |
| 22:46 | uvtc | Every previous time I've installed lein it's taken just a few seconds. |
| 22:47 | uvtc | Resolving cloud.github.com (cloud.github.com)... 204.246.169.228, 204.246.169.179, 204.246.169.49, ... |
| 22:47 | uvtc | Connecting to cloud.github.com (cloud.github.com)|204.246.169.228|:80... connected. |
| 22:47 | uvtc | HTTP request sent, awaiting response... 200 OK |
| 22:47 | uvtc | Length: 10321086 (9.8M) [application/x-java-archive] |
| 22:47 | uvtc | Location: http://cloud.github.com/downloads/technomancy/leiningen/leiningen-2.0.0-preview7-standalone.jar |
| 22:48 | technomancy | that's just a cname for an S3 bucket IIRC |
| 22:49 | uvtc | Anyway, I was indeed using lein-newnew 0.3.4 ... well, at least, that's the version I saw in ~/.m2/repository . |
| 22:50 | kkreamer | maybe Amazon is having problems again... |
| 22:55 | kkreamer | nevermind, it downloaded for me |
| 22:56 | uvtc | Oooh, d/l seems to be speeding up. eta 45s. |
| 22:56 | kkreamer | from the link you gave, anyway |
| 22:56 | uvtc | hahaha. spoke too soon. |
| 22:56 | kkreamer | and in just a few seconds |
| 22:57 | uvtc | Mine just stopped. |
| 22:57 | uvtc | kkreamer, stop hogging my bandwidth! ;) |
| 22:57 | kkreamer | heh |
| 22:58 | uvtc | Ah, completed. |
| 23:00 | uvtc | technomancy, So, again, after rm -fr ~/.lein and rm -fr ~/.m2, rm bin/lein, |
| 23:00 | uvtc | and after grabbing a fresh lein2, chmod +x, |
| 23:00 | uvtc | lein version ==> Leiningen 2.0.0-preview7 on Java 1.7.0_03 OpenJDK 64-Bit Server VM |
| 23:00 | uvtc | `lein new app foo-bar` |
| 23:01 | uvtc | There's no doc directory, |
| 23:01 | uvtc | and the project.clj has Clojure 1.3.0 listed. |
| 23:02 | technomancy | uvtc: so for some reason it's using 0.3.3 for you |
| 23:02 | uvtc | john@garnet:~/.m2/repository/lein-newnew/lein-newnew$ ll |
| 23:02 | uvtc | total 4 |
| 23:02 | uvtc | drwxrwxr-x 2 john john 4096 Jul 1 22:58 0.3.4/ |
| 23:03 | technomancy | oh wait, I was using the default template |
| 23:03 | uvtc | And there's all 0.3.4 files in there. |
| 23:03 | technomancy | you're right; the app template is out of date |
| 23:03 | technomancy | my bad |
| 23:03 | uvtc | Ah, cool then. Thanks. :) |
| 23:07 | uvtc | technomancy, also issue 37. |
| 23:07 | technomancy | yup, reopened them both |
| 23:09 | uvtc | If I clone a repo, create a fork, make my changes, push my fork to my origin, send a pull-request, and it gets merged, what's the next step? Do I delete the local branch? (`git checkout master; git branch -d my-branch`?) |
| 23:10 | technomancy | might as well delete the branch, yeah |
| 23:11 | uvtc | To delete it also from origin, |
| 23:11 | uvtc | that's `git push origin :my-branch` , correct? |
| 23:11 | technomancy | right |
| 23:11 | uvtc | thanks, technomancy |
| 23:11 | technomancy | probably doesn't matter with a repo that small, but you might as well |
| 23:12 | uvtc | technomancy, is it any more (or less) hassle when someone sends you a pull-request on master (rather than on a dedicated branch)? |
| 23:13 | technomancy | uvtc: one from master is not a big deal, but it means when it gets merged then your master will probably not be tracking my master |
| 23:13 | technomancy | which means you'll get extraneous merge commits whenever you pull from me, and those can be annoying |
| 23:15 | uvtc | Most folks just periodically pull from upstream to keep up to date, right? |
| 23:17 | technomancy | yeah |
| 23:17 | uvtc | Anyway though, I was asking specifically if it's any more bother to you (the person I'm sending the pull-request to), if it's on master vs. a separate branch. |
| 23:17 | uvtc | Sounds like it's six of one, half dozen of the other. |
| 23:17 | technomancy | if your master is just my master plus the stuff you want me to pull, it's fine |
| 23:17 | technomancy | but making commits on master tends to cause extraneous noise to sneak in there |
| 23:18 | technomancy | it's possible to avoid that, but it's better not to have to bother |
| 23:18 | uvtc | Very good. Thanks. |
| 23:21 | technomancy | sure |
| 23:32 | mshroyer | anyone here using clojure-swank? I'm having an issue that I've failed at googling |
| 23:32 | mshroyer | basically the repl is "laggy" in Emacs |
| 23:32 | mshroyer | like when I type (+ 1 2) |
| 23:32 | mshroyer | there's a half-second or so hang after typing each of the arguments |
| 23:33 | S11001001 | are you using jack-in with swank-clojure 1.3.4? |
| 23:33 | mshroyer | yep I'm using jack-in, and let me double check my swank-clojure version |
| 23:33 | TimMc | Any chance the REPL has been running for a couple of days? :-) |
| 23:33 | mshroyer | heh nope, this is a fresh repl, thanks though |
| 23:33 | S11001001 | never experienced it myself |
| 23:34 | S11001001 | paging? |
| 23:34 | TimMc | Darn, can't blame it on the leap-second, then. |
| 23:34 | mshroyer | and it's swank-clojure 1.4.2 I'm using |
| 23:35 | S11001001 | hmm, so you're hanging on round-trip for slime doc; after the delay you get a minibuffer goodie? |
| 23:35 | mshroyer | S11001001: yeah that seems to be what's happening, as far as I can tell |
| 23:35 | S11001001 | & I should upgrade |
| 23:35 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: I in this context |
| 23:35 | S11001001 | heh |
| 23:36 | S11001001 | you a CL slime user by any chance mshroyer ? |
| 23:36 | mshroyer | well strictly, after the delay followed by me typing a space |
| 23:36 | mshroyer | S11001001: actually yes |
| 23:36 | mshroyer | sbcl |
| 23:36 | S11001001 | got slime in your emacs load-path? |
| 23:37 | mshroyer | hmm why yes I do |
| 23:37 | S11001001 | I had funky issues with the swank protocol screwing up [which caused a delay] when printing, because I had my own slime loading |
| 23:37 | S11001001 | okay that's almost certainly your problem |
| 23:37 | mshroyer | cool, let me try then... |
| 23:37 | S11001001 | kick slime out of your load-path, restart, and let jack-in install its own slime stuff |
| 23:37 | wingy | hiccup is awesome |
| 23:38 | wingy | so simple and fun |
| 23:38 | S11001001 | yeah, some crazy people want to add function invocation to it though |
| 23:38 | mshroyer | S11001001: good call! that fixed it, thanks! |
| 23:38 | S11001001 | mshroyer: np |
| 23:57 | mindbender | isn't `lein repl` supposed to start a properly classpathed repl when started at the root of a clojure project? |