2012-02-04
| 00:09 | _phil | can i use a single quote as part of an identifier, i.e. (def a' 5)? |
| 00:10 | _phil | it seems to work but i dont know if there arent any implications, e.g. with macros |
| 00:10 | guns | _phil: there are clojure functions like +' and *' |
| 00:10 | _phil | guns: so no problem? |
| 00:11 | guns | _phil: I assume not. I use it all the time myself (nice mathy feel), but I'm pretty new to Clojure too |
| 00:12 | _phil | guns: haha, bad bad haskell :D |
| 00:13 | guns | silly to name iterations of a variable x, x1, x2 ... |
| 00:13 | jkkramer1 | trailing apostrophes are supported in clojure 1.3+. doesn't work in clojure 1.2 |
| 00:15 | _phil | jkkramer1: thx |
| 05:07 | tfaro | . |
| 05:11 | Raynes | , |
| 05:11 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 05:23 | AimHere | ,(Thread/sleep 1000000000000) |
| 05:24 | clojurebot | Execution Timed Out |
| 05:24 | AimHere | Heh |
| 05:50 | bkolobara | Hi I just started learning clojure and I'm relatively new to emacs. When I start the slime repl (M-x clojure-jack-in) I can't access the doc macro. I get a message "Unable to resolve symbol: doc in this contex" and a RuntimeException is thrown. When I use the Leiningen repl everything works. What am I doing wrong? |
| 06:04 | raek | bkolobara: 'doc' is not in clojure.core since Clojure 1.3. you need to run (use 'clojure.repl) in the repl. |
| 06:05 | raek | "lein repl" does that step automatically for the 'user' namespace |
| 06:44 | bkolobara | raek: tnx |
| 07:12 | cmajor7 | if 'defn' just a macro that is the "Same as (def name (fn [params* ] exprs*))", how come: |
| 07:13 | cmajor7 | " (def f-seq (map f (iterate inc 0))) " returns lazy results with caching |
| 07:13 | cmajor7 | and " (defn f-seq [] (map f (iterate inc 0))) " does not? |
| 07:14 | raek | the (def f-seq (map f ...)) example does not match the (def name (fn ...)) pattern... |
| 07:14 | raek | since (map ...) does not return a function |
| 07:15 | raek | each time the second f-seq function you defined is called a new lazy-seq is constructed |
| 07:15 | cmajor7 | raek: thank you. so why is def caches and defn does not in this case? |
| 07:16 | raek | (which is cached) |
| 07:16 | raek | cmajor7: the first and second example are not of the same types! |
| 07:16 | raek | the body of a (fn ...) expression is never cached |
| 07:16 | amro | cmajor7: your second example is missing a (fn ...) |
| 07:17 | amro | er, first |
| 07:17 | cmajor7 | amro: 'f' is a hypothetical (any function) |
| 07:17 | raek | as amro said, if you replace the first one with (def f-seq (fn [] (map f (iterate inc 0)))), _then_ they are equivalent |
| 07:18 | raek | then, both versions are _functions_, which create _new_ lazy-seqs when they are called |
| 07:19 | cmajor7 | right, and hence _not_ cached.. ? |
| 07:19 | raek | the particular lazy-seq that a function returns is cached |
| 07:19 | cmajor7 | "(doall (take 3 f-seq))", and then "(println (nth f-seq 2)) ; uses cached result -> 2.0" |
| 07:20 | raek | so if you traverse that particular lazy-seq multiple times, f will only be called once per element |
| 07:20 | raek | but each invocation of f-seq makes a new lazy-seq with its own caching |
| 07:21 | raek | cmajor7: yes, but in that example you use the same lazy-seq object in both cases |
| 07:21 | cmajor7 | right.. that is the caching I am referring to |
| 07:22 | raek | ok, then you have to keep a reference to the lazy-seq object you want to keep |
| 07:22 | cmajor7 | I thought that 'defn' is just a "(def name (fn [params* ] exprs*))" |
| 07:22 | raek | it is |
| 07:22 | cmajor7 | hence a confusion where I see def/defn resulting in different behavior |
| 07:23 | raek | but what it isn't is "(def name exprs*)" |
| 07:23 | raek | do you see the difference? |
| 07:23 | raek | (defn foo ...) = (def foo (fn ...)) is true, but you did not use that fact in your example at all |
| 07:24 | cmajor7 | are you saying that a "(map f (iterate inc 0))" part in "(defn f-seq [] (map f (iterate inc 0)))" becomes a function, where in "(def f-seq (map f (iterate inc 0)))" it just a lazy-seq bound to a name? |
| 07:24 | raek | no, that part is a lazy-seq in both cases |
| 07:25 | raek | but "f-seq" becomes a function in the first case and a lazy-seq in the second |
| 07:25 | raek | function that take zero arguments are not the same as the values in their bodies |
| 07:26 | raek | (defn x [] y) is the same as (def x (fn [] y)), that is, "x is bound to a nullary function that returns y" |
| 07:27 | cmajor7 | does "(defn f-seq [] (map f (iterate inc 0)))" wrap "(map f (iterate inc 0))" into a function? Is that why the binding result is different? |
| 07:27 | raek | (def x y) is not the same, and means "x is bound to y" |
| 07:27 | raek | cmajor7: yes, it does |
| 07:27 | cmajor7 | aha.. I think I see it now |
| 07:27 | cmajor7 | thank you! |
| 07:27 | raek | that's what (defn x [] y) --> (def x (fn [] y)) is all about! |
| 07:28 | cmajor7 | I was a bit confused by the "undercover" wrapping :) |
| 07:28 | cmajor7 | I see now it makes perfect sense: every time you call x, an underlying fn is reevaluated |
| 07:29 | cmajor7 | vs. just a binding where the reference points to a lazy-seq |
| 07:32 | raek | yes, the body of the function is evaluated each time the function is called |
| 07:33 | raek | (i.e. only the "y" part and not the whole "(fn [] y)" part) |
| 07:33 | cmajor7 | raek: right, thanks! |
| 07:38 | echo-area | Is there an "assoc for vector", that is, takes a vector, an index and a new value, returns a new vector with the value at the index is replaced with the new value? |
| 07:47 | echo-area | Hmm. `assoc' can operate on a vector. |
| 08:04 | AimHere | echo-area > if you're looking for an analogue for a function between collection types, then try the function you want the analogue of! |
| 08:26 | gfredericks | what're these three elisp files in my .emacs.d/swank directory? should I be versioning them or ignoring them? |
| 08:38 | the-kenny | gfredericks: I ignore them |
| 08:40 | gfredericks | the-kenny: okay, thanks |
| 08:41 | the-kenny | gfredericks: They're auto-generated when you run clojure-jack-in for the first time. I wouldn't delete them, as it takes some time to recompile them |
| 08:42 | gfredericks | noted |
| 08:44 | miniyuki | to extract the set of keys of a list of hash |
| 08:45 | miniyuki | it there a better way than (distinct (mapcat keys [{:prop1 "any"} {:prop2 "any"} {:prop1 "any" :prop3 "any"}])) |
| 08:46 | miniyuki | expected result (:prop1 :prop2 :prop3) |
| 08:48 | the-kenny | If you want a real set, use `set' instead of `distinct' |
| 08:48 | gfredericks | I'm trying to think if there are any performance issues with that... |
| 08:48 | gfredericks | probably laziness would make it okay |
| 08:50 | miniyuki | thanks |
| 09:12 | TimMc | gfredericks: This is a test of the code we were discussing: https://github.com/timmc/kpawebgen/blob/master/clj/test/kpawebgen/test/munge.clj#L40 |
| 09:12 | TimMc | gfredericks: And this is what implements it: https://github.com/timmc/kpawebgen/blob/master/clj/src/kpawebgen/munge.clj#L35 |
| 09:16 | gfredericks | man I need a better way to get links out of a terminal |
| 09:16 | gfredericks | TimMc: I've never seen an ASCII graph drawn in comments before |
| 09:25 | the-kenny | I'm pretty sure emacs has support for this :) |
| 09:25 | TimMc | gfredericks: It was the only way I could keep it straight in my head. |
| 09:38 | pyr | hey! anyone used cascalog with s3 before ? |
| 10:24 | dribnet | Hi. Can anyone help me understand gen-class, specifically why I'm not making the constructor I think I'm making? |
| 10:26 | the-kenny | dribnet: Don't ask to ask. |
| 10:27 | dribnet | I have a very short :gen-class. It has :constructors {[] [foo]} and then later (defn -construct [] [[(thing)] ]) |
| 10:28 | dribnet | Yet when I try to call (class.) later to construct with no args, i get "No matching ctor" |
| 10:29 | dribnet | obviously i have the wrong model of how this is supposed to work. |
| 10:30 | dribnet | I don't understand how the (classname.) could fail to resolve at compilation if i've declared both :constructors {[] []} and the -init [] methods. |
| 10:36 | dribnet | Basically my question is: what governs the type of constructor available in the class generated by gen-class? |
| 10:38 | dribnet | If I setup a no-arg constructor via :constructors {[] [whatnot]]} and then later implement (defn -init []) correctly, how is it even possible that the no-arg ctor can be missing at compile time? |
| 10:45 | dribnet | is there an easy way to make lein launch the repl in 1.3.0 by default? |
| 12:16 | dgrnbrg | if I'm writing something that uses (binding) to override a fn, but I want to invoke the previous binding in my new binding, how can I do that? |
| 12:24 | arohner | dgrnbrg: use a let to store the old version before binding the new one |
| 12:24 | clojurebot | Pardon? |
| 12:25 | arohner | (let [old-fn f] (binding [f new-fn] (f) (old-f))) |
| 12:30 | dgrnbrg | I did this: (let [old (bound-fn [args] (apply myfunc args))] (binding [myfunc old] (myfunc)) |
| 12:30 | dgrnbrg | arohner, and that caused a stack overflow |
| 12:31 | dgrnbrg | I don't see why I can't use bound-fn here |
| 12:33 | dgrnbrg | Is there a way to make a defn ^:dynamic? |
| 12:42 | arohner | dgrnbrg: why do you want to use bound-fn? bound-fn is for times when you want to preserve the bindings across threads, i.e. when you want the binding value to appear in another thread. it doesn't appear that's the case here. |
| 12:42 | dgrnbrg | I want to preserve the binding under a different binding |
| 12:42 | arohner | it's causing a stack overflow because you're calling the same fn recursively |
| 12:42 | dgrnbrg | It seems like the logic should work fine in both cases |
| 12:43 | dgrnbrg | I would expect the bound-fn to cause the recursive call to myfunc to use the old binding |
| 12:43 | dgrnbrg | since the bound-fn should save the binding from when I called it |
| 12:43 | arohner | it doesn't work like that |
| 12:43 | arohner | bindings are a thread-local stack. new calls to binding push values onto the stack |
| 12:43 | dgrnbrg | so bound-fn is just pushing onto the stack? |
| 12:43 | dgrnbrg | not replacing the stack? |
| 12:44 | arohner | let's talk about only binding for a second |
| 12:44 | arohner | binding pushes onto the stack |
| 12:44 | arohner | but bindings are only thread-local |
| 12:44 | arohner | so bound-fn is for situations where you want to take the binding stack, and use the same values in another thread |
| 12:44 | dgrnbrg | exactly |
| 12:44 | arohner | are you using another thread here? |
| 12:45 | dgrnbrg | I'd expect it to work by saving the stack at the time bound-fn is called |
| 12:45 | arohner | the standard, idiomatic answer here is to use a let to save the value you care about |
| 12:45 | dgrnbrg | and then when I invoke the bound-fn's result, i'd expect it to swap the binding stack that's in effect for the one from the bound-fn, and then execute under that |
| 12:46 | dgrnbrg | but I guess it's not swapping the stacks, but instead just pushing the saved stack on top of whatever's already there |
| 12:46 | dgrnbrg | which is why it overflows |
| 12:46 | dgrnbrg | is that the correct interpretation? |
| 12:52 | tjgillies | does clojures STM have the same type of role as monads in haskell? |
| 12:52 | tjgillies | "Programs written in functional style can make use of monads to structure procedures that include sequenced operations,http://en.wikipedia.org/wiki/Monad_(functional_programming)#cite_note-0http://en.wikipedia.org/wiki/Monad_(functional_programming)#cite_note-1 or to define some arbitrary http://en.wikipedia.org/wiki/Control_flow (like handling http://en.wikipedia.org/wiki/Concurrency_(computer_science), http://en.wikipedia.org/wiki/ |
| 12:52 | brehaut | tjgillies: no |
| 12:53 | brehaut | tjgillies: it has a similar role to the STM monad in haskell, not monads in general |
| 12:54 | tjgillies | i mean STM is not a monad by any means, but wiki says monads are for chaining functions together to handle concurrency and side effects |
| 12:54 | tjgillies | which is the whole point of the persistent data structures, thats why i asked if they play similar roles |
| 12:54 | tjgillies | handling concurrency and side effects, not so much chaining |
| 12:55 | Scriptor | er, persistent data structures don't really do anything special to avoid side effects, I think |
| 12:56 | Scriptor | well, they avoid side effects |
| 12:56 | Scriptor | but they don't do anything special to handle them |
| 12:56 | brehaut | haskell has persistent datastructures to, and it doesnt use monads to implement them |
| 12:56 | arohner | dgrnbrg: it does save the stack, but you're still going to have a stack overflow |
| 12:56 | brehaut | all the things haskell uses monads for can be implemented without them and still have pure functional semantics (eg, let, for, do) |
| 12:57 | brehaut | monads are just one (very elegant) way of defining them |
| 12:58 | tjgillies | brehaut: ah thanks |
| 12:59 | brehaut | tjgillies: look at algo.monads for a clojure implemenetation |
| 12:59 | tjgillies | brehaut: already was looking at it |
| 12:59 | dgrnbrg | Is there an implementation of a zipper that works on nested maps and vectors? |
| 13:00 | tjgillies | what does haskell use to update persistent data structures? do they have something like refs |
| 13:00 | brehaut | tjgillies: thats a confusing question |
| 13:00 | brehaut | you dont update persistent data structure |
| 13:00 | brehaut | thats the point |
| 13:01 | brehaut | but haskell does have a variety of reference types that are similar to clojures reference types |
| 13:01 | tjgillies | brehaut: you don't update them? i thought they were a tree structure that had history of previous state |
| 13:01 | brehaut | IORefs in the IO monad, TVars in the STM monad, others for other contexts |
| 13:02 | tjgillies | i guess im using "update" wrong |
| 13:02 | brehaut | ,(let [one {:a 1 :b 2} two (assoc a :b 3}], [a b]) |
| 13:02 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: }> |
| 13:02 | brehaut | ,(let [one {:a 1 :b 2} two (assoc a :b 3)] [a b]) |
| 13:02 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:0)> |
| 13:03 | brehaut | ,(let [one {:a 1 :b 2} two (assoc one :b 3)] [one two]) |
| 13:03 | clojurebot | [{:a 1, :b 2} {:a 1, :b 3}] |
| 13:03 | arohner | dgrnbrg: yes, zippers work on maps and vectors |
| 13:03 | dgrnbrg | arohner: I meant more of an existing API |
| 13:03 | dgrnbrg | it's tricky deciding what the API for traversing nested maps should look like in a zipper |
| 13:03 | arohner | tjgillies: they are trees, but they don't store previous state. The trees are designed so it's easy to make a new tree that shares state with the old ones |
| 13:04 | arohner | tjgillies: i.e. the "update" returns a new tree, but most of the tree that didn't change shares pointers with the existing tree |
| 13:04 | tjgillies | arohner: aaah. thnx |
| 13:05 | dgrnbrg | tjgillies: http://blog.higher-order.net/2010/08/16/assoc-and-clojures-persistenthashmap-part-ii/ |
| 13:05 | dgrnbrg | pretty pictures of how it works |
| 13:05 | dgrnbrg | This image in particular is enlightening: http://blog.higher-order.net/files/clj/persistenthashmap-pathcopy.png |
| 13:13 | tjgillies | dgrnbrg: thnx |
| 13:13 | dgrnbrg | tjgillies: I found that post very illuminating |
| 13:27 | thheller | hey, I'm playing with clojurescript. is there any way to use console.log for output? |
| 13:28 | thheller | completely new to clojure and I really would like to see my data at certain points :P |
| 13:29 | thheller | (print x) only complains with "No *print-fn* fn set for evaluation environment" |
| 13:29 | brehaut | im guessing (because i dont know clojurescript) but something like (.log console "message") |
| 13:30 | thheller | ah been there |
| 13:30 | thheller | (.log js/console "bla") |
| 13:30 | thheller | that works yeah, but though maybe i can get print&co hooked up somehow |
| 13:33 | dgrnbrg | thheller: could you try (defn *print-fn* [& strs] (.log js/console (apply print-str strs))) |
| 13:33 | dgrnbrg | (I've never used clojurescript |
| 13:33 | dgrnbrg | ) |
| 13:36 | thheller | print-str doesnt work |
| 13:37 | thheller | str works |
| 13:37 | thheller | but ouput is useless |
| 13:37 | thheller | too many lines :P |
| 13:38 | thheller | (defn log [& args] |
| 13:38 | thheller | (.log js/console args)) |
| 13:38 | thheller | but output is a cljs.core.IndexedSeq |
| 13:38 | thheller | how do i turn that into a list? :P |
| 14:06 | dgrnbrg | thheller: that is getting way further into clojurescript than I know |
| 14:10 | ibdknox | thheller: if you want println to work you just need to add (set! *print-fn* #(.log js/console %)) |
| 14:11 | ibdknox | somewhere toward the top of your cljs |
| 14:11 | thheller | hmm that kinda works |
| 14:12 | ibdknox | kinda? |
| 14:12 | thheller | (print {:hello "world}) |
| 14:12 | thheller | logs as 5 lines :P |
| 14:12 | thheller | 7 actually |
| 14:13 | ibdknox | oh right |
| 14:13 | ibdknox | just a sec |
| 14:14 | thheller | varargs in js seems fuzzy |
| 14:15 | mfex | thheller: how are you running clojurescript? |
| 14:16 | thheller | compiled as js und in the browser |
| 14:16 | thheller | (chrome) |
| 14:17 | mfex | I just use a console.log, although not often in advande compiled js |
| 14:18 | thheller | for "native" js types that is fine yeah |
| 14:18 | thheller | but (.log js/console {:hello "world"}) |
| 14:18 | chrissbx | Are there character functions or predicates like "lower-case?" somewhere? |
| 14:18 | thheller | prints cljs.core.ObjMap |
| 14:18 | mfex | you can use pr-str to print cljs type things |
| 14:19 | mfex | ie compare (console.log {:a 2}) and (console.log (pr-str {:a 2})) |
| 14:19 | thheller | ah excellent |
| 14:20 | thheller | thats what i was looking for :) |
| 14:20 | ibdknox | wow |
| 14:20 | ibdknox | this is ridiculous |
| 14:20 | thheller | thx |
| 14:21 | ibdknox | it actually looks like the way the print-fn stuff was implemented is busted for the browser case |
| 14:22 | thheller | :P |
| 14:22 | thheller | (defn log [& args] |
| 14:22 | thheller | (.log js/console (pr-str args))) |
| 14:22 | thheller | is close enough to what I had in mind |
| 14:22 | ibdknox | yeah |
| 14:23 | ibdknox | that's what I did previous to print-fn existing |
| 14:23 | ibdknox | it's actually kind of nice not to do that sometimes though |
| 14:23 | ibdknox | for example, you can inspect dom objects if you don't pr-str them |
| 14:23 | ibdknox | which is often very useful |
| 14:23 | thheller | hmm true |
| 14:25 | thheller | but i'm fairly solid on the javascript/dom side of things |
| 14:25 | thheller | only the cljs part is confusing |
| 14:35 | ibdknox | pinot is getting dismantled :) |
| 14:59 | mfex | MJosa1 |
| 14:59 | mfex | whoops |
| 15:07 | anttih | I'm trying to use a library from clojure.contrib but nowhere does it say how I should install the package. |
| 15:09 | anttih | the contrib homepage does not talk about this at all. Is there a reason for this? http://richhickey.github.com/clojure-contrib/index.html |
| 15:09 | lazybot | Nooooo, that's so out of date! Please see instead http://clojure.github.com/clojure-contrib/index.html and try to stop linking to rich's repo. |
| 15:09 | Raynes | Only half-helpful. |
| 15:09 | anttih | that does not help at all |
| 15:10 | anttih | I've now tried to figure this out for an hour |
| 15:10 | Raynes | Well, it kind of does. You're on the wrong site first off. Second, you don't 'install' libraries and 'packages' in Clojure. Do you have Leiningen? |
| 15:10 | Raynes | Things work a little differently in Clojure. It can take you off guard. |
| 15:11 | anttih | Raynes: I have leiningen and know how to use it, but I don't know which jar to use. |
| 15:11 | Raynes | Okay. Clojure contrib was recently split up into multiple libraries. Which library specifically do you want to use? |
| 15:11 | anttih | Raynes: http.agent |
| 15:12 | Raynes | I'm pretty sure that library was deprecated. clj-http is an excellent HTTP client though. Let me pull it up for you. |
| 15:12 | Raynes | https://github.com/dakrone/clj-http |
| 15:13 | Raynes | The latest released version is 0.3.1. |
| 15:13 | anttih | Raynes: ah, saw that one |
| 15:13 | anttih | ok, thanks |
| 15:13 | Raynes | anttih: Have you created a project yet? |
| 15:13 | anttih | Raynes: I have |
| 15:14 | Raynes | I'll show you had to add the dependency, which is the equivalent of installing it in Clojure (these things are project-specific and hardly ever global). |
| 15:14 | Raynes | Open project.clj in your text editor and add [clj-http "0.3.1"] to your :dependencies list. |
| 15:14 | anttih | Raynes: I know how to do that :-), but thanks |
| 15:14 | Raynes | Alright, cool. |
| 15:15 | Raynes | Sorry you've had so much trouble. :( |
| 15:33 | skelternet | I am making this harder than it is. |
| 15:50 | dgrnbrg | Is there a way to merge maps and throw an exception if 2 keys collide (i.e. check disjointness of key sets) that's better than (merge-with #(throw (RuntimeException. "non disjoint")) map1 map2 map3)? |
| 15:50 | arohner | dgrnbrg: that looks pretty good |
| 15:51 | TimMc | dgrnbrg: You could check if the clojure.set/intersection of their 'keys is non-empty. |
| 15:51 | dgrnbrg | which would be faster? |
| 15:51 | TimMc | Well, if you're merging anyhow, just use merge-with. |
| 15:51 | dgrnbrg | if i'm doing this of 1M sets that are disjoint |
| 15:51 | TimMc | hah |
| 15:51 | dgrnbrg | and throwing an exception is ok? |
| 15:51 | TimMc | Sure. |
| 15:51 | dgrnbrg | I keep going back and forth on exceptions in a functional language |
| 15:51 | arohner | my guess is merge-with, because you'll stop at the first fail, rather than waiting for the whole intersection to finish |
| 15:52 | dgrnbrg | TimMc: I'm actually writing a cycle simulator now |
| 15:52 | TimMc | dgrnbrg: If you want to be fancy, you could use scgilardi's slingshot lib and pass info up that way on what the colliding key was. |
| 15:53 | dgrnbrg | I like slingshot, and I am already using it for other, more powerful things :) |
| 15:53 | dgrnbrg | you had showed me your feedback project earlier |
| 15:53 | TimMc | Is this something that should never, ever happen unless there's a bug? |
| 15:54 | dgrnbrg | Yes |
| 15:58 | TimMc | AssertionError. |
| 16:01 | dgrnbrg | TimMc: is it better to (throw (AssertionError. "non disjoint")) or (assert false "non disjoint")? |
| 16:02 | TimMc | throw |
| 16:02 | TimMc | There's no reason to do assert false. |
| 16:18 | skelternet | I don't see anything in noir to directly facilitate authentication. Is Sandbar pretty much the way to go? |
| 16:20 | ibdknox | skelternet: what does directly facilitate authentication mean? |
| 16:21 | ibdknox | all I ever end up doing is adding a pre-route here and there and adding some key to my session to determine if I'm auth'd |
| 16:21 | daaku | can't seem to figure out why travis-ci and one of my own machines fails with an almost identical java command with "java.lang.NoSuchMethodError: clojure.lang.KeywordLookupSite.<init>(ILclojure/lang/Keyword;)V" |
| 16:22 | skelternet | ibdknox: well, in my dream world (add-middleware somemagic-that-forces-authentication-if-not) |
| 16:22 | skelternet | ibdknox: given my newbieism, it is probable I am making it harder than it needs to be |
| 16:22 | daaku | there seems to be a bunch of info available for that error via google, but nothing obvious about what is failing |
| 16:23 | ibdknox | skelternet: have you taken a look at the blog example? |
| 16:23 | _carlos_ | hi |
| 16:23 | skelternet | ibdknox: for noir? |
| 16:23 | ibdknox | skelternet: yeah |
| 16:23 | skelternet | ibdknox: I've been googling all over compujre, noir, ring, sandbar. |
| 16:24 | skelternet | ibdknox: the tutorial on the webnoir.org website? |
| 16:24 | ibdknox | skelternet: it's a full sample project |
| 16:24 | ibdknox | hm |
| 16:25 | ibdknox | github seems to be having issues |
| 16:25 | ibdknox | lol |
| 16:25 | skelternet | ibdknox: oh, really? then that should let me figure out what namespace 'users/admin?' is coming from? |
| 16:25 | daaku | ah, lein expects $HOME/.m2/repository/org/clojure/clojure/1.2.1/clojure-1.2.1.jar it seems :/ |
| 16:25 | skelternet | ibdknox: if I can just close one loop, I'm sure I can get some traction :) |
| 16:26 | skelternet | ibdknox…will try to clone…hang on |
| 16:27 | ibdknox | skelternet: https://refheap.com/paste/625 it's in models/user.clj :) |
| 16:27 | skelternet | ibdknox: ok…now I see what you mean by github having probs |
| 16:27 | Bronsa | oh, then it's not just me |
| 16:27 | ibdknox | skelternet: basically when you login, simply set a key i the session |
| 16:27 | ibdknox | Bronsa: nope, it's toast |
| 16:27 | Bronsa | it took 2 minutes to push a commit |
| 16:28 | Bronsa | i thought i had network problems |
| 16:28 | ibdknox | it must've been me |
| 16:28 | Bronsa | ahahah |
| 16:28 | ibdknox | I pushed like 5 libs up in the past couple minutes ;) |
| 16:28 | ibdknox | and it's back |
| 16:28 | ibdknox | skelternet: https://github.com/ibdknox/Noir-blog/blob/master/src/noir_blog/models/user.clj |
| 16:29 | skelternet | ibdknox: thanks. so it'shomegrown to the noir-blog example. not sophisticated. (which is fine) |
| 16:29 | ibdknox | skelternet: yeah, it's usually specific to each app |
| 16:29 | ibdknox | in some way |
| 16:29 | ibdknox | I prefer the flexibility |
| 16:29 | daaku | ibdknox: a clojurescript-y weekend for you |
| 16:30 | skelternet | I just didn't make the leap to mu. I figured that it users was coming from somehting in the stack: noir, compojure, ring... |
| 16:30 | ibdknox | daaku: yeah, people were yelling at me for not releasing my stuff :) |
| 16:31 | skelternet | ibdknox: Thank you! you have de-snagged me. |
| 16:31 | ibdknox | skelternet: awesome :) |
| 16:32 | daaku | ibdknox: will check them out, i'm sure they're bad-ass |
| 16:32 | ibdknox | waltz is by far the coolest |
| 16:32 | ibdknox | the others are mostly the decomposition of pinot |
| 16:32 | ibdknox | and a jQuery wrapper |
| 16:32 | ibdknox | jayq does some really neat stuff to the jQuery object so that it acts just like any other clojure collection |
| 16:36 | wyan | is there an easy way to remap delete in paredit so that it fwd deletes? |
| 16:42 | skelternet | *sigh* github web site says "Something went wrong." |
| 16:42 | skelternet | hard to argue with |
| 16:46 | skelternet | github looks back up here |
| 16:47 | ibdknox | yep |
| 16:47 | ibdknox | seems ok |
| 16:50 | skelternet | ibdknox: I spoke too soon |
| 16:51 | ibdknox | still fine for me |
| 16:51 | skelternet | I'm seeing intermittent slothliness |
| 17:01 | emezeske | ibdknox: Would you be interested in a pull request for pinot that adds some more of hiccup's form_helpers and page_helpers stuff? |
| 17:01 | ibdknox | emezeske: I would like such a thing for crate :) |
| 17:02 | ibdknox | https://github.com/ibdknox/crate |
| 17:02 | ibdknox | pinot is dissolving |
| 17:02 | emezeske | I'm glad I asked, then! |
| 17:03 | emezeske | I'm using hiccups right now, but it seems to be kind of a mess |
| 17:03 | emezeske | So if the hiccup stuff is going in crate, where is the dom stuff going? |
| 17:03 | _carlos_ | was assert-true form replaced by another name |
| 17:04 | ibdknox | emezeske: jayq |
| 17:05 | emezeske | ibdknox: so you are moving from goog to jquery? |
| 17:05 | ibdknox | yessir |
| 17:06 | ibdknox | the goog libraries are terrible |
| 17:06 | ibdknox | and I was rewriting jquery for absolutely no reason :) |
| 17:06 | emezeske | yeah? I am using jquery right now in my project, just out of ignorance of goog |
| 17:06 | ibdknox | all the arguments against jquery are also non-arguments |
| 17:06 | ibdknox | I'll add the rationale to the readme at some point |
| 17:06 | emezeske | I thought it couldn't be advanced-compiled? |
| 17:07 | emezeske | +1 to rationale, it would be great to hear from someone that's been in both trenches |
| 17:07 | Raynes | ibdknox: Might want to spice up that readme a bit. |
| 17:07 | ibdknox | emezeske: you shouldn't package jquery anyways, it should be google CDN'd (it'll already be cached) |
| 17:08 | ibdknox | emezeske: given a wrapper, all the jquery names will appear exactly once |
| 17:08 | ibdknox | then the wrapper names will get munged |
| 17:08 | ibdknox | so the size difference is in bytes |
| 17:08 | emezeske | very nice |
| 17:08 | ibdknox | and if you're optimizing at that level you shouldn't be using CLJS lol |
| 17:08 | emezeske | ^_^ |
| 17:08 | emezeske | I'm not, I just thought that was one possible argument |
| 17:08 | emezeske | (devil's advocate) |
| 17:08 | ibdknox | yeah, just giving my argument |
| 17:09 | emezeske | is jayq usable at this point? |
| 17:09 | Raynes | ibdknox: Wait, I shouldn't package jquery? Lies and slander! |
| 17:09 | ibdknox | quite |
| 17:09 | emezeske | I'm fine with alphatastic |
| 17:09 | ibdknox | emezeske: I'm building really cool stuff with them, so yep :) |
| 17:09 | ibdknox | Raynes: all of them need a lot of help.. I'm just putting them up for now, not really releasing |
| 17:09 | emezeske | ibdknox: That's great. jayq beats the pants off of my stupid-ass jquery stuff |
| 17:10 | ibdknox | emezeske: using the jquery object like a clojure collection is pretty neat :) |
| 17:10 | emezeske | ibdknox: is any of your cool stuff open-sauce, for example code? |
| 17:10 | ibdknox | emezeske: there's a fun example in the waltz readme |
| 17:10 | emezeske | ibdknox: great, thanks |
| 17:10 | emezeske | ibdknox: oh, pinot's remotes looked really cool; are you just using xhr for that directly now? |
| 17:11 | ibdknox | emezeske: they're sticking around with a new addition |
| 17:11 | ibdknox | a lazy-store |
| 17:11 | ibdknox | works like a map but fetches values from the server and caches them |
| 17:11 | ibdknox | lib = fetch |
| 17:11 | emezeske | where will they go? jayq? |
| 17:11 | emezeske | wow nice |
| 17:12 | ibdknox | https://groups.google.com/d/topic/clj-noir/wsCVajG0-YE/discussion |
| 17:12 | emezeske | aha! |
| 17:12 | emezeske | thanks! |
| 17:12 | ibdknox | I got the canvas stuff fast enough finally |
| 17:13 | ibdknox | also no more goog.dom.query dependency |
| 17:13 | ibdknox | which is a huge win |
| 17:13 | ibdknox | lol |
| 17:13 | emezeske | I as actually just looking at pinot thinking, "this should be broken up into smaller pieces" |
| 17:13 | ibdknox | well now it is :) |
| 17:13 | emezeske | mind reader! |
| 17:15 | emezeske | this is great. I was on the fence about reworking my app to use noir+pinot, but now I'm convinced, because I can do noir+the stuff I actually want |
| 17:21 | Raynes | emezeske: Did you just give drugs to ibdknox? |
| 17:23 | emezeske | Raynes: Who's asking!? |
| 17:23 | emezeske | Yes! |
| 17:23 | emezeske | No. |
| 17:23 | Raynes | Haha |
| 17:34 | tmciver | Is it possible to def a var inside a funtion, or is this something only a macro can do? |
| 17:34 | Raynes | You can, but you most likely don't actually want to. |
| 17:35 | tmciver | I was trying to be sneaky and do (def (symbol (str an-arg)) 5) inside a function. But I get an "First argument to def must be a symbol" error. |
| 17:35 | ibdknox | tmciver: macro time |
| 17:36 | ibdknox | but Raynes's statement is probably true |
| 17:36 | tmciver | Can you define a macro inside of another macro? Does that even make sense? |
| 17:36 | ibdknox | you can, but it's starting to get into very difficult territory |
| 17:36 | Raynes | Yes, you can. You can also tie yourself to a horse and slap it on the ass. |
| 17:37 | Raynes | You probably don't want to that either. |
| 17:37 | ibdknox | lol |
| 17:37 | tmciver | Raynes: that sounds like fun |
| 17:37 | ibdknox | macros writing macros is a scary evil place to be |
| 17:37 | tmciver | Yeah, and I'm a noob at macros. |
| 17:39 | raek | tmciver: you can do what def does at runtime using 'intern' |
| 17:39 | amalloy | (inc raek) |
| 17:39 | raek | but you shouldn't do that at runtime |
| 17:39 | muhoo | doh http://dev.clojure.org/jira/browse/CLJS-141 |
| 17:39 | amalloy | but also, probably better not to do any of those things |
| 17:40 | raek | since modifying vars is not a thread safe operation |
| 17:40 | raek | and is probably bad for many other reasons |
| 17:40 | tmciver | Yeah, that stuff sounds a little out of my league at this point. |
| 17:41 | ibdknox | wtf is going on with github |
| 17:42 | tmciver | But out of curiousity, why does (def (symbol (str an-arg)) 5) give me a "First argument to def must be a symbol" error? |
| 17:42 | skelternet | lots of tweets on it. dunno. may not be related but github had a party last night |
| 17:42 | ibdknox | apparently their loadbalancer is freaking out |
| 17:42 | ibdknox | https://status.github.com/ |
| 17:43 | amalloy | tmciver: because the first argument to def must be a symbol at compile-time, and you're giving it a list |
| 17:43 | ibdknox | tmciver: because def doesn't evaluate its first argument |
| 17:43 | tmciver | Ah, OK. Thanks. |
| 17:43 | Raynes | Because amalloy said so. |
| 17:44 | muhoo | what does github actually run on / written in? |
| 17:44 | amalloy | mostly ruby, right? |
| 17:44 | ibdknox | yes |
| 17:44 | ibdknox | on rackspace |
| 17:45 | Raynes | Turtles all the way down. |
| 18:11 | gtrak | are you supposed to :import records? |
| 18:13 | amalloy | yes |
| 18:22 | TimMc | tmciver: `(def ~name ~val-expr) in the macro |
| 18:26 | Raynes | Yay! lein 2 native deps extraction. |
| 18:26 | TimMc | tmciver: How goes the rewrite? |
| 18:26 | TimMc | Raynes: w00t! |
| 18:48 | daaku | it seems like my failure was this bug: https://github.com/technomancy/leiningen/issues/355 -- is there some way to exclude clojure from dev-dependencies as a whole instead of having to put a :exclude on each of my 4 dev-dependencies? |
| 18:49 | daaku | oh hey, :exclusions works for this. problem solved |
| 18:53 | TimMc | daaku: If you had to use Maven for that, you'd have to exclude for each. :-( |
| 18:54 | daaku | TimMc: good thing i didn't :) travis-ci worked with this change |
| 18:57 | Raynes | Leiningen does not have any bugs. |
| 18:57 | Raynes | Anything that ever happens that isn't expected is a malfunction of your computer's hardware. |
| 19:01 | ibdknox | Raynes: is your keyboard pluggedin? have you reset your router? |
| 19:01 | Raynes | Heh |
| 19:03 | tmciver | TimMc: eh, so so. I knew there was a reason I put off learning macros. |
| 19:06 | TimMc | tmciver: I think this is probably a good usecase for pair-programming. |
| 19:07 | tmciver | Yes. In fact...PM |
| 19:07 | TimMc | Currently cooking, so may not be of *too* much use... |
| 19:07 | tmciver | What?! drop what you're doing and help me! ;) |
| 19:08 | tmciver | OK, I'll PM you - read it later. |
| 19:08 | tmciver | I wanted to follow the definition of import-field in the let, |
| 19:08 | tmciver | oop |
| 19:16 | arohner | is there a way to make git use a diffing algorithm that understands s-exprs? git merge always mangles my clojure |
| 19:17 | TimMc | arohner: Put your trailing parens on a separate line JUST KIDDING |
| 19:18 | arohner | :-) |
| 19:22 | Raynes | TimMc arohner: Psh. Real men put them in separate files. |
| 19:24 | emezeske | ibdknox: how up-to-date are the fetch/jayq/crate jars on clojars? they seem a bit old maybe |
| 19:25 | ibdknox | one sec, I'll push all of them |
| 19:25 | emezeske | you da' man! |
| 19:25 | ibdknox | everything should be up to date |
| 19:26 | ibdknox | you'll have to clear out your ~/.m2/ cache for them though |
| 19:27 | emezeske | ryokai! |
| 19:41 | gtrak | is it alright to use repl-utils in dev-dependencies or is there a better way, like a global way? |
| 19:43 | TimMc | gtrak: I think you can 'require it in ~/.lein/init.clj or whatever it is |
| 19:44 | TimMc | or is it user.clj? |
| 19:50 | gtrak | TimMc: ah, thanks, I'll give that a go |
| 19:56 | muhoo | iirc, git just calls the unix diff utility, no? |
| 19:56 | gtrak | oh, dammit, apropos is in clojure.repl :-) |
| 19:56 | muhoo | there may be flags to diff that handle lisps more elegantly. i'd imagine over the last 40 years someone would have come up with one. |
| 19:56 | TimMc | muhoo: Yeah, but you can swap that out. |
| 19:57 | TimMc | Oh, but it might require a line-oriented diff. |
| 19:59 | TimMc | Isn't it more like 50 years at this point? Kind of amazing. |
| 19:59 | muhoo | diff? |
| 19:59 | muhoo | can't be older than unix |
| 19:59 | muhoo | well, maybe it can. i dunno if it predated unix. |
| 20:00 | TimMc | Oh, I thought you meant diff tools for lisp. |
| 20:00 | TimMc | not the unix diff tool |
| 20:01 | muhoo | diff apparently was born in 1974. hmm, if there were a clojure-written diff tool that deallt with clojure code, and it could be plugged into git as a replacement for unix diff, that'd be kinda neat. |
| 20:02 | TimMc | I guess before that, people just diffed visually. |
| 20:02 | gtrak | muhoo: once you start doing that, you might as well go full structural |
| 20:03 | muhoo | heh, the unified diff format we know and love is only from 1990 (gnu) |
| 20:04 | muhoo | i don't have time to try to write a diff/patch tool in clj that is semantically-aware of clojure and works with git, but it'd be a neat project. |
| 20:05 | brehaut | doesnt unix diff only so 2 point diff, and gits diff do 3 point? |
| 20:05 | brehaut | structural diffing is another usecase for the much discussed lossless reader |
| 20:05 | Raynes | diff is my hero. |
| 20:07 | clj_newb | (ns ... (:import (foo.bar.doh Cat Dog))) ends up defining Cat, Dog in the local namespace. I want to be able to do foo.bar.blah.Cat foo.bar.blah.Dog, but not have Cat/Dog defined in the local namespace. How can I make this happen? |
| 20:07 | clj_newb | s/doh/blah/ |
| 20:09 | clj_newb | basically, I want to be able to :require java packages |
| 20:10 | TimMc | clj_newb: Just skip the import, then! |
| 20:10 | TimMc | It totally works. |
| 20:11 | TimMc | ,File |
| 20:11 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: File in this context, compiling:(NO_SOURCE_PATH:0)> |
| 20:11 | TimMc | ,java.io.File |
| 20:11 | clojurebot | java.io.File |
| 20:11 | clj_newb | TimMc: how does this work |
| 20:12 | clj_newb | is the jvm , while interpreting clojure, is there like: |
| 20:12 | clj_newb | hmm, I see you need foo.bar.blah.Cat |
| 20:12 | clj_newb | so i'll just auto load it? |
| 20:13 | TimMc | clj_newb: I think so? Or maybe everything on the classpath is auotmatically loaded. |
| 20:13 | TimMc | Anyway, fully-resolved classnames simply work. |
| 20:16 | amalloy | every class on the classpath is loaded as necessary |
| 20:49 | oakwise | how do I properly wrap docstrings in clojure-mode emacs? |
| 20:49 | TimMc | As in, rewrap the text? |
| 20:49 | oakwise | yes |
| 20:50 | oakwise | it seems to want to put wrapped lines at col 0 |
| 20:50 | oakwise | instead of indented |
| 20:50 | oakwise | possibly because I'm using evil mode's wrap and I don't know how to do it the emacs way :) |
| 20:51 | TimMc | Hmm. I tend to not indent, actually. |
| 20:52 | oakwise | TinMc: oh. Is that idiomatic? |
| 20:53 | oakwise | hm. core seems to indent afaict. |
| 20:53 | TimMc | No idea. It seems readable, though, so I don't worry too much about it. |
| 20:54 | TimMc | oakwise: Core is a mish-mash of different coding styles. |
| 20:54 | oakwise | fair |
| 20:54 | dgrnbrg | what namespace is -?> in? |
| 20:56 | gtrak | I just popped the macro cherry |
| 20:56 | gtrak | watch out, world! |
| 20:57 | TimMc | dgrnbrg: I don't think it made it out of contrib. |
| 20:57 | dgrnbrg | ah |
| 20:58 | dgrnbrg | I have another way with if-let |
| 20:58 | TimMc | You could write it yourself, too. |
| 20:58 | dgrnbrg | brain...hurts... |
| 20:58 | TimMc | Wait, there's a reference to "incubator" in my chat logs... |
| 20:59 | TimMc | dgrnbrg: https://github.com/clojure/core.incubator |
| 21:00 | dgrnbrg | TimMc: awesome, thanks! |
| 21:10 | oakwise | TimMc: if you're curious, using technomancy's clojure-mode and then `M-x clojure-fill-docstring` did what I was looking for |
| 21:11 | cliffordjames | can someone explain a clojure idiom for traversing a lazy-seq? like seq.each { ... } if you are familiar w/ ruby or groovy. Should i use recur? |
| 21:11 | dgrnbrg | cliffordjames: do you want each{} like in groovy or collect{} or inject{}? |
| 21:12 | dgrnbrg | that is, do you want to have side effects be the purpose or do you want to build a new result? |
| 21:12 | chjames | build a new result in this case |
| 21:12 | dgrnbrg | groovy's collect is clojure's map |
| 21:12 | dgrnbrg | approximately, but clojure's is more powerful |
| 21:12 | dgrnbrg | groovy's inject is clojure's reduce, basically |
| 21:12 | chjames | and that doesn't load the whole seq in memory right? |
| 21:13 | chjames | ok |
| 21:13 | dgrnbrg | it's all lazy |
| 21:13 | chjames | cool |
| 21:13 | dgrnbrg | you can use doseq to force the evaluate of a lazy sequence RIGHT NOW and throw away the result (only side effects) |
| 21:14 | dgrnbrg | doall does the same, but retains the head, so that the sequence is resident in memory |
| 21:14 | chjames | well i am parsing a lazy seq from a csv library so basically i just want to map my 'parse' function onto the seq and return the result as a collection |
| 21:15 | TimMc | Yeah, map is the answer. |
| 21:15 | dgrnbrg | if you want python-style comprhensions, check out for |
| 21:21 | dgrnbrg | I want to write this--how can I? (let [x [(fn [] x) 2]]) |
| 21:22 | dnolen | dgrnbrg: not possible |
| 21:22 | dgrnbrg | I see |
| 21:23 | dnolen | dgrnbrg: I think Scheme-like letrec would make that work, but no one's stepped up with a patch |
| 21:24 | dgrnbrg | dnolen: That's what it seems like to me |
| 21:24 | dgrnbrg | I know that letfn has special recursion support |
| 21:24 | dgrnbrg | for now, i'll use the fact that I have referential transparency to recur at a different level |
| 21:43 | chjames | is there a way to make multimethods (declared with defmethod) private (like defn- does for funcs) ? |
| 21:43 | gtrak | so, if I want to run a macro a number of times in my ns, can I do it with a for? |
| 21:43 | dgrnbrg | gtrak: no, since macros happen before code gets executed |
| 21:44 | dgrnbrg | chjames: maybe try (defmulti name {:private true} …) |
| 21:44 | gtrak | for itself is a macro |
| 21:44 | gtrak | so, I should wrap the for in a macro and call it perhaps? |
| 21:45 | dgrnbrg | chjames: many def macros accept the meta list, and I think :private makes it private |
| 21:45 | dgrnbrg | gtrak: what are you trying to do? what you've said so far doesn't make enough sense to me |
| 21:45 | clj_newb | is there a way to auto serialize defrecord ? |
| 21:45 | gtrak | dgrnbrg: basically I've made a macro that creates deftests for me based on a list of filenames, I'll paste in a sec |
| 21:46 | chjames | ok...i saw that in the clojure.java.io code here: http://bit.ly/zv35uZ that it was putting a bunch of defmethods for do-copy into the public ns |
| 21:46 | gtrak | dgrnbrg: ah, I think it was a name collision for my variable causing a problem, seems to work now |
| 21:47 | chjames | (at least it appeared to be...i'm new to clojure) |
| 21:54 | gtrak | dgrnbrg: so, now it's only doing the last in the list :-) https://gist.github.com/1742220 |
| 21:54 | gtrak | but it's printing all of them |
| 21:54 | dgrnbrg | exactly |
| 21:55 | dgrnbrg | remember, a macro returns a piece of code to get pasted in |
| 21:55 | gtrak | ah, |
| 21:55 | gtrak | but you can see what I'm trying to do :-) |
| 21:56 | dgrnbrg | you need to do something like (def my-tests (map (fn [t] `(create-test ~t nil)) inputs)) |
| 21:56 | dgrnbrg | then, do `(do ~@my-tests) at the end of the create-tests macro |
| 21:56 | gtrak | yea, I was just thinking of wrapping the for in a do |
| 21:56 | dgrnbrg | (but use a let instead) |
| 21:57 | gtrak | why the splice? i haven't used one of those yet |
| 21:57 | dgrnbrg | the map is making a list of the syntax bits that say (create-test t nil) |
| 21:57 | dgrnbrg | and you want to generate something like (do (create-test t0 nil) (create-test t1 nil) (create-test t2 nil)) |
| 21:58 | dgrnbrg | so you splice all the syntactic bits into the do |
| 22:00 | gtrak | ah, so is the splice just un-nesting a seq? |
| 22:00 | dgrnbrg | yeah |
| 22:00 | dgrnbrg | suppose x = [1 2] |
| 22:01 | dgrnbrg | then `(do ~x) is '(do [1 2]) |
| 22:01 | dgrnbrg | and `(do ~@x) is '(do 1 2) |
| 22:01 | gtrak | like a apply kind of |
| 22:02 | dgrnbrg | it's really like a splice |
| 22:02 | dgrnbrg | ;) |
| 22:02 | gtrak | thanks |
| 22:06 | clj_newb | this is the question I should have asked ages ago. After defining (defprotocol IFoo ...), how do I check if a given object satisfies protocol IFoo ? |
| 22:07 | dgrnbrg | ,(doc satisfies?) |
| 22:07 | clojurebot | "([protocol x]); Returns true if x satisfies the protocol" |
| 22:11 | gtrak | works |
| 22:13 | gtrak | it's odd that macros are expanded at compile-time, but the run-time initialization can be scattered around it physically above and below in source code |
| 22:17 | clj_newb | dumb question |
| 22:17 | clj_newb | how doesa functions vs protocls get resolved? |
| 22:18 | clj_newb | i.e. suppose I define a (IOpen ... (open [ ... ])) and a (defn open [... ]) |
| 22:18 | clj_newb | how does clojure figure out which open gets resolved? |
| 22:18 | brehaut | protocols create functions in the namespace they are defined in |
| 22:18 | clj_newb | brehaut: are these "functions" really multimethods that dispatch solely on the first argument? |
| 22:18 | brehaut | no |
| 22:18 | brehaut | what would the point of that be? we already have multis |
| 22:20 | clj_newb | brehaut: how are functions defined by protocols implemented? |
| 22:20 | brehaut | magic |
| 22:20 | clj_newb | gryffindor or slytherin magic? |
| 22:21 | brehaut | alhazreds |
| 22:21 | brehaut | a protocol creates a backing interface, a series of functions for each method in the protocl, and a protocol map thing |
| 22:22 | brehaut | implementations either a) directly implement the interface when defined (using deftype or defrecord frinstance and implementing the protocol in the definition) or b) use extend-type or extend-protocol which updates the protocol map thing |
| 22:23 | brehaut | clj_newb: open up a repl, create a simple protocol and examining the objects and calling (class …) and (supers (class …)) on the various bits |
| 22:25 | brehaut | most of the magic happens inside the functions though; they (i think) use javas type directed polymorphism and implement call-site caches to determine the implementation function |
| 22:25 | brehaut | s/function$/method/ |
| 22:25 | clj_newb | brehaut: "examine" an object <-- something more advanced than pprint? |
| 22:26 | brehaut | even simpler |
| 22:26 | brehaut | just enter the symbol and press enter |
| 22:26 | brehaut | its particularly revealing for the protocol itself |
| 22:27 | brehaut | eg, (defprotocol Foo (frobtz [this that])) Foo |
| 22:27 | brehaut | (class Foo) is also interesting |
| 22:27 | clj_newb | interesting |
| 22:27 | clj_newb | I like how everything is basically a gigantic map |
| 22:28 | brehaut | joy of clojure has a good section on protocols |
| 22:28 | brehaut | theres some cool stuff on creating mixin implementations |
| 22:29 | brehaut | (which takes advantage of the fact that its all maps under the hood) |
| 23:05 | chjames | arrg...i'm still unsure about the laziness in clojure...can someone tell me if this code is reading the whole lazy-seq from (csv/read-csv rdr) in memory in the (read-hitting-stats) f()? https://gist.github.com/1742587 |
| 23:07 | ibdknox | chjames: doall forces the lazy-seq to be realized |
| 23:07 | brehaut | chjames: the doall in read-hitting-stats is going to fully realize the seq, effectively stripping out the laziness |
| 23:07 | ibdknox | so yes |
| 23:07 | ibdknox | hah! |
| 23:07 | ibdknox | I won this time ;) |
| 23:07 | brehaut | rats! |
| 23:09 | chjames | ok...that makes sense...i tried to write a lazy version and i kept getting IOExceptions due to the (with-open ...) closing the stream...so I think i HAVE to realize the collection unless i do everything with an iterator style approach and act on individual rows |
| 23:11 | ibdknox | chjames: correct |
| 23:17 | Raynes | ibdknox: You've been around more today than you have in your whole IRC career. |
| 23:17 | ibdknox | totally not true |
| 23:17 | ibdknox | I used to be on a bunch for a while |
| 23:17 | Raynes | technomancy_: is annoyingly absent today. |
| 23:17 | Raynes | I finally implement native deps |
| 23:17 | ibdknox | lol |
| 23:17 | Raynes | How dare he not be around to praise me! |