2012-02-16
| 00:13 | aphyr | Having a spot of trouble with lein-autodoc; does anyone know why it might complain "Could not initialize class <my-namespace-here>__init", and then generates a skeleton doc page without any functions? |
| 00:13 | aphyr | https://refheap.com/paste/765 |
| 00:22 | TimMc | tmciver: This is probably the ugliest code I have written yet: https://github.com/baznex/imports/blob/defproxy/src/org/baznex/imports.clj#L169 (invokePrim still doesn't get called...) |
| 00:24 | Raynes | TimMc: Stop doing that. |
| 00:24 | TimMc | ;.; |
| 00:24 | TimMc | Look, after midnight is the best time to write macros that implement IFn. |
| 00:24 | Raynes | What do you guys *do* at those meetings? |
| 00:24 | TimMc | Any other time of day I would stab myself in the eye with a fork. |
| 00:25 | TimMc | Raynes: Take hallucinogens and write macros? I dunno. |
| 00:27 | tmciver | TimMc: that code make *me* want to stab myself in the eye with a fork. |
| 00:27 | aphyr | I like the hardcoded 21 and 20. |
| 00:27 | TimMc | What are *you* still doing awake? |
| 00:27 | TimMc | aphyr: Check out clojure/lang/IFn.java |
| 00:27 | tmciver | This is the best time to read macros. |
| 00:28 | aphyr | TimMc: ............... |
| 00:28 | Raynes | It's in your best interest to not read Clojure's Java source. |
| 00:28 | aphyr | Let me guess, JIT? |
| 00:28 | Scriptor | I've done it, it's not too bad |
| 00:29 | Scriptor | just...its indentation and style for braces |
| 00:29 | TimMc | aphyr: I really don't know. |
| 00:29 | aphyr | I like how scrolling through that file quickly gives a neat sort of spiral effect on the interface names |
| 00:30 | TimMc | aphyr: It's not fun debugging the macro output for this code... |
| 00:30 | TimMc | https://refheap.com/paste/766 |
| 00:30 | Raynes | I don't think that white is bright enough. |
| 00:31 | Raynes | If the expansion isn't burned into my retina while I sleep tonight, it isn't bright enough. |
| 00:31 | aphyr | argh. I feel like everyone on the internet has *hit* this autodoc issue but nobody wrote down the answer... |
| 00:32 | Raynes | aphyr: There is no particular autodoc issues. It's just autodoc itself. |
| 00:32 | Raynes | :p |
| 00:32 | Raynes | I'm a fan of codox these days, myself. |
| 00:32 | TimMc | tmciver: The IFn subinterface name-building was still wrong. >_< |
| 00:32 | TimMc | I finally wrote another test for it. |
| 00:33 | aphyr | "Could not initialize class" is... shockingly uninformative |
| 00:33 | aphyr | Do I have to AOT compile all my classes or something? |
| 00:35 | TimMc | tmciver: Another problem... for nullary methods that return a long or double, we should actually have both an invoke and an invokePrim. |
| 00:36 | tmciver | TimMc: ha! |
| 00:36 | TimMc | I am basically going insane over here. <3 SCM, it enables this with low risk. |
| 00:36 | tmciver | I'm not going to try to decipher this tonight. That's some bad-ass kung-fu. |
| 00:37 | TimMc | tmciver: It also doesn't work. |
| 00:37 | TimMc | So.... there's that, too. |
| 00:37 | tmciver | that's minor. |
| 00:37 | tmciver | ;) |
| 00:37 | tmciver | Packing it in; see you tomorrow. |
| 00:37 | TimMc | If I'm wearing an eyepatch, you'll know why. See you. |
| 01:38 | mdh | is it possible for a macro that is shared between clojurescript and clojure to detect the macro expansion envrionment so that it may exhibit different behavior on client and server? |
| 01:46 | ibdknox | mdh: if it's different, why wouldn't you write two different macros? |
| 01:47 | mdh | because the parameters are common to both |
| 01:47 | ibdknox | so? |
| 01:47 | mdh | they represent data that i do not want duplicated |
| 02:19 | mdh | ibdknox: thx, agree - dual macro definitions single point of use is the way. |
| 02:37 | newster | Hi guys. I'm trying to figure out how to sort a vector and get back not the original values but the original positions (1-based or 0-based indices) of the sorted values. e.g. in R: sort(c(5,3,4),index.return=TRUE)$ix gives me [2 3 1], becaue the smallest value was the 2nd one, and so forth. How would I do that in clojure? |
| 02:53 | testing1234ok | testing |
| 02:54 | testing1234ok | I'm in an emacs repl right now entering these commands manually woot for sexpressions |
| 02:56 | newster | :-) |
| 02:57 | raek | newster: one way is to pair up the values with their indices, sort them, and then keep just the indices: (map second (sort-by first (map vector v (range)))) |
| 02:57 | newster | raek: ah, okay. I'll try that. Thank you. |
| 02:58 | testing1234ok | 2+2 == 4 |
| 02:58 | tylergillies | heh (write irc (str "privmsg #clojure : 2+2 == " (+ 2 2))) |
| 02:59 | tylergillies | slime is a decent irc client |
| 03:02 | tylergillies | so im sitting in bed and my wife says, and this is literal "you're bothering me, go on your computer and write some Lisp" |
| 03:04 | newster | raek: thanks! that works very nicely. |
| 03:04 | raek | np |
| 03:06 | newster | tg: she's a keeper that one. :-) |
| 03:09 | tylergillies | i noticed that emacs doesn't display line numbers defaultly, do most people program with them off? |
| 03:10 | raek | tylergillies: you mean in stacktraces? |
| 03:10 | tylergillies | i mean in margin |
| 03:10 | tylergillies | next to code |
| 03:10 | raek | ah |
| 03:11 | raek | I program with them off (the current line number is displayed at the bottom of the screen anyway) |
| 03:11 | raek | and you can jump to a certain line with M-g g |
| 03:14 | tylergillies | raek: thnx |
| 03:18 | Fossi | tylergillies: i have them on |
| 03:19 | Fossi | basically everybody's emacs config is hugely different ;) |
| 03:19 | testing1234ok | {:exit 0, :out " 3:23 up 3 days, 1:29, 3 users, load averages: 1.36 1.13 1.19\n", :err ""} |
| 04:53 | hba | hi, i'm getting "Exception in thread "main" java.io.FileNotFoundException: Could not locate leiningen/core/main__init.class or leiningen/core/main.clj on classpath" with LEIN_VERSION="2.0.0-SNAPSHOT", any idea? |
| 06:21 | webusnix | can i parse html in clojure ? |
| 06:22 | vijaykiran | webusnix: enlive can "scrape" html - buth what do you want to do ? |
| 06:23 | webusnix | <vijaykiran> i want get all <p></p> values from web page |
| 06:24 | vijaykiran | take a look at https://github.com/swannodette/enlive-tutorial |
| 06:24 | vijaykiran | I think that has what you want to do - especially the scraping part |
| 06:31 | raek | weavejester: yes. (select (html-resource (URL. "http://...")) [:p]) |
| 06:32 | vijaykiran | webusnix: ^^ |
| 06:33 | raek | eh, wrong nick... sorry! |
| 06:54 | bOR_ | Wrestling a bit with continuously printing an incoming string into an emacs swank repl. When evaluting the following expression, it works (and keeps working as telnet sends new text), but it puts spaces in between every char. |
| 06:54 | bOR_ | (println (take 10000 (remove #{\return} (map char (take-while #(not= % -1) (repeatedly #(.read (.getInputStream avendar)))))))) |
| 06:54 | bOR_ | this next one doesn't put in the spaces, but also doesn't continue printing out as telnet sends new input. |
| 06:54 | bOR_ | (print (apply str (take 10000 (remove #{\return} (map char (take-while #(not= % -1) (repeatedly #(.read (.getInputStream avendar))))))))) |
| 06:55 | bOR_ | not sure how I can get the behaviour of the first with the spacing of the second. |
| 06:55 | bOR_ | (first time working with an incoming buffer :-) |
| 06:56 | bOR_ | (goal is to be able to mud from within an emacs-swank repl ;-) |
| 07:08 | bOR_ | hmm. might try with slurp |
| 07:44 | pyr | cd |
| 08:12 | tylergillies | anyone know how to access (doc foo) in clojure-swank repl when namespace isn't user? |
| 08:13 | vijaykiran | did you (use 'clojure.repl) ? |
| 08:16 | tylergillies | nope |
| 08:16 | tylergillies | i used M-x clojure-jack-in |
| 08:16 | tylergillies | then C-c M-p |
| 08:17 | raek | tylergillies: you need to use the clojure.repl from each namespace where you want to access doc |
| 08:17 | vijaykiran | I'm not sure if clojure.repl is included by default, I use lein swank and slime connect - and always do a (use 'clojure.repl) to get the doc |
| 08:18 | raek | tylergillies: ...or you use the C-c C-d C-d command in emacs |
| 08:24 | tylergillies | raek: thanks |
| 08:25 | tylergillies | oh cool c-c c-d c-d is handy |
| 09:05 | dbushenko | hi all! |
| 09:06 | dbushenko | I've got a noir project, when I run it like "lein noir run" -- all goes ok. But when I run the uberjar-ed app on the webhosting, the routes become broken |
| 09:06 | dbushenko | how to fix that? |
| 09:16 | mdeboard | dbushenko: You might try #noir :) |
| 09:16 | dbushenko | ok :-) |
| 09:16 | mdeboard | (Think it's pretty much all the same people though) |
| 09:17 | cemerick | Less of a chance for a question to be missed in noise, though. |
| 09:22 | dbushenko | how do you guys deploy your webapps? |
| 09:23 | bOR_ | not doing webapps. mainly using clojure for individual-based simulation models :-). |
| 09:24 | dbushenko | ok, but may be anyone does |
| 09:24 | dbushenko | ? |
| 09:25 | mdeboard | cemerick: Do you know of any Clojure projects focused on Mahout & Lucene together? |
| 09:25 | cemerick | mdeboard: sorry, no; I'm very behind on the Lucene world. |
| 09:27 | cemerick | dbushenko: heroku is very popular recently; otherwise, any .war-based deployment option (e.g. Elastic Beanstalk, Cloudbees, automating things using pallet/puppet/chef on a compute note from EC2/rackspace/linode/etc) will work. |
| 09:27 | dbushenko | yes, but I can't get it running when I bundle it either in jar or war |
| 09:29 | cemerick | well, webapps are never deployed as jars |
| 09:30 | cemerick | dbushenko: use lein-ring's war task if you want a war, and follow its documentation for setting that up |
| 09:30 | cemerick | or, use lein-beanstalk to deploy to elastic beanstalk |
| 09:30 | dbushenko | trying to make a war, but it can't find my servlet... |
| 09:37 | pcavs | What's the proper way to create a map of resources that gets reused for every thread in a web service? I was thinking just doing (def my-resource-map (ref {})) and then manipulating that with dosync, but I'm not sure if that will create a new ref for every thread, or will each thread refer to the same ref? |
| 09:41 | jcrossley3 | dbushenko: immutant is another deployment option, and doesn't require a war: http://immutant.org/news/2011/11/08/deploying-an-application/ |
| 09:53 | babilen | Hello. I am trying to implement a lazy version of a function that splits a given sequence at a subsequence. http://paste.debian.net/156484/ is what I have so far (based on suggestions by TimMc), but it does not seem to be as lazy as it could be. I do not quite understand why I see the behaviour I am seeing and would be grateful for any comments or criticism of that approach. |
| 10:52 | tdrgabi1 | haven't used clojure in a while. is clojars still the place to go for packages? |
| 10:55 | TimMc | tdrgabi1: Yep. |
| 10:57 | aniero | i hear clojurescript is the new hotness |
| 10:57 | aniero | i've written my share of web apps with jquery callback soup, and experienced the vast improvements that client-side MVC with backbone, ember, etc. bring... is there a place I can learn how to write well-structured client-side code with cljs? |
| 10:58 | TimMc | babilen: At a glance, partition-by is being more eager than you want/ |
| 11:05 | TimMc | ,(let [a (atom []), res (partition-by #(do (swap! a conj %) (zero? (mod % 5))) (iterate inc 0)), forced (doall (take 3 res))] [forced @a]) |
| 11:06 | clojurebot | [((0) (1 2 3 4) (5)) [0 1 1 2 3 ...]] |
| 11:06 | TimMc | ugh, clojurebot -- you are terrible |
| 11:07 | TimMc | &(let [a (atom []), res (partition-by #(do (swap! a conj %) (zero? (mod % 5))) (iterate inc 0)), forced (doall (take 3 res))] [forced @a]) |
| 11:07 | lazybot | ⇒ [((0) (1 2 3 4) (5)) [0 1 1 2 3 4 5 5 6]] |
| 11:07 | TimMc | babilen: You need to use something that *knows* that each delimiter is only one token long. partition-by doesn't know that! |
| 11:09 | dnlcttr | aniero: i haven't been able to get clojurescript one to do anything |
| 11:09 | aniero | ha! |
| 11:09 | dnlcttr | it just hangs |
| 11:10 | aniero | it looks like clojurescript one uses the google closure library pretty heavily |
| 11:11 | dnlcttr | have you tried it out yet? |
| 11:11 | aniero | no, just looked at the code |
| 11:12 | dnlcttr | hmm. well, they have some bootstrap instructions, but as far as i can tell, they don't work |
| 11:12 | dnlcttr | https://github.com/brentonashworth/one/wiki/Getting-started |
| 11:12 | dnlcttr | i've tested it on mac and linux both |
| 11:13 | dnlcttr | if you end up trying it, i'd be curious to know what you find |
| 11:13 | clgv | I tested clojure script one a few weeks ago and it worked pretty well. |
| 11:13 | aniero | is it considered a good example of how to write clojurescript? |
| 11:14 | clgv | I dont know. |
| 11:14 | dnlcttr | i haven't looked much past the getting-started pages, but from what i understand it is a bunch of examples to help you get started |
| 11:14 | clgv | I was just curious to see a clojurescript example |
| 11:14 | dnlcttr | clgv: did you use the getting-started instructions at the link above? or something else? |
| 11:14 | tdrgabi1 | if we use slime and clojure-jack-in, when we add a new dep and run "lein deps", what do I need to run in slime to load that dependency? |
| 11:15 | raek | tdrgabi1: the simplest way is to restart slime |
| 11:15 | clgv | dnlcttr: yeah |
| 11:16 | raek | run clojure-jack-in again |
| 11:16 | tdrgabi1 | raek: will try |
| 11:16 | raek | you might need to kill the *Swank* buffer |
| 11:17 | clgv | what is the slow part of reflection? looking up the method in the class? if so, I could improve performance by caching the method |
| 11:22 | `fogus | Clojure-centric interview with William Byrd: http://clojure.com/blog/2012/02/16/take5-william-byrd.html |
| 11:23 | TimMc | clgv: Well, there's 1) inspecting the args, and 2) looking up methods. Maybe that's all done in one step with Class/getMethod(String, Class[]) |
| 11:23 | TimMc | Hinting allows that to be done at compile time. |
| 11:24 | TimMc | (when it is ambiguous) |
| 11:24 | clgv | TimMc: I could keep a ref to that method to boost performance. type hinting is not possible |
| 11:24 | TimMc | Methods aren't objects. |
| 11:25 | TimMc | You can have java.lang.Method objects, but Method/invoke might be expensive, not sure. |
| 11:26 | ivan | how do I fix this? http://paste.lisp.org/display/127806 doseq causes: Can only recur from tail position |
| 11:26 | clgv | TimMc: yeah, that was what I was aiming at. |
| 11:26 | babilen | TimMc: Ok, I'll implement something along the lines of partition-by with that knowledge and try that. I don't quite understand why my code isn't working though. Thanks a lot for you suggestions. (I like this approach and the code feels more natural) |
| 11:27 | TimMc | babilen: partition-by is trying to figure out when the segment where sentinal? returns true ends. |
| 11:28 | TimMc | Actually, that's another bug in your code. (split [1 2] [1 2 1 2 1 2]) should return [[] [] [] []] but probably doesn't. |
| 11:28 | babilen | TimMc: Ah, ok. I'll investigate that too. Ta! |
| 11:30 | TimMc | ,(.isVarArgs (.getMethod String "format" (into-array Class [String (class (to-array []))]))) ;; whoa, we *can* detect varargs methods! |
| 11:30 | clojurebot | true |
| 11:48 | clgv | TimMc: keeping a ref to the method is a 2times speed up |
| 11:48 | clgv | TimMc: I wish they would have used a common interface |
| 11:48 | TimMc | wow |
| 11:49 | TimMc | common interface? |
| 11:50 | clgv | TimMc: yeah the java management stuff has operating system dependent implementations and they forgot to add " getProcessCpuTime" to the interface of the bean |
| 12:17 | maio | when I have BufferedImage can I use spit to save it into file? |
| 12:20 | hiredman | maio: no |
| 12:24 | TimMc | maio: spit is for writing strings |
| 12:30 | TimMc | maio: BufferedImage is raw raster data; image files are binary compression formats. |
| 12:30 | TimMc | s/are/use/ |
| 12:32 | maio | ok thanks. I managed to use javax.imageio.ImageIO class to save it |
| 12:35 | clj_newb | how do I, from clojure, inehrit from the Exception class? I want to throw exceptions that contain more than just a String |
| 12:36 | TimMc | clj_newb: Use the slingshot lib |
| 12:36 | clj_newb | Is there no other way? |
| 12:36 | clj_newb | I prefer to use things I understand |
| 12:36 | clj_newb | rather than pile library upon library |
| 12:36 | TimMc | You don't like abstractions? |
| 12:36 | clj_newb | I don't like black magic. |
| 12:36 | TimMc | There's not much magic behind slingshot. |
| 12:38 | TimMc | You'll basically be reimplementing slingshot if you extend Exception to carry a payload, without the benefit of slingshot's existing features. |
| 12:38 | clj_newb | hmm, ExceptionInfo.java does the one part you can't do in clojure land? |
| 12:38 | clj_newb | this library looks readble |
| 12:38 | clj_newb | I will use it. |
| 12:39 | clj_newb | TimMc: thanks for pointing it out |
| 12:40 | TimMc | You may actually look into contributing to slingshot -- it's still a bit barebones in some ways. |
| 12:40 | TimMc | (Not sure who maintains it, though.) |
| 12:42 | clj_newb | in theory, can slingshot be implemented without a *.java file through the use of gen-class ? |
| 12:44 | clj_newb | is there a way to check if a java objects supports a .foo() ? |
| 12:48 | TimMc | clj_newb: Sure, use the java.lang.reflect API. |
| 13:04 | aniero | technomancy: ohai! |
| 13:26 | technomancy | aniero: cljs is still pretty rough around the edges unfortunately =\ |
| 13:26 | technomancy | kind of a rough place to get started with clojure |
| 13:33 | aniero | technomancy: so it seems. was hoping to do a web app as a Real Actual Project, but the cljs side of things is really unclear |
| 13:33 | technomancy | aniero: clojurescript feels like clojure did when I started in 2008 |
| 13:33 | technomancy | though admittedly I haven't gotten a chance to try lein-cljsbuild yet |
| 13:34 | aniero | hmm, in on the ground floor then. i'm not sure how to design a lisp application at all, much less do the things i want to do in the browser |
| 13:34 | aniero | what i *dont* want to do is go back to jquery callback soup, that's where things like backbone's event bindings have really, really helped with managing complexity |
| 13:36 | aniero | i'll see if i can find anyone doing data binding / event handling type stuff with swing. seems that should be analagous |
| 13:45 | TimMc | mmm, soup |
| 13:46 | TimMc | I don't mind it too much. |
| 13:52 | Raynes | aniero: I like callback soup. Especially with a little salt. |
| 13:59 | TimMc | not sugar? |
| 14:00 | yazirian | salting is more cryptographically secure |
| 14:00 | amalloy | Raynes likes his soup like he likes his IRC conversations: spicy |
| 14:01 | yazirian | salted alphabet soup only spells words for the intended eater |
| 14:02 | emezeske | Does alphabet soup have parens? That's what I want in mine |
| 14:03 | yazirian | add some elbow macaroni |
| 14:03 | ibdknox | puns - the lowest form of high humor :p |
| 14:04 | emezeske | yazirian: :) |
| 14:06 | technomancy | so my understanding was that hygenic macros are simply about avoiding accidental variable capture... but if that were true then the idea of hygenic macros in Clojure would be silly, because accidental variable capture is not an actual problem people have. |
| 14:06 | technomancy | so... what am I missing? |
| 14:06 | arohner | technomancy: accidental variable capture is not an issue because of ~ and # |
| 14:06 | arohner | technomancy: i.e. you're not seeing the pain because rich already solved it |
| 14:06 | jweiss | seems like atoms/refs don't help when the data in contention is in a remote service. just need a plain lock on my end to represent it? |
| 14:07 | technomancy | arohner: that's what I thought |
| 14:07 | technomancy | but this Byrd interview makes it seem like Clojure needs hygenic macros, and people seem to be nodding and agreeing |
| 14:07 | technomancy | makes it seem like he thinks Clojure needs them, rather |
| 14:08 | arohner | technomancy: in scheme and CL, symbols in macros don't default to resolving to vars, so the problem is significantly worse |
| 14:08 | arohner | link? |
| 14:08 | technomancy | http://clojure.com/blog/2012/02/16/take5-william-byrd.html |
| 14:08 | technomancy | emezeske: happens all the time in elisp =( |
| 14:08 | emezeske | technomancy: yuck! |
| 14:09 | arohner | technomancy: AFAIK, there's exactly one implementation of hygienic macros in scheme, and nobody understands it, they just keep copying it around |
| 14:10 | technomancy | one of the boston clojure groups had this epic scheme troll presenting for an agonizing 40 minutes on his port of syntax-rules to Clojure and how awful Clojure is, but at least it's kind of like Scheme. |
| 14:10 | TimMc | technomancy: Haha, was that Alec? |
| 14:11 | tmciver | Ha! I liked that guy! He was entertaining. |
| 14:11 | technomancy | TimMc: the akamai guy; i forget his name |
| 14:11 | tmciver | He's they guy who wanted to fight anyone who didn't agree with him. |
| 14:11 | TimMc | Friend of mine. I think that no matter what language meetup you invited him to, he would bitch about the language in great detail and at great length. |
| 14:12 | amalloy | isn't rplevy at akamai? i don't think he ported syntax-rules, though |
| 14:12 | jweiss | i'm glad other people don't understand syntax-rules either, makes me feel better |
| 14:12 | TimMc | amalloy: I don't think he's at Akamai any more? Maybe he is. |
| 14:12 | tmciver | No, he's not. |
| 14:13 | Raynes | "Not quite, because Clojure's macro system appears to me to be a kludge, trying to patch up Common Lisp's defmacro without going all the way to real hygienic macros." |
| 14:13 | technomancy | would have been less agonizing if I had grabbed dinner before the meeting |
| 14:13 | redinger | You mean robert Levy? |
| 14:13 | Raynes | technomancy: ^ KILL IT WITH FIRE |
| 14:13 | TimMc | Last time I saw Alex he tried to convince me to rewrite all my stuff in Racket. |
| 14:13 | Raynes | redinger: Howdy. Don't often see you around these parts. |
| 14:13 | amalloy | technomancy: i think syntax-rules is supposed to be more declarative than defmacro (pattern-matching kinda stuff), and have a better understanding/control of the lexical environment than just manipulating symbols |
| 14:13 | redinger | Raynes: Oh, I'm always around... :) |
| 14:13 | TimMc | redinger: No, Robert isn't the one who gave the "talk". |
| 14:14 | humasect | CinC |
| 14:14 | TimMc | syntax-rules is deep, intuitive magic. |
| 14:14 | redinger | Now I'm curious who gave the talk after that description |
| 14:14 | TimMc | redinger: Alec Heller |
| 14:14 | redinger | Ah, okay |
| 14:14 | TimMc | curmudgeon extraordinaire |
| 14:15 | technomancy | "the zenspider of clojure" |
| 14:15 | TimMc | ? |
| 14:15 | TimMc | $google zenspider |
| 14:15 | lazybot | [zenspider.com by ryan davis] http://www.rubyholic.com/ |
| 14:15 | amalloy | babilen: i don't think what you want from split-at-subseq is possible in clojure. you can't be both immutable and lazy and get that behavior |
| 14:16 | Raynes | "Will Clojure become as popular as Ruby or Python? Probably not." |
| 14:16 | Raynes | Jesus. This interview is depressing. |
| 14:16 | Raynes | technomancy: This interview. Depressing. |
| 14:16 | Raynes | I liked Friedman better. He was mostly quiet and had a nice hat. :| |
| 14:17 | TimMc | amalloy: I think it is doable. Maybe we have different ideas of what is desired? |
| 14:17 | amalloy | he wants a lazy sequence of lazy partitions |
| 14:18 | amalloy | right? |
| 14:18 | TimMc | yep |
| 14:18 | TimMc | I think that can be done, with certain limitations. |
| 14:19 | amalloy | i don't think so. how can he produce even a single element of the second partition without knowing/forcing every element of the first? |
| 14:19 | TimMc | He can't. |
| 14:19 | TimMc | But the latest partition can always be lazy. |
| 14:20 | amalloy | no. suppose you got a reference to the latest, lazy partition, okay, and traversed ten elements of it |
| 14:20 | TimMc | Big limitation, still a high utility. |
| 14:20 | amalloy | now you stop, and ask for the next partition |
| 14:21 | TimMc | Yes, the latest becomes fully realized, and the next is lazy. |
| 14:21 | amalloy | hm, maybe it's possible. you finish forcing the previous partition at that point? that may work |
| 14:21 | TimMc | In fact, I think he almost has it. |
| 14:21 | amalloy | hm. but there's a cost associated with that - you can't handle infinite sequences anymore |
| 14:22 | TimMc | Well, you're not gonna have a finite partition after n infinite partition. |
| 14:22 | amalloy | because now in order to be able to give you partition N, the function has to keep a reference to the head of partition N-1 in order to doall it |
| 14:22 | amalloy | so what. it has to hold onto the head whether it's infinite or not, just in case it turns out to be finite |
| 14:24 | TimMc | amalloy: Did you see the implementation plan I gave babilen? |
| 14:24 | amalloy | i'm not sure. the conversation seems to be spread out over time and i probably missed it |
| 14:24 | Raynes | amalloy: Get your Ocarina. |
| 14:26 | TimMc | amalloy: 1) prefix? 2) a lazy-seq fn to replace subsequences with a sentinal object 3) a fn to lazily partition at sentinals |
| 14:27 | TimMc | This makes sense in my head, although 3) is the fuzziest. |
| 14:30 | amalloy | i dunno. i think you're using step (2) to transform the problem into a different space where it seems less hard but is in fact equally hard |
| 14:31 | amalloy | but i'm not so confident of that, i suppose. we'll see what babilen turns up with |
| 14:31 | bartek1 | hello |
| 14:32 | bartek1 | how easily get submap of map with specified keys? |
| 14:32 | ibdknox | Raynes: I think it's a fair statement. I doubt Clojure will be of Ruby or Python level usage |
| 14:32 | bartek1 | is there function? |
| 14:32 | technomancy | bartek1: try select-keys |
| 14:32 | Raynes | ibdknox: I didn't say it wasn't fair. I said it was depressing. |
| 14:32 | ibdknox | truth |
| 14:32 | Raynes | ibdknox: Those statements are the kind of statements that make everyone wonder "Well, why am I even bothering then?" |
| 14:32 | bartek1 | perfect, thank you :) |
| 14:33 | technomancy | Raynes: so you can have an unfair advantage |
| 14:33 | Raynes | In the worst case, it could spark a bunch of mailing list threads quoting him and asking that question. |
| 14:33 | ibdknox | I'm with technomancy on this one |
| 14:33 | technomancy | Let's all run off and implement viaweb. =) |
| 14:33 | ibdknox | :D |
| 14:35 | jweiss | i'm in that spot now, competing against python (and winning) but have to convince people that i'm winning. not that easy, yet. |
| 14:35 | jweiss | when the python project fails to catch up as they promised, then i'll have an easier time |
| 14:52 | jweiss | i have a multithreaded clojure client for a remote service. i have a fn that checks for existence of a remote entity, and if not there, creates it. Obviously not thread safe, the remote service gets unhappy because two of my threads ttry to create at the same time. i could use (locking ... ) but what do i lock? the important value here is a string, which may be the same string but not the same object. converting to keyword might |
| 14:52 | jweiss | force them to be the same object. is that reliable? |
| 14:54 | hiredman | jweiss: I generally lock the functions var |
| 14:55 | jweiss | hiredman: ok, that would be a little too zealous. I'm creating a remote X within a remote Y. I just need to lock the Y. |
| 14:55 | raek | jweiss: perhaps you could lock the result of (.intern the-string) if you only want threads to wait for each other if their strings are equal |
| 14:55 | jweiss | raek: yep that's what i want. i'll look into that. thanks |
| 14:57 | jweiss | ,(identical? (.intern "asdf") (.intern (apply str (reverse "fdsa")))) |
| 14:57 | puredanger | generally locking on interned strings is considered bad form in Java (because you collide with anyone else that locks on the same obj) |
| 14:57 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 14:57 | jweiss | bah |
| 14:58 | jweiss | puredanger: what would you recommend instead? |
| 14:58 | puredanger | why not defonce an object to lock against? |
| 14:59 | puredanger | or create an explicit ReentrantLock instance and .lock/.unlock it |
| 14:59 | jweiss | puredanger: hadn't used defonce before, that looks like it would work |
| 15:00 | jweiss | although i sort of have the same problem, i want threads with equal values of a certain string to use the same lock |
| 15:02 | puredanger | jweiss: so you're effectively lock-striping? |
| 15:02 | jweiss | puredanger: i'm not sure what that is :) |
| 15:02 | jweiss | i want to lock an object that's really in a remote service |
| 15:02 | puredanger | jweiss: you could also leverage refs for this w/ensure I think and be more-clojure-y |
| 15:02 | jweiss | just by the name of it |
| 15:03 | puredanger | jweiss: so you really want a map with string keys and a lock object as val |
| 15:03 | jweiss | puredanger: that sounds right |
| 15:03 | puredanger | jweiss: but you have the issue of not wanting to race on creating the object |
| 15:04 | puredanger | jweiss: you could use ConcurrentHashMap.putIfAbsent for that |
| 15:04 | jweiss | wow did not expect this to be so complex |
| 15:05 | jweiss | aren't keywords always the same object? |
| 15:05 | jweiss | thought of (locking (keyword myparent-obj) ... ) |
| 15:06 | puredanger | jweiss: this is actually a common (and commonly done wrong) problem when using explicit locks :) |
| 15:06 | puredanger | keywords are identical (based internally on string interning) |
| 15:06 | jweiss | yeah, none of clojure's concurrency tools really help here, i can't have it retrying, i'll still end up making the remote service unhappy |
| 15:09 | puredanger | jweiss: if I was in Java, I'd probably use CHM and putIfAbsent - you have be careful to understand it's return value though and use it correctly |
| 15:12 | jweiss | puredanger: ok, thanks |
| 15:23 | TimMc | amalloy: I implemented (1) and (2) really quickly, but I'm actually kind of stuck on (3). |
| 15:23 | TimMc | amalloy: (1) and (2): https://refheap.com/paste/769 |
| 15:23 | amalloy | ah, you're giving me a perfect opportunity to use the wit i swallowed last time: that's because (3) is the impossible part |
| 15:24 | TimMc | grrr |
| 15:25 | TimMc | I think it can be done with clever use of sentinals. |
| 15:26 | TimMc | some kind of 2-phase lazy-seq |
| 15:30 | Raynes | TimMc: Hahahaha. I was wondering what you had to do in order to justify signing into a browserid powered site, so I checked the email you signed up with. Nice work. |
| 15:30 | TimMc | I don't remember, what username did I use? |
| 15:30 | Raynes | track-browserid |
| 15:31 | Raynes | Well, your username is timmc. |
| 15:31 | TimMc | Oh, yeah -- that's standard. |
| 15:31 | Raynes | I do that too though. |
| 15:31 | TimMc | I have a set of prefixes I use for signing up for commercial and other services. |
| 15:31 | Raynes | I use a random email on sites I'm not comfortable with. |
| 15:32 | TimMc | Having a catchall turns outto be a slightly bad idea, but if you restrict yourself to a pattern-matchable subset of addresses, you're golden. |
| 15:38 | wei_ | is there a take-while with state? for example, I want to take flip a coin until I see both heads and tails |
| 15:39 | wei_ | (take-until-heads-and-tails '(1 1 0 1 1 1 1 1 1 0 0 1 0 1 0)) -> (1 1 0) |
| 15:39 | Raynes | amalloy: ^ Isn't there a 4clojure problem devoted to this |
| 15:40 | TimMc | wei_: You could do something with map vec s (drop 1 s) |
| 15:40 | TimMc | or something like that |
| 15:40 | amalloy | i think there is, yeah |
| 15:40 | amalloy | $google 4clojure global take-while |
| 15:40 | lazybot | [114. Global take-while - 4Clojure] http://www.4clojure.com/problem/114 |
| 15:40 | Raynes | amalloy: Go steal a solution from the db and give it to wei. |
| 15:40 | wei_ | haha |
| 15:40 | wei_ | thanks :) |
| 15:40 | tmciver | (first (partition-by identity s)) |
| 15:41 | tmciver | nope, that doesn't do it. |
| 15:42 | Raynes | You get a little trophy for trying. |
| 15:42 | tmciver | Thanks Raynes, that means a lot to me. |
| 15:43 | TimMc | wei_: Oh wait, you want context potentially all the way back to the head of the seq? |
| 15:44 | wei_ | yes, if I were to solve this imperatively, I would keep a list of unique values i've seen, that way I don't need to remember the entire seq |
| 15:44 | tmciver | (let [ [f s] (partition-by identity s)] (concat f s)) ;; ugly |
| 15:55 | TimMc | loop recur :-) |
| 16:01 | TimMc | amalloy: https://refheap.com/paste/769 seems to work, haven't checked laziness yet |
| 16:04 | Raynes | What the... |
| 16:04 | Raynes | recur isn't detected as a builtin… Man, what was Georg even thinking when he wrote that lexer. |
| 16:12 | TimMc | amalloy: Just checked, it is lazy in the latest partition (eager by one element.) |
| 16:22 | technomancy | anyone want a Leiningen sticker? |
| 16:23 | redinger | technomancy: Is there a catch to get it? :) |
| 16:24 | technomancy | you have to have a patch submission accepted |
| 16:24 | technomancy | but I have a really easy one |
| 16:26 | beffbernard | Quick question.. defn.. overloading.. how do you call yourself? |
| 16:26 | redinger | I knew it! If I had the time today I would |
| 16:28 | raek | beffbernard: (defn f ([] (f 1)) ([x] ...)) |
| 16:28 | tmciver | beffbernard: you can provide multiple implementations of a function of differing arities. You can call out to a different implementation from one of those. |
| 16:29 | beffbernard | okie dokie |
| 16:29 | beffbernard | thanks |
| 16:30 | tmciver | beffbernard: http://clojure.org/special_forms#Special%20Forms--%28fn%20name?%20%28[params*%20]%20exprs*%29+%29 |
| 16:38 | TimMc | beffbernard: You can recur to the same arity, or recurse to a different one. |
| 16:47 | pcavs | What's the proper way to use a ref, if I'm trying to use it as a shared map of resources, like a resource pool? I'm thinking just (def my-resource-pool (ref {})) then in a dosync populate it, read from it, etc. But I'm wondering if that (def ..) creates multiple refs (looks like it will..) So what's the proper way to do this? |
| 16:48 | hiredman | pcavs: only if you load/run the code multiple times |
| 16:50 | pcavs | hiredman: ahh, but what if this is a web service? |
| 16:50 | hiredman | what about it? |
| 16:50 | pcavs | Like what's the proper way to do this in a noir app, or ring app, or w/e. |
| 16:51 | hiredman | oh, well don't use the code reloading features noir comes with |
| 16:51 | weavejester | Or perhaps use defonce |
| 16:51 | hiredman | (which should only be for developement anyway) |
| 16:51 | hiredman | ring won't reload code by itsself |
| 16:52 | ibdknox | pcavs: if you're in dev mode changes will cause it to reload. Simple solution is to defonce |
| 16:53 | ibdknox | hiredman: it's only in dev mode :) |
| 16:53 | hiredman | ibdknox: sure |
| 16:53 | pcavs | okay cool, in clojure do all top level definitions in a namespace get loaded/executed whenever that namespace is loaded? |
| 16:54 | pcavs | (I would assume so, but just getting my noob questions out of the way now) |
| 16:54 | weavejester | As far as I'm aware |
| 16:54 | weavejester | defonce is there to get around the issue of reloading |
| 16:54 | weavejester | Usually used to atoms or refs |
| 17:00 | zxcxzc1 | im getting an error when i use my function in the repl, but the error message doesnt tell me the line. i got the function into the repl via load-file. but it just says "(NO_SOURCE_FILE:30)" |
| 17:00 | zxcxzc1 | how i get the line number of the error? |
| 17:00 | brehaut | dont use load-file? |
| 17:01 | Somelauw | brehaut: nope |
| 17:02 | hiredman | actually load-file should give you a file name |
| 17:02 | zxcxzc1 | so i have to set up a namespace first and then use use? |
| 17:02 | hiredman | zxcxzc1: are you sure the exception is originating from code loaded via load-file? |
| 17:03 | hiredman | the class names in the stacktrace are also useful |
| 17:03 | zxcxzc1 | im calling a function i loaded via load-file |
| 17:03 | zxcxzc1 | "ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/eval53" |
| 17:04 | hiredman | the function are trying to call is actually a number |
| 17:04 | hiredman | just type in the name of the "function" without calling it |
| 17:05 | hiredman | the exception is coming from code you typed at the repl |
| 17:06 | zxcxzc1 | i ripped this bit out and tested it individually: "((fn [list n] (conj (drop-last list) (last list))) (1 2 3) 2)" (it's been a while since i programmed in clojure. i probably screwed it all but, i just wanted to get proper error messages for now. i mean at least line numbers ;)) |
| 17:06 | hiredman | (1 2 3) |
| 17:06 | hiredman | ,(1 2 3) |
| 17:06 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn> |
| 17:06 | zxcxzc1 | i had originalle defined the function in the repl. i dunno if load-file "overwrote" that old definition. i tried using "ns-undef" and then reloading the file to make sure... not that im sure |
| 17:07 | zxcxzc1 | oh man |
| 17:07 | zxcxzc1 | thanks... |
| 17:15 | TimMc | babilen: https://refheap.com/paste/769 (the last bit needs cleanup, though) |
| 17:18 | amalloy | TimMc: fwiw, stylistically i hate seeing (let [splitter (fn splitter ...)] (splitter ...)). it just seems simpler to write ((fn splitter ...) ...) |
| 17:19 | amalloy | but i see it done all the time, so i guess i'm in the vocal minority |
| 17:19 | TimMc | You're just bitter. |
| 17:20 | TimMc | Actually, it's a big enough fn that I don't want to do that. |
| 17:20 | TimMc | has it's own docs and everything |
| 17:20 | TimMc | *its, dammit |
| 17:20 | hiredman | amalloy: letfn!!! |
| 17:22 | mrevil | is for lazy? |
| 17:22 | TimMc | yup |
| 17:22 | mrevil | TY |
| 17:23 | TimMc | babilen: Oops, might not work perfectly yet... |
| 17:24 | amalloy | err...what point are you making, hiredman? replacing the let with a letfn has only slightly less repetition. and in TimMc's case, when there's an open let already, i'd prefer let to letfn |
| 17:24 | TimMc | mrevil: Check it for yourself: ##((constantly :no-op) (for [x (range)] x)) |
| 17:24 | lazybot | ⇒ :no-op |
| 17:25 | hiredman | amalloy: my point is a) letfn is great b) and thats it |
| 17:25 | amalloy | haha okay |
| 17:26 | TimMc | hiredman is loony for letfn |
| 17:26 | hiredman | I strongly prefer letfn to leting fns |
| 17:26 | tmciver | TimMc: how does your example prove that for is lazy? Isn't that just a demonstration of constantly? |
| 17:27 | technomancy | hiredman: I have a harder time scanning them |
| 17:27 | hiredman | technomancy: ok |
| 17:27 | technomancy | my eyes are immediately drawn to (defn, (fn, and #(), but letfn doesn't have a visual HAY GUISE FUNCTION HERE marker |
| 17:27 | hiredman | technomancy: hardly objective |
| 17:27 | technomancy | I like letfn in principle though |
| 17:28 | hiredman | letfn communicates intent |
| 17:28 | technomancy | I think as long as the function bodies aren't long it helps |
| 17:28 | hiredman | and if theory would make it easier for the compile to optimize easier then the general let case (but it doesn't) |
| 17:28 | technomancy | when you have a (my-thingy opening ten lines away from the top of the (letfn form it's worse |
| 17:29 | hiredman | :) |
| 17:29 | technomancy | freaking theory, amirite? |
| 17:29 | tmciver | TimMc: nvm, I think I see. |
| 17:30 | Borkdude | I have a Clojure project in Eclipse/CCW. I try to compile a .clj file that has a ns with :gen-class in it. But somehow Eclipse (Java) says: NoClassDefFoundError, wrong name: core/Hello |
| 17:30 | emezeske | hiredman: I did not know about letfn. I like that way better than let ... (fn [] ... |
| 17:30 | hiredman | I had (have?) I branch that takes tagged letfns and turns them into static methods, the idea being the compile should be apple to scan the code and do that for letfns tagged or not if the function isn't used as a value |
| 17:30 | Borkdude | the file hello.clj is in a package called core and the namespace is called core.hello, the name of the class is core.Hello |
| 17:30 | technomancy | ok, actually my complaint is that in nearly everywhere else in clojure, seeing (x ...) means that x is being called. |
| 17:31 | technomancy | I don't feel comfortable breaking that rule |
| 17:31 | hiredman | (defn … ([] ...)) |
| 17:31 | amalloy | (defn + ([x] x) ...) |
| 17:31 | hiredman | etc |
| 17:31 | technomancy | that's not a symbol in the first position though |
| 17:32 | Borkdude | am I missing something? |
| 17:32 | amalloy | so? ((juxt inc dec) 1) doesn't have a symbol in the first position and it is a call |
| 17:32 | hiredman | not having a symbol in the first position is kind of the point of lisp-1 |
| 17:32 | technomancy | amalloy: (( functions as a very clear indicator that something higher-order is going on |
| 17:33 | technomancy | hiredman: the point is you don't have to have a symbol in the first position to be a call, which is different |
| 17:33 | amalloy | there's also the fairly-gross-imo requirement to use ( on symbols in ns. stuff like (ns foo (:import (javax.swing JFrame JPanel))) |
| 17:34 | technomancy | the whole ns macro is gross though |
| 17:34 | technomancy | it doesn't interfere with scanning issues because it's always in the same place |
| 17:35 | Borkdude | cemerick: do you have a clue what I'm doing wrong? |
| 17:38 | uvtc | Hi #clojure. Do the namespaces listed on the left-hand-side of http://clojure.github.com/clojure/index.html constitute the "standard library" that comes with Clojure OOTB? |
| 17:38 | amalloy | i think that's about right, uvtc |
| 17:39 | uvtc | (aside from clojure.core, which is available without needing to be `require`d) |
| 17:39 | uvtc | amalloy, Thanks. |
| 17:39 | Raynes | TimMc: So, I've decided to change the signup stuff to ask for your phone number, address, and date of birth as well. I'm considering asking for a social security number. How do you feel about these changes? |
| 17:39 | uvtc | Is there a way from the repl to get a listing of those namespaces? |
| 17:40 | hiredman | uvtc: you can get a list of loaded namespaces |
| 17:41 | newb_cl | Hi |
| 17:41 | uvtc | hiredman: that would be useful too. How would one do that? |
| 17:41 | hiredman | it's pretty intuitive |
| 17:42 | hiredman | try and see if you can figure it out |
| 17:43 | newb_cl | if I want to pass the result of a function call (lets say (defn a [n m] (prn "a")) (defn b [s]) (defn c [] (b (a "a" "b")),? |
| 17:43 | uvtc | hiredman, `(loaded-libs)` |
| 17:43 | hiredman | nope |
| 17:44 | uvtc | hiredman, My autocomplete suggests `loaded-namespaces`, but that fails for me. |
| 17:45 | uvtc | hiredman, (my repl autocomplete) |
| 17:45 | newb_cl | it says CCE string to ifn |
| 17:46 | bsteuber | is there any changelog for clojurescript? |
| 17:47 | uvtc | hiredman, nevermind --- I think the autocomplete learned that other prospective fn name from a past attempt at trying it. |
| 17:49 | dnolen | bsteuber: no, but there probably should be |
| 17:55 | ibdknox | dnolen: +1 for a change log |
| 17:56 | TimMc | Raynes: Come at me bro. |
| 17:56 | ibdknox | lol |
| 17:56 | ibdknox | the more invasive the signup process the better |
| 17:57 | TimMc | I've decided to back up all my data to refheap pastes. |
| 17:59 | amalloy | good news, TimMc, all your data is already associated with your refheap login |
| 18:01 | uvtc | I see that (in Clojure 1.3.0) src/clj/clojure/string.clj has a nice namespace doc string, but I'm not able to access it via the repl. I'm trying `(require 'clojure.string)` then `(doc clojure.string)`. |
| 18:02 | uvtc | I get: "ClassNotFoundException clojure.string java.net.URLClassLoader$1.run (URLClassLoader.java:217)" |
| 18:02 | uvtc | Is there a way to view that docstring from within the repl? |
| 18:05 | TimMc | Welp, I've achieved a 10-20x speedup in the query time for this demo. Time to go home! |
| 18:08 | uvtc | I suppose it's just easiest to look at the source. |
| 18:18 | uvtc | Is it standard convention for all the contrib module namespaces to be prefixed with "clojure." -- just like the ones that come standard with Clojure itself_? |
| 18:18 | uvtc | s/namespaces/namespace names/ |
| 18:19 | Raynes | Yes. |
| 18:19 | uvtc | Raynes, Great. Thanks. |
| 18:21 | TimMc | uvtc: Yes, and then they are referred to casually without that prefix. |
| 18:21 | TimMc | amalloy: Admit that it wasn't impossible! |
| 18:22 | uvtc | TimMc: Ah, thanks. |
| 18:22 | amalloy | TimMc: you still haven't *really* done it because at most one sub-partition can be lazy at a time |
| 18:22 | TimMc | pfff |
| 18:23 | TimMc | I agree on *that*. |
| 18:23 | amalloy | feel free to address hatemail to /dev/null |
| 18:23 | TimMc | amalloy@example.org |
| 18:26 | uvtc | Hm. Looking at the github pages for a number of contrib modules, their src dirs contain src/main/clojure/clojure . Why does "clojure" appear twice? I see this with algo.generic, algo.monads, core.cache, ... data.xml, etc. Why is that? |
| 18:26 | hiredman | it's a mavenism |
| 18:26 | hiredman | contrib and clojure are built with maven |
| 18:26 | hiredman | just about everything else uses lein |
| 18:27 | TimMc | uvtc: clojure.core isn't very idiomatic of clojure projects. :-) |
| 18:27 | TimMc | same with most of contrib |
| 18:27 | uvtc | hiredman: Ah, thanks. |
| 18:28 | uvtc | TimMc: ha. :) |
| 18:31 | ferd | I need to invoke a few external commands from Clojure. There's clojure.java.shell, contrib.shell and contrib.shell-out. What's the story here? |
| 18:31 | technomancy | ferd: the contrib ones are deprecated |
| 18:31 | ibdknox | ferd: clojure.java.shell |
| 18:31 | Raynes | ferd: clojure.java.shell is the good one. |
| 18:31 | Raynes | ferd: If it doesn't do everything you need, check out https://github.com/Raynes/conch |
| 18:31 | ferd | thanks! Hey Raynes, I saw your conch too |
| 18:31 | ferd | yes |
| 18:32 | ferd | I like it's power... but it lacks simpler syntax for when all I need is to get a String (or lines seq) |
| 18:32 | ferd | thanks! |
| 18:32 | Raynes | Right, those cases are what clojure.java.shell is designed for. If you just need the output as a string when the process has terminated. |
| 18:32 | Raynes | I wrote conch for the sole purpose of streaming output and input. |
| 18:33 | Raynes | I definitely support the use of clojure.java.shell if your needs are within its limitations. |
| 18:33 | Raynes | (And they usually are) |
| 18:33 | ferd | yep, that was my understanding |
| 18:34 | ferd | FYI: there's an example in http://clojure.org/libs that uses contrib.shell-out... would be nice to change it |
| 18:34 | technomancy | we should get a lazybot trigger to warn people about how clojure.org is always outdated. =( |
| 18:34 | ferd | a detail... but one of the top google search for "clojure shell out" landed me there |
| 18:34 | Raynes | technomancy: Hahaha, indeed. |
| 18:35 | technomancy | sad but true |
| 18:51 | brehaut | ferd: google sends you to what is popularly linked, not what is true |
| 18:53 | ferd | brehaut: ??? I know... but how can you tell that the example on clojure.org is not "true" ? |
| 18:53 | Raynes | You can ask us. |
| 18:53 | Raynes | :p |
| 18:54 | brehaut | clojure.org takes the identity and value model of clojure seriously. the documentation is a consistent and correct snapshot of clojure at a given point in time |
| 18:56 | AimHere | ,(clojure.java.shell/sh "pwd") |
| 18:56 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.java.shell> |
| 18:58 | Raynes | That wouldn't work anyways. |
| 18:59 | technomancy | brehaut: nice |
| 18:59 | technomancy | step 1: travel in time back to 2009. step 2: documentation is correct. |
| 18:59 | ibdknox | lol |
| 18:59 | AimHere | I'm not convinced the clojure documentation is even mutable |
| 18:59 | Raynes | &(range 1000) |
| 18:59 | lazybot | ⇒ (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 ... https://refheap.com/paste/771 |
| 19:00 | brehaut | AimHere: it doesnt need to be; clojure.org just needs to be a reference |
| 19:04 | wei_ | i want to get 5 different random sequences. but this gives me 5 identical random sequences |
| 19:04 | wei_ | (repeat 5 |
| 19:04 | wei_ | (let [flips (repeatedly #(rand-int 2))] |
| 19:04 | wei_ | (take 5 flips))) |
| 19:04 | wei_ | what gives? |
| 19:06 | emezeske | wei_: I think you might want 'repeatedly instead of 'repeat |
| 19:14 | wei_ | awesome! thanks. |
| 19:26 | TimMc | brehaut: They forgot to declare the clojure.org var :dynamic. |
| 19:27 | brehaut | lol |
| 19:28 | technomancy | oh snap! |
| 19:35 | jweiss | i find that in one of my leiningen projects, 'lein deps' spends an awfully long time deleting files recursively. like 45 seconds. find . | wc -l = 446 so it's not that many files even if it's trying to delete them all. |
| 19:36 | jweiss | 223 of those files are in .git :) |
| 19:37 | technomancy | jweiss: try :local-repo-classpath true |
| 19:37 | ibdknox | technomancy: I wonder if that's what's causing my thing too |
| 19:38 | jweiss | technomancy: but there's only like 45 files in lib/ |
| 19:38 | ibdknox | what does :local-repo-classpath do? |
| 19:38 | ibdknox | jweiss: are you on a mac? |
| 19:38 | jweiss | ibdknox: no, linux |
| 19:38 | ibdknox | hm |
| 19:38 | jweiss | and my other projects don't take a long time |
| 19:39 | jweiss | just this one |
| 19:39 | jweiss | wonder if it's because i'm using checkouts? |
| 19:39 | ibdknox | does it chew through your CPU? |
| 19:39 | jweiss | i can try unlinking |
| 19:39 | jweiss | ibdknox: no, seems to be io bound |
| 19:39 | ibdknox | k |
| 19:39 | ibdknox | different then :) |
| 19:39 | jweiss | well, not even that, it's just pretty much idle |
| 19:40 | jweiss | if i immediately rerun, it runs fast |
| 19:41 | jweiss | http://fpaste.org/3nJb/ <- thread dump of main |
| 19:41 | jweiss | seems to be gc'ing |
| 19:43 | jweiss | hm, there is an explicit call to gc. |
| 19:43 | jweiss | that don't seem right. esp since it's to help windows users :) |
| 19:43 | perezd | so, I am sure that this question gets asked constantly, how does one deploy a leinigen-based clojure project as a server-side ? |
| 19:43 | hiredman | that is weird |
| 19:43 | perezd | I wanted to use heroku, but they don't support persistent TCP |
| 19:43 | perezd | do I need an app server? |
| 19:43 | perezd | Tomcat? something |
| 19:43 | dgrnbrg | What is IHashEq used for in Clojure? |
| 19:43 | perezd | really uninformed person here |
| 19:43 | dgrnbrg | Is it used instead of hashCode()? |
| 19:44 | ibdknox | perezd: what are you currently using? |
| 19:44 | perezd | ibdknox: starting my first project |
| 19:44 | perezd | i have nothing yet |
| 19:44 | perezd | just leinigen project |
| 19:44 | perezd | and 1 failing test :) |
| 19:44 | hiredman | perezd: depends, I just use jetty-runner for little http apps |
| 19:44 | ibdknox | perezd: what kind of app are you trying to create? |
| 19:44 | perezd | basically a websocket server |
| 19:44 | perezd | using aleph |
| 19:45 | ibdknox | perezd: then you have everything you need :) |
| 19:45 | ibdknox | aleph runs a server (netty) |
| 19:45 | perezd | right, but I mean…how do I do this. |
| 19:45 | perezd | how do I deploy |
| 19:45 | perezd | I can't assume I just run lein run on a server |
| 19:45 | perezd | that sounds bad |
| 19:45 | perezd | do I make a war file? |
| 19:45 | perezd | lol |
| 19:45 | perezd | I don't know |
| 19:45 | perezd | I've never deployed JVM |
| 19:46 | perezd | learning! |
| 19:46 | ibdknox | perezd: lein run will work just fine |
| 19:46 | perezd | is that really a good idea? |
| 19:46 | ibdknox | lein trampoline run might be better |
| 19:46 | ibdknox | why not? |
| 19:46 | perezd | well for one, the tutorial advised against it |
| 19:46 | technomancy | yeah, if you use "lein trampoline run" and set LEIN_NO_DEV then the overhead of leiningen is basically just at process boot time |
| 19:46 | technomancy | oh crap, does it? |
| 19:46 | ibdknox | technomancy: :p |
| 19:46 | technomancy | perezd: that's probably from before lein trampoline was implemented |
| 19:46 | perezd | "may be tempting to deploy by just checking out your project and using "lein run" on production servers. However, unless you take steps to freeze all the dependencies before deploying, it could be easy to end up with unrepeatable deployments." |
| 19:47 | perezd | what does trampoline do? |
| 19:47 | technomancy | it causes there to be only a single JVM resident |
| 19:47 | ibdknox | perezd: webnoir.org, sqlkorma.com, readyforzero.com, and a host of other things I've written all just use that, so I think it's ok ;) |
| 19:47 | perezd | thats sounds important |
| 19:47 | perezd | okay good then :) |
| 19:47 | perezd | just making sure |
| 19:47 | perezd | I know things like Tomcat exist |
| 19:48 | emezeske | technomancy: Am I correct in believing that trampoline is going away in lein 2? |
| 19:48 | perezd | so I figured I should make sure I don't need that |
| 19:48 | technomancy | perezd: yeah, the issue of repeatability is important. I recommend fetching your deps during a CI run and deploying a tarball you can use with lein run |
| 19:48 | technomancy | emezeske: no, that's not true |
| 19:48 | technomancy | emezeske: originally I wasn't sure if it would make it into the preview release |
| 19:48 | perezd | okay, so lein run is okay if you've got a plan for freezing deps |
| 19:48 | emezeske | technomancy: Ah, okay, maybe that's what I was thinking |
| 19:48 | technomancy | but then while looking into how much work it would be I realized it was easy |
| 19:48 | amalloy | nobody could ever throw away a trampoline. they're so fun |
| 19:48 | emezeske | technomancy: I'm working on some REPL stuff for lein-cljsbuild, which currently has to be trampolined |
| 19:49 | emezeske | technomancy: Will it still need that in lein 2? |
| 19:49 | technomancy | emezeske: depends why you need the trampoline =) |
| 19:49 | technomancy | is it for access to *in*? |
| 19:49 | emezeske | technomancy: Yeah |
| 19:49 | perezd | one does not simply throw away a trampoline |
| 19:49 | technomancy | emezeske: might be able to make it work with an in-process subclassloader |
| 19:49 | emezeske | technomancy: Hmm, even in lein 1.x? |
| 19:49 | technomancy | emezeske: no, in 2 |
| 19:50 | hiredman | or build an uberjar on a ci server and just run it |
| 19:50 | emezeske | technomancy: One thing i was thinking: could there be some way for a plugin to say "always run this action in a trampoline"? |
| 19:50 | technomancy | hiredman: yup, also perfectly reasonable |
| 19:50 | perezd | okay, let me ask this: |
| 19:50 | technomancy | emezeske: yeah! you can do that in lein2 |
| 19:50 | technomancy | it's the best |
| 19:50 | perezd | are there any obvious DON'Ts I should watch out for |
| 19:50 | technomancy | you can partially apply aliases |
| 19:50 | hiredman | don't deploy from git |
| 19:50 | technomancy | don't check jar files into git |
| 19:51 | emezeske | technomancy: That's great. I just *know* people (including me) will just type "lein cljsbuild repl..." instead of "lein trampoline cljsbuild repl..." |
| 19:51 | technomancy | perezd: the leiningen wiki has a page on "Repeatability"; definitely worth a read IMHO |
| 19:51 | TimMc | ~repeatability |
| 19:51 | clojurebot | repeatability is crucial for builds, see https://github.com/technomancy/leiningen/wiki/Repeatability |
| 19:51 | TimMc | BAM |
| 19:51 | technomancy | aha; thanks =) |
| 19:51 | TimMc | technomancy: ^ you should bookmark that or something ;-) |
| 19:51 | perezd | excellent, i am gonna go through that |
| 19:51 | perezd | so another question |
| 19:51 | perezd | https://github.com/clojure-clutch/clutch |
| 19:51 | perezd | is this seen as the defacto CouchDB? |
| 19:52 | perezd | library |
| 19:54 | brehaut | perezd: yes, its very good |
| 19:54 | perezd | okay cool. I'm hoping to interact with couchdb, my fav db |
| 19:54 | brehaut | (and the view server is optional) |
| 19:54 | perezd | yeah, I figured |
| 19:54 | perezd | its a neat idea tho |
| 19:54 | perezd | javascript/spidermonkey is fast enough if you throw parallelism into the mix :) |
| 19:55 | brehaut | a neater idea: http://cemerick.com/2011/10/11/writing-couchdb-views-using-clojurescript/ |
| 19:55 | brehaut | clutch's view server isnt really about speed; its more about expressiveness |
| 19:55 | perezd | unfortunately, I care about speed there more :) |
| 19:55 | perezd | cemerick appears to be the guy I should stalk for clojure+couchdb |
| 20:00 | jweiss | finally found and bound slime-repl-previous-matching-input. feel like i just stopped hitting myself in the head with a hammer. |
| 20:01 | perezd | any recommended tutorials for swank/slime ? |
| 20:01 | jweiss | perezd: have you checked out the github swank-clojure page? |
| 20:01 | perezd | not yet |
| 20:02 | perezd | just getting started |
| 20:02 | brehaut | perezd: http://dev.clojure.org/display/doc/Getting+Started+with+Emacs |
| 20:02 | jweiss | helpful for getting it running, has some keyboard shortcuts listed there |
| 20:02 | perezd | nice |
| 20:02 | perezd | excellent, thank you |
| 20:02 | technomancy | don't trust anything but the readme for swank |
| 20:02 | technomancy | so much bad info out there |
| 20:03 | perezd | ok |
| 20:03 | perezd | good to know |
| 20:03 | technomancy | clojurebot: swank? |
| 20:03 | clojurebot | swank is try the readme. seriously. |
| 20:03 | technomancy | clojurebot: forget swank |is| try the readme. seriously. |
| 20:03 | clojurebot | I forgot that swank is try the readme. seriously. |
| 20:03 | technomancy | clojurebot: swank is trust the readme and the readme only. all others will lead you astray. |
| 20:03 | clojurebot | Ik begrijp |
| 20:04 | brehaut | im pretty sure the getting started with textmate page is wrong. it should be filled with mean spirited laughter |
| 20:04 | technomancy | yeah, does confluence support html5 yet? |
| 20:05 | brehaut | technomancy: http://i.imgur.com/2Kq6Y.jpg |
| 20:06 | technomancy | nice! |
| 20:06 | brehaut | via @romanandreg |
| 20:07 | chemp | how can clojure read my .class files in the current directory? it's not working by default |
| 20:08 | chemp | anyone? |
| 20:08 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack> |
| 20:09 | technomancy | chemp: that's possible but extremely awkward, you should get your dependencies from maven repositories |
| 20:10 | hiredman | technomancy: well, come on, it's not that hard |
| 20:10 | chemp | technomancy, uh I'm pretty new to java and clojure. I just want to be able to accesses classes I've written in java from closure |
| 20:10 | hiredman | actually, at all hard really |
| 20:10 | technomancy | yeah, but I don't feel like explaining it =\ |
| 20:10 | chemp | as easily as possible |
| 20:11 | technomancy | chemp: the normal approach is to use the lein javac task to compile your .java source into the classes/ dir |
| 20:11 | hiredman | chemp: a. figure out how to load your classes in java b. clojure is largely the same |
| 20:12 | chemp | hiredman, well, I know how to import classes |
| 20:12 | hiredman | importing is not what I meant |
| 20:12 | chemp | hiredman, do i just put my .class files in a dir classes/ ? |
| 20:12 | hiredman | anywhere on the classpath |
| 20:16 | chemp | hiredman, why doesn't clojure look for classes in my current directory, isn't that in the classpath? |
| 20:16 | hiredman | did you put it on the classpath? |
| 20:17 | chemp | isn't it there by default? |
| 20:17 | brehaut | no |
| 20:17 | chemp | then how does java find files? |
| 20:17 | hiredman | there is no default classpath |
| 20:17 | chemp | ok |
| 20:18 | chemp | so do i just do a CLASSPATH=. ; export CLASSPATH ? |
| 20:18 | hiredman | -cp |
| 20:18 | hiredman | anyway, google it, the internet has lots of people explaining the classpath |
| 20:20 | perezd | so, if I am doing a server-side aleph project with lein, do I still want to make the core.clj file with a -main ? |
| 20:27 | technomancy | perezd: yeah, I think so |
| 20:27 | perezd | k cool |
| 20:28 | perezd | so emacs is pretty cool |
| 20:28 | technomancy | it's true |
| 20:28 | brehaut | emacs may be cool, but nothing about it is pretty |
| 20:29 | perezd | using prelude with it makes it kinda pretty |
| 20:29 | perezd | https://github.com/bbatsov/emacs-prelude |
| 20:29 | technomancy | brehaut: I don't know what you're talking about; inconsolata is great. |
| 20:29 | TcepsAFK | I've found that color-theme helps ^_^ |
| 20:29 | brehaut | technomancy: the complete lack of negative space for frames annoys me greatly |
| 20:29 | brehaut | frames? windows? |
| 20:30 | brehaut | i think i mean windows |
| 20:30 | perezd | so just got this after a lien run: https://gist.github.com/d117399de5f8bef560f4 |
| 20:30 | perezd | this looks bad |
| 20:30 | technomancy | brehaut: do you have the fringe turned off? |
| 20:30 | brehaut | technomancy: at the moment i have whatever the defaults are for e24 and the starter kit |
| 20:30 | brehaut | technomancy: theres a small 1 character wide verticle gutter on either side of each window |
| 20:32 | brehaut | technomancy: experiementation indicates that i have the fringes on |
| 20:32 | technomancy | mine's like 5px |
| 20:32 | technomancy | not really a complete lack of negative space |
| 20:32 | perezd | any ideas on my gist exception? |
| 20:33 | brehaut | technomancy: well, mine gets full of line wrapping sigels (thanks again, django templates) |
| 20:33 | brehaut | technomancy: about 10px here |
| 20:34 | seancorfield | perezd: you're using old contrib with clojure 1.3 |
| 20:34 | seancorfield | what's in your project.clj? (gist?) |
| 20:34 | perezd | seancorfield: |
| 20:34 | perezd | https://gist.github.com/a8f0d54a18ae1cd4cbea |
| 20:35 | seancorfield | hmm, aleph 0.2.0 isn't compatible with clojure 1.3...? |
| 20:35 | perezd | hmm appears to not be... |
| 20:35 | perezd | upon inspection of its project.clj |
| 20:36 | xeqi | perezd: https://github.com/ztellman/aleph/issues/34 |
| 20:36 | xeqi | theres a bug report with the same error |
| 20:36 | perezd | nice |
| 20:36 | xeqi | but it links to a closed 1.3 compat issue |
| 20:36 | xeqi | so I would have thought it fixed |
| 20:36 | perezd | there is a branch for 1.3 |
| 20:36 | perezd | apparently |
| 20:36 | seancorfield | change the aleph version to 0.2.1-alpha2-SNAPSHOT and run lein deps |
| 20:37 | perezd | okay, I'll give that a go |
| 20:38 | seancorfield | that seems to bring in tools.logging and data.json which are new contrib |
| 20:39 | perezd | excellent, thanks! |
| 20:39 | perezd | I'll report back if it messes up |
| 20:39 | perezd | so far so good |
| 20:39 | seancorfield | i'm on a crusade to get everyone using 1.3 instead of 1.2 :) |
| 20:40 | perezd | i want to subscribe to your newsletter |
| 20:40 | seancorfield | lol |
| 20:40 | perezd | yay aleph works! |
| 20:40 | perezd | just got my ZOMG world |
| 20:42 | perezd | http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/ |
| 20:42 | perezd | someone should do this to clojure/aleph |
| 20:43 | perezd | can't say the results shock me |
| 20:47 | perezd | just ran the test on my laptop, 90.2 conns a second |
| 20:47 | perezd | avg time 6.8 ms |
| 20:47 | perezd | 5000 requests, 5000 replies, 55 seconds |
| 20:47 | perezd | pretty nice actually |
| 20:47 | perezd | got a few of these in the logs: java.lang.Exception: Cannot read from a drained channel. |
| 20:55 | TimMc | seancorfield: How do you feel about maintaining backwards compat with 1.2 (where trivial)? |
| 20:55 | TimMc | I sometimes feel like being a bastard and not even testing with 1.2. |
| 20:55 | technomancy | there's not gonna be an excuse when lein2 rolls around |
| 20:56 | TimMc | Nice. |
| 20:56 | technomancy | https://gist.github.com/1846759 |
| 20:56 | TimMc | Oh, you mean :profiles. |
| 20:57 | technomancy | yeah, that's dakrone's usage of multi-version testing in clj-http |
| 20:57 | technomancy | I heart it so. |
| 20:58 | TimMc | Nice prompt, dakrone. |
| 21:01 | perezd | ugh, I have this exact problem: https://gist.github.com/1450202 |
| 21:01 | perezd | anyone know whats up? |
| 21:12 | seancorfield | TimMc: all the libraries i work on work with Clojure 1.2 and 1.3 |
| 21:12 | seancorfield | sometimes that's hard tho'... |
| 21:21 | seancorfield | perezd: i've been looking thru the lamina / potemkin source for a t that's not declared but i don't see it... |
| 21:22 | seancorfield | you might need to clone aleph and / or lamina and run lein install to put a snapshot into your local maven repo... :) |
| 21:23 | TimMc | It's probably something sneaky, like a string being destructured. |
| 21:23 | seancorfield | oh that won't help, aleph is squarely clojure 1.2 in that repo |
| 21:24 | TimMc | Try macro-expanding lamina/enqueue |
| 21:25 | seancorfield | you could try the clj-1.3 branch i guess |
| 21:26 | TimMc | &[#_ #_ #_ 1 2 3 4 5] |
| 21:26 | lazybot | ⇒ [4 5] |
| 21:26 | TimMc | #_ nests! |
| 21:27 | brehaut | i wonder how many third party readers implement that behavior correctly |
| 21:27 | TimMc | I think it is the natural interpretation. |
| 21:28 | brehaut | TimMc: i'm pretty sure my syntax highlighters reader would stumble on that |
| 21:28 | brehaut | though in an actual reader it might not be a problem |
| 21:29 | brehaut | (i need to preserve a lot more crap) |
| 21:30 | seancorfield | ok, if you clone ztellman/aleph, then git checkout clj-1.3, then lein install, then go back to your other project and do lein deps again, it should run |
| 21:31 | seancorfield | perezd: i just got it running with your hello world core.clj that way |
| 21:31 | seancorfield | so the JAR on clojars.org is just out of date |
| 22:30 | brehaut | bah django's templates make a hash of dynamic and lexical scoping |
| 22:39 | georgek | hi, I'm pretty new to Java, can anyone explain why this javadoc http://javasourcecode.org/html/open-source/commons-net/commons-net-3.0.1/org/apache/commons/net/telnet/package-summary.html has more classes listed than this javadoc, http://commons.apache.org/net/api-3.0.1/index.html |
| 22:44 | xeqi | georgek: the javasourcecode.org includes non-public classes and test classes |
| 22:46 | georgek | ahh, perfect, thanks |