2012-09-07
| 00:02 | Frozenlock | Err.. how does one do this in cljs?: goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_ISO; |
| 00:03 | Frozenlock | I was thinking of bindings, but the variable isn't declared as dynamic |
| 00:05 | xeqi | (set! goog.i18n/DateTimeSymbols goog.i18n/DateTimeSymbols_en_ISO) ? |
| 00:06 | tomoj | djanatyn: thanks for what? |
| 00:06 | tomoj | I was going to recommend (zero? x) instead of (= 0 x) |
| 00:12 | Frozenlock | xeqi: Thanks! (still untested). Is there the same function in clj? I don't remember ever using it! o_O |
| 00:13 | xeqi | Frozenlock: you can use set! to change public fields in java, but its rare to see them |
| 00:14 | xeqi | that was a guess btw, but I imagine its something similar |
| 00:15 | xeqi | I'm using it to play with three.js |
| 00:16 | Frozenlock | It does work, thank you very much :) |
| 00:20 | Frozenlock | Oh wow, the demos are impressive! |
| 00:44 | dansalmo | Is there a way to bind a symbol during run time based on an evaluation besides using (load-string (str "(def "... |
| 00:45 | tomoj | why? |
| 00:45 | clojurebot | Why is the ram gone is <reply>I blame UTF-16. http://www.tumblr.com/tagged/but-why-is-the-ram-gone |
| 00:47 | tomoj | wat? |
| 00:47 | clojurebot | For Jswat: start clojure with -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 |
| 00:47 | tomoj | othx |
| 00:53 | dansalmo | Can list of symbols '(x y z) be defined at run time? |
| 01:00 | oyvindn | hmm, why is up to 5 arguments explicitly defined for "apply" with & args and not just args used (the first signature)? |
| 01:04 | antares_ | dansalmo: (list (symbol "x") (symbol "y") (symbol "z")) |
| 01:05 | antares_ | ,(list (symbol "x") (symbol "y") (symbol "z")) |
| 01:05 | clojurebot | (x y z) |
| 01:39 | dysinger | Is there an easier way to go from an EntrySet to a hash than this ? (reduce conj {} (.entrySet {:one 1 :two 2})) |
| 01:39 | dysinger | ,(reduce conj {} (.entrySet {:one 1 :two 2})) |
| 01:39 | clojurebot | {:two 2, :one 1} |
| 01:40 | tomoj | reduce conj is into |
| 01:40 | dysinger | thanx |
| 01:40 | dysinger | that's better |
| 01:40 | dysinger | I'm uber rusty :) |
| 01:41 | tomoj | where'd you get an entryset? |
| 01:41 | dysinger | java interop |
| 01:41 | tomoj | ah |
| 01:45 | samrat | in noir, how do I set up routes so that calling a route with params sends a different respnse than without params |
| 01:45 | samrat | like /api would redirect to api-docs, but /api?url=.. would respond with json |
| 01:46 | samrat | can I do this without using if; something like function overloading? |
| 01:47 | tomoj | "without using if" is a strange requirement |
| 01:48 | samrat | tomoj: no, I just wanted to know if it was possible |
| 01:51 | amalloy | samrat: lambdas are turing complete; anything is possible |
| 01:52 | muhoo | ok, weird (for [i bar] (apply hash-map i)) works, but (map #(apply hash-map) bar) pukes |
| 01:52 | muhoo | aren't they the same thing? |
| 01:52 | tomoj | #(apply hash-map) is nullary |
| 01:53 | muhoo | oh, duh % |
| 01:53 | muhoo | (map #(apply hash-map %) bar) works, sorry for noise |
| 01:54 | tomoj | is consensus that defpage is not evil? |
| 02:01 | dansalmo | antares_: I'm sorry, I meant is there a way to bind a value to each symbol in the list of symbols '(x y z) |
| 02:02 | antares_ | ,(let [x y z] [1 2 3] y) |
| 02:02 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: let requires an even number of forms in binding vector in sandbox:> |
| 02:02 | antares_ | ,(let [[x y z] [1 2 3]] y) |
| 02:02 | clojurebot | 2 |
| 02:03 | dysinger | argh I'm so rusty - what's the clojure equiv to haskell flip again ? |
| 02:03 | dansalmo | The symbols are in the list received as input, not avail during compile |
| 02:04 | dansalmo | the symbols in the list are not available until the program is running. |
| 02:04 | antares_ | dysinger: (apply f (reverse args)) is the best I can think of |
| 02:05 | dansalmo | Can you show me a form that uses the list '(x y z)? |
| 02:06 | dansalmo | , (def (last '(x y z))) |
| 02:06 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 02:06 | antares_ | dansalmo: I am afraid there is no such thing |
| 02:07 | dansalmo | ok, thanks |
| 02:07 | antares_ | dansalmo: if you know the structure of your list of values, my example with let will still work |
| 02:07 | antares_ | ,(let [xs '(1 2 3) [x y z] xs] y) |
| 02:07 | clojurebot | 2 |
| 02:08 | dansalmo | my list is a list of undefined symbols, that I would like to define |
| 02:11 | antares_ | dansalmo: but you know the structure of the list of values? |
| 02:12 | antares_ | if you don't, I am not sure how you would use those locals later |
| 02:12 | antares_ | dansalmo: consider using a map instead |
| 02:12 | antares_ | it has exactly the key/value relationship you need |
| 02:14 | dansalmo | , (let [[x y z] [1 2 3]] (map eval '(x y z))) |
| 02:14 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 02:15 | dansalmo | this form picks up values from outside the form |
| 02:15 | amalloy | no it doesn't. it just breaks |
| 02:16 | dansalmo | actually, my list is nested, with repeated symbols, '(x z (y z)) |
| 02:16 | dansalmo | you mean the form is not valid? |
| 02:22 | dansalmo | ' (let [[x y z] [1 2 3]] [(eval y)]) |
| 02:22 | dansalmo | ,(let [[x y z] [1 2 3]] [(eval y)]) |
| 02:22 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 02:22 | antares_ | eval is disabled for clojurebot |
| 02:23 | dansalmo | this works, but I can not eval the list |
| 02:23 | antares_ | dansalmo: instead of trying to do that just use maps |
| 02:23 | dansalmo | but I think what I am trying to do would have duplicate keys |
| 02:24 | antares_ | dansalmo: use a proplist https://github.com/michaelklishin/chash/blob/master/src/clojure/clojurewerkz/chash/proplists.clj but what you are trying to do is crying for associative data structures |
| 02:25 | dansalmo | thanks, I will look at this |
| 02:48 | dansalmo | antares: nested list of maps ( {:x '()} {:z '()} ( {:y '()} {:z '()} ) ) and list of keys with new values '(:x '1 :y '2 :z '3) will work |
| 02:48 | dansalmo | I just need to figure out the most efficient way to apply the new values |
| 02:49 | dansalmo | antares_: nested list of maps ( {:x '()} {:z '()} ( {:y '()} {:z '()} ) ) and list of keys with new values '(:x '1 :y '2 :z '3) will work |
| 02:50 | dansalmo | can not map a func to a nested list |
| 02:51 | dansalmo | antares_: thanks for the help, I think it will work. |
| 02:52 | antares_ | dansalmo: nice |
| 03:24 | kral | 'morning (here) |
| 04:33 | andersf_ | g'morning (there) |
| 04:38 | ro_st | not for long! |
| 04:38 | ro_st | anyone using datomic and can answer questions about how to go about writing maps of data to it? |
| 04:44 | AustinYun | ro_st: elaborate? |
| 04:45 | ro_st | so it allows you to make arbitrary entities and then pin attributed values to it |
| 04:46 | ro_st | i'm wondering if anyone's gone through the process of taking a map of data and converted it into a series of datomic calls, and how that process went |
| 04:48 | ro_st | eg, how to sanely and clearly marry keys in the map to attributes in the schema. simplest would be to use attribute idents in the map, but if, say you don't want to expose that information, due to the map coming in off the web, there'd need to be some lookups or whatever to link them together |
| 04:48 | ro_st | this is more of an opinion-about-approach question than a how-do-i? question |
| 04:55 | AustinYun | so youre getting a map of kvps from the internet, and you want to update an entity in datomic? or add to the schema? |
| 04:56 | ro_st | add/update an entity in datomic |
| 04:57 | ro_st | the use case is storing client-side user events. clicked this button, checked that box, visited this url, entered that text. |
| 04:58 | AustinYun | and why dont you want to use the datomic attributes in the map you get from clients? |
| 04:59 | ro_st | i'm not sure :-) some vague idea that it might be prudent not to |
| 05:04 | ro_st | ok. i need to play more and pontificate less, obviously |
| 05:05 | AustinYun | well if you insist on basically translating the db keys to something else for the client, it seems the path of least resistance would be to write a translation fn that takes a client map, reduces through the keys and translates them, and then sends that off as a datomic transaction (also a map) |
| 05:05 | AustinYun | but i seriously must be missing something here and im well known as an idiot |
| 05:06 | ro_st | yes. my idiocy is that i haven't actually spent time in the repl with datomic yet. i'm sure that when i do, it'll all fall into place |
| 05:07 | AustinYun | i only started messing with it last week, so... |
| 05:09 | ro_st | what do you think, so far? |
| 05:09 | AustinYun | i'm testing it out because it seems like a natural fit for what i'm trying to do because of the way it deals with time |
| 05:13 | AustinYun | so far the whole immutable, simple data structures, which are also transactions, thing seems really cool |
| 05:14 | ro_st | yeah. i'm very enthusiastic |
| 05:16 | AustinYun | basically the fact that database transactions are just vectors of facts, is <3 |
| 05:16 | AustinYun | ro_st: https://gist.github.com/2635666 was interesting to me |
| 05:16 | AustinYun | comes from http://pelle.github.com/Datomic/2012/07/09/transactions-as-entities/ |
| 05:19 | ro_st | very cool |
| 05:20 | ro_st | gotta go! |
| 05:22 | clgv | ,(doc dissoc-in) |
| 05:22 | clojurebot | No entiendo |
| 05:22 | clgv | :/ |
| 05:22 | clgv | there is assoc-in but not dissoc-in? |
| 05:25 | jml | say I've got a vector of [x y] pairs and I want to filter on the 'x' bit, is there a more idiomatic way than (filter (fn [[x y]] (predicate? x)) x-y-pairs) |
| 05:26 | clgv | jml: (filter #(-> % first predicate?)) will work too with less pain |
| 05:27 | jml | clgv: ah, thanks. |
| 05:27 | jml | I confess I still have a bit of trouble reading '->' |
| 05:28 | jml | clearly I need to spend more time reading & writing clojure code :) |
| 05:30 | clgv | jml: it's semantically like piping ^^ |
| 05:30 | AustinYun | so, on the tools side of things for writing clojure |
| 05:30 | clgv | with sequences it's ofter pretty handy to use ->> |
| 05:31 | AustinYun | i use vim normally but paredit is too nice to pass up -- anyone write keybindings for evil mode in emacs to rebind vim's movement keys to paredit ones? |
| 05:31 | jml | clgv: or like composition, but backwards! |
| 05:31 | jml | clgv: looking up ->> now. |
| 05:32 | AustinYun | jml: ->> is basically ->, but puts stuff last instead of second |
| 05:33 | jml | AustinYun: thanks. |
| 05:35 | AustinYun | it's hard to google for operator names sometimes :p |
| 05:36 | jml | yeah. and the description in the API docs is rather technical. |
| 05:39 | AustinYun | jml: http://clojuredocs.org/clojure_core/clojure.core/-%3E%3E#example_191 |
| 05:43 | AustinYun | -> is ridiculously useful for accessing stuff from nested data structures, ->> more for chaining functions in my experience |
| 05:45 | AustinYun | (-> person :emplyer :address :city) is like person.employer.address.city in javascript or something |
| 05:46 | AustinYun | it literally never occurred to me to use -> to go through data structures until i read the docs, lol |
| 05:46 | jml | AustinYun: yeah, I've seen it mostly used for that in the stuff I've read. |
| 05:46 | AustinYun | i was like, "that's so clever! I'm an idiot for not thinking of that" |
| 05:47 | jml | I guess a lot falls out from keywords being functions. |
| 05:47 | AustinYun | the keyword <-> data structure function relationship is really useful |
| 05:53 | weavejester | Hm, the latest released versions of Lamina/Aleph seem to be incompatible in places. |
| 05:55 | weavejester | Or maybe the class names are misleading. Perhaps the ResultChannel is actually a pipeline in 0.5.0 |
| 05:55 | AustinYun | man if nobody's done a vim keybinding thing for emacs' paredit, i'm going to have to do it :\ |
| 05:56 | AustinYun | i can't stand the emacs chords for moving around |
| 05:56 | weavejester | There's evil mode, which doesn't have bindings for paredit, but is quite customisable |
| 05:56 | weavejester | However, Vim and paredit operate under two fundementally different philosophies |
| 05:57 | weavejester | Vim is all about action + movement |
| 05:57 | weavejester | While paredit treats the document as a tree |
| 05:58 | AustinYun | im actually using evil and paredit right now and the keyboard shortcuts kind of step on eachother, especially with xmonad |
| 05:58 | AustinYun | since M-( moves my friggin emacs window to workspace 9 lol |
| 06:00 | pyr | hey everyone, just to let you know that there is now a leiningen plugin in jenkins |
| 06:02 | AustinYun | i was thinking about for example, in evil normal mode, rebinding ( and ) to paredit-backwards and paredit-forwards |
| 06:03 | weavejester | AustinYun: That'll work so long as you don't treat them as proper movement keys |
| 06:03 | weavejester | AustinYun: i.e. d) will probably not work |
| 06:09 | mpenet | weavejester: just curious, what is the issue with pipelines/result-channel ? |
| 06:10 | weavejester | mpenet: In 0.4.0 result-channel seemed to be a type of channel, but in 0.5.0 I think it's a pipeline |
| 06:14 | AustinYun | odd |
| 06:14 | mpenet | it is a separate type now, I dont think it's built on top of pipelines. But yes, 0.5.0 is almost a total rewrite in this respect I think |
| 06:15 | AustinYun | paredit-forward/backward outright do not work correctly in evil mode |
| 06:15 | AustinYun | but to the extent they DO work, they work properly as movement commands |
| 06:16 | weavejester | mpenet: It works like a pipeline anyway. merge-results works on the output of http-request |
| 06:16 | AustinYun | for some reason paredit-forward won't properly move from top level sexp to top level sexp, and paredit-backward basically just is move backwards by a word it seems |
| 06:16 | mpenet | yep, pipelines return a result-channel so that makes sense |
| 06:18 | weavejester | mpenet: Do you know if there's a function in aleph for reading netty ChannelBuffers? |
| 06:18 | weavejester | mpenet: That's what's returned for the body of the http response |
| 06:18 | mpenet | weavejester: probably in aleph.formats, not sure though |
| 06:18 | weavejester | mpenet: Ah, thank you! |
| 06:19 | mpenet | there are a couple apparently |
| 06:20 | mpenet | weavejester: you can also use :autotransform depending on what you are doing |
| 06:20 | weavejester | Like (http-request {:method :get :url url :autotransform true}) ? |
| 06:21 | mpenet | almost: :auto-transform true |
| 06:22 | mpenet | but yes |
| 06:22 | weavejester | mpenet: Ah, perfect |
| 06:23 | weavejester | mpenet: Well, except that I probably want to filter out content types, so I probably don't want them as strings right away |
| 06:23 | weavejester | But channel-buffer->string works |
| 06:23 | mpenet | I think auto-transform checks for json and a couple of others |
| 06:28 | weavejester | mpenet: Do you know how you'd catch errors in an Aleph http-request ? |
| 06:28 | mpenet | weavejester: it seems it decodes the body for text json and xml content-types, and returns the raw body if unknown |
| 06:28 | weavejester | Ohh, wait, on-realized |
| 06:29 | mpenet | weavejester: it s just result channels, so you can use on-realize from lamina or run-pipeline |
| 06:29 | weavejester | mpenet: Can the callbacks on on-realized return a result, do you know? |
| 06:29 | mpenet | I almost always end up using run-pipeline |
| 06:29 | weavejester | mpenet: i.e. return the response on success, nil if not. |
| 06:30 | mpenet | weavejester: I wouldn't think so, you will need to check the status yourself |
| 06:30 | weavejester | mpenet: Ah, no, they do! :) |
| 06:31 | mpenet | oh, interesting |
| 06:31 | weavejester | mpenet: (on-realized response identity (constantly nil)) |
| 06:31 | mpenet | weavejester: ah yes like this |
| 06:31 | weavejester | Now I just need to figure out how to apply that to merge-results |
| 06:31 | weavejester | Oh, unless it already works... |
| 06:31 | mpenet | weavejester: but this wont work in practice |
| 06:32 | weavejester | mpenet: Hm? Why not? |
| 06:32 | mpenet | weavejester: 404 for instance wont emit an error |
| 06:32 | mpenet | weavejester: the response completed successfully (no exceptions etc), you will have to check the status in the success handler or in a pipleline stage |
| 06:33 | mpenet | weavejester: to be double checked, but I think that is how it works |
| 06:33 | Cheiron | Hi, would you please have a look at this macro http://pastie.org/4679152 |
| 06:33 | weavejester | mpenet: But in on-realized you supply a success and failure callback, right? |
| 06:33 | weavejester | mpenet: So if the success is identity, and the failure is (constantly nil) that should work? |
| 06:34 | mpenet | weavejester: yes, but result-channel failure and http response error code arent the same thing |
| 06:34 | mpenet | weavejester: you wont get 500 errors 404 etc as an error |
| 06:35 | weavejester | Cheiron: You need to "~" the first request on line 2. Also, you could maybe use a function instead of a macro? |
| 06:35 | weavejester | mpenet: Oh yeah |
| 06:36 | weavejester | mpenet: I'll make sure anything with a status >= 400 is converted to nil |
| 06:36 | Cheiron | oh, true |
| 06:37 | mpenet | weavejester: yup, if you are in a pipeline you can throw an error to trigger the error handler, not sure that is what you want to do though |
| 06:38 | weavejester | mpenet: Hm, merge-results returns nil if there are any errors in its components. That makes sense, but... |
| 06:38 | weavejester | I can use on-realized to realize a single result |
| 06:39 | weavejester | But I really want to realized many at once |
| 06:39 | Cheiron | sorry but what is wrong this time? http://pastie.org/4679182 |
| 06:39 | mpenet | weavejester: imo it might be better just to check that in a pipeline stage and return (complete nil) if the http code >= 400 |
| 06:40 | weavejester | mpenet: Yeah, but I'm more thinking about how to handle exceptions like connection errors |
| 06:40 | mpenet | weavejester: what do you mean by realize many at once? parallelization of queries? |
| 06:40 | weavejester | mpenet: Well, many HTTP requests can be made in parallel with NIO |
| 06:44 | weavejester | I wonder if I could do it by having... |
| 06:44 | weavejester | (task (on-realized response indentity (constantly nil))) |
| 06:44 | mpenet | weavejester: yes, but this is handled by aleph under the hood, not sure what you mean. If you want some way to manage the responses (like handle then in the order they come back etc), you might want to use a channel or some sort of queue |
| 06:45 | weavejester | mpenet: I want to kick off N http-requests and discard the results of those that except. |
| 06:45 | mpenet | weavejester: you dont need task I think, http-request is non blocking by default, as long as you dont deref it straight away |
| 06:46 | weavejester | mpenet: Right, but how do I merge the results? |
| 06:46 | weavejester | mpenet: If I do (merge-results good-resp bad-resp) then it will error for the whole |
| 06:47 | weavejester | mpenet: "If any of the inputs are realized as an error, the async-result returned by merge-results will also be realized as that error." |
| 06:49 | mpenet | weavejester: you could use a channel where you enqueue the responses only if they are valid, and from there I think you can use fns (like reduce*) to do the merging |
| 06:50 | weavejester | mpenet: Hm, yes, that's a good idea... |
| 06:51 | weavejester | I'm still getting used to thinking in terms of channels :) |
| 06:51 | mpenet | weavejester: there might be some higher level solution in Lamina to handle that, not sure |
| 06:52 | weavejester | mpenet: There's a join function that operates on channels, which I assume joins two channels into one. But… wait, I don't need that I don't think. |
| 06:52 | weavejester | mpenet: I mean, I just need one channel for the results |
| 06:53 | weavejester | mpenet: And the on-realized will enqueue on success and do nothing on error |
| 06:53 | weavejester | mpenet: Then I just consume the channel |
| 06:53 | mpenet | weavejester: exactly |
| 06:53 | mpenet | weavejester: that is how I would do it I think |
| 06:54 | weavejester | mpenet: I think you're right. I'm just too used to thinking functionally :) |
| 06:56 | mpenet | weavejester: there is some necessary evil in channels :) |
| 07:05 | Cheiron | sorry, network problems. what is wrong with this macro? http://pastie.org/4679301 |
| 07:08 | mpenet | Cheiron: you need to quote what you want to expand |
| 07:09 | mpenet | (macroexpand-1 '(resource-operations request :get get-fn)) |
| 07:09 | mpenet | Cheiron: also it seems the cond could be rewritten with case, avoiding some repetitions |
| 07:10 | Cheiron | why calling (resource-operations request :post get-fn) is giving: CompilerException java.lang.IllegalArgumentException: Can't call nil, compiling:(NO_SOURCE_PATH:14) |
| 07:12 | Apage43 | grumble |
| 07:12 | mpenet | Cheiron: get-fn is nil as the Exception suggests |
| 07:12 | Apage43 | trying to get at a java method that has both an int and a string overload |
| 07:12 | Apage43 | specifically, trying to get the int form |
| 07:12 | Apage43 | but it always winds up looking for a Long or long form, and not finding the right overload |
| 07:13 | Sgeo | Has anyone in here used JNAerator to make a Java wrapper for a C library and then used it from Clojure? |
| 07:13 | Apage43 | even if I wrap it in (int) |
| 07:13 | Sgeo | Because I'm planning on doing something like that soonish |
| 07:15 | Apage43 | .. fixed it |
| 07:32 | grayzone | hello to all : can anyone describe what is significate of[ #^Atrribute attr ] |
| 08:13 | Cheiron | for (defn resource-operations [request & {:keys [get post put delete head]}]) , is it possible to assign a name to the last named args map? |
| 08:17 | Cheiron | yes it is |
| 08:17 | Cheiron | :as |
| 08:34 | pepijndevos | What is the difference between the BitmapIndexedNode and the ArrayNode? |
| 08:34 | pepijndevos | |
| 08:41 | pepijndevos | (in the implementation of PersistentHashMap) |
| 08:53 | bosie | i have a weird question as i am new to FP. how do i iterate through a list and keep information from previous entries at hand |
| 08:53 | bosie | in java i would simply use state to do it |
| 08:54 | hoeck1 | bosie: depends on the kind of information you need |
| 08:55 | bosie | hoeck1: information i extract from previous entries |
| 08:55 | hoeck1 | bosie: using reduce, you can keep and return single value |
| 08:55 | bosie | hoeck1: at the moment its up to 9 values |
| 08:55 | bosie | of a different type |
| 08:55 | cmiles74 | bosie: well, you could build up a map or a vector or something. |
| 08:55 | hoeck1 | with partition and partition-by in combination with map, you can access the n+1 or n-1 elements while mapping over a sequence |
| 08:56 | bosie | cmiles74: which i return plus the map i am already returning? |
| 08:56 | bosie | hoeck1: yes but i don't want to access elements. i want to access my distilled information, otherwise the algorithm would be n^2 instead of n |
| 08:56 | cmiles74 | bosie: It's messy, but you could do that. |
| 08:57 | bosie | cmiles74: wouldn't that double the memory requirement? |
| 08:57 | bosie | cmiles74: since each iteration stores two instead of 1 map? |
| 08:57 | hoeck1 | bosie: if its a tuned imperative algorithm, I personally wouldn't bother to convert it to FP style and just use (loop [] .. recur) to keep it fast |
| 08:57 | cmiles74 | bosie: I don't wnat to argue too hard for this map in map thing. I was trying to say, you could build up your data structure through your use of reduce. I typed too slow, hoeck1 beat me to it. |
| 08:58 | bosie | cmiles74: oh no i just wanna know how i would code a similar usecase in clojure in the future |
| 08:58 | bosie | hoeck1: hmmm so there is no 'design pattern' for such use cases for FP? |
| 08:59 | Hodapp | I'm of the really pejorative opinion that design patterns are workarounds for weak languages... |
| 08:59 | bosie | Hodapp: well |
| 08:59 | hoeck1 | bosie: there is, as cmiles74 suggested, using reduce and a map to store the loops state, but it may be inefficient and slower than the loop |
| 08:59 | bosie | Hodapp: so how do i solve my use case? ;) |
| 09:00 | bosie | Hodapp: there is no way clojure has no design patterns |
| 09:00 | hoeck1 | bosie: maybe paste your code somewhere? |
| 09:01 | bosie | hoeck1: i have none as i don't know how to start…. |
| 09:01 | bosie | hoeck1: i will try the reduce/map one |
| 09:01 | hoeck1 | or the algorithms pseudocode? or the java version of it? |
| 09:01 | bosie | oh you don't wanna see the java version of it ;) |
| 09:02 | cmiles74 | Myself, I use reduce to pull the bits I want out of a larger sequence (or map) and loop if I really am not reducing, for instance, when dealing with Java objects or something more complicated. |
| 09:02 | hoeck1 | bosie: :), and what about simplified pseudocode? |
| 09:02 | bosie | ok lemme try |
| 09:02 | grayzone | Hello everyone, I'm new to clojure and I can not find the meaning of the characters # ^ Attributes, in the line: (startElement [uri local-name name-q # ^ Attributes atts] by xml.clj |
| 09:03 | cmiles74 | grayzone: I believe that is hinting that the "atts" value is of the Java class Attributes. |
| 09:05 | grayzone | thanks cmiles74 ... at least now I have a track to follow |
| 09:05 | cmiles74 | grayzone: Perhaps I read to fast, a hint is usually in the form (let [^Attribute atts] ...)... |
| 09:06 | cmiles74 | Yes, that is a type hint. :) https://github.com/clojure/clojure/blob/master/src/clj/clojure/xml.clj#L35 |
| 09:07 | grayzone | ok |
| 09:07 | nz- | how to get line numbers in emacs to start of every line? there is line-number-mode that puts number to bottom of each buffer |
| 09:09 | chronno | nz-: M-x global-linum-mode |
| 09:11 | nz- | chronno: thanks |
| 09:11 | chronno | nz-: np |
| 09:17 | nathanic | hello, i'm looking for clojure.tools.logging / log4j advice: how can i stop it from printing a line like "sun.reflect.GeneratedMethodAccessor3 invoke" before each log message? |
| 09:20 | uvtc | Hi grayzone. Clojure has syntactic sugar for a handful of things, and some of those use the hash mark as a prefix. Also, Clojure uses the caret for indicating metadata. #^foo is an older deprecated syntax for adding metadata. |
| 09:23 | grayzone | uvtc : thank's for clarification |
| 09:25 | grayzone | uvtc: ..... xml.clj version (https://github.com/clojure/clojure/blob/master/src/clj/clojure/xml.clj#L35) has and only ^ and not #^ and did not understand why : case closed |
| 09:25 | nz- | nathanic: i have used logback-classic instead of log4j |
| 09:26 | nathanic | nz-: interesting, was that still via clojure.tools.logging? |
| 09:26 | nz- | yes |
| 09:27 | nathanic | you were getting the GeneratedMethodAccessor spam like me, and that inspired you to switch? |
| 09:27 | nz- | nathanic: https://github.com/jsyrjala/ruuvitracker_server/blob/master/resources/logback.xml and https://github.com/jsyrjala/ruuvitracker_server/blob/master/project.clj#L22 |
| 09:28 | nathanic | nz-: thanks! |
| 09:28 | nz- | nathanic: no, I have started using logback with java stuff before I started playing with clojure |
| 09:29 | nathanic | in real life java work i use slf4j in front of log4j, but i must admit i've never delved very deeply into their guts |
| 09:29 | nz- | I believe that tools.logging is also using slf4j |
| 09:29 | dsabanin | hey guys |
| 09:30 | dsabanin | I'm having big issues with clojure in production :) some weird issue with threading |
| 09:30 | nz- | basically log4j development has stopped and the guy behind the log4j works now with the slf4j/logback instead |
| 09:31 | clgv | dsabanin: what exactly? |
| 09:32 | dsabanin | basically I have a clojure-resque client that is sending work to agents on each new job in the queue. It runs fine for a while and then it gets stuck, all agent threads become listed as "waiting on condition" and nothing is happening until I restart the process. When I restart things start working again for a while. Sometimes it lasts for days, sometimes hours, sometimes 10 minutes is enough for it to get stuck again |
| 09:33 | nathanic | nz-: interesting re: logback. also this ruuvitracker seems like it's going to be very cool |
| 09:33 | dsabanin | I connected to stuck process through jdb, but I can't seem to find anything useful |
| 09:33 | chouser | you can't see what the stuck threads are waiting on? |
| 09:34 | nz- | nathanic: we shall see, currently the problem is lack of firmware developers |
| 09:34 | dsabanin | I have a trace but tells me nothing -- all clojure-agent-send-pool threads are stuck in this trace: http://pastie.org/4679976 |
| 09:35 | wmealing_ | dejavu |
| 09:35 | wmealing_ | dsabanin: which kernel ? |
| 09:35 | dsabanin | 2.6.32-5-amd64 |
| 09:35 | wmealing_ | ubuntu ? |
| 09:35 | dsabanin | Debian GNU/Linux 6.0 |
| 09:36 | wmealing_ | ok |
| 09:36 | wmealing_ | i know there is a popen cow bug that may end up showing what you're saying happens |
| 09:36 | wmealing_ | let me see if i can find the commit |
| 09:38 | dsabanin | wmealing_: thanks! |
| 09:41 | chouser | dsabanin: what version of java? |
| 09:41 | clojurebot | java.util.Date is the worst class in the entire JDK. |
| 09:41 | wmealing_ | others can feel free to jump in and help.. |
| 09:42 | wmealing_ | it just sounds very familar to a problem i was solving |
| 09:42 | dsabanin | java version "1.7.0_04" |
| 09:42 | dsabanin | Java(TM) SE Runtime Environment (build 1.7.0_04-b20) |
| 09:42 | dsabanin | Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) |
| 09:42 | wmealing_ | https://bugzilla.redhat.com/show_bug.cgi?id=664931 |
| 09:43 | chouser | uvtc: fuzzy match between my use of "java" and "java.util.Date" would be my guess |
| 09:43 | uvtc | clojurebot: how was your date last night? |
| 09:43 | clojurebot | java.util.Date is the worst class in the entire JDK. |
| 09:44 | wmealing_ | and he wonders why he can't keep a girl |
| 09:44 | chouser | dsabanin: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/locks/AbstractQueuedSynchronizer.java#2043 |
| 09:44 | chouser | Could it be that no more work is being sent to the agents? |
| 09:45 | dsabanin | chouser: hmmm, it could be |
| 09:47 | dsabanin | thanks for ideas and help guys |
| 09:48 | chouser | yeah, it looks to me like the agent threads are waiting for the next work item: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/ThreadPoolExecutor.java?av=f#1043 |
| 09:53 | dsabanin | good, so no bug in clojure at least :) probably a bug in resque-clojure lib |
| 09:54 | dsabanin | it probably doesn't handle well disconnects from redis server |
| 09:55 | wmealing_ | dsabanin: -5 contains the patch.. they backported it |
| 09:56 | dsabanin | wmealing_: I asked our sysadmin guy, he says our kernel doesn't seem to be affected by that |
| 09:56 | wmealing_ | ye |
| 10:01 | dfd | anyone here have experience with Chas Emerick's Friend library? |
| 10:01 | uvtc | ~anyone |
| 10:01 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 10:01 | wmealing_ | cemerick may have. |
| 10:02 | wmealing_ | but i do agree with clojurebot |
| 10:02 | wmealing_ | clojurebot: botsnack |
| 10:02 | dfd | haha, cemerick most definitely would. |
| 10:02 | clojurebot | Thanks! Can I have chocolate next time |
| 10:03 | dfd | yeah, sorry to be vague. I'm trying to write a workflow for an OAuth2 flow (app.net in particular), and I'm having trouble figuring out what to return. I thought I was returning the right auth-map, but I keep going back to the callback--I'm getting a endless loop. |
| 10:04 | mpenet | dsabanin: resque-clojure doesnt seem to use testOnBorrow on the connection pool, maybe you have a bunch of dead/rotten connections there |
| 10:04 | uvtc | $mail samflores Thanks again for the tip using clostache. I ran with it and did this https://github.com/fhd/clostache/wiki/Using-Partials-as-Includes . |
| 10:04 | lazybot | Message saved. |
| 10:04 | dsabanin | mpenet: I checked with lsof, there were only 2 connections, but both at CLOSE_WAIT state when the issue is happening |
| 10:10 | kryft | Hmm.. https://github.com/kingtim/nrepl.el doesn't mention SLIME in the requirements; should I still install it separately? |
| 10:10 | xeqi | dfd: are you returning a value from friend.workflows/make-auth ? |
| 10:11 | xeqi | kryft: no nrepl and slime are seperate |
| 10:11 | scriptor | kraft: nrepl.el should be all you need, it connects to the nrepl server on its own |
| 10:12 | scriptor | essentially, it's a slime/swank replacement |
| 10:12 | kryft | Ah |
| 10:12 | dfd | xeqi: hi, yeah, I return the ring redirect response for the oauth redirect url when we don't have the code to get a token, and then after we get the token, I return an auth-map. |
| 10:12 | kryft | Apparently swank-clojure (which is recommended on clojure.org, but claims to be deprecated in favor of nrepl) was also a stand-alone slime replacement? |
| 10:14 | xeqi | it was a version of swank that supported clojure |
| 10:14 | xeqi | * is |
| 10:18 | kryft | xeqi: Right, I'm just a bit confused because I've heard a lot of people talking about using SLIME and clojure, but apparently that's not strictly speaking true |
| 10:18 | dfd | xeqi: I know it's working up to a point, there's just some basic thing I'm not getting. This is a work in progress: https://gist.github.com/3666571 |
| 10:18 | xeqi | kryft: nrepl.el just took over in the past couple weeks, its a transition point right now |
| 10:19 | xeqi | swank-clojure still works, but no one is maintaining it |
| 10:25 | xeqi | dfd: I think the :type needs to be ::friend/auth |
| 10:26 | xeqi | dfd: assuming you requires [cemerick.friend :as friend] |
| 10:26 | dfd | xeqi: I don't think that's it; I've been dumping out data from the authenticate* function in friend.clj, and auth? evaluates to true |
| 10:26 | dfd | I feel really dumb, there's something I'm just not getting no matter how many times I've read through friend.clj |
| 10:27 | duck11231 | Does friend only work with Ring apps, or can it be used for other types of request/response applications? |
| 10:27 | xeqi | &::auth |
| 10:27 | lazybot | ⇒ :clojure.core/auth |
| 10:27 | xeqi | &(= ::clojure.string/auth ::auth) |
| 10:27 | lazybot | ⇒ false |
| 10:27 | dfd | duck11231: as far as I know, it's just ring apps; it uses the ring response format pretty extensively to store session data and whatnot |
| 10:28 | dfd | xeqi: I actually had it as ::friend/auth before and it was failing there. |
| 10:28 | duck11231 | That's annoying. I support a couple different request types (all similar to ring) and was hoping I could use friend to replace my custom auth flow |
| 10:29 | dfd | duck11231: well, you could fork it. ;-) |
| 10:34 | xeqi | dfd: are you using 0.1.0? |
| 10:35 | dfd | xeqi: yes, in fact I'm using a checked out version from github so I can do some dumping of variables directly in the friend code. |
| 10:39 | xeqi | dfd: after https://github.com/cemerick/friend/blob/master/src/cemerick/friend.clj#L186 whats new-auth?, (-> request :session ::friend/unauthorized-uri), and (-> request ::friend/auth-config :default-landing-uri) ? |
| 10:41 | dfd | xeqi: good question...I don't get past this line in friend.clj: (if (and workflow-result (not (auth? workflow-result))) |
| 10:41 | dfd | sorry, I'll give you a line number |
| 10:41 | dfd | xeqi: line 175, https://github.com/cemerick/friend/blob/master/src/cemerick/friend.clj |
| 10:42 | cemerick | dfd: right, this goes back to the :type ::friend/auth issue that xeqi mentioned |
| 10:42 | dfd | xeqi: so, right before my code is dying, I print out auth? and my workflow-result. The workflow-result is a legit (I think) auth-map, and auth? evaluates to true. But that conditional fails. |
| 10:43 | cemerick | according to `(not (auth? workflow-result))`, it's not ;-) |
| 10:43 | dfd | cemerick: doh, yeah, it must be as you say. Let me see what I'm doing wrong... |
| 10:44 | dfd | cemerick, xeqi: okay, yeah, now it's starting to come clear; if I make :type ::friend/auth, I get the endless redirecting I was talking about talking to cemerick privately |
| 10:45 | dfd | so, um, apparently I guess maybe my identity binding isn't working... |
| 10:45 | cemerick | dfd: redirecting to…which URI? |
| 10:46 | xeqi | checkinng the unauthorized-uri and default-landing-uri might help for the redirecting |
| 10:46 | cemerick | dfd: this would be easier if we could see the whole file, plus your application of the authenticate middleware. |
| 10:46 | dfd | yeah, sorry, one sec-- |
| 10:48 | dfd | https://github.com/ddellacosta/friend-example/tree/master/src/friend_test |
| 10:48 | dfd | cemerick: the handler code was largely stolen from your example code, and the oauth2.clj file is (obviously) in progress. |
| 10:49 | dfd | forgive my goofy comments, I talk to myself in my "in progress" code... |
| 10:51 | kryft | xeqi: The swank-clojure page gives the impression that swank is a version of SLIME: "be sure you don't have any other versions of SLIME loaded" |
| 10:52 | djanatyn | hey, where's the zip function? |
| 10:52 | dfd | cemerick: I didn't answer your previous question: it goes through the whole flow, first hitting the redirect URL then again getting the access token. As far as the OAuth flow itself, that seems to be fine. |
| 10:52 | djanatyn | like, it takes two lists and a predicate that takes two arguments |
| 10:53 | djanatyn | (zip + [1 2 3] [1 2 3]) => (2 4 6) |
| 10:53 | cemerick | dfd: it's an infinite loop because the workflow handles all requests; it should limit its action to a defined workflow URI (or set of URIs, if you need to define a separate callback URI, etc). See: https://github.com/cemerick/friend/blob/master/src/cemerick/friend/openid.clj#L109 |
| 10:53 | djanatyn | I can't find it on clojuredocs |
| 10:53 | kryft | Ugh, maybe I should just try to use swank-clojure for now. It's confusing enough learning emacs, evil and clojure without trying to deduce what to do with nrepl based on what people say about slime or swank-clojure. :) |
| 10:54 | scriptor | djanatyn: for that example you can actually use map |
| 10:54 | dfd | djanaytn: zipper? http://clojuredocs.org/clojure_core/clojure.zip/zipper |
| 10:54 | scriptor | ,(map + [1 2 3] [1 2 3]) |
| 10:54 | clojurebot | (2 4 6) |
| 10:54 | djanatyn | oh! I remember that mapcar had that behavior too |
| 10:54 | scriptor | no, zipper is something else |
| 10:54 | djanatyn | I'm used to map :: (a -> b) -> [a] -> [b] |
| 10:55 | djanatyn | so, map can take an arbitrary number of arguments? |
| 10:55 | scriptor | djanatyn: yes, but map can take multiple collections |
| 10:55 | scriptor | and it passes the next element of each collection to the function, so it can function like zip |
| 10:55 | djanatyn | cool! thanks. |
| 10:55 | dfd | cemerick: okay, the dense fog is slowing lifting... |
| 10:55 | djanatyn | you guys are very helpful. |
| 10:56 | djanatyn | ...I forgot why I wanted to use zip, though |
| 10:56 | dfd | cemerick: oh! how stupid of me, I think I get it--it's trying to process every request, but it should filter the url of the request...doh |
| 10:58 | djanatyn | Hodapp: haskell's type system is sometimes the most concise way to explain what I mean :) |
| 11:00 | hyPiRion | Is there a shorter way to write ##(map #(map inc %) [[1 2 3 4] [5 6 7 8]]) ? |
| 11:00 | lazybot | ⇒ ((2 3 4 5) (6 7 8 9)) |
| 11:00 | casion | where can I see good examples of (lazily) parsing input-streams in clojure? |
| 11:00 | hyPiRion | Or, well, maybe more idiomatic. |
| 11:01 | zerokarmaleft | when i call gen-class, if i specify :extends/:implements does the runtime automatically import the parent classes into the current ns? |
| 11:02 | zerokarmaleft | i suspect it does, but i'm needing a sanity check |
| 11:03 | jparishy | Does reify create a concrete class on the JVM? Because when I pass an object created by reify that implements an interface to .getClass, I definitely don't get what I expected |
| 11:03 | chouser | jparishy: yes |
| 11:06 | casion | hyPiRion: is it always 2d? to me a list comp would be more readable |
| 11:08 | hyPiRion | casion: so ##(for [x [[1 2 3 4] [5 6 7 8]]] (map inc x)) instead? |
| 11:08 | lazybot | ⇒ ((2 3 4 5) (6 7 8 9)) |
| 11:09 | hyPiRion | I don't know what's mor idiomatic, but it's a bit more readable, I agree. |
| 11:09 | casion | hyPiRion: that seems more in line with what I've seen done in the clojure code I've browsed |
| 11:10 | TimMc | hyPiRion: (map (partial map inc) ...) |
| 11:11 | zerokarmaleft | hyPiRion: i think your first nested map is still readable |
| 11:12 | zerokarmaleft | it follows the structure of the seq you're passing |
| 11:13 | hyPiRion | zerokarmaleft: it's more messier when you do something like this: |
| 11:14 | hyPiRion | (map (fn [is] (map #(get-in b %) is)) ...) |
| 11:14 | hyPiRion | and well, (map (partial (map (partial get-in b))) ...) isn't that beautiful either. |
| 11:15 | jparishy | chouser: so this would be expected? https://gist.github.com/3667031 |
| 11:16 | zerokarmaleft | hyPiRion: i wonder if you could write a nested-map function that repeats those calls to an arbitrary depth |
| 11:16 | chouser | jparishy: yup, that's a classname believe it or not |
| 11:17 | zerokarmaleft | or at least depth 2, for the simple case |
| 11:18 | hyPiRion | Well, for me, it's all about readability, as long as one doesn't overengineer it. |
| 11:19 | jparishy | Heh, alright. thanks |
| 11:26 | casion | I am having a revelation… when you realize there isn't a library for something you think should be really simple, it's probably far from it. |
| 11:44 | Frozenlock | casion: Seems like a great thought |
| 11:44 | Frozenlock | I'll be sure to remember it. |
| 11:45 | casion | Frozenlock: great for you maybe, for me it's borderline infuriating ;) |
| 11:46 | Frozenlock | I have my own rule of thumb: If it looks simple, it will take you 4x as much time as you think. If it looks complicated, don't even start. |
| 11:46 | casion | haha :) |
| 11:47 | casion | every time I find a spec for a new format I want to support, I end up finding out that no one implements it correctly… and that's now my problem to support all the various bastardizations of it |
| 11:48 | uvtc | You guys, this is old hat stuff. The first one is well known as casion's conjecture, and the second is referred to as Frozenlock's formula. |
| 11:49 | Frozenlock | lol! |
| 11:49 | casion | woohoo, I'm e-famous! |
| 11:49 | Frozenlock | Yay, power to the pseudonym! |
| 11:49 | casion | when do the paychecks start rolling in? |
| 12:03 | Frozenlock | I can't believe the power cljs gives me over a webpage; I feel like a god! |
| 12:03 | casion | which one? |
| 12:03 | solussd | is there a way to provide a "transform", or something that happens when a auto generated constructor (e.g. ->Record or map->Record) is called? |
| 12:04 | Frozenlock | casion: Anubis, who else? |
| 12:04 | solussd | i'm guessing the answer is no, but it would be a nice feature- maybe something you specify when you declare the record |
| 12:05 | casion | Frozenlock: considering what cljs is, and how many gods ra absorbed… I'd think ra ;) |
| 12:06 | Frozenlock | But, but, Anubis almost destroyed earth! If it wasn't for SG1... |
| 12:06 | pepijndevos | Anyone familiar with clojure internals? I'm trying to understand https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentHashMap.java |
| 12:07 | pepijndevos | It seems the only difference between ArrayNode and BitmapIndexedNode is that the formar only contains nodes, while the other possibly contains leafs? |
| 12:08 | pepijndevos | Is that an optimization? |
| 12:08 | pepijndevos | I read this: http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/ but it seems super simplified. |
| 12:08 | pepijndevos | on the other hand, the current implementation does not contain empty and single nodes. |
| 12:15 | chouser | pepijndevos: This stuff has changed quite a bit since I last looked at it, but it appears ArrayNode also don't bother with a bitmap mask -- it just always has a 32-node array. |
| 12:17 | pepijndevos | chouser: huh, so the bitmap mask is not a 32 element array? |
| 12:17 | pepijndevos | That is what I understood from the deftwice article |
| 12:17 | chouser | bitmap is an int: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentHashMap.java#L571 |
| 12:18 | pepijndevos | I need to study this. I'm beginning to see why my C implementation was slower than Clojure |
| 12:19 | pepijndevos | chouser: but it seems to be used like an array of bits? |
| 12:28 | chouser | pepijndevos: where? I see places where it's bit-shifted with >>>, counted with bitCount, bit-or'ed with | |
| 12:30 | dnolen | pepijndevos: that's the whole idea being Bagwell's array mapped hash trie. rhickey changed the array into a integer in his implementations. |
| 12:33 | dnolen | pepijndevos: actually I'm probably wrong about that - http://en.wikipedia.org/wiki/Hash_array_mapped_trie |
| 12:33 | pepijndevos | dnolen: so what is this integer used for? I thought that was like an index into the array[32] of nodes |
| 12:33 | pepijndevos | oh |
| 12:33 | dnolen | pepijndevos: the path |
| 12:34 | pepijndevos | dnolen: right, in sections of 5 bits, which map to 32 elements per level |
| 12:34 | dnolen | pepijndevos: yes |
| 12:35 | pepijndevos | dnolen: so then both arraynode and bitmmapindexednodes have an array of 32 items, I think. Except, one is an array of nodes, and the other of object keys and values(acually 64 elements) |
| 12:36 | bobbywilson0 | is there a way to do this? |
| 12:36 | bobbywilson0 | ,(conj '(1) '(2)) |
| 12:36 | clojurebot | ((2) 1) |
| 12:36 | bobbywilson0 | and get ((2) (1)) |
| 12:37 | pepijndevos | concat |
| 12:37 | pepijndevos | no |
| 12:37 | pepijndevos | seq? |
| 12:37 | clojurebot | seq is what |
| 12:37 | chouser | list |
| 12:37 | pepijndevos | ,(list '(1) '(2)) |
| 12:37 | clojurebot | ((1) (2)) |
| 12:38 | bobbywilson0 | chouser: thanks! |
| 12:38 | cark | hello all, I think i found a little bug in algo.monad is there a maintainer i could talk to ? |
| 12:39 | bobbywilson0 | pepijndevos: thanks! as well |
| 12:39 | cark | also an efficiency issue, got solution for both of these |
| 12:39 | cark | (simple solution) |
| 12:40 | uvtc | What database would you recommend using with a small/medium Clojure webapp? I don't expect a large amount of traffic. Was going to use something like SQLite as I'm already familiar with it... Have not yet tried CouchDB. Not sure exactly what to make of Datomic. |
| 12:40 | technomancy | uvtc: there are better embedded DBs on the JVM that SQLite |
| 12:41 | technomancy | SQLite has to do some crazy C interop |
| 12:41 | uvtc | technomancy: Right. |
| 12:41 | uvtc | technomancy: I've been pointed toward Derby and H2 and another one to use rather than SQLite. |
| 12:42 | uvtc | Not sure about hosting. I've heard Heroku is pretty easy to use. |
| 12:42 | technomancy | it's true! =) |
| 12:42 | ibdknox | lol |
| 12:42 | ibdknox | uvtc: technomancy works for heroku ;) |
| 12:42 | technomancy | if you're on Heroku then Postgres is the way to go |
| 12:43 | dnolen | pepijndevos: looking the ClojureScript implementations it seems like ArrayNodes don't hold values. |
| 12:43 | ibdknox | uvtc: though I will happily attest to its simplicity and ease of use |
| 12:43 | cark | postgres is awesome, why go for the lesser solutyion when it is so readily available |
| 12:44 | technomancy | if you know you're never going to grow beyond a single process or need redundancy then an embedded DB is a lot simpler to get going with |
| 12:44 | uvtc | ibdknox: thanks. I'm not too sure what to make of it (what with the manifolds and dynoplexes and control surfaces :) ). |
| 12:44 | pepijndevos | dnolen: right. just to save space? seems to add a lot of complexity |
| 12:44 | uvtc | lingo |
| 12:44 | technomancy | haha |
| 12:45 | cark | technomancy: yes and no, that's learning a whole new model, how are transactions behaving and such |
| 12:45 | pepijndevos | (dnolen, link?) |
| 12:45 | ibdknox | uvtc: haha, yeah don't worry about their terms. The only thing you need to know is that you can git push and then scale the number of processes running that |
| 12:45 | ibdknox | uvtc: that's basically all there is to it |
| 12:45 | technomancy | one of these days I'm going to give BDB a shot |
| 12:45 | ibdknox | BDB? |
| 12:45 | uvtc | Can I use an embedded db (where the db is just a file in my project dir) with Heroku? |
| 12:45 | dnolen | pepijndevos: I'm assuming it was done for performance reasons, look at the CLJS source man :) |
| 12:46 | dnolen | pepijndevos: relevant method is inode-lookup. |
| 12:46 | dnolen | pepijndevos: both BitmapIndexedNode & ArrayNode implement it. |
| 12:46 | technomancy | uvtc: no, the filesystem is ephemeral on Heroku, same as EC2 |
| 12:46 | technomancy | ibdknox: berkeley DB |
| 12:46 | uvtc | cark: Thanks for the recommendation. I've used MySQL in the past, but not Postgres yet. |
| 12:46 | technomancy | embedded KV store |
| 12:47 | ibdknox | ah |
| 12:47 | pepijndevos | dnolen: ok, will try to navigate cljs |
| 12:47 | cark | uvtc: then go for mysql, unless you've got time to learn postgres. mysql is also available everywhere |
| 12:48 | technomancy | anyway, if you're not distributing the app to others who might have a low tolerance for complicated installation procedures then I'd go with postgres. |
| 12:48 | cark | uvtc: support is good for both in clojure and in the jvm |
| 12:48 | uvtc | technomancy: above you said, "if you know you're never going to grow beyond a single process or need redundancy then an embedded DB is a lot simpler to get going with", but just now you wrote that I can't use a little db file because the filesystem is ephemeral... (?) |
| 12:48 | technomancy | uvtc: right, because redundancy is built-in to the assumptions on heroku |
| 12:49 | chouser | uvtc: have you considered datomic? I'm itching for an excuse to use it, but haven't had one yet. |
| 12:49 | uvtc | Is "embedded db" == that little .sql file in my project dir? |
| 12:49 | technomancy | that is, you don't actually get redundancy on the free tier, but it forces you into patterns of application design that make redundancy easier |
| 12:50 | ibdknox | I wish they'd work on presenting datomic a bit better |
| 12:50 | cark | is it possible to have all of datomic in-process ? |
| 12:50 | madsy | Not far from NY and it's another state, lol |
| 12:50 | madsy | Sorry wrong channel |
| 12:50 | uvtc | chouser: Not sure what to make of datomic. That is to say, I'm not exactly sure what it is or how I'd use it. That's what I meant above by "not sure what to make of it". |
| 12:50 | Apage43 | cark: there's an in-memory only way to use it, but I don't know that you get transactions? |
| 12:51 | technomancy | postgres unfortunately doesn't optimize for getting started at all |
| 12:51 | abalone | sorry if this question is dumb but is Light Table open for people to write plugins ? or is that for later? |
| 12:52 | ibdknox | abalone: the playground isn't yet |
| 12:52 | ibdknox | abalone: primarily because it makes big swings every couple of weeks and I will make absolutely no claim of stability |
| 12:52 | uvtc | technomancy: I'm looking at the postgres docs right now. Thanks for the tips. |
| 12:52 | solussd | mongodb + monger (clojure library) is the way to go for web apps, imo. Fast and better suited for storing data composed of arrays, maps, etc. |
| 12:53 | solussd | also, heroku has mongohq support via 'add-ons'. |
| 12:53 | technomancy | uvtc: I've been working on a simple postgres app on heroku if you want a sample to work from: https://github.com/heroku/buildkits |
| 12:53 | abalone | ibdknox: is there an old version that people can play with (in terms of practicing the mere act of writing a plugin) ? |
| 12:53 | technomancy | it also uses hstore, but the jdbc support for hstore is currently extremely sketchy, so I'd recommend waiting on that for now =( |
| 12:54 | ibdknox | abalone: no, though something along those lines might show up in not too long. Is there something specific you're wanting to do? |
| 12:54 | uvtc | technomancy: Thanks. Will read up on what "buildkits" and "buildpacks" are. |
| 12:55 | technomancy | uvtc: that's not really relevant to the topic at hand, but if you're interested ... =) |
| 12:55 | technomancy | uvtc: in particular see the instructions for running postgres in user-space |
| 12:55 | technomancy | when developing |
| 12:55 | abalone | ibdknox: i'd like to try paredit. i'm 100% sure that if paredit exists for light table in the future it will have been written by someone else much faster and in a better fashion but i'd like to try as an exercise |
| 12:55 | technomancy | typically postgres wants to run as a system daemon, which is appropriate for production but kinda crappy for dev. |
| 12:55 | ibdknox | abalone: so you can build paredit around codemirror directly. :) |
| 12:56 | abalone | ibdknox: oh ok :) |
| 12:56 | abalone | has someone already tried? |
| 12:56 | ibdknox | abalone: and that would be a *very* welcome project! |
| 12:56 | ibdknox | abalone: not that I know of |
| 12:56 | uvtc | technomancy: I can't think of any reason why it'd be a hassle to have postgres running locally for dev. |
| 12:56 | ibdknox | though I haven't done a ton of digging |
| 12:57 | pepijndevos | dnolen: okay, makes sense now. But… take a look at inode-assoc. ouch. Who implemented this? I'm curious to know the speed improvement. |
| 12:57 | dnolen | pepijndevos: speed improvement over what? |
| 12:57 | abalone | i'll look into it but i really must emphasize that i hope this doesn't cause The Right Person to skip doing it just because i said i'll make feeble efforts |
| 12:58 | ohpauleez | abalone: what's the project? (late to the party) |
| 12:58 | ibdknox | abalone: maybe "the right person" ends up being you, or helping with your impl |
| 12:58 | pepijndevos | dnolen: over just using one type of bitmap node that has nodes and leaves in a big array. |
| 12:58 | abalone | ohpauleez: paredit for codemirror |
| 12:58 | abalone | i just can't code without it, so i really want it for light table |
| 12:58 | ohpauleez | ahhh - that would indeed be absolutely great |
| 12:58 | dnolen | pepijndevos: because rhickey probably knows he's doing and we don't. We just ported the Java. |
| 12:59 | abalone | coding lisp without paredit feels like coding with a pen and paper |
| 13:00 | pepijndevos | dnolen: okay. to bad rhickey isn't on irc much lately. (read: since 1.2 or so) |
| 13:00 | kang | question: is there any corresponding function of the R's which.max function in clojure/incanter? |
| 13:00 | dnolen | pepijndevos: even if he was he probably say read the code like 10 more times ;) |
| 13:01 | dnolen | pepijndevos: I'm sure if you think about it some more you'll some kind of complexity advantage. |
| 13:01 | dnolen | see some |
| 13:03 | pepijndevos | dnolen: hah, probably. |
| 13:03 | pepijndevos | dnolen: maybe I can just strip the cljs from the arraynode and see what happens |
| 13:04 | dnolen | pepijndevos: getting that code to work under Clojure should require trivial changes ;) |
| 13:05 | pepijndevos | dnolen: dinner time. I'll ping you if I have any significant revelations. |
| 13:08 | serpent213 | hi |
| 13:09 | serpent213 | i have a function call (clj-http.client/get) which works fine on the repl but does not return in production. how can i debug this...? |
| 13:10 | serpent213 | could it be a threading issue? i use futures here and there... |
| 13:11 | aperiodic | usually when someone runs into a difference between the repl and anywhere else, it's something to do with laziness |
| 13:11 | aperiodic | the REPL forces evaluation of lazy sequences |
| 13:13 | serpent213 | the only argument is the URL, which looks good in the log directly before the "get" |
| 13:14 | serpent213 | the logging call afterwards does not get evaluated |
| 13:20 | jkkramer | serpent213: could the call be throwing an exception? clj-http throws on 404 etc by default |
| 13:21 | serpent213 | jkkramer: no, the call does not return, no log output |
| 13:22 | serpent213 | the same code did already work in another callchain... i'm really puzzled :( |
| 13:24 | jkkramer | serpent213: what does "not return" mean if not an exception? it times out, returns nil, …? |
| 13:27 | casion | ,(time (= (seq (byte-array (map byte (range 100)))) (seq (byte-array (map byte (range 100)))))) |
| 13:27 | clojurebot | "Elapsed time: 11.256664 msecs" |
| 13:27 | clojurebot | true |
| 13:27 | casion | ,(time (java.util.Arrays/equals (byte-array (map byte (range 100))) (byte-array (map byte (range 100))))) |
| 13:27 | clojurebot | "Elapsed time: 9.752234 msecs" |
| 13:27 | clojurebot | true |
| 13:28 | serpent213 | jkkramer: good point. the following statement is never executed, so i assume it just hangs somewhere in the clj-http code forever... |
| 13:28 | casion | hum, seq is always faster here by a factor of 2 |
| 13:29 | jkkramer | serpent213: if it's on another thread, it might be throwing an exception you're not seeing |
| 13:33 | jkkramer | ,((fn [] (future (println "foo") (throw (Exception.)) (println "bar")) :done)) |
| 13:33 | clojurebot | #<SecurityException java.lang.SecurityException: no threads please> |
| 13:44 | nz- | I am getting this error with clojurescript: Uncaught Error: No protocol method IWatchable.-notify-watches defined for type object: {} |
| 13:45 | nz- | I have an atom that holds {}, and I am using swap! to update it |
| 13:46 | nz- | what I am doing wrong? |
| 13:47 | serpent213 | jkkramer: where do these exceptions end up...? how can i catch them? |
| 13:47 | nz- | I dont have any watches |
| 13:50 | nz- | seems that the value gets updated |
| 13:52 | fenton | can anyone comment on my inability to read a resource file defined in a clojure library from java? https://github.com/ftravers/PublicDocumentation/blob/master/clojure/resource-file.md |
| 13:53 | fenton | simple example at above url |
| 13:54 | jkkramer | serpent213: you catch them on the thread they're thrown on |
| 14:00 | pepijndevos | does vimclojure work with nrepl already? I see there is a branch. |
| 14:01 | tanzoniteblack | pepijndevos: somebody was asking about that yesterday, and the best response I heard was "um...maybe?". apparently it's still in progress, but can't hurt to go ahead and try it out if you see the branch so you can report what's broken |
| 14:02 | pepijndevos | tanzoniteblack: The problem is setting it up. Maybe I need to say wantnrepl = "paht/tonrepl/client" |
| 14:02 | serpent213 | jkkramer: (log/info) does work in the thread, so i assumed exceptions would be printed out as well... |
| 14:03 | serpent213 | jkkramer: i'll dig deeper in that direction, thanks a lot! :) |
| 14:04 | pepijndevos | tanzoniteblack: from what I can tell, the client is there, but the plugin itself is not. |
| 14:05 | aperiodic | serpent213: the exceptions will bubble up when the future is deref'd |
| 14:07 | tanzoniteblack | pepijndevos: I'd say that nrepl isn't up and working with vim yet then, which is a much more definitive answer then was given yesterday, so thanks for exploring that. Of course...by the next time someone asks that in #clojure the answer will probably have changed....but oh well |
| 14:07 | pepijndevos | tanzoniteblack: https://twitter.com/kotarak/status/240069366224416768 |
| 14:07 | serpent213 | aperiodic: i never deref some of them -- does clojure deal with this? or is it bad style? |
| 14:08 | pepijndevos | https://bitbucket.org/kotarak/vimclojure/issue/82/use-nrepl |
| 14:12 | nz-_ | well, my problem was that I was trying to swap! a map, and not an atom |
| 14:19 | aperiodic | serpent213: this is mostly speculation, but i think those computations would just terminate, and the thread pool would move on to other things. should have no ill effects |
| 14:22 | dnolen | ninjudd: is drip supposed to work w/ lein 2 only? |
| 14:28 | serpent213 | aperiodic: good to hear, thx :) |
| 14:32 | serpent213 | jkkramer: connection refused -- you are my hero! :* ,) |
| 14:33 | jkkramer | serpent213: glad I could help |
| 15:19 | wting | Running `lein new foobar` gives me "Could not transfer artifact [...] from/to central [...] connection to http:// refused." |
| 15:19 | wting | I'm not sure what to do to get leiningen working |
| 15:20 | xeqi | wting: what version? |
| 15:21 | wting | xeqi: 20120722-1 from github.com/technomancy/leiningen |
| 15:25 | wting | The above was from Arch's package repo. I've downloaded and installed directly from the repo now with the same issue. |
| 15:25 | wting | from the GitHub repo* |
| 15:26 | xeqi | k, does it just say "http://" or does it have a full url? |
| 15:26 | wting | just http |
| 15:26 | wting | Well.. "Could not transfer artifact lein-newnew:lein-newnew:pom:0.3.5 from/to central (http://repo1.maven.org/maven2): Connection to http:// refused" |
| 15:27 | wting | and "Could not transfer artifact lein-newnew:lein-newnew:pom:0.3.5 from/to clojars (https://clojars.org/repo/): Connection to http:// refused" |
| 15:28 | xeqi | hmm, what does `lein version` give you? |
| 15:28 | chouser | How does one build clojure these days? Just typing "ant" failed on a test generative dep |
| 15:28 | wting | Same errors, here's the full error message: http://pastebin.com/yLciNDBV |
| 15:29 | xeqi | k, how are you installing it from the repo? |
| 15:30 | wting | Following the instructions from the repo: https://github.com/technomancy/leiningen#installation Basically downloading, chmod+x lein, ./lein repl |
| 15:31 | Bronsa | chouser: maven install? |
| 15:32 | xeqi | k, then you should have preview10 |
| 15:32 | xeqi | can you browse to https://clojars.org/ ? |
| 15:33 | wting | yup, what's preview10? |
| 15:33 | xeqi | the version |
| 15:33 | chouser | Hm, skipping the tests works for now |
| 15:33 | serpent213 | aperiodic: guess you were right: http://grokbase.com/t/gg/clojure/119wytxaph/are-futures-garbage-collected |
| 15:36 | xeqi | wting: do you have a ~/.lein/profiles.clj |
| 15:38 | wting | nope, only have ~/.lein/self-installs/leiningen-2.0.0-preview10-standalone.jar |
| 15:39 | dnolen | chouser: 'mvn package' works for me. |
| 15:39 | chouser | ah, ok. Didn't realize ant wasn't fully supported anymore. |
| 15:39 | wting | I just removed ~/.m2 and ~/.lein and tried running lein again, same result. |
| 15:40 | nbeloglazov | Is there a reason why map-indexed takes only 1 collection? |
| 15:41 | S11001001 | nbeloglazov: 'cause if you're using more than one there's no real benefit, just pass (range) as one of them |
| 15:41 | nbeloglazov | S11001001: ah, cool. Thanks |
| 15:42 | nbeloglazov | Didn't think about range :\ |
| 15:42 | S11001001 | as it is map-indexed is kind of trading clarity for efficiency (quick, does the number come first or second?) |
| 15:43 | S11001001 | as a fun challenge, implement map on two-or-three seqs with full chunking support :) |
| 15:44 | xeqi | wting: it sounds like its setup right. the refused connections are weird, almost like theres a proxy or something in the way messing it up |
| 15:45 | wting | xeqi: I don't know, I just logged into my Debian VPS, went through the same steps and got the same result. |
| 15:48 | wting | Same problems with Ubuntu. These 3 boxes (Arch, Debian, and Ubuntu) are in 3 separate states... |
| 15:49 | xeqi | hmm |
| 15:49 | xeqi | now I really don't want to delete my ~/.m2 and try it |
| 15:49 | wting | lol |
| 15:49 | wting | you can always just back up ~/.m2 and ~/.lein |
| 15:49 | wting | or create a new test user |
| 15:50 | wting | but thanks for your help anyway |
| 15:50 | xeqi | yeah, realized that after a moment |
| 15:50 | wting | I gotta run, I'll probably report it to GitHub issues tonight |
| 15:52 | xeqi | wting: https://www.refheap.com/paste/4927 works :/ |
| 15:53 | wting | wth |
| 15:53 | wting | lemme ssh into a university CS machine and try it |
| 15:54 | wting | http://pastebin.com/20g0MaXg |
| 15:54 | wting | Same result. :-/ |
| 15:55 | Sgeo | Why does awtbot provide a with-robot macro? |
| 15:55 | Sgeo | It doesn't seem to be significantly different from doto? |
| 15:58 | scriptor | Sgeo: readability, maybe? |
| 15:58 | xeqi | it is doto |
| 15:58 | Sgeo | I just played a bit with type-text |
| 15:58 | Sgeo | It seems to be a bit slow |
| 15:59 | xeqi | wting: try `lein self-install` before `lein new ..` |
| 16:26 | nz-_ | is there a function for removing duplicates from a list? like unix command uniq? |
| 16:26 | Raynes | &(distinct [1 1 2 2 3 2 4 5 6]) |
| 16:26 | lazybot | ⇒ (1 2 3 4 5 6) |
| 16:26 | nz- | (doc distinct) |
| 16:26 | clojurebot | "([coll]); Returns a lazy sequence of the elements of coll with duplicates removed" |
| 16:27 | nz- | ok, how about one where I can provide function that decides what is "equal"? |
| 16:28 | Raynes | Can't help ya there. |
| 16:28 | Cheiron_ | Hi, what is the recommended clojure lib to work with Kafka? |
| 16:29 | nz- | [{:a 1 :b 2} {:a 1 :c 3} {:a 2 :d 4}] here entries that have same value for :a would be identical and duplicates need to be dropped (doesn't matter which one gets dropped) |
| 16:29 | ohpauleez | nz-: I think at that point you're into filter territory |
| 16:30 | ohpauleez | and this question just came up a few months ago |
| 16:30 | ohpauleez | maybe a few weeks aog |
| 16:30 | ohpauleez | in here |
| 16:30 | ohpauleez | I din't recall the answer |
| 16:30 | aperiodic | maybe something with group-by :a? |
| 16:31 | nz- | ok, group-by :a, loop over list and take first item from each list |
| 16:32 | aperiodic | (for [[v dups] (group-by :a coll)] (first dups)) |
| 16:32 | aperiodic | yeah |
| 16:33 | metellus | ,(group-by :a [{:a 1 :b 2} {:a 1 :c 3} {:a 2 :d 4}]) |
| 16:33 | clojurebot | {1 [{:a 1, :b 2} {:a 1, :c 3}], 2 [{:a 2, :d 4}]} |
| 16:33 | metellus | ,(map first (vals (group-by :a [{:a 1 :b 2} {:a 1 :c 3} {:a 2 :d 4}]))) |
| 16:33 | clojurebot | ({:a 1, :b 2} {:a 2, :d 4}) |
| 16:34 | nz- | thanks |
| 16:35 | metellus | or use partition-by |
| 16:35 | metellus | and you can get first of the (vals ...) |
| 16:35 | nz- | (doc parititon-by) |
| 16:35 | clojurebot | Pardon? |
| 16:36 | metellus | and you can get rid of the (vals ...) |
| 16:36 | nz- | (doc partition-by) |
| 16:36 | clojurebot | "([f coll]); Applies f to each value in coll, splitting it each time f returns a new value. Returns a lazy seq of partitions." |
| 16:36 | metellus | ,(partition-by :a [{:a 1 :b 2} {:a 1 :c 3} {:a 2 :d 4}]) |
| 16:36 | clojurebot | (({:a 1, :b 2} {:a 1, :c 3}) ({:a 2, :d 4})) |
| 16:37 | nz- | by the way, is there a faq or a cookbook like thing for these kinds of questions? |
| 16:38 | devn | clojurebot: the cheat sheet coupled with clojuredocs.org and a repl |
| 16:38 | clojurebot | clojure.repl in swank is not useful for two reasons: 0) everything it provides has an enhanced version in slime and 1) having to re-refer it every time you changed namespaces would be annoying |
| 16:38 | tmciver | metellus: partition-by only works for consecutive duplicates, yes? |
| 16:38 | devn | err nz- ^ |
| 16:39 | metellus | oh, right. group-by it is, then |
| 16:39 | uvtc | nz- : There's this http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Cookbook |
| 16:39 | devn | be careful! |
| 16:39 | devn | it's badly out of date |
| 16:40 | devn | unless someone has been giving it some time and energy |
| 16:40 | uvtc | Yeah, not sure who maintains that wiki. Changes seem to take a while to be approved. |
| 16:41 | Sgeo | ,(doc assoc!) |
| 16:41 | clojurebot | "([coll key val] [coll key val & kvs]); Alpha - subject to change. When applied to a transient map, adds mapping of key(s) to val(s). When applied to a transient vector, sets the val at index. Note - index must be <= (count vector). Returns coll." |
| 16:41 | uvtc | There's http://rosettacode.org/wiki/Category:Clojure , but it's not quite a cookbook. |
| 16:45 | mefesto | is clojure.xml/emit meant to be used? it's public in the source but listed in the api docs |
| 16:54 | Raynes | $findfn [1 2 1 2 3 3] [1 2 3] |
| 16:54 | lazybot | [clojure.core/distinct] |
| 16:54 | Raynes | xeqi: Fixed findfn. |
| 16:55 | nz- | Raynes: findfn tries every function until it find match? |
| 16:55 | Raynes | Pretty much. |
| 16:55 | typeclassy | very cool |
| 16:56 | nz- | is there some doc that tell what tricks the bots can do? |
| 16:56 | Raynes | Not really. |
| 16:56 | Raynes | You can browse his plugins on irc |
| 16:56 | Raynes | $whatis source |
| 16:56 | lazybot | source is http://github.com/flatland/lazybot |
| 16:56 | Raynes | src/lazybot/plugins |
| 16:56 | Raynes | He can even tell you the weather. |
| 16:56 | Raynes | $conditions 35554 |
| 16:57 | lazybot | Last Updated on September 7, 3:12 PM CDT; Partly Cloudy; Dewpoint: 74 F (23 C); Precipitation today: 0.00 in (0 mm); Temperature: 89 F (31.7 C); Windchill: NA; Wind speed: 2mph; Wind gust: 5.0mph; URL: http://www.wunderground.com/US/AL/Eldridge.html. |
| 16:57 | hyPiRion | Hot. |
| 16:57 | uvtc | lazybot: fortune |
| 16:57 | lazybot | Never Graduate |
| 16:58 | Raynes | hrm. I thought I deleted that plugin. |
| 16:58 | nz- | $source partition-by |
| 16:58 | lazybot | partition-by is http://is.gd/rB7Az4 |
| 16:58 | Raynes | That one needs fixed too. |
| 16:58 | Raynes | It is pointing at the wrong tag and stuff. |
| 16:58 | uvtc | lazybot: leet this message |
| 16:58 | uvtc | $leet this message |
| 16:58 | muhoo | $40 |
| 16:59 | Raynes | lazybot: elite this message |
| 16:59 | lazybot | 7h!5 m355493 |
| 16:59 | uvtc | Ooof. |
| 16:59 | tanzoniteblack | lazybot: elite Raynes: this plugin seems terribly unnecessary |
| 16:59 | lazybot | r4yn35: 7h!5 p1u9!n 533m5 73rr!81y unn3c3554ry |
| 16:59 | Raynes | Indeed, that was on my deletion list as well. :p |
| 16:59 | aperiodic | is there an inverse? |
| 17:00 | Raynes | Don't think so. |
| 17:00 | uvtc | lazybot: help |
| 17:00 | lazybot | You're going to need to tell me what you want help with. |
| 17:00 | ivaraasen | Raynes: I reckon the weather forecast only works for US zip codes? |
| 17:00 | Raynes | $help elite |
| 17:00 | lazybot | Raynes: Takes words and replaces them with their leetspeak alternatives. |
| 17:00 | muhoo | lazybot: leet 1337 |
| 17:00 | Raynes | ivaraasen: You can give it names too. wunderground seems to have information for other countries. |
| 17:01 | Raynes | $conditions Melbourne, Australia |
| 17:01 | lazybot | Last Updated on September 8, 6:58 AM EST; Mostly Cloudy; Dewpoint: NA; Precipitation today: 0.00 in (0 mm); Temperature: 51.3 F (10.7 C); Windchill: NA; Wind speed: 7.6mph; Wind gust: 12.6mph; URL: http://www.wunderground.com/global/stations/94868.html. |
| 17:01 | uvtc | $timer 0:0:5 surprise! |
| 17:01 | lazybot | Timer added. |
| 17:01 | lazybot | surprise! |
| 17:02 | uvtc | tehehe |
| 17:02 | Raynes | That plugin needs rewritten so bad. |
| 17:02 | tanzoniteblack | $("$conditions Palo Alta, CA") |
| 17:02 | cemerick | Raynes: lazybot needs a timezone plugin. |
| 17:02 | tanzoniteblack | ,("$conditions Palo Alta, CA") |
| 17:02 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn> |
| 17:02 | Raynes | cemerick: That would do? |
| 17:03 | uvtc | $pwd |
| 17:03 | cemerick | lazybot: time in Hong Kong |
| 17:03 | lazybot | cemerick: The time is now 2012-09-07T20:59:58Z |
| 17:03 | ivaraasen | $conditions Hell, Norway |
| 17:03 | lazybot | Last Updated on September 7, 4:55 PM EDT; Scattered Clouds; Dewpoint: 61 F (16 C); Precipitation today: 0.00 in (0 mm); Temperature: 80.3 F (26.8 C); Windchill: NA; Wind speed: 0.0mph; Wind gust: 5.0mph; URL: http://www.wunderground.com/US/MI/Hell.html. |
| 17:03 | cemerick | oh, there we go :-P |
| 17:03 | Raynes | cemerick: That didn't do what you thought it did. |
| 17:03 | hyPiRion | What, that can't be true |
| 17:03 | ivaraasen | wrong Hell :( |
| 17:03 | hyPiRion | ivaraasen: yeah, I wondered. |
| 17:03 | hyPiRion | $conditions Trondheim |
| 17:03 | lazybot | Last Updated on September 7, 10:50 PM CEST; Mostly Cloudy; Dewpoint: 41 F (5 C); Precipitation today: 0.00 in (0.0 mm); Temperature: 46 F (8 C); Windchill: 41 F (5 C); Wind speed: 12mph; Wind gust: 0mph; URL: http://www.wunderground.com/global/stations/01271.html. |
| 17:04 | tanzoniteblack | ,(println "$conditions Palo Alto, CA") |
| 17:04 | clojurebot | $conditions Palo Alto, CA |
| 17:04 | lazybot | Location not found. |
| 17:04 | cemerick | Raynes: bummer. |
| 17:04 | Raynes | I don't think I ever fixed space handling in the weather plugtin |
| 17:04 | Raynes | It is probably looking for Alto, CA |
| 17:04 | tanzoniteblack | Raynes: that would explain why there's no Palo Alto, though I was really just curious if I could feed things from one bot to the other |
| 17:05 | ivaraasen | hyPiRion: pretty bad weather in Trondheim lately, but at least it's quite warm |
| 17:05 | Raynes | You can, but you can't really get them in a loop. |
| 17:06 | tanzoniteblack | ,(println "$(println \",(println $conditions 94303)\")") |
| 17:06 | clojurebot | $(println ",(println $conditions 94303)") |
| 17:06 | tanzoniteblack | this is probably a good thing |
| 17:07 | Raynes | That didn't work because you used $ rather than & |
| 17:07 | tanzoniteblack | ,(println "&(println \",(println $conditions 94303)\")") |
| 17:07 | clojurebot | &(println ",(println $conditions 94303)") |
| 17:07 | lazybot | ⇒ ,(println $conditions 94303) nil |
| 17:08 | Raynes | That's as far as you can get. |
| 17:08 | hyPiRion | ivaraasen: yeah, it's still hot enough to not be horrible |
| 17:11 | duck11232 | We just need a new bot that parses ⇒ as it's input character |
| 17:11 | tanzoniteblack | duck11232: I can only see that ending badly |
| 17:12 | shadowh511 | yo, i'm having trouble with this basic clojure IRC bot |
| 17:12 | shadowh511 | i found this sample: http://nakkaya.com/2010/02/10/a-simple-clojure-irc-client/ |
| 17:12 | shadowh511 | and I am wondering how to make it wait for and respond to commands |
| 17:14 | arohner | ,((fn [] (println ",(println \"foo\")"))) |
| 17:14 | clojurebot | ,(println "foo") |
| 17:15 | arohner | ,((fn [] (println "&(println \"foo\")"))) |
| 17:15 | clojurebot | &(println "foo") |
| 17:15 | lazybot | ⇒ foo nil |
| 17:15 | arohner | sounds like you can get them to loop, using fns |
| 17:15 | arohner | ah, no, because of the => |
| 17:15 | muhoo | bot torture! |
| 17:16 | antares_ | shadowh511: you can see more or less that happening in conn-handler, now generalize it (extracting a function for command identification and another one for each command is a good idea, too) |
| 17:17 | aperiodic | darn lazybot replacing newlines with whitespace |
| 17:18 | shadowh511 | antares_: oh, I get it, it's in the let binding |
| 17:18 | tanzoniteblack | &(println (str \newline ",(println "gotcha"))) |
| 17:18 | lazybot | java.lang.RuntimeException: EOF while reading string |
| 17:19 | tanzoniteblack | &(println (str \newline ",(println \"gotcha\")")) |
| 17:19 | lazybot | ⇒ ,(println "gotcha") nil |
| 17:19 | aperiodic | tanzoniteblack: it probably does a `with-out-str` and does the newline replacement in that, which seems foolproof to me |
| 17:20 | tanzoniteblack | &(doc with-out-str) |
| 17:20 | lazybot | ⇒ "Macro ([& body]); Evaluates exprs in a context in which *out* is bound to a fresh StringWriter. Returns the string created by any nested printing calls." |
| 17:25 | aperiodic | and now people would probably figure out what i'm up to if i tried to add inline evaluation to clojurebot :( |
| 17:35 | shadowh511 | aperiodic: do you have the source code publically available? |
| 17:35 | Sgeo | ##(+ 1 1) |
| 17:35 | lazybot | ⇒ 2 |
| 17:36 | Sgeo | &(println (str \backspace)) |
| 17:36 | lazybot | ⇒ nil |
| 17:36 | Sgeo | &(println (str \backspace \backspace \backspace \backspace)) |
| 17:36 | lazybot | ⇒ nil |
| 17:36 | dnolen | heh |
| 17:36 | dnolen | CLJS reveals a funny bug in CLJ |
| 17:36 | dnolen | ,(case 'quote 'a :foo :bar) |
| 17:36 | clojurebot | :foo |
| 17:36 | metellus | &(println (str "abcde" \backspace \backspace \backspace \backspace)) |
| 17:36 | lazybot | ⇒ abcde nil |
| 17:37 | jkdufair | how would i access both the entire request and route params from a compojure route definition? |
| 17:37 | Sgeo | ,(println (str "abcde" \backspace \backspace \backspace \backspace)) |
| 17:37 | clojurebot | abcde |
| 17:38 | dnolen | actually I guess not given the description of case, since the tests are literals. |
| 17:38 | Sgeo | (Not helpful just I'm curious |
| 17:40 | Sgeo | Oh now I know what periodic meant by inline evaluation: The ## thing |
| 17:41 | aperiodic | $google clojurebot source code |
| 17:41 | lazybot | [hiredman/clojurebot · GitHub] https://github.com/hiredman/clojurebot |
| 17:41 | aperiodic | shadowh511: ^ |
| 17:44 | xeqi_ | jkdufair: (GET "/" request ...) would bind the entire request to request https://github.com/weavejester/compojure/wiki/Destructuring-Syntax |
| 17:44 | aperiodic | lol, apparently clojurebot is hardcoded to not eval messages from certain nicks |
| 17:45 | tanzoniteblack | itistoday: where do you see that? |
| 17:45 | itistoday | ,(println "clojurebot, y u no listen to me??") |
| 17:45 | clojurebot | itistoday: Pardon? |
| 17:47 | Sgeo | ,(println "clojurebot, y u listen to me??") |
| 17:47 | clojurebot | clojurebot, y u listen to me?? |
| 17:47 | lazybot | clojurebot: Uh, no. Why would you even ask? |
| 17:47 | clojurebot | excusez-moi |
| 17:47 | Sgeo | Woah |
| 17:47 | aperiodic | tanzoniteblack: bottom of src/hiredman/clojurebot/sb.clj |
| 17:48 | antares_ | can someone point me to that Simplicity/Freedom to focus/Empowerment diagram? I need it for a talk I am giving |
| 17:49 | tanzoniteblack | aperiodic: thanks |
| 17:54 | jkdufair | xeqi: that's what i'm doing now to get the entire request. what i'd also like is, i.e. (GET "/foo/:bar" ...) and bind somehow to get bar and request. perhaps it would be {foo :foo :as request} ? |
| 17:57 | xeqi | jkdufair: (GET "/" {{:keys [bar]} :params :as request} ...) maybe |
| 17:58 | jkdufair | i'll try. thx. |
| 17:58 | dslsd | I have a collection: [["foo" "bar"] ["foo" "baz"] ["bar" "qux"]] and I want {:foo ["bar" "baz"], :bar "qux"} |
| 17:59 | jkdufair | xeqi: that did it. thank you! |
| 17:59 | dslsd | ive been in imperative land for too long and im struggling to think of how to accomplish the above functionally |
| 18:04 | Sgeo | Related question: Does loop/recur count as functionally? |
| 18:04 | Sgeo | Although I do see a functional way to do it, I ... think |
| 18:05 | dslsd | im going to say no to loop/recur |
| 18:05 | Sgeo | dslsd, please note that I'm not a Clojure expert, so am trying to solve your problem with that limitation in mind |
| 18:05 | dslsd | just to spite you |
| 18:05 | jkdufair | dslsd: you should be able to use reduce i think |
| 18:05 | Chousuke | dslsd: sounds like you need something like group-by but not quite |
| 18:05 | dslsd | Chousuke: exactly |
| 18:05 | Sgeo | ,(reduce {} (fn [acc vec] (assoc acc (first vec) (nth vec 1))) |
| 18:05 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 18:05 | Sgeo | ,(reduce {} (fn [acc vec] (assoc acc (first vec) (nth vec 1)))) |
| 18:05 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: sandbox$eval51$fn__52> |
| 18:06 | Sgeo | ,(doc reduce) |
| 18:06 | clojurebot | "([f coll] [f val coll]); f should be a function of 2 arguments. If val is not supplied, returns the result of applying f to the first 2 items in coll, then applying f to that result and the 3rd item, etc. If coll contains no items, f must accept no arguments as well, and reduce returns the result of calling f with no arguments. If coll has only 1 item, it is returned and f is not called. If val i... |
| 18:07 | Sgeo | ,(reduce (fn [acc vec] (assoc acc (first vec) (nth vec 1))) {} [["foo" "bar"] ["foo" "baz"] ["bar" "qux"]]) |
| 18:07 | clojurebot | {"bar" "qux", "foo" "baz"} |
| 18:07 | nz- | ,(group-by first [["foo" "bar"] ["foo" "baz"] ["bar" "qux"]]) |
| 18:08 | clojurebot | {"foo" [["foo" "bar"] ["foo" "baz"]], "bar" [["bar" "qux"]]} |
| 18:09 | Sgeo | Is it generally considered acceptable to write out an fn like that that's tailored for use with reduce? |
| 18:11 | dansalmo | joy, I figured out my first regex |
| 18:11 | dansalmo | , (clojure.string/split "--(--)4*234/-/1-/1" #"(?<=[^-()])-" 2) |
| 18:11 | clojurebot | ["--(--)4*234/" "/1-/1"] |
| 18:11 | Sgeo | On a related note, is there a nice parser combinator library for Clojure? |
| 18:11 | dansalmo | but I would like not to swallow the - |
| 18:13 | Chousuke | (reduce (fn [m [a b]] (let [item (m a [])] (assoc m a (conj item b)))) {} '[[foo bar] [foo zonk] [bar foo]]) |
| 18:13 | Chousuke | ,(reduce (fn [m [a b]] (let [item (m a [])] (assoc m a (conj item b)))) {} '[[foo bar] [foo zonk] [bar foo]]) |
| 18:13 | clojurebot | {bar [foo], foo [bar zonk]} |
| 18:15 | Sgeo | Hmm http://brehaut.net/blog/2011/fnparse_introduction |
| 18:15 | Sgeo | It doesn't particularly look maintained though |
| 18:15 | Chousuke | dslsd: See above. It's way easier to write if you don't treat the one-item case specially |
| 18:15 | Chousuke | special cases are icky :P |
| 18:16 | dslsd | thanks Chousuke |
| 18:16 | dslsd | (reduce (fn [m [a b]] (let [item (m a [])] │ altivec |
| 18:16 | dslsd | | (assoc m a (conj item b)))) {} '[[foo bar] [foo │ amalloy_ |
| 18:16 | dslsd | oops, sorry |
| 18:17 | Sgeo | Not only is the function to do the transform easier to implement without a one-item case, it means code that uses the result doesn't need to think about it |
| 18:17 | xeqi | Raynes: I think its broke again |
| 18:17 | xeqi | $findfn 3 4 7 |
| 18:17 | lazybot | java.lang.ClassCastException: clojure.lang.PersistentStructMap$Def cannot be cast to clojure.lang.IFn |
| 18:17 | Chousuke | yeah. special cases leak out :P |
| 18:17 | Sgeo | I think maybe Haskell would be good for hammering this into people's heads |
| 18:17 | Chousuke | if you have a special case somewhere down the stack it will spread everywhere |
| 18:18 | dansalmo | Is there a way to get ["----/" "-/"] from (clojure.string/split "----/-/" #"(?<=[^-])-" 2)? without having to add the "-" back the second result? |
| 18:18 | dansalmo | , (clojure.string/split "----/-/" #"(?<=[^-])-" 2) |
| 18:18 | clojurebot | ["----/" "/"] |
| 18:20 | xeqi | Raynes: looks like eval too ##(+ 1 2) |
| 18:20 | lazybot | java.lang.ClassCastException: clojure.lang.PersistentStructMap$Def cannot be cast to clojure.lang.IFn |
| 18:21 | xeqi | ,(clojure.string/split "---/-/" #"/") |
| 18:21 | clojurebot | ["---" "-"] |
| 18:21 | xeqi | ah, right |
| 18:22 | pbostrom | ,(reduce (fn [m [k v]] (update-in m [(keyword k)] conj v)) {} [["foo" "bar"] ["foo" "baz"] ["bar" "qux"]]) |
| 18:22 | clojurebot | {:bar ("qux"), :foo ("baz" "bar")} |
| 18:23 | pbostrom | dslsd: ^ lists, but not vectors |
| 18:25 | dslsd | Chousuke: that's really cool -- that ({} :key []) thingamajig |
| 18:25 | dslsd | i didn't know you could get a sort of not-found by doing that |
| 18:25 | dslsd | pbostrom: cool thanks |
| 18:26 | Chousuke | dslsd: it's a kind of a hidden-in-plain-sight feature :P |
| 18:26 | xeqi | dansalmo: do you want to split after "/"s ? |
| 18:27 | Chousuke | ,(:foo 'bar 1) |
| 18:27 | clojurebot | 1 |
| 18:27 | dslsd | Chousuke: thanks that's interesting |
| 18:27 | Chousuke | works that way too, even if your input is not actually associative. |
| 18:27 | Sgeo | Chousuke, hmm, I don't see what dslsd is looking at |
| 18:27 | Sgeo | Oh |
| 18:27 | dslsd | Chousuke: where the hell is that documented? |
| 18:27 | Chousuke | I have no idea. |
| 18:28 | Chousuke | probably on the clojure website |
| 18:28 | dslsd | Chousuke: are there any other magical "oh btw this thing is also a function" things? |
| 18:28 | Chousuke | maps, sets, vectors, symbols and keywords are all functions |
| 18:29 | dslsd | ,({} '() []) |
| 18:29 | clojurebot | [] |
| 18:30 | Chousuke | ,('[a b c] 2) |
| 18:30 | clojurebot | c |
| 18:31 | dslsd | ,(let [rocket-to-the-sun (->(*))] rocket-to-the-sun) |
| 18:31 | clojurebot | 1 |
| 18:31 | Chousuke | the other way around unfortunately can't work :P |
| 18:31 | Sgeo | ,(macroexpand-1 '(->(*))) |
| 18:31 | clojurebot | (*) |
| 18:32 | cemerick | weavejester: I wonder if you'd be open to splitting up the predicates in valip so that some subset would be cljs-safe? |
| 18:32 | Chousuke | while we're on the topic of non-obvious features... |
| 18:32 | cemerick | Or, just keeping the cljs-safe ones in a separate namespace, and immigrating them into valip.predicates, I suppose. |
| 18:32 | Chousuke | ,(meta '^:bar [a b c]) |
| 18:32 | clojurebot | {:bar true} |
| 18:33 | weavejester | weavejester: I haven't worked on valip for a while, though I may be looking at it again soon. |
| 18:33 | weavejester | But I'm not sure about sharing namespaces between cljs and clj |
| 18:33 | Chousuke | ,(meta ^:bar [a b c]) |
| 18:33 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:0)> |
| 18:33 | Chousuke | ,(meta ^:bar '[a b c]) |
| 18:33 | clojurebot | nil |
| 18:33 | Chousuke | can you tell why that is? :P |
| 18:33 | Chousuke | (pop quiz!) |
| 18:33 | cemerick | weavejester: I've actually had some good luck doing so so far. *shrug* |
| 18:34 | cemerick | I'll fork for now and you can see if you like what comes out of the other end when you get around to it :-) |
| 18:34 | thorbjornDX | can anyone recommend "Functional Programming for the Object-Oriented Programmer"? |
| 18:34 | weavejester | cemerick: Sure thing :) |
| 18:40 | Sgeo | I should try to implement that search across an infinite space thing I saw once |
| 18:42 | aperiodic | Chousuke: does it attach the metadata to the (quote [a b c]) form, which gets evaluated before it's passed to meta? |
| 18:42 | Chousuke | aperiodic: yeah. |
| 18:43 | aperiodic | Chousuke: what's going on with '^:bar [a b c]? |
| 18:43 | Chousuke | aperiodic: the metadata goes on the list in the quote form, whereas in the former example it goes on the vector, and the vector is what exists when meta is called. |
| 18:44 | Chousuke | aperiodic: it's just (quote ^:bar [a b c]) |
| 18:44 | Chousuke | since ^ is a read time operation it needs to be that way around. |
| 18:45 | aperiodic | ah, right, because ^:bar isn't a form |
| 18:45 | Chousuke | right. it's just reader magic :P |
| 18:46 | Sgeo | If reader magic is acceptable here is reader magic unacceptable for a features mechanism? |
| 18:47 | Chousuke | what sort of features mechanism? |
| 18:47 | Chousuke | if you're looking for a way to make code portable between different clojure implementations, then you should know that that is an explicit non-goal :P |
| 18:47 | Sgeo | Chousuke, as in, a way to choose a form to read in based on which implementation of Clojure |
| 18:47 | Sgeo | Oh :( |
| 18:48 | Sgeo | Why? |
| 18:48 | clojurebot | http://clojure.org/rationale |
| 18:48 | Chousuke | I guess you can sort of do it with read-time evaluation? maybe |
| 18:48 | technomancy | Chousuke: an explicit non-goal for application code |
| 18:49 | technomancy | there's a thread about adding a features mechanism; it's not out of the question |
| 18:49 | Chousuke | I suppose it's not a bad idea for libraries |
| 18:49 | Sgeo | Common Lisp the language has no standard way to do threads or networking. Yet, various implementations have implementation specific threading and networking. There exist libraries that smooth over these to provide cross-implementation threading and networking |
| 18:57 | cemerick | Chousuke: portability is turning out to be less of a headache than I expected. |
| 18:57 | cemerick | Within reason, of course; interop-heavy stuff doesn't work well. |
| 18:57 | cemerick | s/work well/port easily |
| 18:59 | casion | can you lazily read from an input-stream using (with-open)? |
| 19:05 | hyPiRion | casion: if you use read, you can |
| 19:05 | hyPiRion | (repeatedly 3 read) - for instance. |
| 19:07 | casion | hyPiRion: ahhh. I keep getting java.io and clojure.java.io mixed up. I tried with .read and it wasn't working |
| 19:08 | casion | I guess (memfn read) would have worked (and been silly) though |
| 19:12 | casion | hyPiRion: (read) only works with PushBackReaders, I'm using input-stream |
| 19:13 | casion | or java.io.InputStream as it is |
| 19:14 | Hodapp | blugh, I hate trying to get vim to do anything with plugins |
| 19:15 | hyPiRion | casion: (repeatedly #(read-function-here stream)) should work fine |
| 19:15 | Hodapp | :he vimclojure just does nothing |
| 19:15 | hyPiRion | though lazy reading is kind of scary if you have multiple readers. |
| 19:16 | casion | hyPiRion: I get 'IOException Stream closed' when I try that |
| 19:16 | casion | I suspect because with-open closes the stream? |
| 19:16 | hyPiRion | casion: yeah - you have to force the reads within a with-open, otherwise you're out of luck |
| 19:17 | babilen | Hodapp: Just use a reasonable plugin manager such as vim-addon-manager, vundle or (meh) pathogen |
| 19:17 | casion | alright then, guess I have to rework how I'm thinking about this |
| 19:17 | casion | thanks |
| 19:17 | Hodapp | babilen: I'm trying to use pathogen. Things are silently failing. |
| 19:18 | hyPiRion | casion: Do you have to lazily read though? Can't you just eagerly read? |
| 19:18 | babilen | Hodapp: pathogen would be my third choice, but this is rather a dicussion for #vim than #clojure I guess. |
| 19:18 | Sgeo | casion, try to avoid lazy streams of IO requiring stuff |
| 19:18 | casion | hyPiRion: files can be, and are often, very large |
| 19:19 | Hodapp | babilen: I'm just following instructions for lein-tarsier... |
| 19:19 | casion | avg 4gb, often exceeding 10gb |
| 19:19 | Sgeo | casion, the Haskell community has come to view such things with distrust. The function in Haskell that enables it is called unsafeInterleaveIO, and it's called unsafe for a reason. |
| 19:19 | hyPiRion | casion: https://github.com/richhickey/clojure-contrib/blob/061f3d5b45657a89faa335ffa2bb80819f2e6918/src/main/clojure/clojure/contrib/duck_streams.clj#L235 |
| 19:19 | Hodapp | okay, :ClojureRepl is working but :he vimclojure does nothing, that is annoying |
| 19:19 | casion | Is there another way to 'safely' handle large files then? |
| 19:20 | casion | hyPiRion: I need a stream, not a reader |
| 19:20 | technomancy | casion: you just have to find the right place for with-open |
| 19:20 | casion | unless I want to split the chars myself I guess |
| 19:22 | babilen | Hodapp: It's probably due to the fact that pathogen "forgets" to generate the helptags (or you forget it) -- IIRC it is :Helptags from pathogen. I would still strongly recommend to take a look at the other two though. |
| 19:22 | casion | actually, if I set encoding to UTF-8, I can read bytes with a reader then right? |
| 19:22 | Sgeo | I guess see if there's an Iteratee-like thing for Clojure? |
| 19:22 | Sgeo | Or Conduit-like |
| 19:23 | Hodapp | babilen: any recommendations between vim-addon-manager and vundle? |
| 19:23 | technomancy | babilen: do you know of any existing convention for a declarative alternative to Debian's update-java-alternatives? |
| 19:23 | Hodapp | most ofthese tools I only want to learn far enough that they get out of the way and let me do WTF I was going to do in the first place |
| 19:23 | babilen | Hodapp: I happily use v-a-m, but both are good. |
| 19:23 | technomancy | something appropriate for a config file that's included with an application |
| 19:25 | babilen | technomancy: Not really -- But you could just call whatever binary you want to call directly, can't you? I mean the paths are known and the alternatives system just manages symlinks to them. |
| 19:25 | casion | hah! that worked great. (reader "" :encoding "UTF-8") with line-seq to read a byte-stream |
| 19:26 | technomancy | babilen: no, it needs to be declarative since it's just read by the build process out of an application's source repo |
| 19:26 | technomancy | babilen: we will probably end up inventing our own convention, which I hate to do =( |
| 19:26 | technomancy | but we couldn't find any prior art |
| 19:28 | Hodapp | gah, finding vim-addon-manager installation to be... confusing |
| 19:32 | thorbjornDX | Hodapp: do you know about pathogen.vim? |
| 19:33 | thorbjornDX | Hodapp: https://github.com/tpope/vim-pathogen |
| 19:33 | babilen | (full circle) |
| 19:33 | Hodapp | ugh. |
| 19:34 | thorbjornDX | Hodapp: ah, sorry. Just saw the latest question |
| 19:35 | Hodapp | without knowing much about vim, I can hardly make heads or tails of the v-a-m installation instructions |
| 19:39 | Urthwhyte | Don't se pathogen |
| 19:39 | Urthwhyte | Vundle is much nicer |
| 19:40 | thorbjornDX | Urthwhyte: what don't you like about pathogen? |
| 19:40 | Hodapp | uggggggggh |
| 19:40 | XPherior | Evening, people. |
| 19:41 | Urthwhyte | Makes it wicked hard to just sync dtfiles across machines |
| 19:41 | thorbjornDX | Urthwhyte: how about pathogen + git + git submodules? |
| 19:42 | Hodapp | vim-addon-manager is making it wicked hard to comprehend WTF their installation documentation means. |
| 19:42 | Urthwhyte | Please excuse the typos, wifi latency is in the many seconds right now :( |
| 19:42 | thorbjornDX | Urthwhyte: No problem. |
| 19:43 | Urthwhyte | Because why complicate what could just be a single file sync? |
| 19:44 | thorbjornDX | Urthwhyte: I tend to hack on both my vimrc and the code in the submodules, so I like to have them source controlled |
| 19:46 | Urthwhyte | I avoid vimscript as much as possible |
| 19:46 | Urthwhyte | but I also have a very minimal vimrc |
| 19:47 | Urthwhyte | PRetty much just the bare minimum for working with whatever language I'm currently big into |
| 19:47 | Hodapp | that's all I'm trying to set up |
| 19:49 | Urthwhyte | I haven't actually worked out how to get the standard clojure stuff into vim, since all I've ben doing is 4clojure problems |
| 19:52 | Frozenlock | Friday evening on #clojure, let's party! |
| 19:53 | Sgeo | I'm having too much fun with awtbot |
| 19:53 | shaungilchrist | been partying hard since 3am last night. couldn't sleep so started working on edn parser for node.. you know because of because. |
| 19:55 | duck1123 | I haven't gotten around to reading the spec just yet, keywords are still supported, right? Namespaced keywords? |
| 19:55 | shaungilchrist | totally |
| 19:55 | duck1123 | I'm wondering if I can specify that Ciste's config format is just edn |
| 19:56 | technomancy | it's just an attempt to trick non-clojure-users into using the reader |
| 19:57 | duck1123 | well, if it's going to be used as a data format anyway. Why not specify it apart from clojure |
| 20:00 | Frozenlock | Cmon guys, no need, we have json |
| 20:00 | thorbjornDX | Frozenlock: can't forget XML |
| 20:01 | duck1123 | json puts colons in the wrong place and it's too picky about commas |
| 20:01 | Frozenlock | Oh right, we have xml! |
| 20:02 | S11001001 | json in yaml in xml in s-exps |
| 20:02 | duck1123 | csv? |
| 20:02 | Frozenlock | tsv, csv is for noob |
| 20:03 | Frozenlock | S11001001: s-exps aren't that bad |
| 20:04 | technomancy | whatever; I'm still using application/clojure as my mime type |
| 20:04 | shaungilchrist | I am going the other way and writing my code in csv and marshalling that to edn and then passing it to clojure |
| 20:05 | shaungilchrist | that way I can use excel macros to truly unleash the power |
| 20:05 | Frozenlock | https://sites.google.com/site/steveyegge2/the-emacs-problem |
| 20:05 | Frozenlock | shaungilchrist: You've won with the excel macros. |
| 20:05 | duck1123 | has anyone ever tried encoding clojure code as xml? Second question: have they been shot? |
| 20:06 | shaungilchrist | I am sure adobe is working on that for flex4 |
| 20:07 | thorbjornDX | I write my clojure code in powerpoint |
| 20:07 | shaungilchrist | every time I see thier </mediocrity> tag I almost lose my mind and drive off the road |
| 20:09 | duck1123 | Years ago, I spent some time using a XForms/XSLT/XQuery/XPL system. It was XML all the way down. I'm sure everyone has things from their youth that they regret |
| 20:09 | Hodapp | shaungilchrist: </mediocrity>? |
| 20:10 | shaungilchrist | Hodapp: they really have a billboard w/ just a </mediocrity> tag as in "end your mediocre career and come work here slinging mad markups rockstar" |
| 20:11 | Hodapp | sigh. |
| 20:11 | technomancy | duck1123: https://code.google.com/p/xsharp/ |
| 20:12 | shaungilchrist | if I were young again I'd totally deface it with an s-expression. that would show them. |
| 20:14 | duck1123 | I'd probably add the open tag, just for symmetry. |
| 20:16 | xeqi | wonder if nrepl should change to using edn underneath |
| 20:17 | thorbjornDX | I just installed emacs, am I in for a good time? (vim-user) |
| 20:17 | xeqi | a world of pain, followed by acceptance, followed by a good time |
| 20:17 | xeqi | much like any new tool |
| 20:17 | Frozenlock | xeqi: Wasn't edn the description of clojure seqs? |
| 20:18 | thorbjornDX | I don't mind the non-modality of it so long as I'm just in the repl, but I can't bring myself to use the arrow keys when traversing my src |
| 20:19 | thorbjornDX | and C-n/p/b/f or w/e seem marginally worse than jkhl |
| 20:19 | aperiodic | you could always try evil-mode |
| 20:19 | thorbjornDX | </nitpicking> |
| 20:19 | duck1123 | I can't remember the name, but there's a package that'll yell at yuou if you're arrowing around too much |
| 20:19 | thorbjornDX | aperiodic: this sounds like a whirlwind of pain, but I'll give it a shot |
| 20:20 | Frozenlock | no-easy-key |
| 20:20 | thorbjornDX | <M-x> package-install <CR> evil <CR> |
| 20:22 | technomancy | jkhl is awful in dvorak |
| 20:23 | thorbjornDX | technomancy: true, I tried prog dvorak a while back and couldn't make the switch because of vim |
| 20:23 | thorbjornDX | technomancy: if I was a nano slinger I would have been perfectly fine :( |
| 20:23 | hoover_damm | thorbjornDX, doubt it |
| 20:24 | hoover_damm | thorbjornDX, i've paired with nano coders... it's they feel awkward as heck in emacs |
| 20:24 | hoover_damm | thorbjornDX, when they cry out for vim is when you know they've had it. |
| 20:24 | aperiodic | i didn't have much trouble switching to programmer dvorak as a vim user |
| 20:25 | aperiodic | j and k are still right next to each other, in the same orientation |
| 20:25 | aperiodic | h and l i very rarely use |
| 20:25 | duck1123 | I overheard some people talking about OSX's movement commands and was like, I know this! Emacs! |
| 20:25 | hoover_damm | aperiodic, I've been dealing with *Unix* since 1990 and started with vi |
| 20:25 | hoover_damm | aperiodic, I don't understand why people care so much |
| 20:25 | hoover_damm | emacs, vi, nano, ed |
| 20:25 | hoover_damm | it all works |
| 20:25 | cgag | vim just works best |
| 20:25 | hoover_damm | use what works best |
| 20:26 | hoover_damm | often that is personal so you shouldn't try and share that feeling with someone else |
| 20:26 | cgag | I'm trying to get korma to work with mysql, does anyone know if i'm doing anything obviously wrong here? https://www.refheap.com/paste/4932 |
| 20:26 | thorbjornDX | I don't think I can force myself to use evil mode, I have a bit too much invested in my vimrc. I guess I can just use it as in interface to nrepl |
| 20:27 | shaungilchrist | I think thats enough for a day, I can now load datomic schemas/dtm files in node |
| 20:28 | shaungilchrist | I know the "easy" route would have been to go clojure script but I wanted something stand alone w/o the jvm deps |
| 20:28 | shaungilchrist | https://github.com/shaunxcode/jsedn if anyone wants to break it that would be cool |
| 20:31 | duck1123 | shaungilchrist: add a bin that'll allow me to get-in among other things and that'll be cool |
| 20:32 | shaungilchrist | just like a simple repl that reads and prints edn forms? |
| 20:33 | duck1123 | yeah, basically, That way if you want to extract a value from a edn file in a bash script or something, it'd be easy |
| 20:35 | duck1123 | $ echo "{:foo 7}" | jsedn -s :foo => 7 |
| 20:35 | duck1123 | not sure what args it would actually take |
| 20:35 | Sgeo | WTF |
| 20:35 | Sgeo | http://www.nsa.be/index.php/eng/Blog/Using-Jwt-yes-it-s-a-J-with-Clojure |
| 20:36 | Sgeo | The first create-listener macro defined on that page shouldn't work because the autogensym is outside of any quasiquote form |
| 20:37 | Sgeo | Oh "Update |
| 20:37 | Sgeo | With the Clojure bug mentioned above gone, and removing the unecessary gensym as it is outside the escaped code, the macro can be written:" |
| 21:34 | seancorfield | cgag: sorry, guess there's no korma users here at the moment... |
| 21:37 | cgag | seancorfield, i figured it out, it was putting quotes in places it shouldn't have, i just had to pass a :delimiters option somewhere to fix it |
| 21:43 | dansalmo | how to i get numeric value of char /0 as 0? not (int /0)? |
| 21:43 | dansalmo | , (int \0) |
| 21:43 | clojurebot | 48 |
| 21:45 | dansalmo | I hope it is not (read-string (str \0)) |
| 21:45 | dansalmo | , (read-string (str \0)) |
| 21:45 | clojurebot | 0 |
| 21:46 | dansalmo | is there a simpler way? |
| 21:46 | dansalmo | ,(int (read-string (str \0))) |
| 21:46 | clojurebot | 0 |
| 21:46 | dansalmo | , (int (read-string (str \0))) |
| 21:46 | clojurebot | 0 |
| 21:47 | tmciver | dansalmo: do you want the character numbers to evaluate to their value? ##(- (int \1) (int \0)) |
| 21:47 | lazybot | java.lang.ClassCastException: clojure.lang.PersistentStructMap$Def cannot be cast to clojure.lang.IFn |
| 21:48 | tmciver | ,(- (int \1) (int \0)) |
| 21:48 | clojurebot | 1 |
| 21:48 | dansalmo | yes |
| 21:48 | tmciver | dansalmo: just subtract 48 then. |
| 21:48 | tmciver | ,(- (int \5) (int \0)) |
| 21:48 | clojurebot | 5 |
| 21:49 | tmciver | ,(map #(- (int %) (int \0)) "123456789") |
| 21:49 | clojurebot | (1 2 3 4 5 ...) |
| 21:50 | dansalmo | I want just one int like (int \0) |
| 21:51 | dansalmo | . ([ 1 2 3 4] (int \1)) |
| 21:51 | dansalmo | , ([ 1 2 3 4] (int \1)) |
| 21:51 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 21:51 | mthvedt | woah what? |
| 21:52 | mthvedt | ,([ 1 2 3 4] (int \1)) |
| 21:52 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 21:52 | tmciver | ,(int \1) |
| 21:52 | clojurebot | 49 |
| 21:53 | tmciver | ,({49 1 50 2} [(int \1) (int \2)]) |
| 21:53 | clojurebot | nil |
| 21:53 | dansalmo | clojer gives easily the stuff you have to work for in other langs and make you work for the easy stuff |
| 21:53 | tmciver | ,({49 1 50 2} (int \1)) |
| 21:53 | clojurebot | 1 |
| 21:53 | mthvedt | how do vectors implement ifn |
| 21:54 | tmciver | mthvedt: they return the value at the index given as an arg. |
| 21:54 | tmciver | ,([1 2 3 4] 1) |
| 21:54 | cgag | it's basically the same as nth isn't it? |
| 21:54 | clojurebot | 2 |
| 21:55 | mthvedt | so... |
| 21:55 | mthvedt | ,([1 2 3 4] 1) |
| 21:55 | clojurebot | 2 |
| 21:55 | mthvedt | ,([1 2 3 4] (int \1)) |
| 21:55 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 21:55 | mthvedt | ,(int \1) |
| 21:55 | clojurebot | 49 |
| 21:55 | mthvedt | oh |
| 21:55 | mthvedt | that's boring |
| 21:55 | mthvedt | =/ |
| 21:56 | mthvedt | i was hoping it would yield some interesting insights on the clojure language |
| 22:01 | dansalmo | it will for me :) |
| 22:01 | cgag | where does that actually get implemented in the clojure source? I think it kind of does |
| 22:02 | cgag | the way datastructures can implement the function protocol is an interesting insight imo |
| 22:03 | Sgeo | Does Eclipse have a thing for making Swing GUIs visually? Is that comfortable to use with Counterclockwise and Clojure? |
| 22:03 | dansalmo | , ([1 2 3 4] (read-string (str \1))) |
| 22:03 | clojurebot | 2 |
| 22:04 | dansalmo | is there no more direct way for char? |
| 22:04 | dansalmo | , ([1 2 3 4] \1) |
| 22:04 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Key must be integer> |
| 22:04 | Sgeo | So, doseq is a non-lazy for |
| 22:04 | tmciver | cgag: here's how vector implements IFn: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentVector.java#L593 |
| 22:04 | Sgeo | I don't know how to remember the difference between doall and dorun |
| 22:05 | Sgeo | doall is sequence and dorun is sequence_ |
| 22:06 | tmciver | dansalmo: I would just subtract (int \0) from the chars you're interested in. Otherwise, you have to hard-code your 'vector of values'. |
| 22:06 | dansalmo | , ([1 2 3 4] (- (int \1) 48)) |
| 22:06 | clojurebot | 2 |
| 22:06 | tmciver | dansalmo: actually, that's not *terrible*: ##([0 1 2 3 4 5 6 7 8 9] \3) |
| 22:06 | lazybot | java.lang.ClassCastException: clojure.lang.PersistentStructMap$Def cannot be cast to clojure.lang.IFn |
| 22:07 | tmciver | err |
| 22:07 | tmciver | ,([0 1 2 3 4 5 6 7 8 9] \3) |
| 22:07 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Key must be integer> |
| 22:07 | tmciver | oh yeah, that won't work. |
| 22:07 | dansalmo | seems like there should be something better, but then when I run into these things, it means I am trying to do something the hard way. |
| 22:09 | cgag | Sgeo, doseq returns nil |
| 22:09 | Sgeo | Maybe doseq should be called dofor |
| 22:10 | cgag | dofor would be like calling (doall (for ....)) |
| 22:10 | cgag | i've seen that macro in storm's source |
| 22:18 | dansalmo | , (Integer. (str \0)) |
| 22:18 | clojurebot | 0 |
| 22:18 | dansalmo | , (Integer. \0) |
| 22:18 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching ctor found for class java.lang.Integer> |
| 22:19 | tmciver | dansalmo: works but that's terribly inefficient. |
| 22:19 | dansalmo | and more code than (- (int n) 48) :) |
| 22:20 | tmciver | and not very idiomatic either. |
| 22:22 | dansalmo | I am just astonished that there is not something simpler that is findable in docs |
| 22:24 | tmciver | dansalmo: I think it is rather succinct. If you want something simpler, just create a function to do that for you. |
| 22:25 | dansalmo | , (let [int-c (fn [x] (- (int x) 48))] (int-c \0)) |
| 22:25 | clojurebot | 0 |
| 22:26 | dansalmo | that'l do |
| 22:27 | Sgeo | ,(let [int-c (comp (partial + -48) int)] (int-c \0)) |
| 22:27 | clojurebot | 0 |
| 22:29 | Sgeo | ,(letfn [(int-c [x] (- (int x) 48))] (int-c \0)) |
| 22:29 | clojurebot | 0 |
| 22:29 | dansalmo | :tmciver, thanks for your help, I was able to clean it up without the fn. |
| 22:29 | tmciver | dansalmo: np |
| 22:30 | Sgeo | Is my pointless version a bit too... err, pointless? |
| 22:31 | dansalmo | I right clojure code at about 1 line per hour. Re-writes go a little faster though. |
| 22:32 | tmciver | Sgeo: it's never pointless when you get to use comp and partial together. :) |
| 22:32 | dansalmo | I spell bad to. |
| 22:33 | tmciver | dansalmo: you mean 'too'. ;) |
| 22:33 | dansalmo | If I were going to use the fn, I would use yours for sure. ;) |
| 22:33 | dansalmo | Took too much effort to fix speel. |
| 22:33 | dansalmo | none left over for grammer |
| 22:38 | Sgeo | Clojure doesn't have a built-in flip, does it? |
| 22:39 | tmciver | Sgeo: what's flip? Swap? |
| 22:40 | Sgeo | Definable as (defn flip [f] (fn [arg1 arg2 & args] (apply f arg2 arg1 args))) |
| 22:40 | Sgeo | ,(doc swap) |
| 22:40 | clojurebot | I don't understand. |
| 22:41 | tmciver | what does that do? It just looks like apply. |
| 22:41 | tmciver | Oh I see. |
| 22:41 | duck1123 | reverses the 1st 2 args |
| 22:41 | Sgeo | tmciver, (flip f) returns a function that acts like f except with the first two arguments reversed |
| 22:44 | duck1123 | I think the idea is, if all the libs are designed right, you should rarely need something like that, and when you do, #(f %2 %1) |
| 22:44 | dysinger | is there a shortcut to install a (missing) jar in the local repo like 'mvn install-file' ? |
| 22:44 | Sgeo | Instead of writing (partial + -48), with flip I could write (partial (flip -) 48) |
| 22:44 | dysinger | (for leiningen) |
| 22:45 | yankov | is there analogue of .indexOf for sorted-map/ |
| 22:45 | duck1123 | dysinger: I think install:install-file is it |
| 23:08 | riley526 | Can anyone recommend their preferred Markdown library for Clojure? |
| 23:09 | dslsd | riley526: https://github.com/yogthos/markdown-clj |
| 23:10 | riley526 | dslsd: Cool, thanks. I'll check it out. |
| 23:11 | dslsd | It's under active development which is the more important part in my opinion. |
| 23:25 | cemerick | Anyone know why ClojureScript requires a vector for e.g. :refer in require forms? Seems like a silly point on which to be strict on, and just one more stumbling block for clj/cljs portability… |
| 23:26 | hiredman | cemerick: a vector is clearly the correct choice |
| 23:26 | cemerick | hiredman: I'll just assume that's sarcasm. :-P |
| 23:27 | hiredman | look, the things you refering are all peers, so if you newline them each they should indent as a column one on top of each other |
| 23:28 | hiredman | where, because lists are typically function calls, lists usually indent differently |
| 23:28 | hiredman | sarcasm? |
| 23:28 | hiredman | me? |
| 23:30 | cemerick | never, I know |
| 23:30 | cemerick | parens in that position seem to be far more common, for the good reason that they stand out among the always-vectored libspecs |
| 23:30 | cemerick | Besides, editor peculiarities should stay out of language issues. |
| 23:31 | cemerick | Anyway, it's a gratuitous difference. |
| 23:31 | Sgeo | I think it's a popular opinion of the meaning of a literal vector in syntax vs a literal list |
| 23:31 | hiredman | I have a 34888 lines of clojure code here where it is always vectors |
| 23:31 | Sgeo | Rather than an editor concept |
| 23:32 | cemerick | Ah-ha, see, I've over 50K lines where it's always lists. |
| 23:32 | Sgeo | Lists look like function calls, so the first item should be important in some way |
| 23:32 | hiredman | ~guards |
| 23:32 | clojurebot | SEIZE HIM! |
| 23:32 | Sgeo | If all the items are roughly the same importance-wise, a vector makes sense |
| 23:34 | cemerick | Sgeo: sorry, lists within libspecs have a long history, e.g. http://clojure.org/libs |
| 23:34 | cemerick | Probably from the repeated use of "list" in `refer`. http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/refer |
| 23:36 | Sgeo | cemerick, in the line (require '(clojure.contrib def except sql)) |
| 23:36 | Sgeo | ? |
| 23:37 | Sgeo | In that case, the first item is significant, because it signifies the namespace those other things are found in |
| 23:37 | cemerick | Sgeo: No, talking about :only on the lib page |
| 23:37 | Sgeo | hmm |
| 23:39 | cemerick | Function position is "significant". When used to just denote a list (i.e. not a function calls or special forms), parens don't indicate anything about the first element. |
| 23:39 | cemerick | '(see — like this) |
| 23:40 | Sgeo | Yes, at a language level, but at a level of common conventions is what I'm referring to |
| 23:41 | cemerick | The language level is the only one where the first element of a list denotes anything significant. |
| 23:41 | cemerick | Beyond that, it's just people fuzzing because they see parens. :-) |
| 23:52 | duck1123 | ahh, got a big chunk of my unpushed code all pushed to github and clojars |
| 23:54 | duck1123 | I just ran "rm -rf ~/.m2/repository; lein midje" now we wait |
| 23:55 | duck1123 | and it fails on bouncycastle. *grumble* |