2012-05-05
| 00:00 | ibdknox | technomancy: running off of cljs master |
| 00:00 | technomancy | hm; you could maybe just add something to :source-paths |
| 00:03 | ibdknox | I think I tried that and it did bad things |
| 00:03 | ibdknox | I'll give it a go again though |
| 00:03 | technomancy | what you really want is a checkout dependency, right? |
| 00:03 | technomancy | it's just that you can't do it for cljs since it's not a lein project? |
| 00:03 | technomancy | maybe dump a fake project.clj in there? |
| 00:04 | ibdknox | not a bad idea |
| 00:04 | ibdknox | I had that at one point and then nuked it |
| 00:05 | technomancy | hugod has something to let you use mvn projects as checkout deps, but I'm not sure it would make sense to add support for other project types |
| 00:06 | technomancy | since it would pretty much just be clojure and cljs |
| 00:06 | technomancy | and maybe gradle? |
| 00:10 | mdeboard | god wtb emacs-in-clojure :( |
| 00:11 | mdeboard | everything is hard |
| 00:11 | mdeboard | w/ elisp |
| 00:25 | mmarczyk | technomancy: failure-expected-here-dont-freak-out :-D |
| 00:25 | mmarczyk | technomancy: thanks for that, stopped in the middle of freaking out :-) |
| 00:26 | mmarczyk | technomancy: do you want a pull req for the bluuugh thing or do you want me to push to master |
| 00:26 | mdeboard | Want to pair this up with https://github.com/lynaghk/c2 |
| 00:26 | mdeboard | er |
| 00:26 | mdeboard | Want to pair https://github.com/lynaghk/c2 up with Cascalog output |
| 00:33 | mmarczyk | hm, on second thought I probably need to make sure that tests remain on the cp when working on lein, which might not happen with my current approach... will do that later. |
| 01:23 | leo2007 | How to use `lein plugin install <something> ..' to install the latest snapshot version of something? |
| 01:28 | _KY_ | Do I need many "doall"s for a series of nested "for"s, or just one "doall"? |
| 01:35 | mdeboard | leo2007: Are you coming from ruby/python world |
| 01:36 | mdeboard | leo2007: lein isn't like pip/gem, if you want to include a module in your project you need to specify it in your project.clj |
| 01:46 | amalloy | _KY_: if you have many nested fors, especially of the sort you feel you need to doall, you can probably simplify your approach radically |
| 01:47 | _KY_ | Like how? |
| 01:49 | spjt | Is there any way to make lein use symbolic links? |
| 01:50 | spjt | seems kind of ridiculous to have every project hold a separate copy of the libs |
| 01:51 | amalloy | _KY_: for example, by generating flatter sequences, or using doseq instead of for, or reducing side effect |
| 01:51 | _KY_ | 1) doseq doesn't collect |
| 01:52 | _KY_ | 2) I already use concat inside the "for"s to flatten results |
| 01:52 | amalloy | uhoh |
| 01:53 | _KY_ | But flattened could still be lazy, right? |
| 01:53 | amalloy | are you aware that for takes multiple binding pairs? ##(for [x [1 2 3], y '(a b c)] [x y]), for example |
| 01:53 | lazybot | ⇒ ([1 a] [1 b] [1 c] [2 a] [2 b] [2 c] [3 a] [3 b] [3 c]) |
| 01:53 | amalloy | you can surely use that instead of having multiple nested fors with concats |
| 01:55 | amalloy | for example, a worse way to write that would have been ##(apply concat (for [x [1 2 3]] (for [y '(a b c)] [x y]))) |
| 01:55 | lazybot | ⇒ ([1 a] [1 b] [1 c] [2 a] [2 b] [2 c] [3 a] [3 b] [3 c]) |
| 01:57 | _KY_ | Ah right... |
| 01:59 | _KY_ | I want to squeeze a "let" between 2 for's |
| 01:59 | amalloy | you should read the docs for for |
| 02:00 | amalloy | &(for [x [1 2 3] :let [y (inc x)], z [y x y]] [x y z]) |
| 02:00 | lazybot | ⇒ ([1 2 2] [1 2 1] [1 2 2] [2 3 3] [2 3 2] [2 3 3] [3 4 4] [3 4 3] [3 4 4]) |
| 02:01 | _KY_ | "For" is very hard to search on the net =[ |
| 02:01 | amalloy | &(doc for) |
| 02:01 | lazybot | ⇒ "Macro ([seq-exprs body-expr]); List comprehension. Takes a vector of one or more binding-form/collection-expr pairs, each followed by zero or more modifiers, and yields a lazy sequence of evaluations of expr. Collections are iterated in a nested fashion, rightm... https://www.refheap.com/paste/2576 |
| 02:02 | amalloy | $google clojuredocs |
| 02:02 | lazybot | [ClojureDocs - Community-Powered Clojure Documentation and ...] http://clojuredocs.org/ |
| 02:02 | _KY_ | The result doesn't have "for": |
| 02:02 | _KY_ | http://clojuredocs.org/search?x=0&y=0&q=for |
| 02:04 | _KY_ | Well, "for form" does it... |
| 02:04 | amalloy | haha um...the actual search button is really bad, i think |
| 02:04 | amalloy | but if you type "for", the autosuggest is good |
| 02:06 | _KY_ | Thanks a lot... it reduced a lot of indents =) |
| 02:12 | leo2007 | mdeboard: no |
| 02:12 | leo2007 | mdeboard: but i never used java |
| 02:14 | _KY_ | I did (let [answer (first lazy-seq)] ..., does it ensure the first element is evaluated and stored as answer? |
| 02:15 | amalloy | indeed |
| 02:16 | _KY_ | I mean "my-lazy-seq" |
| 02:17 | _KY_ | Ok=) |
| 02:22 | mlozano | just saw the clojuredocs.org reference ... would be nice to see it on: http://dochub.io/ |
| 02:22 | mlozano | perhaps I should get on that |
| 02:23 | wei_ | how would I rewrite this java snippet in Clojure? new TrustManager[] { tm } |
| 02:24 | mlozano | cshell ... clever |
| 02:24 | wei_ | more context: I'm translating this to clojure https://gist.github.com/2600263 |
| 02:26 | noidi_ | wei_, (into-array [tm]) |
| 02:26 | noidi_ | ,(doc into-array) |
| 02:26 | clojurebot | "([aseq] [type aseq]); Returns an array with components set to the values in aseq. The array's component type is type if provided, or the type of the first value in aseq if present, or Object. All values in aseq must be compatible with the component type. Class objects for the primitive types can be obtained using, e.g., Integer/TYPE." |
| 03:09 | muhoo | is there any way to get just the top level of a tree? |
| 03:09 | _KY_ | Maybe (first tree)? |
| 03:09 | Raynes | A ladder. |
| 03:10 | Raynes | Thank's folks, I'm here all week. |
| 03:10 | _KY_ | I'm trying to (catch java.util.concurrent.CancellationException every) but it doesn't work, any idea? |
| 03:11 | _KY_ | s/every/e |
| 03:12 | wei_ | noidi_: thanks, that worked |
| 03:15 | wei_ | Could you help me figure out where this IllegalAccessError is coming from? The stacktrace isn't being very helpful: https://gist.github.com/2600542 |
| 03:16 | _KY_ | (Oh I found out it's something else throwing the exception...) |
| 03:16 | muhoo | i think the magic answer is "breadth first", however, not sure how to do that in clojure yet |
| 03:16 | mlozano1 | Oh has lots of arguments |
| 03:21 | noidi_ | wei_, perhaps the class IOConnection has private or default (package private) visibility? |
| 03:23 | noidi_ | or maybe the method setDefaultSSLSocketFactory is private/protected |
| 03:25 | wei_ | oh, you're right! there was another (public) class to access it from |
| 03:30 | _KY_ | ,(doc ~) |
| 03:30 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )> |
| 03:32 | amalloy | muhoo: i think the first thing you have to do is decide/define what you mean by (a) tree, and (b) "just the top level" |
| 03:33 | amalloy | eg, if the tree is a seq of seqs, such as (a (b c) (d (e f))), then the top level is the whole tree |
| 03:35 | _KY_ | (I see... ~ is unquote) |
| 03:38 | amalloy | or if each node is a pair, [value children], then the top level is just (first tree), and the second level is (map first (second tree)), and so on |
| 03:54 | muhoo | amalloy: ah, thanks |
| 03:55 | amalloy | i practically went to a special school just for complaining the problem is ill-defined |
| 03:56 | amalloy | so gimme a call if you need me to do that |
| 05:18 | muhoo | Raynes: https://www.refheap.com/paste/2577 ahem www |
| 05:19 | muhoo | amalloy: this is what i was on after: https://www.refheap.com/paste/2578 |
| 05:22 | muhoo | that's for a vector-zip |
| 05:31 | Raynes | muhoo: ...? |
| 05:32 | Raynes | muhoo: The forced www is on purpose. |
| 05:32 | Raynes | muhoo: https://devcenter.heroku.com/articles/avoiding-naked-domains-dns-arecords |
| 05:33 | muhoo | i know, i patched refheap.el to use www |
| 05:33 | Raynes | Oh. |
| 05:33 | Raynes | See, I didn't actually look at the paste. |
| 05:33 | Raynes | Bahaha. |
| 05:33 | muhoo | if i cover my eyes, then you can't see me |
| 05:34 | Raynes | muhoo: Want something to do? |
| 05:34 | Raynes | Not necessarily now, but perhaps when you're bored. |
| 05:36 | Raynes | muhoo: https://github.com/Raynes/refheap/wiki/Documentation:-API Under the /paste docs, look at the 'language' param. It can take a file extension. Your mission should you chose to accept it is to remove all of the mode detection crap (that association list) in refheap.el and just pass along the extension to refheap as per the docs. Should be easy. For added difficulty, handle modes that don't have an extension specially using a much smaller association |
| 05:37 | Raynes | I'll add the www to refheap.el in the morning. Me go nitenite. |
| 06:22 | _KY_ | I call empty? on a lazy seq it got an error, why? |
| 06:23 | noidi_ | has anyone built counterclockwise from source recently? |
| 06:23 | AimHere | What error, _KY_? |
| 06:24 | _KY_ | Don't know how to create ISeq from: java.lang.Boolean |
| 06:24 | noidi_ | I'm trying to set up an environment for hacking on CCW, but these instructions seem to be quite a bit out of date https://code.google.com/p/counterclockwise/wiki/HowToBuild |
| 06:24 | AimHere | You sure the thing you're calling empty? on is a sequence? |
| 06:25 | _KY_ | Yes |
| 06:25 | _KY_ | type is clojure.lang.LazySeq |
| 06:25 | AimHere | What's likely to have happened is either you're passing a boolean value instead of a sequence to empty, or you're attempting to use the result of (empty?...) as a sequence |
| 06:26 | noidi_ | I do get CCW building with those instructions, but they use the compilation-deps branch of the CCW repository, whereas the latest releases of CCW seem to be tagged from the master branch |
| 06:26 | Licenser | Or the thing that handles what comes out of empty? is trying to handle a seq? |
| 06:27 | Borkdude | I'm wondering, I use noir 1.2.0 as a dependency and also clojure 1.2.0. On OSX lein downloads clojure 1.2.1 and in my XP virtual machine clojure 1.3.0. |
| 06:27 | AimHere | I think I already said that, but maybe it needs saying twice ;) |
| 06:40 | muhoo | wow. it's taken me 10 hours today to understand clojure.zip, and i think i've just about got it. |
| 06:40 | muhoo | must. sleep. now. |
| 06:41 | Licenser | hey people I've a off topic question: What browser do you use, FF is starting to piss me off, being slow as hell and crashing reagularily just because I've a few dozent tabs open :( |
| 06:42 | bradwright | Chrome |
| 06:43 | Licenser | bradwright is it worht it? |
| 06:43 | fliebel | Safari |
| 06:46 | Licenser | now I need a third person saying safari or chrome so I can get an vote that isn't balanced :P |
| 06:46 | Licenser | great tahnk you |
| 06:46 | Licenser | :P |
| 06:46 | piecyk | chrome! :P |
| 06:47 | Licenser | piecyk thank you! you saved my day :) |
| 06:48 | Licenser | bradwright fliebel thanks for your oppinions |
| 06:50 | bradwright | I find Chrome to be very stable with lots of tabs |
| 06:50 | bradwright | Less RAM hungry than Firefox as well |
| 07:03 | _KY_ | Does my REPL have trace built in? |
| 07:03 | _KY_ | It's just clojure-1.3.0 |
| 07:23 | bobry | is it allright to ask clojure-script related questions here? |
| 07:25 | AimHere | Yes |
| 07:29 | _KY_ | How can I create a lazy sequence from a function? |
| 07:30 | _KY_ | Suppose the function returns 1,2,3,4,... on each successive call |
| 07:47 | Borkdude | _KV_ : http://clojuredocs.org/clojure_core/clojure.core/lazy-seq |
| 07:51 | _KY_ | But I have a function that returns values, not a seq initially |
| 07:53 | Borkdude | ah, then you need a closure |
| 07:53 | raek | _KY_: is the seq infinite? |
| 07:53 | Borkdude | (let [counter (atom 0)] (fn [] (swap! counter inc) @counter)) |
| 07:53 | _KY_ | Let's say the function is "take" |
| 07:53 | _KY_ | (take) ==> 1 |
| 07:54 | _KY_ | (take) ==> 2 |
| 07:54 | _KY_ | And so on... |
| 07:54 | raek | well, there's 'repeatedly' |
| 07:54 | Borkdude | _KY_ try my function |
| 07:54 | raek | ,(repeatedly #(rand-int 10)) |
| 07:54 | _KY_ | I see... |
| 07:54 | clojurebot | (8 3 2 2 7 ...) |
| 07:55 | Borkdude | _KY_K: http://cljbin.com/paste/4fa512c7e4b018b49dfc3fc6 |
| 07:55 | raek | but if you want it to end, you need to write a function that returns the lazy seq |
| 07:56 | _KY_ | Can I write (repeatedly (my-func)) and get a lazy seq? |
| 07:56 | AimHere | "repeatedly", and "iterate" turn functions into sequence |
| 07:56 | raek | _KY_: (repeatedly my-func) |
| 07:56 | raek | returns a lazy-seq that will call my-func to generate each element (on demand) |
| 07:57 | Borkdude | _KY_ I guess so, but why would you do it this way… (range) already represents a lazy list of integers |
| 07:57 | _KY_ | Ahhh works now =) |
| 07:57 | _KY_ | I have a special my-func... that must be used |
| 07:57 | Borkdude | _KY_ for side effects? |
| 07:58 | _KY_ | Yes it changes its output every time it's called |
| 07:58 | AimHere | Whatever you're doing sounds a tad nonidiomatic ;) |
| 08:00 | Borkdude | grrr. now Eclipse ccw doesn't even start a repl anymore, it's driving me crazy :( |
| 08:11 | _KY_ | AimHere: I'm calling some java library that returns external stuff |
| 08:13 | leo2007 | is there a fork of swank-clojure that fixes issues in fuzzy completion? |
| 08:16 | raek | _KY_: https://gist.github.com/2601906 |
| 08:17 | raek | this is an example on how to implement a finite lazy-seq backed by a stateful java object |
| 08:19 | _KY_ | Thanks.. but "repeatedly" answered my needs already =) |
| 08:19 | _KY_ | There is fuzzy completion? |
| 08:19 | _KY_ | Sounds very sophisticated =) |
| 08:22 | leo2007 | it is broken |
| 08:22 | raek | leo2007: is there an issue for it? |
| 08:23 | Borkdude | I am supposed to do a "run as clojure application (preload file)" before I can do a "load file in REPL" in ccw 0.8? |
| 08:24 | Borkdude | cemerick: poke |
| 08:25 | leo2007 | raek: a few |
| 08:28 | cemerick | Borkdude: hrm? |
| 08:29 | Borkdude | see question before the poke |
| 08:29 | Borkdude | cemerick: see question before the poke… when I do "load file in REPL" there not a REPL coming up anymore |
| 08:30 | Borkdude | cemerick: Run As> Clojure (preload file) still works though |
| 08:34 | Borkdude | cemerick: I still haven't got leiningen support working, installed completely new eclipse, new workspace, etc… it works in my Windows XP VM though |
| 08:34 | Borkdude | cemerick: for now I'm giving up, don't know what is causing this wonkyness… :( |
| 08:37 | cemerick | Borkdude: loading a file to start a REPL works here |
| 08:38 | cemerick | I think you have something well-horked in your environment. Too many unrelated (and changing) issues…there can't be that many bugs in the world! ;-) |
| 08:40 | cshell | wow, this feels like deja vu - the same conversation 24 hours later - thought something was messed up with my irc client ;) |
| 08:44 | Borkdude | cshell: this totally means I've spend too much time on this now |
| 09:00 | cshell | Borkdude: You could switch to Intellij :) |
| 09:01 | Borkdude | cshell: I was using emacs before, the reason I'm using eclipse is because my students are more familiar with it |
| 09:02 | Borkdude | cshell: I like it though, except for this quirky behavior I'm getting |
| 09:02 | cshell | Borkdude: Understandable - were you ever able to get lein to run from the command line? |
| 09:02 | Borkdude | cshell: yes, works great |
| 09:03 | Borkdude | cshell: with lein2 I'm now also able to connect to an nrepl that was started from eclipse, nice feature |
| 09:03 | cshell | cshell: that is cool, I didn't know that |
| 09:43 | Borkdude | can you destructure on a map of which you expect only one key-value pair, but don't know the keyname? |
| 09:44 | Borkdude | something like this: (let [[k v] {:b12 \X}] k), but then something that works |
| 09:45 | gfredericks | &(let [[k v] (seq {3 4})] [k v]) |
| 09:45 | lazybot | ⇒ [[3 4] nil] |
| 09:45 | gfredericks | oop |
| 09:45 | gfredericks | &(let [[[k v]] (seq {3 4})] [k v]) |
| 09:45 | lazybot | ⇒ [3 4] |
| 09:45 | gfredericks | there it go |
| 09:46 | gfredericks | so if you wanted something slicker than that then I think the answer is no |
| 09:46 | Borkdude | gfredericks: yes, but one cannot use this in a function I assume, because you need to wrap the map in a seq first? |
| 09:46 | gfredericks | ah ha |
| 09:46 | gfredericks | righto |
| 09:46 | gfredericks | yeah no way to do that; you have to admit it's a weird use of maps |
| 09:46 | gfredericks | not very mappy |
| 09:46 | Borkdude | gfredericks: I admit |
| 09:48 | Borkdude | gfredericks: reason why I ask is this function: https://github.com/Borkdude/tictactoe/blob/master/src/tictactoe/views/tictactoe.clj#L52 |
| 09:48 | Borkdude | gfredericks: it always expects a map with only one key, actually I'm only interested in the key, not even the value |
| 09:50 | gfredericks | oh it's a form with a bunch of submit buttons? |
| 09:50 | Borkdude | gfredericks: right, and each submit button has a unique id |
| 09:50 | Borkdude | gfredericks: which I'm decoding in this function, to discover which one has been pressed |
| 09:52 | gfredericks | Borkdude: I guess the only alternative I could suggest is use a separate form (and route) for each button |
| 09:53 | Borkdude | gfredericks: I'll stick with this then |
| 10:30 | natsu | hi. i am a newbie trying to set up leiningen on my machine. i am using windows 7. |
| 10:32 | natsu | trying to run lein gives me this error: http://pastebin.com/7Zs2x84y. i tried with both cmd and cygwin. |
| 10:33 | TimMc | &(let [[[k v]] {3 4}] [k v]) |
| 10:33 | lazybot | java.lang.UnsupportedOperationException: nth not supported on this type: PersistentArrayMap |
| 10:33 | TimMc | Aha. |
| 10:36 | _KY_ | Can I use NetBeans to open a project created by lein? how? |
| 10:42 | jondot1 | hi all. what is a commonly used documentation guideline with clojure? |
| 10:42 | jondot1 | such that I can also generate documentation from |
| 10:44 | TimMc | jondot1: Docstrings. Everywhere. |
| 10:44 | TimMc | You can't go wrong with that. |
| 10:45 | jondot1 | would that be the equivalent of, say, Ruby's tomdoc? |
| 10:45 | TimMc | No idea. |
| 10:45 | TimMc | Beyond that, each doc-generation is going to have some guidelines of its own. Marginalia, for instance, mixes in all the top-level code comments. |
| 10:45 | raek | natsu: which version of lein are you installing? |
| 10:46 | raek | natsu: have you run `lein self-install` |
| 10:46 | dnolen | mmarczyk: ping? |
| 10:48 | natsu | raek: thanks for the response. this should answer the q's. |
| 10:48 | natsu | raek: lein self-install "$home\.lein\self-installs\leiningen-2.0.0-preview3-standalone.jar" already exists. Delete and retry. |
| 10:55 | raek | natsu: can you verify that that file is actually a jar file? you should be able to open it as a zip file. |
| 10:55 | natsu | raek: yes it is. even extracted it. |
| 10:55 | raek | ok, weird |
| 10:57 | raek | natsu: have you tried installiing it through the shell script (rather than the windows batch file) in cygwin? |
| 10:58 | natsu | raek: yes. same issues. :( |
| 10:59 | raek | have you tried the stable 1.7.1 version? |
| 11:00 | raek | also, does your home directory path contain spaces or non-ascii characters? |
| 11:01 | raek | natsu: one thing you could check is whether %HOMEPATH% points the place there the .lein directory is |
| 11:02 | raek | this could be an issue with environment variables |
| 11:02 | natsu | yes it does. |
| 11:03 | raek | but you got the exact same error with both lein.bat in cmd and lein in cygwin? |
| 11:04 | natsu | raek: yes |
| 11:04 | natsu | lein command gives this error |
| 11:04 | natsu | F:\Compilers, libraries, and IDEs>lein Exception in thread "main" java.lang.NoClassDefFoundError: Files\Java\jre6\lib\ext\QTJava/zip;F:\Compilers, Caused by: java.lang.ClassNotFoundException: Files\Java\jre6\lib\ext\QTJava.zip;F:\Compilers, |
| 11:05 | natsu | doesnt seem to be handling whitespaces properly. |
| 11:06 | raek | natsu: have you installed QT bindings for Java? |
| 11:07 | natsu | raek: yeah the zip is there on the path. |
| 11:07 | raek | I think the installer for the Java QT bindings did something wrong |
| 11:08 | raek | natsu: is there a CLASSPATH env variable or someting that have these paths in it? |
| 11:08 | natsu | there is a qtjava variable, set to: C:\Program Files\Java\jre6\lib\ext\QTJava.zip |
| 11:09 | raek | I think some env variable has ...;C:\Program Files\Java\jre6\lib\ext\QTJava/zip;... in it where it should have ...;"C:\Program Files\Java\jre6\lib\ext\QTJava/zip";... |
| 11:09 | raek | natsu: try adding quotes around the value of that env variable |
| 11:11 | natsu | raek: tried. doesnt work. |
| 11:17 | natsu | raek: putting classpath variable in quotes made it work. (cfa suggested that.) thanks so much! |
| 11:22 | raek | natsu: to summarize, this was not a Leiningen issue. the lein script uses whatever classpath your system has (which contained an error introduced by QT for Java in your case) |
| 11:23 | natsu | raek: no other classpaths have quotes around them. this one didnt either. |
| 11:26 | raek | hrm |
| 11:30 | jondot1 | cemerick/friend take on warden is really interesting |
| 12:19 | yoklov | its sort of annoying that things need to be namespace qualified to use derive |
| 12:25 | lynaghk | Any emacs wizards have a suggestion on how to delete trailing whitespace in my buffer except in docstrings? |
| 12:36 | yoklov | lynaghk: does whitespace-cleanup end up applying to docstrings? |
| 12:37 | lynaghk | yoklov: yep. |
| 12:37 | yoklov | damn. |
| 12:38 | lynaghk | I know next to nothing about elisp. Someone in #emacs suggested just looping and checking the font-face at each line to see if I'm inside a string. |
| 12:38 | yoklov | ouch |
| 12:38 | lynaghk | Seems like a good enough plan for me. |
| 12:39 | yoklov | still is a pain and seems a bit kludgey |
| 12:40 | yoklov | at least, you'll end up implementing part of whitespace-cleanup |
| 12:40 | lynaghk | yoklov: I'm pretty sure most of what's inside emacs is pain and kludge. |
| 12:43 | yoklov | haha, yeah, there's always the possibility that that's the most idiomatic way to do it |
| 12:43 | yoklov | or something. |
| 12:59 | samrat | hi, is anyone else here using vimclojure? \eb doesn't seem to be working for me.. don't know why |
| 13:02 | samrat | I was watching cemerick's 'Starting Clojure' screencast and wondering if it would be possible to set up an environment similar to Eclipse's on Vim. Any alternatives to just copy..pasting each time to the REPL? |
| 13:46 | ibdknox | I'm adding data-binding to crate :) |
| 13:54 | yoklov | data binding? |
| 13:55 | yoklov | ibdknox: like http://en.wikipedia.org/wiki/Data_binding or something else? |
| 13:56 | ibdknox | yoklov: for example (defpartial t-html [v] [:p (bound v identity)]) |
| 13:56 | ibdknox | assuming v is an atom |
| 13:56 | ibdknox | anytime the atom's value is changed |
| 13:57 | ibdknox | the text of that paragraph tag will too |
| 13:57 | yoklov | thats pretty awesome. |
| 13:57 | ibdknox | not through re-rendering but throw attribute manipulation |
| 13:57 | ibdknox | I'm adding it for styles and normal attrs now |
| 13:57 | ibdknox | so you'll be able to do |
| 13:58 | ibdknox | [:p {:class (bound v my-class-maker)} (bound v text-getter)] |
| 13:58 | ibdknox | and everything will just be magic :) |
| 13:58 | yoklov | yeah, thats pretty awesome |
| 13:58 | yoklov | and relevant to what i'm doing :) |
| 13:58 | ibdknox | me too |
| 13:58 | ibdknox | lol |
| 13:59 | yoklov | sort of not that far from FRP i think either |
| 13:59 | yoklov | but yeah that's really quite awesome. |
| 14:00 | ibdknox | it's surprisingly easy to add |
| 14:00 | yoklov | yeah? |
| 14:01 | ibdknox | yeah |
| 14:01 | ibdknox | 40 lines? |
| 14:01 | ibdknox | maybe |
| 14:01 | yoklov | wow |
| 14:01 | ibdknox | working with actual dom objects instead of strings = huge win |
| 14:02 | yoklov | makes sense |
| 14:10 | lynaghk` | ibdknox: people will explicitly pass in things implementing IWatchable and you'll handle updating attributes for them? |
| 14:11 | ibdknox | I made my own protocol because I needed a value function |
| 14:11 | ibdknox | but yes |
| 14:11 | ibdknox | more or less :) |
| 14:11 | lynaghk` | What about when the values are transformed in the view |
| 14:11 | ibdknox | what do you mean? |
| 14:11 | lynaghk` | e.g. {:background-color (color-scale v)} |
| 14:12 | lynaghk` | that's what I'm hung up on. For what I'd like to do, explicitly doing all transforms in advance is pulling apart the view logic too much. |
| 14:12 | ibdknox | it would be written as {:background-color (bound v color-scale) |
| 14:12 | ibdknox | } |
| 14:13 | ibdknox | you pass the value generating function |
| 14:13 | ibdknox | which gives you lots of freedom |
| 14:13 | lynaghk` | I was wondering if there'd be a way to make the bindings implict |
| 14:13 | ibdknox | maybe |
| 14:13 | ibdknox | I don't mind them being explicit right now :) |
| 14:13 | lynaghk` | via some kind of macroexpansion that walks the hiccup vector and wraps forms that contain IWatchables |
| 14:13 | ibdknox | I thought about it |
| 14:14 | ibdknox | but you'd need to know that at compile time, I didn't know that information was available |
| 14:14 | lynaghk` | yeah, that's the biggie. |
| 14:14 | lynaghk` | well, that and macro-black-magic. |
| 14:14 | ibdknox | yeah |
| 14:15 | lynaghk` | So you are planning to maintain and extend Crate? |
| 14:16 | ibdknox | yeah, I need it for Light Table |
| 14:16 | lynaghk` | I'd like to be able to rip the DOM manipulation stuff out of C2 and rely on another CLJS DOM library |
| 14:16 | ibdknox | well crate is only dom creation really |
| 14:16 | ibdknox | and now this binding stuff |
| 14:17 | ibdknox | doesn't include things like append |
| 14:17 | lynaghk` | how do people use their newly created doms? |
| 14:18 | ibdknox | I use jayq |
| 14:18 | lynaghk` | oh, so crate actually renders into the html string? |
| 14:18 | lynaghk` | or do you return live detached DOM nodes? |
| 14:19 | ibdknox | live detached dom nods |
| 14:19 | ibdknox | nodes* |
| 14:20 | lynaghk` | is this binding stuff pushed anywhere public? |
| 14:20 | ibdknox | one difference from what you want I think though is that I'm making the assumption of atoms all the way down |
| 14:20 | ibdknox | right now |
| 14:21 | ibdknox | but that's just because I implemented it in the past 30 minutes |
| 14:21 | ibdknox | and sure, let me push it |
| 14:22 | ibdknox | lynaghk`: yoklov: https://github.com/ibdknox/crate/commit/0f1aae63afeda370af944082775f339af8e943ab |
| 14:24 | lynaghk` | ibdknox: you can use gensym if you need unique ids, btw. |
| 14:24 | ibdknox | ah |
| 14:24 | ibdknox | that's a good idea |
| 14:24 | ibdknox | the add-watch keying is kind of annoying |
| 14:24 | ibdknox | nice when you need it |
| 14:24 | lynaghk` | I learned about it the first time I tried to have two C2 visualizations watching the same atom and one clobbered the other's watcher = ) |
| 14:25 | ibdknox | yeaaah |
| 14:25 | lynaghk` | Why bindable protocol? If you need value you can extend ideref and then get to use @ |
| 14:26 | ibdknox | I dunno, I guess I could, but for some reason I prefer that bits of functionality are grouped when it comes to these things. In this case it's implement one protocol, in that case it's implement two seemingly unrelated ones |
| 14:26 | ibdknox | I don't have a strong argument either way |
| 14:27 | lynaghk` | Chris, Stuart Halloway sheds a tear for every new method you add to a protocol. You know that. |
| 14:27 | ibdknox | lol |
| 14:31 | ibdknox | the thing that's hard to sort of deal with (and what I think you *did* solve) is a single atom with collections in it |
| 14:32 | ibdknox | the way this works right now the outer collection would need to be an atom as well |
| 14:32 | ibdknox | and it's not doing diffing |
| 14:33 | ibdknox | so there's definitely more work to be done to be more idiomatic - this feels backboney |
| 14:34 | lynaghk` | ibdknox: hmm, so if I'm reading this correctly you are creating a closure for each element and bindable attribute |
| 14:34 | ibdknox | yes |
| 14:34 | lynaghk` | so after it has been rendered all of the pieces take care of themselves. |
| 14:34 | ibdknox | yup |
| 14:35 | lynaghk` | that's in contrast to what I do in C2, which is walk the existing DOM nodes and update if the live dom nodes and their attributes don't match the hiccup representation |
| 14:35 | ibdknox | yep |
| 14:35 | ibdknox | I think how I did it is how it is traditionally implemented |
| 14:35 | ibdknox | buuut |
| 14:35 | lynaghk` | I suspect your version is more performant, but it may be less general w.r.t. mapping a collection to a collection of nodes |
| 14:36 | ibdknox | yeah, like I was saying it suggests a more un-clojurish way of keeping your data |
| 14:36 | ibdknox | I don't usually have collections of atoms |
| 14:36 | ibdknox | I have an atom with collections in it |
| 14:37 | lynaghk` | Right, and it looks like there's no way to match existing nodes with logical nodes. |
| 14:38 | ibdknox | yeah, there's no coordinating piece. Usually there isn't |
| 14:39 | ibdknox | we tried building the coordinating piece into backbone at RFZ |
| 14:39 | ibdknox | worst mistake we made |
| 14:39 | ibdknox | should've handled it the way it was meant to be |
| 14:39 | lynaghk` | What do you mean coordinating? |
| 14:39 | yoklov | yeah, I had been wondering about the atom of collection vs collection of atoms thing |
| 14:39 | lynaghk` | syncing collections with collections of dom nodes? |
| 14:40 | ibdknox | lynaghk`: more or less. Basically if you have inner parts of the collection that can change, not treating them as self-contained ends up a mess as things grow |
| 14:40 | ibdknox | and it's very slow |
| 14:40 | ibdknox | but our data was structured that way |
| 14:41 | ibdknox | we worked on a collection of things and changed within it, not on individuals that changed |
| 14:41 | ibdknox | unfortunately that worked very poorly for UI |
| 14:42 | lynaghk` | ibdknox: that sounds about right---trying to sync nested collections is probably going to be confusing/slow. |
| 14:42 | ibdknox | so one way to handle this |
| 14:42 | ibdknox | would be to have sub-bindings |
| 14:43 | ibdknox | I think you can effectively simulate the same thing if you use those |
| 14:43 | ibdknox | but I haven't thought through it long enough |
| 14:44 | lynaghk` | well if you need an excuse to come visit sunny sunny Portland and do some thinking over beers, let me know. |
| 14:44 | ibdknox | :) |
| 14:44 | ibdknox | I'll probably take you up on it at some point |
| 14:44 | lynaghk` | ibdknox: actually, I'm going to be down at Stanford May 15--17 if you want to grab lunch or something. |
| 14:45 | ibdknox | That might work, what are you heading down there for? |
| 14:45 | lynaghk` | lil' holiday, pretty much. visiting a friend of mine at the business school there |
| 14:46 | ibdknox | ah nice |
| 14:54 | lynaghk` | ibdknox: well, I'll do some more thinking on this stuff; it sounds like we're working on similar problems. Since DOM <-> data binding is orthogonal to grab-bag-of-datavis-helpers, it'd be cool if we could factor out a shared solution. |
| 15:11 | Frozenlock | I'm using a piped input/outputstream. When I'm sending something too big (which really isn't that big), it hangs. Is there something more I need to do? Use buffered stream or something like that? |
| 15:11 | xeqi | Frozenlock: are you writing on a different thread? |
| 15:11 | Raynes | http://pledgie.com/campaigns/17303 Working on raising a little money to support refheap for the next year. Any contributions are much appreciated. |
| 15:12 | Frozenlock | Brb |
| 15:13 | muhoo | Raynes: been thinking about this emacs mode business: it's better to have it choose lang by mode than file extension, since it's common to have buffers with no file |
| 15:13 | muhoo | esepcially for a one-off-thing i'd paste |
| 15:13 | Raynes | muhoo: That sounds fair. Thanks for thinking that through for me. |
| 15:13 | muhoo | maybe that assoc could move from the client to the server? |
| 15:13 | lynaghk` | Raynes: Keming Labs will cut you a cheque for that amount. Send me an email. |
| 15:14 | Frozenlock | xeqi: thank you so much, I've been trying to solve this for the last hour. A simple `future' call was all that was needed! |
| 15:14 | muhoo | if the api supported being fed an emacs-mode instead of extension or language, that massive assoc could be removed from refheap.el |
| 15:15 | Raynes | lynaghk`: Could you PM me an address? |
| 15:15 | dnolen | mmarczyk: ping? |
| 15:16 | lynaghk` | Raynes: ugghh I have no idea how to use emacs IRC. it's kevin at keminglabs dot com |
| 15:16 | Raynes | lynaghk`: Your query worked! |
| 15:16 | Raynes | You know more than you think apparently. |
| 15:16 | Raynes | :D |
| 15:18 | Cyrik | is there some way to implement a custom hashCode method on a record? |
| 15:18 | mmarczyk | dnolen: pong! |
| 15:19 | mmarczyk | dnolen: I'm seeing some fantastic perf w/ your new commits |
| 15:19 | mmarczyk | :-) |
| 15:20 | natsu | raek: the issue has popped up again. |
| 15:21 | natsu | raek: i believe it's a lein issue. https://github.com/technomancy/leiningen/issues/541 |
| 15:25 | Raynes | muhoo: The associations could be moved to the server, but Emacs modes are way to domain specific. |
| 15:25 | Raynes | muhoo: Mostly, we just need to make sure that the modes are in sync with the current language offering. |
| 15:25 | Raynes | I know that I have at least added Elixir to the languages recently, but Emacs doesn't have a mode for that... |
| 15:26 | natsu | raek: hmm. this worked: https://github.com/technomancy/leiningen/blob/1.x/bin/lein.bat. |
| 15:26 | Raynes | Because I can't get technomancy interested and he is the only person on the planet who knows how to write an emacs mode. |
| 15:27 | muhoo | hehehe |
| 15:27 | muhoo | i've never written one, but i've spelunked around in them |
| 15:28 | muhoo | ask on #emacs maybe |
| 15:29 | muhoo | as for the assocs, how would you want that? the client sends an emacs-mode as a field in the paste POST, and the server looks up basically the same table that is currently in refheap.el? |
| 15:29 | dnolen | marchdown: yes! |
| 15:29 | dnolen | oops |
| 15:29 | dnolen | mmarczyk: yes! |
| 15:30 | mmarczyk | :-) |
| 15:30 | mmarczyk | this is absolutely fabulous |
| 15:30 | gf3 | Raynes: Y U HAET CLJBIN |
| 15:30 | mmarczyk | the perf win on success (i.e. the thing satisfies the protocol) is somewhat larger than before *and* rather than a perf hit on failure there's actually a gain here too |
| 15:30 | mmarczyk | wjw. |
| 15:31 | Raynes | gf3: :p |
| 15:31 | gf3 | WHYYY |
| 15:31 | Raynes | gf3: Competition, bro. |
| 15:31 | Raynes | :) |
| 15:31 | dnolen | mmarczyk: yes, no loss for PV now :) |
| 15:31 | mmarczyk | :-) |
| 15:32 | lynaghk` | Raynes: don't you need to swap out that mongo nonsense for Datomic? |
| 15:32 | lynaghk` | so one-off pasties can LIVE FOREVER. |
| 15:32 | Raynes | lynaghk`: I'm looking into other databases. Not sure datomic would be my best option though. More damned expenses. |
| 15:33 | muhoo | Raynes: it's free for "development only" use, wink wink |
| 15:33 | Raynes | muhoo: Right, but you still have to pay for amazon crap, right? |
| 15:33 | muhoo | apparently there's a postgres back-end, which would prolly work nicely on heroku's free postgres db |
| 15:33 | lynaghk` | It's free for open source, yeah? But there's still the infrastructure overhead |
| 15:33 | Raynes | It is free for open source, indeed. |
| 15:34 | Raynes | If it works with postgres that would be an option. |
| 15:34 | mmarczyk | dnolen: so now I'm thinking about extending this to non-core protocols and extend-type |
| 15:34 | muhoo | there are a few back-ends. one in-memory, a flat file IIRC, a postgres "development only" backend, then that amazon stuff for "production" |
| 15:34 | Raynes | I actually applied for refheap a while back but never went completely through with the sign up. |
| 15:34 | muhoo | i really want to play with datomic, but atm i'm deep in couchdb land |
| 15:34 | mmarczyk | dnolen: in general, it's not a problem to arrange things so that instances of Bar created after (extend-protocol IFoo Bar ...) get the correct bit mask |
| 15:36 | mmarczyk | hm... |
| 15:36 | Raynes | Yay! Pledgie closed. |
| 15:37 | mmarczyk | Raynes: pledgie? |
| 15:38 | Raynes | mmarczyk: http://pledgie.com/campaigns/17303 |
| 15:38 | Raynes | I was raising money for refheap hosting over the next year. |
| 15:38 | Cyrik | is there some way to implement a custom hashCode method on a record? |
| 15:38 | eggsby | so core.match works well w/ cljs? |
| 15:38 | brainproxy | dnolen: good news .. I've got node-clojurescript working for the most part |
| 15:38 | muhoo | gf3: lol https://github.com/gf3/CLJBIN/commit/2bd5b5b2854d0f926da9b114334929668efbe129 |
| 15:38 | mmarczyk | Raynes: wow, cool! |
| 15:39 | gf3 | muhoo: THE WORST |
| 15:40 | gf3 | muhoo: Also I'm sure most of my code is not idiomatic, feel free to correct me |
| 15:41 | muhoo | the code is fine, the comment was funny. i've been bitten by that too |
| 15:43 | Cr8 | Raynes:.. that didn't take long =D |
| 15:44 | Raynes | Cr8: Well, lynaghk` just offered me the whole original goal… so… yeah, didn't take long. :p |
| 15:44 | dnolen | mmarczyk: yes tho I think adding the bit mask later is a minor optimization |
| 15:44 | Cr8 | ah |
| 15:44 | dnolen | mmarczyk: for dynamic stuff like that going up the prototype chain isn't so bad. |
| 15:44 | dnolen | mmarczyk: I'm mostly interested in speed up core here. |
| 15:44 | dnolen | mmarczyk: been thinking more about EmptyList being it's own type and ASeq |
| 15:45 | dnolen | mmarczyk: to speed up cljs.core.seq |
| 15:45 | mmarczyk | dnolen: well, it would also mean that non-inline impls of core protocols would get a speedup for new instances |
| 15:46 | dnolen | mmarczyk: yes I'm not saying that's not worth pursuing - just more interested in tackling the bigger benefits for everyone. |
| 15:46 | mmarczyk | dnolen: sure |
| 15:50 | dnolen | mmarczyk: one optimization I'm curious about |
| 15:50 | dnolen | mmarczyk: which you mentioned - protocol bit test in protocol dispatch |
| 15:50 | mmarczyk | dnolen: yes |
| 15:51 | dnolen | mmarczyk: if bit test passed, called protocol dispatch directly, instead of testing property existence |
| 15:51 | mmarczyk | dnolen: exactly |
| 15:51 | dnolen | mmarczyk: I'm not sure how much of a boost that will reveal. |
| 15:57 | mmarczyk | dnolen: I'm thinking about splitting -methods into "direct" part and "native/default" part and calling the "direct" part without any checks -- no nil check, no property existence check -- for types/records w/ their own (non-default) impls of the protocol |
| 15:58 | mmarczyk | dnolen: that would require a completely different approach to calling -methods -- basically noone should do it anymore except in places like the proto impls themselves, where the types are known / have otherwise been checked for |
| 16:00 | mmarczyk | dnolen: then satisfies? would be sort of insufficient in that it doesn't provide any insight into "how" a thing satisfies a protocol -- so there could be a separate check for that or a version of satisfies? returning one of a handful "marker objects" (for comparisons with identical?), say, to indicate "satisfies with own impl", "satisfies as a native JS type", "satisfies with default impl", "does not satisfy" |
| 16:00 | mmarczyk | dnolen: ...and all of a sudden this seems somewhat complicated... |
| 16:01 | dnolen | mmarczyk: yeah I'm not sure about that. |
| 16:01 | Guest2000 | hello all. a dumb question... why => (binding |
| 16:01 | Guest2000 | [*invocation-user-mandant* "test"] |
| 16:01 | Guest2000 | (map (fn [_] *invocation-user-mandant*) '(1 2 3))) |
| 16:01 | Guest2000 | returns (nil nil nil) instead of (test test test)? |
| 16:01 | mmarczyk | dnolen: could introduce enough overhead to defeat the purpose :-/ |
| 16:01 | Guest2000 | i mean - instead of ("test" "test" "test") |
| 16:01 | mmarczyk | dnolen: alternatively -methods could take a flag meaning "assume direct call will work" and check that first |
| 16:02 | mmarczyk | dnolen: should expect true iff the thing is a type/record with own impl |
| 16:02 | dnolen | mmarczyk: I've thought about this approach as well |
| 16:02 | dnolen | mmarczyk: one problem is checking native JS types |
| 16:03 | mmarczyk | dnolen: we're not going to find bit masks on those |
| 16:03 | mmarczyk | dnolen: so the flag would be false and dispatch would proceed as it currently does (well, hopefully with some other optimizations) |
| 16:04 | dnolen | mmarczyk: this stuff is worth exploring but probably in a branch off rt-cljs |
| 16:04 | mmarczyk | dnolen: right |
| 16:05 | dnolen | mmarczyk: I'd like to get rt-cljs in a spot where we're pretty happy w/ it's perf compared to master and merge it in. |
| 16:05 | dnolen | mmarczyk: it's already pretty close I think. |
| 16:05 | mmarczyk | dnolen: I think it is great as it is |
| 16:06 | mmarczyk | dnolen: clear win all around |
| 16:06 | dnolen | mmarczyk: is the partition stuff just working? |
| 16:06 | mmarczyk | dnolen: I think it should, core protocols only |
| 16:06 | mmarczyk | dnolen: did some sanity checks at the REPL |
| 16:06 | mmarczyk | dnolen: define a type with just 1 inline core proto impl |
| 16:06 | mmarczyk | dnolen: then extend-protocol some-other-core-protocol-form-same-partition to that type |
| 16:07 | mmarczyk | dnolen: happily, both protocols work |
| 16:07 | dnolen | mmarczyk: yes the bit test is a fast check, fall backs to the old thing otherwise. |
| 16:07 | Guest2000 | hello all. i need some help in understanding a weird thing... why |
| 16:07 | Guest2000 | (binding [*somevar* "test"] |
| 16:07 | Guest2000 | (map (fn [_] *somevar*) '(1 2 3))) |
| 16:07 | Guest2000 | returns (nil nil nil) instead of ("test" "test" "test") |
| 16:07 | Guest2000 | and |
| 16:07 | Guest2000 | (binding [*somevar* "test"] |
| 16:07 | Guest2000 | (println *somevar*) |
| 16:07 | mmarczyk | dnolen: right, and that does indeed work :-) |
| 16:07 | Guest2000 | prints of course as expected "test"? |
| 16:07 | Guest2000 | Can someone enlighten me? would be happy & thankfull for explanations and possible hints how to get the current binding of a var also INSIDE a map function |
| 16:07 | dnolen | mmarczyk: excellent well then I'm gonna merge it in! :) |
| 16:08 | mmarczyk | dnolen: hah! great :-) |
| 16:08 | mmarczyk | dnolen: before I dive into anything hairy, I'm going to play with next a bit |
| 16:08 | mmarczyk | dnolen: ILazySeq as marker interface for things next should explicitly call seq on, basically |
| 16:09 | mmarczyk | dnolen: (defn next [coll] (when coll (let [r (rest coll)] (if (satisfies? ILazySeq r) (seq r) r)))) or some such thing |
| 16:11 | dnolen | mmarczyk: pushed to master |
| 16:11 | mmarczyk | dnolen: cool! :-) |
| 16:14 | raek | Guest2000: map is lazy. the sequence is not forced until your repl prints it, which happens outside the dynamic scope of 'binding' |
| 16:14 | dnolen | mmarczyk: yeah, it seems to strange to me that first is >2X slower than -first |
| 16:15 | raek | Guest2000: you have to force the whole sequence within thr 'binding' form, for example like this: |
| 16:15 | raek | (binding [*somevar* "test"] |
| 16:15 | raek | (doall (map (fn [_] *somevar*) '(1 2 3)))) |
| 16:16 | raek | features that are based one dynamic scope (such as 'binding' and 'with-open') are easiest to use near the top level |
| 16:16 | ibdknox | dnolen: mmarczyk: it sounds like we're getting epic perf wins? |
| 16:16 | mmarczyk | dnolen: hm, is it? :-( |
| 16:17 | Guest2000 | raek - thank you a lot - forgot that part. without your help would have gazed for another 30mins at the screen lol - ty again! |
| 16:17 | dnolen | ibdknox: groundwork being laid |
| 16:17 | ibdknox | :) |
| 16:17 | mmarczyk | :-) |
| 16:18 | ibdknox | I dunno if you guys saw, I added data-binding to crate this morning |
| 16:18 | dnolen | mmarczyk: yeah, again I'm not sure if that can be avoided? |
| 16:19 | dnolen | mmarczyk: perhaps a simple fact of 2 fn calls not 1. |
| 16:19 | mmarczyk | ibdknox: hah! cool :-) |
| 16:19 | mmarczyk | dnolen: hm, with simple opts and static-fns |
| 16:20 | dnolen | mmarczyk: advanced opts |
| 16:30 | mmarczyk | dnolen: hm, yeah; I'm not seeing much difference on :simple, on :advanced -- a factor of 2x like you say |
| 16:31 | mmarczyk | dnolen: of course :simple is like 4.5x slower than :advanced for first (9x on -first -- wow?) |
| 16:34 | mmarczyk | dnolen: amazingly, satisfies? seems faster on :simple !? |
| 17:31 | Frozenlock | Any suggestion for a graph/network drawing library? (graphviz-like) |
| 17:33 | meiji11 | I don't know, loom? |
| 17:33 | meiji11 | I think loom uses graphviz to draw its graphs. |
| 17:35 | Frozenlock | Interesting. It requires to have graphviz on the path, but it's better than nothing. Thanks! |
| 17:35 | meiji11 | you're welcome. |
| 17:44 | johnfn | the "hot swapping" stuff with swank clojure seems nice and all in theory, but as soon as i make a single mistake the whole thing crashes, which kind of defeats the point. is there any way to make it more resilient? |
| 17:45 | yoklov | johnfn: hotswapping? |
| 17:45 | johnfn | i mean using ctrl+c ctrl+c to send in an updated version of a function |
| 17:46 | yoklov | ah, no clue, just was curious what you were referring to |
| 17:46 | johnfn | oh hmm. |
| 17:51 | Raynes | arohner: Oh man. Is this the lazy seq of pages tentacles users have pleaded with the old Gods for for so long? |
| 17:52 | arohner | Raynes: yes |
| 17:52 | Raynes | You are a gentleman and a scholar. |
| 17:53 | arohner | Raynes: glad to be of service |
| 17:55 | arohner | Raynes: will you be making a release, or should I make my own? |
| 17:56 | Raynes | arohner: I'll cut a release. One question: your oauth.clj commit has the word 'incomplete' in it. Do you just mean "some endpoints aren't here" or "these don't work properly"? |
| 17:56 | arohner | Raynes: some endpoints aren't there |
| 17:56 | arohner | I use those in my tests |
| 17:57 | Raynes | Okay. Are you okay with a 2.0-beta1 release until one of us gets around to adding the rest? I think Github is going to put search and repo deletion back into the API shortly too. |
| 17:57 | arohner | sure |
| 17:58 | Raynes | Great. One moment. |
| 18:00 | Raynes | arohner: 0.2.0-beta1 is now on clojars. |
| 18:00 | arohner | Raynes: thanks |
| 18:03 | technomancy | Raynes: elixir-mode exists already bro |
| 18:04 | Raynes | technomancy: Nope. |
| 18:04 | Raynes | technomancy: It exists for Elixir's old syntax which has radically changed. |
| 18:04 | technomancy | picky, picky |
| 18:04 | amalloy | they should try a more regular syntax |
| 18:05 | amalloy | maybe with parens or something |
| 18:05 | Raynes | It lives! |
| 18:25 | mlozano1 | was trying to write a good insertion sort for a list, does this seem reasonable? https://gist.github.com/2605926 |
| 18:37 | yoklov | mlozano1: insert is the same as cons, i think |
| 18:37 | yoklov | ,[(list 3) (cons 3 ())] |
| 18:37 | clojurebot | [(3) (3)] |
| 18:38 | yoklov | ,(= (conj () 3) (list 3)) |
| 18:38 | clojurebot | true |
| 18:39 | yoklov | mlozano1: i also think your lists will all end in 'nil' |
| 18:40 | yoklov | "(if (empty? lst) nil" should be "(if (empty? lst) ()" or "(if (empty? lst) lst" |
| 18:40 | yoklov | in scheme and common lisp lists end with nil (null in scheme), but that is not true in clojure |
| 18:41 | yoklov | also i don't think that will sort anything. |
| 18:41 | _KY_ | Can I use NetBeans to open a project created by lein? |
| 18:42 | yoklov | mlozano1: yeah, you don't ever actually sort the list. try instead of (first lst), something like (apply max lst) |
| 18:44 | yoklov | it often helps to write unit tests for your code, or to run some examples on it in the repl |
| 18:47 | amalloy | yoklov: clojure's lists end in nil in the same way that CL's and scheme's do |
| 18:47 | amalloy | &(cons 5 nil) |
| 18:47 | lazybot | ⇒ (5) |
| 18:47 | yoklov | really? |
| 18:47 | yoklov | hm |
| 18:48 | yoklov | ,(= () nil) |
| 18:48 | amalloy | ie, they don't have nil as an element |
| 18:48 | clojurebot | false |
| 18:48 | amalloy | but the last "element/next" pair is nil |
| 18:48 | yoklov | ,(rest '(1)) |
| 18:48 | clojurebot | () |
| 18:48 | yoklov | ,(next '(1)) |
| 18:48 | clojurebot | nil |
| 18:48 | yoklov | huh. |
| 18:49 | yoklov | i never know the difference between next and rest. in my mind rest is somehow lazier, so when i'm being lazy i use rest. other than that i just try not to count on their differences. |
| 18:51 | yoklov | regardless, i guess what i meant to say is that scheme and CL don't distinguish between nil/null and the empty list, whereas clojure does |
| 18:51 | yoklov | though his check there is okay |
| 18:52 | amalloy | (def next (comp seq rest)) |
| 18:52 | yoklov | really? |
| 18:52 | yoklov | _weird_ |
| 18:52 | amalloy | why is that weird? |
| 18:53 | yoklov | i would have thought that rest would work in terms of next, if anything |
| 18:53 | yoklov | dunno |
| 18:54 | gfredericks | &(next [3]) |
| 18:54 | lazybot | ⇒ nil |
| 18:55 | gfredericks | so next is the more eager one that actually probes the next element |
| 18:55 | gfredericks | while rest is the "lazier" one; thus rest could not be defined in terms of next |
| 18:55 | amalloy | i suppose it could do that. and the defns in clojure/core aren't actually written as (def next (comp seq rest)); that's just conceptually how they compare |
| 18:55 | amalloy | gfredericks: (defn rest [coll] (lazy-seq (next coll))) |
| 18:56 | yoklov | ^ thats how i thought it worked |
| 18:56 | amalloy | but i got halfway through typing out your argument myself before i realized i was wrong |
| 18:56 | amalloy | really they're both implemented in java |
| 18:57 | gfredericks | I am a foil used to increase the instructiveness of the conversation |
| 18:57 | yoklov | yeah |
| 18:57 | amalloy | ISeqs implement .next(), and .more() (which is just a weird name for rest) |
| 18:57 | yoklov | hm |
| 19:03 | devn | is there a reason why .more is used instead of .rest? |
| 19:03 | devn | or is that just a vestigial piece of clojure? |
| 19:10 | BostX | hi all |
| 19:13 | muhoo | i'm really enjoying this zipper thing http://clojuredocs.org/clojure_core/clojure.zip/zipper |
| 19:13 | BostX | guys, in my project.clj I set :dependencies [[org.clojure/clojure "1.4.0"]] but 'lein deps' gives me is no ~/.m2/repository/org/clojure/clojure/1.4.0/clojure-1.4.0.jar |
| 19:13 | BostX | do you know why? |
| 19:14 | Chousuke | devn: vestigial, yes |
| 19:14 | muhoo | took me a good 10 hours of struggle to get my brain around it, but now i find them very natural and fun to work with |
| 19:15 | muhoo | i have to ask, is it a code smell to have huge (let .... blocks that do most of the work, and only like 1 line of code outside the let? |
| 19:16 | johnfn | muhoo: i used to do that a lot, and im starting to think that it is. |
| 19:16 | johnfn | i dunno if i have a grasp on exactly what code smell means, but i feel like there's generally a more idiomatic way to do things |
| 19:17 | johnfn | muhoo: maybe you should paste some code |
| 19:19 | amalloy | i think it's fine, though i usually wind up with a number of nested lets/whens instead |
| 19:19 | amalloy | and i can see how your code would look that way when you're working with zippers |
| 19:21 | eggsby | Is anyone here familiar with congomongo? I'm having a weird issue: https://www.refheap.com/paste/2594 (or possibly I'm just confused) |
| 19:22 | amalloy | eggsby: i don't know what nuke-collection is, but i suspect it's lazy |
| 19:23 | amalloy | eg, perhaps (defn nuke [] (map destroy! (fetch...))) |
| 19:23 | amalloy | so when you evaluate it for side effects (as in a 'do), none of the elements are ever forced, and nothing happens |
| 19:24 | eggsby | ah |
| 19:24 | eggsby | ya that is what I'm doing.. mapping the destroy over the result of fetching the collection |
| 19:25 | muhoo | the biggest annoyance i have with zippers is it seems to proliferate NPE's |
| 19:25 | amalloy | mongo has a delete-the-whole-damn-thing function somewhere, though i don't know if congomongo exposes it other than through direct js interop |
| 19:26 | muhoo | if i screw up, it is not very nice about it. |
| 19:26 | eggsby | but why would the implementation being lazy cause 'nuke-collection' to never get called amalloy? |
| 19:27 | eggsby | amalloy: I'm actually just writing this to try to make tests, I don't think I'll ever really want to destroy my entire collection :) |
| 19:28 | johnfn | is there some sort of assoc-with-fn function |
| 19:28 | amalloy | &(doc update-in) |
| 19:28 | lazybot | ⇒ "([m [k & ks] f & args]); 'Updates' a value in a nested associative structure, where ks is a sequence of keys and f is a function that will take the old value and any supplied args and return the new value, and returns a new nested structure. If any levels do not exist, hash-maps will be created." |
| 19:28 | johnfn | aah, yeah that works |
| 19:28 | amalloy | eggsby: i think you should read some about how lazy sequences work. you create a lazy sequence representing your computations, but never realize any elements of it |
| 19:29 | amalloy | &(do (repeatedly #(println "OMGOMGOMG")) 1) |
| 19:29 | lazybot | ⇒ 1 |
| 19:29 | eggsby | right, until something needs the value of it for some computation |
| 19:29 | eggsby | I think I just misunderstand what do is for |
| 19:30 | replaca | eggsby: if you're trying to force the realization of a lazy seq, use doall not do |
| 19:31 | eggsby | ah, thank you replaca |
| 19:31 | replaca | np |
| 19:32 | amalloy | *cough* dorun |
| 19:33 | amalloy | but really, the answer is that nuke-collection! should be forcing the sequence internally, not requiring you to force it anytime you want to use it |
| 19:34 | amalloy | eg, (defn nuke! [] (doseq [{:keys [_id]} (fetch ...)] (destroy! _id))) |
| 19:36 | eggsby | hmm |
| 19:36 | eggsby | thank you amalloy, I will try that |
| 19:39 | yoklov | so, I upgraded to leiningen 2.0 today, and I get "WARN ignoring checkouts directory clojurescript as it does not contain a project.clj file." when using a new version of clojurescript in a checkouts directory on the classpath, does this… still work? |
| 19:39 | technomancy | yoklov: ibdknox said he was going to write one |
| 19:39 | technomancy | a project.clj file I mean |
| 19:40 | muhoo | is there a way to add a string to an Exception after catching it, then re-throw it? |
| 19:41 | gfredericks | re-throw the same exception? |
| 19:41 | yoklov | technomancy: hm, so should I just go back to using lein1? |
| 19:41 | technomancy | it worked in lein1? that's surprising. |
| 19:41 | technomancy | it shouldn't work on projects that don't have project.clj |
| 19:42 | yoklov | technomancy: hm, yeah, it doesn't work in lein2 |
| 19:43 | yoklov | but just having clojurescript's compiler and core lib in the classpath was enough in lein1 |
| 19:43 | technomancy | if you want it to work with lein2 you'd need to create a dummy project.clj file for clojurescript |
| 19:43 | technomancy | the fact that it works on lein1 is accidental |
| 19:44 | yoklov | yeah, I think I knew that it sort of accidentally worked |
| 19:46 | yoklov | the fix described here: https://github.com/emezeske/lein-cljsbuild/issues/58 doesn't work in lein2, basically. |
| 19:47 | yoklov | how "dummy" would the project.clj file have to be |
| 19:48 | muhoo | gfredericks: yeah, but with my text added |
| 19:49 | muhoo | johnfn: amalloy: it *was* a code smell. i refactored it into half as many lines and fewer bugs :-) |
| 19:49 | emezeske | yoklov: You don't really need to put the clojurescript checkout in the checkouts/ directory |
| 19:49 | emezeske | yoklov: It could be anywhere from what I understand; as long as you somehow hack its source directories into your classpath |
| 19:49 | yoklov | emezeske: yeah, is the fact that i put it there a problem though? |
| 19:49 | muhoo | i think i add a bunch of intermediate lets when i'm not confident that it's going to work. once it does, i nuke those and just pipeline the whole thing with (-> ) or ((()))) |
| 19:50 | emezeske | yoklov: Well, lein has special handling for things in checkouts/ from what I understand |
| 19:50 | technomancy | yoklov: oh right; you can add an entry to your own project's :source-paths |
| 19:50 | emezeske | yoklov: If there's a dir in there, lein wants a projec.tclj |
| 19:51 | yoklov | technomancy: yeah, i've done that |
| 19:51 | yoklov | hm, trying it with some other folder name |
| 19:51 | emezeske | Really, the example shouldn't use the checkouts/ dir, because it's not a checkout (at least in lein's terminology) |
| 19:52 | emezeske | But yeah, the ideal solution would be a project.clj for it, and then you could just drop it in checkouts/ and not have to muck with your :source-paths |
| 19:53 | emezeske | I'm guessing the dummy project.clj could be pretty simple, just enough to tell lein where the source for the compiler is (I'm not certain, though, haven't messed with it) |
| 19:55 | yoklov | yeah, still doesn't work |
| 19:55 | yoklov | i'm still getting an old clojurescript |
| 19:55 | emezeske | What does your :source-paths look like? |
| 19:55 | yoklov | wait, hold on, they were actually in :resource-paths |
| 19:56 | devn | Chousuke: is there any reason why a patch couldn't be accepted to change .more to .rest? |
| 19:57 | yoklov | whoops, yeah that made the difference. |
| 19:57 | gfredericks | that reminds me of the lava patch |
| 19:59 | eggsby | thank you amalloy and replaca I was able to fix my bug and learn a bit about clojure in the process w/ yr help :) |
| 20:02 | emezeske | yoklov: I updated the issue to reflect the lein2 differences, mind double checking what I wrote? https://github.com/emezeske/lein-cljsbuild/issues/58#issuecomment-5531494 |
| 20:06 | yoklov | emezeske: yup |
| 20:06 | yoklov | commented with what worked for me. |
| 20:08 | emezeske | yoklov: thanks |
| 20:15 | ibdknox | lynaghk`: I think I might have something that solves your case but works the way I had mine setup |
| 20:16 | ibdknox | yoklov: you might be interested too |
| 20:16 | yoklov | oh? |
| 20:16 | ibdknox | yoklov: it looks like this: https://www.refheap.com/paste/2595 |
| 20:17 | lynaghk` | ibdknox: oh yeah? |
| 20:17 | ibdknox | it's a bit ugly right now |
| 20:17 | ibdknox | buuuut |
| 20:17 | ibdknox | it lets you have a single atom |
| 20:17 | ibdknox | and does all the right magic to handle propagating changes down |
| 20:17 | ibdknox | no walking, all closures handling updates to themselves |
| 20:18 | ibdknox | lynaghk`: what do you use for your default key fn? |
| 20:18 | lynaghk` | child index |
| 20:18 | mebaran151 | I'm trying to play with ClojureScript on Windows; since fixing trampoline for windows, I can get cljsbuild repl-listen to ALMOST start, except it throws a null pointer exception, apparently trying to call re-matcher for something. Any ideas how to fix? |
| 20:18 | ibdknox | ah, yeah mine is dumb and doesn't consider ordering yet |
| 20:19 | dnolen | mebaran151: might want to ping emezeske |
| 20:20 | lynaghk` | ibdknox: what's the {:as aliases} doing? Taking the collection (:aliases n) and passing each element to the aliases partial? |
| 20:21 | ibdknox | lynaghk`: yoklov: impl https://github.com/ibdknox/crate/commit/2f816a978ee37c71dc5c98c1268d6b07805926f4 |
| 20:21 | ibdknox | lynaghk`: yeah, telling it what to represent each one as |
| 20:21 | ibdknox | lynaghk`: you could easily wrap a macro around that and make it transparently inline |
| 20:22 | lynaghk` | is defpartial just defn? |
| 20:22 | ibdknox | with a little more, but fundamentally yeah |
| 20:24 | yoklov | act rct and cct are are unrelated to the example? |
| 20:24 | ibdknox | they're just little functions to modify the atom |
| 20:24 | yoklov | yeah |
| 20:24 | lynaghk` | hmm. I'm really interested to see the performance comparison of dom-walking vs. tons-of-closures. |
| 20:25 | ibdknox | I'm pretty sure the latter wins on memory, since you have to store the data in the dom, right? |
| 20:26 | ibdknox | I have no idea how fast might current implementation is. I know there are some places where I could easily speed it up if it were too slow |
| 20:27 | ibdknox | my* |
| 20:27 | yoklov | i'd bet that it would depend on how you walked the dom |
| 20:27 | lynaghk` | I'm not sure how memory works when assiging a js object as a dom node property. |
| 20:28 | ibdknox | this is a common pattern |
| 20:28 | lynaghk` | yoklov: yeah, definitely. Right now C2 has this garbage collection party every time it updates a visualization. speedup is on the agenda as soon as I get some cljs benchmarking infrastructure setup. |
| 20:28 | mebaran151 | dnolen: thanks, I throw a ticket up on github |
| 20:28 | yoklov | hm, i think goog.dom adds objects to dom nodes, but i'd have to look |
| 20:29 | lynaghk` | right now C2 just sets directly: (set! (.-c2data $node) datum) |
| 20:30 | yoklov | hrm… |
| 20:30 | yoklov | i'm sure lots of research has been done into dom node gc and the like. |
| 20:31 | yoklov | do you think that's what it is? or cljs datastructure gc |
| 20:33 | lynaghk` | the GC stuff? I have no idea |
| 20:34 | ibdknox | what is it cleaning up? |
| 20:34 | lynaghk` | I think it may be a lot of intermediate structures |
| 20:35 | yoklov | ibdknox: haven't looked too closely at the implementation, but a concern i'd have with the closure approach is that they could prevent the nodes from getting GCed |
| 20:35 | lynaghk` | yeah, I wondered about that to. There's a lot of discussion of that kind of thing in the FRP papers |
| 20:36 | ibdknox | yoklov: lynaghk`: well if you remove the nodes, but don't remove the data that would be true |
| 20:36 | ibdknox | but the point is to work with the data not the dom |
| 20:36 | ibdknox | assuming you do that |
| 20:36 | ibdknox | everything will be GC'd as you'd expect |
| 20:40 | ibdknox | ah I guess I am closing over the elems for the attributes and styles |
| 20:41 | mebaran151 | dnolen: I think it actually maybe a lein bug as it seems to bubble up from its shutdown code |
| 20:43 | gf3 | Is Alex Osborne in here? |
| 20:43 | gf3 | aka ato on Github |
| 20:44 | amalloy | gf3: _ato, but he doesn't talk much |
| 20:44 | gf3 | amalloy: Ahh thanks, not sure how I missed that |
| 20:45 | gf3 | _ato: ping! |
| 20:47 | zinn_ | I'm trying to deploy a war I made with "lein ring war" in Tomcat, and get : ClassNotFoundException: clojure.lang.IFn |
| 20:47 | zinn_ | any ideas what I'm doing wrong? |
| 20:48 | yoklov | hrm, anybody using clojurescript head? |
| 20:48 | yoklov | i'm getting an undeclared var warning for not in two places |
| 20:48 | dnolen | yoklov: what lines? |
| 20:48 | yoklov | 504 and 515 |
| 20:50 | dnolen | yoklov: hmm for not? Even after 'lein cljsbuild clean' |
| 20:52 | yoklov | hm, that fixed it, it looks like it appeared after a few compilations in auto last time too. odd. |
| 20:53 | yoklov | could have something to do with the fact that i was messing with clojurescript and leiningen versions |
| 20:56 | zinn_ | found out I should use 'lein ring uberwar' and never 'lein ring war'. (for the record) |
| 20:56 | zinn_ | sorry for being noise :) |
| 21:06 | brainproxy | not sure how to properly use cljs :require to pull in a dependency that's in the same directory as the .cljs file I'm compiling with closure/build |
| 21:06 | brainproxy | https://gist.github.com/2606633 |
| 21:06 | ibdknox | brainproxy: cljs doesn't enforce directory structure |
| 21:07 | ibdknox | brainproxy: so it's whatever the ns at the top of your file is |
| 21:08 | emezeske | ibdknox: I have seen very weird problems when the dir structure does not match the ns structure, like compilation succeeding, but only every other time |
| 21:08 | ibdknox | hm, never seen that |
| 21:08 | brainproxy | ibdknox: okay, but I'm not sure how to apply that with respect to changing how I'm invoking :require w.r.t. foo, or renaming foo.cljs or the ns in foo.cljs |
| 21:09 | emezeske | brainproxy: your paste looks correct to me... |
| 21:09 | ibdknox | yeah I don't see anything obvious |
| 21:09 | emezeske | brainproxy: how are you compiling things? |
| 21:10 | brainproxy | emezeske: with a nodejs-backed compile routine |
| 21:10 | brainproxy | which I'm currently developing |
| 21:10 | brainproxy | the example works if I pull in foo.cljs with nodejs's require |
| 21:10 | emezeske | brainproxy: are you ultimately invoking closure/build? |
| 21:10 | brainproxy | emezeske: yes |
| 21:11 | emezeske | brainproxy: And when you call closure/build, you pass it the name of the directory containing both cljs files? |
| 21:11 | brainproxy | no, just the filename hello.cljs |
| 21:11 | brainproxy | which may be my problem |
| 21:12 | brainproxy | but I thought maybe it would pick up foo.cljs automatically since it's spec'd as a :require dependency |
| 21:12 | emezeske | that would work, but only if the parent directory is on the classpath |
| 21:12 | brainproxy | i see |
| 21:12 | emezeske | the compiler will read files as java resources, which can come from anywhere on the classpath, and in that case, the ns layout *must* match the dir layout |
| 21:12 | brainproxy | can I massage the classpath from within clojurescript? |
| 21:13 | brainproxy | if not, it's fine, I can do it from nodejs |
| 21:13 | brainproxy | nvm, the first question is dumb |
| 21:13 | emezeske | maybe from the clojure code that calls closure/build |
| 21:13 | brainproxy | :) |
| 21:13 | emezeske | probably difficult to do, though, and painful |
| 21:20 | brainproxy | emezeske: was easy.. just pushed `process.cwd()` onto the class path |
| 21:20 | brainproxy | now it works :D |
| 21:21 | brainproxy | thanks for the tips, really really appreciated |
| 21:21 | brainproxy | process.cwd is a node thing |
| 21:25 | yoklov | I think I remember there was some syntax for instantiating records from maps? |
| 21:27 | yoklov | map->Record ? |
| 21:27 | yoklov | or actually I can just use the fancy reader syntax, can't I |
| 21:27 | lynaghk | yoklov: yes, when you defrecord a constructor is also made that takes a map |
| 21:28 | lynaghk | so if you (defrecord A [x y]) then you'll be able to (map->A {:x 1 :y 2}) |
| 21:28 | yoklov | Hrm. that should work in cljs too, right? |
| 21:29 | yoklov | yeah it does, needed to refresh |
| 21:30 | mjaukalo | I want to convert a list of bytes to a vector of bytes with vector-of. How do I splice the list into the vector-of? (vector-of :byte a-list-of-bytes-that-should-be-spliced). |
| 21:32 | tomoj | (into (vector-of :byte) a-list-of-bytes-that-should-be-spliced) |
| 21:33 | mjaukalo | tomoj: Thanks! |
| 21:33 | xeqi | ,(apply vector-of :byte (list 0 1 2 3 4 5)) |
| 21:34 | clojurebot | [0 1 2 3 4 ...] |
| 21:34 | tomoj | ah, that was my first thought, but vector-of in this repl only takes one arg |
| 21:34 | tomoj | 1.2.1 |
| 21:55 | Licenser | *g* |
| 22:08 | mlozano1 | odd |
| 23:47 | Bretzky | does anyone have any suggestions in regards to getting a proper dev environment up on win7? |
| 23:47 | Frozenlock | I'm trying to use the JSON libary cheshire. Here is what I get when trying to use it in a namespace: class org.codehaus.jackson.smile.SmileParser overrides final method getBinaryValue.(Lorg/codehaus/jackson/Base64Variant;)[B |
| 23:47 | Frozenlock | [Thrown class java.lang.VerifyError] |
| 23:47 | Frozenlock | Help? :P |
| 23:48 | Frozenlock | Bretzky: I'm on Win7, any particular question? |
| 23:48 | Bretzky | not really, just a general getting started |
| 23:49 | Bretzky | w/ leiningen |
| 23:49 | Frozenlock | Hmm I've written this (for my own poor memory) http://frozenlock.org/2012/03/06/clojure-on-windows-7/ |
| 23:49 | Frozenlock | Perhaps it can help you |
| 23:50 | Frozenlock | I've never tried Lein2 however |
| 23:50 | Bretzky | yeah |
| 23:51 | Bretzky | I dl'd 1.5.2 a while back, and now I'm tryingt o upgrade to no avail |
| 23:51 | Bretzky | figured starting over would help |
| 23:51 | Bretzky | but nope, it still keeps downloading the 1.5.2 jar even w/ 1.7.1 specified |
| 23:51 | Bretzky | the tutorial I'm trying to follow is using lein2 on osx |
| 23:51 | Bretzky | makes me want to switch to osx for a dev environment |
| 23:52 | Frozenlock | Ewwwww |
| 23:52 | Frozenlock | I'll go on Linux before that :p |
| 23:52 | Bretzky | linux takes a lot of work to customize imo |
| 23:53 | Frozenlock | Bretzky: 1.5.2 works fine for me btw. Is there a plugin you want to use which isn't compatible? |
| 23:53 | Bretzky | well, I've been trying to use pprint |
| 23:53 | Bretzky | and I can't seem to get that into my dependencies properly |
| 23:53 | Bretzky | looks like it's included as a plugin in lein2 |
| 23:53 | Frozenlock | weird, pprint wokrs fine for me. |
| 23:54 | Bretzky | you can just do (pprint resource) ? |
| 23:54 | Frozenlock | Are you using emacs/slime? |
| 23:54 | Bretzky | no |
| 23:54 | Bretzky | just sublime text 2 |
| 23:54 | Bretzky | and cygwin for bash |
| 23:54 | Frozenlock | Well in the repl: (use 'clojure.pprint) |
| 23:56 | Frozenlock | Never used sublime text 2. Do you have access to the repl with it? |
| 23:56 | Bretzky | through a plugin, yeah |
| 23:56 | Bretzky | I just use lein repl though |
| 23:58 | Frozenlock | In a command window? |
| 23:58 | Bretzky | yeah |
| 23:58 | Frozenlock | Wow... I envy your courage :) |