2014-01-04
| 00:10 | egghead | is there anything like hiccup for om dom fns |
| 00:10 | noonian | https://github.com/r0man/sablono maybe |
| 00:12 | egghead | ah, thanks |
| 00:12 | noonian | np |
| 00:13 | egghead | all the om/el #js stuff feels very boilerplate :3 |
| 00:13 | egghead | https://github.com/swannodette/todomvc/blob/gh-pages/labs/architecture-examples/om/src/todomvc/item.cljs#L66-L83 |
| 00:40 | t3soro | Is there some lock object like a multi-semaphore that can signal all waiting threads? |
| 00:41 | marcopolo` | t3soro: what are you trying to do? |
| 00:42 | t3soro | synchronize an object and block all ops on it until it's ready |
| 00:43 | t3soro | I have a state machine and i dont want to allow ops during a busy state.. never mind i see how its not necessary |
| 00:43 | hiredman | there are lots of those infact |
| 00:43 | t3soro | how much do i have to pay you? |
| 00:44 | t3soro | lol |
| 00:44 | hiredman | every jvm object has wait/notify |
| 00:44 | hiredman | not that those are great, but they are there |
| 00:46 | t3soro | Hmm these are interesting but i got it figured out.. just requires an atomic boolean busy state |
| 00:50 | indigo | bitemyapp: http://svn.codehaus.org/groovy/trunk/groovy/groovy-core/src/main/org/codehaus/groovy/runtime/ArrayUtil.java :D |
| 01:39 | alew | is reduce lazy? |
| 01:40 | TEttinger3 | alew: you can reduce over lazyseqs. I believe even then it evaluates them though. to the docstring! ##(doc reduce) |
| 01:41 | 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 well... https://www.refheap.com/22458 |
| 01:41 | alew | I guess it doesn't really make sense for reduce to be lazy |
| 01:41 | TEttinger3 | so no, not lazy |
| 01:42 | TEttinger3 | but you can do something like... |
| 01:42 | TEttinger3 | ,(reduce (fn [_ __] (reduced)) 0 (repeat 1)) |
| 01:42 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: core/reduced> |
| 01:43 | TEttinger3 | ,(reduce (fn [_ __] (reduced "whee")) 0 (repeat 1)) |
| 01:43 | clojurebot | "whee" |
| 01:43 | TEttinger3 | (repeat 1) is an infinite sequence |
| 01:45 | alew | right |
| 02:30 | john2x | how do I try out my leiningen template locally? |
| 02:33 | TEttinger3 | john2x, maybe lein install? I've never used anything but the default template though |
| 02:41 | noonian | yeah, lein install |
| 02:42 | noonian | then add it to your plugins in .lein/profiles.clj i think |
| 02:42 | noonian | in mine its in the form of [<template-name>/lein-template "0.1.0-SNAPSHOT"] |
| 03:09 | Clome_ | Is there a macro, form, or fn that allowes you to apply a single argument to multiple function (do (fn1 a) (fn2 a) (fn3 a) (fn4 a) (fn5 a)) => (something a fn1 fn2 ...) |
| 03:16 | egghead | Clome_: ((juxt fn1 fn2 fn3 fn4) a) |
| 03:17 | egghead | ,((juxt < >) 1 0) |
| 03:17 | clojurebot | [false true] |
| 03:18 | `cbp | (doto a f1 f2 f3 f4) |
| 03:36 | pyrtsa | Ouch, the semantics of (reduce f xs) could be better than: "If coll has only 1 item, it is returned and f is not called. (...) If coll contains no items, returns val and f is not called." |
| 03:37 | pyrtsa | ^ That works fine for (+) and (*), but not so much for monoids like sets where the type of the first argument of f is different from the element type of xs. |
| 03:38 | pyrtsa | Fortunately (reduce f init xs) works. :) |
| 03:39 | pyrtsa | (IMO, a better option would've been to define (reduce f xs) as an error if xs is empty, regardless of f.) |
| 03:45 | arcatan | my favorite would be to define f like (defn f ([] unit-value) ([x y] (operation x y))) and then (reduce f xs) = (reduce f (f) xs) |
| 03:45 | arcatan | (not actually a good idea, but hey) |
| 05:52 | abaranosky | anyone there? |
| 06:13 | ddima | probably ;) |
| 06:25 | john2x | hmm i'm getting "No such var: clojure.core.cache/through" when trying to start the repl of a project created by my fork of luminus-template. what does it mean? |
| 06:34 | anildigital | what's wrong with this code? https://gist.github.com/anildigital/c3f47416b8986bd6b59b |
| 06:34 | mrcheeks | john2x: do you depend on it? |
| 06:35 | mrcheeks | john2x:depend as lein dependency |
| 06:36 | john2x | mrcheeks: no, but probably one of the dependencies that's added by luminus.. strange thing is that the changes I introduced don't remove/add any dependencies.. I just switched some template files around. |
| 06:38 | ddima | anildigital: how do you call functions in clojure? |
| 06:38 | mrcheeks | anildigital: looks like you're writing code the java way and mixing it up, I'm also still learning though... (1) vs 1 (* 1 1 ) vs (1 * 1) |
| 06:38 | ddima | anildigital: you multiply n with a function instead of calling it |
| 06:39 | john2x | here's the stacktrace https://www.refheap.com/22463 |
| 06:39 | ddima | and you also call an int |
| 06:39 | anildigital | ddima: corrected that but still get same error |
| 06:39 | anildigital | https://gist.github.com/anildigital/c3f47416b8986bd6b59b |
| 06:39 | ddima | basically its completely wrong unfortunately, see https://gist.github.com/anildigital/c3f47416b8986bd6b59b |
| 06:39 | ddima | err |
| 06:39 | ddima | http://stackoverflow.com/questions/1662336/clojure-simple-factorial-causes-stack-overflow |
| 06:40 | ddima | wrong link |
| 06:40 | john2x | and as a sidenote, since I `lein install`ed my fork of luminus-template, how do I go back to the official version? |
| 06:40 | ddima | anildigital: the recursive call is not a proper call still |
| 06:41 | ddima | anildigital: what helps if you absolutely dont see your error, try every line on its own in the repl |
| 06:41 | mrcheeks | ddima: indeed, but the syntax is all wrong |
| 06:41 | ddima | with imaginary values |
| 06:41 | ddima | mrcheeks: yeah, as mentioned |
| 06:43 | ddima | anildigital: its actually pretty easy to understand, whatever is in the first position of a 'list' () is viewed as a call to this function and the rest are arguments. so if the thing at position one is not a function it wont work. usially X cannot be cast to clojure.lang.IFN |
| 06:43 | ddima | this would also happen for (1) |
| 06:43 | ddima | ,(1) |
| 06:43 | mrcheeks | anildigital: Check again function calls in lisp and that should do it (prefix notation) |
| 06:43 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn> |
| 06:47 | ddima | anildigital: fixed? ;) |
| 06:49 | ddima | there's one more thing you need to understand for your example: whatever statement was evaluated last will be returned by your function - thus 1 or the result of the recursive call, but you dont need to wrap any value in braces |
| 06:49 | ddima | ,(do (defn footest [] 1 2 3) (footest)) |
| 06:49 | clojurebot | 3 |
| 06:54 | john2x | found the culprit that's depending on clojure.core/memoize. it's https://github.com/ngrunwald/ring-middleware-format/blob/master/project.clj. But I've added clojure.core.cache to my project.clj already, and it's still throwing the exception |
| 06:54 | pyrtsa | arcatan: That's incidentally what clojure.core.reducers asks you to do. :) (Re: "semantics of (reduce f xs)") |
| 06:54 | john2x | does it need to be added in core.memoize's dependencies? |
| 06:55 | john2x | or in ring-middleware-format's dependencies? |
| 07:07 | Clome_ | why this (map #(do {% (inc %)}) a) does work but this does not (map #({% (inc %)}) a)? You are allowed to define a fn that just returns a map. |
| 07:12 | amalloy | #(x) is (fn [] (x)), not (fn [] x), Clome_. if you substitute {% (inc %)} for x there, you'll see that it expands not to the (fn [x] {x (inc x)}) that you want, but instead to (fn [x] ({x (inc x)})) |
| 07:13 | Clome_ | thanks |
| 07:14 | ddima | Clome_: sometimes macroexpand-1 is your friend ;) |
| 07:15 | amalloy | but not in this case, ddima :P |
| 07:15 | amalloy | it's really just quote |
| 07:15 | amalloy | ,'#({% (inc %)}) |
| 07:15 | clojurebot | (fn* [p1__25#] ({p1__25# (inc p1__25#)})) |
| 07:15 | ddima | oh, true, the expand does nothing ;) |
| 07:15 | ddima | til |
| 07:19 | ddima | amalloy: do you know how thats implemented btw? |
| 07:21 | amalloy | https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L624 |
| 07:21 | ddima | thx |
| 07:23 | ddima | haven't peeked into the code very much yet, so wasnt able to quickly find it. initially thought it might still be something different than just hardcoded shorthand |
| 07:26 | Clome_ | I have a vector and I would like to apply a fn to each ele, this ele, when applied to this fn would return a vector. I would like at the end to have a map whos keys are ele of the original vector and values being vectors returned by the function applied on this ele. |
| 07:26 | Clome_ | example (map #(do {% [% % %]}) [1 2 3 4 5]), now I get a seq of maps, and I would like to merge them all in one map |
| 07:26 | Clome_ | Is this even the best way to do this? |
| 07:30 | amalloy | &(into {} (for [x (range 1 6)] [x (repeat 3 x)])) |
| 07:30 | lazybot | ⇒ {1 (1 1 1), 2 (2 2 2), 3 (3 3 3), 4 (4 4 4), 5 (5 5 5)} |
| 07:30 | ddima | you coult either do a (into {} (map ...) or you could do a (apply merge (map ...)) |
| 07:30 | ddima | could |
| 07:30 | ddima | sry |
| 07:30 | ddima | and probably any other number of interesting ways ;) |
| 07:31 | hyPiRion | ,(let [f #(repeat 3 %)] (reduce #(assoc %1 %2 (f %2)) {} (range 1 6))) |
| 07:31 | clojurebot | {5 (5 5 5), 4 (4 4 4), 3 (3 3 3), 2 (2 2 2), 1 (1 1 1)} |
| 07:32 | ddima | amalloy: btw, why does the indentation suck so much in the jvm code? ;) |
| 07:32 | amalloy | rich is some kind of lunatic, ddima |
| 07:32 | amalloy | he purports to like it that way |
| 07:32 | ddima | is that so? ;) |
| 07:32 | ddima | hehe |
| 07:33 | ddima | at first i suspected those parts were generated or something, but nah |
| 07:51 | anildigital | ddima: nope not yet. . here is updated gist https://gist.github.com/anildigital/c3f47416b8986bd6b59b |
| 07:55 | pyrtsa | anildigital: (n - 1) -> (- n 1). There are no infix operators in Clojure. |
| 07:55 | anildigital | ddima: got it right https://gist.github.com/anildigital/c3f47416b8986bd6b59b |
| 07:55 | anildigital | pyrtsa: thanks |
| 07:56 | anildigital | if you use emacs.. what emacs plugins would help me to do clojure development.. I am already using cider, clojure-mode clojure-test-mode |
| 08:06 | guns | Anyone have any tips for performance regression testing? I'm hoping there's already a test wrapper around criterium or something like that… |
| 08:10 | TEttinger | guns, I actually don't know what that is, but it sounds like something I could use... if I used unit tests <.< |
| 08:11 | TEttinger | anildigital, there's lots of ways to write a factorial in clojure. a fun one is: |
| 08:11 | TEttinger | ,(reduce * (range 1 10)) |
| 08:11 | clojurebot | 362880 |
| 08:12 | TEttinger | err needs to be incremented, the 10 |
| 08:12 | guns | yes, tests that scold you when you make things slower are a good way to keep things fast |
| 08:12 | TEttinger | that's actually factorial 9, because range excludes the end |
| 08:13 | anildigital | yep |
| 08:13 | anildigital | (defn factorialm |
| 08:13 | anildigital | [n] |
| 08:13 | anildigital | (reduce *' (range 1 n))) |
| 08:13 | TEttinger | don't paste multi-lones in the channel please |
| 08:13 | TEttinger | *lines |
| 08:13 | anildigital | btw.. just for my knowledge... since when reduce is there in clojure? |
| 08:13 | anildigital | I heard reducers were introduced couple years back |
| 08:14 | TEttinger | you can define them in privmsg to clojurebot |
| 08:14 | TEttinger | well |
| 08:14 | TEttinger | reduce is different from reducers |
| 08:15 | pyrtsa | reduce has been there from the start. |
| 08:15 | TEttinger | reduce is a function that takes a collection and a function of two args, like + or *, and goes through and collects them into one value. it's been around since before 1.0 |
| 08:15 | anildigital | TEttinger: I sent it to clojurebot in privmsg .. does it respond back with pastie |
| 08:15 | TEttinger | reduced is a function that can short-circuit eval |
| 08:15 | TEttinger | not multiline uuhhhhh |
| 08:16 | TEttinger | hang on |
| 08:16 | TEttinger | ,(defn factorial-m [n] (reduce *' (range 1 n))) |
| 08:16 | clojurebot | #'sandbox/factorial-m |
| 08:16 | TEttinger | like that |
| 08:16 | TEttinger | IRC handles things on a line-by-line basis |
| 08:16 | TEttinger | ,(factorial-m 9) |
| 08:16 | clojurebot | 40320 |
| 08:16 | pyrtsa | Krhm. ,(defn factorial-m [n] (reduce *' (range 1 (inc n)))) |
| 08:17 | TEttinger | yeah, just copying his |
| 08:17 | pyrtsa | Heh, yeah. |
| 08:17 | TEttinger | ,(defn factorial-m [n] (reduce *' (range 1 (inc n)))) |
| 08:17 | clojurebot | #'sandbox/factorial-m |
| 08:17 | TEttinger | ,(factorial-m 9) |
| 08:17 | clojurebot | 362880 |
| 08:17 | TEttinger | heyyy |
| 08:17 | TEttinger | ,(factorial-m 90) |
| 08:17 | clojurebot | 1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000N |
| 08:17 | TEttinger | snappy |
| 08:18 | TEttinger | capital N is for Big Integer |
| 08:18 | TEttinger | capital M is for Big Decimal |
| 08:19 | TEttinger | ,(factorial-m 90.0M) |
| 08:19 | clojurebot | 1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000N |
| 08:19 | TEttinger | ,(factorial-m 90.5M) |
| 08:19 | clojurebot | 135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000N |
| 08:19 | TEttinger | oh that's interesting |
| 08:21 | TEttinger | the range makes reduce behave differently than (I think) the recursive solution on decimal inputs |
| 08:21 | anildigital | factorial of 9 was wrong above |
| 08:21 | TEttinger | first one yeah? |
| 08:21 | anildigital | it is supposed to be 40320 |
| 08:21 | TEttinger | ,(* 1 2 3 4 5 6 7 8 9) |
| 08:21 | clojurebot | 362880 |
| 08:21 | anildigital | ,(factorial-m 9) |
| 08:21 | clojurebot | 362880 |
| 08:21 | anildigital | that's wrong |
| 08:21 | TEttinger | I redefined it |
| 08:21 | TEttinger | wait |
| 08:22 | TEttinger | so factorial doesn't multiply by the number as an arg? |
| 08:22 | anildigital | ,(defn factorialm [n] (reduce *' (range 1 n))) |
| 08:22 | clojurebot | #'sandbox/factorialm |
| 08:22 | anildigital | ,(factorialm 9) |
| 08:22 | clojurebot | 40320 |
| 08:22 | anildigital | that's true |
| 08:22 | TEttinger | ,(* 1 2 3 4 5 6 7 8 9) |
| 08:22 | clojurebot | 362880 |
| 08:22 | TEttinger | that's what a factorial boils down to right? |
| 08:22 | anildigital | TEttinger: that's factorial of 10 |
| 08:22 | anildigital | ,(factorialm 10) |
| 08:22 | clojurebot | 362880 |
| 08:23 | pyrtsa | ,(factorialm 3) |
| 08:23 | clojurebot | 2 |
| 08:23 | anildigital | what is best way to learn clojure syntax .. I am long time ruby programmer.. |
| 08:23 | pyrtsa | Yeah right. |
| 08:24 | anildigital | let me know most interesting and fun book to learn clojure .. clojure programming feels like covering eveything.. but not that applicable |
| 08:24 | TEttinger | anildigital, you just get used to the parentheses after a while. editors with optional rainbow parentheses help match braces easier |
| 08:24 | anildigital | TEttinger: I am long time user of emacs.. so paretheis is okay for me |
| 08:25 | TEttinger | ok, then the syntax is just prefix |
| 08:25 | TEttinger | function first, then args |
| 08:25 | insamniac | I'm reading the Joy of Clojure right now, which I find pretty good for someone with no FP experience. |
| 08:25 | shock_one | There is a *file* var to get the current file's path. But how would I get its directory? |
| 08:27 | anildigital | so Joy of Clojure is it? |
| 08:27 | shock_one | anildigital: it's called RPN. Also, there is structural editing mode in Emacs for Clojure, I would recommend you to take a look at ti. |
| 08:27 | insamniac | I like it.. I also got Programming Clojure, but I left that one at work and haven't looked at it as much. |
| 08:27 | TEttinger | parentheses mean try to call the first item in this list. if it fails, (like if the first item is a number), it errors, but quote stops it from trying to call anything inside. that's why lists in clojure are '(1 2 3) instead of (1 2 3) |
| 08:28 | anildigital | there was Poignant's Guide To Ruby.. that was fun read.. |
| 08:28 | TEttinger | shock_one, minus the R in RPN |
| 08:28 | anildigital | hope similar exists in Clojure world too |
| 08:28 | anildigital | btw how many Ruby devs are here? |
| 08:28 | insamniac | there's also 4clojure.com which I like |
| 08:28 | TEttinger | a lot of former rubyists actually |
| 08:28 | TEttinger | clojuredocs.org (is that right?) is ruby on rails internally |
| 08:31 | pyrtsa | Heh, I haven't seen anything similar to _why's Poignant Guide for Clojure. The closest I know of is for Haskell (known as LYAH). |
| 08:36 | shock_one | anildigital: I know ruby. |
| 08:37 | shock_one | And I don't consider Poignant's Guide To Ruby a very good material for studying. Funny, yes, but not helpful. |
| 08:38 | shock_one | So, how to get *file*'s directory. Nobody knows? |
| 08:38 | anildigital | clojuredocs.org is so old now |
| 08:38 | anildigital | somebody needs to update it |
| 08:41 | lnostdal | TEttinger / TEttinger2 : yes, it was a circular symlink .... x) |
| 08:41 | TEttinger | shock_one: *file* gets a File right? |
| 08:42 | TEttinger | http://docs.oracle.com/javase/7/docs/api/java/io/File.html#getParent() |
| 08:42 | TEttinger | ,(.getParent *file*) |
| 08:42 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: getParent for class java.lang.String> |
| 08:43 | TEttinger | ,(.getParent (File. *file*)) |
| 08:43 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: File, compiling:(NO_SOURCE_PATH:0:0)> |
| 08:43 | anildigital | anything there like docco in clojure |
| 08:43 | anildigital | basically I want to setup up a clojure code snippet examples page |
| 08:44 | TEttinger | anildigital, what is docco? |
| 08:44 | anildigital | http://fogus.github.io/marginalia/ .. |
| 08:44 | anildigital | docco like the one for backbone.js and underscore.js documentation |
| 09:33 | anildigital | can namespace be like (ns Hello Wolrd) |
| 09:33 | anildigital | or (ns "Hello World") |
| 09:34 | anildigital | looks like no |
| 09:44 | rovar | (ns (md5 "hello world")) |
| 09:51 | anildigital | https://gist.github.com/anildigital/0fbdd70a2075db8dc17e what handler i need to provide in ring project.clj if my code is this |
| 10:04 | anildigital | is getting this error.. ? any obvious error there? https://gist.github.com/anildigital/e34826a48143af3aa4a4 |
| 10:10 | anildigital | anyone has example code to show how to serve static html files using ring and compojure |
| 10:15 | kzar | I'm messing around trying to implement an example in the book I'm reading myself and the recursion is going wrong somehow. It's running out of heap space but weirdly when I chuck a println in the function I only get a printed output once. |
| 10:16 | kzar | (I would have expected the println to be called lots of times, because the recursive function is being called lots of times and therefore printed out tonnes of crap.) |
| 10:17 | zerokarmaleft | kzar: paste the code to refheap or something |
| 10:17 | kzar | I'd rather not it's pretty awful |
| 10:18 | kzar | I'm more asking how do you debug recursion gone-awry? I thought chucking in a println would elucidate but apparently not |
| 10:18 | llasram | kzar: It should |
| 10:19 | kzar | OK I'll paste but don't judge me heh |
| 10:19 | kzar | zerokarmaleft: llasram: https://gist.github.com/kzar/07067986085d63f274b9 |
| 10:24 | rovar | where can one find more information about pods? It seems there was a big todo in late 2011 and 2012, and I haven't heard anything about them until Fogus' talk from Clojure Conj |
| 10:25 | zerokarmaleft | rovar: rhickey's keynote from conj '2012 talks about the idea briefly |
| 10:25 | llasram | kzar: I need to go eat, but I'll take a look when I get back if no one else has commented |
| 10:25 | zerokarmaleft | I'm not sure if there's an implementation that's fully baked |
| 10:26 | john2x | how do I fix "Could not find artifact org.clojure:clojure.core.cache:jar:0.6.3 in central (http://repo1.maven.org/maven2/)" when I try `lein deps :tree` |
| 10:26 | john2x | ? |
| 10:26 | john2x | My connection is fine.. and I can find it in .m2/repository |
| 10:33 | zerokarmaleft | kzar: I think you need to examine your base cases again |
| 10:34 | kzar | zerokarmaleft: Yes I see a few problems |
| 10:34 | kzar | I think it roughly worked I just underestimated how inefficient it was |
| 10:34 | kzar | (Which was the point they were making in the book) |
| 10:34 | kzar | I'm guessing |
| 10:36 | zerokarmaleft | kzar: map is lazy, which is why (println amount) doesn't output anything...it doesn't get a chance to because the recursion blows up before the first value can resolve |
| 10:37 | kzar | Yea |
| 10:37 | kzar | zerokarmaleft: Updated with slightly better version |
| 10:37 | justin_smith | I'm gonna make a single serve page: whydoesn'tyourclojureprogramdoanything.com |
| 10:37 | justin_smith | the only content will be "because map is lazy" |
| 10:38 | kzar | I'm not sure that's a valid URL |
| 10:38 | justin_smith | no, I'll have to refactor that runon |
| 10:40 | kzar | This the best way to remove nil's from a sequence? (filter #(not (nil? %)) [nil nil 1 2]) |
| 10:40 | zerokarmaleft | justin_smith: y-u-no-eager.com |
| 10:40 | justin_smith | heh |
| 10:40 | justin_smith | kzar: keep |
| 10:40 | justin_smith | ,(keep [0 1 nil 2 4 nil 5]) |
| 10:40 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/keep> |
| 10:40 | justin_smith | err |
| 10:40 | justin_smith | ,(keep identity [0 1 nil 2 4 nil 5]) |
| 10:40 | clojurebot | (0 1 2 4 5) |
| 10:40 | kzar | justin_smith: Why not |
| 10:41 | kzar | ,(filter identity [nil 1 2]) |
| 10:41 | clojurebot | (1 2) |
| 10:41 | justin_smith | one sec - I know I was going for something better than that here |
| 10:42 | justin_smith | ((juxt (partial filter identity) (partial keep identity)) [0 1 nil false true 2 nil false]) ; kzar |
| 10:42 | justin_smith | ,((juxt (partial filter identity) (partial keep identity)) [0 1 nil false true 2 nil false]) ; kzar |
| 10:42 | clojurebot | [(0 1 true 2) (0 1 false true 2 ...)] |
| 10:42 | justin_smith | oops |
| 10:42 | justin_smith | notice keep lets false through |
| 10:43 | justin_smith | and it's a shorter word too! |
| 10:46 | kzar | Hmm my version in the gist works OK for smaller things now except it creates a crazy nested sequence unnecessarily |
| 10:47 | kzar | Oh because of the map I think |
| 10:48 | llasram | kzar: Do you want `mapcat` instead of `map`? |
| 10:49 | kzar | Hmm well I want a sequence of sequences |
| 10:50 | kzar | So the first time around I guess I want to use map and the other times I want mapcat... can't help but feel I'm doing this a dumb way though |
| 10:50 | llasram | It's an expensive algorithm, but there's nothing fundamentally flawed about your approach to implementing it |
| 10:52 | kzar | Good to know, thanks |
| 10:53 | llasram | kzar: mapcat only concatenates the immediate results of the applied function. So if your base case returns a sequence of results (where each result is a sequence), then using `mapcat` will give you the concatenated sequence of all results (where each result is still a sequence) |
| 10:54 | kzar | llasram: Ah right of course, well again this looks ugly to me but it works OK now https://gist.github.com/kzar/07067986085d63f274b9 |
| 10:55 | anildigital | I need to serve static files in a directory. any solution in clojure with ring or compojure? |
| 10:57 | llasram | kzar: I don't believe you need the `(filter identity ...)`, and the formatting is slightly unusual, but what else bother you about it? |
| 10:58 | llasram | anildigital: http://ring-clojure.github.io/ring/ring.middleware.file.html |
| 10:58 | justin_smith | anildigital: yeah, there is a static file middleware for ring |
| 10:58 | kzar | llasram: Oh does the mapcat do away with the need for filtering away nil values? |
| 10:59 | llasram | ,(mapcat (constantly nil) (range 10)) |
| 10:59 | clojurebot | () |
| 10:59 | mullr | anildigital: https://github.com/ring-clojure/ring/wiki/Static-Resources perhaps? |
| 10:59 | llasram | kzar: As long as none of your `options` are `nil` |
| 11:00 | kzar | llasram: Is it idiomatic to wrap options in a vector like I ahve there? |
| 11:00 | justin_smith | anildigital: I use ring.middleware.resource/wrap-resource |
| 11:00 | anildigital | https://gist.github.com/anildigital/8325ea2381c0edf60939 wrote something like this .. but it's returning 'Hello Another World always" |
| 11:00 | justin_smith | which can also serve static assets out of a jar |
| 11:00 | llasram | kzar: To make the base case of a recursive algo be a 1-element sequence? Totally |
| 11:01 | kzar | llasram: OK I've sorted out the indentation - pasting from repl sort of ballsed it - does it look OK apart from the fact the thing I'm actually doing is dumb? |
| 11:01 | anildigital | justin_smith: how to use it in the snippet I shared |
| 11:03 | llasram | kzar: Oh, I missed the `lazy-seq` somehow -- you don't need that either :-) |
| 11:03 | justin_smith | (wrap-resource root) would work where you have (wrap-file root) - the only difference is that wrap-resource works for things inside a packed jar |
| 11:03 | kzar | llasram: I do in case I do (take 10 (change-ways 100 .... |
| 11:04 | anildigital | justin_smith: nope.. I have physical directory |
| 11:04 | justin_smith | anildigital: wait, the other difference would be not checking "user.dir" and just giving a path relative to the top level of your app |
| 11:04 | anildigital | justin I want to point to that directory .. which has html files |
| 11:05 | justin_smith | anildigital: I am saying it works for both |
| 11:05 | justin_smith | but your wrap-file should work |
| 11:05 | llasram | kzar: `mapcat` already returns a lazy sequence. Unless I'm missing something, I don't believe it helps |
| 11:05 | kzar | Well I can't explain exactly why but I've tried with and without and it seems to make a difference |
| 11:06 | llasram | kzar: You're right -- it does matter! You learn something every day... |
| 11:06 | kzar | (Why does it matter?) |
| 11:06 | anildigital | https://gist.github.com/anildigital/2de18198a0f203135174 justin_smith this is updated gist as suggested by you .. but it always prints 'Hello Another World' |
| 11:06 | kzar | Oh I see maybe mapcat doesn't return a lazyseq |
| 11:06 | kzar | (Why not?) |
| 11:07 | llasram | No, it does |
| 11:08 | llasram | Oh, chunking, of course |
| 11:08 | kzar | ? |
| 11:08 | anildigital | justin_smith: do you see any changes that needs to be done in gist so that it doesn't return 'Hello Another World' and starts serving files |
| 11:09 | llasram | No, maybe not |
| 11:09 | zerokarmaleft | llasram: heh |
| 11:11 | kzar | llasram: Maybe because it's applying functions to the list that realises the list? |
| 11:11 | justin_smith | anildigital: don't specify it in terms of user.dir |
| 11:11 | kzar | Either way I've got to go get some food myself, thanks for the help |
| 11:11 | justin_smith | try with root as "output" |
| 11:11 | llasram | kzar: np.... Thank you for the mystery to solve :-) |
| 11:11 | kzar | haha |
| 11:12 | kzar | llasram: (I think if you type (source mapcat) it's pretty clear what's going on.) |
| 11:12 | justin_smith | anildigital: scratch that: make sure "output" is in your resources path, and then you can just use "" as root (you can set resource path in project.clj) |
| 11:13 | anildigital | justin_smith: as per https://github.com/mmcgrana/ring/wiki/Static-Resources what is your-hundler there.. |
| 11:13 | anildigital | I don't get it.. |
| 11:13 | justin_smith | (-> #'handler (wrap-resource "public")) is the same as (wrap-resource #'handler "public") |
| 11:14 | anildigital | justin_smith: but if you see my handler just returns a response map |
| 11:14 | anildigital | so it will always return that map... how will it return the files then? |
| 11:14 | justin_smith | because you are not setting your resource root properly |
| 11:14 | justin_smith | like I said, it needs to be relative to your resource path |
| 11:14 | justin_smith | not to the filesystem root |
| 11:15 | anildigital | Here is another snippet https://gist.github.com/anildigital/352cf0a463420ea167fb |
| 11:16 | justin_smith | well, is " |
| 11:16 | justin_smith | sorry |
| 11:16 | justin_smith | is "." in your resource path? |
| 11:16 | anildigital | it always prints Hello Another World |
| 11:16 | justin_smith | what is your resource path, the default is "resources" but you can add other directories |
| 11:16 | anildigital | justin_smith: even if I replace "." with "output" .. it returns "Hello Another World" |
| 11:17 | justin_smith | by default the top level directory is not in the resources path, so "." will not work there |
| 11:17 | justin_smith | do you understand what I am saying about the resource path? I feel like you are ignoring it |
| 11:17 | anildigital | justin_smith: okay... but my question is that in my code.. defn handler will always return map.. how (wrap-resource "output" ) will ever get executed |
| 11:18 | justin_smith | because it short circuits |
| 11:18 | justin_smith | it doesn't always call the handler |
| 11:18 | anildigital | https://gist.github.com/anildigital/81044bef044667283bb1 |
| 11:18 | anildigital | here is latest snippet |
| 11:19 | zerokarmaleft | ,(time (dotimes [_ 1e4] (take 10 (mapcat (fn [x] [(identity x)]) (range 1e6))))) |
| 11:19 | clojurebot | "Elapsed time: 114.322084 msecs"\n |
| 11:19 | zerokarmaleft | ,(time (dotimes [_ 1e4] (take 10 (lazy-seq (mapcat (fn [x] [(identity x)]) (range 1e6)))))) |
| 11:19 | clojurebot | "Elapsed time: 4.773144 msecs"\n |
| 11:19 | justin_smith | is "output" in your resources-path? how many fucking times do I need to say resources-path? it is a thing you need to modify here! |
| 11:19 | anildigital | justin_smith: yes |
| 11:19 | zerokarmaleft | wow |
| 11:19 | justin_smith | what is your resources-path? |
| 11:19 | justin_smith | show me that part of your project.clj |
| 11:20 | anildigital | https://gist.github.com/anildigital/bf5af4c882b8d97cacda |
| 11:20 | lgs32a | zerokarmaleft: that is a known problem. mapcat is not really lazy |
| 11:20 | lgs32a | zerokarmaleft: due to it's use of apply concat |
| 11:21 | lgs32a | zerokarmaleft: http://clojurian.blogspot.de/2012/11/beware-of-mapcat.html <- also has a lazy impl. |
| 11:21 | zerokarmaleft | lgs32a: cool, thanks for the link |
| 11:23 | justin_smith | anildigital: the resources-path is something you need to specify in project.clj |
| 11:23 | shock_one | Here's a function that take a file's path and returns its parent folder. Please help me make it more concise. |
| 11:23 | shock_one | (defn get-parent [file-path] (->> file-path reverse (drop-while #(not= \/ %)) reverse (apply str))) |
| 11:23 | justin_smith | it determines which directories will be available for finding resources |
| 11:23 | anildigital | justin_smith: here is the code https://github.com/anildigital/clojurebyexample |
| 11:24 | justin_smith | https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L247 |
| 11:24 | lgs32a | zerokarmaleft: http://dev.clojure.org/jira/browse/CLJ-1218 <-- they consider it minor. I think they should just replace it. |
| 11:24 | lgs32a | zerokarmaleft: given that currently it's semi-lazy, which can hardly be intended. |
| 11:24 | justin_smith | anildigital: what you need to do is specify a root for wrap-resource that is relative to one of the resource-paths |
| 11:25 | anildigital | justin_smith: okay .. |
| 11:25 | justin_smith | so if you have :resource-paths ["output"] |
| 11:25 | justin_smith | then the root can be "" |
| 11:26 | justin_smith | see my github/technomancy/leiningen link above |
| 11:26 | justin_smith | it explains in more detail, and shows an example |
| 11:27 | anildigital | justin_smith: changed that.. as you can see in https://github.com/anildigital/clojurebyexample but it prints 'Hello Another World' |
| 11:28 | justin_smith | the resources-path is not part of the :ring key |
| 11:28 | justin_smith | it goes one level above |
| 11:28 | justin_smith | so :plugins ... :resources-path ... :dependencies ... |
| 11:29 | justin_smith | and not "/" for the root, just "" I think |
| 11:29 | justin_smith | though that may not even matter |
| 11:29 | lgs32a | could an implementation expert shed some light on why OPs solution here even outperforms a reducer based solution (reducer based solution not included in link)? http://stackoverflow.com/questions/20914683/in-clojure-can-i-optimize-scans |
| 11:29 | lgs32a | (it also outperforms a simple reduce-based solution, even when freed from destructoring) |
| 11:31 | anildigital | justin_smith: https://github.com/anildigital/clojurebyexample added as separate key and above .. but it still prints 'Hello Another World' |
| 11:32 | anildigital | justin_smith: I think you are not getting what I am saying.. the handler is returning hardcoded response.. how will it ever serve static files? |
| 11:32 | justin_smith | anildigital: try changing "/" to "" in the last line of core.clj |
| 11:33 | justin_smith | you changed it back to wrap-file |
| 11:33 | justin_smith | wrap-file does not use the resource path |
| 11:33 | justin_smith | wrap-whatever has the option of returning something without ever calling the handler |
| 11:34 | justin_smith | if you configure the wrap-file or wrap-resource properly they will return a static file and the handler never gets called |
| 11:34 | anildigital | justin_smith: as you can see in updated git repo.. I changed to wrap-resource .. it still doesn't work.. |
| 11:34 | justin_smith | so if you keep your :resource-paths configuration and change wrap-file to wrap-resources it should work |
| 11:35 | justin_smith | OK |
| 11:35 | anildigital | also there is no wrap-resources .. there is wrap-resource |
| 11:35 | anildigital | it's not short circuiting as expected.. |
| 11:36 | anildigital | if you could clone that repo and try on your side.. |
| 11:36 | justin_smith | anildigital: http://localhost:3000/toc.html |
| 11:36 | justin_smith | I cloned it, that url works |
| 11:37 | justin_smith | with your current codebase |
| 11:37 | justin_smith | http://localhost:3000/Hello.html |
| 11:37 | anildigital | ah |
| 11:37 | justin_smith | that one also, with your current codebase |
| 11:37 | anildigital | thanks a lot |
| 11:37 | anildigital | yeah.. |
| 11:38 | justin_smith | it would be more usual to put static resources in resources/output/ and then have "resources" in :resource-paths and "output" as the root for wrap-resources |
| 11:38 | justin_smith | btw |
| 11:38 | justin_smith | but at least we have something that works now |
| 11:39 | justin_smith | the names are not important, what is important is that by having "" or "/" as the resource-root someone could navigate to anything in the top level of any of your jars in classpath (which may not be a serious issue, but is at least weird) |
| 11:47 | anildigital | justin_smith: somehow I want to make toc.html as the default resource.. will try to add there |
| 11:49 | anildigital | and that is done by putting "toc.html" instead of "" |
| 11:49 | justin_smith | anildigital: you could set a redirect of "" to "toc.html" |
| 11:49 | justin_smith | or even do a request rewrite on the server side |
| 11:49 | anildigital | justin_smith: possibly yes.. but having toc.html as starting point is ok |
| 11:52 | justin_smith | anildigital: this could be adapted to turn "" or "/" into "/toc.html" https://www.refheap.com/22471 |
| 11:54 | anildigital | justin_smith: cool |
| 11:54 | justin_smith | anildigital: the definition of tweak-handling was missing before, I just updated |
| 11:54 | anildigital | I need to run the app like 'lein run -m clojurebyexample.core/app 4000' so that I can have it in Procfile |
| 11:54 | justin_smith | in your case you likely won't care about the request method, and you don't need to check .endsWith, since you have a literal route to rewrite, not a class of routes |
| 11:54 | anildigital | but by default there is no jetty.clj or anything. not sure how can I run it that way |
| 11:55 | justin_smith | you can create a main that starts up ring |
| 11:56 | justin_smith | https://github.com/caribou/caribou-development/blob/master/src/skel/core.clj#L99 like this |
| 11:57 | justin_smith | where "server/run-server" would be replaced by jetty/run-jetty I think |
| 11:57 | justin_smith | ring.adapter.jetty/run-jetty |
| 11:58 | justin_smith | which is basically what lein ring is doing anyway |
| 11:58 | justin_smith | but having a real main function is better |
| 11:59 | justin_smith | also, for dev lein works, of course, but for deployment you should create an uberjar |
| 11:59 | anildigital | ah.. not aware of all these.. |
| 12:00 | justin_smith | procfile makes me think you are talking about deployment scenarios |
| 12:00 | anildigital | justin_smith: yes.. deploy the same on heroku |
| 12:00 | anildigital | https://devcenter.heroku.com/articles/getting-started-with-clojure |
| 12:00 | justin_smith | oh, heroku expects you to use lein doesn't it |
| 12:00 | justin_smith | that's dumb, but I can't fix that |
| 12:01 | justin_smith | oh, wait |
| 12:01 | justin_smith | it does let you specify a standalone, good |
| 12:01 | justin_smith | so don't mind the above |
| 12:02 | justin_smith | so yeah, you need a -main function which starts the server |
| 12:02 | justin_smith | I think lein ring uberjar creates main for you though |
| 12:02 | justin_smith | if you still want to use lein ring |
| 12:02 | justin_smith | but what I described / linked to above shows how to create the jar |
| 12:02 | justin_smith | *create the main function |
| 12:06 | anildigital | java -cp target/clojurebyexample-0.1.0-SNAPSHOT-standalone.jar clojure.main -m clojurebyexample.core.app doesnt work |
| 12:07 | justin_smith | you should not need to specify clojure.main |
| 12:07 | justin_smith | and app does not start a server |
| 12:08 | justin_smith | first off, try "lein ring uberjar" |
| 12:08 | justin_smith | then try java -jar target/<some-uberjar>.jar |
| 12:08 | anildigital | https://gist.github.com/anildigital/6c95684c9d4849b9a33c done.. but gives error |
| 12:08 | anildigital | justin_smith: yep.. same thing |
| 12:09 | justin_smith | for uberjar, you should not specify a :main in project.clj |
| 12:09 | anildigital | java -jar target/clojurebyexample-0.1.0-SNAPSHOT-standalone.jar .. this worked |
| 12:09 | justin_smith | oh, ok |
| 12:10 | anildigital | but with that http://localhost:3000/toc.html it's printing 'Hello Another World' only.. |
| 12:10 | anildigital | short circuit code is not working |
| 12:10 | justin_smith | hmm |
| 12:10 | justin_smith | wrap-resource should be able to find content inside jars, that is the point of wrap-resource after all |
| 12:11 | anildigital | justin_smith: :( |
| 12:11 | justin_smith | I have deployed many webapps that do this stuff |
| 12:11 | justin_smith | it's just a question of getting everything configured properly |
| 12:12 | anildigital | it would be great if this can be run without jar |
| 12:12 | anildigital | means dev mode is ok |
| 12:12 | justin_smith | try changing resource-paths to "resources", and change the root in wrap-resources to "output" and move output/ to resources/output/ |
| 12:13 | justin_smith | that would be closer to the usual setup |
| 12:17 | anildigital | justin_smith: keeping output as it is 'works' in lein ring server mode |
| 12:17 | anildigital | didn't try with standalone yet |
| 12:21 | anildigital | okay that worked.. but now I need redirect headers so that instead of 'Hello Another World' .. it redirect to /toc.html |
| 12:24 | justin_smith | right, you should be able to use some variation on the funcitons I posted above |
| 12:34 | anildigital | justin_smith: somehow heroku needs $PORT to be passed from outside.. |
| 12:34 | anildigital | java -jar target/clojurebyexample-0.1.0-SNAPSHOT-standalone.jar starts on default port 3000 |
| 12:37 | anildigital | justin_smith: wow http://boiling-oasis-5467.herokuapp.com/ |
| 12:37 | anildigital | justin_smith: I am trying to build something similar to https://gobyexample.com .. do contribute if possible |
| 12:37 | anildigital | thanks a lot |
| 12:37 | justin_smith | congratulations |
| 12:43 | anildigital | http://clojurebyexample.com/toc.html |
| 12:43 | anildigital | \m/ |
| 12:53 | maku | Anyone here using Zepto.js with Clojurescript? I am interested in using it with Chris Granger's Library, jayq. The reason being that Zepto can be compiled with The Google Clojusure Compiler in advanced mode. |
| 12:55 | danno1 | n00b Q: Is the the meta character ^, analogous to annotations? |
| 12:56 | lsdafjklsd | maku: i've been getting by with google closure library and a dom management library (om) |
| 12:57 | maku | dannol: it is, but we usually call it metadata http://clojure.org/metadata |
| 12:58 | dnolen | maku: haven't heard of anyone using Zepto.js, but why do you need to use it with jayq? Isn't the whole idea behind Zepto.js that you don't need jQuery? |
| 12:58 | maku | dnolen: jayq is just a wrapper (uses jquery) since zapto and jquery have the same API, I was hoping to use the same wrapper. |
| 12:59 | danno1 | thanks maku |
| 12:59 | dnolen | maku: I would just give it a shot then. |
| 13:00 | maku | dnolen: thanks, will do |
| 13:06 | bvvd | \whois rhickey |
| 13:08 | jtoy | silly question, in my ns I import java.util.Local, then call it like Locale/ENGLISH, but I am getting Caused by: java.lang.ClassNotFoundException: java.util.Local errrors, is there anything else I need to do to use this class? |
| 13:09 | Tolstoy | jtoy: (import [java.util Locale]), note the space? |
| 13:09 | ivan | also Local != Locale |
| 13:09 | hyPiRion | jtoy: I would guess appending an e would help |
| 13:09 | jtoy | doh, yes |
| 13:10 | jtoy | I hate when that kind of stuff happens |
| 13:10 | jtoy | is it just me? |
| 13:10 | Tolstoy | Ah, I thought that was just a typo here. ;) |
| 13:10 | hyPiRion | nah, I hate it as well |
| 13:11 | Clome_ | Exists something like this (-> a (fn1 b) (fn b)) => (fn2 (fn a b) b), just that puts "a" as the last argument to fn instead of the first one? |
| 13:12 | ivan | ->> |
| 13:13 | Clome_ | >_> |
| 13:13 | Clome_ | thanks |
| 13:13 | Clome_ | i will try it |
| 13:13 | jtoy | Tolstoy: interesting name |
| 13:15 | shock_one | I have some time interval in milliseconds, say 134000. How to convert it to "2 minutes and 14 seconds" |
| 13:18 | hyPiRion | shock_one: have a look at clj-time |
| 13:18 | shock_one | Already. It can only convert intervals to DateTime. |
| 13:18 | hyPiRion | Or, if you want to actually do it manually, I guess you can do something like |
| 13:19 | shock_one | No, I want to find some library, but go ahead. |
| 13:19 | hyPiRion | ah. |
| 13:19 | hyPiRion | Well, then I'm not sure =/ I thought clj-time would provide some of that functionality |
| 13:21 | shock_one | Something like this http://apidock.com/rails/ActionView/Helpers/DateHelper/distance_of_time_in_words |
| 13:29 | Clome_ | a hack (let [sec (/ 134000 1000) min (int (/ sec 60)) rem(- sec (* min 60))] (str min " minutes and " rem "seconds")) |
| 13:30 | Clome_ | ,(let [sec (/ 134000 1000) min (int (/ sec 60)) rem(- sec (* min 60))] (str min " minutes and " rem " seconds")) |
| 13:30 | clojurebot | "2 minutes and 14 seconds" |
| 13:31 | llasram | It's surely in the underlying JodaTime library |
| 13:38 | arcatan | yeah, maybe Joda-Time's PeriodFormatter would be helpful? |
| 13:45 | jergason | in clojure, does your declared namespace need to match the directory structure of your project? |
| 13:46 | Clome_ | as far as I know yes |
| 13:46 | noonian | yes, because java does, plus your file names need to use underscores instead of hyphens |
| 13:47 | Clome_ | be careful about "-" in the namespace. foo-bla => foo_bla.clj |
| 13:47 | seangrove | Anyone with a clue able to tell what might be causing this all of the sudden? https://www.refheap.com/06b8f72dc72f0cda8f72545ef |
| 13:49 | Clome_ | you are allocating too much memory |
| 13:49 | Clome_ | check for memory leaks or allocate more heap for your jvm |
| 13:50 | noonian | do you have :main in project.clj? |
| 13:50 | xeqi | seangrove: did you recently change your project.clj file or lein plugins? |
| 13:51 | shock_one | I'm pretty sure it's not about lein, try to start repl in another project's directory. |
| 13:52 | seangrove | xeqi: No, not at all actually |
| 13:52 | seangrove | I've even reverted to a known-good checkout |
| 13:52 | seangrove | Although the stack trace is different now.. |
| 13:53 | Tolstoy | What happens with "lein deps :tree"? |
| 13:55 | seangrove | Tolstoy: that runs, shows the dependencies |
| 13:55 | seangrove | shock_one: Interesting, looks like it happens elsewhere as well. Maybe something changed with my JVM while I was asleep. I'll look into it |
| 13:55 | Tolstoy | seangrove: Ah, well. I was guessing there was some crazy circular thing going on with one of the dependencies (if that's even possible). |
| 13:57 | seangrove | Maybe all it needs is a good restart and a warm hug. Might as well give it a try. |
| 13:57 | xeqi | seangrove: is that the full stack trace? I'd expect to see where `apply` was being called from? |
| 14:15 | devn | shock_one: you could use cl-format as well |
| 14:16 | hyPiRion | oh yeah |
| 14:16 | hyPiRion | ,(require 'clojure.pprint) |
| 14:16 | clojurebot | nil |
| 14:17 | shock_one | devn: it's pretty cool. |
| 14:17 | hyPiRion | hmm, |
| 14:19 | shock_one | Tolstoy: are you from Russia? |
| 14:19 | Tolstoy | shock_one: Nope. Oregon. ;) |
| 14:21 | devn | ,(require '[clojure.pprint :as p]) |
| 14:21 | clojurebot | nil |
| 14:23 | devn | ,(p/cl-format nil "~D minute~:P and ~D second~:P" 3 30) |
| 14:23 | clojurebot | "3 minutes and 30 seconds" |
| 14:23 | devn | ,(p/cl-format nil "~D minute~:P and ~D second~:P" 1 1) |
| 14:23 | clojurebot | "1 minute and 1 second" |
| 14:23 | devn | shock_one: ^ |
| 14:25 | shock_one | Yes, thank you, I got it from the description. |
| 14:26 | devn | gotcha. just trying to help! :) |
| 14:26 | hyPiRion | Hm, is cl format turing complete? |
| 14:26 | devn | uh oh |
| 14:26 | devn | a new swearjure approaches |
| 14:27 | devn | hyPiRion: by my googling "full CL format is Turing-complete" |
| 14:27 | devn | I don't know how close clojure's port comes |
| 14:28 | hyPiRion | yeah, the cl one can call functions, not possible yet in the clojure.pprint one |
| 14:28 | chchjesus | \ |
| 14:28 | devn | hyPiRion: btw, i still need to jump into that nasty format string for clojure's pprint-code bug with #() |
| 14:28 | devn | hyPiRion: pprint needs a rewrite |
| 14:29 | devn | it's a mess |
| 14:29 | hyPiRion | haha |
| 14:30 | devn | hyPiRion: you laugh, but im not kidding, you've been in there and seen it |
| 14:30 | hyPiRion | I should send them an email re: my patch |
| 14:30 | hyPiRion | devn: yeah =/ |
| 14:30 | devn | i was looking at the git blame |
| 14:30 | devn | and tom faulhaber is basically the only guy to ever have touched it |
| 14:30 | devn | and i think for good reason |
| 14:31 | devn | so... now that I've said that, it's time to put my money where my mouth is and start refactoring it into something that resembles clojure 1.5 code |
| 14:31 | devn | hyPiRion: did you ever submit a patch on that #() bug? |
| 14:32 | hyPiRion | no, because I am not sure what would be correct to do right there |
| 14:32 | hyPiRion | but it's not too hard to implement it |
| 14:32 | hyPiRion | just need some response |
| 14:33 | devn | ah, ill bump it then |
| 14:33 | devn | do you have a link handy? |
| 14:34 | hyPiRion | uh, no |
| 14:34 | devn | lol ill find it |
| 14:34 | hyPiRion | (I'm making dinner, so I'm a bit busy) |
| 14:35 | devn | hyPiRion: make extra, im coming over |
| 14:36 | devn | hyPiRion: in common lisp i wonder what the behavior of this particular issue with fn* would be |
| 14:36 | devn | http://dev.clojure.org/jira/browse/CLJ-1181 |
| 14:36 | devn | not that it is exactly 1 to 1 equivalent with clojure |
| 14:37 | devn | but surely there's a similar situation |
| 14:42 | NeedMoreDesu | Is there a way to add metadata to any object, like adding it to numbers and still use them as numbers? |
| 14:45 | dnolen | NeedMoreDesu: not possible in Clojure, you can do this in ClojureScript via specify. |
| 14:55 | NeedMoreDesu | Hm, I guess I need to use WeakHashMap to store meta myself |
| 15:07 | stuartsierra | ,(identical? (Long. 2) (Long. 2)) |
| 15:07 | clojurebot | false |
| 15:21 | gfredericks | I was just asking the other day about the implications of using proxy to get a Number that has metadata |
| 15:21 | gfredericks | nobody responded I don't think :) |
| 15:24 | gfredericks | ,(let [two (proxy [java.lang.Number] [] (longValue [] 2))] (+ two two)) |
| 15:24 | clojurebot | 4 |
| 15:25 | stuartsierra | (identical? (.longValue 3) (.longValue 3)) |
| 15:26 | stuartsierra | ,(identical? (.longValue 3) (.longValue 3)) |
| 15:26 | clojurebot | false |
| 15:27 | gfredericks | ,(let [two-foo (proxy [java.lang.Number clojure.lang.IMeta] [] (longValue [] 2) (meta [] {:foo :foo}))] [(+ two-foo two-foo) (meta two-foo)]) |
| 15:27 | clojurebot | [4 {:foo :foo}] |
| 15:41 | cark | hello |
| 15:43 | gfredericks | hello |
| 15:43 | cark | I'm not clear about some details of core.async on the jvm |
| 15:44 | gfredericks | which details are those. |
| 15:44 | cark | for instance, if i make IO and it blocks for some time, is it correct to use a thread block instead of a go block ? |
| 15:45 | cark | thread macro instead of go macro i should maybe say |
| 15:45 | devn | cark: thread is basically promises and futures under the covers |
| 15:46 | cark | right, but are they there for this kind of scenario, just like send-off and send for agents ? |
| 15:47 | cark | also, if i use the go macro, and there are many "automatons" doing computationally intensive stuff, am i safe to assume that there will be cores+2 threads when using the go macro ? |
| 15:48 | devn | cark: check out this https://www.youtube.com/watch?v=enwIIGzhahw |
| 15:49 | devn | it will give you what you're looking for |
| 15:49 | cark | ok doing this right now, thanks ! |
| 16:01 | pandeiro | is it possible to chmod +x files via lein new templates? |
| 16:01 | gfredericks | I think C-u C-u C-x C-e should eval the form, expect a string returned, then insert the raw string into the buffer unescaped |
| 16:01 | gfredericks | would be nice for doing formatted stuff |
| 16:04 | noonian | pandeiro: you can use clojure.java.shell |
| 16:04 | pandeiro | noonian: within the render function? |
| 16:05 | noonian | yeah, your main templates fn, after you call ->files |
| 16:05 | pandeiro | noonian: perfect, thanks |
| 16:06 | technomancy | you don't need to shell out to do +x |
| 16:06 | pandeiro | technomancy: use java file api? |
| 16:06 | technomancy | right |
| 16:06 | pandeiro | k, i just wasn't clear at what point i could do it, thanks |
| 16:07 | technomancy | the main thing to remember about Leiningen plugins/templates: "It's Just A Function" =) |
| 16:08 | gfredericks | (TM) |
| 16:08 | technomancy | unless it's a map |
| 16:08 | pandeiro | ah the fine print... |
| 16:08 | pandeiro | :) |
| 16:08 | technomancy | offer not valid in all jurisdictions; consult a physician before use if you are pregnant or on medication |
| 16:17 | gfredericks | side-effects may include, creating a jarfile, erasing your classfiles, or delpoying to clojars. |
| 16:20 | pandeiro | so i was expecting the path (.setExecutable (io/file path) true) to be the same as specified in the ->files fn above it... but that method call is returning false |
| 16:20 | pandeiro | am i doing something wrong? |
| 16:24 | pandeiro | think i maybe have to include the project name in the path as it is relative to the parent directory |
| 16:25 | pandeiro | voila |
| 16:32 | rukor | what happened to webfui |
| 16:34 | jonasen | rukor: https://groups.google.com/d/msg/reactjs/e3bYersyd64/qODfcuBR9LwJ |
| 16:40 | rukor | jonasen: ah ok. i just stumbled upon a video on webfui on youtube, and it seemed to have a lot in common with reactjs/om. Thanks. |
| 16:42 | dnolen | rukor: Om is more a less a more "serious" version of the WebFUI concept. |
| 16:43 | rukor | dnolen: indeed. |
| 16:43 | tim__ | Bronsa: do the latest tools.analyzer snapshots work? |
| 16:44 | tbaldridge | Bronsa: I'm getting "could not locate clojure/tools/analyzer__init.class" from my repl. |
| 16:45 | Bronsa | tbaldridge: they work, yes |
| 16:45 | Bronsa | tbaldridge: weird, how are you getting that error? |
| 16:46 | tbaldridge | I'm getting that error because I'm an idiot. I never saved my project.clj file |
| 16:47 | kzar | I did (source let) and it seems to be defined in terms of let* but I can't find let* |
| 16:47 | tbaldridge | I think my vacation was too long this year. |
| 16:47 | llasram | kzar: It's part of the compiler itself, in Compiler.java |
| 16:47 | llasram | A "special form" |
| 16:47 | kzar | ah right, so that's not written in Clojure |
| 16:48 | llasram | Not yet -- Bronsa is hard at work on Clojure-in-Clojure though :-) |
| 16:48 | kzar | (Just in the book I was reading it said how let could be implemented in terms of a lambda so I was curious if that was how Clojure did it.) |
| 16:48 | kzar | Hmm I wonder how many non-clojure functions you could get it down to |
| 16:48 | tbaldridge | kzar: it can be done that way, that's not to say that it "should" |
| 16:49 | kzar | surely |
| 16:49 | tbaldridge | kzar: implementing let via fn would most likely be slower than a custom let that just sets a local |
| 16:49 | kzar | Yea and also it might be more limited, say how you can define vars in terms of themselves with Clojure's let |
| 16:49 | kzar | sorry I mean in terms of previous vars in the let |
| 16:51 | hiredman | tbaldridge: it would be more complicated you would compile to lambdas, then when compiling lambdas have some heuristics about turning them in to jvm locals, etc, which actually a lot of papers on optimizing scheme compilers do similar things |
| 16:52 | hiredman | which is a lot of work when you can just make let a special form |
| 16:53 | tbaldridge | agreed |
| 16:54 | marcopolo` | I remember hearing work being done on a browser repl using websockets, anyone know where I can find that? |
| 17:03 | arcatan | kzar: using previous vars is not a problem as you can transform that to nested let expressions |
| 17:03 | koreth | Hi! I'm a Clojure n00b. I am slightly confused by the "commute" function. The documentation implies it doesn't do retries (and the book "Clojure Programming" says so outright), but when I play with it in the REPL it does seem to retry occasionally. Is that expected behavior? |
| 17:03 | kzar | Yea I was just thinking that arcatan |
| 17:04 | juanpablo | Clojure noob here. How do I get the first element from a list of the form (1 2 3). What function can I use? (get list 0) fails, same with (first list). Seems like a dumb question, but my googling has failed me. |
| 17:04 | cark | ,(first '(1 2 3)) |
| 17:04 | clojurebot | 1 |
| 17:04 | cark | you probably didn't quote your list |
| 17:05 | kzar | ,(first [1 2 3]) |
| 17:05 | clojurebot | 1 |
| 17:05 | cark | (1 2 3) is applying 2 and 3 to the function 1, which does not exist |
| 17:05 | technomancy | koreth: ref operations can always retry; not sure where the implications otherwise are coming from |
| 17:06 | juanpablo | what if my list is not known at compile time? Adding the quote just gets me a compile error |
| 17:06 | juanpablo | Don't know how to create ISeq from: clojure.lang.Symbol |
| 17:07 | cark | ,(let [l '(1 2 3)] (first l)) |
| 17:07 | clojurebot | 1 |
| 17:07 | cark | maybe you should post your function in a gist |
| 17:09 | juanpablo | It's pretty simple. I have a list of the form ((10 11) (5 2) (3 2)) and want to filter that list using the first element of each list member |
| 17:09 | marcopolo` | koreth: can you give an example? |
| 17:09 | koreth | technomancy: Thanks. I think I just misinterpreted what I was reading -- the "you must accept last-one-in-wins behavior" in the docs on clojuredocs.org implied to me that conflicting writes would just be discarded. |
| 17:09 | cark | juanpablo: you obliviously have a little mistake somewhere, showing your coe would help |
| 17:09 | cark | code* |
| 17:10 | technomancy | koreth: oh dear |
| 17:10 | technomancy | koreth: fwiw clojuredocs.org are not official docs; that is a very misleading way of putting it |
| 17:11 | technomancy | commute just means the order can change; there's no implication that anything "loses" necessarily |
| 17:11 | juanpablo | I'll try to figure it out myself. Clojure is a fun language :). If I fail I'll post back |
| 17:12 | hiredman | ~alter |
| 17:12 | clojurebot | alter is always correct |
| 17:12 | koreth | And my confusion started in "Clojure Programming" which says, "A change made to a ref by using commute will *never* cause a conflict, and therefore never cause a transaction to retry." But apparently that just means the *entire* transaction won't retry, not that *nothing* in the transaction will retry. So yeah, my misinterpretation. |
| 17:12 | rukor | dnolen: I have a question regarding Om. Lets say I have a table component. Now I want to create calendar component that uses the table c\ |
| 17:12 | rukor | omponent. No client of the calendar component will ever need to directly provide the table parameters so the data for the underlying tab\ |
| 17:12 | rukor | le would not be present in the root tree as it is local to the calendar component. Previously, I could knock up the data structure from \ |
| 17:12 | rukor | within the calendar component and call om/build with it. Now that om/build requires a cursor, what is the best way to handle this sort o\ |
| 17:12 | rukor | f situation? |
| 17:13 | hiredman | use alter and commute is an optimization you can take advantage of in the future if required/possible |
| 17:13 | dnolen | rukor: if it's local to the component then doesn't om/IInitState, om/set-state! om/get-state not work for you? |
| 17:13 | koreth | hiredman: Totally. Just want to make sure I understand what it's doing so I can use it correctly when the time comes. |
| 17:14 | dnolen | rukor: or is the issue that you want to build and don't want to take a cursor? I was going to allow this today. |
| 17:14 | dnolen | rukor: via an option I think. |
| 17:15 | technomancy | koreth: yeah I thought that commute transactions would never have retries, but I realized that might not always be true |
| 17:15 | rukor | dnolen: for things local to the component, yes those will suffice, but need to use this data as the model for another component |
| 17:15 | koreth | technomancy: That "you must accept last-one-in-wins behavior" is actually in the official docs too. |
| 17:16 | koreth | Or at least I assume http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/commute is official. |
| 17:16 | technomancy | huh, that's unfortunate |
| 17:16 | rukor | dnolen: to elaborate, it may just be bad design on my part. the table takes as opts, the column specs, and as data, the actual data |
| 17:17 | rukor | dnolen: the calendar only takes as data date. |
| 17:17 | dnolen | rukor: hm, I think it's legitimate use case |
| 17:17 | technomancy | the whole point of commute is that it's safe to use when a conflict doesn't result in one attempt "winning" and one "losing" but both harmoniously succeeding |
| 17:17 | rukor | dnolen: so the calendar must build both the cursor for the embeded table component |
| 17:18 | rukor | dnolen: without depending on the tree above it |
| 17:18 | dnolen | rukor: just to be extra clear, you want to be able to pass raw data to build right? |
| 17:18 | juanpablo | Only thing I'm missing is pattern matching to unpack data structures. |
| 17:18 | rukor | yes |
| 17:18 | dnolen | juanpablo: core.match |
| 17:20 | rukor | dnolen: or would detached trees be a possible solution? where the calendar component can create its own root cursor, which it can update when there is an update in the cursor of its own date data, so that the underlying table component would be agnostic of pure data vs cursor |
| 17:21 | dnolen | rukor: hrm, I don't want to overthink it, and the details might change in the future |
| 17:21 | dnolen | rukor: I think the best thing for now is to provide build-raw for this use case. |
| 17:21 | rukor | dnolen: ok |
| 17:21 | clojurebot | No entiendo |
| 17:26 | sritchie | any graph database users here? |
| 17:26 | sritchie | neo4j, etc? |
| 17:29 | kzar | Is SICP worth reading for someone without a maths background? People seem to praise it so I'm giving it a go but the first chapter so far seems to be more about maths than code |
| 17:29 | sritchie | kzar: I don't have a maths background and thought it was great - |
| 17:30 | sritchie | kzar: it's more that the examples are algorithmish |
| 17:30 | kzar | Yea |
| 17:30 | kzar | Hmm I'll stick with it for a bit longer I guess |
| 17:31 | sritchie | kzar: just trying to have fun and get your mind expanded about functional programming? |
| 17:31 | sritchie | I always recommend working through the little schemer, |
| 17:32 | sritchie | but no one seems to get through the whole thing |
| 17:32 | sritchie | (I did, but I did it with pen and paper, didn't have a computer for a few weeks. I think that was the right way) |
| 17:33 | kzar | Yea, thought it might help as I've done some Clojure before but never fully grokked it all. I figured perhaps reading it might help. Aim for this year is to get to the point where I'm half productive in Clojure, not sure the best way to go about it though |
| 17:33 | kzar | I'm a programmer by trade and I'm generally not bad but I find it hard to get anything done in Clojure if I'm honest which is a shame as I think it's pretty great |
| 17:35 | akhudek | kzar: many people seem to recommend http://clojurekoans.com/ |
| 17:36 | kzar | akhudek: Thanks, well I'll give those a go sometime. |
| 17:36 | sritchie | kzar: what kinds of stuff are you building with clj? |
| 17:36 | sritchie | kzar: yeah, just for getting started in clj, sicp is too heavy |
| 17:36 | kzar | Well currently nothing |
| 17:37 | kzar | (I think taking on another project in it might be a good idea.) |
| 17:39 | sritchie | kzar: yeah, pick up compojure and try a tiny webapp |
| 17:39 | kzar | I've done some webapps a while back using noir and stuff although apparently that's not used anymore |
| 17:40 | ordnungswidrig | kzar: there's libnoir now, IMHO |
| 17:40 | ered | anyone tried liberator? tempted to give it a go next time i write a rest api |
| 17:40 | sritchie | ered: yeah, I have |
| 17:40 | sritchie | yeah, it's nice |
| 17:41 | ered | i really like what i've read about it |
| 17:41 | ered | and that flowchart that tells you exactly what it does when looks really helpful oto |
| 17:41 | ered | too* |
| 17:42 | technomancy | liberator is great, but I'd recommend starting with more basic ring and pulling it in once your requirements grow |
| 17:43 | technomancy | the raw ring abstraction is really great and worth getting familiar with |
| 17:44 | technomancy | I guess if you've used noir that might count |
| 17:44 | technomancy | but it obscures the simplicity of ring |
| 17:44 | ordnungswidrig | the simplicity of ring is great. unfortunately http is anything but simple. |
| 17:45 | kzar | technomancy: Yea I remember a lot of people (you maybe!) said that at the time, I think using noir was probably a mistake |
| 17:46 | technomancy | ordnungswidrig: real-world http, yes. learning-project http... maybe so, maybe no =) |
| 17:46 | ordnungswidrig | technomancy: that's a point! |
| 17:48 | technomancy | seeing the progression of a project from raw ring to using liberator could give you an interesting perspective and probably help you appreciate what you get |
| 17:49 | ordnungswidrig | My presentation at the conj used this approach. |
| 17:49 | technomancy | yeah, I enjoyed that a lot |
| 17:50 | dnolen | rukor: added experimental build-raw to master - will think about this more later and see if I can't see a better solution. |
| 17:51 | ordnungswidrig | technomancy: this should be mandatory for any library talk :) Hopefully shows the motivation^h^h^h^hright for existence |
| 17:55 | ordnungswidrig1 | re |
| 17:55 | rukor | dnolen: thanks |
| 18:02 | sritchie | hmm, google searches are making a heavy case for datomic instead of neo4j for graph modeling |
| 18:02 | sritchie | interesting |
| 18:02 | tbaldridge | it's really good for that sort of thing |
| 18:13 | sritchie | tbaldridge: looks like it. I'm looking at storing GPS coordinates |
| 18:13 | sritchie | similar to strava - essentially dumping in a bunch of points of sensor data, |
| 18:14 | sritchie | so i can graph the info, and try to extract "pieces" - if someone's doing mile time trials, for example |
| 18:17 | kzar | ,#{#{true false} #{true false}} |
| 18:17 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Duplicate key: #{true false}> |
| 18:17 | sritchie | yup, not in a literal |
| 18:17 | kzar | ,#{#{(= "true") false} #{(symbol "true") 'false}} |
| 18:17 | clojurebot | #{#{true false} #{true false}} |
| 18:17 | S11001001 | ,(random) |
| 18:17 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: random in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 18:17 | S11001001 | ii eee |
| 18:17 | CaptainLex | Why does ring.middleware wrap-multipart-params turn keys into strings instead of keywords? |
| 18:18 | kzar | ,(rand) |
| 18:18 | clojurebot | 0.7820192852765594 |
| 18:23 | devn | is reduce-kv just a performance thing? |
| 18:23 | clojurebot | Gabh mo leithscéal? |
| 18:31 | thirdy | Functions like my-addition are usually created first in the REPL , and then tested with various inputs. Once you’re satisfied that the function works, you copy the test cases into an appropriate test file. You also copy the function definition into an appropri- ate source file and run the tests. |
| 18:31 | thirdy | as in copy paste? |
| 18:38 | noonian | thirdy: I prefer to just write them in a namespaced file, and keey running (use 'my.namespace :reload) in the repl |
| 18:40 | thirdy | ,(doc use) |
| 18:40 | clojurebot | "([& args]); Like 'require, but also refers to each lib's namespace using clojure.core/refer. Use :use in the ns macro in preference to calling this directly. 'use accepts additional options in libspecs: :exclude, :only, :rename. The arguments and semantics for :exclude, :only, and :rename are the same as those documented for clojure.core/refer." |
| 18:40 | turtil | could someone comment on clojure and how low level it is? im learning Clojure, but i havnt really seen much about its low level-ness... i understand it hinges itself off the jvm, and therefore java, but im not a java developer, never really developed anything in java |
| 18:40 | turtil | comments, opinions? |
| 18:41 | noonian | it's very high level |
| 18:42 | noonian | you can use type hints and transients and things to get closer to raw java but it isn't as idiomatic to do so usually |
| 18:43 | thirdy | noonian: coming from java-world, ain't F11 (debug in eclipse), faster than what you mentioned? |
| 18:43 | andyf | turtil: It is a high level language, and while you can do some medium-level things for performance, the best way to get closer to the machine details for performance is to write Java or C and call that from Clojure, if you need it. |
| 18:45 | noonian | thirdy: maybe, i'm not very familiar with eclipse but that works for me. i also use light tables instarepl but lein repl is simpler to get started with |
| 18:45 | thirdy | in Java, I even use an eclipse-plugin to automatically call the corresponding test class upon saving your source code. |
| 18:45 | tbaldridge | thirdy: I have that in emacs ALT-` runs all tests |
| 18:45 | noonian | i think there are a few eclipse plugins for Clojure |
| 18:47 | turtil | noonian: andyf thanks for that, that confirms my thoughts |
| 18:48 | akhudek | vw |
| 18:48 | akhudek | oops |
| 18:49 | andyf | turtil: The Benchmarks Game web site has some sample short Clojure programs for the benchmarks that are often within a factor of 1 to 4 times the run time of Java programs for the same problems, but those Clojure programs are not like ones people typically write in Clojure. Then again, the programs on that site are not typically what anyone would write in any of the languages represented. |
| 18:49 | andyf | http://benchmarksgame.alioth.debian.org/ |
| 18:50 | devn | tbaldridge: just finished watching your deep macros and go macro internals videos |
| 18:50 | devn | nice work |
| 18:50 | tbaldridge | thanks! |
| 18:51 | devn | tbaldridge: it's funny, i've used the multimethod dispatch thing to build little JRuby interop toys, but i never emitted an AST-like thing |
| 18:51 | devn | that was an ah-ha moment |
| 18:51 | devn | tbaldridge: also, the core.async talk at the conj was fantastic |
| 18:52 | turtil | andyf: yeah i have been looking at that, i wasnt so much concerned with Performance, more like doing things with network bytestreams, and playing with the GPIO on Pi, or Pi, similar boards etc |
| 18:53 | devn | tbaldridge: there has been some discussion on the overtone mailing list about using core.async -- it made me wonder about broadcast and multiplex in the core.async lab namespace. any idea on whether those things will creep into core.async or not? |
| 18:54 | tbaldridge | those have been replaced with mult/mix in the main namespace |
| 18:54 | devn | tbaldridge: sam aaron asked about one->many pub/sub capabilities |
| 18:55 | devn | tbaldridge: ah, that would be helpful to know as someone peeking at source. they have subtley different docstrings |
| 18:55 | tbaldridge | also in the main namespace now |
| 18:55 | devn | subtly* |
| 18:56 | tbaldridge | which ones have different docstrings? |
| 18:57 | thirdy | learning lisp or clojure is a lot harder than a thought. it's like learning programming all over again. even though I'm already using functors in Java |
| 18:58 | thirdy | functors in Java as in org.apache.commons.collections.Closure |
| 19:00 | devn | tbaldridge: the lab namespace's broadcast and multiplex are subtly different than mult and mix |
| 19:00 | devn | the broadcast docstring read, to me, more like what i was thinking of at the time |
| 19:00 | tbaldridge | yeah, the lab versions are pretty old, they were created to see what something like that would look like. Rich wrote the stuff in then main ns later on |
| 19:01 | devn | could lab's versions be blown away to prevent future confusion along those lines> |
| 19:01 | tbaldridge | yeah, they should be remove |
| 19:01 | tbaldridge | *removed |
| 19:02 | thirdy | any good online class for Clojure, like from Coursera? |
| 19:02 | logic_prog_ | (1) sign up for the scala one |
| 19:02 | logic_prog_ | (2) get motivated to study clojure |
| 19:03 | devn | tbaldridge: in any event, one more compliment and then i'm off, but: i think you've done a really great job with conj talk about using core.async. it would be cool to see the way you explained it moved into a mini guide or something. |
| 19:03 | devn | logic_prog_: ha! |
| 19:04 | logic_prog_ | tbaldridge: along what devn said, I liked your youtube videos on core.async |
| 19:04 | devn | tbaldridge: i should have been more clear, one more compliment/request/suggestion ;) |
| 19:05 | devn | a lot of what i've seen with core.async was like: 'look how great this is! it's wildly opaque!' simply knowing that promise/future was underneath (thread) was extremely important to my ability to understand what was happening |
| 19:07 | devn | describing it in terms of things i understand != "read CSP by Tony Hoare" |
| 19:07 | thirdy | logic_prog_: I did search for a free online class, but none so far |
| 19:08 | devn | thirdy: there has been talk in the past about a clojure coursera course |
| 19:08 | thirdy | yep, i saw that in the google group |
| 19:08 | devn | thirdy: do you strongly value the structure of a course? |
| 19:08 | thirdy | I did watch this last night: www.youtube.com/watch?v=CvRGJGK09tc |
| 19:09 | thirdy | devn: I think so |
| 19:09 | devn | courses are funny things, you know. there rarely exists a one size fits all version of the material that appeals to everyone |
| 19:09 | devn | a lot of people with previous background come to clojure with very specific goals |
| 19:09 | devn | so you start explaining how lisp works and half the audience yawns |
| 19:10 | devn | you start talking concurrency and half the audience already understands a bunch of that material |
| 19:10 | devn | etc |
| 19:12 | thirdy | devn: haha i agree. however, a good basics course should be there |
| 19:13 | ordnungswidrig1 | just a quicky: how do I enumerate all paths in a deep datastructure, i.e. everthing I can access with get-in |
| 19:13 | thirdy | the video I watch last night explained all the syntax of clojure. however, right now, i'm having trouble with namespaces |
| 19:14 | ordnungswidrig1 | e.g. {:a 1 :b [:x] :c {:y :z}} => [[:a] [:b] [:b 0] [:c] [:c :y]] |
| 19:14 | shoky | thirdy: http://www.infoq.com/presentations/Clojure-Namespaces-Vars-Symbols |
| 19:14 | thirdy | devn: imho, apparently, the guy in the video was wrong to say that, "You're ready to write code". Apparently, theres a swarm of functions/macros/special forms to master |
| 19:16 | thirdy | I'm correct to say that Clojure syntax is the tip of the iceburg? mastering def, defn, let, ns is the bulk? |
| 19:17 | ordnungswidrig1 | thirdy: it's actually a very thin tip. like most lisps the syntax is small in clojure |
| 19:17 | ordnungswidrig1 | thirdy: but don't get afraid |
| 19:17 | thirdy | ordnungswidrig1: i was gonna type tip of the tip of the iceburg |
| 19:18 | thirdy | shoky: thanks, that should be a good watch, as all the other infoq i've watched previously |
| 19:18 | ordnungswidrig1 | thirdy: that would be too extreme. And keep in mind: it's a beautiful iceburg! |
| 19:20 | thirdy | ordnungswidrig1: yeah thanks. I'm just frustrated to find out that I can't write the Swing-based tool I want as easy as I thought it would be |
| 19:26 | hiredman | isn't swing just going to be gross regardless? |
| 19:35 | noonian | how can i compare cursors for equality in om? |
| 19:36 | dnolen | noonian: should just work |
| 19:37 | noonian | hmm |
| 19:37 | dnolen | noonian: for maps and IIndexed anyway. |
| 19:38 | dnolen | noonian: what types are you trying to compare? |
| 19:38 | noonian | maps |
| 19:39 | sritchie | anyone here using the hidden input for DELETE reqs in compojure? |
| 19:39 | dnolen | noonian: not for cursors equivalence includes state and path |
| 19:39 | dnolen | s/not/note |
| 19:40 | noonian | hmm, i bet the path is different |
| 19:41 | dnolen | noonian: perhaps it make sense to love state and path out of it like when cursors were done via metadata |
| 19:41 | dnolen | s/love/leave |
| 19:42 | noonian | yeah, i'm just trying to compare pieces of them for value equality |
| 19:48 | dnolen | noonian: -value is technically part of the public api |
| 19:48 | dnolen | noonian: so you can extract the underlying value and compare those |
| 19:49 | noonian | dnolen: thanks, that works great |
| 22:08 | m0g | I have a very basic script that loads a bunch of files and put them in a map. My function extract-content-map seems except for the fact that it only handles 8 items in the list of files it is given (that is around 1k files). Any idea why it doesn't process the whole list? |
| 22:08 | m0g | https://gist.github.com/m09/8263780 |
| 22:19 | gfredericks | m0g: nope. but I do know you don't need to use transients |
| 22:19 | rovar_ | is there a right way to inject variables into an environment when executing a function? |
| 22:19 | rovar_ | I want to provide the function creator some "implicits" which change based on the context of when the function was executed.. |
| 22:20 | llasram | gfredericks, m0g: Also, you are trying to bash transients in place, which leads to the results you are seeing |
| 22:20 | llasram | m0g: You still need to operate on them functionally -- they just may use mutation as an optimization, so they aren't fully persistent |
| 22:20 | gfredericks | llasram: oh? does a transient update function not always return the original object? |
| 22:20 | llasram | gfredericks: It does not |
| 22:21 | gfredericks | llasram: fascinating |
| 22:21 | llasram | So e.g. (doseq ... (assoc! ...)) is always a mistake |
| 22:21 | gfredericks | I'm curious why it would be useful not to |
| 22:23 | llasram | gfredericks: I don't know, but my guess is that it's related to the interface guarantee that the `transient` function will operate in constant time |
| 22:23 | gfredericks | o_O |
| 22:23 | gfredericks | okay time to crack open the java files |
| 22:25 | gfredericks | bbloom: ha I just noticed the conj edge case is duplicated in the transient variants; as it must be of corse |
| 22:27 | gfredericks | llasram: oh I think there's no reason for that to happen except when upgrading from ArrayMap to HashMap |
| 22:27 | gfredericks | thus the magic number 8 |
| 22:27 | bbloom | gfredericks: you mean the conj a seq from a map thing? yeah, annoying |
| 22:27 | bbloom | i think at this point, that's forever :-/ |
| 22:27 | llasram | gfredericks: That makes sense, although I feel like I saw a case where it was happening with ! and transient vectors in someone's code too |
| 22:27 | llasram | s,!,conj!, |
| 22:31 | gfredericks | is the obsceletization of programmers synonymous with the singularity? |
| 22:32 | llasram | I personally sure hope so |
| 22:33 | rovar_ | the language preferred by the AI would most certainly be a lisp |
| 22:33 | gfredericks | llasram: why the strong feelings? |
| 22:34 | llasram | gfredericks: Oh, a friend just recently had me read Vonnegut's /Player Piano/, and the it ended up mostly annoying me |
| 22:35 | llasram | The premise essentially involves people automating themselves out of their jobs, and the subsequent social results |
| 22:35 | llasram | But I think it's pretty much impossible to automate away the job of automating things w/o hitting the singularity |
| 22:36 | gfredericks | yay we are forever employed until such time as we cannot plan for anyhow |
| 22:37 | gfredericks | so it annoyed you because you expect that most people can stay employed as programmers? |
| 22:37 | gfredericks | rather than massive unemployment? |
| 22:42 | llasram | haha. Kind of. It presented the vast majority of people with nothing to do and hence doing nothing, to a degree I found almost offensively dismissive of the ingenuity of the average person |
| 22:43 | npatten | .join #emacs |
| 22:43 | npatten | whoops! |
| 22:43 | gfredericks | npatten: what a weird password |
| 22:43 | llasram | Joining another channel! |
| 22:43 | llasram | ~guards |
| 22:43 | clojurebot | SEIZE HIM! |
| 22:44 | npatten | at least emacs enables clojure =) |
| 22:44 | gfredericks | clojure: powered by emacs |
| 22:45 | seangrove | Not for much longer, LT is steamrolling in |
| 22:45 | seangrove | You watch! |
| 22:45 | seangrove | Just give it another ~20-25 years. |
| 22:45 | gfredericks | in the singularity all the AIs use LT |
| 22:46 | tbaldridge | if LT ever figures out what it wants to be |
| 22:46 | npatten | good things come to those who wait? |
| 22:46 | llasram | pfft. Emacs is clearly a better interface for machine intelligences |
| 22:46 | llasram | Especially with their ability to select key combinations unhindered by the limitations of physical hands |
| 22:46 | gfredericks | I watched some of rhickey's harmonikit talk; he made a sex joke about emacs |
| 22:47 | seangrove | gfredericks: Is it online yet? |
| 22:47 | gfredericks | I guess that's what happens when you let him not keynote |
| 22:47 | npatten | m-x foreplay |
| 22:47 | gfredericks | seangrove: yeah it's on youtube somewhere |
| 22:47 | tbaldridge | youtube.com/clojuretv |
| 22:47 | seangrove | Ah, see it now, thanks |
| 23:02 | bellkev | has anyone noticed austin's browser-connected-repl being broken in newer versions of clojurescript? |
| 23:02 | bellkev | I noticed that it works in v1847 and not in v2138 |
| 23:03 | bellkev | so far, I've tracked it down to an error being thrown in cljs.closure/get-compiled-cljs in the new version but not the old... |
| 23:04 | gfredericks | if a polymorphic dispatch is closed, should a case be faster than a protocol? |
| 23:04 | gfredericks | (case on the class, I mean) |
| 23:04 | gfredericks | or maybe a condp with instance? |
| 23:04 | tbaldridge | gfredericks: condp probably not, it has to run p for every value |
| 23:04 | tbaldridge | protocols have some tricks to make them fast in places where you're always dispatching on the interface |
| 23:05 | gfredericks | the interface is irrelevant here |
| 23:05 | gfredericks | all via extend-protocol |
| 23:05 | gfredericks | shoulda said that initially |
| 23:06 | tbaldridge | in that case there is still some caching involved. |
| 23:06 | gfredericks | so stick with the protocols? |
| 23:06 | tbaldridge | Use protocols unless you can reduce it to case |
| 23:06 | gfredericks | what would the case type be? |
| 23:06 | gfredericks | a string? |
| 23:06 | gfredericks | (comp str class)? |
| 23:07 | tbaldridge | (case x val1 expr val2 expr2 ...) |
| 23:07 | tbaldridge | only works for keywords, ints and something else.... |
| 23:07 | gfredericks | so probably not applicable here, right? |
| 23:07 | gfredericks | just making sure I'm not missing some trick |
| 23:08 | tbaldridge | yeah it depends on your use case I guess. |
| 23:08 | tbaldridge | Protocols are pretty darn fast |
| 23:10 | gfredericks | $findfn :foo/bar "foo/bar" |
| 23:10 | lazybot | [] |
| 23:11 | Bronsa | ,(str (.sym :foo/bar)) |
| 23:11 | clojurebot | "foo/bar" |
| 23:11 | gfredericks | ooh, clever |
| 23:13 | gfredericks | hmm |
| 23:13 | gfredericks | that involves a call to String#intern |
| 23:13 | gfredericks | oh I guess just once |
| 23:16 | unionx | hello? |
| 23:16 | clojurebot | BUENOS DING DONG DIDDLY DIOS, fRaUline unionx |
| 23:16 | Bronsa | lol |
| 23:17 | gfredericks | (inc clojurebot) |
| 23:17 | lazybot | ⇒ 32 |
| 23:17 | unionx | (inc clojurebot) |
| 23:17 | lazybot | ⇒ 33 |
| 23:17 | unionx | (dec clojurebot) |
| 23:17 | lazybot | ⇒ 32 |
| 23:17 | unionx | lol |
| 23:18 | gfredericks | well that was worthwhile |
| 23:20 | Bronsa | tbaldridge: AFAIK case works with everything, ints & keywords should simply be faster |
| 23:21 | tbaldridge | , (case x (atom 42) true) |
| 23:21 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: x in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 23:21 | tbaldridge | , (case 4 (atom 42) true) |
| 23:21 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching clause: 4> |
| 23:21 | gfredericks | Bronsa: not classes though, I wouldn't expect |
| 23:21 | tbaldridge | , (case (atom 42) (atom 42) true) |
| 23:21 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching clause: clojure.lang.Atom@a6b3cd> |
| 23:21 | tbaldridge | yeah...so not refs...dumb example |
| 23:21 | gfredericks | ,(case '(atom 42) (atom 42) true) |
| 23:21 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching clause: (atom 42)> |
| 23:21 | Bronsa | tbaldridge: that's because the test don't get evaluated |
| 23:22 | tbaldridge | yeah |
| 23:22 | gfredericks | Bronsa: ^ still didn't work |
| 23:22 | tbaldridge | ,(case '(atom 42) '(atom 42) true) |
| 23:22 | clojurebot | true |
| 23:22 | gfredericks | wat |
| 23:22 | Bronsa | gfredericks: that's because.. ##(case 1 (1 2) true) |
| 23:22 | lazybot | ⇒ true |
| 23:22 | tbaldridge | case is really really odd, I try to only use it when working with ints or keywords |
| 23:22 | gfredericks | oh geez |
| 23:23 | gfredericks | ,(case '(atom 42) ((atom 42)) true) |
| 23:23 | clojurebot | true |
| 23:23 | Bronsa | so you're not actually quoting it, you're matching on 'quote and '(1 2) |
| 23:23 | gfredericks | ,(case 'quote '(atom 42) :hahaha) |
| 23:23 | clojurebot | :hahaha |
| 23:23 | gfredericks | that's a neat trick :) |
| 23:24 | Bronsa | gfredericks: it'd work on classes, if you can embed one there either via #=(Class/forname "..") or via a macro |
| 23:25 | gfredericks | ,(binding [*print-dup* true] (print-str *ns*)) |
| 23:25 | clojurebot | "#=(find-ns sandbox)" |
| 23:25 | gfredericks | ,(binding [*print-dup* true] (print-str Number)) |
| 23:25 | clojurebot | "#=java.lang.Number" |
| 23:26 | Bronsa | i.e (eval `(case Integer ~Integer 1)) will work |
| 23:26 | gfredericks | that would be an interesting benchmark |
| 23:28 | jergason | what is the standard clojure http library that everyone uses? |
| 23:28 | jergason | err http request library |
| 23:29 | gfredericks | clj-http |
| 23:29 | jergason | thanks friend |
| 23:30 | gfredericks | (inc me) |
| 23:30 | lazybot | ⇒ 3 |
| 23:33 | TEttinger | ,(print (double-array [0.0 1.1 2.2])) |
| 23:33 | clojurebot | #<double[] [D@10ef4d> |
| 23:33 | TEttinger | ,(binding [*print-dup* true] (print-str (double-array [0.0 1.1 2.2]))) |
| 23:33 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No method in multimethod 'print-dup' for dispatch value: class [D> |
| 23:34 | TEttinger | oh that's interesting |
| 23:34 | TEttinger | ,(defmethod print-dup (Class/forName "[D") [a out] (.write ^java.io.FileWriter out (str "#=" `(double-array ~(vec a))))) |
| 23:34 | clojurebot | #<MultiFn clojure.lang.MultiFn@f02ba0> |
| 23:34 | TEttinger | it doesn't seem to defmethod in a sandbox |
| 23:34 | TEttinger | ,(binding [*print-dup* true] (print-str (double-array [0.0 1.1 2.2]))) |
| 23:34 | clojurebot | "#=(clojure.core/double-array [0.0 1.1 2.2])" |
| 23:35 | TEttinger | oh, i just did it in privmsg... |
| 23:39 | bvvd | ,((fn [n] (cond (= n 0) 0 (= n 1) 1 :else (recur (+ (- n 1) (- n 2)))) 4) |
| 23:40 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 23:41 | bvvd | ,((fn [n] (cond (= n 0) 0 (= n 1) 1 :else (recur (+ (- n 1) (- n 2))))) 4) |
| 23:41 | clojurebot | #<ArithmeticException java.lang.ArithmeticException: integer overflow> |
| 23:41 | gfredericks | timeout |
| 23:41 | gfredericks | oh or that |
| 23:41 | gfredericks | timeout if you give it 4N :) |
| 23:43 | TEttinger | the (recur (+ (- n 1) (- n 2))) thing is pretty silly |
| 23:43 | TEttinger | since for 4 that recurs with 5, not going lower |
| 23:44 | gfredericks | unless the extremely strong goldbach conjecture holds |
| 23:46 | gfredericks | ,((fn [n] (case n (0 1) n (recur (+ (- n 1) (- n 2))))) 4N) |
| 23:46 | clojurebot | Execution Timed Out |
| 23:49 | bvvd | hmm... i realized i was adding the 2, w/ (recur (+ (- n 1) (- n 2))) once u pointed that out |
| 23:53 | gfredericks | ,(.nextProbablePrime (java.lang.BigInteger. "77777777777777777777")) |
| 23:53 | clojurebot | #<CompilerException java.lang.ClassNotFoundException: java.lang.BigInteger, compiling:(NO_SOURCE_PATH:0:0)> |
| 23:53 | gfredericks | ,(.nextProbablePrime (java.math.BigInteger. "77777777777777777777")) |
| 23:53 | clojurebot | 77777777777777777789 |
| 23:57 | bvvd | ,((fn fib [n] (cond (= n 0) 0 (= n 1) 1 :else (+ (fib (- n 1)) (fib (- n 2))))) 6) |
| 23:57 | clojurebot | 8 |
| 23:59 | bvvd | spent over an hour trying to get that to work, TEttinger observation 'for 4 that recurs with 5', made it obvious thanks! |