2012-09-30
| 00:03 | cjfrisz | mpan: You could certainly do that |
| 00:03 | cjfrisz | mpan: I think capslock-to-esc in vim is a way better idea |
| 00:04 | Urthwhyte | Jj is my preference |
| 00:04 | Urthwhyte | Rarely typed and on home row |
| 00:04 | cjfrisz | Hmm |
| 00:04 | cjfrisz | I'd have to try that one out |
| 00:04 | mpan | wait, huh? |
| 00:05 | mpan | you rebound J to ctrl? |
| 00:05 | mpan | does that not break everything else you want to do? |
| 00:05 | cjfrisz | I think he meant for vim |
| 00:05 | cjfrisz | Wait... |
| 00:05 | cjfrisz | No, still think that might be a good idea |
| 00:06 | Urthwhyte | Depending on what your repeat is set to, jj works |
| 00:06 | Urthwhyte | Let let check the line |
| 00:09 | Urthwhyte | inoremap jj <Esc> |
| 00:16 | davejacobs | i'm having session problems in compojure. i'm using the compojure.handler/site macro to wrap my routes, and my understanding is that that should provide the correct binding for session inside defroutes |
| 00:17 | davejacobs | why am i getting "Unable to resolve symbol: session" inside defroutes? |
| 00:19 | davejacobs | it seems like the ways in which the session is handled have changed so the docs aren't easy to follow |
| 00:21 | duck1123 | Does anyone know how in waltz I can trigger an event, but only if the state machine is in a set of states? (connection opened state) |
| 00:24 | duck1123 | I wonder if I should just build up a queue of pending events that'll fire as soon as the connection is back in an idle state |
| 00:27 | cjfrisz | I think I might be too proud of the piece of code I just wrote |
| 00:27 | cjfrisz | No, not too proud |
| 00:27 | cjfrisz | Just gloating about it too much |
| 00:27 | cjfrisz | Cuz it's a really awesome piece of code |
| 00:27 | duck1123 | link? |
| 00:27 | clojurebot | your link is dead |
| 00:33 | cjfrisz | It's probably not going to make sense out of context, but here goes: http://pastebin.com/xLdCQgxN |
| 00:33 | cjfrisz | It's really more what it does, which needs a blog post to explain |
| 00:38 | duck1123 | that looks like a function you'd be really happy once it works right |
| 00:39 | duck1123 | now it's probably time to break it down |
| 01:30 | mpan | &(disj [0 1 2 3] 1 2) |
| 01:30 | lazybot | java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.IPersistentSet |
| 01:31 | mpan | whoops |
| 02:15 | spoon16 | best template language to use with noir? does everyone agree re: hiccup? |
| 02:16 | Raynes | Whatever is best for the problem you're solving. |
| 02:16 | Raynes | Hiccup, Enlive, Mustache, etc. |
| 02:17 | Raynes | Mustache and Enlive are good choices for when you have designers working on your html that don't know Clojure. It's also nice if you like keeping your html and Clojure separate. |
| 02:17 | Raynes | Hiccup is the best option for in-code html generation. |
| 02:18 | Raynes | I'm personally a fan of mustache. |
| 02:20 | spoon16 | I see |
| 02:20 | spoon16 | I'll take a look, that sounds nice… I like using hiccup for generating partials |
| 02:20 | spoon16 | but not the templates |
| 02:23 | spoon16 | Raynes do you have any examples of actually using mustache on any of your github projects that I could look at/ |
| 02:29 | Raynes | spoon16: refheap uses it exclusively for templating. |
| 02:29 | Raynes | Not going to say it is a canonical example though. My templates are due for a bit of a cleanup. ;) |
| 02:30 | Raynes | https://github.com/Raynes/refheap |
| 02:30 | spoon16 | got it |
| 02:30 | spoon16 | thanks |
| 04:44 | ciccillo | ciao |
| 04:44 | ciccillo | !list |
| 08:48 | cemerick | jonasen: In case you hadn't seen it: http://groups.google.com/group/clojure-dev/browse_thread/thread/a5242f3365149326 |
| 08:56 | jonasen | cemerick: I did see it. BTW, my post to the clojure-tools ml seems to be stuck in moderation |
| 08:57 | cemerick | jonasen: I green-lighted you right after you sent it. It showed up in my inbox…? |
| 08:58 | jonasen | hmm... I don't see it at https://groups.google.com/forum/#!forum/clojure-tools |
| 08:58 | cemerick | huh, so it isn't |
| 09:00 | piranha | eh... so guys can somebody tell me how do you manage data in clojurescript? I mean if you have semi-complex application, which fetches some data from server and then combines with data from user, and needs to show it in various ways. I don't want to put it in DOM, so I could go with some atoms. But having too much atoms is not really nice, is it? If I have like hundred similar objects, should this be one atom? Or maybe single atom for all dat |
| 09:00 | piranha | a? And then some system to notify those who subscribed about updates? |
| 09:01 | cemerick | jonasen: feel free to resend |
| 09:04 | jonasen | cemerick: I wrote it with the google groups web interface so I don't have it anymore.. I'll just rewrite it then. |
| 09:05 | cemerick | jonasen: in that case, it may yet show up; I've seen latencies up to 2 days through the web interface |
| 09:06 | cemerick | jonasen: I can forward your email back to you… |
| 09:07 | jonasen | cemerick: Please do, and I'll resend it immediately |
| 09:07 | cemerick | sent |
| 09:10 | jonasen | Ok, it arrived to google groups.. Thanks cemerick! |
| 09:52 | raek_ | jonasen: fyi, I received two mail from you via the clojure-tools list, one yesterday and one today |
| 10:23 | bonega | piranha: I would go for atoms. The granularity depends on the logical context/performance needs |
| 10:25 | piranha | bonega: sure, I'm just thinking that I have to manage them somehow so I'm seeking if there is any work was done in this direction |
| 10:25 | piranha | I'm also wondering if having one single big atom will hurt performance too much |
| 10:27 | bonega | Well, one of the reasons for using multiple atoms are non-stalling writes |
| 10:27 | bonega | in clojurescript I think we still only have one thread |
| 10:28 | bonega | But I'm not well versed in clojurescript internals... |
| 10:28 | bonega | er.. |
| 10:28 | bonega | hum |
| 10:29 | bonega | I see we are not talking about refs |
| 10:44 | piranha | bonega: well, there is one thread, so there can't be any race conditions, hehe |
| 10:45 | piranha | or whatever :) |
| 11:35 | devth | i'm trying to format a collection as a string (using map and string join) but need to know if i'm on the last item in the collection. is there an idiomatic way to do that? |
| 11:37 | zamaterian | @find lamda |
| 11:37 | zamaterian | @find lambda |
| 12:13 | SrPx | The lein vimclojure command stopped working... I've installed lein-tarsier and used it once, but now it won't work. http://pastebin.com/iBjveurv any idea? |
| 12:34 | SrPx | nvm got it |
| 12:35 | benny__ | SrPx, what is that for a command? my ubuntu packaged lein doesnt have it |
| 12:36 | SrPx | lein vimclojure if I understood runs a vimclojure server (?) or something that magically enables clojure repl and stuff on vim |
| 13:03 | SrPx | Anyone has an idea what this means? java.io.FileNotFoundException: Could not locate clj_webdriver__init.class or clj_webdriver.clj on classpath: at clojure.lang.RT.load (RT.java:432) |
| 13:05 | SrPx | I have added [clj-webdriver "0.5.1"] to my project. restarted "lein vimclojure". it even downloaded clj-webdriver. but calling (require 'clj-webdriver) makes this error show |
| 13:06 | xeqi | SrPx: did you want (require 'clj-webdriver.taxi) ? |
| 13:07 | SrPx | xeqi: actually I have tried (use 'clj-webdriver.taxi), (use 'clj-webdriver), same with require, and other combinations, and it did not work. I tried again just after asking and it miraculously worked. |
| 13:08 | SrPx | (?) but thanks |
| 13:33 | edengler2 | Howdy, having some issues using unquote-splicing and map. Basically, trying to figure out why it appears map does a check for an even number of arguments before unquote-splicing is applied, ie, why `[:client {~@[1 2 3 4]}] fails, yet `[:client {~@[1 2 3 4]}] and `[:client {~@[1 2 3 4]}] and `[:client {~@[1 2 3 4]}] all work |
| 13:33 | edengler2 | The docs all seem to indicate that unquote-splicing in a map should lead to a (apply hash-map ...) construct. |
| 13:33 | edengler2 | Whoops, ,my examples failed to copy, give me a sec |
| 13:34 | edengler2 | ... why `[:client {~@[1 2] ~@[3 4]}] and `[:client {~@[1] ~@[2 3 4]}] and `[:client {~@[1 2 3 4] ~@[]}] all work |
| 13:37 | raek | ,'`[:client {~@[1 2 3 4]}] |
| 13:37 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Map literal must contain an even number of forms> |
| 13:37 | raek | ,'`[:client (~@[1 2 3 4])] |
| 13:37 | clojurebot | (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list :client) (clojure.core/list (clojure.core/seq (clojure.core/concat [1 2 3 4])))))) |
| 13:38 | raek | edengler2: the error comes from the reader. |
| 13:39 | raek | or wait... |
| 13:39 | raek | ,'[:client (~@[1 2 3 4])] |
| 13:39 | clojurebot | [:client ((clojure.core/unquote-splicing [1 2 3 4]))] |
| 13:39 | raek | ,'[:client {~@[1 2 3 4] :dummy}] |
| 13:39 | clojurebot | [:client {(clojure.core/unquote-splicing [1 2 3 4]) :dummy}] |
| 13:41 | raek | edengler2: I think the reader first reads the syntax quoted expression and then transforms it. But in your case the "inner" expression is not valid |
| 13:41 | edengler2 | I guess I am asking the question why the reader is doing a check for even number of arguments before full macro expansion? |
| 13:42 | ChongLi | it's eager? |
| 13:42 | raek | for ordinary macro expansion that's definitely the case |
| 13:42 | edengler2 | It looks if I can fake it out by providing an additional dummy unquote-splicing, but it seems odd |
| 13:42 | raek | a macro is implemented as a function that take and return clojure data |
| 13:43 | raek | reading is just one way to construct that data |
| 13:43 | raek | so a workaround in your case could be `[:client (hash-map ~@[1 2 3 4])] |
| 13:43 | edengler2 | For example, I do get a bad mapping if I provide an odd number of elements for the mapping (ie, there is an additional post-check), `[:client {~@[1 2] ~@[3]}]. I would have thought only this check would be done. |
| 13:45 | edengler2 | For the workaround, I was thinking of `[:client {~@[1 2] ~@[]}], ie, add an extra expansion for the reader, but adds no new entries to the eventual expansion |
| 13:45 | raek | the problem is that the macro expander needs valid clojure data structures as its input |
| 13:46 | raek | ,[:client {~@[1 2] ~@[]}] |
| 13:46 | clojurebot | #<IllegalStateException java.lang.IllegalStateException: Attempting to call unbound fn: #'clojure.core/unquote-splicing> |
| 13:46 | raek | ,'[:client {~@[1 2] ~@[]}] |
| 13:46 | clojurebot | [:client {(clojure.core/unquote-splicing [1 2]) (clojure.core/unquote-splicing [])}] |
| 13:46 | edengler2 | Ok, so I guess adding the extra dummy entry is the way to go |
| 13:47 | raek | I would go with `[:client (hash-map ~@[1 2 3 4])]. In that case the intermediate forms make sense too |
| 13:47 | raek | ,'[:client (hash-map ~@[1 2 3 4])] |
| 13:47 | clojurebot | [:client (hash-map (clojure.core/unquote-splicing [1 2 3 4]))] |
| 13:49 | raek | or perhaps you could simply do this: `[:client ~{1 2 3 4}] |
| 13:50 | edengler2 | Unfortunately, `[:client (hash-map ~@[1 2 3 4])] doesn't end up at the same spot, my entry of `[:client {~@[1 2 3 4] ~@[]}] ends up with [:client {1 2, 3 4}] rather than [:client (clojure.core/hash-map 1 2 3 4)] |
| 13:50 | raek | what do you mean by "end up at the same spot"? |
| 13:51 | edengler2 | Ie, equivalent to `[:client {1 2 3 4}] |
| 13:51 | raek | {1 2, 3 4} means the same thing as (clojure.core/hash-map 1 2 3 4) when evaluated |
| 13:52 | edengler2 | Will give it a try, but all of this is interacting with other libraries for XML and JSON |
| 13:53 | raek | edengler2: how is the "1 2 3 4" data represented when you receive it in your case? |
| 13:53 | edengler2 | Ie, the other libraries are processing the output of the above expansion, and looks like they do not like the clojure.core/hash-map |
| 13:53 | raek | ah, you are generating data and not code? |
| 13:53 | edengler2 | For example, in one place I am trying to generate attributes that depend if they exist. |
| 13:53 | hfaafb | code is data! |
| 13:54 | hfaafb | :p |
| 13:54 | raek | edengler2: I think it would be even simpler to just build the map before you splice it in |
| 13:55 | edengler2 | raek: Possibly, Any, thanks for the help! |
| 13:55 | raek | like `[:client ~(...code that builds the map...)], possibly using (into {} (for ...)) or (zipmap ...) |
| 14:00 | Sgeo | Would it be a bad idea to use Hiccup for non-HTML? |
| 14:01 | Sgeo | I saw somewhere that it has issues generating arbitrary XML? |
| 14:01 | augustl | Sgeo: iirc it has special knowledge of some HTML tags, not sure if that's configurable |
| 14:01 | Sgeo | Something about namespaces IIRC |
| 14:01 | Sgeo | I should note that I know little about XML |
| 14:03 | augustl | I'd imagine you could support that in hiccup quite easily |
| 14:03 | augustl | something like [:nynamespace :tagname {:attrs "here"} "contents here"] |
| 14:08 | yankov | is there a fast way to concat seq's elements into one string? apply str works slow if you got big list |
| 14:13 | Frozenlock | yankov: clojure.string/join perhaps |
| 14:14 | yankov | ,(time (clojure.string/join (range 10))) |
| 14:14 | clojurebot | "Elapsed time: 0.171213 msecs" |
| 14:14 | clojurebot | "0123456789" |
| 14:14 | yankov | (time (apply str (range 10)) ) |
| 14:14 | yankov | oops |
| 14:14 | yankov | ,(time (apply str (range 10)) ) |
| 14:14 | clojurebot | "Elapsed time: 0.144494 msecs" |
| 14:14 | clojurebot | "0123456789" |
| 14:15 | yankov | looks like join is even slower a bit |
| 14:19 | Frozenlock | Indeed. I get in the 0.0X msecs when using it with string directly though. Btw, what kind of performance are you looking for? |
| 14:27 | xeqi | ,(time (let [x (StringBuilder.)] (doseq [s (range 10)] (.append x (str s))) (.toString x))) |
| 14:27 | clojurebot | "Elapsed time: 0.301244 msecs" |
| 14:27 | clojurebot | "0123456789" |
| 14:27 | xeqi | heh, not that timing with clojurebot is accurate |
| 14:48 | Moses_ | Hi, I'm looking for an open source web app example with a good test suite. I want to learn how to properly write tests for web apps in clojure. Anyone know of any projects that could be used for this? |
| 14:49 | _ulises | Moses_: what level of testing are you after? |
| 14:50 | _ulises | Moses_: you may want to look at the tests for clj-webdriver |
| 14:50 | _ulises | Moses_: if you're using noir, you can look at the util.test namespace as it has many useful functions there for testing |
| 14:50 | Moses_ | Wow, okay thank you _ulises |
| 14:50 | Moses_ | I'm using Compojure, think that util.test is still releveant? |
| 14:51 | _ulises | Moses_: in any case, depending on the level of testing you're after, most webdev libraries deal with functions that return a map with the response, so it's a case of checking those maps for what you want |
| 14:51 | _ulises | Moses_: indeed |
| 14:51 | weavejester | Moses_: There's ring-mock for creating request maps |
| 14:51 | xeqi | Moses_: I created kerodon for clojars's test suite |
| 14:52 | SrPx | So, in clojure, can I create a function with 2 separed definitions, in a way that (foo obj_1) and (foo obj_2) will return 2 different values? |
| 14:52 | Moses_ | Thank you weavejester and xequi, I'll check those out |
| 14:53 | _ulises | SrPx: I don't know but I wouldn't think so |
| 14:54 | xeqi | SrPx: maybe multimethods or protocols |
| 14:54 | SrPx | Well I need a 'character' class, and a (image my-char-instance) that will return the character's image. What is the clojure linguistic approach to this? |
| 14:55 | Moses_ | I know you can do this (defn ([x] &body) ([x y] &body)) but I don't know if that's what you mean SrPx |
| 14:55 | SrPx | Would the instance of the character be a simple hash with {:type "character"} and image a function inside it like {image my-f} ? |
| 14:55 | _ulises | SrPx: I was about to suggest multimethods |
| 14:55 | _ulises | SrPx: if that's the case, you can dispatch on :type |
| 14:55 | SrPx | what is :type ? |
| 14:56 | SrPx | Can I dispatch in other things ? Like the value of a key |
| 14:56 | _ulises | SrPx: yes, that's what I meant by :type |
| 14:56 | _ulises | SrPx: remember that keywords are functions |
| 15:00 | SrPx | Just compiled the line 4, (derive :square :shape), got an error, http://o7.no/R54Hm0 , any idea ? |
| 15:01 | SrPx | java.lang.AssertionError: Assert failed: (namespace parent) |
| 15:01 | SrPx | assert failed, namespace parent? hm |
| 15:01 | gfredericks | SrPx: maybe you can only derive namespaced keywords? |
| 15:01 | gfredericks | e.g. (derive ::square ::shape) |
| 15:02 | SrPx | :: ? |
| 15:02 | _ulises | SrPx: this is what I meant by :type and multimethods https://www.refheap.com/paste/5399 |
| 15:02 | gfredericks | SrPx: ##::foo |
| 15:02 | gfredericks | SrPx: ##(identity ::foo) |
| 15:02 | lazybot | ⇒ :clojure.core/foo |
| 15:02 | gfredericks | it expands into a namespaced keyword in the current namespace |
| 15:02 | gfredericks | so you could also type out :my.ns/foo if you wanted to |
| 15:03 | SrPx | ##(identify ::foo) ? |
| 15:03 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: identify in this context |
| 15:03 | SrPx | ##? |
| 15:04 | SrPx | ##::foo |
| 15:04 | gfredericks | ## just triggers lazybot |
| 15:04 | SrPx | ##(identify ::foo) |
| 15:04 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: identify in this context |
| 15:04 | SrPx | why it does not work with me |
| 15:04 | xeqi | ## = inline lazybot eval, & = standalone lazybot eval |
| 15:04 | gfredericks | you're using identify instead of identity |
| 15:04 | SrPx | ohh sorry |
| 15:04 | gfredericks | ,::foo |
| 15:04 | clojurebot | :sandbox/foo |
| 15:09 | SrPx | ,(isa? java.util.HashMap ::collection) |
| 15:09 | clojurebot | false |
| 15:13 | SrPx | _ulises: I dont get it, (defmulti foo :type) ? :type ? Was not it supposed to be a function ? |
| 15:13 | SrPx | Oh wait |
| 15:13 | SrPx | keywords are functions that work on hashes right |
| 15:14 | _ulises | SrPx: exactly :) |
| 15:14 | SrPx | I get it now! Great! |
| 15:15 | SrPx | Actually this is awesome, thanks! |
| 15:15 | _ulises | SrPx: you can have any function you want instead of :type |
| 15:15 | _ulises | SrPx: as long as you have matching values instead of :image and :character |
| 15:16 | _ulises | SrPx: using class as dispatch function will give you the type dispatch you'd expect in Java for instance |
| 15:16 | SrPx | _ulises: so this does not even need derive etc |
| 15:16 | SrPx | _ulises: sorry, using class? What? |
| 15:17 | _ulises | ##(class "foo") |
| 15:17 | lazybot | ⇒ java.lang.String |
| 15:17 | _ulises | SrPx: that ^^^^ |
| 15:18 | SrPx | so you mean I can .. hmm like, make like, (defmulti inverse class) (defmethod inverse java.lang.String [] ...) to extend java types? |
| 15:19 | _ulises | SrPx: not extend java types, but dispatch based on them |
| 15:19 | SrPx | hmm but why? |
| 15:19 | _ulises | SrPx: that's what you wanted to do originally? |
| 15:19 | _ulises | SrPx: I mean, that was your original question |
| 15:20 | _ulises | SrPx: on a second read, you weren't asking specifically about java types |
| 15:20 | _ulises | SrPx: but that's the usual answer "have a Type1 and a Type2 and then overload based on that" etc. |
| 15:20 | SrPx | I see! |
| 15:23 | SrPx | Should I use keywords, symbols or strings to define the type of my object? {:type :character}, {:type "character"}, etc? |
| 15:24 | gfredericks | using namespaced keywords gives you the derive functionality you were looking for earlier |
| 15:24 | gfredericks | otherwise regular keywords are probably fine |
| 15:25 | gfredericks | if there's any chance this 'type' will be mixing around in other systems then namespacing is safer |
| 15:29 | SrPx | Hmm |
| 15:30 | SrPx | OK, thank you very much. |
| 15:30 | SrPx | Unrelated question, is it possible to make a macro such as $test becomes (foo test)? This would be an reader macro, right? I know clojure does not have those, but I have heard it is possible to implement with some hacking |
| 15:30 | SrPx | a reader* |
| 15:32 | gfredericks | SrPx: I'm not sure what the essence of what you're describing is. it's the '$' expanding, so that $bar becomes (foo bar)? |
| 15:33 | SrPx | Yes, specifially, I'd want $something to expand to a function that would select a html element with id=#something |
| 15:33 | gfredericks | well with a few more characters you could do ($ :something), but that just sidesteps the question |
| 15:34 | SrPx | I know, I'm fine with ($ :something). Just wondering if it would be possible |
| 15:34 | gfredericks | I think the only way to get that kind of concision is if you wrapped your whole code in a (regular) macro that did the replacement; e.g. with-dollar-selectors |
| 15:39 | SrPx | Hmm I see. |
| 15:40 | gfredericks | that's the main limitation of macros; you can do damn near anything, but it has to start with a parenthetical s-expression |
| 15:54 | SrPx | Why it does not provide a reader macro? |
| 15:54 | SrPx | They are so powerful |
| 15:54 | gfredericks | fear of messy syntax? |
| 15:54 | SrPx | Clojure would be perfect with them |
| 15:55 | SrPx | but you should not deny power to the programmer, it is the fundamental of the lisp spirit |
| 15:55 | SrPx | ): |
| 15:56 | gfredericks | what about libraries? |
| 15:56 | SrPx | what? |
| 15:56 | clojurebot | What is meta |
| 15:56 | gfredericks | you could get two libraries that both define the same reader macro |
| 15:57 | SrPx | Libraries should be discouraged to use them, but you should allow the programmer to define it for personal use if he wants to |
| 15:57 | SrPx | libraries can define the same macro anyway, right? |
| 15:57 | gfredericks | no they're always defined in namespaces |
| 15:58 | casion | there is one thing I've learned from using C a lot… if you allow people to do something, even if you strongly advise against it, they will do it |
| 15:58 | casion | and they will do it a lot |
| 15:58 | casion | and they will defend their right to do it |
| 15:58 | casion | and everyone fucking hates it |
| 15:58 | casion | including, eventually, the person who did it |
| 15:58 | gfredericks | :) |
| 16:00 | casion | SrPx: http://clojure-log.n01se.net/date/2008-11-06.html |
| 16:01 | casion | starting at 18:39 |
| 16:02 | gfredericks | casion: (you can link directly to the 18:39) |
| 16:02 | casion | gfredericks: oh… |
| 16:02 | casion | i hate websites that have things like that essentially hidden :| |
| 16:03 | steven123 | posted a question on stackoverflow: why do bindings in REPL not work? http://bit.ly/TX6NKJ |
| 16:03 | casion | when will people learn that not everyone uses a mouse to browse the web |
| 16:03 | steven123 | can anybody help? |
| 16:09 | SrPx | I'm so sad reading that log |
| 16:09 | SrPx | AWizzArd: rhickey: I don't want to convince anyone that reader macros are a good idea in general. But I think that you can't forsee everything, and people might come into situations where 1 or 2 reader macros are really helpful |
| 16:09 | SrPx | To be honest I would live of reader macros for building my own syntax on top of lisp |
| 16:10 | SrPx | I've chosen clojure over cl for many reasons, but the lack of reader macro thing really hurts me ): |
| 16:11 | SrPx | I don't see why you couldn't implement namespace stuff over reader macros, also |
| 16:11 | mpan | clojure convinced me to try a lisp outside an academic context with its interop |
| 16:13 | gfredericks | SrPx: because once you have to specify the namespace of your reader macro you lose all the concision |
| 16:13 | SrPx | it is awesome but having to write ($ "#myid") instead of $myid all around, for example, is a huge difference to be honest |
| 16:14 | gfredericks | chouser had an interesting idea though |
| 16:14 | SrPx | gfredericks: I dont understand it well, if you can define a macro for ($ something), why cant you define a reader macro for strings starting with $? $something |
| 16:15 | gfredericks | oh hmm...what if you could do (ns foo (:reader-macros [some.lib/$ :as $])), and then it would only apply for your namespace |
| 16:20 | SrPx | something like that, I'm not sure, but I'm positive it's possible |
| 16:21 | SrPx | it is the same thing in essence, just that it is a string preceding a symbol, instead of the first string in a s-expression |
| 16:23 | yankov | ,(count ( time (map str (range 10000)))) |
| 16:23 | clojurebot | "Elapsed time: 0.05503 msecs" |
| 16:23 | clojurebot | 10000 |
| 16:24 | spoon16 | /reload style |
| 16:24 | yankov | ,(count ( time (apply str (map str (range 10000))))) |
| 16:24 | clojurebot | "Elapsed time: 33.012849 msecs" |
| 16:24 | clojurebot | 38890 |
| 16:24 | yankov | seriously.. is there a way to make the second one faster? |
| 16:24 | gfredericks | yankov: the first one doesn't do anything |
| 16:25 | gfredericks | that's why it's so fast |
| 16:25 | ivan | can you not write some macro that turns every symbol that starts with $ into two forms? |
| 16:25 | yankov | gfredericks: ah.. |
| 16:25 | gfredericks | ivan: yeah but he'd need a top-level macro call |
| 16:25 | ivan | right |
| 16:25 | gfredericks | ,(time (count (map str (range 10000)))) |
| 16:25 | clojurebot | "Elapsed time: 23.317793 msecs" |
| 16:25 | clojurebot | 10000 |
| 16:26 | gfredericks | 94% of naive clojure benchmarking just times a noop :) |
| 16:26 | yankov | hm.. |
| 16:27 | yankov | anyway, there should be a way to use something instead of apply str. the thing is that server needs to convert seq into a one string before sending it to a client |
| 16:28 | yankov | and that ends up being kinda slow. like 1.5k op/sec for a list of 600 elements |
| 16:28 | xeqi | ,(count (time (let [x (StringBuilder.)] (doseq [s (range 10000)] (.append x s)) (.toString x)))) |
| 16:28 | clojurebot | "Elapsed time: 17.474309 msecs" |
| 16:28 | clojurebot | 38890 |
| 16:28 | gfredericks | xeqi: apply str already uses a stringbuilder |
| 16:29 | gfredericks | yankov: at the very least if you apply str you can get rid of the map str |
| 16:29 | yankov | does amount of arguments passed to str matter? maybe when I pass 600 args that makes it slow? |
| 16:30 | gfredericks | yankov: I wouldn't think so |
| 16:31 | yankov | hm, then it must be my map. in real code it's more complicated than just str |
| 16:31 | yankov | i just benchmarked it wrong |
| 16:31 | gfredericks | yankov: this is an http server? I wouldn't think you'd have to assemble a string before responding |
| 16:31 | yankov | gfredericks: not http. sort of custom protocol |
| 16:32 | gfredericks | even so you ought to be able to do streaming |
| 16:33 | yankov | gfredericks: makes sense. i tried to send a separate response for each elements but it was very slow. but again, i could be doing it wrong |
| 16:34 | yankov | will take a look, thanks |
| 16:46 | spoon16 | stencile (https://github.com/davidsantiago/stencil) or clostache (https://github.com/fhd/clostache) for rendering mustache templates? |
| 16:50 | xeqi | refheap uses stencil, so I'd end up choosing it |
| 16:52 | SrPx | How are :keywords used as functions? I mean how is it possible? I have read something about that but I forgot |
| 16:53 | spoon16 | but why did Raynes choose stencil for refheap… I can't really tell the difference between the two except that the author of stencil implies that performance was important during his development and he has done some profiling |
| 16:53 | spoon16 | I'm leaning towards stencil as well for that reason |
| 16:53 | spoon16 | ,(:test {: test "hello world")) |
| 16:53 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Invalid token: :> |
| 16:53 | jondot` | seeing some new projects for android/clojure - anyone really doing this beyond just playing around? |
| 16:54 | spoon16 | ,(:test {:test "hello world")) |
| 16:54 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )> |
| 16:54 | spoon16 | I'm terrible at using clojurebot |
| 16:54 | spoon16 | ,(:test {:test "hello world"}) |
| 16:54 | clojurebot | "hello world" |
| 16:56 | spoon16 | SrPx: keywords implement IFn with one argument (a map) and an optional second argument (a default value) |
| 16:56 | spoon16 | SrPx: For example (:mykey my-hash-map :none) means the same as (get my-hash-map :mykey :none) |
| 16:56 | spoon16 | SrPx: docs… http://clojure.org/data_structures#Data%20Structures-Keywords |
| 16:57 | SrPx | where is it implemented? hmm |
| 16:57 | SrPx | IFn? |
| 16:58 | spoon16 | IFn is the Java interface that identifies functions in clojure |
| 16:58 | spoon16 | anything that can be used in the operator position of a sexpression implements IFn |
| 16:58 | spoon16 | Keyword is the Java type implemented by all :keyword instances you use in Clojure |
| 16:59 | spoon16 | and Keyword implements IFn so it may be used as an operator |
| 16:59 | spoon16 | SrPx: see the code https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Keyword.java |
| 17:07 | nightfly_ | spoon16: Yay, that explains a very confusing error message I was getting the other day. |
| 17:07 | jballanc | anyone know off-hand what repo/branch the Clojure+Lua work was in? |
| 17:08 | spoon16 | nightfly_: cool, clojure makes way more sense if you spend the time to reference the github repo and really learn all the different data structures… I am still just beginning that process |
| 17:34 | nkoza | What's the simplest way to access a Java class instance protected field? |
| 17:36 | emezeske | nkoza: Maybe 'proxy ? |
| 17:47 | Raynes | spoon16: Performance. Stencil is the fastest spec compliant stencil implementation around. |
| 17:47 | gf3 | My brain is failing me, what's the function to execute an arbitrary amount of expressions and only return the last one's value |
| 17:47 | gf3 | (something x y z) ; z |
| 17:47 | Raynes | gfredericks: do |
| 17:47 | Raynes | It isn't a function. |
| 17:47 | cjfrisz | gf3: do |
| 17:47 | gf3 | Crap |
| 17:47 | Raynes | gf3, not gfredericks |
| 17:48 | cjfrisz | I know Raynes already answered... |
| 17:48 | gf3 | Wrong channel |
| 17:48 | gf3 | SORRY GUYS |
| 17:48 | gf3 | (Looking for Racket) |
| 17:48 | Raynes | lol |
| 17:49 | gf3 | Just FYI, in Racket it's (begin) |
| 17:50 | evhan | gf3: I think it's `begin` in Racket. |
| 17:50 | gf3 | AHEM |
| 17:50 | evhan | gf3: Ah, there you go. |
| 17:58 | nkoza | emezeske: you cant use "proxy" to access protected fields of the parent class :( |
| 17:58 | nkoza | and I dont want to use AOT/gen-class |
| 18:00 | Raynes | nkoza: https://github.com/arohner/clj-wallhack/blob/master/src/wall/hack.clj#L15 |
| 18:01 | Raynes | Oh, fields. There is a function for that too below that one. |
| 18:01 | nkoza | Raynes: thanks |
| 18:06 | spoon16 | you guys know of any other projects like wallhack but generally make reflection and exploration of objects simpler? I'm just looking at libraries that enrich the repl |
| 18:11 | kaoD | hi |
| 18:34 | kaoD | what the hell is going on |
| 18:34 | ohpauleez | kaoD: It's called a netsplit |
| 18:35 | ohpauleez | http://en.wikipedia.org/wiki/Netsplit |
| 18:35 | kaoD | hmm nevermind, those where "Excess Flood" messages |
| 18:35 | kaoD | (completely missed it, but it's not a netplit) |
| 18:41 | alex_baranosky | does anyone know of a Clojure library for turning time durations into English (like "1 day", "2.34 days", etc) |
| 18:42 | gfredericks | "twoish days" |
| 18:43 | Raynes | alex_baranosky: lazybot has an implementation of that. |
| 18:44 | Raynes | alex_baranosky: https://github.com/flatland/lazybot/blob/develop/src/lazybot/utilities.clj#L7 |
| 18:44 | alex_baranosky | Raynes: thanks |
| 18:46 | firesofmay | Hi, can anyone tell me if we can run clojure on raspberry pi? Any idea? |
| 18:46 | gfredericks | man rhickey was all over the IRCs back in the day |
| 18:46 | mpan | firesofmay: pretty much the normal way |
| 18:46 | firesofmay | mpan, have you tried it? |
| 18:47 | mpan | no, but since you can get a regular linux distro on it, the rest of the steps are pretty much the same |
| 18:47 | firesofmay | mpan, I see. |
| 18:47 | spoon16 | firesofmay: if you are running Debian on the Raspberry Pi you can 'sudo apt-get install openjdk-6-jre' |
| 18:47 | ivan | http://raspberrypi.stackexchange.com/questions/91/is-there-a-jdk-with-a-jit-compiler-available |
| 18:47 | mpan | I'm not aware of anything x86 specific along the line |
| 18:47 | mpan | so the same steps should work fine as they do on your regular computer |
| 18:48 | firesofmay | spoon16, mpan ivan I see. Thanks. |
| 18:48 | firesofmay | anyone hacked on raspberry pi here? |
| 19:25 | cjfrisz | Woo, finally published a blog post about how CTCO works |
| 19:25 | cjfrisz | Now I don't have to feel guilty about never blogging |
| 19:25 | cjfrisz | Plus I can write shorter updates about things I figure out how to optimize |
| 19:26 | dnolen | cjfrisz: cool! |
| 19:28 | ohpauleez | definitely cool |
| 19:43 | wei_ | what's the most mature templating and event handling library for clojurescript? |
| 19:57 | one-luck | ok what now? |
| 19:58 | ohpauleez | wei_: What specifically are you looking to do? |
| 20:01 | ohpauleez | most people use some mix of domina, enfocus, singult, crate, and jayq |
| 20:03 | wei_ | I'm trying to listen to clicks on elements with a certain class. tried it with domina just now: (dom/listen! (dom/by-class "thumb") "click" thumb-clicked). but it results in Uncaught TypeError: Cannot call method 'call' of undefined |
| 20:31 | jcromartie | ,(count (time (apply str (range 1e5)))) |
| 20:31 | clojurebot | "Elapsed time: 290.873695 msecs" |
| 20:31 | clojurebot | 488890 |
| 20:32 | jcromartie | just butting in, don't mind me |
| 20:33 | gfredericks | ,(->> 1e5 range (apply str) time count) |
| 20:33 | clojurebot | "Elapsed time: 221.043181 msecs" |
| 20:33 | clojurebot | 488890 |
| 20:34 | muhoo | jcromartie: you can pm the bot |
| 20:35 | muhoo | cjfrisz: link? |
| 20:35 | cjfrisz | muhoo: http://www.chrisfrisz.com/blog/?p=234 |
| 20:54 | wei_ | solved my issue above. I had to import domina.events in addition to domina |
| 20:54 | wei_ | err, require |
| 21:30 | n00b_ | I'm currently looking for the source of the function applyTo - it's in clojure.core, but the definition isn't there and core does not import any other namespaces - how is this possible? |
| 21:31 | n00b_ | relevent link: http://code.google.com/p/clojure/source/browse/trunk/src/clj/clojure/core.clj |
| 21:38 | gert | has anyone tried to integrate Chas Emerick's Friend with a clojurescript app? |
| 21:38 | Raynes | n00b_: That's a Java method, not a Clojure function. |
| 21:39 | Raynes | That is also not the right repository. |
| 21:39 | Raynes | https://github.com/clojure/clojure |
| 21:39 | Raynes | The code.google stuff is so old that it's kinda magical you found it and not the git repo. |
| 21:40 | brehaut | gert: cemerick might have ;) |
| 21:42 | n00b__ | In the implementation of apply there is a fn applyTo - however when I look for it in core I find nothing, and no imports. How is this possible?/where does this fn come from? |
| 21:42 | cemerick | gert: ClojureScript is just a library in a browser as far as Friend is concerned. |
| 21:43 | gert | I know |
| 21:43 | gert | :) |
| 21:44 | gert | I'm trying to come up with a proper workflow/architecture for a clojurescript app + Chris Granger's Fetch + cemerick's Friend |
| 21:44 | xeqi | that does take some work |
| 21:44 | xeqi | fetch + friend |
| 21:45 | gert | I think I'm close to getting something working, but it's a bit messy at the moment. I was just wondering if anyone else has done anything authentication-related in cljs |
| 21:45 | xeqi | gert: https://github.com/xeqi/friend-fetch-example has a working example, but I really need to get back and clean it a bit |
| 21:46 | gert | oh! |
| 21:46 | gert | thanks xeqi, I'll check that tout |
| 21:46 | gert | *out |
| 21:46 | xeqi | hmm, might make a good blog post too |
| 21:47 | cemerick | xeqi: that's a *really* hard way to do it |
| 21:47 | gert | I'm basically doing an xhr post request to a login url that gets intercepted by Friend. That part, and the authentication, works. |
| 21:47 | gert | I just need to return a result |
| 21:47 | xeqi | ah, then fetch doesn't matter much in that case |
| 21:47 | ohpauleez | xeqi: If you're going to use fetch to authenticate, I suggest you replace it with Shoreleave's remotes |
| 21:48 | cemerick | gert: just make a request to a non-fetch URI in order to obtain an authenticated session, and then all of your RPC after that point with the same host will carry those credentials. |
| 21:48 | ohpauleez | to get CSRF protection and proper XSS handling |
| 21:49 | xeqi | ohpauleez: heh, I would look at shoreleave and cemerick's ring-remote; not a particular fan of noir/fetch, that was just a one off |
| 21:49 | gert | xeqi: I'm using fetch with Compojure |
| 21:49 | gert | it's trivial to replace the noir defpage with a route that calls call-remote |
| 21:50 | gert | it'd be easy to remove any dependency on noir or compojure from fetch |
| 21:50 | cemerick | gert: doing so would leave you with shoreleave remotes, essentially. |
| 21:50 | cemerick | (AFAICT, I never used fetch myself) |
| 21:51 | gert | cemerick: ohpauleez: I guess it's time for me to have a closer look at Shoreleave. :) |
| 21:51 | ohpauleez | xeqi: Ahh gotcha. I actually have a few key issues with Noir, but I haven't sat down to rework some ideas I have |
| 21:51 | ohpauleez | gert: Enjoy the rabbit hole! |
| 21:52 | ohpauleez | In all honesty, the code is pretty straight forward - it really is all the grunt work you'd end up doing for a decent CLJS app |
| 21:53 | gert | ohpauleez: cheers! it's been a joy so far. I'll see how far I get with Shoreleave. this is the beginning of a fairly complex client side app and it's all very exciting. :) |
| 21:53 | ohpauleez | gert: Awesome to hear it! I've had a blast working on CLJS stuff and a lot of success. I have some pretty interesting metrics to share at the Conj |
| 21:54 | Raynes | ohpauleez: What are the key issues? |
| 21:54 | ohpauleez | Raynes: With? |
| 21:54 | ohpauleez | Noir? |
| 21:54 | clojurebot | noir is great |
| 21:54 | Raynes | You said you have some key issues with Noir. Just curious what they are. |
| 21:55 | gert | ohpauleez: awesome! if I wasn't all the way in New Zealand I'd go to Conj. Or if my startup had the funds to send me. Maybe next year. :) |
| 21:56 | ohpauleez | ahh yeah - so i think the pieces you've pulled out into other libs lib-noir and the other one for looking across classpath stuff are awesome. It opens up the door for using metadata on functions rather than stateful atom bashing |
| 21:56 | ohpauleez | really |
| 21:56 | ohpauleez | I just don't want a macro for my functions, I want real functions. And the style of using an atom gets the job done, but I'm not sure it's totally needed |
| 21:57 | ohpauleez | that said, I really haven't dug deeper |
| 21:57 | xeqi | ohpauleez: did you ever publish the todoMVC example mentioned on http://www.pauldee.org/blog/2012/production-clojurescript/ ? |
| 21:57 | ohpauleez | or tried my hand at it, so please take it with a huge grain of salt |
| 21:57 | Raynes | ohpauleez: I agree regarding the statefulness of noir. But once you pull that away, you get compojure. So, I've just been using compojure and lib-noir lately. |
| 21:57 | ohpauleez | xeqi: No, but there is a decent demo linked from Shoreleave's github |
| 21:58 | ohpauleez | Raynes: ahhh cool. That was my thought at well. And I think you could still auto build routes via reflection on metadata, I'm not sure if that's a good idea or not |
| 21:59 | cjfrisz | Anybody else amused that the "call for presentations" is still up on the Conj site? |
| 21:59 | cjfrisz | And also dying for a comprehensive list of who all is speaking and about what? |
| 21:59 | xeqi | cjfrisz: not surprised; was told the list of presentations should have been up at the end of last week |
| 22:00 | ohpauleez | cjfrisz: side note - great blog post |
| 22:00 | SegFaultAX | What's lib-noir? |
| 22:00 | Raynes | xeqi: I was told that it was put up next week. The Doctor doesn't usually lie about these things. |
| 22:00 | Raynes | $google lib-noir |
| 22:00 | lazybot | [noir-clojure/lib-noir · GitHub] https://github.com/noir-clojure/lib-noir |
| 22:01 | cjfrisz | ohpauleez: Thanks! I really appreciate feedback. |
| 22:04 | xeqi | Raynes: but rule 1... |
| 22:05 | duck1123 | don't wander off |
| 22:05 | xeqi | the other rule number one |
| 22:05 | duck1123 | sorry, wrong Doctor |
| 22:06 | ohpauleez | What is rule number one? I'm trying to remember |
| 22:06 | InternetFriends | now you're going to die |
| 22:06 | xeqi | ohpauleez: http://tardis.wikia.com/wiki/The_Doctor%27s_Rules |
| 22:07 | duck1123 | Eleven's rule #1 is "the doctor lies" |
| 22:07 | ohpauleez | Ahh yes, the doctor lies |
| 22:08 | ohpauleez | the only one I remember is the last one, "Time is not the boss of you" |
| 22:09 | duck1123 | ahh, speaking of... I need to go watch the new one still. night all |
| 22:24 | jkdufair | would anyone have any idea why a sequence i've obtained via a jdbc query would not cause the body of my map fn to execute but can be materialized via doseq? |
| 22:25 | ohpauleez | map is lazy, and nothing is forcing its execution |
| 22:25 | jkdufair | ah! |
| 22:25 | ohpauleez | when you doseq, you realize the entire sequence, making the map (and map fn) happen |
| 22:25 | jkdufair | didn't know map was lazy |
| 22:25 | jkdufair | thank you! |
| 22:25 | ohpauleez | totally welcome! |
| 22:27 | jkdufair | heh. read right past "lazy" in (doc map) |
| 22:28 | cjfrisz | Well, I'll be |
| 22:28 | cjfrisz | I somehow never noticed that, either |
| 22:29 | jkdufair | also, args are all passed by ref, yes? |
| 22:30 | ohpauleez | jkdufair: reduce is lazy too, as are things like keep, remove, etc |
| 22:31 | jkdufair | super. makes total sense. i just hadn't realized my seq yet and couldn't figure out why my damn debug stmts weren't happening |
| 22:31 | Scriptor | ohpauleez: how is reduce lazy? |
| 22:31 | ohpauleez | jkdufair: you can always force realization if you need to bring everything into ram |
| 22:32 | jkdufair | no i actually don't |
| 22:32 | ohpauleez | Scriptor: I'm almost certain it is, no? |
| 22:32 | casion | I don't think reduce is |
| 22:32 | Scriptor | ohpauleez: it can't be, because it doesn't always return a lazy seq |
| 22:32 | ohpauleez | Ohh right |
| 22:32 | ohpauleez | duh |
| 22:32 | Scriptor | reductions is lazy, however |
| 22:37 | jkdufair | ohpauleez: you broke thru a 2 day logjam i had. whew. i love clojure |
| 22:37 | mpan | yea, I got hit really hard by that recently |
| 22:38 | casion | speaking of logjams… after all the screwing around with clojure.xml, clojure.zip, clojure.data.zip/xml, clojure.data.xml |
| 22:38 | mpan | but I figure, it's the sort of wall you run into once, and in the future you remember to consider it |
| 22:38 | casion | the answer was to just use enlive |
| 22:38 | casion | which seems to work correctly and very easly |
| 22:38 | mpan | what did you want to do? |
| 22:38 | casion | parse, modify and render xml |
| 22:38 | mpan | I think I'm gonna need to generate xml tomorrow or the day after |
| 22:39 | jkdufair | i'm rather enjoying enlive |
| 22:39 | casion | spent 4 days working on it, searching, searching irc logs and asking questions in here |
| 22:39 | jkdufair | my app is primarily a web scraper and enlive makes things very straightforward |
| 22:40 | mpan | wait, how does enlive help you with taking in xml? |
| 22:40 | casion | mpan: it has xml-resource |
| 22:40 | casion | which uses the sax parser |
| 22:40 | mpan | but nicer than using sax directly, I hope? |
| 22:40 | casion | same as clojure.xml iirc |
| 22:40 | casion | yes |
| 22:40 | mpan | awesome thanks |
| 22:40 | casion | the biggest benefit is that it has xpath-like element referencing |
| 22:41 | casion | with css syntax |
| 22:41 | casion | AND it renders properly |
| 22:41 | casion | which clojure.xml does not do |
| 22:41 | mpan | wait, which part doesn't it? |
| 22:41 | mpan | should I use that and not clojure.xml, then? |
| 22:42 | casion | clojure.xml does not render properly |
| 22:42 | mpan | render as in? |
| 22:42 | casion | it has issues with whitespace and character entities |
| 22:42 | casion | render, print, emit |
| 22:42 | mpan | ok |
| 22:42 | mpan | thanks |
| 22:42 | casion | the process of tree -> xml |
| 22:43 | casion | enlive doesn't support xml namespaces though |
| 22:43 | casion | but that's not an issue for me |
| 23:07 | spoon16 | does hiccup support namespaced attributes on output? |