2012-07-26
| 00:06 | amalloy | gert: no. deftype just defines a java type, which has no slot to store docs on |
| 00:07 | gert | thanks amalloy. I wanted to use it to document the particulars of my implementation of a ring SessionStore, but I guess namespace docs and good old comments will do. |
| 00:08 | amalloy | out of curiosity, gert, what kind of seesionstore are you implementing? |
| 00:10 | gert | one that looks at the session id from the cookie, and checks to see if it looks valid. Also, one that regenerates the session id after (for example) n number of requests, after a certain time, etc. |
| 00:10 | gert | to mitigate attacks that tamper with the session id, and to prevent session fixation for example |
| 00:11 | gert | and we're storing our session map in a database |
| 03:24 | wingy | (Item/query) and (.query Item) is the same in cljs? |
| 03:35 | amalloy | no |
| 03:35 | xumingmingv | ,(defn testit [asym] (var asym)) |
| 03:35 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 03:36 | xumingmingv | what's wrong with this function definition? |
| 03:36 | xumingmingv | repl tells me that asym cannt be resolved |
| 03:37 | kral | namaste |
| 03:41 | emezeske_ | xumingmingv: There's nothing wrong with your function definition; you're calling it with an argument that is not a var |
| 03:42 | xumingmingv | the function defimition can not pass compilation |
| 03:43 | emezeske_ | Oh! var is a special form apparently |
| 03:43 | xumingmingv | yeah, var is a special form |
| 03:43 | xumingmingv | then? |
| 03:43 | emezeske_ | Well anyway, asym is not a var |
| 03:43 | xumingmingv | so i can not write a function like this? |
| 03:44 | emezeske_ | What are you trying to do? |
| 04:04 | meenal | Hi |
| 04:07 | meenal | I would like to know if clojure-contrib is a right choice for handling exceptions in clojure.contrib.condition |
| 04:07 | AWizzArd | Clojure Contrib is no more. |
| 04:08 | meenal | ok. for exception handling, clojure provides a condition library |
| 04:09 | meenal | should i go for it or just create class that extends java's Exception |
| 04:10 | AWizzArd | As you wish, but I personally would typically try to avoid subclassing, if there is an easier way to do it in Clojure. |
| 04:11 | meenal | If I use this clojure library and produce a jar of my project, will it cause concerns for java interop (when i have to include this small jar module in other java projects)? |
| 04:11 | amalloy | $google clojure slingshot exception |
| 04:11 | lazybot | [scgilardi/slingshot · GitHub] https://github.com/scgilardi/slingshot |
| 04:12 | amalloy | ^ lets you throw maps and catch exceptions based on data contained in the map |
| 04:14 | AWizzArd | amalloy: yes good, that was the thing I wanted to name |
| 04:14 | meenal | ok. thank u. I will have a look at slingshot |
| 05:06 | tzar | How would I write in a functional manner a function which checks several conditions, and for each condition, if that condition is true a value/transformation is added to a list which is returned at the end? |
| 05:07 | tzar | I'm thinking, list of functions which return transformation or nil, map over that list, then remove nils |
| 05:17 | tzar | got to run, will go with that approach for now |
| 05:18 | clgv | tzar: use keep isntead of map |
| 05:32 | xumingmingv | anyone have a look at this: http://stackoverflow.com/questions/11666364/clojure-compile-issue |
| 05:36 | cemerick | xumingmingv: answered |
| 05:38 | xumingmingv | actually what i want to return IS (var asym) |
| 05:38 | xumingmingv | what i really want to do is get the type hint of a function's param dynamically |
| 05:39 | xumingmingv | so here asym will be a function |
| 05:39 | xumingmingv | if i want to get the metadata of a function |
| 05:39 | xumingmingv | i need to use: (meta (var asym)) |
| 05:40 | cemerick | oh, I see, asym is a symbol that names a var? |
| 05:41 | cemerick | If so, use `resolve`: ##(meta (resolve '+)) |
| 05:41 | lazybot | java.lang.SecurityException: You tripped the alarm! resolve is bad! |
| 05:41 | cemerick | meh |
| 05:41 | cemerick | ,(meta (resolve '+)) |
| 05:41 | clojurebot | {:ns #<Namespace clojure.core>, :name +, :file "clojure/core.clj", :line 920, :arglists ([] [x] [x y] [x y & more]), ...} |
| 05:41 | cemerick | xumingmingv: ^^ |
| 05:42 | xumingmingv | haha...resolve is bad... |
| 05:42 | xumingmingv | lazybot is more tough than clojurebot? :) |
| 05:43 | cemerick | yeah, just different sandbox rules. |
| 06:01 | iDesperadO | I have a cross-out fn like (defn (cross-out [p coll] (filter #(not (zero? (rem % p))) coll)), and I want to cross out from a vector every number starting at 2. that's, I got a vector of numbers, say V = (range 1 1000), and I have a number p = 2 and I want to cross out every number that's composite with p. then let p = 3, repeat the previous step... |
| 06:02 | iDesperadO | how can i do that? |
| 06:05 | zoldar | iDesperadO: so that's basically Eratosthenes Sieve? |
| 06:05 | iDesperadO | zoldar: yes |
| 06:05 | iDesperadO | zoldar: I'm implementing it |
| 06:06 | iDesperadO | zoldar: find I'm kinda lost in loop/recur |
| 06:07 | zoldar | iDesperadO: I would try to work something out with iterate given fn and (range 1 n). I suppose there's no need to go down to loop/recur |
| 06:08 | iDesperadO | zoldar: what i think is I have to filter the V many times... |
| 06:08 | zoldar | iDesperadO: that's what iterate is suitable for |
| 06:08 | zoldar | ,(doc iterate) |
| 06:08 | clojurebot | "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects" |
| 06:09 | iDesperadO | ha...exactly |
| 06:10 | iDesperadO | let me try it |
| 06:11 | seaword | I'm playing round in the repl and can access the value of an item in a hash by either: (:key hash) or (hash :key). Is one way preferred over the other? |
| 06:13 | iDesperadO | seaword: I'm afraid the first one is prefered, since a hash's key is itself a function...:) |
| 06:14 | clgv | seaword: for keywords use (:key m) for data use (m data). explicitely using get is possible as well (get m data) |
| 06:14 | zoldar | iDesperadO: that's rather because keyword implements IFn |
| 06:15 | seaword | Ok great, thanks guys. That clarifys it very nicely. |
| 06:20 | iDesperadO | zoldar: I'm afraid I still have to use loop/recur |
| 06:21 | iDesperadO | (iterate (partial cross-out p) V) ... I have to change p every iteration |
| 06:21 | clgv | iDesperadO: maybe you can use reduce then |
| 06:22 | iDesperadO | ok, let me see |
| 06:22 | clgv | but that only makes sense if you got some input. |
| 06:22 | clgv | doess crossout change p? |
| 06:23 | iDesperadO | clgv: reduce is an accumulator |
| 06:23 | clgv | yeah, you could reduce over the p-collection |
| 06:23 | clgv | but only if it is changed outside |
| 06:24 | iDesperadO | (defn cross-out [p coll] (filter (= 0 #(rem % p) coll))) |
| 06:24 | clgv | ah prime-sieve? |
| 06:24 | iDesperadO | yeah |
| 06:24 | iDesperadO | I just want to filter V with my cross-out fn |
| 06:25 | iDesperadO | but here I have to change p every time |
| 06:25 | clgv | do you want to do it on your own? otherwise there are already some clojure examples how to do that |
| 06:26 | iDesperadO | I want to do it my own |
| 06:26 | iDesperadO | now I just want to know how to change p every time when I apply filter cross-out on some Vector(e.g. (range 2 n)) |
| 06:27 | clgv | iDesperadO: I would indeed use recursion instead of iterate there |
| 06:28 | iDesperadO | so...just go back to the first...I said I'm lost in loop/recur |
| 06:28 | iDesperadO | :) |
| 06:29 | clgv | because lazy is no advantage for that task and you now exactly when you are finished (recursion base case) |
| 06:30 | iDesperadO | I just don't know how to use recursion(loop/recur) here |
| 06:31 | iDesperadO | clgv: I don't know how to stop |
| 06:32 | iDesperadO | (loop [p 2 coll (range 2 1000)] (if ...? |
| 06:32 | clgv | iDesperadO: you can call cross-out recursively. (defn cross-out [p, numbers, primes] ...) |
| 06:33 | clgv | you filter through numbers. the first element in numbers is your next prime. if numbers is empty you are done |
| 06:33 | clgv | you have to add the next prime to primes. |
| 06:34 | davidykay | hey folks, noob question here: I'm writing a web app and dealing with a funny situation where my params map can either have keys of keywords or strings (:_id vs "_id"). is there an easy fix? I can't query the map consistently because of the discrepancy. thanks! |
| 06:34 | zoldar | That's my failed attempt: (loop [[f & r] (range 2 1000)] (let [sieved (remove #(zero? (mod % f)) r)] (if (= sieved r) sieved (recur r)))) |
| 06:35 | zoldar | ahhh |
| 06:35 | davidykay | oh ho, "keyword" function. I'll try that |
| 06:36 | clgv | iDesperadO: got it? detailed explanation would be the fn implementation ;) |
| 06:36 | ro_st | anyone using airbrake? |
| 06:38 | iDesperadO | clgv: ....sorry no |
| 06:39 | iDesperadO | clgv: still don't get it |
| 06:39 | clgv | iDesperadO: you have to separate identified primes and numbers that remain to be filtered. if no numbers remain to be filtered you are done |
| 06:41 | iDesperadO | so in your (cross-out numbers primes) for numbers it's (range 2 n), and primes is primes identified and added to it? |
| 06:41 | iDesperadO | and when numbers is empty, we got primes as the result? |
| 06:43 | iDesperadO | This is just an expression of the algorithm. I just don't know how to filter numbers repeatedly with different parameter |
| 06:44 | iDesperadO | zoldar: so... you got it? |
| 06:45 | zoldar | ,(loop [primes [] [f & r] ((comp rest rest) (range))] (let [sieved (remove #(zero? (mod % f)) r)] (if (= (count primes) 10) primes (recur (conj primes f) sieved)))) |
| 06:45 | clojurebot | [2 3 5 7 11 ...] |
| 06:45 | zoldar | really clunky |
| 06:46 | clgv | iDesperadO: you can simply call (recur (first filtered-numbers), filtered-numbers, (conj primes (first filtered-numbers))) |
| 06:47 | iDesperadO | zoldar: can't understand your solution |
| 06:48 | iDesperadO | clgv: let me try with loop/recur |
| 06:48 | clgv | iDesperadO: you dont need loop necessarily. |
| 06:48 | iDesperadO | clgv: ah |
| 06:49 | clgv | you can also call the function tail recursively |
| 06:49 | iDesperadO | clgv: I'm afraid recur is most mysterious function for me |
| 06:50 | clgv | iDesperadO: (defn f [p, primes, numbers] (if ... ... (recur p*, primes*, numbers*)) -> recur just calls f recursively in a non stack consuming way |
| 06:50 | clgv | it is a special form - no function |
| 07:41 | iDesperadO | zoldar: clgv (defn prime-factors [n] (loop [p 2 coll (range 2 (+ 1 n))] (if (>= p n) coll (recur (inc p) (cross-out p coll))))) given the definition of cross-out as (defn cross-out [p coll] (filter #(not (zero? (rem % p))) coll))...why this prime-factors is not right??? |
| 07:41 | lazybot | iDesperadO: How could that be wrong? |
| 07:42 | iDesperadO | anybody here? |
| 07:44 | clgv | iDesperadO: what error do you encounter? |
| 07:45 | clgv | iDesperadO: ah lol. (rem x x) => 0 |
| 07:45 | clgv | iDesperadO: that's why I told you to split into a numbers coll and a primes coll |
| 07:45 | iDesperadO | ClassCastException clojure.lang.PersistentVector cannot be cast to java.lang.Number clojure.lang.Numbers.add (Numbers.java:126 |
| 07:46 | clgv | didnt see that one |
| 07:48 | clgv | &(map #(rem % %) (range 2 10)) |
| 07:48 | lazybot | ⇒ (0 0 0 0 0 0 0 0) |
| 07:50 | iDesperadO | clgv: I didn't do #(rem % %) I do (rem % p)... |
| 07:51 | clgv | iDesperadO: yes but p is in coll. hence you will remove all numbers from coll: primes and non-primes |
| 07:52 | clgv | iDesperadO: so you always return an empty coll |
| 07:55 | iDesperadO | .... |
| 07:55 | clgv | iDesperadO: and because of your (inc p) you are not really preforming the prime sieve. you should only use primes to filter and not every natural number |
| 07:57 | iDesperadO | clgv: since I don't know how to get the prime |
| 07:58 | clgv | clgv: you filter coll with the prime 2. the first number in the resulting coll is prime - in this case 3 |
| 08:05 | xumingmingv | a silly question, what is a symbol(clojure.lang.Symbol), when do we have to touch directly? |
| 08:05 | clgv | xumingmingv: can you be more specific? |
| 08:05 | antares_ | xumingmingv: when you need to pass a function by name, for example: (map my-fn v) |
| 08:05 | antares_ | also when you are writing a macro |
| 08:06 | antares_ | or when you want to extend a protocol for symbols (like serialization), you will extend it for clojure.lang.Symbol (although clojure.lang.Named should be sufficient, too) |
| 08:06 | clgv | implicitly: every time you name anything - the reader stores those names as symbols |
| 08:06 | xumingmingv | ,(defn x [] 1) (symbol? x) |
| 08:06 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 08:07 | xumingmingv | hit the 'SANBOX DENIED" again... |
| 08:07 | clgv | &(symbol? 'x) |
| 08:07 | lazybot | ⇒ true |
| 08:07 | xumingmingv | I tried in my laptop |
| 08:07 | clgv | &(symbol? 'bla.blubb/x) |
| 08:07 | lazybot | ⇒ true |
| 08:07 | xumingmingv | &(defn x [] 1) (symbol? x) |
| 08:07 | lazybot | java.lang.SecurityException: You tripped the alarm! def is bad! |
| 08:07 | clgv | I quoted the names since otherwise the reader would try to resolve them |
| 08:08 | clgv | xumingmingv: x will be resolved to that function in this case |
| 08:08 | clgv | xumingmingv: you can check that: (defn x [] 1) (fn? x) |
| 08:09 | xumingmingv | ah, I understand |
| 08:10 | xumingmingv | so (symbol? 'x) is right command to try |
| 08:10 | xumingmingv | (symbol? x) returns false, what is the 'x' here? |
| 08:12 | xumingmingv | oh, it is a clojure.lang.Fn |
| 08:13 | xumingmingv | thanks clgv, antares_ ! |
| 08:13 | antares_ | xumingmingv: that's because x is evaluated |
| 08:13 | antares_ | xumingmingv: (symbol? 'x) |
| 08:13 | antares_ | ,(symbol? 'x) |
| 08:13 | clojurebot | true |
| 08:13 | clgv | xumingmingv: (symbol? x) the x here is a symbol. but the reader tries to resolve it on read. that means smybol is called with wathever x is resolved to |
| 08:14 | clgv | oh no. reading is fine - evaling is the point ^^ |
| 08:15 | xumingmingv | much clear, thanks |
| 08:24 | xumingmingv | clgv, antares_, what is a function param? is it a symbol, or var? or something else? |
| 08:24 | xumingmingv | I mean y in (defn x [y] y) |
| 08:26 | clgv | xumingmingv: a local binding |
| 08:26 | clgv | similar to the ones defined in let |
| 08:26 | xumingmingv | a local binding is a totally different thing from symbol or var? |
| 08:27 | antares_ | xumingmingv: y is a symbol but it evaluates to a local (or local binding) |
| 08:27 | xumingmingv | what is it class? like clojure.lang.Symbol for symbol |
| 08:27 | antares_ | xumingmingv: symbol is just a name |
| 08:27 | clgv | xumingmingv: on compilation it is a symbol. at runtime it is the name for a value |
| 08:27 | antares_ | what it evaluates to can be anything |
| 08:35 | harja | iDesperadO: how about https://gist.github.com/3181751 at least the first 1000 are correct :) |
| 08:36 | harja | that was without loop...recur |
| 08:41 | xumingmingv | antares_: then function param(a symbol) can be resolved to a var, right? then how do we explain this? http://stackoverflow.com/questions/11666364/clojure-compile-issue |
| 08:41 | antares_ | xumingmingv: to a local |
| 08:41 | antares_ | vars are namespace-global |
| 08:41 | antares_ | locals are local to the function |
| 08:42 | antares_ | if a local and a var happen to have the same name, local takes precedence |
| 08:42 | antares_ | that is called "shadowing" and it generally should be avoided |
| 08:43 | antares_ | it is not different from a lot of other languages |
| 08:44 | xumingmingv | but in other language like java, if a method can accept anything no matter it is a local variable or a global variable |
| 08:44 | xumingmingv | but the special form only accept var, and not local |
| 08:44 | xumingmingv | but the special form 'var' only accept var, not local |
| 08:45 | iDesperadO | harja: it's so slow |
| 08:45 | harja | well that's kind of a given thing since there is no optimizations goin on there |
| 08:48 | harja | you can get it a bit faster if you can assume an ordering for the sequence it takes (no need to seek for the maximal element) |
| 08:50 | harja | I thought that the original question was that is that sieve doable without loop...recur |
| 08:50 | iDesperadO | ok |
| 08:51 | iDesperadO | harja: I'm kinda still trying to understand your solution |
| 08:52 | iDesperadO | harja: is it reduce supposed to return only a value? now it seems it return a sequence |
| 08:54 | harja | Yes, every step returns a value. The value we return is a sequence. |
| 08:55 | harja | and that returned value gets fed up to the next function call with the next value from the sequence we are reducing |
| 08:55 | harja | so, we are not feeding the actual values as the source sequence, but the filtering values instead |
| 08:55 | harja | and the value we return from reduce is the list that was filtered with the given value |
| 08:56 | iDesperadO | (reduce f val coll) first consume val and (first coll) applying f to get a result and then apply f with result and (first (rest coll) ...finally returns a value |
| 08:56 | harja | yes |
| 08:57 | harja | but sequence is a value, it's just something we get as a parameter to our next reduce step |
| 08:57 | cemerick | FYI: the 2012 State of Clojure survey closes in 30 minutes. Get your 2¢ in while you still can: http://cemerick.com/2012/07/19/2012-state-of-clojure-survey/ |
| 08:57 | clgv | cemerick: when will you publish the results? |
| 08:57 | cemerick | clgv: sometime next week |
| 08:58 | harja | So, every time the reduce calls our function, the function gets as parameters the filtered list and the next number to filter the list on, which gets passed to the next function call |
| 08:59 | harja | Btw, I got the execution time to less than half if we assume an ordering in the incoming sequence |
| 08:59 | harja | just replace apply max value as (first value) or (last value) depending on the order you assume to get the stuff in |
| 09:00 | ro_st | any of you guys use Airbrake? |
| 09:03 | antares_ | by the way, anybody going to http://amsclj.nl/october.htm? I'm thinking of submitting a talk |
| 09:10 | harja | iDesperadO: Check out the gist again. I added three different versions with different assumptions on the data and the timing information on them |
| 09:10 | harja | so, there are some differences :) |
| 09:15 | iDesperadO | harja: (not-multiples-or-1 [1 2 3 4 5 6 7 8 9 10 11 12] 2) returns (2 3 5 7 9 11) containing 2 itself |
| 09:16 | iDesperadO | (defn cross-out [p coll] (filter #(and (> % p) (not (zero? (rem % p)))) coll)) |
| 09:16 | harja | iDesperadO: Yes, it assumes that a number is not a multiple of itselt |
| 09:16 | harja | it's just a matter of definition :) |
| 09:16 | iDesperadO | (cross-out 2 [1 2 3 4 5 6 7 8 9 10 11 12]) returns (3 5 7 9 11) |
| 09:17 | harja | yes, but the way the filtering is done that was easier to do |
| 09:17 | harja | and basically it just boils down to how is "n is a multiple of m" defined |
| 09:18 | harja | I bent the rules a bit there to make it more convenient to implement |
| 09:19 | iDesperadO | harja: i'm thinking about why my cross-out function returns the result not containing 2... |
| 09:19 | clgv | iDesperadO: thats because of ##(rem 2 2) |
| 09:19 | lazybot | ⇒ 0 |
| 09:19 | craigbro | wow |
| 09:19 | ro_st | such a pity you can't wrap enfocus transformation groups with let forms |
| 09:19 | craigbro | think I found bug in clojure.string/replace |
| 09:20 | iDesperadO | :( |
| 09:20 | craigbro | ,(clojure.string/replace "/paths/%5c44WINDOW" #"(?:%[0-9A-Fa-f]{2})+" "\\") |
| 09:20 | clojurebot | #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1> |
| 09:20 | iDesperadO | clgv: I've already specified that (> % p) % have to be greater than p |
| 09:22 | clgv | thats what excludes 2 |
| 09:23 | clgv | both in fact^^ |
| 09:24 | locojay1 | hi , how can i use twitter bootstrap function with jayq. (.toolip $( :#myid) (clj->js {:placement :left})) does not work |
| 09:26 | clgv | iDesperadO: change it to (or (= % p) (-> % (rem p) zero? not)) to keep p in there |
| 09:28 | iDesperadO | harja: I still don't know why (primes-XXX) functions return a sequence |
| 09:28 | iDesperadO | clgv: ok |
| 09:30 | harja | well, it returns whatever reduce returns? |
| 09:30 | harja | and since we build a sequence in the reduce phase, it's what comes out |
| 09:30 | clgv | iDesperadO: reduce returns anything you build. if you build a sequence via conj from [] it will return the vector, if you just sum up via + it will return a number |
| 09:31 | iDesperadO | ah... |
| 09:32 | harja | Playing around in the REPL is the easiest way to go with these things. Just put in stuff and see what comes out :) |
| 09:33 | harja | But, got to go away now. Bye! |
| 09:33 | iDesperadO | harja: thanks |
| 09:33 | iDesperadO | I'm eval all the way to repl... |
| 09:33 | iDesperadO | only to find it errs back |
| 09:34 | eduard | how to see Locals in backtrace? Emacs, swank-clojure 1.4.4, clojure-jack-in |
| 09:35 | clgv | iDesperadO: try to develop small functions step by step testing them in repl while developing |
| 09:36 | iDesperadO | ok |
| 09:37 | ro_st | eduard: you only see em when you breakpoint. put (swank.core/break) somewhere and run your code |
| 09:37 | ro_st | all the locals at that point will appear |
| 09:37 | eduard | ro_st, Thanks, will try |
| 09:38 | ro_st | when debugging, i usually bind everything into a let and put just the break and the return in the body |
| 09:38 | iDesperadO | clgv: thanks a lot |
| 09:40 | iDesperadO | clgv: sometimes I find after I read the doc of a function/special form, I don't get better understanding with it |
| 09:40 | iDesperadO | like reduce |
| 09:40 | iDesperadO | you said I can build anything with reduce |
| 09:40 | eduard | ro_st, Is there another way? I don't need breakpoint, I want to find out what arguments function was called with. |
| 09:41 | iDesperadO | so I tried (reduce cons (range 1 5)) |
| 09:41 | ro_st | eduard: then drop a swank.core/break in at the top of the fn body |
| 09:41 | ro_st | as the args are locals in that lexical scope, they'll show up at that breakpoint |
| 09:41 | clgv | iDesperadO: did you read any introductory book on clojure? |
| 09:41 | ro_st | you don't need to let-bind them |
| 09:42 | clgv | &(reduce cons '() (range 1 5)) |
| 09:42 | lazybot | java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long |
| 09:42 | clgv | &(reduce conj [] (range 1 5)) |
| 09:42 | lazybot | ⇒ [1 2 3 4] |
| 09:43 | iDesperadO | which book you recommend? |
| 09:43 | iDesperadO | clojure programming? |
| 09:43 | clgv | cons has a different argument order than reduce expect. so you would need to write the reduce like ##(reduce #(cons %2 %1) '() (range 1 5)) |
| 09:43 | lazybot | ⇒ (4 3 2 1) |
| 09:44 | clgv | iDesperadO: I can't recommend what I didnt read. It's the most recent book, though |
| 09:44 | iDesperadO | so just recommend what you've read, maybe? |
| 09:44 | iDesperadO | :) |
| 09:45 | iDesperadO | clgv: how do i know the argument order that reduce expects? |
| 09:45 | clgv | iDesperadO: "Programming Clojure" 1st edition. there is a 2nd edition out now. and "Joy of Clojure" |
| 09:46 | iDesperadO | clgv: sadly I've read all of them...though very quickly |
| 09:46 | iDesperadO | seems I didn't get anything out of those books |
| 09:46 | craigbro | hmm |
| 09:46 | craigbro | actually, I think it's a bug in clout |
| 09:46 | clgv | iDesperadO: humm thats sad but happens |
| 09:46 | craigbro | as in, clout needs to quote the decoded value |
| 09:47 | cshell | Clojure Programming is the best, in my opinion |
| 09:47 | iDesperadO | I guess I just need to write more |
| 09:48 | iDesperadO | to be specific, how can i find the arguments order that reduce expect? |
| 09:48 | iDesperadO | why cons is not suitable while conj is |
| 09:48 | clgv | ,(doc reduce) |
| 09:48 | 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... |
| 09:49 | iDesperadO | (conj coll x) (cons x coll) |
| 09:49 | clgv | exactly |
| 09:49 | iDesperadO | this is the different..I've doced them to choose cons for reduce |
| 09:50 | clgv | the first param is the previous result or initial value and the second param is the current value from the collection |
| 09:50 | iDesperadO | and (reduce f coll) |
| 09:50 | iDesperadO | or (reduce f val coll) |
| 09:50 | iDesperadO | substitute f with cons... |
| 09:51 | iDesperadO | i get (reduce cons val coll) which I seems fit with cons,not conj |
| 09:51 | iDesperadO | so ? |
| 09:51 | clgv | iDesperadO: it is (reduce (fn [coll, val] (conj coll val)) [] (range 10)) |
| 09:52 | iDesperadO | clgv: still here? |
| 09:53 | clgv | yeah |
| 09:54 | iDesperadO | ... |
| 09:56 | iDesperadO | clgv: not receiving my message? |
| 09:56 | cshell | he was responding to you |
| 09:56 | cshell | <clgv> iDesperadO: it is (reduce (fn [coll, val] (conj coll val)) [] (range 10)) |
| 09:57 | iDesperadO | ah...I've missed all his messages |
| 09:58 | iDesperadO | but the doc said clojure.core/reduce ([f coll] [f val coll]) |
| 09:59 | iDesperadO | val comes before the coll |
| 09:59 | clgv | iDesperadO: thats the signature of reduce. the signature of the function f is described in the text |
| 10:00 | babilen | Does anybody know if/when clojuredocs.org will be upgraded to 1.4? |
| 10:01 | iDesperadO | If val is supplied, returns the |
| 10:01 | iDesperadO | result of applying f to val and the first item in coll, then |
| 10:01 | iDesperadO | applying f to that result and the 2nd item, etc. If coll contains no |
| 10:01 | iDesperadO | items, returns val and f is not called. |
| 10:02 | iDesperadO | clgv: I can't see what's described in the doc that's said the parameters order of f |
| 10:03 | iDesperadO | (source reduce) shows ...(clojure.core.protocols/coll-reduce coll f val))) |
| 10:04 | joly | ,(reduce - 0 '(1 2 3 4)) |
| 10:04 | clojurebot | -10 |
| 10:05 | clgv | iDesperadO: the text translated means first call: (f val (first coll)) oder (f (first coll) (second coll)). after that the result is always the first param and the next element is the second |
| 10:07 | iDesperadO | clgv: so with f being cons/conj? |
| 10:08 | joly | ,(reduce #(conj %1 (+ (last %1) %2)) '(1 2 3 4)) |
| 10:08 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 10:08 | joly | ,(reduce #(conj %1 (+ (last %1) %2)) [] '(1 2 3 4)) |
| 10:08 | clojurebot | #<NullPointerException java.lang.NullPointerException> |
| 10:08 | joly | ... |
| 10:09 | iDesperadO | ,(reduce conj [] (range 1 5)) |
| 10:09 | clojurebot | [1 2 3 4] |
| 10:09 | joly | ,(reduce #(conj %1 (+ (last %1) %2)) [1] '(2 3 4)) |
| 10:09 | clojurebot | [1 3 6 10] |
| 10:09 | iDesperadO | ,(reduce cons 1 (range 2 5)) |
| 10:09 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 10:12 | clgv | &(reduce #(cons %2 %1) '() (range 1 5)) |
| 10:12 | lazybot | ⇒ (4 3 2 1) |
| 10:12 | iDespera1O | clgv: I lost my connection |
| 10:12 | iDespera1O | ....:( |
| 10:12 | iDespera1O | twice |
| 10:12 | clgv | &(reduce #(cons %2 %1) '() (range 1 5)) |
| 10:12 | lazybot | ⇒ (4 3 2 1) |
| 10:13 | iDespera1O | ,(reduce cons 1 (range 2 5) |
| 10:13 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 10:13 | iDespera1O | ,(reduce conj [] (range 1 5)) |
| 10:13 | clojurebot | [1 2 3 4] |
| 10:14 | iDespera1O | (reduce cons 1 (range 2 5) not supposed to produce [1 2 3 4]? |
| 10:14 | joly | with just conj or cons, I keep having to remember which argument is the collection. I was hoping with my example, it was clearer which order they were provided to the function |
| 10:14 | xumingmingv | what does reify create? in bytecode level. a class? |
| 10:15 | iDespera1O | joly: (cons x seq) |
| 10:15 | iDespera1O | the second is the collection |
| 10:15 | clgv | xumingmingv: an anonymous class from your perspective and an instance of it |
| 10:15 | iDespera1O | and I didn't see your example |
| 10:15 | joly | iDespera1O: yes, I mean in this reduce case |
| 10:15 | iDespera1O | can you show me again? |
| 10:16 | iDespera1O | I lost my connection twice |
| 10:16 | joly | ,(reduce #(conj %1 (+ (last %1) %2)) [1] '(2 3 4)) |
| 10:16 | clojurebot | [1 3 6 10] |
| 10:16 | joly | in retrospect, I'm not sure it's very clear |
| 10:17 | iDesperadO | clgv: &(reduce #(cons %2 %1) '() (range 1 5)) |
| 10:18 | iDesperadO | this just show I have to change the parameters order, but why? it's not clear |
| 10:18 | iDesperadO | &(reduce #(cons %2 %1) '() (range 1 5)) |
| 10:18 | lazybot | ⇒ (4 3 2 1) |
| 10:18 | clgv | iDesperadO: because of ##(doc cons) |
| 10:18 | lazybot | ⇒ "([x seq]); Returns a new seq where x is the first element and seq is the rest." |
| 10:19 | joly | conj has the arguments in the opposite order (collection, then element) |
| 10:19 | iDesperadO | ....sigh |
| 10:21 | iDesperadO | I know that (conj collection element) while (cons element collection). when I apply cons/conj to reduce...I doced ##(doc reduce) only to find cons to suit reduce more naturally, but it's not. why? |
| 10:21 | lazybot | ⇒ "([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... https://www.refheap.com/paste/3808 |
| 10:22 | dnolen | iDesperadO: cons is actually an exception. conj follows the standard library pattern - collection fns take the cllection as the first arg. |
| 10:22 | cshell | I don't use cons in Clojure |
| 10:23 | cshell | use conj |
| 10:23 | iDesperadO | dnolen: ah...this explaination sounds acceptable |
| 10:23 | cshell | cons is expensive and takes a lot of time |
| 10:23 | dnolen | iDesperadO: usage of cons outside of lazy-seqs is not very idiomatic. |
| 10:23 | dnolen | cshell: ? that's not true. |
| 10:24 | cshell | Well, the way I used it did - I ran it through a profiler and it was 80% of my cpu - removing it made my program a lot faster - now that doesn't mean that I was using cons correctly ;) |
| 10:24 | iDesperadO | cshell: why cons is expensive? |
| 10:24 | dnolen | iDesperadO: it is not. |
| 10:24 | iDesperadO | cshell said cons is expensive |
| 10:24 | dnolen | iDesperadO: which doesn't make it true :) |
| 10:25 | gtrak | cons is a single object allocation and a couple of call stack frames if memory serves me right |
| 10:25 | iDesperadO | cons (fn* ^:static cons [x seq] (. clojure.lang.RT (cons x seq)))) |
| 10:25 | cshell | in my experience, it was, but I might have been doing something wrong with the underlying sequence |
| 10:25 | iDesperadO | (defn cons (fn* ^:static cons [x seq] (. clojure.lang.RT (cons x seq)))) |
| 10:26 | clgv | (inc dnolen) |
| 10:26 | lazybot | ⇒ 6 |
| 10:26 | clgv | $karma dnolen |
| 10:26 | lazybot | dnolen has karma 6. |
| 10:26 | clgv | $karma cshell |
| 10:26 | lazybot | cshell has karma 0. |
| 10:26 | gtrak | hah |
| 10:26 | clgv | ;) |
| 10:27 | gtrak | iDesperadO: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L532 |
| 10:27 | cshell | I wonder if it was because I was using a vector |
| 10:28 | gtrak | it looks like it seqs a vector |
| 10:28 | gtrak | is that slow? |
| 10:28 | dnolen | cshell: probably. |
| 10:29 | cshell | lists get added to in the front, and vectors in the back - if I did a cons on a vector I wonder if it has to iterate the vector for some reaso |
| 10:29 | cshell | n |
| 10:29 | gtrak | don't believe that's the case, but it does have to add a cons cell in the front |
| 10:29 | iDesperadO | list is quick to do the action on the lfe, while vector is quick on the right |
| 10:30 | dnolen | cshell: it will call seq on the vector and cons onto that. |
| 10:30 | dnolen | ,(time (dotimes [_ 1] (reduce #(cons %2 %1) () (range 1000000)))) |
| 10:30 | clojurebot | "Elapsed time: 440.266025 msecs" |
| 10:30 | dnolen | ,(time (dotimes [_ 1] (reduce #(cons %2 %1) () (range 1000000)))) |
| 10:30 | clojurebot | "Elapsed time: 964.152597 msecs" |
| 10:30 | dnolen | ,(time (dotimes [_ 1] (reduce #(cons %2 %1) () (range 1000000)))) |
| 10:30 | clojurebot | "Elapsed time: 986.073162 msecs" |
| 10:30 | gtrak | umm |
| 10:30 | dnolen | not sure if GC is an issue with clojurebot, but that takes ~100ms on my machine. |
| 10:30 | gtrak | why is it twice as slow the second/third time? |
| 10:31 | dnolen | gtrak: GC |
| 10:31 | gtrak | then it should at least be irregular |
| 10:31 | dnolen | ,(time (dotimes [_ 1] (reduce #(cons %2 %1) () (range 1000000)))) |
| 10:31 | clojurebot | "Elapsed time: 545.066794 msecs" |
| 10:31 | dnolen | gtrak: there you go. |
| 10:32 | gtrak | &(time (dotimes [_ 1] (reduce #(cons %2 %1) () (range 1000000)))) |
| 10:32 | lazybot | ⇒ "Elapsed time: 1269.220924 msecs" nil |
| 10:32 | gtrak | &(time (dotimes [_ 1] (reduce #(cons %2 %1) () (range 1000000)))) |
| 10:32 | lazybot | ⇒ "Elapsed time: 1195.433891 msecs" nil |
| 10:32 | iDesperadO | ...cons just some new functions called...so I think cons won't be expensive... |
| 10:33 | iDesperadO | .......tired, time to go home |
| 10:33 | cshell | If I cons a vector, and then try to get the nth element of the resulting sequence, would the time complexity be O(n), vs O(1) for a vector? |
| 10:33 | gtrak | does seqing a vector change its lookup characteristics? |
| 10:34 | iDesperadO | thank you very much clgv, dnolen cshell and other guys:) |
| 10:34 | cshell | I just added confusion ;) |
| 10:34 | iDesperadO | it helps:) |
| 10:35 | cshell | if I cons a vector, a list comes back '(1 3 2)' - my experience with cons was when I was first starting with clojure - and I was doing large collections of things |
| 10:36 | gtrak | ,(class (seq [1 2 3 4 5])) |
| 10:36 | clojurebot | clojure.lang.PersistentVector$ChunkedSeq |
| 10:36 | cshell | so I wonder if that's why my performance was really bad - not on the cons itself but on the subsequent random access |
| 10:36 | gtrak | cshell: at any rate there's a better solution, stick with vectors the whole way through |
| 10:37 | cshell | that's what i ended up doing, but using conj to add to the end |
| 10:37 | cshell | ,(class (cons 1 [2 3])) |
| 10:37 | clojurebot | clojure.lang.Cons |
| 10:37 | gtrak | looks like PersistentVector.ChunkedSeq doesn't have a shortcut for nth? |
| 10:37 | cshell | ,(class (conj [1 2] 3)) |
| 10:37 | clojurebot | clojure.lang.PersistentVector |
| 10:38 | gtrak | ,(class (rest (cons 1 [2 3]) 2)) |
| 10:38 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core$rest> |
| 10:38 | gtrak | ,(class (rest (cons 1 [2 3]))) |
| 10:38 | clojurebot | clojure.lang.PersistentVector$ChunkedSeq |
| 10:40 | gtrak | it probably could but it probably just makes more sense to stick to vectors |
| 10:41 | cshell | Yeah, so i should refine my previous statement with usage of cons is relatively expensive (O(n) vs O(1)) if you expect to perform random access on the resulting struturee? |
| 10:41 | cshell | er, structure even |
| 10:41 | gtrak | random access on a linkedlist is never a good thing |
| 10:42 | gtrak | I don't think that's very surprising |
| 10:42 | cshell | ah okay, next time I'll be more explicit :) |
| 10:45 | gtrak | does persistentvector have similar cache-locality as arraylist? |
| 10:50 | vijaykiran | seanm: |
| 11:01 | Cheiron | Hi, lately when coding in Clojure i noted this new behavior. when creating functions, i'm finding myself defining closure functions inside let form. this allowing for really neat and concise defn body |
| 11:02 | Cheiron | is it an idiomatic functional technique? |
| 11:06 | llasram | Cheiron: If I'm understanding you properly, then 100% :-) |
| 11:07 | llasram | Cheiron: There's even `letfn` for making defining local functions more concise, for when all you need the `let` form for is functions |
| 11:08 | Cheiron | llasram: so I'm on the road of true Clojure? :) |
| 11:08 | stain | are these functions you call multiple places? |
| 11:09 | llasram | We are all on the road of true Clojure, together evolving the idioms and conventions which will guide us to the Ultimate Elegance. So say we all. |
| 11:10 | llasram | Aaaaanyway, it's a common technique in any language with real lambdas. |
| 11:10 | duck1123` | def lines in places other than top level bug me, but it's not really "wrong" |
| 11:12 | Cheiron | stain: no |
| 11:13 | stain | are they long? |
| 11:13 | llasram | duck1123`: I end up having them w/in a top-level `let` sometimes, but even that feel subtly off sometimes |
| 11:13 | Cheiron | stain: no, two or three lines |
| 11:13 | stain | I would just use anonymous functions if it's use-once-short, unless they look genuinely useful, then I move them to defn. But I'm a beginner to Clojure! |
| 11:20 | S11001001 | stain: use what looks pretty; hard and fast rules will lead you astray |
| 11:20 | S11001001 | the code should be pretty |
| 11:20 | stain | that's a good guide! |
| 11:22 | stain | so no, don't use defn for every internal function, dont use letfn for every use-once function, and don't use anonymous for every one either. Common sense, make it look nice and readable. |
| 11:36 | S11001001 | I like pretty; I guess readable is okay. I like making little shapes with my lisp code, though they usually turn out looking like vietnam |
| 11:39 | stain | hehehehhe |
| 11:57 | holo | hi |
| 12:00 | holo | in java.jdbc page - http://dev.clojure.org/pages/viewpreviousversions.action?pageId=2424859 - i can't find the API versions. where can i get this information? like in my project i have [org.clojure/java.jdbc "0.2.3"], but i want a more recent version |
| 12:02 | seancorfield | it's listed here https://github.com/clojure/java.jdbc/ |
| 12:02 | seancorfield | also, this page http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go provides links to the latest versions (in maven) for all contrib libraries |
| 12:02 | solussd | Anyone have any ideas why compiling this ns declaration results in "Parameter declaration set should be a vector"? https://www.refheap.com/paste/9c66f4664ba2c7cf28a494fa7 |
| 12:03 | duck11231 | For things in central, mvnrepository is good. http://mvnrepository.com/artifact/org.clojure/java.jdbc for others, check clojars |
| 12:03 | seancorfield | 0.2.3 is the more recent release of java.jdbc btw holo |
| 12:03 | holo | seancorfield, the connection-uri is really not in 0.2.3 version right? |
| 12:04 | wmealing | seancorfield, going to take a stab at it |
| 12:04 | wmealing | but.. |
| 12:04 | holo | duck11231, nice tip. thanks |
| 12:04 | wmealing | i think that the second line in requires. |
| 12:04 | wmealing | should be using a vector, not a list |
| 12:04 | wmealing | [ not ( |
| 12:04 | wmealing | sorry, not list. |
| 12:04 | seancorfield | holo: sure it is - that was committed on jun 13th - 0.2.3 was released on jun 18th |
| 12:04 | seancorfield | look at the commit history in github |
| 12:05 | seancorfield | solussd: that second line in the :require is a ( ) but should be [ ] |
| 12:05 | wmealing | sorry, wrong person |
| 12:05 | wmealing | what sean said. |
| 12:05 | seancorfield | :) |
| 12:05 | wmealing | its late here.. |
| 12:06 | seancorfield | it's early here |
| 12:06 | solussd | seancorfield: actually, that works fine- turns out it was a bad 'defn' in one of the namespaces I was requiring. |
| 12:06 | solussd | thanks |
| 12:06 | seancorfield | ah, good to know solussd |
| 12:07 | seancorfield | i guess if you'd pastebin'd the stack trace, we'd have spotted that :) |
| 12:07 | wmealing | didnt know you could put it like that. today i learned. |
| 12:08 | seancorfield | i've been tidying up my ns declarations recently to have only one :require and one :import (if needed) |
| 12:08 | seancorfield | but i still can't break the habit of :require stuff in [ ] and :import in ( ) because that's how i always saw it in examples! |
| 12:09 | seancorfield | and i like being able to just :refer certain vars instead of just setting up an :as alias |
| 12:09 | duck11231 | I've been through every combination of () and [] in ns forms. Now I'm strictly [] |
| 12:09 | technomancy | that's not right |
| 12:09 | technomancy | import should use () |
| 12:09 | hiredman | imports should be in (), everything else in [] |
| 12:10 | seancorfield | the confusion is because the compiler allows ( ) and [ ] interchangeably - bug! |
| 12:11 | technomancy | the compiler also allows you to indent with seven spaces instead of two |
| 12:11 | technomancy | heck, it even allows the use of tabs in indentation! |
| 12:13 | burt | I have a list of vectors and I want to append an increasing number to the front of every vector. I have '([:a :b] [:c :d]) and I want '([0 :a :b] [1 :c :d]) |
| 12:13 | burt | How do I do that? |
| 12:14 | S11001001 | burt: map with 3 args and (range) |
| 12:15 | burt | S11001001: I don't follow |
| 12:15 | duck11231 | ,(doc map-indexed) |
| 12:15 | clojurebot | "([f coll]); Returns a lazy sequence consisting of the result of applying f to 0 and the first item of coll, followed by applying f to 1 and the second item in coll, etc, until coll is exhausted. Thus function f should accept 2 arguments, index and item." |
| 12:15 | S11001001 | oh yeah, forgot about that duck11231 |
| 12:17 | duck11231 | ,(map-indexed (fn [i v] (conj v i)) '([:a :b] [:c :d] [:e :f])) |
| 12:17 | clojurebot | ([:a :b 0] [:c :d 1] [:e :f 2]) |
| 12:17 | burt | duck11231: thanks |
| 12:17 | duck11231 | well, that didn't work, but you get the idea |
| 12:20 | seancorfield | ,(map-indexed (fn [i v] (into [i] v)) '([:a :b] [:c :d] [:e :f])) |
| 12:20 | clojurebot | ([0 :a :b] [1 :c :d] [2 :e :f]) |
| 12:20 | seancorfield | not sure how (in)efficient that is tho'... |
| 12:20 | seancorfield | adding to the front of vectors isn't terribly efficient, right? |
| 12:21 | burt | seancorfield: im cons'ing onto the front of them |
| 12:22 | holo | seancorfield, oh ok. when i checked with (doc clojure.java.jdbc/with-connection) it shown no connection-uri. so it's just a forgotten documentation? |
| 12:22 | burt | i know it's not as efficient, but it needs to be the front -- im manipulating CSV |
| 12:27 | S11001001 | burt: do they have to be vectors? |
| 12:35 | seancorfield | holo: you missed :connection-uri - it's there |
| 12:36 | seancorfield | http://clojure.github.com/java.jdbc/#clojure.java.jdbc/with-connection |
| 12:37 | seancorfield | you can see it here http://grab.by/eZUA |
| 12:38 | seancorfield | burt: cons'ing on the front of lists is efficient (and (cons i some-vec) will turn it into a list) |
| 12:41 | holo | seancorfield, i know it's there, but i can't find it with "doc" function. can you take a look? - https://gist.github.com/3183120 |
| 12:41 | seancorfield | my screenshot shows i used doc to display that |
| 12:42 | scriptor | holo: (clojure.repl/doc …) to be more specific |
| 12:42 | seancorfield | are you sure you don't have a much older version of java.jdbc loaded? |
| 12:44 | seancorfield | the docstring you see was current in 0.2.2 or possibly early 0.2.3-SNAPSHOT builds |
| 12:49 | mdeboard | &(doc send-off) |
| 12:49 | mdeboard | ,(doc send-off) |
| 12:50 | clojurebot | "([a f & args]); Dispatch a potentially blocking action to an agent. Returns the agent immediately. Subsequently, in a separate thread, the state of the agent will be set to the value of: (apply action-fn state-of-agent args)" |
| 12:50 | mdeboard | Does `state-of-agent' mean a reference to the agent at a particular point in time? |
| 12:53 | joly | mdeboard: state-of-agent is what is returned when you deref the agent |
| 12:53 | joly | ,@(agent "test") |
| 12:53 | clojurebot | "test" |
| 12:53 | mdeboard | I gotcha |
| 12:53 | mdeboard | just wanted to be sure |
| 12:59 | lpetit | Any CCW user right there ? |
| 12:59 | lpetit | Hello, btw :) |
| 12:59 | clgv | lpetit: here ^^ |
| 12:59 | lpetit | clgv: hi :) |
| 12:59 | clgv | hi |
| 12:59 | lpetit | clgv: are you currently using the beta software update site channel? |
| 13:00 | clgv | lpetit: no, not at work |
| 13:00 | lpetit | clgv: and at home? |
| 13:00 | clgv | I have a beta installation |
| 13:00 | clgv | do you have 0.10.0 - beta out? |
| 13:00 | lpetit | I'll release in a few minutes a new beta, with hippie completion. |
| 13:01 | clgv | "hippie completion"? |
| 13:01 | lpetit | clgv: Oh, there has been several beta released, with increasingly good (IMHO ;) ) code completion support |
| 13:01 | clgv | "hippie completion" = "code completion"? |
| 13:01 | lpetit | clgv: there was what I'm calling "repl-completion", which is based on dynamic introspection. This has been increased in the past few weeks |
| 13:02 | Horofox | what's the clojure's equivalent of ruby's irb? |
| 13:02 | lpetit | clgv: and now I've added "hippie completion": https://t.co/NgU3rq34 |
| 13:02 | technomancy | lpetit: in emacs hippie completion means it gets completion from a variety of sources; is yours the same? |
| 13:02 | lpetit | in a nutshell: uses symbols/keywords found in current file |
| 13:03 | lpetit | technomancy: in Eclipse, the meaning is "all word tokens found in all open editors". Right now my meaning is "all symbols and keywords found in same editor". |
| 13:03 | technomancy | huh, you had to implement that yourself? |
| 13:03 | clgv | good. so we are getting closer to completion for everything required/used? |
| 13:03 | lpetit | technomancy, clgv: it's just a first version, before going on holidays. Suggestions welcome |
| 13:04 | lpetit | clgv: completion for everything required/used is there since ~ 2 weeks in beta, and it's dynamic (needs a running REPL) |
| 13:04 | zerokarmaleft | Horofox: you can get a basic repl with `lein repl` |
| 13:04 | lpetit | clgv: hippie is more static, with some goodies: it completes keywords, and it completes symbols with same symbols in file, and also symbols suggestions derived from keyword names in same file (@cgrand suggestion) |
| 13:04 | metellus | assuming you're using lein (you should be using lein) |
| 13:05 | clgv | lpetit: do you plan to remove the need for a repl for code completion in the future? the plugin could have a background thread analyzing projects and dependencies... |
| 13:05 | lpetit | clgv: someday ... |
| 13:06 | mdeboard | What's the Java equiv of C#'s "MemoryStream" class? |
| 13:06 | technomancy | mdeboard: a stream coming from in-memory bytes? |
| 13:06 | technomancy | would be a ByteArrayInputStream |
| 13:06 | mdeboard | or, alternatively, i ther'es a clojure abstraction |
| 13:06 | technomancy | or OutputStream |
| 13:07 | lpetit | clgv: I'm focusing right now on improving as far as possible, but without breaking everything, what we currently have. Meaning I'm working hard on improving what is on the editor. Plugging in a background REPL for removing the need for having a live REPL is probably out of the scope of this iteration. |
| 13:07 | mdeboard | I see |
| 13:07 | semperos | dnolen: where does this 'verify' get defined? https://github.com/clojure/core.logic/blob/master/src/main/clojure/clojure/core/logic.clj#L148 |
| 13:07 | clgv | lpetit: yeah thats good. I just wanted to know if it is wanted at all ;) |
| 13:08 | lpetit | clgv: needs more hammock time : |
| 13:08 | lpetit | :) |
| 13:08 | mdeboard | technomancy: I see |
| 13:09 | clgv | lpetit: ah right - hammock-driven development ^^ |
| 13:09 | meenal | Hi, When I search on slingshot, I see people mention that they are able to avoid custom exceptions with slingshot. Can someone pls point me to how it can be achieved? |
| 13:09 | lpetit | Man, I don't know how to say it differently: Eclipse 4 's new default theme is terrible. No, it's unbearable. No, it's … well, you get the point. |
| 13:09 | jkkramer | lpetit: congrats on ccw, it's really great. I tried out 0.9 and am actually tempted to switch from emacs |
| 13:10 | semperos | nm, I see it now, parameter to the Substitutions ctor... |
| 13:11 | seancorfield | holo: did you resolve your java.jdbc issue? |
| 13:11 | lpetit | jkkramer: Thanks. I'd be interested on your positive and negative feedback. Would be real interesting to know, from the point of view of an emacs user, a revised pros/cons. |
| 13:11 | meenal | Basically, I want to write a custom exception class, just like the one written in java and would like to know how to achieve this with slingshot |
| 13:12 | lpetit | jkkramer: and if you want the test to be more complete, I invite you to try out from the beta channel : http://ccw.cgrand.net/updatesite-betas , because it is already stable, but still polishing, and has much more improved code completion. So by all means please try it if you don't already have. |
| 13:12 | technomancy | meenal: look at ex-info in clojure 1.4 |
| 13:12 | technomancy | it's a subset of what slingshot offers |
| 13:12 | technomancy | of course you don't get an actual custom class, because that's not really useful; you get an exception to which you can attach arbitrary data |
| 13:13 | jkkramer | lpetit: sure. i'll try switching for a few days soon and will take notes as I encounter issues |
| 13:13 | technomancy | meenal: slingshot offers a much nicer way to catch exceptions |
| 13:13 | technomancy | but you don't need it to throw |
| 13:13 | lpetit | jkkramer: thanks. I for sure know there are big missing holes, but I'm not quite sure what the most annoying ones are. |
| 13:14 | jkkramer | lpetit: my main blockers in the past were rainbow parens (yuck) and leiningen integration. since you solved those, going to give it an earnest try |
| 13:14 | lpetit | jkkramer: I'll be on holidays, but you can usually find cemerick on the clojure or ccw IRC channels |
| 13:14 | jkkramer | ok |
| 13:14 | mdeboard | This is probably a questoin without enough information, but if a Java class constructor signature takes an OutputStream instance as one of its args, would it suffice to pass `(partial output-stream)' when constructing that class in Clojure? |
| 13:14 | lpetit | jkkramer: ok |
| 13:15 | lpetit | jkkramer: I want a report on my laptop by the end of my holidays ! :-D |
| 13:15 | jkkramer | lpetit: i'll see what i can do ;) |
| 13:15 | lpetit | just kidding |
| 13:17 | dnolen | semperos: that's how disequality constraints work in master - that will be changing soon. |
| 13:17 | dnolen | semperos: are you just curious about the implementation details? |
| 13:17 | lpetit | clgv: wrt starting a repl in the background, I have contemplated a middle road … if a REPL is needed but none is started, try to start a REPL for the project the editor lives in … not sure if it would bring more goodness than edge cases, though |
| 13:17 | semperos | I'm working on the custom unification for my record, following the whole flow to learn how everything works together |
| 13:18 | mdeboard | guess I'll just call new against java.io.OutputStream and use htat |
| 13:19 | clgv | lpetit: I cant tell either ;) |
| 13:21 | meenal | thank u, technomancy. I will take a look at ex-info and seek ur advice if i have any questions |
| 13:23 | XPherior | So.. About Sandbar. It uses sessions to keep track of who's logged in. Isn't it bad practice to use sessions for that? |
| 13:24 | technomancy | is sandbar still maintained? |
| 13:24 | XPherior | technomancy: Now that I glance at it, not really. What're people using for a login systems nowadays? |
| 13:24 | dnolen | semperos: yeah verify is not related to unification really. it's just identity fn until you actually use a != goal. in the next version of core.logic there's a more robust solution. |
| 13:25 | technomancy | XPherior: friend looks promising |
| 13:25 | dnolen | semperos: actually it's not true that it's not related to unification, but again it's a implementation detail that's changing. |
| 13:25 | XPherior | technomancy: Thanks. I'll have a peek. :) |
| 13:25 | semperos | gotcha; was looking at how unify-terms dispatches on lvar, and chained my way back up to it |
| 13:26 | dnolen | semperos: yeah assume it's the identity fn in your reading. |
| 13:26 | semperos | dnolen: makes sense |
| 13:27 | mdeboard | Java interop question. A class constructor (http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfCopy.html) takes an OutputStream instance as one of its args. Can anyone point me in the right direction on constructing this class in Clojure? |
| 13:28 | dakrone | mdeboard: http://clojuredocs.org/clojure_core/clojure.java.io/output-stream |
| 13:28 | mdeboard | dakrone: Yeah, but I am not sure what arg I should be passing to that fn |
| 13:28 | mdeboard | and `(partial output-stream)' throws an exception |
| 13:28 | dakrone | "Default implementations are defined for OutputStream, File, URI, URL, Socket, and String arguments." |
| 13:29 | dakrone | so any of those |
| 13:30 | mdeboard | literally `(output-stream java.io.OutputStream)'? I tried that, as well as `(output-stream (new java.io.OutputStream))', I think I'm confused. |
| 13:31 | mdeboard | (I'm new to the java interop part of clojure) |
| 13:31 | llasram | mdeboard: Try `(output-stream "my-delightful-output-file-name")` |
| 13:33 | llasram | mdeboard: This actually hides the interop side. It returns an instance OutputStream, which happens to be a particular Java class, but with exactly the same implications as e.g. strings being instances of java.lang.String. |
| 13:34 | mdeboard | I see. I think I accidentally didn't listen to technomancy when he said I want a ByteArrayInputStream |
| 13:34 | llasram | Oh, geez -- always listen to technomancy |
| 13:35 | llasram | Aynway :-), if you need a ByteArrayInputStream or ByteArrayOutputStream, then you do need to construct it yourself w/ interop |
| 13:36 | llasram | $(java.io.ByteArrayOutputStream.) |
| 13:36 | llasram | .r |
| 13:36 | llasram | Man, home row |
| 13:36 | llasram | &(java.io.ByteArrayOutputStream.) |
| 13:36 | llasram | Oh, lazybot dead? |
| 13:36 | llasram | ,(java.io.ByteArrayOutputStream.) |
| 13:37 | clojurebot | #<ByteArrayOutputStream > |
| 13:37 | llasram | Anyway, you get the gist |
| 13:37 | mdeboard | Actually, wrong, I do need OutputStream since that's what this Java method's signature requires |
| 13:37 | llasram | ByteArrayOutputStream is a subclass of OutputStream, so you can use it anywhere where the type signature requires the superclass |
| 13:38 | llasram | Inheritance-based polymorphism may be rife with peril, but it's what you get in Java interop |
| 13:39 | mdeboard | I see. Thanks for your help, I'm rewriting a C# library that uses a 3rd party lib in Clojure by referencing the javadocs for the Java version of the same lib. |
| 13:39 | mdeboard | that is, I'm rewriting in Clojure, it doesn't use a 3rd party lib written in Clojure |
| 13:39 | llasram | Gotcha :-) |
| 13:40 | mdeboard | aha look at that, ByteArrayOutputStream works |
| 13:49 | holo | seancorfield, i didn't. i'm a bit laggy over here ^^ my doc is also clojure.repl/doc . so strange this issue. for sure i'm using an older version, what else can it be? but my project specifies version 0.2.3 |
| 14:37 | mdeboard | How do you ensure that you're calling a class method if the class has a method and an attribute with the same name? wrt Java interop & classes. There's a class I'm using that has a 'close' attrib and a 'close' method. |
| 14:37 | mdeboard | which is terrible |
| 14:40 | llasram | mdeboard: I'm failing to recall how you do it w/ earlier versions, but starting w/ 1.4 there's a separate syntax for field access: (.close x) is the method call, (.-close x) is the field access |
| 14:40 | mdeboard | oic |
| 14:40 | mdeboard | thankfully I"m on 1.4 |
| 14:40 | edw | Any having problems using CLOJURE-JACK-IN in the lastest Emacs from the git repo? I'm getting a "Symbol's function definition is void" cl-set-getf" error. |
| 14:40 | edw | Using lein-swank 1.4.4. |
| 14:41 | technomancy | edw: maybe (require 'cl)? |
| 14:41 | technomancy | edw: alternatively: https://github.com/kingtim/nrepl.el |
| 14:41 | hiredman | in clojure (.close x) is no-arg method or field, the compiler an figure out which reflectively |
| 14:41 | edw | nrepl? Instead of Emacs?! |
| 14:41 | hiredman | in clojurescript it cannot, so a distinctive syntax as introduced (.-close x) for field, (.close x) for method |
| 14:41 | technomancy | edw: no? |
| 14:41 | mdeboard | hiredman: how? foo.close returns a boolean, foo.close() actually closes the thing |
| 14:41 | edw | Oh, I see. Sorry. |
| 14:42 | technomancy | heh |
| 14:42 | hiredman | clojure has support for (.-close x) field access, but there is little reason to use it |
| 14:42 | llasram | hiredman: Unless you have a field and a method w/ the same name, right? |
| 14:42 | hiredman | llasram: sure |
| 14:42 | llasram | hiredman: Ok, which is the case we're talking about :-) |
| 14:44 | edw | (require 'cl) didn't work, btw. |
| 14:45 | mdeboard | llasram: Thanks, I was pretty confused for a second |
| 14:48 | patrkris | hi folks. I'm looking for a CalDAV client library for Clojure or Java. Can anyone recommend one, or perhaps recommend an HTTP library which is relatively easy to extend? |
| 14:52 | edw | technomancy: Not to be a PITA, but nrepl doesn't seem to be in Marmalde's repo. |
| 14:52 | technomancy | edw: it should be there |
| 14:52 | technomancy | http://marmalade-repo.org/packages/nrepl |
| 14:53 | wingy | is there a way to run cljs files in the browser directly? |
| 14:53 | wingy | for development |
| 14:54 | edw | package-archive ==> (("marmalade" . "http://marmalade-repo.org/packages/") ("gnu" . "http://elpa.gnu.org/packages/")) |
| 14:54 | edw | M-x package-install [RET] nrepl [RET] ==> "no match" |
| 14:54 | technomancy | M-x package-refresh-contents |
| 14:55 | edw | Much better. |
| 14:56 | edw | Wikked fast. |
| 14:57 | technomancy | it's still missing a few things |
| 14:57 | technomancy | but getting better fast |
| 14:58 | duck11231 | is the packaged nrepl usually pretty up to date? |
| 14:58 | technomancy | duck11231: there is no "usual" for a project this new =) |
| 15:07 | wingy | i guess not since its depending on google closure compiler |
| 15:17 | mdeboard | I'm trying to make sense of the with-open macro, but don't understand the `(let)' statement on this line https://github.com/clojure/clojure/blob/d0c380d9809fd242bec688c7134e900f0bbedcac/src/clj/clojure/core.clj#L3389 ... specifically what "~(subvec bindings 0 2)" expands to... if bindings is [x 1], it looks like it would expand to "(let [subvec [x 1] 0 2])" which is invalid syntax... what happenin' here |
| 15:17 | mdeboard | I don't understand the "0 2" at the end of that expression is what I'm saying |
| 15:18 | mattmoss | ,(subvec [1 2 3 4 5 6] 0 2) |
| 15:18 | clojurebot | [1 2] |
| 15:18 | mdeboard | oh |
| 15:18 | mdeboard | subvec is a fn :P whoops. |
| 15:19 | stain | so basically it unpacks the first binding |
| 15:19 | stain | then recurses with the rest of the bindings |
| 15:20 | mdeboard | gotcha |
| 15:20 | mdeboard | that makes a lot more sense then. |
| 15:20 | stain | for each recursion there is a finally-block that closes the one that that iteration unpacked |
| 15:20 | stain | s/iteration/call/g |
| 15:20 | stain | if you can say macro is called.. |
| 15:21 | mattmoss | expanded |
| 15:21 | mattmoss | well, hmm. |
| 15:21 | stain | sounds right |
| 15:25 | Horofox | how do I run a .clj file with the command line? |
| 15:26 | _ulises | evening |
| 15:27 | Horofox | evening |
| 15:27 | llasram | Horofox: Use `lein run` |
| 15:27 | _ulises | this is for emacs + slime users: which tools do you use to refactor your code? e.g. rename symbols, extract fns, etc.? I just came across https://github.com/joodie/clojure-refactoring but it hasn't received much love in about 8 months |
| 15:28 | llasram | Horofox: Er, in the context of a lein project. There are tools floating around for running Clojure files as "scripts," but none have really become standard |
| 15:28 | Horofox | llasram: and not in the context of a leon project? |
| 15:28 | Horofox | llasram: I'm doing the clojure koans and want to test a .clj script i made |
| 15:29 | llasram | Horofox: I'd suggest just creating a scratch lein project and including the file. It's the de facato standard way of doing things. |
| 15:30 | llasram | de facto, even |
| 15:30 | Horofox | llasram: not so easy to enter the clojure world, huh. |
| 15:30 | hiredman | Horofox: java -jar clojure.jar some-file.clj |
| 15:31 | hiredman | I would suggest if you are starting out you just play with the repl and not even bother with files |
| 15:31 | hiredman | http://clojure.org/getting_started |
| 15:31 | llasram | I'd disagree -- it's just a question of getting people to use the right tools. Instead of downloading and installing "clojure" you download and install lein. And then unlike other languages, there's nothing else to ever install -- lein resolves all dependencies dynamically per-project |
| 15:31 | hiredman | llasram: I didn't ask you |
| 15:31 | Horofox | hiredman: "Exception in thread "main" java.lang.IllegalArgumentException: Only these options are valid: :default, :hierarchy" I get this |
| 15:32 | Horofox | what could it be? |
| 15:32 | llasram | hiredman: I |
| 15:32 | llasram | hiredman: I'd meant to direct that at Horofox |
| 15:32 | hiredman | Horofox: fix your mistake |
| 15:32 | hiredman | Horofox: this is part of the reason why interacting with the repl for newbies is better |
| 15:32 | Horofox | hiredman: it's not telling shit about "my mistake" |
| 15:32 | hiredman | it is |
| 15:33 | hiredman | but if you interact with the repl directly you can see exactly which expression causes what |
| 15:33 | hiredman | the exception there includes lots of line number information etc |
| 15:33 | hiredman | but most people ignore exceptions, or complain about them being too verbose (no idea why) |
| 15:33 | Horofox | but they are, aren't they? |
| 15:34 | hiredman | no |
| 15:34 | hiredman | they contain lots of useful information |
| 15:34 | sjl | hiredman: a garbage dump likely contains lots of useful stuff too |
| 15:35 | sjl | the problem is that it's buried in irrelevant crap |
| 15:35 | llasram | Mmmm. Yeah. I love Clojure, but I think the compiler error reporting could be significantly improved . Most of the time I do not want a stack trace which includes both my code and compiler internals |
| 15:35 | hiredman | you should know and care about the internals |
| 15:36 | llasram | Oh, it's incredibly helpful. I've read most of core.clj and have gotten familiar with much of the Java compiler implementation. But that's not relevant for most of the errors I make, and thus neither is 90% of the stack trace |
| 15:37 | hiredman | "it's incredibly helpful, but I don't want it" |
| 15:38 | llasram | I agree that one learns to zero in on the relevant parts pretty quickly, and figure out the error messages generated by the most common errors, but that doesn't mean the mapping is straightforward |
| 15:38 | hiredman | Horofox: your error is you copied and pasted some code from somewhere that defines multimethods in way that doesn't work anymore |
| 15:38 | Horofox | hiredman: does it say what you told me? |
| 15:38 | Horofox | hiredman: but thanks |
| 15:39 | Horofox | hiredman: how did you learn clojure? |
| 15:39 | dnolen | llasram: 1.3 includes better stacktraces - would be better if someone submitted a patch that provided this is a data structure for external tools. |
| 15:39 | dnolen | Lots of complaining ... no patches. |
| 15:39 | hiredman | Horofox: just like I recommended it to you |
| 15:39 | Horofox | hiredman: use REPL? |
| 15:39 | hiredman | yep |
| 15:39 | llasram | dnolen: I've got a CA printed out and sitting on my desk. I'm just waiting for my boss to get back from a conference to send it in :-) |
| 15:39 | hiredman | from a repl I went to manually c&p from a file to repl |
| 15:39 | Horofox | hiredman: I want to learn so I need a direction, not only typing random stuff in REPL |
| 15:40 | hiredman | Horofox: you can futz around with various code exercises, but the best way is to find a project and write it |
| 15:41 | dnolen | llasram: sweet, look forward to someone actually attempting to fix the issue! |
| 15:41 | hiredman | it's like literacy in anything else, spend time reading and writing |
| 15:41 | Horofox | hiredman: what's a good thing to write in clojure? I don't want to get into webdev(I already develop with rails) |
| 15:42 | hiredman | whatever your next toy project is |
| 15:44 | hiredman | I've got a doozy of a project for you: implement some audio codec in clojure |
| 15:45 | lynaghk | cemerick: ping |
| 15:48 | Horofox | hiredman: i have no idea of how audio codecs work |
| 15:49 | hiredman | there are a lot of tools for dealing with clojure projects, but what is more important, understanding clojure or the tools ecosystem? clojure is certainly usable outside of the tools |
| 15:49 | hiredman | Horofox: you will have some idea by the time you are done |
| 15:49 | Hodapp | code exercises, however, can be a good way to introduce a construct that you might not find if you were more focusing more on a project or problem |
| 15:50 | dnolen | Horofox: to get to your earlier point, Clojure is not so great for writing simple scripts. JVM startup time makes this mode of development tedious. Most folks figure out a decent REPL setup for their favorite environment. |
| 15:50 | dnolen | Horofox: VIM, Emacs, and Eclipse have the most developed environments. Light Table promises to provide something more friendly one day. |
| 15:50 | hiredman | I have no idea either, I started trying to port an mp3 codec from haskell, but got as far as trying to figure out what a "psychoacoustic model" is |
| 15:51 | Horofox | hiredman: that's a good idea |
| 15:51 | sjl | Horofox: "Games" it a broad topic that can be fun, and you can start with tiny text-based "guess my number" and tackler more and more interesting ones as you learn |
| 15:52 | hiredman | "I want to learn Java" "go install maven and eclipse" |
| 15:52 | hiredman | "I want to learn Ruby" "install textmate, rvm, and rails" |
| 15:53 | llasram | I view "I want to learn Clojure" -> "install lein" as the equiv of "I want to learn Ruby" -> "install ruby" |
| 15:53 | hiredman | clojurebot: lein |is not| clojure |
| 15:53 | clojurebot | Alles klar |
| 15:54 | llasram | I'm fully aware that you can just download the Clojure JAR, but it doesn't get you any of the amenities most people expect from installing a language package |
| 15:54 | gtrak | ~lein |
| 15:54 | clojurebot | lein is not the bestest programming language available. |
| 15:54 | amalloy | haha. damn you for your inferences, clojurebot! |
| 15:55 | gtrak | clojurebot: lein |is not| 'clojure |
| 15:55 | clojurebot | In Ordnung |
| 15:55 | gtrak | ~lein |
| 15:55 | clojurebot | lein is not clojure |
| 15:55 | gtrak | ha, that actually worked? |
| 15:55 | amalloy | ~clojure |
| 15:55 | clojurebot | clojure > scheme |
| 15:55 | emezeske | ~scheme |
| 15:55 | clojurebot | scheme is Scheme is like a ball of snow. You can add any amount of snow to it and it still looks like snow. Moreover, snow is cleaner than mud. |
| 15:55 | gtrak | is that a coincidence? |
| 15:56 | llasram | I've had had multiple friends turned off from trying out Clojure because they'd download the JAR or install a package and end up with something which didn't provide anything like the tooling they expected |
| 15:57 | sjl | It may not be usable but at least it's not complected amirite |
| 15:57 | llasram | heh |
| 15:58 | dnolen | llasram: what were they used to? |
| 15:58 | llasram | Ruby mostly |
| 15:58 | hiredman | llasram: my contention is starting with the repl is the best way |
| 15:58 | dnolen | llasram: case closed ;) |
| 15:58 | sjl | readline support? |
| 15:58 | gtrak | sjl: I want to program... me: here's an integer |
| 15:58 | hiredman | llasram: not the easiest |
| 15:58 | amalloy | hiredman: rlwrap java -jar clojure.jar? or something else? |
| 15:59 | hiredman | rlwrap is a flourish |
| 15:59 | ToxicFrog | llasram: not having used ruby, what were they expecting other than "a REPL"? |
| 15:59 | dnolen | llasram: I find lein far more pleasant than the rvm + bundler stuff I have to deal with. Tho to be fair that Rails-ish stuff. |
| 16:00 | stain | have any of you a good idea on how to do framebuffer (as in /dev/fb0 on Linux) fun from Clojure? I'm thinking for a Raspberry Pi project |
| 16:00 | hiredman | I am not saying that the tools, the extras, etc are bad, jsut that hey are that, extras |
| 16:00 | stain | perhaps some JNI stuff? File operations on the device might not be enough, I guess |
| 16:01 | llasram | dnolen: Oh, totally. Hmm. I'm saying things poorly, and I don't think anyone here disagrees with me except maybe hiredman. If you know that clojure.jar is a library implementing the language, and that's what you need, then great. But I haven't tried any other language that distributes itself that way |
| 16:01 | ToxicFrog | llasram: I mean, generally, when I install a language runtime, I expect to get the docs, the runtime libraries, the interpreter or compiler, and hopefully a REPL and that's basically it. |
| 16:01 | dnolen | llasram: yes the story is usually far more frightening :) |
| 16:01 | llasram | dnolen: Ruby, Python, Scala, Haskell -- I install a package, and get a set of tooling which integrates a readline-supporting REPL, docs, command-line compiler/interpreter etc |
| 16:01 | hiredman | if all you know is how to do is work with clojure tools, what happens when the tools fail or are inadequate |
| 16:02 | hiredman | the clojure repl has all of that except for readline support |
| 16:02 | dnolen | llasram: yes, global installs have destroyed countless hours of productivity the world over. |
| 16:02 | ToxicFrog | ...doesn't clojure.jar include a command-line compiler and interpreter in the form of clojure.main? |
| 16:02 | hiredman | clojure jar |
| 16:03 | hiredman | docs access from the repl is also an extra in my mind |
| 16:03 | ToxicFrog | Horofox: on the subject of fun projects for clojure - currently I'm working on a project to edit and merge a (text-based) save game format for a game I play. So, a parser, generator, various analysis and editing tools, etc. Don't know if that inspires you at all. |
| 16:03 | hiredman | clojure.org is comprehensive |
| 16:03 | llasram | ToxicFrog: A REPL with readline support and commad-line completion, a way of running code in files which doesn't involve knowing how to invoke the JVM on the library implementing the language you're trying to use |
| 16:04 | Horofox | ToxicFrog: cool |
| 16:04 | ToxicFrog | llasram: ok, yes, readline support is notably missing |
| 16:04 | llasram | I'm not saying theses are bad properties in and of themselves -- just that they aren't what most of the people I've tried to expose to Clojure expect, and from that sample just pointing people to lein is a better match of what they're looking for |
| 16:04 | hiredman | "symbiotic with an established Platform" -- http://clojure.org/rationale |
| 16:04 | ToxicFrog | I have a working 'clojure' command that handles all of the JVM invokation for me, but that may have been added by the packager? |
| 16:05 | dnolen | llasram: http://dev.clojure.org/display/design/CLJ+Launcher |
| 16:05 | hiredman | people should not expect to use clojure without understanding at least something about the jvm |
| 16:05 | sjl | ToxicFrog: Some packagers do that -- brew installs clj for you |
| 16:05 | dnolen | llasram: what you want is desirable - but yet again something the community needs to step up to the plate. |
| 16:05 | llasram | hiredman: Agreed. But if you check out e.g. Jython, JRuby they have many more amenities |
| 16:05 | hiredman | just as I would say people should not expect to use clojurescript without some understanding of javascript |
| 16:06 | ToxicFrog | hiredman: he does have a point that even other JVM libraries generally come with at least a few wrapper scripts to launch the jars properly :) |
| 16:06 | hiredman | llasram: I have to argument against amenities, and there use, I just don't think they are a good way to learn |
| 16:06 | llasram | dnolen: I think the community already has in the form of lein :-) |
| 16:06 | hiredman | when teaching children to do addition, do you just hand them a calculator and say "press these buttons" ? |
| 16:06 | ToxicFrog | Speaking of launching jars smoothly, anyone here have experience using jsmooth or something like it on a lein uberjar? |
| 16:07 | ToxicFrog | I am looking for a way to make deploying on windows not an endless pit of misery and suffering. |
| 16:07 | sjl | hiredman: nah first we take the calculator apart and I explain the circuit board so they understand how it runs |
| 16:07 | dnolen | llasram: of course! but there are some good ideas not yet in lein on that page as well. |
| 16:07 | ToxicFrog | hiredman: no, but neither do I start with category theory so that they can truly understand addition :P |
| 16:07 | gtrak | people have this same argument on ##java against IDEs |
| 16:08 | gtrak | i think it generally resolves to don't expect us to help you with eclipse |
| 16:08 | ToxicFrog | More generally, if you're teaching someone to program it helps to be able to teach programming without constantly getting hung up on the tools and the language being used to teach it, and similarly, if you're teaching a specific language it's nice not to spend a lot of overhead on the OS or architecture that the language targets. |
| 16:09 | gtrak | when you don't know the basics of java |
| 16:09 | ToxicFrog | Those are things that should be learned, but they are also different things. |
| 16:10 | sjl | ToxicFrog: Yep. Allow this abstraction to just be abstract for now. Later you can dive in and see how it works but trying to bootstrap from first principles will take forever. |
| 16:11 | mdeboard | Why was clojure.core.assert-args made private? Is there a way to use private fns ? |
| 16:11 | gtrak | #' |
| 16:11 | headius | you can argue against "amenities" of language impls like JRuby that try to hide the JVM's ugliness, but you'd be deluding yourself |
| 16:11 | headius | the JVM is not very user friendly, and saying "you just need to learn the JVM" ignores the many obvious warts |
| 16:11 | mdeboard | gtrak: Righto |
| 16:12 | headius | that said I'm entering this conversation halfway through, so I don't know what amenities we're talking about :) |
| 16:12 | headius | ahh…a nice command-line tool |
| 16:12 | headius | yeah, that's a silly one to argue against |
| 16:12 | gtrak | headius: clojure.org site recommends getting the jar instead of lein |
| 16:12 | hiredman | I am not saying it should exist |
| 16:12 | headius | the heinousity of the java command line is legendary |
| 16:13 | headius | even the original Java guys acknowledge it |
| 16:13 | hiredman | I am saying several things 1. lein is not clojure 2. telling people to learn lein to learn clojure is silly 3. booting the jar gives just clojure, no other distractions |
| 16:13 | headius | I don't mean you should go as far as we have in JRuby and provide a native executable, but every bit you can do to make CLI easier is like gold |
| 16:13 | sjl | I wonder if Pygments has "java command line invocation" as a lexer |
| 16:14 | llasram | hiredman: Directly linking libpython.so gives you Python w/o any distractions, but that's still an awkward way to work with the language |
| 16:14 | headius | the "jruby" command actually books libjvm and starts up the JVM through JNI…giving us full control over the structure and interpretation of the command line |
| 16:14 | headius | books=boots |
| 16:15 | llasram | I think headius's summary is right on -- we're really just talking about having a convenient command-line tool for interacting with the language |
| 16:15 | sjl | hiredman: how would one use a library in that setup? wget the jar? |
| 16:15 | sjl | library like, say, quil |
| 16:15 | dnolen | gtrak: it shows the simplest thing. and then links to more detailed setups. |
| 16:15 | sjl | or overtone |
| 16:16 | llasram | headius: Wow, I didn't realize you'd gone that far. That's pretty hardcore :-) |
| 16:16 | dnolen | sjl: quite few people still look at lein w/ suspicion and have custom build scripts for their projects. |
| 16:16 | hiredman | headius: I think the clojure situation is a little different from jruby's, not being a port of a c runtime people expect to be installed globally |
| 16:16 | headius | llasram: we used to have a bash script, but you can't use a bash script in the shebang line of another script |
| 16:16 | headius | we eventually just had to suck it up and provide a real native executable |
| 16:16 | gtrak | dnolen: yea... It's not against it persay, but you have to click-through some things and it's probably not obvious what you want if you're a newbie |
| 16:16 | llasram | headius: On OS X? You can on Linux these days, although you definitely couldn't in the past |
| 16:16 | headius | it's not consistent |
| 16:16 | llasram | Ah |
| 16:17 | headius | in any case, there's many other benefits to having a real native executable, like avoiding two process launches, being able to interrogate the JVM before initializing it, and so on |
| 16:17 | technomancy | yeah, with a bash script you basically end up pissing all over your ps output |
| 16:17 | headius | right |
| 16:17 | sjl | dnolen: do they... do they build classpaths and fetch all dependencies manually? |
| 16:18 | dnolen | sjl: yes, or they use Eclipse and they don't care about all this command-line goofiness at all. |
| 16:18 | sjl | dear lord, that's horrifying |
| 16:18 | dnolen | sjl: it's pretty tiresome for people to come Clojure with their myopic world views |
| 16:19 | sjl | not the Eclipse part, that's another fine direction |
| 16:19 | dnolen | sjl: Eclispe manages everything, add jars to your project done. |
| 16:19 | sjl | Yeah, if you don't need the command line that's a nice way to get started |
| 16:20 | dnolen | sjl: my point is there are legitimate multiple ways to get started. clojure.org wisely makes no assumptions. |
| 16:20 | headius | oh, another nice thing about having your own executable…if startup time is a concern, forcing users to type java -Xbooclasspath/a:clojure.jar org.clojure.Whatever is pretty mean :) |
| 16:20 | technomancy | dnolen: "I want my arrow keys to work" is a pretty reasonable assumption |
| 16:21 | sjl | technomancy: nah dude some people don't like backspace to work don't assume things |
| 16:21 | dnolen | technomancy: if you care about the command line. I don't imagine CCW uses care whether the command line REPL supports arrows or not. |
| 16:21 | technomancy | RUBOUT |
| 16:21 | headius | Ctrl-H, man |
| 16:22 | llasram | headius: heh, I almost said that -- I don't even have a key mapped to Backspace! |
| 16:22 | dnolen | technomancy: fortunately there's line to satisfy a different crowd. |
| 16:22 | dnolen | er lein |
| 16:22 | hiredman | headius: sure, and every serious project has it's own launcher script anyway |
| 16:22 | technomancy | yeah, it's just embarrassing to have to tell my friends about how great clojure is and then follow it up with "as long as you don't try to learn it from clojure.org" |
| 16:22 | ToxicFrog | 'lein repl', for some reason, has absolutely horrifying memory requirements for me |
| 16:23 | headius | opinionated software sucks when the opinion is wrong |
| 16:23 | ToxicFrog | It looks like it starts up 2 JVMs and each one wants at least 1GB of memory, which on a 3GB laptop is way too much |
| 16:23 | hiredman | but what is simpler than to run `java -jar clojure.jar` and get a repl? |
| 16:23 | ToxicFrog | hiredman: as noted, you can't use command history or line editing in that, in contrast to basically every other REPL ever |
| 16:23 | ToxicFrog | And it's really annoying. |
| 16:23 | sjl | hiredman: running "clojure" and getting a repl with readline? |
| 16:24 | hiredman | what is the difference between this hypothetical clojure launcher "clj" and "java -jar clojure.jar"? the first doesn't have spaces in it? |
| 16:24 | technomancy | read. line. |
| 16:24 | ivan | -jar nukes your CLASSPATH |
| 16:24 | hiredman | I don't care about readline |
| 16:24 | sjl | you have to be in the same dir as clojure.jar |
| 16:25 | ToxicFrog | You can with jline, but now you need to download a specific older version of jline (because 1.x goes insane when hosting clojure for some reason) and use java -cp jline-asdfasdf.jar:clojure-asdfsadf.jar:$CLASSPATH jline.ConsoleRunner clojure.main |
| 16:25 | ToxicFrog | Which is miserable and a pain to type to every time you want a clojure REPL |
| 16:25 | emezeske | hiredman: You don't use readline, or something like it? |
| 16:25 | ToxicFrog | hiredman: congratulations, you get everything right on the first try and never need to re-enter older lines. The rest of us aren't as perfect. |
| 16:25 | hiredman | emezeske: sure I use it, but I can take it or leave it, it is not central to writing clojure code |
| 16:26 | emezeske | hiredman: That's like saying that an eraser is not central to writing prose with a pencil |
| 16:26 | technomancy | hiredman: that works for you, but assuming that there are more than a handful of other people who are able to function that way is crazy |
| 16:26 | emezeske | hiredman: Perfectly possible, but... |
| 16:27 | hiredman | emezeske: it works just fine |
| 16:27 | ToxicFrog | hiredman: believe it or not, most people aren't you and a great many of them appreciate the ability to backspace, line-edit, and recall previous commands easily. |
| 16:27 | hiredman | emezeske: and my personal experience backs up that it works fine (and I think so does the fact that many people besides me learned clojure before tools like lein existed) |
| 16:28 | pjstadig | self initializing clojure command-line script https://github.com/pjstadig/dotfiles/blob/master/bin/clojure |
| 16:28 | llasram | hiredman: Yes, but how many *more* would have learned it if there had been convenient tools from the start? |
| 16:28 | ToxicFrog | Do you need to use the REPL at all to write Clojure code? No. If you are using the REPL, is it still usable without readline support? Yes. |
| 16:28 | pjstadig | with readline |
| 16:28 | ToxicFrog | But have the REPL available with readline support makes it easier. |
| 16:29 | technomancy | hiredman: speaking from personal experience, it's because I had an extremely high tolerance for bullshit and yak shaving |
| 16:29 | ToxicFrog | If you're going to go the "well, it's not necessary, you can program fine without it" route, why are you using clojure at all rather than rocking out with machine code? |
| 16:29 | llasram | technomancy: Which tolerance on your part I for one am incredibly grateful :-) |
| 16:29 | hiredman | llasram: who cares? |
| 16:30 | hiredman | clojure is not a religious world view I want to foist on to as many people has possible |
| 16:30 | grim_radical | lolwut |
| 16:30 | llasram | hiredman: No, but it's a useful tool I'd like more people to use, so there's a more vibrant ecosystem, with more useful libraries, better documentation, and all the rest |
| 16:30 | sjl | I don't have enough wat.gifs for how this conversation has unfolded. I'm out. |
| 16:30 | ToxicFrog | pjstadig: requires rlwrap which is not reliably installed, if you're using maven anyways wouldn't it be easier to download jline 0.9.x as well and use that? |
| 16:31 | zerokarmaleft | hiredman: generalizing expectations for all people that decide to learn clojure is going to be mismatched against the experiences of clojure early-adopters (which is a small, inclusive subset) |
| 16:31 | technomancy | exhibit A: https://github.com/technomancy/clojure-mode/blob/47caba15ff31f339e74378fd3c05bcffa7091550/clojure-mode.el#L627 |
| 16:31 | pjstadig | ToxicFrog: my computer is just a series of scripts, some that setup rlwrap for me (reliably) and others that use it |
| 16:31 | ToxicFrog | hiredman: if you care so little, why are you arguing so vehemently that this is something clojure should not have? |
| 16:32 | pjstadig | it's nice to be able to just type clojure and open a REPL whenever i want to answer some simple question |
| 16:32 | ToxicFrog | pjstadig: yeah, I'm just saying that a jline-based approach is probably more portable :) |
| 16:32 | hiredman | I expect (and hope) that additions to clojure (runtime, compiler, extras) are evaluated on "is this useful to people who know clojure" rather than "is this useful for people who don't know clojure" |
| 16:33 | ToxicFrog | hiredman: so, what, your argument is that once people know a language, they stop caring whether its REPL has readline support? |
| 16:33 | rlb | pjstadig: also, fwiw, the debs set up /usr/bin/clojure (and handle 1.2 vs 1.3 vs 1.4 via update-alternatives) by default. |
| 16:33 | ToxicFrog | I had no idea. Guess I might as well recompile lua, python and bash without readline enabled now. |
| 16:34 | technomancy | ToxicFrog: or you could write unrlwrap |
| 16:34 | ToxicFrog | true |
| 16:34 | ToxicFrog | That probably already exists, even |
| 16:34 | amalloy | technomancy: rcwrap |
| 16:34 | technomancy | for all non-ascii keystrokes, it just inserts HERP/DERP |
| 16:35 | zerokarmaleft | then rlwrap it again...inceptionwrap |
| 16:35 | llasram | amalloy: rc == read... console? |
| 16:35 | amalloy | character |
| 16:35 | llasram | ah! |
| 16:35 | pjstadig | rlb: i've been using clojure since before there were debian packages :) |
| 16:35 | mdeboard | hipster |
| 16:35 | hiredman | calling readline support a deal breaker, when it obviously isn't is just silly, like complaining about parens |
| 16:35 | gtrak | I think clojure.org could probably go along with the consensus and endorse leiningen at least, maybe not emacs |
| 16:36 | rlb | pjstadig: me too -- just mentioned them for anyone intereseted. |
| 16:36 | rlb | s//intereseted/interested/ |
| 16:36 | technomancy | it's not an "impossible to get things done" deal breaker, it's a "I can tell that no thought has gone into the out-of-the-box experience, therefore I don't have time for this" deal breaker |
| 16:37 | ToxicFrog | hiredman: no-one is calling it that, though? |
| 16:37 | pjstadig | sidenote: i think it's probably better to have the clojure versions in stalled separately, instead of with update-alternatives, since there are incompatibilities |
| 16:37 | rlb | llasram: oh, and wrt the emacs 24 debs, we may or may not get them in to wheezy, but they'll still be in unstable. The release team hasn't told me what they want to do about it yet. |
| 16:38 | technomancy | rlb: is there still time for bribes? |
| 16:38 | gtrak | (inc technomancy) |
| 16:38 | gtrak | ~(inc technomancy) |
| 16:38 | clojurebot | technomancy codes while wearing gravity boots to increase the blood flow to the face transplant he got after discovering the world does not treat build tool creators kindly |
| 16:38 | emezeske | hiredman: I think your argument is fair if we're talking about introducing people who have *never* programmed before to the language, maybe young kids or something. But anyone with some programming experience under their belt, that does not happen to be an ascetic monk, is going to balk at a REPL without readline. They'll also balk at having to go around and download dependencies, and transitive dependencies, thinking the whole time, "Why they hell am |
| 16:38 | rlb | hah -- I asked them a few days ago, but I wanted to give them time to get back to me. I'm sure they're swamped/crazy atm. |
| 16:38 | technomancy | sure |
| 16:39 | emezeske | hiredman: In other words, if you introduced me, an experienced programmer, to clojure without mentioning leiningen, I would smack you when I found out about it. |
| 16:39 | hiredman | emezeske: that is obviously not true |
| 16:39 | llasram | I'm glad wheezy is going to be out soon, but I'm not glad that the clock will start ticking on all the squeeze systems my company has in production :-) |
| 16:39 | hiredman | emezeske: there were people using clojure professionally before lien existed |
| 16:39 | ToxicFrog | emezeske: your first one cut off at "why the hell am" |
| 16:39 | gtrak | $lazybot are you dead? |
| 16:39 | emezeske | ToxicFrog: le sigh |
| 16:40 | gtrak | Raynes: lazybot is dead! |
| 16:40 | rlb | llasram: and for some people the gnome 3 transition is likely to be "jarring". |
| 16:40 | Raynes | Long live lazybot! |
| 16:40 | technomancy | man... I'm still having a hard time believing I actually wrote M-x clojure-install |
| 16:40 | Raynes | technomancy: We were all young once. |
| 16:40 | Raynes | Some of us still are. |
| 16:40 | ToxicFrog | Anyways, I'm sick of arguing with a brick wall, time to get some groceries and write some code. Laters. |
| 16:40 | emezeske | hiredman: Well, they filed their "balk" away in the "I hope someone does that, and soon" cabinet, and kept working. Or in technomancy's case, they didn't file it away, and fixed the problem. |
| 16:40 | Raynes | amalloy: I just tried to ssh lazybot. |
| 16:40 | emezeske | hiredman: Or, they were ascetic monks. |
| 16:41 | hiredman | emezeske: and some (crazy) people are using maven for clojure projects |
| 16:41 | scriptor | early adopters tend to be more tolerant of these kinds of things |
| 16:41 | technomancy | emezeske: OTOH, if we keep self-selecting for people with extremely high yak-shaving tolerance it might be easier to get more pull requests on tooling =) |
| 16:41 | emezeske | hiredman: *shudder* |
| 16:42 | llasram | technomancy, hiredman: Re: "no time for this", exactly. And for specific harm, that made it much harder to generate sufficient interest for adoption at my company |
| 16:42 | emezeske | technomancy: True enough! |
| 16:43 | emezeske | hiredman: I, like you, feel no need to evangelize the language. I guess all I'm arguing for is that if an experienced programmer walks in the door, we mention leiningen. No need to force it, but there's a good chance they'll like to know from day one. |
| 16:45 | rlb | technomancy: I haven't used lein much yet (just for some testing with noir) -- and I wondered if lein was compatable with, or had anything like, maven repository managers for cases where you wanted more control over the incoming items (i.e. to allow vetting, support reproducibility, offline builds, etc.). |
| 16:46 | technomancy | rlb: sure, you can use lein with nexus and co. |
| 16:46 | technomancy | just add :omit-default-repos true and add them to :repositories |
| 16:46 | rlb | ok, thanks -- are the main ones these days nexus and artifactory? |
| 16:46 | technomancy | and archiva |
| 16:46 | gtrak | there are smart lisp programmers out there that hate the jvm already, and beginners that need a better experience. The 'clojure is a better java' crowd is less sensitive to this sort of thing. |
| 16:47 | technomancy | I'm pretty sure I wouldn't have bothered with Clojure if swank hadn't existed |
| 16:50 | emezeske | technomancy: No way I'd have bothered with clojure if leiningen didn't exist. I have better things to do than to track down JARs by hand, or deal with maven directly. |
| 16:53 | gtrak | lazybot: hi! |
| 16:58 | gfredericks | (dec lazybot) |
| 16:58 | lazybot | ⇒ 6 |
| 16:58 | gtrak | (inc technomancy) |
| 16:58 | lazybot | ⇒ 33 |
| 16:58 | gtrak | there |
| 17:00 | gfredericks | (inc me) |
| 17:00 | lazybot | ⇒ 1 |
| 17:06 | cemerick | emezeske: More than any other thing, I think you can attribute the growth of Clojure to the maturation of Leiningen. |
| 17:07 | cemerick | technomancy shouldn't have to ever buy another drink ever again at any Clojure gathering. :-) |
| 17:07 | zerokarmaleft | cheers, thanks for all the yak-shaving |
| 17:07 | technomancy | aw shucks you guys... |
| 17:10 | llasram | The morning of Nov 16th, technomancy lies dead from alcohol poisoning. Fortunately he is restored from backup by that evening |
| 17:11 | Raynes | cemerick: Not going to tell you how many times it took me reading that sentence to realize that you said 'maturation' and not something else very similar but much less appropriate. |
| 17:12 | cemerick | llasram: heroku should have a follower ready, yeah? |
| 17:12 | cemerick | Raynes: Twisted basterd. |
| 17:12 | cemerick | :-) |
| 17:13 | rickmode | code master__tion is more of a Java thing |
| 17:13 | llasram | Cool feature! |
| 17:13 | tmciver | Raynes is a master debater. |
| 17:14 | Hodapp | rickmode: bah? |
| 17:14 | gtrak | we once had that broadcast on the high school intercom |
| 17:17 | cemerick | gfredericks: they each have their place |
| 17:17 | cemerick | people mature, wine maturates :-) |
| 17:17 | cemerick | </pedantry> |
| 17:17 | gfredericks | :) |
| 17:17 | emezeske | cemerick: I wouldn't find that at all surprising |
| 17:18 | gfredericks | wait it must be an actual work musn't it |
| 17:18 | gfredericks | word* |
| 17:20 | cemerick | gfredericks: what, "maturate"? |
| 17:21 | rickmode | maturegery |
| 17:23 | craigbro | that sounds dirty |
| 17:28 | gfredericks | cemerick: I rarely maken't up words |
| 17:29 | cemerick | gfredericks: makenut is *totally* a word! |
| 18:27 | aphyr | What's the minimal amount of code required to extend-protocol IPersistentMap? |
| 18:27 | aphyr | Do I need to define all the methods of Seqable, IPersistentCollection, Associative, etc? |
| 18:29 | hiredman | aphyr: your question makes no sense, IPersistentMap is not a protocol, and none of Seqable, IPersistentCollection, and Associative are either |
| 18:30 | aphyr | Yeah. but IPersistentMap extends those interfaces |
| 18:30 | hiredman | so? |
| 18:31 | aphyr | Well IPersistentMap iteself only consists of assoc, assocEx, and without |
| 18:31 | hiredman | none of those things are protocols, so "how can I do protocol things with things that are not protocols" is your question? |
| 18:31 | aphyr | Er, wow, yeah, you're right. |
| 18:31 | hiredman | java interfaces are not protocols |
| 18:31 | aphyr | Sorry, having a brain fart. |
| 18:32 | aphyr | Guessing I need to use proxy then |
| 18:32 | aphyr | Which... aw fuck it, might as well just extract the whole fucking thing into a hashmap |
| 18:32 | hiredman | reify, defrecord, and deftype all can extend interfaces or have protocols extended to them |
| 18:32 | technomancy | usually a safe bet |
| 18:33 | aphyr | Yeah, I am knee-deep in a salesforce library right now |
| 18:33 | aphyr | trying to make it slightly less absurdly javaesque |
| 18:33 | aphyr | https://github.com/teamlazerbeez/sf-api-connector/blob/master/sf-api-core/src/main/java/com/teamlazerbeez/crm/sf/core/SObject.java |
| 18:33 | brehaut | aphyr: my condolences |
| 18:33 | aphyr | Long story, don't ask |
| 18:33 | aphyr | want to shoot myself |
| 18:34 | aphyr | Would like, ideally, to use these suckers as maps |
| 18:34 | aphyr | (but also support their metadata operations) |
| 18:34 | hiredman | https://github.com/arohner/clj-wallhack |
| 18:35 | aphyr | .... awesome |
| 18:35 | hiredman | you can create objects that present a map like view over another object pretty easily, I don't mean you should use the reflection stuff in clj-wallhack, but it has some examples |
| 18:35 | aphyr | Yeah, torn between constructing maps and putting some stuff into metadata |
| 18:35 | hiredman | you can also use reflection to generate a function that turns an object in to a map (like bean) |
| 18:36 | hiredman | don't put stuff in metadata unless it is metadata |
| 18:36 | aphyr | or wrapping sobjects in a defrecord which gives them map semantics |
| 18:36 | hiredman | a good rule of thumb for metadata is "is this ancillary data about this other data, that should change equality relationships" |
| 18:37 | hiredman | er |
| 18:37 | hiredman | should not |
| 18:37 | aphyr | Ugh, honestly, I don't understand the SFDC api well enough yet to say |
| 18:37 | aphyr | Just trying to get some human-readable structures out of this fucker |
| 18:38 | hiredman | aphyr: language in #clojure is generally around pg to pg-13 |
| 18:38 | aphyr | " |
| 18:39 | technomancy | http://wondermark.com/136/ |
| 18:39 | aphyr | abominable self-consuming WSDL human centipede |
| 18:44 | technomancy | we could use some more intense sequences of violent action in here though |
| 18:44 | hiredman | ~GUARDS |
| 18:44 | clojurebot | SEIZE HIM! |
| 18:45 | brehaut | ,(repeatedly launch-the-missiles) |
| 18:45 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: launch-the-missiles in this context, compiling:(NO_SOURCE_PATH:0)> |
| 18:45 | brehaut | damn |
| 18:48 | amalloy | (dorun (repeatedly launch-the-missiles)), or you'll just lazily do nothing |
| 18:53 | emezeske | technomancy: Your nick, plus that violent action sequence, makes me think you've played shadowrun |
| 18:53 | technomancy | every single youtube clip of the bike sequence from Project A is only offered in non-html5 format =( |
| 18:54 | technomancy | emezeske: no, I was thinking of http://www.youtube.com/watch?v=ecsGvqvskXw |
| 18:54 | technomancy | at least I think that's it |
| 18:55 | aphyr | sf_commute.mp4 |
| 18:55 | technomancy | oops, it's a dubbed version; my bad |
| 18:55 | emezeske | Oh, jackie |
| 19:09 | pepijndevos | Using zippers, how can I insert a child a the root, and not lose my current position? |
| 19:13 | pepijndevos | Because if I do (z/insert-child (z/root loc) :foo), I have no idea where loc was. |
| 19:23 | llasram | I think paredit-mode needs a command for "oops, I accidentally typed M-( when really I just needed (". So (foo (bar| (baz))) -> (foo (bar) baz) |
| 19:23 | llasram | Er, (foo (bar| (baz))) -> (foo (bar) (baz)) |
| 19:25 | amalloy | llasram: isn't that just forward-barf? |
| 19:25 | llasram | Ask and ye shall receive! Also, no idea how I didn't make that connection |
| 19:26 | llasram | (inc amalloy) |
| 19:26 | lazybot | ⇒ 25 |
| 19:27 | augustl | how does with-redefs work for namespaced stuff? I have a bunch of vars in myapp.env/some-var, and want to redefine them for some testing. I typically refer to them as env/some-var via an :as in the require. |
| 19:28 | llasram | augustl: Works as you'd expect/hope. The namespace aliases effect all resolution within the namespace defining the alias |
| 19:29 | augustl | ah, so it's not a purely symbolic thing |
| 19:29 | augustl | for some reason I thought it was |
| 19:29 | llasram | s,effect,affect, <- spelling! |
| 19:30 | llasram | Yep! It took me a bit to get my head around, but once you have the right mental model, it's entirely consistent |
| 19:31 | augustl | was useful to see that it just ends up calling .bindRoot on the internal clojure.lang.Var object |
| 19:32 | llasram | Heh. I was going to mention that reading the Java implementation helps, but didn't want to risk scaring off :-) |
| 19:33 | mdeboard | So I'm working with this Java 'Document' class from the iText library. In order to perform operations with it you have to manually call its `.open' method. I wrote this modified "with-open" macro to handle cleanup for me: https://gist.github.com/f057008587243ea585ad ... However when I try to call it like such I get an error indicating that it's closed: https://gist.github.com/f9cbff8c6cd9eba9aae5 |
| 19:33 | mdeboard | Am I missing something important about the nature of these context manager macros or |
| 19:34 | llasram | mdeboard: Probably not? What's with-pdf look like? |
| 19:34 | mdeboard | llasram: it's in the first link |
| 19:35 | llasram | Man, I'm 0 for n on following the right link today |
| 19:35 | mdeboard | hehe |
| 19:36 | mdeboard | the PdfCopy class needs a Document instance in its constructor, but it can't already be an opened instance, so it's really quite annoying. |
| 19:37 | llasram | Random side-note FYI: I see you've followed clojure.core/with-open as a template. (a) It's written way more defensively than I've found useful in my own macros (but, hey in the stdlib that's probably good), and (b) as amalloy clued me in too, you can get much nicer-reading recursive macros by just using `reduce` to build-up the recursive structure. (with-open may not do that because all the stdlib isn't defined yet) |
| 19:37 | mdeboard | but the Document instance you call .open against has to be the SAME document that you pass PdfCopy :P |
| 19:38 | mdeboard | dat stateful programming |
| 19:38 | mdeboard | llasram: noted |
| 19:38 | hiredman | you can also just define a recursive macro |
| 19:39 | hiredman | (defmacro f [& xs] (if (seq xs) `(f ~@(rest xs)) 1)) |
| 19:42 | hiredman | which is what with-open does anyway, I'm not sure why you would advocate reduce over that |
| 19:42 | amalloy | mdeboard: you're double-evaluating the value part of the let-binding |
| 19:43 | amalloy | seeing ~(bindings 1) twice is a huge red flag |
| 19:43 | mdeboard | I see |
| 19:43 | llasram | That's a bug, but I don't think what's causing the behavior mdeboard is seeing though... |
| 19:44 | amalloy | for sure it is |
| 19:44 | mdeboard | hell it might actually |
| 19:44 | mdeboard | yeah if it's calling .open on a different Document instance |
| 19:44 | mdeboard | damn I hate OOP so much sometimes. |
| 19:45 | mdeboard | so, should I do the conditional check inside the let binding then amalloy |
| 19:45 | amalloy | it's not at all clear why you even have the if-check there |
| 19:45 | mdeboard | defensive programming |
| 19:45 | sjl | Has someone shaved the "append trailing slashes and redirect" yak in Noir yet? |
| 19:45 | amalloy | those are words, not a reason |
| 19:45 | amalloy | just try to call .open on it, and if it doesn't support .open that'll break |
| 19:45 | mdeboard | because I wanted to return a useful exception if someone tried to bind a symbol to an invalid piece ofdata |
| 19:45 | llasram | I must be missing something. The dup'd call is applying `pdf?` to the value and binding the let to the value, right? But the binding is what calls `.open`, so... |
| 19:46 | amalloy | yes, and ClassCastException is useful, whereas IllegalArgumentException is of questionable value |
| 19:47 | amalloy | llasram: good point, it looks sorta like it should work |
| 19:48 | augustl | how do I pass a var pointing to a vector to a macro that takes a vector? Normally it's (with-redefs [foo bar] ...), I need (with-redefs my-vec ...), but it's erroring with "Don't know how to create ISeq from: clojure.lang.Symbol" |
| 19:48 | amalloy | but with such a serious problem as double-evaluating the value i wouldn't make any firm statements about it |
| 19:50 | mdeboard | this is my first macro so it's kind of a brain bender |
| 19:51 | llasram | augustl: You can only get that kind of behavior in a macro. `with-redefs` is itself a macro, and requires a vector argument at macro-expansion time |
| 19:51 | mdeboard | s/so/and/ |
| 19:51 | augustl | llasram: seems like a ~ solved it |
| 19:52 | llasram | augustl: Oh, so you were already writing a macro then :-) |
| 19:52 | augustl | and passing symbols too of course, so the vec is defined as ['foo bar] instead of [foo bar] |
| 19:52 | augustl | no I wasn't, I'm just calling it |
| 19:52 | augustl | so I'm kind of surprised :) |
| 19:53 | augustl | heh it also didn't actually work :) |
| 19:54 | llasram | I don't even -- what?: |
| 19:54 | augustl | so there's no way to pass a reference to a vector to a macro that expects an inline vector? |
| 19:54 | llasram | &(let [foo ['foo 1]] (with-redefs ~foo foo)) |
| 19:54 | lazybot | ⇒ [foo 1] |
| 19:54 | llasram | wtf is that even doing? |
| 19:54 | augustl | :S |
| 19:55 | llasram | augustl: You can-ish, but only from another macro with is generating code which expands to with-redefs. When with-redefs gets expanded, its argument needs to be a literal vector |
| 19:55 | augustl | that's weird, because it's not working for me, I was just reading it wrong |
| 19:55 | llasram | s,with,which, |
| 19:55 | augustl | ah, I see |
| 19:57 | augustl | makes sense, I need to inject stuff macro expansion time, not runtime |
| 19:57 | amalloy | &'~foo |
| 19:57 | lazybot | ⇒ (clojure.core/unquote foo) |
| 19:57 | llasram | Exactly |
| 19:57 | amalloy | &(let [foo ['foo 1]] (with-redefs ~foo clojure.core/unquote)) |
| 19:57 | lazybot | ⇒ [foo 1] |
| 19:57 | llasram | amalloy: I just figured that out :-) Fun times |
| 19:58 | amalloy | see also with-redefs-fn |
| 20:00 | augustl | is "?form" from https://github.com/marick/Midje/wiki/Setup%2C-Teardown%2C-and-State a special thing? The question mark, I mean. Or is it just a name? |
| 20:01 | technomancy | augustl: it's just a name, albeit a weird one |
| 20:01 | technomancy | maybe a convention for logic variables? |
| 20:02 | llasram | The Midje documentation uses it in a few places to just indicate arbitrary user-provided values/forms |
| 20:02 | augustl | I see |
| 20:03 | llasram | Wait, I lied |
| 20:04 | augustl | the fact that midje tests are in macros is a pita some times.. |
| 20:04 | llasram | It's a literal symbol which Midje considers special. But Midje is the thing considering the specific symbol `?form` special, not Clojure etc |
| 20:04 | augustl | that is, you need to know your way around macros, so if you don't (like me), midje tests can be a pita :) |
| 20:05 | llasram | Yeah, I've so far only used Midje with cascalog-midje, because the extra helpers are very nice. But I tried using it for regular code an quickly went back to just clojure.test |
| 20:06 | mdeboard | oh man I love cascalog-midje |
| 20:06 | mdeboard | amazing |
| 20:06 | augustl | yay, made it work using with-redefs-fn |
| 21:15 | gert | who should I contact if I suspect I found a vulnerability in Ring? weavejester? |
| 21:15 | weavejester | gert: Yep |
| 21:15 | gert | I made a simple lein project to illustrate something that may be a problem. |
| 21:16 | gert | what's the best way of getting it to you? |
| 21:16 | weavejester | gert: A zip in an email, maybe? |
| 21:17 | gert | I've got the zip (well, tgz if that's ok). not your email though. Can I find that on github? |
| 21:17 | weavejester | gert: Yep, or you can have it here: jreeves@weavejester.com |
| 21:17 | gert | cheers! I'll get in touch. |
| 21:25 | atoi | Anyone in here use Riemann? |
| 21:25 | atoi | I know aphyr does, but I don't think he's about. :) |
| 21:26 | aphyr | I'm here |
| 21:26 | atoi | Oh! Nevermind! |
| 21:26 | atoi | It finally showed up. |
| 21:26 | gert | weavejester: you've got mail :) |
| 21:26 | atoi | I think rate works different than I thought. |
| 21:26 | aphyr | Take this to #riemann? |
| 21:27 | atoi | yes. |
| 21:30 | benedikt | Emacs + Clojure is really confusing. |
| 21:30 | gert | Emacs + anything is really confusing :) |
| 21:31 | benedikt | Clojure is the most confuisng adventure so far. |
| 21:31 | gert | what confuses you? |
| 21:31 | benedikt | I have two clojure interpreters |
| 21:31 | benedikt | lein and clojure (ubuntu package) |
| 21:32 | benedikt | i need a "project" to use clojure-jack-in, and i need lein to create a project to use with emacs |
| 21:32 | benedikt | but then emacs proceeds to use the *other* clojure interpreter. |
| 21:32 | benedikt | and it also seems to leave a tcp port open for the world |
| 21:32 | gert | you mean you need a project.clj for clojure-jack-in right? |
| 21:33 | benedikt | yes |
| 21:33 | gert | which is, clojure-jack-in relies on leiningen, which needs the project.clj |
| 21:33 | benedikt | right |
| 21:33 | benedikt | but why doesnt it use the lein repl? |
| 21:33 | gert | it does - through slime/swank |
| 21:34 | benedikt | that, and the world readable port, is what confuses me |
| 21:34 | benedikt | well no |
| 21:34 | gert | can you start a repl from outside of emacs? |
| 21:34 | benedikt | yes. as a matter of fact, two different ones |
| 21:34 | benedikt | lein has 1.4 and the ubuntu package provided 1.3 |
| 21:34 | benedikt | and (clojure-version) inside emacs with slime/swank is 1.3 |
| 21:35 | gert | in your project.clj, is there a dependency on clojure? does that say [org.clojure/clojure "1.4.0"] or 1.3.0? |
| 21:35 | benedikt | yup |
| 21:35 | benedikt | so lein provides both 1.3 and 1.4? |
| 21:35 | gert | which one? :) |
| 21:35 | benedikt | 1.3 is in project.clj |
| 21:36 | benedikt | which explains that part |
| 21:36 | gert | ah, that's why your clojure version is 1.3 |
| 21:36 | benedikt | but i'm still not sure what binary is being used |
| 21:36 | gert | because you're asking for it :) |
| 21:36 | benedikt | sounds like it should be the lein one |
| 21:36 | gert | if you're on the commandline, you can type `lein classpath` |
| 21:36 | benedikt | its created with "lein new" |
| 21:36 | gert | that will show you what jars (including the clojure jar) leiningen is using |
| 21:36 | clojurebot | Roger. |
| 21:37 | benedikt | its downloded with maven, sure smells like clojure |
| 21:37 | gert | lein and slime/swank will happily use what you specify in your project.clj - your other (ubuntu provided) clojure has nothing to do with it |
| 21:37 | benedikt | hurr, lein. |
| 21:37 | benedikt | so what about this word readable port |
| 21:37 | gert | yeah good point. |
| 21:37 | gert | not sure |
| 21:37 | benedikt | can't i bind it to my localhost interface? |
| 21:37 | benedikt | i'm not behind a NAT |
| 21:38 | benedikt | so i feel sort of... naked. |
| 21:38 | gert | yeah i get that |
| 21:38 | amalloy | i think it does bind to localhost, doesn't it? |
| 21:38 | benedikt | nope |
| 21:40 | gert | looks like you're right benedikt. if I do 'lsof | grep IPv4 | grep java' |
| 21:40 | benedikt | yup |
| 21:40 | gert | I see TCP *:61521 (LISTEN) |
| 21:41 | benedikt | but this should be an issue with swank/slime, right? |
| 21:41 | benedikt | i'm figuring out how this all is connected |
| 21:41 | benedikt | now i can google |
| 21:41 | benedikt | i'll report back with results |
| 21:41 | gert | I have results |
| 21:41 | Iceland_jack | good luck benedikt |
| 21:41 | gert | I just asked my workmate to telnet into my machine on that port |
| 21:41 | gert | with great success |
| 21:41 | gert | that's kinda bad eh :) |
| 21:43 | gert | amalloy: is that supposed to happen? |
| 21:43 | amalloy | *shrug* |
| 21:43 | benedikt | gert: http://stackoverflow.com/questions/3747291/clojure-swank-server-opens-public-port |
| 21:43 | benedikt | see the answer from Arthur Ulfeldt. I have only telneted to be port, not tried to connect with swank. |
| 21:43 | benedikt | but since it's still there listening.. |
| 21:43 | gert | yup |
| 21:44 | gert | I'm connected. and it's still listening. |
| 21:44 | benedikt | sama here |
| 21:44 | benedikt | same* |
| 21:45 | gert | and I can happily establish a telnet connection |
| 21:45 | benedikt | yeah same here. and according to the SO post, connecting with slime works too |
| 21:46 | gert | hm. that worries me. |
| 21:47 | gert | Michal Marczyks comment on that SO post looks helpful |
| 21:48 | benedikt | mark Derricutt |
| 21:48 | benedikt | Mark Derricutt posts about how to it with mavne |
| 21:50 | duck1123 | hopefully, that port is blocked by your firewall anyway, but you can tell it the ip to listen on |
| 21:51 | gert | clojure-mode.el calls 'lein jack-in', and lein jack-in only accepts a port number, not an interface |
| 21:51 | gert | s/interface/ip address/ |
| 21:51 | benedikt | where is clojure-mode.el supposed to live? |
| 21:51 | weavejester_ | gert: I got your mail. I don't think there's any way of exploiting it except via an XSS attack (which screws you anyway), but it's behavior that should be changed. |
| 21:52 | duck1123 | you don't have to use jack-in, you can run swank other was |
| 21:53 | gert | cheers weavejester_. I'm creating my own SessionStore that won't allow it |
| 21:53 | duck1123 | that's actually a bit surpising that jack-in defaults to 0.0.0.0, I can understand why swank would, but I'd think that jack in would limit that more |
| 21:54 | weavejester_ | gert: I'm planning on fixing it tomorrow. I'm going to release Ring 1.1.2 then anyway. |
| 21:54 | gert | awesome! |
| 21:57 | gert | duck1123: https://github.com/technomancy/swank-clojure/blob/master/lein-swank/src/leiningen/jack_in.clj says it's connecting to localhost.. hm. |
| 21:57 | cljr | does anyone know the policy on submitting posts to the mailing lists? I posted (or tried) to post a message today about my experiences using Clojure to develop a crowdfunding site for open source projects, but it seems to have been rejected. is plugging a site not allowed? |
| 21:59 | duck1123 | cljr: if this was your first post, it may be in moderation, or did it say it was rejected? |
| 22:00 | duck1123 | That doesn't sound too spammy, people announce their stuff all the time |
| 22:00 | cljr | duck1123: yeah, most of the content was comparing languages |
| 22:00 | cljr | duck1123: never got a message that said it was rejected |
| 22:00 | duck1123 | so it's probably just in the moderation queue |
| 22:01 | cljr | okay, that okay. i saw other posts had since gotten through to the list, didnt realize it was just first time users that had to go through approval |
| 22:01 | cljr | thats* okay rather |
| 22:03 | duck1123 | I just recently got back from a user's group for a talk on clojure+android, but the speaker didn't know clojure very well. It was an interesting experience |
| 22:03 | cljr | ouch |
| 22:03 | duck1123 | It's a shame there are so few clojure users in this area |
| 22:03 | cljr | what area is that? |
| 22:03 | duck1123 | Detroit, MI |
| 22:04 | cljr | are there other large language communities there? |
| 22:05 | Frozenlock | Ok I know this is more a MongoDB than a clojure question, but hopefully some congomongo user will have an answer to this... Is there a way to make a "variable-capped-collection"? By that I mean that I want a maximum size for a given collection (say 1go), but I don't want to occupy a whole Go on my hard disk if I'm really only using 10k. |
| 22:06 | duck1123 | there are plenty, it's just the detroit-clojure group never got going |
| 22:06 | eggsby | Frozenlock: usually I just use the mongo shell to set constraints on the collections |
| 22:06 | eggsby | congomongo doesn't really provide much in terms of a configuration interface |
| 22:06 | Frozenlock | Oh, so I is possible to set an upper limit? |
| 22:06 | Frozenlock | *it |
| 22:07 | eggsby | Frozenlock: http://www.mongodb.org/display/DOCS/Capped+Collections |
| 22:07 | duck1123 | pre-allocated |
| 22:08 | Frozenlock | eggsby: Well yes, but I don't want to lock down unused space |
| 22:08 | Frozenlock | Btw, you don't need to use the shell if you want to create a capped collection :) |
| 22:08 | Frozenlock | (create-collection! "asdf" :capped true :size 10000....) |
| 22:10 | duck1123 | I wonder if you could build something that would auto-rotate to larger collections as space filled |
| 22:10 | duck1123 | probably more work than it's worth |
| 22:12 | Frozenlock | Smells really hacky. Could work, but could fail sooooo badly :P |
| 22:14 | duck1123 | I guess it would really depend on if you already need the ability to manipulate collections. Are you creating a lot of these collections? |
| 22:15 | Frozenlock | I intend to create hundreds... |
| 22:15 | gfredericks | any guesses why my definition of permuto diverges? https://gist.github.com/3185823 |
| 22:15 | Frozenlock | I was going to cap them at 1go, but I stopped immediatly when I saw it was eating my harddrive live. |
| 22:15 | Frozenlock | *on nom nom nom* |
| 22:18 | dnolen | gfredericks: it's almost always the same, you program allows unground variables to grow. |
| 22:19 | dnolen | gfredericks: appendo suffers from this problem as well. |
| 22:19 | gfredericks | dnolen: I was looking for that but couldn't see where :/ |
| 22:20 | dnolen | gfredericks: I would compare your version against the one in core.logic |
| 22:20 | gfredericks | ha; I didn't know there was one :) thanks |
| 22:22 | dnolen | gfredericks: it's new :) it's in master |
| 22:22 | dnolen | gfredericks: thank amalloy |
| 22:28 | dnolen | gfredericks: I've got some ideas about how to deal with that, but that's probably slated for the next bigrelease - so time away. |
| 22:28 | dnolen | not anytime soon I mean. |
| 22:29 | gfredericks | huh; so he deals with one element at a time while I tried two; but when I try to switch mine to work like his I get repeat results :) |
| 22:30 | amalloy | direct bug reports to dnolen: i implemented permuteo in a way he thought was ugly, so his version is the one in master; i just provided the idea |
| 22:30 | gfredericks | I haven't checked if the core.logic version also repeats |
| 22:30 | dnolen | amalloy: haha, no I didn't look at your version closely. |
| 22:30 | gfredericks | so it might just be a bug in my mimickery |
| 22:30 | dnolen | amalloy: I nearly always defer to existing Prolog versions so I can save my brain power for other things. |
| 22:40 | georgek | hi, I started doing 4Clojure and on 'count a sequence' my answer returned 'you tripped the alarm! count is bad!' even though I'm not using count, does anyone know what this means? |
| 22:42 | eggsby | georgek: the idea is to be able to solve it without using count |
| 22:42 | georgek | without counting at all that is, not just the 'count' fn? |
| 22:42 | eggsby | no, without using the count function |
| 22:43 | georgek | yes, I'm not using count, but my answer triggers the error still |
| 22:43 | eggsby | :O |
| 22:43 | georgek | am I missing something |
| 22:43 | eggsby | perhaps you are using something that uses count internally? |
| 22:44 | georgek | this was my (probably incorrect) answer, https://www.refheap.com/paste/3824 |
| 22:49 | eggsby | georgek: for uses 'count' internall |
| 22:50 | eggsby | georgek: https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L4088 |
| 22:51 | eggsby | you should be able to do it only using 'fn' and 'recur' fwiw |
| 22:51 | eggsby | well, maybe some others, inc or + or w/e |
| 22:51 | georgek | thanks eggsby |
| 22:51 | georgek | I'm working on a different answer with looping now |
| 22:52 | eggsby | is this your first functional lang georgek ? |
| 22:52 | georgek | pretty much |
| 22:53 | eggsby | it's a heck of a shift, I came from python where everything was for .. in .. if .. else .. |
| 22:53 | georgek | ha |
| 22:53 | georgek | yes most of my experience is Python |
| 22:54 | eggsby | the early stuff in 4clojure, it's mostly solved by recursion until you can use the lang builtins, but getting a hang of stuff like reduce takes most people a while |
| 22:54 | amalloy | well, for is still great in clojure (better imo, but i'm not much of a python enthusiast) |
| 22:55 | eggsby | amalloy: yah, python has list comprehension as well, but I think clojure's is nicer (since you can have full power inside your comprehensions) |
| 22:55 | brehaut | for in clj is closer to a generator comprehension in python |
| 22:56 | dnolen | brehaut: really closer to Haskell list comprehensions given how fancy they are. |
| 22:57 | brehaut | dnolen: however not entirely relevant when making a comparison to something in python ;) |
| 22:57 | gfredericks | oh man there is a clojure coffee mug |
| 22:58 | eggsby | where do I get it gfredericks |
| 22:58 | gfredericks | http://www.zazzle.com/clojure_mug_i_get_more_done_when_im_lazy_v2-168060469711592507 |
| 22:58 | gfredericks | I'm having a hard time not getting it |
| 22:59 | tmciver | gfredericks: cool! The text in the picture looks like crap though. |
| 22:59 | eggsby | ya, not sure what's up with that font |
| 22:59 | gfredericks | it is hipster |
| 23:00 | eggsby | dnolen: I enjoyed your core.logic talk posted on vimeo recently, if only I could find an excuse to use it at work... |
| 23:00 | technomancy | benedikt: swank hasn't defaulted to 0.0.0.0 in a really long time |
| 23:00 | technomancy | but if you're confused I recommend starting at https://github.com/technomancy/clojure-mode/blob/master/doc/index.md and ignoring all OS-level clojure packages |
| 23:01 | gfredericks | dnolen: looks like clojure.core.logic/permuteo diverges as well (which is odd given the last thing I said about it); should I make a ticket in jira? |
| 23:02 | dnolen | huzzah! |
| 23:02 | dnolen | 288 commits later http://github.com/clojure/core.logic/compare/89fac76158...e6d5d2286e |
| 23:02 | dnolen | cKanren extensions in master |
| 23:02 | gfredericks | oh snaps |
| 23:02 | dnolen | gfredericks: I'd rather you confirm that it's not issue in Prolog first. |
| 23:03 | dnolen | gfredericks: divergence is a real problem, not easily solved. |
| 23:03 | dnolen | gfredericks: in the nature of the system. |
| 23:06 | brehaut | what‽ |
| 23:07 | gfredericks | kiwis: because they just have more energy at this time of the tomorrow. |
| 23:08 | brehaut | haha |
| 23:09 | brehaut | i have forgotten way too much prolog |
| 23:09 | gfredericks | brehaut says it halts in prolog |
| 23:10 | amalloy | gfredericks: can you test my impl of permuteo at http://stackoverflow.com/questions/11256242/solving-dinesmans-multiple-dwelling-example-using-clojures-core-logic-core-mat/11280559#11280559 ? i don't know what you're doing to check divergence |
| 23:10 | gfredericks | amalloy: (run 3 [q] (permuteo q [1 2])) |
| 23:10 | amalloy | but do it for me cause i'm too lame to do it myself? |
| 23:11 | gfredericks | :) |
| 23:11 | dnolen | gfredericks: I doubt that works in Prolog. |
| 23:11 | gfredericks | brehaut just tried http://www.dreamincode.net/code/snippet3411.htm |
| 23:11 | brehaut | dnolen: gfredericks have me a snippet of code he told me was equivalent, and i ran it for him |
| 23:11 | gfredericks | which looks equivalent to the core.logic code |
| 23:12 | dnolen | gfredericks: I think I used this, http://colin.barker.pagesperso-orange.fr/sands.htm |
| 23:15 | dnolen | gfredericks: if you're going to open a ticket it should include the equivalent Prolog and better solution if actually exists. |
| 23:16 | dnolen | gfredericks: chances are you can write the solution slightly differently only for it diverge with a different set of ground unground terms. |
| 23:18 | gfredericks | I just noticed the prolog versions don't seem to have the != constraint |
| 23:18 | gfredericks | hard to imagine that would make a difference |
| 23:18 | gfredericks | or at least this kind of difference |
| 23:19 | amalloy | fwiw gfredericks, my version doesn't diverge |
| 23:19 | amalloy | (run 3 [q] (permuteo q [1 2])) ;; ((1 2) (2 1)) |
| 23:21 | gfredericks | amalloy: and your rembero doesn't have the != either |
| 23:21 | dnolen | gfredericks: don't think != matters much here. |
| 23:21 | dnolen | checking now |
| 23:21 | amalloy | well, mine is to remove *any one* x, not specifically the first x |
| 23:21 | gfredericks | right |
| 23:21 | amalloy | but it's slower |
| 23:22 | gfredericks | and the difference shouldn't matter when you're permuting a list of distinct things |
| 23:22 | dnolen | amalloy: does yours diverge for run 3 (permuteo [1 2] q)? |
| 23:23 | amalloy | dnolen: yes |
| 23:23 | dnolen | amalloy: as I suspected |
| 23:23 | dnolen | anyways, I have some ideas to solve this issue - but it ain't happening anytime soon. |
| 23:24 | gfredericks | oh prolog diverges too when you reverse the args :D |
| 23:25 | gfredericks | man logic programming is hard |
| 23:26 | brehaut | lets go shopping |
| 23:26 | gfredericks | I want a new conso action figure |
| 23:26 | gfredericks | dnolen: thanks for the clarification |
| 23:27 | gfredericks | what is the X in CLP(X)? |
| 23:27 | gfredericks | integers up to 10? :) |
| 23:55 | Frozenlock | Seems I will not have other choices than to make my own maximum-size-collection function. Is there a way to obtain the size of a collection from congomongo? |