2012-04-14
| 00:58 | scottj | muhoo: where the highest rated comments are about smalltalk or yc vs kickstarter. |
| 01:05 | y3di | muhoo: he joined the ranks only few have reached before him |
| 02:30 | muhoo | scottj: the kickstart vs yc flamewar was annoying. the smalltalk stuff was at least on-topic. |
| 02:34 | muhoo | i have to say, the more i learn about and understand clojure, the more sourcecode i can actually read and understand, the more in awe i am of what frickin geniuses y'all are. |
| 02:35 | muhoo | rather than taking the magic out of it, the more i understand of it, the *more* magical it seems. |
| 03:05 | amalloy | jayunit100: you can't splicing-unquote outside of a syntax quote, because that would be a single form "expanding" into multiple forms, which breaks pretty much everything about the reader |
| 03:06 | amalloy | you can do it just fine inside of a syntax quote, because `(x ~@foo y) is still a single form - the syntax-quote is "taking responsibility" for the forms under it |
| 03:07 | wkmanire | Howdy folks. |
| 03:07 | wkmanire | Working with clojure from my linux box for a (nice) change. |
| 03:08 | wkmanire | technomancy: You have these instructions for instaling swank-clojure. "Add [lein-swank "1.4.4"] to the :plugins section of either project.clj or your user profile." |
| 03:08 | wkmanire | technomancy: what do you mean by user profile/ |
| 03:08 | wkmanire | ? |
| 03:12 | _ato | wkmanire: if you're using the Leingingen 2 preview version (which is where the profile stuff comes from) see the plugins section here https://github.com/technomancy/leiningen/wiki/Upgrading |
| 03:13 | _ato | if you're on Lein 1 just do: lein plugin install swank-clojure 1.4.2 |
| 03:15 | wkmanire | _ato: All done. |
| 03:15 | wkmanire | I just jacked into my first clojure lein projuct. |
| 03:15 | wkmanire | I know kung-fu. |
| 03:16 | _ato | wkmanire: congrats! :) |
| 03:17 | muhoo | wkmanire: fantastic! |
| 03:18 | amalloy | hey, you got it to work |
| 03:18 | muhoo | wkmanire: are you going to use a linux vm on your windows box for clojure stuff? |
| 03:18 | wkmanire | :) |
| 03:19 | wkmanire | muhoo: No, I'll just work with inferior lisp. |
| 03:19 | muhoo | that's how i do it |
| 03:19 | wkmanire | muhoo: My clojure installation on my windows box is for my 10 minutes here and there when I can't make myself stay on task for work. |
| 03:19 | wkmanire | 10~cough 30 minutes. |
| 03:19 | muhoo | i discovered the clj-stacktrace plugin, which is great in the shell, but looks like ass in comint-mode |
| 03:20 | muhoo | there has to be a way to turn off the damn colors, but i can't find that knob anywhere |
| 03:20 | wkmanire | I've never really used comint. |
| 03:20 | muhoo | inferior lisp, i think, uses comint-mode |
| 03:21 | muhoo | i have a clojure repl running on a machine out in the network, which i can connect to from connectbot on my phone |
| 03:21 | muhoo | ssh, really, and port forwarding to the repl |
| 03:24 | wkmanire | :D |
| 03:25 | wkmanire | muhoo: I'm trying to understand the work flow here. |
| 03:25 | muhoo | there are lots of options |
| 03:25 | wkmanire | muhoo: After I've spent a while hacking out some stuff in the REPL, is there a way I can export everything to a buffer? |
| 03:25 | muhoo | save it to a file |
| 03:26 | wkmanire | The whole REPL session? |
| 03:26 | muhoo | in your project |
| 03:26 | muhoo | no, jsut the code you want to keep |
| 03:26 | wkmanire | So I have to traverse my repl session and copy over what I want to keep. |
| 03:26 | muhoo | have a look at the structure of the skeleton file that "lein new" creates and you'll see it creates a core.clj file, for example |
| 03:27 | wkmanire | There it is. |
| 03:27 | muhoo | when i'm just playing around in the repl, i just save the buffer in emacs as my "notes" |
| 03:27 | muhoo | as like "playingaround.clj" |
| 03:27 | wkmanire | That sounds like a good idea. |
| 03:28 | wkmanire | It'd be nice if I could tell it to grab everything in namespace x and save it to file xyz.clf |
| 03:28 | muhoo | then, when i decide to write some actual code, i think about the structure of namespaces, etc, and put things in a more sensible place |
| 03:28 | wkmanire | clj* |
| 03:28 | wkmanire | I could see namespaces being used in the repl to organize your "thoughts" |
| 03:28 | muhoo | you could probably write some clojure to do that :-) |
| 03:29 | muhoo | it's worth reading up on namespaces and what they are, what they do. |
| 03:29 | wkmanire | I read what was written in chapter 1 of Cemerick's book on them. |
| 03:29 | amalloy | wkmanire: i generally write anything i might conceivably want to save (ie, everything) in an emacs buffer, and send it to the repl with C-M-x or whatever |
| 03:30 | wkmanire | hmm |
| 03:31 | amalloy | you can use *scratch* for that buffer if you don't want to "commit" to writing a real file :P |
| 03:31 | wkmanire | Good points. |
| 03:32 | muhoo | craig andera's talk at cljwest on namespaces was good too. |
| 03:32 | muhoo | idk if the video is up though. |
| 03:35 | muhoo | basically "require" means "load", "refer" means bring everything from another namespace into the current one, "use" means "require + refer", and he also explains what the (ns) macro does and why. |
| 03:35 | muhoo | might be readable from here: github.com/strangeloop/clojurewest2012-slides |
| 03:36 | wkmanire | muhoo: Thanks for the link. |
| 03:37 | wkmanire | whew, my to read favorites list is getting longer and longer. |
| 03:39 | muhoo | arrrgh, clj-stacktrace is included in lein 1.7.1, or is otherwise being brought in from somewhere else |
| 03:39 | muhoo | curse you, ted turner! |
| 03:40 | muhoo | yep, included in lein. search and destroy time |
| 03:41 | muhoo | hmm, no wait, it's not. odd. it's coming from somewhere, i'll find it |
| 03:42 | muhoo | hehe, it's hidden inside lein-cljsbuild |
| 03:43 | muhoo | and swank-clojure :-/ |
| 03:44 | wkmanire | uh oh. |
| 03:44 | wkmanire | Guess I shouldn't try to use read-line from the slime-repl. |
| 03:45 | muhoo | no, readline and emacs aren't good together |
| 03:46 | muhoo | cool, removed a bunch of lein plugins, and now i have my non-color hack of clj-stacktrace working. i win. |
| 03:47 | muhoo | wkmanire: i generally use this elisp to launch a repl: https://refheap.com/paste/2110 |
| 03:48 | wkmanire | I see. |
| 03:48 | muhoo | if you do M-x ielm, get an elisp repl, dump that code in there, then you can do "M-x lein-local" and start up clojure from that |
| 03:48 | muhoo | it's hacky but it works for me |
| 03:48 | wkmanire | Thats alright, I just popped open a terminal window and ran clojure code.clj... |
| 03:48 | wkmanire | it worked great |
| 03:48 | wkmanire | I read a line of text from stdin and crapped it back out. |
| 03:48 | muhoo | or just add that to your .emacs |
| 03:49 | muhoo | nice. |
| 03:49 | wkmanire | Now that I can talk to the keyboard and the hard drive I can start playing. |
| 03:50 | muhoo | yeah, there's always cut-and-pasting |
| 03:50 | muhoo | &"hello wkmanire" |
| 03:50 | lazybot | ⇒ "hello wkmanire" |
| 03:51 | wkmanire | &(let [x (read-line)] (print x)) |
| 03:51 | wkmanire | he he |
| 03:51 | wkmanire | thought that might get ignored. |
| 03:52 | lazybot | Execution Timed Out! |
| 03:52 | wkmanire | sweet |
| 03:52 | muhoo | haha |
| 03:54 | amalloy | &(binding [*in* (java.io.StringReader. "hello wkmanire\nmore text here\n")] (doall (repeatedly 2 read-line))) |
| 03:54 | lazybot | java.lang.SecurityException: You tripped the alarm! pop-thread-bindings is bad! |
| 03:54 | amalloy | ,(binding [*in* (java.io.StringReader. "hello wkmanire\nmore text here\n")] (doall (repeatedly 2 read-line))) ;; i hate you, lazybot |
| 03:54 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.io.StringReader cannot be cast to java.io.BufferedReader> |
| 03:54 | amalloy | and also i hate java, apparently |
| 03:57 | wkmanire | amalloy: excellent attempt all the same. |
| 04:00 | muhoo | &(doto (Thread. #(println "woo hoo")) .start .join) |
| 04:00 | lazybot | ⇒ #<Thread Thread[Thread-7006,5,]> |
| 04:11 | andyfingerhut | Is this a game of abuse-the-lazybot? |
| 04:57 | laurus | What do I do in leiningen if I want to include a .jar file that is not available through Maven? |
| 05:00 | scottj | laurus: install it in your local maven repo ~/.m2 |
| 05:01 | muhoo | well, use lein local-repo plugin, even better |
| 05:01 | laurus | scottj, what do you mean "install it"? |
| 05:01 | muhoo | http://www.google.com/url?q=https://github.com/kumarshantanu/lein-localrepo&sa=U&ei=ejuJT-aVOsSdiQKwsrX2Cw&ved=0CBAQFjAA&usg=AFQjCNGP89lrjM3tY7LZZxFD9jRSUUMujw |
| 05:01 | muhoo | gawd DAMN google |
| 05:01 | muhoo | https://github.com/kumarshantanu/lein-localrepo |
| 05:01 | laurus | muhoo, ah, thanks. |
| 05:02 | muhoo | np |
| 05:02 | scottj | laurus: there's a long mvn command maven spits out occasionally in errors, muhoo's solution is probably better though |
| 05:02 | laurus | Oh, I am using lein 2. That's why I couldn't install it maybe? |
| 05:04 | laurus | Maybe I should use scottj's solution? |
| 05:04 | muhoo | lein2 might have it built in? |
| 05:04 | laurus | muhoo, when I type "lein plugin install ..." I get "That's not a task." |
| 05:05 | muhoo | ah, lein2 has different plugin install system |
| 05:05 | scottj | laurus: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html |
| 05:05 | laurus | scottj, I'll use that, thanks. |
| 05:05 | laurus | muhoo, I see. |
| 05:05 | muhoo | laurus: youadd it to ~/.lein/profiles.clj: |
| 05:06 | muhoo | {:user {:plugins [[lein-newnew "0.2.6"]]}} |
| 05:06 | muhoo | well local-repo, not newnew, but that's the basic thing |
| 05:06 | laurus | muhoo, ah, ok. |
| 05:06 | laurus | I'm sure I'm not the first person to say this, but all of this is quite complicated. |
| 05:07 | muhoo | so i guess add {:user {:plugins [[lein-localrepo "0.3"]]}} to ~/.lein/profiles.clj |
| 05:07 | muhoo | yeah, it's complicated, but i find it less so than maven or ant |
| 05:08 | laurus | muhoo, what do I do after creating that file and adding that line? |
| 05:08 | muhoo | i'm new myself 220 hours into learning clojure, just starting to get comfortable with it |
| 05:09 | scottj | laurus: btw, if you put the jar in your project.clj then lein deps will show you the maven error where it gives you the exact command to run |
| 05:09 | muhoo | lein2? i use lein 1.7.1 so i'm not sure if it behaves differently |
| 05:10 | muhoo | in 1.7.1, if you have added the plugin, you can do |
| 05:10 | muhoo | lein localrepo install <filename> <[groupId/]artifactId> <version> |
| 05:10 | muhoo | probably same for lein2 |
| 05:11 | muhoo | for example, i did |
| 05:11 | muhoo | lein localrepo install osc-0.7.1.jar local.repo/osc 0.7.1 |
| 05:11 | laurus | What is this group and artifact stuff? |
| 05:11 | muhoo | maven stuff |
| 05:12 | muhoo | it's like a fqdn |
| 05:12 | laurus | "java.io.FileNotFoundException: Could not locate leiningen/util/maven__init.class or leiningen/util/maven.clj on classpath." |
| 05:13 | muhoo | hmm, maybe lein localrepo doesn't work at all with lein2. |
| 05:13 | laurus | OK! I will do the "manual" way then. |
| 05:14 | muhoo | yeah, can't argue with that :-/ |
| 05:15 | scottj | laurus: I think you can give it whatever group and artifact you want, you'll just have to use that in your project.clj. (someone correct me if wrong here) |
| 05:15 | muhoo | oic, lein localrepo has been updated for lein2, in git: https://github.com/kumarshantanu/lein-localrepo/commit/4b69d19b41000f0495441c79eb33db1f53e29da1 but not in the released version yet |
| 05:16 | scottj | laurus: in project.clj it's [group/artifact "version"] you're probably familiar with that. just fill in the blanks on mvn command |
| 05:16 | laurus | OK, thanks! |
| 05:18 | laurus | What should I use for a groupId? |
| 05:18 | laurus | I mean, what is recommended? |
| 05:19 | scottj | something descriptive of jar, "laurus" or "org.lauruswebsite" if it's yours |
| 05:20 | scottj | descriptive or organization that made the jar that is |
| 05:20 | laurus | Ah, I see. |
| 05:20 | laurus | Thanks! |
| 05:20 | laurus | And by the way, what should I put for "packaging"? |
| 05:21 | scottj | jar |
| 05:21 | laurus | Thanks :) |
| 05:22 | laurus | By the way, how do I install Maven so that it will work with Java 7? I am on Debian GNU/Linux. |
| 05:24 | laurus | Is there a way to set which version of Java Maven uses, or is that somehow "built-in"? |
| 05:28 | helino | hi everyone, I'm trying to do some we development using ring, but when I run "lein ring server" using leiningen, I get a ClassCastException. How do I debug this? |
| 05:28 | scottj | helino: pastebin the entire error |
| 05:29 | _ato | laurus: set the JAVA_HOME environment variable |
| 05:29 | laurus | _ato, thanks. |
| 05:30 | helino | scottj: http://pastebin.com/qdk07Bcr |
| 05:31 | scottj | helino: lein --version? |
| 05:32 | helino | scottj: Leiningen 1.7.1 on Java 1.7.0_03 Java HotSpot(TM) Client VM |
| 05:33 | helino | scottj: here is the project.clj file: http://pastebin.com/xjbHxCSx |
| 05:35 | _ato | the :ring option needs to be a map I think. At least the example in the lein-ring readme is :ring {:handler hello-world.core/handler} |
| 05:36 | helino | _ato: yes, that was it! |
| 05:36 | helino | _ato and scottj, thanks for your help! |
| 05:38 | scottj | helino: get a better font :) |
| 05:38 | scottj | smallest terminus makes very hard to see diff between ( and { |
| 05:39 | laurus | Got the jar installed. Thanks scottj and muhoo! |
| 06:15 | laurus | By the way, does anyone here use clojure-py? |
| 06:15 | fliebel | laurus: I think it's a bit early to use it, but experiment, yes. |
| 06:16 | laurus | fliebel, to be honest I'm excited about it! |
| 06:16 | fliebel | I was tempted to rewrite a pice of Python software in it, but didn't. |
| 06:16 | laurus | Well why not? :) |
| 06:17 | fliebel | Because not even all the core functions are there yet, let alone the libraries. |
| 06:17 | laurus | Wow. I wish I could donate some money to that project or something. |
| 06:18 | samaaron | fliebel: hey there - how did you send me a mail via lazybot - that's cool |
| 06:18 | samaaron | is that automatic? |
| 06:18 | fliebel | laurus: If yu asked, them, they would probably let you buy them a coffee or bear, i guess, but I think it would be mroe helpfull to take a fn from https://github.com/halgari/clojure-py/blob/master/clojure/untranslated.clj and port it. |
| 06:19 | fliebel | samaaron: $mail username message ;) |
| 06:19 | samaaron | that's awesome |
| 06:20 | samaaron | so you do it without the $? |
| 06:20 | fliebel | ? |
| 06:20 | samaaron | $mail fliebel hello there - do you read me? |
| 06:20 | lazybot | Message saved. |
| 06:21 | samaaron | ah, got you |
| 06:21 | samaaron | you were able to use the full command because you prefixed your string with my username |
| 06:21 | samaaron | this is insanely cool |
| 06:21 | samaaron | lazybot: ftw! |
| 06:22 | fliebel | samaaron: I ended up using Python though, because I failed horribly at making RxTx work. |
| 06:22 | samaaron | fliebel: but to answer your message, I the RxTx thing only has serial libraries |
| 06:22 | samaaron | and it really is a horribly cobbled together mess |
| 06:22 | samaaron | i tried sooo many different compiled versions before i found one that worked |
| 06:22 | samaaron | and i couldn't compile the beta versions myself |
| 06:23 | samaaron | it was all a real nightmare |
| 06:23 | fliebel | samaaron: Does RxTx only have serial, or your version? |
| 06:23 | samaaron | so it only has serial natives |
| 06:23 | fliebel | samaaron: Have a look at PureJavaComm. same API, no natives... only serial :( |
| 06:24 | samaaron | oh nice |
| 06:24 | samaaron | i wonder how effecient it is |
| 06:24 | samaaron | i'm having issues with my monome library with message throughput |
| 06:24 | samaaron | i'm not sure where the issue is |
| 06:24 | samaaron | it will be useful to test out with other libs |
| 06:25 | fliebel | samaaron: Don't know. It's a JNA wrapper over Terminos, while RxTx uses it via C. |
| 06:25 | fliebel | samaaron: At which baud rate does the monome run? |
| 06:27 | samaaron | fliebel: to be honest, i'm not exactly sure |
| 06:27 | fliebel | I needed to get my DPScope to work at 500000 baud, which didn't work with any Java lib I tried. |
| 06:27 | samaaron | oh wow |
| 06:27 | samaaron | so what did you end up using? |
| 06:28 | fliebel | Python, as I just said to laurus. Tempting to go for clojure-py though... |
| 06:28 | samaaron | $mail TimMc I totally agree with you regarding Overtone docs. All it needs is someone to make it happen :-) |
| 06:28 | lazybot | Message saved. |
| 06:29 | samaaron | how annoying that the JVM can't do something python can |
| 06:29 | laurus | fliebel, I am a beginner at Clojure so I don't think I can contribute to that project though, yet. |
| 06:29 | fliebel | samaaron: Rather, that the Mac implementation of Terminos doesn't support it. PySerial uses some custom command on Mac to se the baud rate. |
| 06:31 | fliebel | laurus: Porting functions from untranslated.clj shouldn't be to hard, if you stay away from the ones involving concurrency. |
| 06:31 | samaaron | ah ok |
| 06:32 | laurus | fliebel, well I will take a look! Thanks for the encouragement. |
| 06:32 | fliebel | laurus: That is, if you know Python. Most of it is just javaisms that need to become pythonisms. |
| 06:33 | samaaron | fliebel: this purejavacomm project looks interesting |
| 06:35 | samaaron | fliebel: so i noticed you threw a commit at them - did you get things working? |
| 06:37 | fliebel | samaaron: I don't know... I copied what PySerial did, and it it is not completely broken, but it doesn;t work with the DPScope either. |
| 06:37 | samaaron | fair enough |
| 06:38 | samaaron | if i had any further issues with rxtx, my next plan was to wrap up the binaries shipped with Processing |
| 06:38 | samaaron | to be honest, it's super frustrating that there's no standard serial lib shipped with the JVM |
| 06:39 | fliebel | samaaron: https://github.com/nyholku/purejavacomm/issues/4 |
| 06:39 | fliebel | samaaron: It would be great if you had any serial device around to verify the change is broken or not. |
| 06:42 | samaaron | fliebel: do you have an example of using this lib? |
| 06:42 | samaaron | that i could just hack with and hook my monome up with? |
| 06:43 | samaaron | i'd love to say goodbye to rxtx |
| 06:44 | sandbags | guess it's old hate for you guys but i just saw the lighttable demo, pretty nice |
| 06:44 | fliebel | samaaron: The pull request has my example code: https://github.com/nyholku/purejavacomm/pull/5 |
| 06:44 | sandbags | as someone just getting in to learning clojure, that looks like it would be useful and fun |
| 06:44 | samaaron | fliebel: cool, thanks |
| 06:45 | samaaron | fliebel: btw, I only today realised that you're Pepijn |
| 06:45 | fliebel | samaaron: It's the same api, just a different namespace. |
| 06:45 | samaaron | i'm terrible with names :-) |
| 06:45 | fliebel | samaaron: Yea, for historical reasons, this is the only place on the internet my nick is fliebel. Tried to change it once, didn't work well. |
| 06:46 | samaaron | haha |
| 06:46 | samaaron | oh damn, this API is *nice* |
| 08:12 | samaaron | fliebel: how did you pull down purejavacomm via lein? |
| 08:13 | fliebel | samaaron: He has his own maven repo, it's on his homepage. |
| 08:13 | samaaron | I tried this to no avail: https://refheap.com/paste/2111 |
| 08:13 | fliebel | samaaron: Just this part: "http://www.sparetimelabs.com/maven2/" |
| 08:14 | samaaron | ah cool |
| 08:14 | samaaron | hmm, doesn't seem to work either |
| 08:15 | samaaron | i must be doing something wrong in my project.clj |
| 08:15 | samaaron | it now looks like this: https://refheap.com/paste/2113 |
| 10:16 | yoklov | wow, cljs.core.str is very slow. |
| 10:18 | yoklov | much slower than (.join (array …) "") |
| 10:19 | yoklov | at least, in chrome. |
| 10:24 | khaliG | I'm wondering how to use this http://clojuredocs.org/clojure_contrib/clojure.contrib.io/write-lines in 1.3? |
| 10:29 | yoklov | Hm, you could do (spit the-file (apply str (interleave my-seq (repeat "\n")) |
| 10:30 | yoklov | though that function is probably somewhere now. |
| 10:30 | TimMc | lazybot: Mail for me? |
| 10:30 | khaliG | i've got a hacky version of it but i'd rather use a standard one if it exists? :/ |
| 10:30 | yoklov | contrib is gone |
| 10:30 | khaliG | yoklov :( |
| 10:31 | yoklov | khaliG, i know its hard, but it's better this way |
| 10:33 | yoklov | yeah i don't think that function made the cut for clojure.java.io |
| 10:34 | khaliG | fair enough, i'm just going to append some "\n"s and then join them together for spit |
| 10:40 | yoklov | you could also do (cl-format the-file-writer "~{~A~%~}" the-seq) |
| 10:40 | llasram` | Oh yeah, as far as I can tell, all the functions which try to make lazy seqs work with automatically opening and closing files are gone |
| 10:40 | yoklov | after (use 'clojure.pprint) |
| 10:41 | llasram | This one doesn't look unreasonable, but read-lines was a file leak waiting to happen |
| 10:41 | yoklov | that's probably a good thing, sounds like you might run into issues if you dont wrap it in (doall) or something |
| 10:43 | yoklov | khalig, you could also bind *out* and (dorun (map prn …)) |
| 10:43 | yoklov | or println |
| 10:44 | khaliG | yoklov, cheers, thanks for the help :) |
| 10:44 | yoklov | gotta say, i've never had to use it but i'm glad that cl-format is available should i want to replace a loop with a small and unreadable format string |
| 10:45 | khaliG | yoklov, is that from CL? |
| 10:45 | yoklov | it is |
| 10:45 | khaliG | oooh |
| 10:57 | LauJensen | Do we have an fn like .replaceAll, but which takes a pattern instead of a concrete string? |
| 10:59 | llasram | LauJensen: ##(doc clojure.string/replace) |
| 10:59 | 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." |
| 11:00 | LauJensen | Exactly what I needed, thanks llasram |
| 11:01 | llasram | np :-) For future reference, you might find the `clojure.repl/find-doc` macro useful. Also, http://clojuredocs.org/ |
| 11:02 | LauJensen | Naah, #clojure is my find-doc, usually has better info :) |
| 11:04 | xeqi | theres also $findfn |
| 11:04 | xeqi | $findfn "asdfxx" #"x" "s" "asdfss" |
| 11:04 | lazybot | [clojure.string/replace] |
| 11:11 | llasram | I always forget about one |
| 11:15 | mdeboard | What exactly does clojure.java.io.resource do ? I'm looking at a code snippet here, and trying to reference the API |
| 11:15 | mdeboard | but the API isn't much help |
| 11:15 | mdeboard | snippet https://gist.github.com/cad792af9612ddcc060a |
| 11:15 | mdeboard | lines 14-16 |
| 11:16 | mdeboard | I'm only familiar with reader/writer from that module |
| 11:17 | yoklov | that gets the file at "testdata/mol-1000.txt" in the classpath |
| 11:17 | mdeboard | Oh I see, returns nil ? |
| 11:17 | yoklov | resource returns the url i think |
| 11:18 | mdeboard | hm |
| 11:18 | xeqi | it will return nil if it can't find it |
| 11:18 | mdeboard | I see |
| 11:18 | xeqi | are you using lein? |
| 11:18 | mdeboard | Oh, so even if I provide an absolute path it stil must be on project class path |
| 11:18 | mdeboard | ? |
| 11:18 | yoklov | probably not |
| 11:19 | yoklov | but you wouldn't use resource |
| 11:20 | mdeboard | xeqi: Yes, I'm using lein |
| 11:23 | xeqi | lein uses "resources" as the directory on the classpath by default |
| 11:26 | mdeboard | xeqi: I actually have no such directory, but I see it in the output of `lein classpath`. That snippet I linked is actually someone else's that I'm trying to adapt for my own purposes. Where should this text file sit ? |
| 11:28 | xeqi | test-resources/testdata/mol-1000.txt should work |
| 11:28 | xeqi | since it's test data |
| 11:30 | mdeboard | Well, here's what I'm actually trying to execute https://gist.github.com/45ffc442e4a5f018536b |
| 11:33 | xeqi | I'd recommend moving access.upstream.log.sample into your resources dir |
| 11:33 | xeqi | or just using clojure.java.io/file |
| 11:35 | mdeboard | Oh, I see, it seems that (resource) fetches the absolute path? |
| 11:36 | mdeboard | (moving to resources and calling `(as-file (resource "access.upstream.log.sample"))` returned `#<File /home/matt/matts-hadoop-interview-test/resources/access.upstream.log.sample>`) |
| 11:37 | xeqi | resource looks through the classpath for the file, and returns a URL to it |
| 11:37 | xeqi | its useful for loading non-source files from a jar |
| 11:38 | mdeboard | Gotcha, so could I have just used `(as-file "/absolute/path/to/file")` |
| 11:38 | xeqi | yeah |
| 11:38 | mdeboard | Gotcha |
| 11:38 | xeqi | resource is more useful for loading something like images from the classpath |
| 11:43 | gfredericks | what's that function that lets you combine predicates in an or fashion? |
| 11:44 | mdeboard | xeqi: Thanks for your help, I was stuck. |
| 11:44 | xeqi | or fashion? |
| 11:45 | Raynes | Morning sirs. |
| 11:45 | gfredericks | (def boolean? (or-pred true? false?)) |
| 11:45 | gfredericks | Raynes: I woke up this morning wondering why lazybot couldn't allow eval in a recursive fashion |
| 11:46 | Raynes | I was pondering the meaning of the life, but that's cool too. |
| 11:47 | Raynes | gfredericks: What do you mean? |
| 11:47 | wkmanire | Mornin' folks. |
| 11:48 | gfredericks | Raynes: I mean if you redef eval to defer to clojail, then I could enter ##(eval '(+ 3 4)) and it would recursively pass the (+ 3 4) back to the clojail-eval mechanism |
| 11:48 | lazybot | java.lang.SecurityException: You tripped the alarm! eval is bad! |
| 11:48 | xeqi | &((some-fn true? false?) false) |
| 11:48 | lazybot | ⇒ true |
| 11:48 | gfredericks | xeqi: dat it |
| 11:48 | gfredericks | thx |
| 11:50 | Raynes | gfredericks: That might be possible. |
| 11:50 | Raynes | gfredericks: Open an issue on clojail about it. |
| 11:50 | gfredericks | okay. |
| 11:51 | gfredericks | done. |
| 11:54 | gfredericks | I'm working on a macro that allows unquoting just to prove it can be done |
| 12:09 | yoklov | anybody know if cljs's (set! obj.prop val) is supposed to work? looking through the compiler it seems like it might just... happen to work |
| 12:12 | yoklov | happen to work in such a way that it wouldn't work after being closure compiled |
| 12:27 | Hali_303 | hi! I've just read that defrecords cannot act as functions like regular maps. why is that? isn't that problematic, since much code already uses the (map :akey) notation in code? |
| 12:28 | yoklov | i'm not sure that that's true |
| 12:28 | yoklov | hm, seems to be, actually |
| 12:28 | yoklov | well, you can do |
| 12:29 | yoklov | ,(do (defrecord Test [a]) (:a (Test. 4))) |
| 12:29 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 12:29 | yoklov | :( |
| 12:29 | yoklov | well, that returns 4. |
| 12:29 | yoklov | its not much help for you but it might ease porting. |
| 12:31 | gfredericks | this has been talked about before; I don't remember the reasoning |
| 12:31 | gfredericks | might just be to allow other impls of IFn |
| 12:31 | gfredericks | speaking of which you can probably implement it explicitly |
| 12:31 | Hali_303 | yoklov: yeah it works the other way around |
| 12:31 | yoklov | yeah |
| 12:31 | yoklov | oh |
| 12:32 | yoklov | you can do (defrecord Test [a] clojure.lang.IFn (invoke [this a] (get this a))) |
| 12:32 | yoklov | then ((Test. 4) :a) will work. |
| 12:32 | Hali_303 | whoa, nice :) |
| 12:32 | ibdknox | wow, dnolen wasn't kidding about doubling my karma |
| 12:33 | yoklov | thats probably not particularly clear because i used a as both a property of Test and the argument to invoke but… yeah. |
| 12:33 | Hali_303 | I'm curious what's the official take on this though |
| 12:33 | yoklov | Hali_303, I think gfredericks is right. |
| 12:33 | yoklov | its to allow other impls. of IFn |
| 12:34 | yoklov | and if you want the map-like behavior you should explicitly implement it (as above) |
| 12:39 | yoklov | ibdknox: you might know, does (set! foo.bar val) work in cljs due to the compiler just emitting exactly "foo.bar = val" or is it actually supposed to work? |
| 12:41 | wkmanire | Is it common for clojure code to be full of Java objects? |
| 12:41 | llasram | wkmanire: It depends on what you're doing. I'd say it isn't uncommon for it to be full of Java objects |
| 12:41 | wkmanire | Let's say I wanted to make a simple CRUD application (don't really wish that on anyone) |
| 12:42 | wkmanire | An address book that stores information in an SQLite database |
| 12:42 | wkmanire | and provides as simple GUI. |
| 12:42 | wkmanire | Would I be able to do that without newing up a java object? |
| 12:42 | wkmanire | directly that is. |
| 12:43 | ibdknox | yoklov: it works accidentally intentionally I think ;) |
| 12:43 | yoklov | wkmanire: you should use clojure/java.jdbc for the SQL, but the gui portions you will either end up using java objects directly or using a lib like seesaw |
| 12:43 | lucian | wkelly: if you choose the right libraries, probably |
| 12:43 | llasram | wkmanire: Probably not 100%, but mostly. There are nice Clojure bindings for e.g. JDBC SQL and Swing |
| 12:44 | yoklov | ibdknox: yeah, i thought so, darn. |
| 12:44 | mfex | yoklov, set! is used a lot in clojurescript itself |
| 12:44 | ibdknox | yoklov: it won't disappear |
| 12:44 | llasram | wkmanire: That said, unless you're writing code that you want/need to be portable across Clojure implementations, avoiding direct platform interaction for the sake of avoiding it is just shooting yourself in the food |
| 12:44 | ibdknox | there's no reason for it to |
| 12:45 | wkmanire | llasram: What a waste of nutrition. |
| 12:45 | llasram | ha! |
| 12:45 | llasram | s,food,foot, :-p |
| 12:45 | yoklov | ibdknox: it seems like it might be a thing that breaks after the code is closure compiled though |
| 12:45 | ibdknox | ? |
| 12:45 | yoklov | actually no, that doesn't make sense. |
| 12:45 | ibdknox | yeah, that'll be fine |
| 12:45 | mfex | yoklov, it doesn't break clojurescript itself when advanced compiling, so it's save |
| 12:46 | llasram | Clojure is designed for solid interop, and it works great. Obviously there are benefits to re-using cleaner abstractions when available, but being able to use rock-solid Java libraries is one of the big benefits of Clojure |
| 12:46 | yoklov | it doesn't work if the var is top-level, as opposed to a let. |
| 12:46 | yoklov | or at least, didnt' used to. |
| 12:46 | wkmanire | Well, one of the draws of clojure is its practicality so going out of my way to avoid using Java interop doesn't make sense. |
| 12:46 | wkmanire | But I have to admit, reading nice pretty clojure code and then all of sudden running across java.something.something.ANewOneOfThese. |
| 12:47 | wkmanire | Is like putting salt in your coffee. |
| 12:47 | yoklov | wkmanire: well, you can put (:import [java.something.something ANewOneOfThese]) and then just do (ANewOneOfThese.) |
| 12:48 | yoklov | * put in your ns form |
| 12:48 | wkmanire | That's be a lot better actually. |
| 12:48 | dnolen | ibdknox: pretty crazy 1200+ on HN and 1500+ on reddit. congrats! |
| 12:48 | dnolen | ibdknox: now what? :) |
| 12:48 | ibdknox | dnolen: that's a very good question |
| 12:49 | ibdknox | I applied to YC with a very different idea |
| 12:49 | ibdknox | I mostly did this thing on a whim |
| 12:49 | ibdknox | With the intent primarily of throwing some ideas out there |
| 12:49 | ibdknox | but judging by the response, this would be worth a lot of money to a lot of people |
| 12:49 | dnolen | ibdknox: I think so. |
| 12:50 | dnolen | ibdknox: also much better learning environment than this codeacademy codeschool crap |
| 12:50 | ibdknox | haha my first idea before the medical one was Kodowa |
| 12:50 | wkmanire | ibdknox: Talking about lightbox? |
| 12:50 | ibdknox | an environment to teach you how to code |
| 12:50 | ibdknox | wkmanire: Light Table |
| 12:50 | wkmanire | lighttable |
| 12:50 | wkmanire | sorry |
| 12:51 | wkmanire | ibdknox: Any plans for a part 2 of your video? |
| 12:51 | wkmanire | I'd really like to see more about that last view you presented. |
| 12:51 | ibdknox | I think if there were to be a part 2 it would be showing it working in JS |
| 12:51 | wkmanire | Actively showing how what you're hacking on affects the rest of your code. |
| 12:52 | mdeboard | I didn't realize that was ibdknox |
| 12:52 | mdeboard | I didn't even watch the video |
| 12:52 | ibdknox | dude |
| 12:52 | ibdknox | how could you not watch the video? :p |
| 12:52 | ibdknox | haha |
| 12:52 | wkmanire | Can't believe I said light box. That cheesy javascript image display that ended up on half of the internet for a few years. |
| 12:52 | mdeboard | I'm typical internet person |
| 12:53 | ibdknox | dnolen: biggest bang for the buck would be JS don't you think? |
| 12:53 | dnolen | ibdknox: yeah definitely should target JS. |
| 12:53 | ibdknox | I might kickstarter it just to see what happens |
| 12:54 | dnolen | ibdknox: there's lots of really fast JS parsers in JS now that generate JSON AST. Now's a good time to try it. |
| 12:54 | ibdknox | I looked at esprima, any other suggestions? |
| 12:54 | ibdknox | Esprima looked good |
| 12:54 | dnolen | ibdknox: esprima was the new hotness at JSConf |
| 12:54 | ibdknox | k |
| 12:55 | ibdknox | longer term I was thinking closed source until launch, then open maybe with a pay what you want model (assuming kickstarter can make it worth the time I'd have to put into it) |
| 12:56 | ibdknox | hopefully open source and money don't have to be mutually exclusive lol |
| 12:57 | wkmanire | ibdknox: If your IDE is well accepted and becomes a standard tool |
| 12:57 | wkmanire | it'll get stolen one way or another. |
| 12:57 | ibdknox | yeah |
| 12:58 | wkmanire | Microsoft manages to get around that by sueing their customers. |
| 12:58 | wkmanire | :D |
| 12:58 | ibdknox | lol |
| 12:59 | wkmanire | ibdknox: What about making it an HTML5 app? |
| 12:59 | ibdknox | it *is* one :) |
| 12:59 | wkmanire | So you can start a subscription service. |
| 12:59 | ibdknox | eh |
| 12:59 | wkmanire | and have levels of features. |
| 12:59 | ibdknox | you want to run it locally |
| 12:59 | ibdknox | real-time + internet = meh |
| 13:00 | ibdknox | real-time + 0latency = win |
| 13:00 | dnolen | ibdknox: I would at least try putting it on KickStarter. If you say you will open source it and it will target JS who knows what could happen? |
| 13:01 | ibdknox | dnolen: yeah, very ambiguous territory |
| 13:01 | wkmanire | ibdknox: :) Well one way or another I hope you make money off of it. |
| 13:01 | wkmanire | I want to see people make money for good ideas open-source or not. |
| 13:01 | wkmanire | I'm all for open source but programmers have to eat. |
| 13:03 | dnolen | ibdknox: one question is whether you actually want to write the whole thing in JS :) |
| 13:05 | devn | ibdknox: id drop a dime into a kickstarter for light table fwiw |
| 13:05 | mdeboard | Yeah, ditto. |
| 13:05 | mdeboard | A literal dime, but. |
| 13:06 | devn | ibdknox: as long as clojure/script is the first environment and js the second :) |
| 13:06 | ibdknox | dnolen: yeah, that's the question |
| 13:06 | yoklov | couldn't you write it in cljs and target js? |
| 13:06 | mdeboard | I'd like to get kenneth reitz, ibdknox and mitchell hashimoto together in a single company |
| 13:06 | dnolen | ibdknox: personally I'm not excited about writing big projects in JS anymore. |
| 13:06 | dnolen | ibdknox: I do not envy the Meteor guys at all. |
| 13:07 | ibdknox | dnolen: I never was ;) |
| 13:07 | dnolen | ibdknox: wise man |
| 13:07 | ibdknox | dnolen: I don't have to write it in JS really, just a JS parser service backend |
| 13:07 | ibdknox | the cool thing is that the interface will be scriptable in anything that compiles to JS :) |
| 13:07 | ibdknox | so clojurescript and JS get to work together mostly for free |
| 13:08 | dnolen | ibdknox: definitely - but that might probably limit the JS OSS interest. |
| 13:09 | dnolen | ibdknox: might not matter at all as long as people can extend via pure JS. |
| 13:09 | ibdknox | the architecture I was thinking of would extremely plugin oriented so you could just right your own thing to replace the ClojureScript one if you wanted all JS all the time |
| 13:10 | dnolen | ibdknox: ok that's pure win then. |
| 13:10 | ibdknox | wow that was full of fail. would be* write* |
| 13:10 | dnolen | ibdknox: that would be a real gift to JS and CLJ/S |
| 13:10 | ibdknox | dnolen: yeah |
| 13:10 | yoklov | if you did it in cljs it would boost interest in cljs |
| 13:10 | ibdknox | it would help everybody |
| 13:10 | ibdknox | yoklov: definitely |
| 13:11 | dnolen | ibdknox: so Noir on Node? ;) |
| 13:11 | ibdknox | haha |
| 13:11 | ibdknox | do you know if there's a packaging story for the node runtime yet? |
| 13:11 | ibdknox | that's the one thing I'm worried about |
| 13:13 | dnolen | ibdknox: not really. No one's owned the Node stuff, it could be really awesome I think. |
| 13:14 | ibdknox | dnolen: hm have to figure out a lot there then :/ |
| 13:14 | dnolen | ibdknox: what packaging issues do you forsee? |
| 13:17 | ibdknox | dnolen: nothing specific: just distributing the binary (for each platform) and such |
| 13:18 | ibdknox | just a use case that I don't think anyone's had yet and that makes it a little scary - it's always that last 20% that kills you |
| 13:18 | ibdknox | lol |
| 13:18 | Hali_303 | when in emacs REPL, how to make it forget all uses and requires? just as if I've restarted it |
| 13:22 | dnolen | ibdknox: well with CLJS you can avoid Node's module system for you own stuff. The only missing bit I think is a good Node REPL, which at most a couple of days of focused work. |
| 13:24 | ibdknox | so you don't think the distribution will be a problem then? I remember always having to build from source |
| 13:24 | dnolen | ibdknox: oh - but as far as shipping Light Table I'm not sure there's much else you would need beyond what CLJS provides. |
| 13:24 | dnolen | ibdknox: Node? |
| 13:24 | dnolen | ibdknox: binaries for all major platforms now. |
| 13:27 | ibdknox | ah, well then I'm not worried about that anymore |
| 13:50 | yoklov | well this might be/is an really noobish question but, i'm making a (totally static) cljs page and i'm getting a security error because i'm trying to load an image from elsewhere (e.g. in a local subfolder) and get it's imagedata. I know from experience that this is because i'm not serving anything and i'm just loading the html into my browser, so… what's the best way for me to serve a few static files locally? |
| 13:57 | dnolen | yoklov: probably ring or noir |
| 14:01 | ibdknox | yoklov: hm.. as long as it's relative to the current file, that should just work |
| 14:02 | yoklov | ibdknox: nope. I've had this issue before too |
| 14:02 | ibdknox | hm |
| 14:02 | clojurebot | excusez-moi |
| 14:02 | yoklov | it works if served but gives me "Unable to get image data from canvas because the canvas has been tainted by cross-origin data." and "SECURITY_ERR: DOM Exception 18" |
| 14:02 | yoklov | otherwise |
| 14:02 | ibdknox | bah, stupid browsers |
| 14:03 | yoklov | yup. |
| 14:03 | ibdknox | well lein noir new blahblah and drop it in resources/public/ and you're done |
| 14:04 | ibdknox | then just go to localhost:8080/myhtml.html |
| 14:09 | yoklov | i actually ended up just using a 6 line node.js script to serve the files, noir seemed like overkill |
| 14:10 | muhoo | is there any facility in either lein1 or lein2 to specify :repl-port as a per-USER configuration variable instead of per-project? |
| 14:10 | yoklov | still, thanks |
| 14:22 | ibdknox | well |
| 14:27 | ibdknox | I think light table is going to happen :) |
| 14:27 | ibdknox | with a vision far larger than even the ultimate IDE |
| 14:29 | crassus | ibdknox: that's awesome |
| 14:30 | eggsby | ibdknox: SMALLTALK DID IT FIRST! |
| 14:30 | eggsby | :p |
| 14:30 | ibdknox | man |
| 14:30 | ibdknox | that stuff kind of pissed me off |
| 14:30 | ibdknox | lol |
| 14:30 | ibdknox | They didn't do it. If they had, we'd all be using it ;) |
| 14:31 | ibdknox | I think people underestimate the value of execution when they see such things |
| 14:31 | ibdknox | of course, now I have to execute to prove that :) |
| 14:31 | eggsby | meh, if anyone can it's you, certainly have the track record for it |
| 14:36 | ferd | ibdknox: yes! you read my mind. Go for kickstarter! |
| 14:36 | muhoo | well, smalltalk did do a lot of it, but it was UGGLAY. |
| 14:37 | ibdknox | muhoo: the design of the thing is the thing (to me) |
| 14:37 | muhoo | every used squeak? it's like 80s retro night |
| 14:37 | ibdknox | haha |
| 14:38 | ibdknox | wow |
| 14:38 | ibdknox | a friend asked me in how many countries that post has been seen in |
| 14:38 | mdeboard | all |
| 14:38 | ibdknox | the answer is 156 |
| 14:38 | muhoo | most of technology goes in circles. people rediscover and reinvent stuff that existed generations ago. but with a new look, and a new flavor. |
| 14:39 | ibdknox | the only large-ish landmasses not accounted for are in central africa |
| 14:39 | muhoo | look, we are using a lisp, ffss! |
| 14:39 | ibdknox | lol |
| 14:39 | Bronsa | lol |
| 14:40 | muhoo | so, this is the right time for this. you're in for a wild ride. |
| 14:41 | ibdknox | indeed |
| 14:42 | ibdknox | it'll be interesting |
| 14:45 | ferd | so? where's the kickstarter link? The closest match for "light table" is a bed lamp |
| 14:45 | muhoo | compaare and contract lighttable with this: http://bace.s3.amazonaws.com/itwasdonefirst.jpg |
| 14:45 | muhoo | contrast, feh |
| 14:45 | ibdknox | I would argue that doesn't accomplish the same thing |
| 14:47 | fliebel | samaaron: Did you find a solution for the serial thing? |
| 14:47 | muhoo | it's a non-debate really, anyway, a hipster-ish kind of complaint "i was into it before it was cool!" |
| 14:48 | ibdknox | haha |
| 14:48 | ibdknox | very true |
| 14:48 | ibdknox | damn those smalltalk hipsters ;) |
| 14:49 | muhoo | good luck. success often finds people in places they least expect it. |
| 14:55 | ibdknox | https://twitter.com/#!/ibdknox/status/191236200768610305 :) |
| 14:57 | LauJensen | Fine, now kickstart it |
| 14:57 | rads | ibdknox. like. I will contribute when the kickstart is up |
| 14:58 | LauJensen | Did you guys catch the Pebble project on Kickstart? |
| 14:59 | ibdknox | yep |
| 15:03 | ferd | ibdknox: I guess you've seen Code Bubbles? http://www.andrewbragdon.com/codebubbles_site.asp just for ideas |
| 15:10 | autodidakto | ferd: ibdknox's voice is much better than the Code Bubbles guy. That's how I decide IDEs, anyway |
| 15:12 | ferd | autodidakto: #-) |
| 15:12 | gfredericks | what is a good name for a macro that is like quote but allows ~ and ~@? |
| 15:14 | xeqi | like syntax-quote? |
| 15:14 | gfredericks | but without the expansion and the foo# stuff |
| 15:15 | autodidakto | Don't be shy -> fred-quote |
| 15:15 | gfredericks | ha |
| 15:15 | gfredericks | quoot |
| 15:16 | xeqi | unhygienic-quote ? |
| 15:16 | ferd | soft-quote |
| 15:16 | gfredericks | dirty-quote |
| 15:16 | gfredericks | ferd: is there something by that name in scheme? |
| 15:16 | ferd | dunno |
| 15:16 | gfredericks | google time |
| 15:16 | gfredericks | man that's a worthless search term |
| 15:21 | ferd | regarding quoting: '() is to (quote) as ` is to ... ? |
| 15:21 | Bronsa | there is no macro equivalent |
| 15:21 | gfredericks | &(read-string "`()") |
| 15:21 | lazybot | ⇒ (clojure.core/list) |
| 15:22 | Bronsa | ` is hard-coded in the reader |
| 15:22 | xeqi | ferd: http://stackoverflow.com/questions/3704372/how-does-clojures-syntax-quote-work |
| 15:22 | gfredericks | but the unquoting feature can be extracted |
| 15:23 | ferd | thanks... hmm that's cheating ;-) |
| 15:27 | gfredericks | there's always qu00t |
| 15:28 | ferd | gfredericks: misquote |
| 15:28 | gfredericks | haha |
| 15:28 | ferd | gfredericks: or... scare-quote |
| 15:28 | gfredericks | o_O? |
| 15:28 | gfredericks | oh scarecrow |
| 15:29 | ferd | ahh, no... a scare quote |
| 15:29 | ferd | google for it |
| 15:30 | gfredericks | that is an odd thing to not know about |
| 15:30 | ferd | gfredericks: hey... and English not my native language |
| 15:30 | gfredericks | sometimes that can make you more attentive |
| 15:31 | ferd | gfredericks: it's not that I "think out of the box"... I AM outside of the box ;-) |
| 15:32 | gfredericks | heh |
| 15:32 | ferd | ok then, I vote for "misquote" |
| 15:33 | gfredericks | okeedoke |
| 15:33 | ferd | I like soft-quote, but is too formal |
| 15:33 | gfredericks | the other choice was ##(format "lib-%04d" (rand 10000)), which is what I normally name things |
| 15:33 | lazybot | java.util.IllegalFormatConversionException: d != java.lang.Double |
| 15:33 | gfredericks | wut |
| 15:33 | gfredericks | the other choice was ##(format "lib-%04n" (rand 10000)), which is what I normally name things |
| 15:33 | lazybot | java.util.IllegalFormatWidthException: 4 |
| 15:34 | gfredericks | I give up |
| 15:37 | mfex | gfredericks, look into gensym |
| 15:37 | gfredericks | the function? |
| 15:37 | mfex | yeah for the lib-%04d stuff |
| 15:37 | ferd | gfredericks: it's rand-int |
| 15:38 | gfredericks | ferd: oh duh |
| 15:38 | ferd | ##(format "lib-%04n" (rand-int 10000)) |
| 15:38 | lazybot | java.util.IllegalFormatWidthException: 4 |
| 15:38 | gfredericks | &(lib-%04d" (rand-int 10000)) |
| 15:38 | ferd | ##(format "lib-%04n" (rand-int 1000)) |
| 15:38 | lazybot | java.lang.RuntimeException: EOF while reading string |
| 15:38 | lazybot | java.util.IllegalFormatWidthException: 4 |
| 15:38 | ferd | hmm |
| 15:38 | gfredericks | &("lib-%04d" (rand-int 10000)) |
| 15:38 | lazybot | java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn |
| 15:38 | gfredericks | &(format "lib-%04d" (rand-int 10000)) |
| 15:38 | lazybot | ⇒ "lib-9833" |
| 15:38 | gfredericks | finally |
| 15:39 | mfex | &(gensym "lib-") |
| 15:39 | lazybot | ⇒ lib-7119 |
| 15:39 | mfex | &(str (gensym "lib-")) |
| 15:39 | lazybot | ⇒ "lib-7127" |
| 15:39 | gfredericks | that's not quite random though |
| 15:40 | mfex | it's unique |
| 15:40 | gfredericks | I'd hate for my lib names to be dependent on lazybot usage history |
| 15:41 | mfex | hmm, not sure what your use-case is :) |
| 15:41 | gfredericks | naming libraries |
| 15:41 | Null-A | wow light table is still on HN |
| 15:41 | Null-A | i've never seen something get 1300 points |
| 15:42 | Null-A | i wonder how many of those people are interested in clojure though |
| 15:53 | gfredericks | Okay, pushed up misquote: https://github.com/fredericksgary/misquote |
| 15:53 | gfredericks | now to find that guy who needed this yesterday |
| 15:56 | mdeboard | Are '-' characters invalid in namespace definitions? |
| 15:56 | mdeboard | e.g. (ns some-namespace) ? |
| 15:56 | gfredericks | no... |
| 15:56 | gfredericks | they'se used all the time |
| 15:56 | mdeboard | Yeah, I'm just confused about an error I'm getting. |
| 15:57 | gfredericks | are you forgetting where they get converted to underscores? |
| 15:58 | mdeboard | Forgetting would imply that at one time I knew |
| 15:58 | gfredericks | :) package names and filepaths |
| 15:58 | gfredericks | i.e., the things java touches |
| 15:58 | mdeboard | https://gist.github.com/2677328cfb1dc72c19ec |
| 15:58 | mdeboard | ah |
| 15:59 | gfredericks | hm; that's weird |
| 16:02 | mdeboard | I'm stumped as to why I can't run this uberjar. |
| 16:06 | mdeboard | Anyone have any insight into why I get the error message at the bottom here https://gist.github.com/12d2e610c321e1d51dce with the rest of the code above it? |
| 16:07 | ferd | gfredericks: I actually needed "misquote" not long ago for this macro: http://goo.gl/bvUHI . I ended up using '~ all over the place |
| 16:10 | gfredericks | ferd: clearly the world has been yearning for it |
| 16:12 | xeqi | mdeboard: try adding :impl-ns dat-doop.core to your :genclass |
| 16:14 | mdeboard | xeqi: No change. |
| 16:16 | mdeboard | It feels like every blog post about Clojure was written in 2010 |
| 16:16 | gfredericks | those are the ones that have been around long enough for google to know that they're good |
| 16:16 | LauJensen | mdeboard: Yea I know. I should really change that :) |
| 16:17 | mdeboard | gfredericks: Yeah, but there have been plenty of changes both to Clj and Lein since then |
| 16:17 | xeqi | gen-class is converting the ns to a package (- to _). I guess its then reconverting that to the ns to look for the methods |
| 16:17 | xeqi | *not reconverting |
| 16:20 | mdeboard | xeqi: So that sounds like if I remove the hyphen it should resolve the problem |
| 16:22 | gfredericks | jayunit100: I wrote you a macro for your quoting needs |
| 16:45 | sgarrett|afk | Hello #clojure. I'm kind of confused. I'm using bigint however when I try to call methods from the java class I'm getting an error. Does anyone know why this would be happening? I'm getting an error when doing the example code here: http://clojuredocs.org/clojure_core/clojure.core/bigint |
| 16:46 | gfredericks | sgarrett|afk: is it the clojure bigint class instead? |
| 16:46 | gfredericks | &(type (bigint 84)) |
| 16:46 | lazybot | ⇒ clojure.lang.BigInt |
| 16:47 | gfredericks | wait unless that's what you meant by "the java class" |
| 16:47 | gfredericks | my point is there's two bigint classes to be confused by |
| 16:48 | Bronsa | ,(.isProbablePrime (.toBigInteger (bigint 97)) 1) |
| 16:48 | clojurebot | true |
| 16:48 | gfredericks | (-> (BigInteger "83492948924398248289489243") .nextProbablePrime) |
| 16:48 | gfredericks | ,(-> (BigInteger "83492948924398248289489243") .nextProbablePrime) |
| 16:48 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Expecting var, but BigInteger is mapped to class java.math.BigInteger> |
| 16:48 | gfredericks | ,(-> (BigInteger. "83492948924398248289489243") .nextProbablePrime) |
| 16:48 | clojurebot | 83492948924398248289489297 |
| 16:48 | gfredericks | I love numbers |
| 16:48 | Bronsa | ,(.isProbablePrime (biginteger (bigint 97)) 1) |
| 16:48 | clojurebot | true |
| 16:48 | Bronsa | ,(.isProbablePrime (biginteger 97) 1) |
| 16:48 | clojurebot | true |
| 16:48 | Bronsa | derp |
| 16:51 | sgarrett | I see. Well I'm working with binary numbers is why I guess I'm running into the issue. I was declaring the numbers like 2r1111111111111111000000000000000000000000000000000000000000000000 and then I wanted to call toByteArray so that I could go through each bit. So I have to convert to biginteger? |
| 16:51 | sgarrett | Just want to make sure there isn't a better way I guess. |
| 17:34 | groovemonkey | quick question, because #leiningen is extremely quiet... |
| 17:34 | groovemonkey | I just added a /data directory to the root of my lein project. |
| 17:34 | groovemonkey | Now 'lein run' produces a FileNotFound Exception for the files |
| 17:34 | groovemonkey | that I've moved to the new directory. How do I add this |
| 17:34 | groovemonkey | directory to those that Leiningen knows about? |
| 17:39 | yoklov | i think it's something like :resources-path "data/" in project.clj |
| 17:39 | yoklov | or just rename the directory to resources/ |
| 17:43 | sgarrett | Is there a way to do a bit-and on a BigInt? |
| 17:44 | groovemonkey | yoklov: sorry, didn't see until now. Thanks, I'll try that. |
| 17:44 | yoklov | lol, don't worry about it. hope it works. |
| 17:54 | groovemonkey | didn't work :( -- I tried setting the :resources-path to "resources/" and "data/" respectively -- it seemed to get leiningen looking in the right place, but it still throws a FileNotFound Exception: could not locate <classfile> or <correct/path/to/file.clj> on classpath. |
| 17:55 | groovemonkey | is there a way to add things manually to the classpath? |
| 18:04 | jayunit100 | hmm is there a way i can look up all functions that have args related to a given type ? |
| 18:04 | jayunit100 | i.e. All clojure.core functions which operate on sequences . |
| 18:08 | amalloy | functions don't have types |
| 18:09 | jayunit100 | yeah thats the trouble. But it is true that some functions are type constrained. |
| 18:09 | Raynes | Yes, but not in a way that you can actively check for. |
| 18:09 | jayunit100 | (assoc '(1 2 3) 0 1) ---> fails (because lists aren't associative). |
| 18:10 | jayunit100 | ok.. oh well i guess i can use doc-find |
| 18:10 | amalloy | well, you can try http://www.clojureatlas.com/, or the clojure cheatsheet |
| 18:10 | jayunit100 | (find-doc) i mean. Yeah the atlas is a good resource. |
| 18:14 | octagon | whoa @clojureatlas |
| 18:14 | octagon | awesome |
| 18:17 | octagon | is there a doc that describes all of the clojure means of abstraction, with a rundown of where each one is and is not appropriate/useful? i'm trying to get the big picture view. |
| 18:18 | gfredericks | jayunit100: did you see my thing-I-said two hours ago? |
| 18:22 | gfredericks | octagon: some of the essays on clojure.org might be helpful? |
| 18:24 | octagon | gfredericks: yes, i was looking for the lazy way; i guess i need to compile my own notes from there, anyway |
| 18:26 | gfredericks | &(let [a (make-array Byte/TYPE 50)] (dotimes [n (count a)] (aset a n 5))) |
| 18:26 | lazybot | java.lang.IllegalArgumentException: No matching method found: aset |
| 18:26 | gfredericks | what on earth is going on there |
| 18:30 | amalloy | (instace? Byte/TYPE 5) |
| 18:30 | amalloy | &(instance? Byte/TYPE 5) |
| 18:30 | lazybot | ⇒ false |
| 18:30 | gfredericks | oh hm |
| 18:31 | gfredericks | that makes total sense in hindsight |
| 18:31 | amalloy | &(let [a (make-array Byte/TYPE 10)] (dotimes [n (count a)] (aset a n (byte 5))) (seq a)) |
| 18:31 | lazybot | ⇒ (5 5 5 5 5 5 5 5 5 5) |
| 18:31 | gfredericks | I will never know the exact conditions under which java numbers can be converted to other types. |
| 18:31 | muhoo | base 5, eh? |
| 18:32 | gfredericks | somehow I was convinced I was using dotimes wrong |
| 18:32 | gfredericks | that it was acting like doto for some perverse reason |
| 18:35 | amalloy | gfredericks: well, it's confounded by the fact that clojure has its own type-conversion rules |
| 18:35 | gfredericks | that does sound confounding |
| 18:37 | muhoo | don't java numbers have their own static Num/toFoo methods for converting to the things they're allowed to be converted to? |
| 18:41 | amalloy | so i learned something new about java today. for some values of Foo and bar, you can write (without causing an NPE): |
| 18:41 | amalloy | Foo x = null; |
| 18:41 | amalloy | x.bar(); |
| 18:58 | huangjs | hmm... there's lein-clojurescript and lein-cljsbuild, which one would you recommend? |
| 19:06 | muhoo | there's also cljs-template. and clojurescriptone. i'd love to know how all this stuff fits together (or doesn't). |
| 19:18 | mads- | Hi. Does anyone know where I can find clojure.jar if I have downloaded clojure through apt-get install clojure? |
| 19:19 | lynaghk | huangjs: you want lein-cljsbuild. |
| 19:20 | amalloy | mads-: start with apt-get uninstall clojure :P |
| 19:20 | amalloy | or remove, i guess? i don't uninstall stuff that often |
| 19:20 | mads- | amalloy: aaand theen? :) |
| 19:21 | amalloy | http://stackoverflow.com/questions/5983427/how-to-install-clojure-on-ubuntu-10-04-from-github-repo-with-no-clojure-jar |
| 19:21 | amalloy | see also the leiningen readme |
| 19:23 | mads- | thanks |
| 19:25 | muhoo | what's the advantage of using midje versus clojure built-in test machinery? |
| 19:29 | huangjs` | lynaghk: thanks |
| 19:34 | jayunit100 | ,(assoc (vector-of :char) 0 "s") |
| 19:34 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number> |
| 19:34 | jayunit100 | odd error message. |
| 19:35 | jayunit100 | Understandable... but i think it should simply report that "" is not a char. |
| 19:35 | gfredericks | that looks like the jvm's doing |
| 19:37 | jayunit100 | Well... so is everything :) |
| 19:38 | jayunit100 | But the difference here is that, in java, the statement ------ new Vector<Character>().add('c') ; ----- would not compile. |
| 19:38 | jayunit100 | I mean, new Vector<Character>().add("c") ; ..... |
| 19:39 | jayunit100 | So I think it should be a :pre assert ~ that the assoc value is the same type as the assoc enum. |
| 19:40 | dnolen | bbloom: heya, could you create a patch for the column modifications to the Clojure compiler? |
| 19:40 | bbloom | hey |
| 19:40 | bbloom | i'm working on both my patches right now |
| 19:40 | bbloom | the track-pos patch for the cljs compiler is a pain in the butt to maintain |
| 19:40 | bbloom | each time you change the compiler, i have a lot of work to redo :-P |
| 19:41 | dnolen | bbloom: yeah sorry about that. that's why I want to get it in now. |
| 19:41 | bbloom | yup |
| 19:41 | bbloom | shouldn't be long, but i may get interrupted |
| 19:41 | bbloom | you going to be around for a while? |
| 19:41 | dnolen | bbloom: probably not for too much longer this evening - but as soon as you have a new patch I will test and apply. |
| 19:42 | bbloom | ok great |
| 19:42 | bbloom | i'll probably finish the cljs change, but i don't know if i'll get to the clj reader one |
| 19:43 | sparkleshy | is there any better way to do C-like static locals than wrapping the defn in a let or using def inside the defn? |
| 19:43 | bbloom | dnolen: do you have good test cases for your recent optimizations? the variadics, the dynamics, etc? |
| 19:43 | dnolen | bbloom: sure, a clj reader patch would be nice so it passes Andy's prescreening script |
| 19:43 | bbloom | because i don't think my twitter test covers them & i'm merging those conflicts now |
| 19:43 | amalloy | sparkleshy: def inside defn is evil and also not anything like static locals |
| 19:44 | amalloy | i don't see how you could want something "better" than wrapping the defn with a let - that's about as good as it could possibly be |
| 19:44 | bbloom | dnolen: i can make a patch for the clj reader, but it's highly untested :-) if the concern is to meet the prescreener, that's no problem |
| 19:44 | bbloom | but if you want it to work… that's another story ;-) |
| 19:44 | bbloom | my patch did build and pass the tests when i made my github branch tho |
| 19:44 | dnolen | bbloom: no tests for the optimizations - my assumption was that all the current tests should just work :) |
| 19:44 | bbloom | i just didn't dig in to make sure it's solid & covers everything i need it to cover |
| 19:44 | jayunit100 | what are the limits on lazy-seq ? |
| 19:45 | jayunit100 | in terms of its inputs - |
| 19:45 | raek | sparkleshy: you want to maintain state between function calls? |
| 19:45 | sparkleshy | amalloy: I know, it's _so_ evil. |
| 19:45 | dnolen | bbloom: sure but having the patch is a good reference point. |
| 19:45 | bbloom | k |
| 19:45 | dnolen | bbloom: also people can easily apply and get to work on the source mapping stuff. |
| 19:45 | bbloom | k |
| 19:45 | raek | jayunit100: anything seqable is fine |
| 19:46 | jayunit100 | so what im wondering though is - how can it gaurantee laziness ? |
| 19:46 | dnolen | bbloom: by actually working on source mapping I think we can discover what's missing. |
| 19:46 | dnolen | bbloom: it was reassuring that you patch was good enough for Light Table ;) |
| 19:47 | raek | sparkleshy: using global state: (def state (atom 0)) (defn next-number [] (swap! state inc)) |
| 19:47 | jayunit100 | I mean, if I have function which returns a list ... And it precalculates all 10 vals in the list --- then its not really lazy, is it |
| 19:47 | bbloom | dnolen: I didn't realize that it was used for that |
| 19:47 | bbloom | awesome! :-) |
| 19:47 | sparkleshy | raek: Not between; more like (let [rand (java.util.Random.)] (defn gaussian (.nextGaussian rand))). Which is bad code but it's an example. |
| 19:47 | sparkleshy | raek: Er, put a [] after gaussian |
| 19:48 | raek | (def ^{:private true} rand (java.util.Random.)) is another way |
| 19:48 | jayunit100 | IS there a "loop-recur" aware lazy seq that invokes the loop, caching state between invocations ? That would be "true" laziness. |
| 19:49 | raek | jayunit100: you can easily translate a function that is implemented using loop, recur, and cons into one that is lazy |
| 19:49 | jayunit100 | i.e. something like the python "yield" idiom. |
| 19:49 | sparkleshy | raek: I know, I can do a def outside, but I wish I could keep my internal data inside because it feels cleaner and stuff. |
| 19:49 | raek | I think the let is fine in that case |
| 19:50 | bbloom | dnolen: http://dev.clojure.org/jira/browse/CLJ-960 |
| 19:50 | sparkleshy | raek: The real issue is that with code folding, the def is completely hidden by the let. |
| 19:50 | dnolen | bbloom: excellent thx |
| 19:50 | sparkleshy | raek: But the let is part of the implementation of the def, not the other way around |
| 19:50 | bbloom | ant succeeds, didn't check anything else |
| 19:51 | dnolen | bbloom: Andy's prescreener will catch problems. |
| 19:51 | raek | jayunit100: let's assume you have this: (loop [n 5, result []] (if (zero? n) result (recur (dec n) (conj result n))) |
| 19:51 | bbloom | cool |
| 19:51 | bbloom | back to untangling this compiler emit stuff :-) |
| 19:52 | dnolen | bbloom: thx very much. |
| 19:52 | jayunit100 | raek okay good start -> how to lazify it |
| 19:52 | jayunit100 | ? |
| 19:53 | jayunit100 | The problem of course is that loop/recur will recur all 5 times inside the function body , unless you wrap it in a macro or something . |
| 19:53 | raek | the lazy variant would then be: (letfn [(f [n] (lazy-seq (if (zero? n) nil (cons n (f (dec n))))))] 5) |
| 19:54 | raek | the difference is that each step gets wrapped in a lazy-seq |
| 19:54 | raek | and that the recursive call is not done using 'recur' |
| 19:54 | raek | and the result is not built up using an accumulator variable |
| 19:55 | sgarrett|afk | Is there a way to bit-and with a BigInt? |
| 19:55 | jayunit100 | hmm but this function would have to be manually iterated. |
| 19:56 | jayunit100 | Is there a way to make it more decoupled - so that it simply emits the next value , repeatedly. |
| 19:56 | raek | in a way, that's what f does here |
| 19:56 | jayunit100 | hm okay me analyze it some more and get back . |
| 19:57 | raek | you can think of lazy-seq as yield and seq as a call to a generator |
| 19:57 | raek | well, rougly |
| 19:58 | raek | here's a function defined in many equivalent ways: https://gist.github.com/951633 |
| 19:58 | sparkleshy | summary: is there any better way to do C-like static locals than wrapping the defn in a let or just doing another def outside? Not for keeping state between calls; more like (let [rand (java.util.Random.)] (defn gaussian [] (.nextGaussian rand))). Which is bad code but it's an example. Since the let is part of the implementation of the def, I want it inside, and I want only the def to appear when using code folding. |
| 19:59 | raek | sparkleshy: no. |
| 20:00 | gfredericks | sparkleshy: (def my-fun (let [rand ...] (fn [] (.nextGaussian rand)))) |
| 20:00 | gfredericks | if you can tolerate def instead of defn |
| 20:00 | sparkleshy | gfredericks: cool! but I want something better. Like (defn gaussian [] (.nextGaussian (cache (java.util.Random.)))) |
| 20:02 | gfredericks | sparkleshy: there are definitely some ugly-ass ways to do something like that |
| 20:02 | raek | it is definitely possible to write such a cache macro, though |
| 20:02 | gfredericks | raek: could even be a function |
| 20:02 | gfredericks | that just does a bunch of offensive global mutation |
| 20:03 | sparkleshy | but with a function wouldn't it create another Random each time through gaussian? |
| 20:03 | raek | in the current form, it looks like you only would like the argument to 'cache' to be evaluated once |
| 20:03 | gfredericks | sparkleshy: my guess is that at this point every possible way of giving you what you want would be quite unidiomatic |
| 20:04 | sparkleshy | gfredericks: So... this thing I want is inherently bad? |
| 20:04 | gfredericks | the main issue is code folding? i.e., you want the first line to summarize the thing? |
| 20:05 | raek | well, you could make (cache foo) expand into (cache* (fn [] foo)), where cache* is a function |
| 20:06 | gfredericks | raek: I think you have to do some kind of global mutation, whether it's a macro or function |
| 20:06 | sparkleshy | gfredericks: It wouldn't be actually clean without an implementation of the cache macro |
| 20:06 | sparkleshy | what about (defmacro cache [exp] (let [sym (gensym)] (eval `(def ~sym ~exp)) sym)) ? |
| 20:06 | raek | gfredericks: yes. |
| 20:07 | raek | which would add runtime overhead, I guess |
| 20:07 | raek | since the function would need to check if the value has been calculated |
| 20:09 | gfredericks | I guess it all seems very sneaky |
| 20:10 | sparkleshy | okay. That implementation works. |
| 20:11 | sparkleshy | in (println "hi") (cache (println "beta")) can I rely on hi printing before beta? |
| 20:12 | sparkleshy | also, is the way it uses def going to cause performance issues vs the previous wrap-the-defn-in-a-let solution? |
| 20:12 | sparkleshy | i mean, in really intensive code. Like, is performance _ever_ something to worry about with the cache macro? |
| 20:14 | gfredericks | I don't think there are any performance issues there |
| 20:14 | gfredericks | it should be equivalent to using an explicit top-level (def) |
| 20:14 | gfredericks | everything else happens at compile-time |
| 20:17 | sparkleshy | yeah... rephrase: would (let [rand (java.util.Random.)] (defn gaussian [] (.nextGaussian rand))) be any slower than (def rand (java.util.Random.)) (defn gaussian [] (.nextGaussian rand)) ? |
| 20:17 | gfredericks | the let might be faster since there's no var involved |
| 20:18 | gfredericks | but I don't know much about those things |
| 20:23 | bbloom | *sigh* waiting on the v8 compile…. i sometimes forget how much i appreciate instantaneous development feedback |
| 20:24 | dnolen | bbloom: haha, though v8 build time isn't so bad. |
| 20:24 | bbloom | i'm on a year old macbook air |
| 20:24 | bbloom | my poor little cpu can't handle it :-) |
| 20:24 | bbloom | my big bad machine is at the office |
| 20:25 | dnolen | bbloom: heh oh yeah. As much as I like the MB Air, having a 2.66 dual core i7 has it's perks. |
| 20:26 | gfredericks | debugging aleph is hard :( |
| 20:27 | bbloom | dnolen: i'm seeing something a bit odd with cljs compiler output (before my changes), maybe you can explain |
| 20:27 | dnolen | bbloom: it will be a happy day when we can debug CLJS right in the browser. |
| 20:27 | dnolen | bbloom: hopefully browsers will support some JSON syntax highlighting description format. |
| 20:27 | dnolen | bbloom: what's up? |
| 20:27 | bbloom | i'm seeing a few calls to cljs.core.get.SOMEGENSYM |
| 20:27 | bbloom | what's that about? |
| 20:28 | dnolen | bbloom: __N, direct multi arity dispatch support |
| 20:28 | bbloom | ah ok |
| 20:29 | bbloom | for my debugging diffs, i have been using sed to rewrite gen syms so they don't show up on diffs |
| 20:29 | bbloom | but it can be confusing b/c ALL THE GEN SYMS LOOK THE SAME :-) |
| 20:29 | bbloom | hehe |
| 20:29 | bbloom | thanks |
| 20:31 | bbloom | and nice work on all the recent perf improvements |
| 20:31 | bbloom | good stuff! |
| 20:32 | lynaghk | dnolen: yeah, those performance improvements were boss. |
| 20:33 | dnolen | bbloom: lynaghk: thanks! |
| 20:35 | lynaghk | dnolen: what's the story with the GSoC stuff, by the way? |
| 20:36 | dnolen | lynaghk: I just sent out an email about that on clojure-dev, we need to pick up the pace a bit, 9 more days to review and score etc. |
| 20:36 | dnolen | lynaghk: we've been allocated 4 slots, which is nuts for a first time mentoring organization. |
| 20:36 | lynaghk | I sent you an email a while back about the students who contacted me---I dunno if you want me to reproduce that on Melenage. (I thought it'd be safer to send you an email than try and figure out how to write something private on that terrible UI) |
| 20:37 | lynaghk | dnolen: guess Google is excited about the ()'s |
| 20:37 | dnolen | lynaghk: all admins and mentors can leave private comments. |
| 20:37 | dnolen | lynaghk: Melange is so lame. |
| 20:38 | dnolen | lynaghk: I our crop of proposals was surprisingly strong. |
| 20:38 | dnolen | Clojure programmers don't mess around. |
| 20:38 | lynaghk | dnolen: okay, I might poke around and put some updates on Melenage then. I really want the students to actually write some code before I feel like moving ahead. |
| 20:38 | dnolen | I "think our proposals" I mean. |
| 20:38 | lynaghk | dnolen: yeah. I particularly liked Chris Granger's difficulty level of "medium to insane". |
| 20:39 | lynaghk | Go big or go home. |
| 20:39 | ibdknox | lynaghk: it's true |
| 20:39 | dnolen | lynaghk: yes, please go through the proposals thoroughly, even ones you aren't mentoring. |
| 20:39 | ibdknox | a choose your own adventure of sorts ;) |
| 20:40 | dnolen | anything that doesn't have a mentor at this point isn't something we should consider. |
| 20:40 | bbloom | dnolen: so the column numbers are pretty easy to screw up if with-out-string or anything like that gets used |
| 20:40 | dnolen | bbloom: but nobody should be using that right? |
| 20:40 | bbloom | dnolen: i'm tracking down one new issue now… but i'm trying to think about how to prevent this going forward |
| 20:40 | bbloom | dnolen: right |
| 20:41 | bbloom | k think i got it |
| 20:41 | bbloom | my little column-aligned line number comment trick is good enough for now |
| 20:41 | bbloom | a bug or two may creep in before source-maps gets implemented proper |
| 20:41 | bbloom | but visual inspection will do until then |
| 20:42 | lynaghk | If I write {:a @(future (x)) :b @(future (y))} will the calls to x and y be executed in parallel? |
| 20:42 | ibdknox | dnolen: light table just passed Meteor in points on HN |
| 20:42 | dnolen | bbloom: cool, your changes are nice, it's a necessary step for decoupling the compiler from JS any how. |
| 20:42 | dnolen | ibdknox: not surprising, Light Table is way more impressive IMHO. |
| 20:43 | bbloom | dnolen: thanks. they also clean up a few small things. in the output: a few less random blank lines, eliminates some redundant parens, cleans up spacing. in the compiler code: fewer (println (str ….)) with teh various extra ()() forms :-) |
| 20:49 | michaelbarton | I have a beginner's question. I'm trying to create a lazy sequence from a file but I'm getting either OutOfMemory (heap) errors or stream closed errors. I feel like there must be an idomatic way for this that I'm missing. |
| 20:51 | michaelbarton | The stream closed errors come when I try to wrap the reader in a with-open block. |
| 20:53 | bbloom | dnolen: ok, ready with patch for track-pos |
| 20:53 | bbloom | struggling with git format-patch tho :-P |
| 20:54 | S11001001 | michaelbarton: dynamic scope and laziness mix weirdly |
| 20:54 | bbloom | http://stackoverflow.com/questions/616556/how-do-you-squash-commits-into-one-patch-with-git-format-patch :-) |
| 20:55 | S11001001 | if you like, you can do this instead, just note that unless you consume the whole input, the stream won't close: (concat my-lazy-seq (lazy-seq (.close stream) nil)) |
| 20:56 | michaelbarton | OK. Thank you for the suggestion. |
| 20:56 | bbloom | dnolen: http://dev.clojure.org/jira/browse/CLJS-176 |
| 20:57 | michaelbarton | How does the concat work in that function? |
| 20:58 | arohner | is there a fn like partition, but splits the seq into n equal sized seqs? |
| 21:01 | bbloom | ,(doc partition-all) |
| 21:01 | clojurebot | "([n coll] [n step coll]); Returns a lazy sequence of lists like partition, but may include partitions with fewer than n items at the end." |
| 21:01 | bbloom | that what you mean? |
| 21:01 | gfredericks | arohner: oh you want something where the partition size is based on the length of the sequence? |
| 21:01 | arohner | gfredericks: yes |
| 21:01 | gfredericks | arohner: I don't think there is anything built in; would not be lazy-friendly |
| 21:02 | gfredericks | (partition (quot (count coll) n) coll) |
| 21:02 | michaelbarton | arohner: Divide the length of the sequence by n, then partition by n size? |
| 21:02 | arohner | yes. I know how to implement it, I was just checking that it didn't exist yet |
| 21:02 | michaelbarton | arohner: OK |
| 21:11 | dnolen | bbloom: thx a million. gotta run but will give this a serious look tomorrow and try to appy then. |
| 21:11 | dnolen | Clojure community rocks. |
| 21:11 | bbloom | :-) |
| 21:25 | socksandsandals | really n00b question here: if I have (def foo 12) in a file, how does one go about later changing that variable's value? |
| 21:25 | socksandsandals | should I just (def) it again later? |
| 21:25 | S11001001 | socksandsandals: try not to change it ever |
| 21:26 | socksandsandals | exactly the answer I wasn't looking for |
| 21:26 | S11001001 | socksandsandals: so, as a newbie, you may be reaching for solutions appropriate in other languages, but not clojure |
| 21:26 | S11001001 | I can't be sure, so I err on the side of caution |
| 21:26 | S11001001 | typically, vars are only changed during development |
| 21:26 | socksandsandals | I'm a n00b to Clojure, not programming or Lisp |
| 21:27 | S11001001 | right, that's what I said |
| 21:27 | socksandsandals | so I have a shutdown function that isn't determined until runtime |
| 21:27 | S11001001 | if your program, while running, requires changes to global state, then setting a var is the wrong solution |
| 21:27 | socksandsandals | so I need to assign it to something to hold on to it for when I go to shutdown the server |
| 21:28 | S11001001 | instead, you probably want an atom, ref, or future, depending on the concurrency semantics you desire |
| 21:28 | S11001001 | s/future/agent/ |
| 21:28 | clojurebot | Titim gan éirí ort. |
| 21:28 | S11001001 | in this case, it sounds like you want an atom |
| 21:28 | socksandsandals | there's no concurrency involved in this case which is why I was wondering if I could just rebind the def |
| 21:28 | socksandsandals | but an atom would work, too |
| 21:28 | socksandsandals | thanks S11001001 |
| 21:28 | S11001001 | np |
| 21:29 | socksandsandals | S11001001: if an atom holds a function, I can still call it with just @atomname, right? |
| 21:30 | S11001001 | (@atomname args...) |
| 21:30 | socksandsandals | yeah, ok nice, thanks |
| 21:30 | socksandsandals | right, Clojure is a Lisp1 so no need for apply |
| 21:30 | socksandsandals | perfect |
| 21:30 | S11001001 | funcall, rather |
| 21:30 | socksandsandals | oh right |
| 21:37 | S11001001 | I wish it had funcall, anyway; sometimes it's just what you need for some HOF. Same for this: (defn first-arg [x & _] x) |
| 21:38 | gfredericks | (def first-arg (comp first list)) |
| 21:38 | S11001001 | gfredericks: strict in the rest |
| 21:38 | S11001001 | having written first-arg 3 or 4 times, and $ (funcall) at least once |
| 21:39 | gfredericks | S11001001: you mean it realizes any lazy-seq-args? |
| 21:39 | S11001001 | aye |
| 21:40 | gfredericks | ,(doc list) |
| 21:40 | clojurebot | "([& items]); Creates a new list containing the items." |
| 21:40 | gfredericks | ,(-> (range) (apply list) (first)) |
| 21:40 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn> |
| 21:40 | gfredericks | ,(->> (range) (apply list) (take 10) last) |
| 21:41 | clojurebot | Execution Timed Out |
| 21:41 | gfredericks | well wudduyaknow |
| 21:41 | S11001001 | clojure.walk depends on it |
| 21:42 | michaelbarton | I'm struggling to process a 2.5m line file. |
| 21:42 | michaelbarton | I'm trying to create a set and a map from the data but I'm running out of memory |
| 21:43 | S11001001 | michaelbarton: https://groups.google.com/d/topic/clojure/FC36I1iqZcs/discussion |
| 21:44 | michaelbarton | Interesting, I am working on a graph too. |
| 21:44 | michaelbarton | Thank you. |
| 21:45 | S11001001 | gfredericks: not only does it realize them, it constructs a proper PersistentList structure, setting aside whatever conses/chunkedseqs/magic bits you had |
| 21:45 | S11001001 | (that is what clojure.walk required) |
| 21:46 | S11001001 | michaelbarton: especially beware if you first walk the whole list creating the set, then again creating the map. That won't let go of the source lazy sequence, whereas doing them together will |
| 21:46 | gfredericks | that structure being just a vanilla linked list? |
| 21:46 | S11001001 | gfredericks: it is also counted |
| 21:47 | gfredericks | oh nice |
| 21:47 | S11001001 | I guess |
| 21:47 | S11001001 | I'm against wasting all the bits really, but oh well |
| 21:52 | fdaoud | ,(first (map / [1 1] [2 0])) |
| 21:52 | clojurebot | 1/2 |
| 21:52 | S11001001 | huh, weird |
| 21:52 | S11001001 | ,1/0 |
| 21:52 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.ArithmeticException: Divide by zero> |
| 21:52 | S11001001 | ,(do 1/0 nil) |
| 21:52 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.ArithmeticException: Divide by zero> |
| 21:52 | fdaoud | ,(first (map #(%) [#(/ 1 2) #(/ 1 0)])) |
| 21:52 | clojurebot | #<ArithmeticException java.lang.ArithmeticException: Divide by zero> |
| 21:52 | fdaoud | why does the first version work but not the second? (lazy) |
| 21:53 | S11001001 | oh, right |
| 21:53 | S11001001 | because the variadic map doesn't do fancy tricks for chunked |
| 21:53 | fdaoud | huh? |
| 21:53 | S11001001 | you only get fancy tricks in the one-sequence case |
| 21:53 | S11001001 | the multi-sequence version is naive, and doesn't do chunking |
| 21:54 | fdaoud | so lazy is only lazy by chunks? |
| 21:55 | S11001001 | in general, laziness cannot be relied upon to be "pure". There are exceptions, like iterate |
| 21:55 | S11001001 | for efficiency, vectors yield "chunked" sequences, therefore lazy operations on them also "chunk" if someone implemented that |
| 21:56 | fdaoud | ,(first (map #(%) (concat (repeat 1000 #(/ 1 2)) [#(/ 1 0)]))) |
| 21:56 | clojurebot | 1/2 |
| 21:56 | S11001001 | map, filter, and several other operations special-case for the chunking case |
| 21:56 | fdaoud | I understand, thanks for the explanation S11001001 |
| 21:56 | michaelbarton | Is there a way to increase the java memory size from inside a clojure program? |
| 21:56 | fdaoud | if it wasn't for you I would not have slept tonight. |
| 21:57 | S11001001 | happy to help then :) |
| 21:57 | fdaoud | ,(first (map #(%) (concat (repeat 100 #(/ 1 2)) [#(/ 1 0)]))) |
| 21:57 | clojurebot | 1/2 |
| 21:57 | fdaoud | ,(first (map #(%) (concat (repeat 10 #(/ 1 2)) [#(/ 1 0)]))) |
| 21:57 | clojurebot | 1/2 |
| 21:59 | S11001001 | ,(count (chunk-first (seq (concat [1 2 3] (vec (range 35)))))) |
| 21:59 | clojurebot | 3 |
| 22:00 | S11001001 | ,(count (chunk-first (seq (chunk-rest (seq (concat [1 2 3] (vec (range 35)))))))) |
| 22:00 | clojurebot | 32 |
| 22:00 | S11001001 | ,(count (chunk-first (seq (chunk-rest (seq (chunk-rest (seq (concat [1 2 3] (vec (range 35)))))))))) |
| 22:00 | clojurebot | 3 |
| 22:00 | S11001001 | ,(count (chunk-first (seq (chunk-rest (seq (chunk-rest (seq (concat [1 2 3] (vec (range 39)))))))))) |
| 22:00 | clojurebot | 7 |
| 22:00 | S11001001 | concat is good |
| 22:01 | mdeboard | Does anyone else have trouble with Cascalog in Emacs? |
| 22:01 | mdeboard | Get a lot of weird errors |
| 22:01 | mdeboard | program just constantly throws errors after awhile any time I try to run anything. |
| 22:03 | mdeboard | runs out of memory, seems like. |
| 22:04 | S11001001 | michaelbarton: if there is, it's probably buried in JMX somewhere, but I really doubt it |
| 22:05 | mdeboard | Speaking of, how DO You set -Xmx/-Xms for slime ? |
| 22:08 | S11001001 | probably by setenv JVM_OPTS in emacs |
| 22:08 | mdeboard | orite |
| 22:12 | michaelbarton | OK. I'm running the script using the clj shebang so I'm not sure how to increase the memory. |
| 22:13 | S11001001 | never used that. Never installed clojure, honestly |
| 22:13 | clojurebot | Gabh mo leithscéal? |
| 22:13 | michaelbarton | Perhaps java environment arguments. |
| 22:14 | michaelbarton | Never installed clojure? |
| 22:14 | S11001001 | nope |
| 22:14 | michaelbarton | How do you use it? |
| 22:14 | S11001001 | I use leiningen |
| 22:15 | michaelbarton | Ah, I see. |
| 22:15 | S11001001 | you could do this #!/bin/sh\ntrue; SOMEENV=someval clojure-thingy "$0" "$@" |
| 22:15 | S11001001 | with an exec in there somewhere |
| 22:16 | michaelbarton | Is it easy to create short scripts with lein? |
| 22:16 | S11001001 | maybe not, but I would do it that way anyway |
| 22:17 | S11001001 | #!/bin/sh\njava -cp `cd my-proj && lein classpath` clojure.main -e '(run this)' |
| 22:18 | michaelbarton | OK |
| 22:18 | S11001001 | I love libraries |
| 22:18 | S11001001 | and I bet the #! thing doesn't work well with them |
| 22:19 | michaelbarton | I tried lein previously. I found the learning curve a little steep so I'm using scripts until I'm more comfortable with clojure. |
| 22:19 | S11001001 | I can't speak to the efficacy of that approach |
| 22:19 | michaelbarton | OK |
| 22:23 | mdeboard | michaelbarton: Yeah you really don't want to futz with running clojure itself. Use lein |
| 22:26 | S11001001 | I would agree, but I love build systems and emacs, so maybe I am the wrong one to ask |
| 22:27 | michaelbarton | OK |
| 22:27 | michaelbarton | My script is only 19 lines long so it seemed ling using a clj shebang was simpler |
| 22:29 | S11001001 | it may end up 19 lines long, but you also have to write it :) |
| 22:33 | michaelbarton | I guess I'll try playing about with trying to make my script more lazy, then otherwise make in in lein. |
| 22:33 | S11001001 | good luck |
| 22:33 | michaelbarton | Does clojure GC automatically clear up unused variables? |
| 22:34 | michaelbarton | I mean no longer used. |
| 22:34 | S11001001 | do you mean vars created by def or bindings created by let? |
| 22:34 | bbloom | 4clojure.com is down :-( trying to work through a problem or two a day :-P |
| 22:35 | michaelbarton | def variables after they're used and not referenced again. |
| 22:35 | S11001001 | michaelbarton: no |
| 22:36 | michaelbarton | OK |
| 22:36 | michaelbarton | I should use an atom instead, then clear it? |
| 22:36 | S11001001 | hmm, what are you trying to do? |
| 22:37 | aperiodic | yeah, if you use an atom and then change its value, the old value will be GC'd if there are no other references to it |
| 22:37 | michaelbarton | I have pairs of key/values and I need to covert them to a network format. The problem is key1-key2 and key2-key1 need to be merged to a single value. |
| 22:38 | S11001001 | data in general shouldn't be stored in vars at all; vars are best for your functions, static data, and dynamic context bindings. So if this is intermediate state, you should usually just pass it between functions |
| 22:38 | michaelbarton | OK |
| 22:39 | bbloom | michaelbarton: if you're concerned with leaking memory during interactive development, you can use ns-unmap |
| 22:39 | bbloom | that will "delete" the Var |
| 22:40 | michaelbarton | OK |
| 22:40 | michaelbarton | Thank you both. |
| 23:07 | TimMc | $mail samaaron I don't know if I'll get aorund to making the Overtone instrument-samples doc tool anytime soon, so that idea is free to a good home. :-) |
| 23:07 | lazybot | Message saved. |