2011-12-26
| 00:22 | clojure_0000 | is there a way to write OSX sreensavers in clojure? I have the Java Graphics 2D drawing part already; I just need it to run as an OSX screensaver |
| 00:24 | replaca_ | clojure_0000: I have no idea, but if you can find out how to do it from java, the same mechanism should work for clojure |
| 00:32 | clojure_0000 | yeah; now that I think about it, this is really a Java/OSX question, not a clojure question :-) |
| 01:14 | clojure_0000 | is there a way to modify a (defrecord Cat [name age]), so that (Cat. a b) requires a to be a java.String and b to be a Java.int ? |
| 01:14 | clojure_0000 | this is kinda like :pre/:post, but I want to do a :pre on Cat. |
| 02:03 | clojure_0000 | a & b are both of defrecord Foo. Yet somehow, in my code (= a b) = false, whereas (.equals a b) = (.equals b a) = true. WTF is going on? |
| 02:12 | replaca_ | clojure_0000: strange, that shouldn't be happening. = is the same as .equals except that it supports nil |
| 02:12 | replaca_ | and my test with defrecord shows that to be correct |
| 02:12 | clojure_0000 | replaca_: great; atleats shows I'm reading the documentation correctly |
| 02:13 | clojure_0000 | I'm certain this is my fault; I however have no idea how to debug this (restarted repl + tried it = same bug( |
| 02:13 | replaca_ | also: (defrecord Cat [^String name ^int age]) will do what you want |
| 02:13 | clojure_0000 | are those hints; or enforced? |
| 02:13 | clojure_0000 | let me try that first |
| 02:14 | replaca_ | enforced: (->Cat "Seymour" "unknown) throws an exception |
| 02:14 | replaca_ | (add a close quote there!) |
| 02:16 | replaca_ | clojure_0000: what Clojure version are you running. I'm using 1.3 |
| 02:16 | clojure_0000 | I'm also on 1.3 |
| 02:16 | replaca_ | yeah, so it should be the same |
| 02:16 | clojure_0000 | I'm not getting the same |
| 02:16 | clojure_0000 | is there a in channel bot here? |
| 02:17 | replaca_ | yeah, two I think |
| 02:17 | clojure_0000 | (defrecord Cat [^String a ^int b]) (Cat. 23 45) |
| 02:17 | clojure_0000 | does not give me an error |
| 02:17 | clojure_0000 | maybe my clojure is fucked up |
| 02:17 | replaca_ | but I'm not sure the sandboxes will let you use defrecord |
| 02:17 | Raynes | They wont. |
| 02:17 | replaca_ | quoth the expert |
| 02:17 | Raynes | :p |
| 02:18 | replaca_ | clojure_0000: interesting, I only tried on the int side |
| 02:19 | clojure_0000 | hmm; I'm now closer |
| 02:19 | replaca_ | maybe it's only primitives or maybe my notation is wrong |
| 02:19 | clojure_0000 | this is what the following code outputs: (println (type other)) (println (type n)) (println (= (type other) (type n))) --> foo.Status foo.Status false |
| 02:19 | clojure_0000 | how is that possible? |
| 02:19 | clojure_0000 | shit; if I require/load a class twice, does clojure generate different types? (I'm using reload-all all over the place) |
| 02:20 | replaca_ | clojure_0000: yeah, it might |
| 02:20 | replaca_ | require should only do it once, though |
| 02:20 | replaca_ | load isn't as smart, iirc |
| 02:21 | clojure_0000 | i'm using :require :reload-all ... |
| 02:21 | replaca_ | yeah, I think you're doomed |
| 02:21 | replaca_ | Clojure doesn't have much choice without decided that your types are identical for you |
| 02:22 | replaca_ | *deciding |
| 02:22 | clojure_0000 | replaca_: I failed to parse the above sentence |
| 02:22 | replaca_ | so you load foo.clj the first time and it sees a defrecord, so it creates a type |
| 02:23 | replaca_ | then you load foo.clj the second time and it sees defrecord again |
| 02:23 | clojure_0000 | ah; then it reloads it; creates another defrecord |
| 02:23 | clojure_0000 | I'm a moron |
| 02:23 | replaca_ | it can't tell if that's the same def or if you changed it without working hard |
| 02:23 | replaca_ | cause really clojure is just reading along as it goes |
| 02:24 | replaca_ | so every new thing it sees is new by default |
| 02:24 | replaca_ | I don't know what's happening inside the JVM here, though |
| 02:24 | clojure_0000 | well |
| 02:24 | clojure_0000 | that was an expensive lesson to learn ~ 3 hours of my life :-) |
| 02:25 | clojure_0000 | how about :pre on defstruct constructors? |
| 02:25 | replaca_ | some lessons are like that :( |
| 02:25 | clojure_0000 | if I could get that to work; it would eliminate many of my clojure bugs |
| 02:25 | replaca_ | dunno, I haven't used :pre at all |
| 02:26 | amalloy | replaca_: definitely not true that the only difference between = and .equals is nil-safety |
| 02:27 | Raynes | amalloy: I'm tempted to add another auto reply that whines about mentions of defstruct. Would probably end up annoying people during nostalgic conversations. |
| 02:27 | replaca_ | yeah, there's the stuff about collections and type-independence too |
| 02:27 | replaca_ | anything else? |
| 02:27 | amalloy | nothing that comes to mind |
| 02:27 | Raynes | #pedant |
| 02:27 | replaca_ | amalloy: that one's good to note |
| 02:28 | amalloy | also: what's going on inside the jvm is that clojure creates a new classloader for every unit it compiles. so there are two classes, both named Status and in the foo package, but from different classloaders |
| 02:28 | replaca_ | though my real point was that clojure_0000's comparison of = and .equals results seemed valid |
| 02:29 | amalloy | clojure_0000: suggestion: treat records and structs as "advanced features", not "hey look i can make objects after all!" |
| 02:29 | amalloy | s/objects/classes, i guess |
| 02:29 | replaca_ | yeah, 99% of the time I am happy with maps |
| 02:30 | replaca_ | and they work quite well with :pre and :post reasoning too |
| 02:31 | replaca_ | oh, man, time for bed |
| 02:31 | replaca_ | good luck all! |
| 02:37 | clojure_0000 | amalloy: no no, I'm not going for "I can make objcts after all"; I'm going for "I can have types after all" |
| 02:37 | amalloy | hence my s/objects/classes |
| 02:38 | clojure_0000 | I have refined my needs to be able to do the following: <private> (defrecord Foo ...) (defn Typed-Checked-Foo [ ] (Foo. ... )) </private> <public> (defn Foo. TypeCheckedFoo.) </public> <--- is something like this easily possible? |
| 02:40 | clojure_0000 | what I need, is defn::defn- = defrecord:: ??? |
| 02:40 | lazybot | clojure_0000: Oh, absolutely. |
| 02:43 | clojure_0000 | alternatively: |
| 02:43 | clojure_0000 | how do I overwrite the constructor of a defrecord? |
| 02:44 | clojure_0000 | minds that wnat to implement haskell within clojure wants to know :-) |
| 03:12 | clojure_0000 | grr |
| 03:12 | clojure_0000 | no one in theworld knows how to do type checking on a clojure def struct constructor? |
| 03:22 | amalloy | clojure said it doesn't want to do static typing with you. no means no, man |
| 04:29 | clojure_0000 | so I get an error in the repl like: |
| 04:29 | clojure_0000 | (ClassCastException ..... ) |
| 04:29 | clojure_0000 | and there's no *.clj line associated with it |
| 04:30 | clojure_0000 | only a Util.java:104 |
| 04:30 | clojure_0000 | how do I get a stack frame out of this? |
| 04:30 | clojure_0000 | I wnat to know which *.clj line caused this error so I can fix it |
| 04:36 | clojure_0000 | fixed |
| 04:36 | clojure_0000 | error in (ns ...) |
| 04:40 | morphling | clojure_0000: you probably used a list where you should use a vector in your (ns)-form |
| 04:43 | clojure_0000 | yeah; I wote [( ... )] instead of [ ... ] |
| 08:13 | clojure_0000 | I realize this is bad practice, but is there a way to say: |
| 08:13 | clojure_0000 | (:require foo.*) ? |
| 08:13 | clojure_0000 | basicaly I want to require _ALL_ packages, ie.. foo/**/*.clj |
| 08:19 | thorwil | clojure_0000: afaik no. you should use require and use in a way that makes it clear in the code what comes from where, anyway |
| 08:46 | clojure_0000 | thorwil: a blanket require still makes it clear where it come sfrom, since by default, all names have their paths encoded within |
| 08:47 | clojure_0000 | not being able to do a blanket require actualy encourages me to ... not have lots of little files lying around |
| 08:47 | clojure_0000 | which is bad; since I wnat to have code split quite a bit |
| 08:51 | thorwil | shouldn't said code split be much about what you have to require where? |
| 08:52 | clojure_0000 | lots of decomposition = more files = more args to require = too lazy to type = want a blanket require |
| 09:11 | TimMc | Just use slamhound. :-) |
| 11:28 | TimMc | Is xerial.org the place to get sqlite-jdbc? |
| 11:29 | TimMc | Or should I use zentus? |
| 11:39 | Raynes | TimMc: Teach me how to use Enlive. |
| 11:45 | TimMc | Raynes: Pssh, *now* you ask. Can't though, I'm on a train with really shitty wifi/ |
| 11:45 | TimMc | also, I don't understand Enlive yet. |
| 11:45 | Raynes | Yeah, I'm not sure I quite understand how anybody possibly can. |
| 11:45 | Raynes | But meh. |
| 11:46 | weavejester | Isn't enlive just (at selector transformer)? |
| 11:46 | TimMc | I intend to write a doc for Enlive that groups the API into different categories. |
| 11:46 | TimMc | maybe invent some nomenclature |
| 11:46 | TimMc | weavejester: Soemtimes that transformer does something, sometimes it returns a closure to do something. |
| 11:47 | Raynes | weavejester: I don't know, man. I read about a paragraph of dnolen's tutorial and hid behind hiccup. |
| 11:47 | neotyk | Good morning everyone! |
| 11:47 | Raynes | I think I got to "This would allow us to easily implement template inheritance which we’ll talk about later (grin).", facepalmed, and promptly gave up. |
| 11:47 | weavejester | I thought the transformer was just a function that modified a clojure.xml data structure |
| 11:47 | Vinzent | weavejester, selectors are pretty hard to write, imo |
| 11:49 | weavejester | Admittedly I haven't played around with enlive a whole lot. |
| 11:49 | neotyk | weavejester: I've seen your fork of autodoc, did you managed to get it to work on 1.3? |
| 11:50 | weavejester | neotyk: No, I gave up and wrote my own doc generator, codox |
| 11:51 | Raynes | weavejester: What the shit. I didn't know about that. |
| 11:52 | neotyk | weavejester: cool, will take it for a spin now |
| 11:52 | weavejester | Raynes: I created it for Ring, because I couldn't get autodoc to work |
| 11:52 | weavejester | It generates docs like: http://weavejester.github.com/compojure/ |
| 11:52 | weavejester | And: http://mmcgrana.github.com/ring/ |
| 11:52 | Raynes | weavejester: We've been looking for something new for Noir because... well, we can't get autodoc to work. |
| 11:52 | neotyk | weavejester: looks nice ! |
| 11:53 | Raynes | weavejester: I think this will do fine. You need to publicize this. |
| 11:53 | neotyk | nobody can |
| 11:53 | weavejester | Raynes: I guess I should write up a Clojure group post on it then :) |
| 11:54 | weavejester | You should just be able to include codox 0.3.0 as a dependency then run "lein doc" |
| 11:54 | weavejester | I haven't got around to adding options to customize the output at all |
| 11:54 | weavejester | But I'll accept patches |
| 11:56 | Raynes | weavejester: You missed a great opportunity here. You could have made the command 'lein dox' |
| 11:56 | neotyk | weavejester: good for yak shaving |
| 11:56 | weavejester | Ragnor: I thought about that :) - But I wasn't 100% sold on the name |
| 11:57 | weavejester | But I couldn't think of any better name |
| 11:57 | Raynes | weavejester: Codox explodes on noir. :< |
| 11:57 | weavejester | Raynes: What does it say? |
| 11:57 | Raynes | Exception in thread "main" java.lang.RuntimeException: java.net.URISyntaxException: Illegal character in fragment at index 25: noir.core.html#var-route->name |
| 11:57 | Raynes | I can make an issue if you'd like. |
| 11:58 | neotyk | weavejester: works like promised :) |
| 11:59 | weavejester | Raynes: Ohh |
| 11:59 | Raynes | weavejester: https://gist.github.com/1521648 Should be this code it goes boom on. |
| 11:59 | Raynes | I guess there is still some old autodoc metadata in there. |
| 11:59 | weavejester | Raynes: Yeah, I can see why. It probably doesn't escape the ">" character |
| 12:00 | weavejester | Raynes: And I don't have any macros or functions with that character in Ring or Compojure. |
| 12:00 | weavejester | Hang on, let me just add a URL-encode in there... |
| 12:00 | Raynes | This is why you announce things. People test them. :p |
| 12:01 | weavejester | Raynes: I was meaning to... eventually... |
| 12:05 | weavejester | Raynes: Hm, odd, I just grabbed noir master and codox 0.3.0 seems to work on it... |
| 12:05 | Raynes | weavejester: This var was added on the 1.3 branch. |
| 12:06 | weavejester | Raynes: Oh, right. Let me switch branches then |
| 12:07 | TimMc | weavejester: The selectors are easy. I want docs on the transformers. |
| 12:07 | TimMc | (and back I go into cellular shadow) |
| 12:09 | Raynes | mdeboard: You've got the creepiest twitter picture I've ever seen. |
| 12:10 | neotyk | weavejester: also H.A.C. is using codox now http://neotyk.github.com/http.async.client/doc/ |
| 12:11 | Raynes | Ooh, that's still around? I haven't heard anything about it in a while. |
| 12:12 | neotyk | Raynes: indeed, I was kind of busy :) |
| 12:12 | neotyk | but yes, next rel will have 1.3 comat and maybe WS client |
| 12:20 | weavejester | Raynes: Try codox 0.3.1 |
| 12:20 | weavejester | Raynes: It should work now |
| 12:21 | Raynes | weavejester: We have liftoff. |
| 12:22 | Raynes | Omgdocs. |
| 12:23 | Raynes | weavejester: This looks great. I'm going to run it by Chris. I'm sure you'll see patches and such from us in the not-so-distant future. |
| 12:24 | weavejester | Raynes: I look forward to them :) |
| 12:28 | pandeiro | Raynes: is there a more intelligent way to debug noir stuff than throwing printlns all over? |
| 12:29 | Raynes | That's a pretty common way of debugging most Clojure code. |
| 12:29 | pandeiro | ok that it is then... i thought maybe there was a logging package i was missing |
| 12:30 | Raynes | pandeiro: Well, someone actually wrote something like that recently. Let me look it up. |
| 12:31 | pandeiro | https://github.com/ibdknox/noir/pull/63 ? |
| 12:32 | Raynes | pandeiro: Yeah, that's it. |
| 12:32 | Raynes | I don't know anything about it, but it says 'logging', so it might be helpful. :) |
| 12:34 | weavejester | I've been playing around with the idea of creating a "component" from a transformer function and Ring middleware. |
| 12:35 | pandeiro | weavejester: for logging? |
| 12:35 | weavejester | pandeiro: Oh, no. Something else. |
| 12:35 | pandeiro | sorry, got logging on the brain :) |
| 12:37 | weavejester | I was thinking about how to combine a HTML snippet with server-side code. |
| 12:37 | weavejester | Like how a text input might have a validation server-side |
| 13:11 | clojure_0000 | I am writing my own macro. I want to take a symbol, and append other chars to it, i.e. Cat -> Cat_ and Cat -> Cat. How do I do this? |
| 13:12 | Vinzent | ,(-> 'cat name (str "_") symbol) |
| 13:12 | clojurebot | cat_ |
| 13:13 | clojure_0000 | ,(symbol (str (name 'Cat) "_")) |
| 13:13 | clojurebot | Cat_ |
| 13:13 | clojure_0000 | Vinzent: got it; thanks |
| 13:13 | Vinzent | clojure_0000, but it's usually not a good idea, i think |
| 13:13 | clojure_0000 | Vinzent: why not? |
| 13:14 | clojure_0000 | in this particular case, "clobbering names" should be okay -- I'm writing a maco on top of defmacro |
| 13:14 | clojure_0000 | so the clobbering, if it happens, would be intentional |
| 13:14 | clojure_0000 | i.e. (myDefRecord Cat ...) would purposely create a Cat_ that does type checking before clalint Cat. |
| 13:24 | Vinzent | clojure_0000, probably I misunderstood you, but is it possible to use protocols here? |
| 13:28 | dabd | I am trying to use an http-agent but the following code hangs the REPL: https://gist.github.com/1521872 |
| 13:29 | dabd | could someone please check it? |
| 13:29 | dabd | ty |
| 13:29 | neotyk | dabd: if you would use http.async.client I could help |
| 13:30 | dabd | neotyk: thx I might try it but I would like to understand why http-agent is not working for me. |
| 13:32 | dabd | in my example h is http-agent and ds is duck-streams |
| 13:37 | clojure_0000 | how can I construt a function that takes a vector and outputs only every 2nd element |
| 13:37 | clojure_0000 | i.e. it outputs v[0], v[2], v[4], ... |
| 13:37 | clojure_0000 | so it's like a filter; but filters on the index |
| 13:37 | clojure_0000 | rather than the content |
| 13:40 | Vinzent | clojure_0000, ##(keep-indexed (fn [i x] (when (even? i) x)) [:a :b :c :d :e]) |
| 13:40 | lazybot | ⇒ (:a :c :e) |
| 13:45 | clojure_0000 | , (doc ##) |
| 13:45 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )> |
| 13:46 | clojure_0000 | Vinzent: what is this ## ? |
| 13:46 | Vinzent | clojure_0000, it's just for lazybot |
| 13:47 | Raynes | It makes lazybot ##(println "evaluate the") code that comes after it. |
| 13:47 | lazybot | ⇒ evaluate the nil |
| 13:48 | TimMc | clojure_0000: How else would lazybot know what to evaluate? |
| 13:48 | Raynes | He could use magic. |
| 13:48 | Raynes | magicbot |
| 13:48 | clojure_0000 | mind-reader-bot |
| 13:50 | Raynes | "Powered by Clojure, Noir, MongoDB and the cries of children the world over." |
| 14:10 | clojure_0000 | is there an idiomatic way to take a list of 2n elements; and create a list of n elements, each of which is a pair? |
| 14:11 | clojure_0000 | i.e. (0 1 2 3 4 5 6 7) into ((0 1) (2 3) (4 5) (6 7)) ? |
| 14:11 | Raynes | &(partition 2 [1 2 3 4 5 6 7]) |
| 14:11 | lazybot | ⇒ ((1 2) (3 4) (5 6)) |
| 14:11 | clojure_0000 | is & = ## ? |
| 14:11 | Raynes | Yeah, it's another lazybot prefix. |
| 14:17 | TimMc | clojure_0000: & is the start-of-line eval trigger, ## is the inline eval trigger (and doesn't respond to as many forms) |
| 14:17 | clojure_0000 | i have a dumb question |
| 14:17 | Raynes | I was tring to think of a non-confusing way to explain that, but decided against it. |
| 14:17 | clojure_0000 | why is ~ chosen as the unquote char? |
| 14:17 | clojure_0000 | it feels very RSI -inducing ish |
| 14:17 | clojure_0000 | the way I have to contort my left hand |
| 14:17 | clojure_0000 | to hit shift + ` at the same time |
| 14:18 | Raynes | If you use it enough to cause RSI, you're writing code in the wrong language. |
| 14:18 | clojure_0000 | isn't macros part of lisp? |
| 14:18 | TimMc | clojure_0000: Presumably because , was co-opted as whitespace for readability and ~ is on the same key as `. |
| 14:18 | Raynes | Yes, but you shouldn't use them enough to cause RSI. |
| 14:18 | arthurdenture | clojure_0000: hit shift with the opposite hand? |
| 14:25 | clojure_0000 | darn it; looks like I'm going to have to learn how to type properly |
| 14:45 | dabd | I have the following code https://gist.github.com/1521996 to download a bunch of files using HTTP GET. I would like to create a standalone uberjar so I ran 'lein uberjar' but when I run the resulting jar with 'java -jar jwget-1.0.0-SNAPSHOT-standalone.jar "http://download.thinkbroadband.com/5MB.zip" "http://download.thinkbroadband.com/10MB.zip"' it downloads the files but the jar does not return terminate in the shell. What might be the cause? |
| 14:45 | dabd | ty |
| 14:48 | huahaiy_ | \quit |
| 14:51 | clojure_0000 | is there a short hand for: (fn [x] (apply f x)) ? |
| 14:51 | clojure_0000 | i.e. I'm looking for g s.t. (g f) = (fn [x] (apply f x)) |
| 14:51 | clojure_0000 | seems like g should have a name |
| 14:52 | hroarke | dabd: Agents run in a pool of non-daemon threads. These will keep your JVM alive. You need to call shutdown-agents, this will let your JVM exit. |
| 14:52 | dabd | hroarke: ty! |
| 15:16 | TimMc | clojure_0000: "g" is spelled "partial apply" |
| 15:17 | TimMc | &((partial apply +) [1 2 3 4 5]) |
| 15:17 | lazybot | ⇒ 15 |
| 15:17 | romanandreg | has anyone tried to run test.generative using leiningen (lein run) |
| 15:17 | romanandreg | > |
| 15:18 | romanandreg | I'm trying to find somewhere that tells me how to run clojure.test.generative with clojure.test but no luck so far |
| 15:47 | clojure_0000 | for functions, I can alias w/ (def short some.path.cat.dog/func); can I do something similar with macros? |
| 15:47 | clojure_0000 | for functions, I can alias w/ (def short some.path.cat.dog/func); can I do something similar with macros? or am I forced to write (defmacro short [ & args] `(some.path.cat.dog/macro ~@args)) |
| 15:52 | tmciver | clojure_0000: no need to alias that way. You can :use in the namespace declaration or use :as with :require. |
| 15:56 | tmciver | clojure_0000: see http://clojuredocs.org/clojure_core/clojure.core/use#example_551 |
| 16:03 | Xenocorp | hello? |
| 16:03 | clojurebot | BUENOS DING DONG DIDDLY DIOS, fRaUline Xenocorp |
| 16:04 | Xenocorp | is anyone here? |
| 16:04 | Xenocorp | http://pastebin.com/qygkjNix - could someone check that out for me and see where I am going wrong? |
| 16:08 | arthurdenture | Xenocorp, I get an answer when I evaluate that. can you more thoroughly describe "going wrong"? |
| 16:11 | Xenocorp | indeed. I was running it through emacs, the eval line is only 1 line so I just saw the nil. My algorithm is wrong, but I will fix that :) |
| 16:12 | arthurdenture | I'm using a library where lots of different namespaces get immigrated into a single ns "overtone.core". Is there a way to find the original definition site of a given immigrated name? |
| 16:12 | arthurdenture | (other than grep) |
| 16:13 | technomancy_ | arthurdenture: depends on your editor; it's M-. in emacs/slime. |
| 16:14 | technomancy_ | Raynes: you pinged me like ages ago? |
| 16:15 | arthurdenture | technomancy_, thanks, that worked! i guess i was assuming the way would be via the repl |
| 16:15 | Raynes | technomancy_: Yeah. I was trying to run a website with 8 kabillion dependencies on Heroku, but `lein run` keeps trying to pull down deps but it times out because the app doesn't bind to a port within 60 seconds. |
| 16:16 | technomancy_ | Raynes: curious, there should be no dependencies fetched at runtime; they should all be downloaded at slug-compilation time. |
| 16:16 | Raynes | Yeah, it does it at slug compilation time and when lein run is an. |
| 16:16 | Raynes | ran* |
| 16:16 | technomancy_ | can you paste project.clj? |
| 16:16 | Raynes | Sec. |
| 16:17 | Raynes | technomancy_: https://github.com/4clojure/4clojure/blob/f/1.3/project.clj |
| 16:17 | Raynes | I'm guessing checksum-deps is the problem? |
| 16:17 | Raynes | I didn't notice that (because I didn't put it there) until now. |
| 16:18 | technomancy_ | that'd be my guess; can you see if you can repro without that line? |
| 16:18 | Raynes | Sure |
| 16:21 | Raynes | technomancy: That was it. |
| 16:21 | technomancy | Raynes: I'll see if I can debug further tomorrow; for the time being at least there's a workaround. |
| 16:22 | Raynes | technomancy: Well, it wasn't anything critical. I was just playing around with it and noticed it and figured it might be a bug. |
| 16:22 | Raynes | technomancy: One question: the free hours you get are per-app, right? Not per-account? |
| 16:23 | technomancy | Raynes: I believe so but not confidently enough to put any money on a wager |
| 16:23 | Raynes | Heh |
| 16:24 | technomancy | by default you're getting 1.5.2, but I've got my apps running on the 1.6.2 branch of the buildpack, so it's been tricky for me to repro that issue in particular |
| 16:25 | Xenocorp | http://pastebin.com/qN4UyxdD for http://projecteuler.net/problem=1 if anyone's interested |
| 16:25 | Raynes | "Basic usage of Heroku is free. Each app you create has free access to 750 dyno hours per month and a 5MB database." |
| 16:26 | Raynes | technomancy: ^ Awesome. I was curious because I'll be deploying a new heroku app soon. |
| 16:26 | Raynes | (not 4clojure, in case anyone is wondering) |
| 16:29 | Xenocorp | does anyone know if there will be an updated version of clojurebox to 1.3? |
| 16:30 | technomancy | I don't think clojurebox is maintained |
| 16:30 | Xenocorp | no, i know. But I'm sure it won't be much work to package it up |
| 16:30 | Xenocorp | it seems like the regular emacsW32 install + a clojure setup /.emacs.d folder |
| 16:32 | Raynes | amalloy: Y U NO SAY HI? |
| 16:32 | Raynes | I didn't realize you were around. |
| 16:33 | technomancy | Xenocorp: using clojure directly is discouraged these days |
| 16:33 | Xenocorp | @technomancy can you explain that a bit more? |
| 16:34 | Raynes | https://github.com/technomancy/leiningen |
| 16:34 | technomancy | Xenocorp: clojure is really just a library rather than an application designed for end-user use |
| 16:35 | Xenocorp | a library for which language? |
| 16:35 | technomancy | a JVM library |
| 16:35 | technomancy | I guess in this case you could say Emacs is the launcher |
| 16:36 | Xenocorp | ehh, I'm confused. You're treating the JVM as a platform that runs, what, exactly? |
| 16:36 | Xenocorp | I thought you would label Clojure as a language in it's own right, correct? |
| 16:36 | technomancy | it's a language implemented as a library |
| 16:36 | Raynes | Yes, but Clojure doesn't have a decent end-user interface. |
| 16:36 | Raynes | I think you're using the word 'library' in a confusing way, technomancy. |
| 16:36 | technomancy | most languages come with a launcher designed for end-user consumption, but clojure does not. |
| 16:36 | Xenocorp | I'm a noob to both clojure and the jvm, so bare with me. |
| 16:37 | technomancy | Xenocorp: do you know ruby? |
| 16:37 | Xenocorp | No, Python is the only language I 'know' |
| 16:37 | Xenocorp | but I'm a fairly advanced user |
| 16:38 | Xenocorp | Python has the interpreter, ran through python.exe on Windows. Is this what you're referring to as 'the user-interface' ? |
| 16:38 | technomancy | yeah |
| 16:38 | Xenocorp | ok, Clojure has clojure-*.*.*.jar |
| 16:38 | Xenocorp | does that not count? |
| 16:39 | technomancy | imagine if instead of running python.exe you had to write a shell script for anything you wanted to run that set LD_LIBRARY_PATH to point to wherever python was installed |
| 16:39 | Xenocorp | ok |
| 16:40 | Raynes | Xenocorp: Clojure's jar has an executable portion for starting a REPL that isn't even wrapped by readline. The interface is terrible, but Leiningen fills all of the holes in it. |
| 16:41 | Xenocorp | I've not used leiningen, I don't use the REPL either (personal preference) |
| 16:41 | Xenocorp | Python has a REPL and I find it horrible, I presumed Clojure's would be the same. |
| 16:41 | Raynes | Haha. |
| 16:41 | dnolen | Xenocorp: heh, when it comes to Lisps, the REPL is everything. |
| 16:42 | Xenocorp | Like I said, I'm a noob (== (time-spent) 0) :: TRUE |
| 16:42 | Raynes | That's less of a personal preference and more of a "totally missing everything" sort of thing. :p |
| 16:42 | Xenocorp | How so? |
| 16:42 | Raynes | What dnolen just said. |
| 16:43 | Xenocorp | but that doesn't explain anything, it's a statement? |
| 16:43 | technomancy | programming without a repl is cybernetically unsound no matter the language. |
| 16:43 | Raynes | And that wasn't a question. |
| 16:44 | amalloy | Xenocorp: if you don't have a repl, you can't answer simple questions like "hm, what happens if i call foo with various args?" you have to set up a whole program that prompts for args, calls foo, and prints the result |
| 16:44 | Raynes | Interactive development is something that can't really be explained to you. It's something you have to experience. |
| 16:44 | Raynes | If you experience it, there isn't a question like "why a REPL" that makes sense. |
| 16:45 | Xenocorp | I have experienced it, I find that entering things that require >1 line in a single line REPL the most painful experience ever. If I can write it out in a file, hit a single button to run it, what's the difference. When it's running, sure, a REPL is great. Before that, nope. |
| 16:46 | amalloy | well that's not crazy. emacs's repl is a multi-line editable area |
| 16:46 | Xenocorp | I've just started with clojurebox today |
| 16:46 | amalloy | (and has a button for sending a file to the repl) |
| 16:47 | dnolen | Xenocorp: you can interact with the REPL w/o always typing into |
| 16:47 | Xenocorp | with using the arrow keys/ |
| 16:47 | Xenocorp | ? |
| 16:48 | dnolen | Xenocorp: all the good LISP environments support many ways of sending code to the REPL |
| 16:48 | Xenocorp | I never said a repl is a waste of time, just that it's not my main programming interface. |
| 16:49 | Xenocorp | and I've been using clojure for about 2 weeks, only. |
| 16:49 | choffstein | Can anyone point me to a good post / article / book on writing performant clojure? I've done some profiling with JVisualVM and seem to be spending a lot of time with reflections. I've set *warn-on-reflections* and gotten rid of everything I could. But I would love to read a page about where I can use type-hints, best uses of Java arrays, or when it is better to use maps vs records. |
| 16:49 | Xenocorp | choffstein: There's a section about it in Practical Clojure on Apress pub, about 30-70 pages.. iirc |
| 16:50 | choffstein | Xenocorp: Awesome. Thanks. |
| 16:54 | Xenocorp | choffstein: I just checked. 9 pages, but it covers type hinting |
| 16:54 | Xenocorp | sorry |
| 16:58 | choffstein | No worries. I just noticed an incredible speed-up in an app I am writing going from a generic map-of-maps to a map-of-records with type-hints. That sort of thing I never would have really "guessed." I'm trying to find more stuff like that. |
| 17:01 | Xenocorp | practical clojure seems like a decent book. I need something a little more basic, but it sufficed to get me 'hooked' on clojure. |
| 17:02 | mbai | is there an enhanced clojure repl that has built in doc, completion, sugar. some equivalent of ipython for python. |
| 17:02 | dnolen | choffstein: what are you using the type hints for? field access? |
| 17:03 | choffstein | computations on the fields |
| 17:03 | choffstein | so something like (math/abs (:field record)) |
| 17:04 | dnolen | choffstein: another approach is to definite a protocol for those accessors |
| 17:04 | choffstein | dnolen: Can you elaborate? |
| 17:04 | dnolen | choffstein: then you don't need type hints |
| 17:04 | choffstein | Like, create a protocol with type-hinted accessor functions? |
| 17:05 | dnolen | choffstein: (defprotocol IPoint (x [this]) (y [this])) |
| 17:06 | akhudek | mbac: I don't think so, but you can get documentations using the "doc" function: e.g. (doc some-fn) |
| 17:06 | akhudek | err mbai |
| 17:06 | mbai | err? |
| 17:06 | clojure_0000 | what is a good rule of thumb for naming stuff to NOT conflict w/ java classes? For example, I have a defrecord that is a wraper about KeyEvent; but what shoudl I name it? |
| 17:07 | clojure_0000 | I want to name it KeyEvent, since it's basically what it is |
| 17:07 | clojure_0000 | but then there's already java.awt.event.KeyEvent, and I think having both would be confusing |
| 17:07 | mbai | akhudek: I found cljr |
| 17:07 | mbai | There's also the built in repl in intellij idea. |
| 17:08 | akhudek | yes, the intellij repl is pretty nice |
| 17:08 | akhudek | the enclojure repl is not as nice |
| 17:08 | clojure_0000 | no one has advice on naming? |
| 17:08 | choffstein | dnolen: I don't think I understand protocols well enough to understand how that is helpful. Any links you can share? |
| 17:08 | amalloy | choffstein: (:field record) is taking limited advantage of its record-ness. (.field ^MyRecord record) will be at least a little faster |
| 17:08 | clojure_0000 | iirc, all what protocols says is: this object implements these functions |
| 17:09 | mbai | akhudek: I was just about to install enclojure, but the author warns against using latest version of netbeans. |
| 17:09 | clojure_0000 | how does defprotocol differ from java interfaces? |
| 17:09 | dnolen | choffstein: amalloy: (.field ...) is way faster than (:field ...) |
| 17:09 | mbai | I've used netbeans for a long time, but the plugins are never maintained. |
| 17:09 | dnolen | but (field ...) is just as fast as (.field ...) if field is a protocol fn |
| 17:09 | akhudek | mbai: I would recommend against encjoure at this time. The author is correct, the netbeans 7 version has some bad bugs. |
| 17:10 | choffstein | Ohhh. Wow. That is hugely helpful. |
| 17:10 | akhudek | the 6.x version is ok, but has problems with clojure 1.3 as it won't start a repl without the old contrib |
| 17:10 | dnolen | clojure_0000: you don't need to worry so much about naming - everything in Clojure is namespaced. |
| 17:10 | akhudek | also, the repl has some real issues with it's syntax parsing |
| 17:10 | choffstein | So, either use (.field ^MyRecord record) or make my record follow a protocol? |
| 17:10 | amalloy | dnolen: doesn't that put some strain on the jit to inline? i'd be surprised if it were really *just* as fast, though sure it would be close |
| 17:10 | akhudek | If you print \" to standard output, it will think everything is a string. |
| 17:11 | dnolen | amalloy: seems just as fast to me. |
| 17:11 | mbai | akhundek: understood. IDEA it is. |
| 17:11 | akhudek | It also becomes very very slow at that point as I guess the algorithm for parsing has bad behaviour on long strings. |
| 17:11 | dnolen | choffstein: keyword lookups are optimized, but for performance critical stuff yes make a protocol for the accessors |
| 17:12 | choffstein | dnolen: Okay, let's assume I am really stupid. Can you show me how you would use that IPoint protocol? |
| 17:13 | amalloy | dnolen: just benched it a bit and the protocol version takes ~3 times longer. putting together a gist in a sec |
| 17:13 | dnolen | choffstein: (x some-point), however if you're doing some primitive math, that approach is not so good and your type-hint approach is better. |
| 17:14 | amalloy | https://gist.github.com/1522199 outlines the approach i think dnolen is suggesting, and my timing results |
| 17:14 | choffstein | dnolen: It's a lot of accessors, data being passed around, then some primitive math. Wish I could share, but it's company code :-\ The performance speed-up isn't necessary -- just nice |
| 17:16 | choffstein | Any such optimizations for setters? :D |
| 17:16 | amalloy | of course |
| 17:16 | dnolen | amalloy: those are the timings I've seen, but it probably depends on machine, JDK, etc. |
| 17:16 | amalloy | though the answer depends on whether you really mean setters, or you mean immutable updates |
| 17:17 | dnolen | choffstein: setters are really a last ditch thing since that's playing with fire. |
| 17:17 | choffstein | Hmm. Well, assoc on a record |
| 17:17 | amalloy | sure. i think the protocol dispatch here is something the JIT could be smart enough to inline, then optimize |
| 17:17 | dnolen | amalloy: I meant those aren't, sorry. |
| 17:17 | amalloy | choffstein: you might want to borrow a tool from `useful`, called assoc-record |
| 17:18 | amalloy | it does the optimizations for you |
| 17:18 | choffstein | awesome, thanks |
| 17:18 | amalloy | and also generates the optimized accessor functions |
| 17:18 | amalloy | https://github.com/flatland/useful/blob/develop/src/useful/datatypes.clj and sample usage at https://github.com/flatland/useful/blob/develop/test/useful/datatypes_test.clj |
| 17:20 | amalloy | personally i hate the update-record syntax and don't really suggest using it, but the rest is pretty handy |
| 17:20 | dnolen | amalloy: choffstein: https://gist.github.com/1522208, OS X, JDK 7, 2.6ghz dual core i7 |
| 17:20 | choffstein | much appreciated |
| 17:22 | amalloy | dnolen: yeah, must be a jvm thing. when i run your code the difference between (.a f) and (a f) is even more pronounced than in my code |
| 17:22 | amalloy | 40ms and 170ms respectively |
| 17:23 | amalloy | on Ubuntu openjdk 1.6, slow-ass old cpu |
| 17:24 | rplevy | I'm curious about updating leiningen to depend on 1.3. Are there problems that have held this up, or is just a to-do that hasn't been done yet? |
| 17:24 | ibdknox | rplevy: many of the plugins rely on contrib |
| 17:25 | ibdknox | upgrading lein itself is easy |
| 17:25 | ibdknox | upgrading nearly every plugin? that's going to take some time |
| 17:25 | ibdknox | unfortunately :( |
| 17:26 | rplevy | ok, so basically what is holding it up is going down the list of plugins and eliminating their contrib dependencies. |
| 17:26 | clojure_0000 | I have (:require foo.bar); then somewhere later, I use foo.bar/kick inside of a _macro_ -- do I have to do something special when using functions within a macro? [some lisps have multi level compilation; so depending on whether it's within a macro, I have to import the function in a special manner] |
| 17:26 | rplevy | but they can't be updated to 1.3 yet |
| 17:27 | ibdknox | rplevy: last I knew, technomancy is basically waiting to make that transition for the 2.0 release |
| 17:27 | rplevy | I see |
| 17:28 | rplevy | are all of the plugins listed on the lein plugins page on github? |
| 17:28 | rplevy | I can't think of any that aren't anyway... |
| 17:28 | ibdknox | most likely not |
| 17:28 | ibdknox | but that ought to be the majority |
| 17:28 | rplevy | ok |
| 17:29 | amalloy | clojure_0000: no |
| 17:32 | ibdknox | dnolen: done with cljs, clojail (only works in chrome, for some reason): http://blazing-flower-2726.herokuapp.com/ |
| 17:33 | ibdknox | dnolen: and little example code: https://gist.github.com/1522225 |
| 17:34 | clojure_0000 | amalloy: it was a diferent error |
| 17:34 | dnolen | ibdknox: that's neat! |
| 17:34 | clojure_0000 | I'm not yet versed in deciphering clojure's error codes yet. |
| 17:35 | choffstein | It's hard to profile when my network is running at 1.03KB/sec … sigh |
| 17:38 | ibdknox | dnolen: I'm working on an interactive teaching environment :) |
| 17:39 | dnolen | ibdknox: that is a-w-e-s-o-m-e :) |
| 17:40 | choffstein | Does a type-hint for the value being returned by a function go before or after the function name? |
| 17:40 | dnolen | choffstein: it comes before the arglist |
| 17:41 | dnolen | choffstein: well if you're talking about primitive returns |
| 17:41 | choffstein | dnolen: …and if I am talking about an object? I am looking at an example in practical clojure that has #^String after defn |
| 17:41 | dnolen | choffstein: you can also type-hint the var of the fn to help the compiler |
| 17:42 | Xenocorp | hi, does anyone know a decent DEAD TREE book for learning clojure syntax? |
| 17:42 | dnolen | choffstein: but you're not really hinting return values (i.e. doesn't work higher order) |
| 17:42 | choffstein | dnolen: type hint the var of the fn … that has to do with every symbol having a var and a fn, right? |
| 17:43 | dnolen | choffstein: not quite. every top level definition is stored in a var. |
| 17:43 | dnolen | choffstein: the compiler looks at the var's metadata to see if it can avoid reflection. |
| 17:44 | choffstein | So … what's the difference between (defn #^String greeting [] "hi!") and (defn greeting #^String [] "hi!")? Because this is confusing the crap out of me. |
| 17:45 | dnolen | choffstein: it's confusing. |
| 17:45 | choffstein | dnolen: If there is a book or article you can refer me to, I'm happy to go reading on me own and stop annoying you :) |
| 17:45 | dnolen | choffstein: I believe both forms work. |
| 17:45 | dnolen | choffstein: there's no book on this stuff that I'm aware of. |
| 17:45 | dnolen | choffstein: also ^String is preferred now. |
| 17:46 | choffstein | hmm… can I pay you to write an article on it? :D |
| 17:46 | ibdknox | haha |
| 17:46 | choffstein | …shit, that isn't a bad idea. have a website with "bounties" for answers. People can pledge a certain amount for an answer, and the community votes if the answer is adequate for a release of the $$ :) |
| 17:46 | dnolen | choffstein: if you search the ML I've written many times on Clojure perf, also I've got some posts on dosync.posterous.com |
| 17:47 | ibdknox | choffstein: it's been tried before |
| 17:47 | dnolen | choffstein: also the Clojure alioth benchmarks are a good source of ideas. core.logic also has a bunch of things in it I've learned from optimizing Clojure. |
| 17:47 | choffstein | ibdknox: Of course it has. I have never had a single original idea, nor a single good one ;) |
| 17:48 | choffstein | dnolen: Awesome. I'll check that out. THanks :) |
| 17:48 | ibdknox | hehe |
| 17:48 | clojurebot | Titim gan éirí ort. |
| 17:48 | ibdknox | choffstein: none of us have ;) |
| 17:55 | Xenocorp | can someone give me a rundown of what lein is? |
| 17:55 | ibdknox | Xenocorp: it's a tool that lets you create, run, and manage clojure projects at the command line |
| 17:55 | ibdknox | Xenocorp: it's also the quickest way to get a repl up |
| 17:56 | Xenocorp | interesting |
| 18:03 | replaca_ | ibdi |
| 18:03 | replaca_ | ~///// |
| 18:03 | clojurebot | I don't understand. |
| 18:04 | replaca_ | sorry, network prrobs |
| 18:05 | replaca_ | ibdknox: I'm prepping a new release of autodoc. Any issues besides version numbers that are burning a hole with you. |
| 18:07 | choffstein | Anyone seen an error like this before: my.namespace.MyRecord cannot be cast to my.namespace.MyRecord ? |
| 18:07 | replaca_ | did you reload the def? |
| 18:08 | choffstein | *le sigh* |
| 18:25 | rplevy | I just cloned the 53 leiningen plugins repos listed on https://github.com/technomancy/leiningen/wiki/Plugins to analyze their dependencies. Out of 53, 16 of them directly depend on contrib in project.clj |
| 18:26 | ibdknox | technomancy: ^^ |
| 18:26 | alexbaranosky | rplevy: hey Rob |
| 18:26 | rplevy | he |
| 18:26 | ibdknox | replaca_: version numbers? |
| 18:26 | rplevy | *hey |
| 18:28 | replaca_ | ibdknox: well, the fact that the current released version wants to be in clojure 1.1 |
| 18:28 | replaca_ | and therefore doesn't build with newer things |
| 18:29 | ibdknox | replaca_: ah yes that makes things difficult. My biggest complaint was that I could never find one release to definitely use, I'm using someone's fork right now and it works only part of the time :( |
| 18:29 | replaca_ | ibdknox: I see that you're using a version that Rayne pushed to get around that |
| 18:29 | ibdknox | yeah |
| 18:29 | replaca_ | k, I'm trying to iron that out |
| 18:29 | Raynes | (a version that I don't remember pushing and have no idea why) |
| 18:30 | ibdknox | Raynes: I was wondering about that :p |
| 18:30 | replaca_ | I'm about to do an interim release that will help at least some |
| 18:30 | replaca_ | (though maybe not 100% with leiningen) |
| 18:37 | choffstein | Thanks for the help today, everyone. I'm out for a while |
| 18:50 | weavejester | Out of interest, does anyone develop Clojure on a Mac? |
| 18:52 | clojure_1000 | I need a powerful sounding name; something command/control-ish; it's basically the object that stores state for the user actions (in the heads up display) |
| 18:52 | clojure_1000 | I was going with somethign like "Status", but it sounds too weak |
| 18:52 | clojure_1000 | I need something like "this-button-launches-nukes" |
| 18:52 | clojure_1000 | but shorter |
| 18:52 | weavejester | red-button ? |
| 18:52 | clojure_1000 | no no, it doesn't always launch nukes |
| 18:53 | weavejester | hmm |
| 18:53 | clojure_1000 | it's like the mythical "houston" that is talked about in every space movie |
| 18:53 | clojure_1000 | it's the place where all info is routed through |
| 18:53 | clojure_1000 | and all important decisions are made |
| 18:53 | turbofail | NORAD |
| 18:53 | clojure_1000 | a hub of sorts |
| 18:53 | weavejester | "Houston" might work too :) |
| 18:53 | clojure_1000 | I feel like that has too much emotional connections; it wouldb be like naming a variable batman |
| 18:54 | clojure_1000 | (referring to Norad, not houston) |
| 18:54 | clojure_1000 | do the air controllers that F22 pilots talk to ... do they have a name besides "air controllers" ? |
| 18:54 | weavejester | I find naming things hard :/ |
| 18:55 | rplevy | weavejester: I thought it was the most popular, but at the last baznex there was only 1 mac, GNU/Linux PCs represent |
| 18:55 | weavejester | rplevy: I wonder how they compare... |
| 18:55 | clojure_1000 | bah |
| 18:55 | clojure_1000 | CommandCenter is too long |
| 18:55 | clojure_1000 | Hatch doesn't sound right |
| 18:55 | weavejester | I was thinking about getting an ultrabook |
| 18:55 | clojure_1000 | so I think I should name it after the protoss Nexus |
| 18:55 | sandy1986 | Can you help me? My tests behave other than my repl! |
| 18:56 | weavejester | And the best seems to be the Macbook Air. I kinda like OSX as well, but... I also like Linux :) |
| 18:56 | clojure_1000 | I am running ubuntu inside of vmbox inside of a macbook pro |
| 18:56 | hkon_ | mac air is good mkay |
| 18:56 | clojure_1000 | wait wait |
| 18:56 | sandy1986 | (is (= nil (test/get-item "notAvailable"))) << works in test |
| 18:57 | clojure_1000 | I am runnig irssi inside of xterm inside of gnome inside of X inside of ubuntu inside of virtualbox inside of OSX on a macbook pro. |
| 18:57 | rplevy | weavejester: my preferred environment is Thinkpad / Ubuntu |
| 18:57 | sandy1986 | in VimClojure repl: clojurestack.core=> (= nil (with-mc db-nodes get-item "notAvaliable")) ... evaluates to false |
| 18:57 | sandy1986 | the expression itself to "true" ... |
| 18:57 | weavejester | sandy1986: Could that with-mc be doing anything? |
| 18:58 | sandy1986 | (deftest get-item (test/with-mc testdb (is (= nil (test/get-item "notAvailable"))) )) |
| 18:58 | sandy1986 | it's exactly the same as in the test |
| 18:58 | weavejester | sandy1986: And testdb is the same? |
| 18:58 | sandy1986 | yes |
| 18:59 | weavejester | sandy1986: You could try adding some (prn ...) to your test to make sure all the data is the same |
| 18:59 | sandy1986 | (def db-nodes "127.0.0.1:11211") << exactly the same |
| 18:59 | weavejester | Also... |
| 18:59 | weavejester | Hang on |
| 18:59 | weavejester | (with-mc db-nodes get-item "notAvailable") |
| 18:59 | weavejester | Is that exactly what you have? |
| 19:00 | weavejester | And not (with-mc db-nodes (get-item "notAvailable")) |
| 19:00 | weavejester | ? |
| 19:00 | weavejester | sandy1986: You might be missing some parentheses. |
| 19:01 | sandy1986 | clojurestack.core=> (with-mc db-nodes get-item "notAvaliable") true clojurestack.core=> (with-mc db-nodes (get-item "notAvaliable")) true |
| 19:01 | weavejester | rplevy: Mine is Ubuntu too, but Mac hardware is always very nice. |
| 19:02 | weavejester | sandy1986: Maybe the return value of with-mc isn't what you think |
| 19:02 | weavejester | sandy1986: Try: (with-mc db-nodes (prn (get-item "notAvailable"))) |
| 19:02 | clojure_1000 | is str a multimethod? if so, for a struct, what is the difference between overloading toString vs hijacking the str multimethod? |
| 19:02 | sandy1986 | when I use prn in my test it prints "nil" and the test works as excepted |
| 19:02 | sandy1986 | expected |
| 19:02 | sandy1986 | damn auto corretion |
| 19:02 | weavejester | My guess is that the (with-mc ...) macro might return true no matter what the body. |
| 19:03 | clojure_1000 | how can I get the source of vector.toString? |
| 19:03 | rplevy | sandy1986: just curious, you said the repl behaves different from running it directly. Did you try turning the repl on and off again ;) it tends to build up state. |
| 19:03 | sandy1986 | yes rplevy I've tried it |
| 19:03 | sandy1986 | same result |
| 19:04 | amalloy | clojure_1000: it's in the clojure repo on github |
| 19:04 | rplevy | I had this problem with lein test working and running tests in the repl not working once, but I don't rememeber what the solution ws |
| 19:04 | clojure_1000 | amalloy: Is there a way to get it via a combo of doc/source ? |
| 19:04 | weavejester | sandy1986: What happens when you put a prn function inside the with-mc block? |
| 19:04 | amalloy | src/jvm/clojure/lang/PersistentVector.java, though it probably inherits its tostring from somewhere else |
| 19:04 | amalloy | no |
| 19:04 | clojure_1000 | amalloy: Is there a way to get it via a combo of doc/source ? (from teh clojure repl) |
| 19:04 | clojure_1000 | amalloy: got it |
| 19:05 | sandy1986 | I'll try weavejester ! |
| 19:05 | clojure_1000 | amalloy: do I want IPersistentVector.java or PersistentVector.java? |
| 19:06 | rplevy | in general, I tend not run my unit tests in the repl, so I sometimes interactively construct them in the test namespace in the repl |
| 19:06 | rplevy | * "though", not "so" |
| 19:06 | clojure_1000 | hmm, I want APersistentVector.java it looks like |
| 19:06 | Scriptor | clojure_1000: I think any file that starts with I is just for the interface |
| 19:06 | Scriptor | not sure though |
| 19:06 | Scriptor | actually, I'm probably wrong |
| 19:07 | Scriptor | nope, right |
| 19:07 | sandy1986 | #<NullPointerException java.lang.NullPointerException> |
| 19:07 | amalloy | Scriptor: exception: Intrinsics.java :) |
| 19:07 | clojure_1000 | anything that starts with I[A-Z].*.java |
| 19:08 | Scriptor | pfft, semantics |
| 19:08 | clojure_1000 | what does the RT in: jvm/clojure/lang/APersistentVector.java: return RT.printString(this); stand for? |
| 19:08 | clojure_1000 | wtf is RT? |
| 19:09 | sandy1986 | (defmacro with-mc "Macro to manage Connection" [spec & body] `( with-mc* ~spec (fn [] ~@body))) |
| 19:09 | clojure_1000 | run tiem? |
| 19:09 | clojure_1000 | hmm |
| 19:09 | Scriptor | clojure_1000: it just contains a lot of java functions that are counterparts to clojure functions |
| 19:09 | Scriptor | without being attached to any particular data structure, which is why everything is static |
| 19:10 | weavejester | sandy1986: Hm? Are you doing: (with-mc db-nodes (prn (get-item "notAvailable"))) ? |
| 19:10 | clojure_1000 | let me ask a simpler question: |
| 19:10 | Scriptor | well, not all counterparts, but a lof them are there |
| 19:10 | clojure_1000 | does a clojure vector call toString on each of its args? |
| 19:10 | clojure_1000 | when I tell a vector to become a string? |
| 19:10 | sandy1986 | clojurestack.core=> (with-mc db-nodes (prn (get-item "notAvaliable"))) nil true |
| 19:11 | sandy1986 | There is my nil ... mhhh |
| 19:11 | sandy1986 | yes, with-mc seems to eat the value |
| 19:12 | Raynes | clojure_1000: Do you want to convert all of the elements of a vector to a string or the vector itself? |
| 19:13 | Raynes | Former is ##(map str [1 2 3 4]) and the latter is ##(pr-str [1 2 3 4]) |
| 19:13 | lazybot | (map str [1 2 3 4]) ⇒ ("1" "2" "3" "4") |
| 19:13 | lazybot | (pr-str [1 2 3 4]) ⇒ "[1 2 3 4]" |
| 19:13 | clojure_1000 | I wish that (str vec) acts something like: (apply str (map str vec)) |
| 19:13 | clojure_1000 | Raynes: actually, ti's more of a question: is (str vec) equiv to (apply str (map str vec)) |
| 19:14 | Scriptor | clojure_1000: it just returns a string representation of the entire list, as opposed to each element |
| 19:14 | Scriptor | which I think makes sense |
| 19:14 | Raynes | Yes. |
| 19:14 | clojure_1000 | what is "string representation of the entire list" ? |
| 19:14 | Scriptor | s/list/vector |
| 19:14 | clojure_1000 | how is that defined? |
| 19:14 | sandy1986 | How can I modify with-mc to not return "true" |
| 19:14 | Raynes | In order to make a vector a string, it has to make each of its elements a string. |
| 19:15 | clojure_1000 | Raynes: so it has to call toString on each of them? |
| 19:15 | weavejester | sandy1986: It looks like with-mc is just calling with-mc* |
| 19:15 | Scriptor | clojure_1000: if you want to print [1 2 3] it just returns "[1 2 3]" |
| 19:15 | weavejester | sandy1986: Which library is this? |
| 19:15 | Scriptor | so that's the equivalent of converting the entire vector to a string |
| 19:15 | sandy1986 | spymemcached |
| 19:16 | clojure_1000 | , (defrecord Foo [] Object (toString [x] "Bar")) (str [ (Foo.) ] ) |
| 19:16 | sandy1986 | https://gist.github.com/1522334 |
| 19:16 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 19:17 | clojure_1000 | so in the above example |
| 19:17 | Scriptor | clojure_1000: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L1775 |
| 19:17 | clojure_1000 | how is the Foo object being converted to a string |
| 19:17 | clojure_1000 | is toString is not called? |
| 19:17 | Scriptor | that's what ends up happening if you call str on a vector |
| 19:17 | weavejester | sandy1986: It's that shutdown that's the problem. The last expression in a function is what it returns |
| 19:18 | weavejester | sandy1986: Let me fork and modify your gist a sec... |
| 19:18 | sandy1986 | ahh, damn... I got it |
| 19:18 | sandy1986 | okay |
| 19:19 | Scriptor | clojure_1000: specifically it calls the write method of a stringwriter class on each element in a vector |
| 19:19 | clojure_1000 | it looks like it's usinr print (a.nth ...) |
| 19:20 | weavejester | sandy1986: By the way, (. Thread (sleep 1)) is just going to sleep for 1 millisecond |
| 19:20 | clojure_1000 | how can I check if print is a fn or if print is a multimethod? |
| 19:20 | clojure_1000 | Scriptor: btw, thanks for the link, it was quite interesting to read |
| 19:20 | clojure_1000 | (the print i'm referring to is line 1779) |
| 19:20 | Scriptor | clojure_1000: link to the print function https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L1697 |
| 19:20 | sandy1986 | I know weavejester , thats what the spymemcached team suggested |
| 19:20 | weavejester | sandy1986: Oh, okay. Weird! :) |
| 19:20 | sandy1986 | there is an error when the first data is send before the connection is set up and running |
| 19:20 | sandy1986 | this is a timing problem about ~1ms |
| 19:20 | Scriptor | clojure_1000: as you can see, print does a bunch of stuff but essentially calls stringwriter's write |
| 19:21 | clojure_1000 | Scriptor: ah, well wait; doesn't the first line check if there is a multimethod, and if so, calls it? |
| 19:21 | clojure_1000 | Scriptor: (sorry for stupid questions; this is my first tour into the jvm side of clojure's source) |
| 19:21 | clojure_1000 | [i'm referring to lines 1699, 1700) |
| 19:21 | weavejester | sandy1986: What about this: https://gist.github.com/1522337 |
| 19:22 | weavejester | Using a (try ... (finally ...)) is the usual pattern for handling shutdowns |
| 19:22 | Scriptor | clojure_1000: no worries, I'm just trying to figure this out as I go along, I have no idea whawt PRINT_INITIALIZED means |
| 19:22 | weavejester | Because then if there's an exception in (func) the connection is still closed. |
| 19:24 | clojure_1000 | hmm, (defmethod print Foo [x] (println "YAY")) <-- results in Exception complaining clojure.core$print can not be cast to clojure.lang.Multfn |
| 19:24 | amalloy | ,print-method |
| 19:24 | clojurebot | #<MultiFn clojure.lang.MultiFn@1b7e189> |
| 19:26 | sandy1986 | weavejester: it works! |
| 19:26 | weavejester | Awesome :) |
| 19:26 | sandy1986 | When it is finished, I'm going to publish it on github (the memcached / spymemcached things) |
| 19:27 | clojure_1000 | amalloy: is there a way via the repl to get the dispatch-fn of print-method? |
| 19:33 | clojure_1000 | amalloy: for a multimethod, is there a way via the repl to get a list of all methods registered + their source? |
| 19:34 | clojure_1000 | i feel that based on the readings I have done so far, ideserve an upgrade |
| 19:46 | sandy1986 | https://gist.github.com/1522366 |
| 19:46 | sandy1986 | nice ;) |
| 20:19 | sandy1986 | how can I throw away a return value |
| 20:19 | sandy1986 | ["addtodo"] (fn [req] ( (save-todo-from-req req) (response (str "ok")))) |
| 20:20 | sandy1986 | (save-todo-from-req req) returns net.spy.memcached.internal.OperationFuture , message : OperationFuture cannot be cast to clojure.lang.IFn |
| 20:20 | amalloy | &(do (inc 1) "ignored that") ;; this, sandy1986? |
| 20:20 | lazybot | ⇒ "ignored that" |
| 20:21 | sandy1986 | ahh |
| 20:22 | sandy1986 | net.spy.memcached.internal.OperationFuture cannot be cast to clojure.lang.IFn << same error, even with "do" |
| 20:23 | amalloy | you put in too many parens |
| 20:24 | sandy1986 | parens? |
| 20:24 | clojurebot | ΜΟΛΩΝ ΛΑΒΕ |
| 20:25 | sandy1986 | ["addtodo"] (fn [req] ( (do (save-todo-from-req req)) (response (str "ok")))) << ... |
| 20:25 | amalloy | (fn [req] (do |
| 20:26 | sandy1986 | ahh |
| 20:40 | sandy1986 | What is the best way to get a list, containing the :task of https://gist.github.com/1522366 |
| 20:43 | amalloy | (map :task ...)? |
| 20:44 | sandy1986 | mhh |
| 20:44 | sandy1986 | wow, works |
| 20:47 | sandy1986 | and how to get both open and name ? |
| 20:47 | sandy1986 | :name and :open |
| 20:48 | dnolen | (map (juxt :name :open) [{:name "foo" :open "bar"}]) |
| 20:48 | dnolen | (map (juxt :name :open) [{:name "foo" :open "bar"}]) |
| 20:48 | dnolen | ,(map (juxt :name :open) [{:name "foo" :open "bar"}]) |
| 20:48 | clojurebot | (["foo" "bar"]) |
| 20:49 | dnolen | sandy1986: ^ one way |
| 20:49 | sandy1986 | wow, what is juxt, never seen it before |
| 20:49 | dnolen | ((juxt dec inc) 1) |
| 20:49 | dnolen | ,((juxt dec inc) 1) |
| 20:49 | clojurebot | [0 2] |
| 20:50 | sandy1986 | ahhh |
| 20:52 | sandy1986 | and if I want to replace "true" as the result of :open in the list...? using a formatting method? |
| 21:05 | dnolen | sandy1986: what do you mean? |
| 21:07 | sandy1986 | ["Wutttzi" true] ["Wuutz" false] should appear as ["Wutttzi" "Open"] ["Wuutz" "Closed"] |
| 21:10 | dnolen | sandy1986: then don't use :open, use a custom function |
| 21:10 | sandy1986 | as a parameter of map? |
| 21:10 | dnolen | ((juxt :name my-fn) ...) |
| 21:10 | sandy1986 | (map (fn [x] ... ) xyz ) ? |
| 21:11 | sandy1986 | ahh |
| 21:11 | dnolen | (map (juxt :name my-fn) xs) |
| 21:14 | sandy1986 | clojurestack.core=> (map (juxt :task (fn [x] ("x")) ) (get-todos)) ( #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn> |
| 21:14 | dnolen | ,("x") |
| 21:14 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn> |
| 21:15 | sandy1986 | ahh str |
| 21:15 | sandy1986 | ,(str "x") |
| 21:15 | clojurebot | "x" |
| 21:16 | sandy1986 | ,(power-on-skynet) |
| 21:16 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: power-on-skynet in this context, compiling:(NO_SOURCE_PATH:0)> |
| 21:20 | sandy1986 | (map (juxt :task (fn [x] (str (if (true? (:open x)) "Open" "Closed")))) (get-todos)) |
| 21:20 | sandy1986 | wooho ;) |
| 21:22 | sandy1986 | okay, thank you very much |
| 21:22 | sandy1986 | I'm going to bed |
| 22:36 | technomancy | rplevy: yeah, the problem is that the plugin guide actually mentions that clojure and contrib are implicit dependencies, so they don't need to be declared |
| 22:37 | technomancy | rplevy: it's looking right now like lein 2.0 will not even attempt to be plugin-compatible with 1.x in most cases. |
| 23:38 | technomancy | holy smokes; try.ocamlpro.com actually compiles ocaml bytecode straight to JS. |
| 23:39 | ibdknox | technomancy: any thoughts on why when I run heroku and leave a site idle for a bit, the next request takes a *really* long time |
| 23:39 | ibdknox | technomancy: also, that's ridiculous |
| 23:39 | technomancy | yeah, dead code elimination and everything |
| 23:40 | technomancy | I think the delay is just it coming back from idling |
| 23:40 | technomancy | IIRC that's just part of the deal with the free tier; you get the same thing with app engine &co |
| 23:41 | ibdknox | I see, outside of the free tier that won't happen? |
| 23:43 | technomancy | that's my understanding |