2014-10-01
| 00:37 | joshuafcole | Are there any good tools for hunting down memory leaks in clojure? I'm interfacing with libgdx via play-clj |
| 00:38 | joshuafcole | I'm ~80% certain that the problem is I'm spinning up a shape renderer each frame (part of an experimental mess). A refactor is planned, but I want to learn how to find the problem when it's less obvious |
| 00:39 | joshuafcole | interestingly, trying to call dispose on the shape renderer when I'm done with it throws an exception, hence the other 20% |
| 00:42 | amalloy | joshuafcole: i've gotta go, but see: jmap for heap dumps (comes with the jdk), or yourkit for profiling |
| 00:42 | joshuafcole | Sure, I'll take a look. Thanks! |
| 00:49 | vIkSiT | hello all |
| 00:50 | danielcompton | joshuafcole: jvisualvm (also with jdk) might be helpful for profiling |
| 00:50 | vIkSiT | if I have a collection c [1 2 3 4 5] - and I want to transform it such that only every alternate element is transformed |
| 00:50 | vIkSiT | how would I do it? |
| 00:50 | joshuafcole | first way that comes to my (novice) mind is |
| 00:50 | danielcompton | vIkSiT: partition by 2, then operate on the first element only? |
| 00:51 | vIkSiT | eg, I want to add 1 to every alternate number |
| 00:51 | vIkSiT | danielcompton, hmm - thats a good option. would it work for a stream? |
| 00:51 | danielcompton | vIkSiT: it works on sequences, is that what you mean? |
| 00:52 | vIkSiT | danielcompton, ah. true |
| 01:01 | vIkSiT | hmm |
| 01:01 | vIkSiT | I guess that doesn't work |
| 01:01 | vIkSiT | what I really want is the following: |
| 01:02 | vIkSiT | (def a [1 2 3 4 5]) |
| 01:02 | vIkSiT | (transform a) |
| 01:02 | vIkSiT | => [1 "2" 3 "4" 5] |
| 01:02 | vIkSiT | assuming the function I'm applying is str |
| 01:02 | vIkSiT | (transform a str) |
| 01:09 | sm0ke | ,(map-indexed (fn [x y] (if (odd? x) (str y) y)) [1 2 3 4]) |
| 01:09 | clojurebot | (1 "2" 3 "4") |
| 01:09 | sm0ke | ,(map-indexed (fn [x y] (if (odd? x) (str y) y)) [1 2 3 4 5]) |
| 01:09 | clojurebot | (1 "2" 3 "4" 5) |
| 01:10 | sm0ke | ,(defn transform [f c] #(map-indexed (fn [x y] (if (odd? x) (f y) y)) c)) |
| 01:10 | clojurebot | #'sandbox/transform |
| 01:11 | sm0ke | ,(transform str [1 2 3 4 5]) |
| 01:11 | clojurebot | #<sandbox$transform$fn__77 sandbox$transform$fn__77@1fb8a15> |
| 01:11 | sm0ke | lolwut |
| 01:11 | sm0ke | ugh |
| 01:11 | TEttinger | you have transform defined as returning a fn |
| 01:11 | sm0ke | ,(defn transform [f c] (map-indexed (fn [x y] (if (odd? x) (f y) y)) c)) |
| 01:11 | clojurebot | #'sandbox/transform |
| 01:11 | sm0ke | ,(transform str [1 2 3 4 5]) |
| 01:11 | clojurebot | (1 "2" 3 "4" 5) |
| 01:12 | TEttinger | map-indexed is a weird one. |
| 01:12 | sm0ke | yep |
| 01:12 | bbloom | no |
| 01:12 | bbloom | (doc map-indexed) |
| 01:12 | clojurebot | "([f coll]); Returns a lazy sequence consisting of the result of applying f to 0 and the first item of coll, followed by applying f to 1 and the second item in coll, etc, until coll is exhausted. Thus function f should accept 2 arguments, index and item." |
| 01:13 | TEttinger | ,(defn transform' [f &colls] (map (fn [idx &args] (if (odd? idx) (f args) args)) (range) colls)) |
| 01:13 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: args in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 01:13 | TEttinger | ,(defn transform' [f &colls] (map (fn [idx & args] (if (odd? idx) (f args) args)) (range) colls)) |
| 01:13 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: colls in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 01:13 | TEttinger | ,(defn transform' [f & colls] (map (fn [idx & args] (if (odd? idx) (f args) args)) (range) colls)) |
| 01:13 | clojurebot | #'sandbox/transform' |
| 01:14 | TEttinger | ,(transform' + [1 2 3] [10 20 30]) |
| 01:14 | clojurebot | #<ClassCastException java.lang.ClassCastException: Cannot cast clojure.lang.ArraySeq to java.lang.Number> |
| 01:14 | TEttinger | oh |
| 01:14 | TEttinger | ,(defn transform' [f & colls] (map (fn [idx & args] (if (odd? idx) (apply f args) args)) (range) colls)) |
| 01:14 | clojurebot | #'sandbox/transform' |
| 01:14 | TEttinger | ,(transform' + [1 2 3] [10 20 30]) |
| 01:14 | clojurebot | #<ClassCastException java.lang.ClassCastException: Cannot cast clojure.lang.PersistentVector to java.lang.Number> |
| 01:14 | TEttinger | gah |
| 01:15 | sm0ke | humm you may want to zip them |
| 01:15 | TEttinger | ,(defn transform' [f & colls] (apply map (fn [idx & args] (if (odd? idx) (apply f args) args)) (range) colls)) |
| 01:15 | clojurebot | #'sandbox/transform' |
| 01:15 | TEttinger | ,(transform' + [1 2 3] [10 20 30]) |
| 01:15 | clojurebot | ((1 10) 22 (3 30)) |
| 01:15 | TEttinger | wat |
| 01:15 | sm0ke | lol |
| 01:15 | TEttinger | oh good |
| 01:16 | TEttinger | that is actually correct |
| 01:17 | TEttinger | ,(transform' str ["a" "b" "c" "d" "e"] [1 2 3 4 5]) |
| 01:17 | clojurebot | (("a" 1) "b2" ("c" 3) "d4" ("e" 5)) |
| 01:17 | sm0ke | wth is up with the list |
| 01:17 | TEttinger | it checks that the index is odd |
| 01:17 | TEttinger | if not, it returns the items from the colls at that index |
| 01:18 | sm0ke | yes but it doesnt apply the function |
| 01:18 | TEttinger | if yes, it applies f to both, and returns that |
| 01:18 | sm0ke | ,(defn transformz [f & colls] (apply map (fn [idx & args] (if (odd? idx) (apply f args) args)) (range) colls)) |
| 01:18 | clojurebot | #'sandbox/transformz |
| 01:18 | sm0ke | ,(transformz + [1 2 3] [4 5 6]) |
| 01:18 | clojurebot | ((1 4) 7 (3 6)) |
| 01:18 | TEttinger | yup |
| 01:18 | sm0ke | why isnt it (5 7 9)! |
| 01:19 | TEttinger | remember, it's treating (if (odd? idx)) differently |
| 01:19 | sm0ke | oh you had a apply before map |
| 01:19 | sm0ke | hurm |
| 01:19 | TEttinger | ,(defn transform-all [f & colls] (apply map (fn [idx & args] (apply f args)) (range) colls)) |
| 01:19 | clojurebot | #'sandbox/transform-all |
| 01:20 | TEttinger | ,(transform-all str ["a" "b" "c" "d" "e"] [1 2 3 4 5]) |
| 01:20 | clojurebot | ("a1" "b2" "c3" "d4" "e5") |
| 01:20 | TEttinger | same as |
| 01:20 | TEttinger | ,(map str ["a" "b" "c" "d" "e"] [1 2 3 4 5]) |
| 01:20 | clojurebot | ("a1" "b2" "c3" "d4" "e5") |
| 01:21 | sm0ke | yes i know that |
| 01:21 | sm0ke | but i am not able to spot why the function is not being applied |
| 01:21 | sm0ke | ,(transformz + [1 2 3] [4 5 6]) |
| 01:21 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: transformz in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 01:21 | sm0ke | (apply f args) why is it giving a list |
| 01:22 | sm0ke | oh i get it |
| 01:23 | TEttinger | yep, it gives a list in the else case |
| 01:23 | sm0ke | its those who are not being applied |
| 01:23 | sm0ke | TEttinger: who told you to write such a weird function |
| 01:24 | sm0ke | that was a weird one |
| 01:25 | sm0ke | ,(range) |
| 01:25 | clojurebot | (0 1 2 3 4 ...) |
| 02:15 | blur3d | I’ve been struggling with some fairly simple clojurescipt/javascript interop. Bascially, I call a native javascript function, which returns a javascript array - however, I am having trouble using that array in the clojurescript code. The error I am getting is [object Object], [object Object], [object Object] is not iSeqable. The problem is that is it an array, and I think there might be a nodejs bug. |
| 02:16 | blur3d | I’ve tried casting it to an array also, but that didn’t seem to help |
| 02:17 | blur3d | (println (first #js [1 2 3])) works as expected - it returns 1 |
| 02:17 | blur3d | however, (println (first ports)) - where ports is an array (confirmed in webkit console), it gives the iSeqable error |
| 02:18 | blur3d | **correction it prints ‘1’… returns nil. |
| 02:20 | blur3d | http://imgur.com/Ctf5K45 is an image of the webkit console. It dumps the ports value (using (.dir js/console ports), which shows it is an array |
| 02:29 | dbasch | javascript arrays are not seqable, you need to convert it to clojurescript |
| 02:32 | blur3d | I’m thinking it is related to http://dev.clojure.org/jira/browse/CLJS-842 |
| 02:33 | blur3d | dbasch: if javascript arrays are not seqable, why does (first #js [1 2 3]) work? I’m fairly sure clojurescript has a protocol that handles the conversion now |
| 02:42 | dbasch | try (implements? ISeqable #js [1 2 3]) |
| 02:43 | dbasch | and |
| 02:43 | dbasch | (implements? ISeqable (js->clj #js [1 2 3])) |
| 02:45 | blur3d | false, and true respectively. So you’re right |
| 03:15 | wei | is there a shortcut for (let [x …] (do-something-with! x) x) |
| 03:21 | amalloy | (doto x (do-something-with!)) |
| 03:21 | amalloy | &(doc doto) |
| 03:21 | lazybot | ⇒ "Macro ([x & forms]); Evaluates x then calls all of the methods and functions with the value of x supplied at the front of the given arguments. The forms are evaluated in order. Returns x. (doto (new java.util.HashMap) (.put \"a\" 1) (.put \"b\" 2))" |
| 03:22 | magopian | &(doto 1 inc) |
| 03:22 | lazybot | ⇒ 1 |
| 03:22 | magopian | obviously ;) |
| 03:22 | magopian | &(doto 1 str) |
| 03:22 | lazybot | ⇒ 1 |
| 03:23 | amalloy | &(doto 1 println) |
| 03:23 | lazybot | ⇒ 1 1 |
| 03:23 | magopian | thanks ;) |
| 03:23 | magopian | i was thinking about something with side effect, was thinking a bit too much :) |
| 03:23 | magopian | (it's still "early" here in the morning... and yes, that's my only lame excuse :) |
| 03:29 | wei | sweet, thanks amalloy |
| 03:42 | iamcyberbird | hmm any way i can get rid of the curly f function symbol and use a lambda symbol instead? |
| 03:42 | iamcyberbird | more of an emacs question but i'm sure someone knows here |
| 03:44 | pellis | hi all. i'm trying to figure out how https://clojurecup.com was made - what javascript framework was used in addition to React (hoping authors sit in this chan) |
| 03:44 | pellis | anyone have an idea? |
| 03:45 | Rhainur | pellis: probably Om? |
| 03:46 | pellis | given that React covers the UI concerns, does Om also cover the architecture concerns? i.e. a general structure of an app? |
| 03:46 | pellis | for example, routing and event propagation? |
| 03:47 | Rhainur | oh no I meant Om is ClojureScript's interface to React |
| 03:47 | Rhainur | https://github.com/swannodette/om |
| 03:49 | pellis | Rhainur: ah, i see! |
| 03:50 | pellis | Rhainur: well, I think i bumped into Om somewhere - just this site brought up question such as what about routing, servers, events and such |
| 03:51 | ddellacosta_ | pellis: Om is really only the "view" in MVC...sort of. More to the point, many architectures are possible with Om. |
| 03:52 | ddellacosta_ | pellis: event propagation is handled by React, but routing is not. Many folks using Om use Secretary to handle client-side routing: https://github.com/gf3/secretary |
| 03:58 | wei | design question. I’m using redis/carmine to put some computation jobs on a queue. after a computation is finished, the owner of the job needs to be notified of the answer. what’s a good way to do this? (another queue?) |
| 04:01 | ucb_ | hi all, where am I going wrong: https://gist.github.com/3e7814d9a56a2c5139ed ? |
| 04:05 | ucb_ | oh, I know, heh |
| 04:11 | ucb_ | oh, am I stuck with signed bytes in clojure by any chance? |
| 04:14 | ucb_ | bah, ignore me again |
| 04:16 | TEttinger | ucb_: there's at the very least ztellman's byte handling lib |
| 04:17 | rritoch | ucb_: It is a java limitation, you can upgrade to byte if you need to hold 8 bits without dealing with the sign, but you'll need alot of (bit-and 255 x) if your doing cryptography |
| 04:17 | ucb_ | TEttinger: yeah, I'm using bytebuffer (the lib), but I was being silly with all my questions. I don't need to do any interpretation of the bytes as it were. Thanks though! |
| 04:17 | ucb_ | rritoch: yeah, and fortunately I am not doing crypto because I clearly don't understand all this stuff very well ^_^ |
| 04:17 | rritoch | err, upgrade to int |
| 04:18 | mmeixner | Newbie question: is there an idiomatic difference between "apply + " and "reduce + " ? |
| 04:20 | pyrtsa | mmeixner: For variadic functions like +, it's probably best to use apply because it lets the function short-circuit (and not evaluate all the arguments) when it matters. Not that + would short-circuit but still. |
| 04:20 | mmeixner | I see, so this is an implementation detail somehow |
| 04:20 | mmeixner | thanx |
| 04:21 | TEttinger | it is important to understand the difference between apply and reduce though |
| 04:21 | mmeixner | ah ... |
| 04:21 | ucb_ | mmeixner: not just, consider the gymnastics you'd have to do if you wanted to apply conj for instance |
| 04:21 | pyrtsa | mmeixner: The difference is: with apply, the function + immediately sees that it's called with a sequence of arguments. With reduce, the function always gets called with 2 arguments. |
| 04:21 | ucb_ | the trouble with apply and conj is that not all parameters to conj are of the same type |
| 04:22 | pyrtsa | ucb_: Neither necessarily with reduce when you pass the init argument: (reduce f init xs) |
| 04:23 | mmeixner | I see - some REPLing necessary to work this out ... |
| 04:23 | ucb_ | pyrtsa: indeed, but with apply you'd have to conj/cons the initial collection (or nil) to the collection of items you want to cons, right? |
| 04:23 | pyrtsa | ucb_: You can say (apply conj coll xs) |
| 04:24 | ucb_ | oh, you can do that indeed! |
| 04:24 | ucb_ | IVE BEEN WRONG ALL MY LIFE |
| 04:24 | pyrtsa | And again, the difference is that conj immediately sees that there are many things (i.e. xs), not just one (x). |
| 04:24 | ucb_ | sure |
| 04:25 | pyrtsa | Indeed, (conj (conj (conj coll a) b) c) has a very different performance from (apply conj coll xs). |
| 04:25 | pyrtsa | (...As far as I remember.) |
| 04:25 | ucb_ | it should, right? |
| 04:26 | pyrtsa | I think it should use transients behind the scenes. At least it could. |
| 04:26 | mange | pyrtsa: A great example of the performance difference is with (apply str ...) vs (reduce str ...), I think. |
| 04:27 | pyrtsa | mange: Great. That's a good one. |
| 04:27 | mmeixner | I just found this: "+ is itself implemented in terms of reduce for the variable-arity case (more than 2 arguments). " |
| 04:27 | mmeixner | http://stackoverflow.com/questions/3153396/clojure-reduce-vs-apply |
| 04:29 | mmeixner | thanks for all input! time to think ... |
| 04:42 | rritoch | ucb_: if you need something simple, here's an ugly hack to do your byte conversion which handles the sign bit for you (-> 0x98 str javax.xml.bind.DatatypeConverter/parseByte) |
| 04:52 | TEttinger | ,(-> 0x98 str javax.xml.bind.DatatypeConverter/parseByte) |
| 04:52 | clojurebot | -104 |
| 04:52 | TEttinger | ,0x98 |
| 04:52 | clojurebot | 152 |
| 04:54 | TEttinger | ,(bit-and 0x98 -2r1111111) |
| 04:54 | clojurebot | 128 |
| 04:54 | TEttinger | hm |
| 04:54 | TEttinger | ,(bit-and 0x98 2r1111111) |
| 04:54 | clojurebot | 24 |
| 04:57 | CookedGryphon | Does anyone know if transit needs all its dependencies in all situations? I'd like to use it, but I'm on android and it adds ~14k method references with its dependencies when my total limit is 64k |
| 04:57 | CookedGryphon | Ideally I'd proguard things out, but I want to be able to use it from the repl |
| 04:59 | TEttinger | ,(+ (bit-and 0x98 127) (* -1 (bit-and 0x98 128))) |
| 04:59 | clojurebot | -104 |
| 04:59 | TEttinger | rritoch, should be... a bit faster |
| 05:00 | TEttinger | ,[(+ (bit-and 0xf8 127) (* -1 (bit-and 0xf8 128))) (-> 0xf8 str javax.xml.bind.DatatypeConverter/parseByte)] |
| 05:00 | clojurebot | [-8 -8] |
| 05:00 | clgv | TEttinger: proof by criterium? ;) |
| 05:00 | TEttinger | ,[(+ (bit-and 0x18 127) (* -1 (bit-and 0x18 128))) (-> 0x18 str javax.xml.bind.DatatypeConverter/parseByte)] |
| 05:00 | clojurebot | [24 24] |
| 05:01 | TEttinger | it's simple bit twiddling. it isolates the least significant 7 bits, and subtracts 128 if there's a value in the sign bit place (eighth bit, 128) |
| 05:04 | TEttinger | ,[(- (bit-and 0x18 127) (bit-and 0x18 128)) (-> 0x18 str javax.xml.bind.DatatypeConverter/parseByte)] |
| 05:04 | clojurebot | [24 24] |
| 05:04 | clgv | no, I mean the supposed performance improvement ;) |
| 05:04 | TEttinger | oh haha |
| 05:04 | TEttinger | ya think? |
| 05:05 | clgv | on the jvm I only believe in performance improvements backed up by benchmark numbers ,) |
| 05:05 | rritoch | TEttinger: The version I provided was simply for readability, there are much faster ways, the fastest being to just use (byte -104), it will really depend on the implementation as to what method is best. |
| 05:06 | TEttinger | ,(time (map #(- (bit-and % 127) (bit-and % 128)) (range 255))) |
| 05:06 | clojurebot | "Elapsed time: 0.136753 msecs"\n(0 1 2 3 4 ...) |
| 05:06 | TEttinger | ,(time (map # (-> % str javax.xml.bind.DatatypeConverter/parseByte) (range 255))) |
| 05:06 | clojurebot | #<RuntimeException java.lang.RuntimeException: Reader tag must be a symbol> |
| 05:06 | TEttinger | ,(time (map #(-> % str javax.xml.bind.DatatypeConverter/parseByte) (range 255))) |
| 05:06 | clojurebot | "Elapsed time: 0.121739 msecs"\n(0 1 2 3 4 ...) |
| 05:06 | TEttinger | waaaaat |
| 05:06 | TEttinger | jit. |
| 05:07 | rritoch | TEttinger: His problem though is to create a byte, neither of your codes create a byte |
| 05:07 | TEttinger | ,(time (map #(byte (- (bit-and % 127) (bit-and % 128))) (range 255))) |
| 05:07 | clojurebot | "Elapsed time: 0.143679 msecs"\n(0 1 2 3 4 ...) |
| 05:08 | TEttinger | I don't get you, hotspot jit |
| 05:09 | rritoch | TEttinger: I get it, duped by clojure's slowness, the DatatypeConverter library may be coded in binary (assembled) so it gets an unfair speed advantage. |
| 05:09 | TEttinger | ah |
| 05:09 | TEttinger | so if mine was AOTed it would be better |
| 05:09 | TEttinger | (than it is now) |
| 05:10 | clgv | TEttinger: you definitely need to use cirterium (or similar) for these measurements |
| 05:11 | clgv | and using lazy functions wont help either ;) |
| 05:11 | TEttinger | well they're both using map |
| 05:12 | clgv | yeah but (map ..) gets evaluated when printing so not within (time ...) |
| 05:13 | clgv | you measured the construction of the lazy-seq not its realization which you wanted to |
| 05:13 | clgv | (quick-bench (mapv #(- (bit-and % 127) (bit-and % 128)) (range 255))) => Execution time mean : 11.765617 µs |
| 05:13 | clgv | (quick-bench (mapv #(-> % str javax.xml.bind.DatatypeConverter/parseByte) (range 255))) => Execution time mean : 18.155778 µs |
| 05:13 | TEttinger | gah |
| 05:14 | TEttinger | well that's promising |
| 05:14 | clgv | you could rerun the above with `bench` to be more accurate |
| 05:16 | clgv | I have used criterium a lot lately |
| 05:27 | vanila | hi! |
| 05:27 | vanila | How does the clojure compiler work? |
| 05:29 | noidi | pretty well, thanks for asking |
| 05:29 | vanila | haha |
| 05:29 | noidi | but seriously, that's too broad a question to be answered in any meaningful way |
| 05:30 | rritoch | TEttinger: Ok, well speed wise I think this should be the fastest (.byteValue 0x98) |
| 05:31 | danielcompton | I benchmarked the bit functions with criterium, what happened next will surprise you... |
| 05:31 | rritoch | Honestly, I didn't even know Long had a byteValue method... |
| 05:32 | TEttinger | haha good point |
| 05:33 | TEttinger | vanila, I think it's a little atypical of lisp implementations, since it compiles to jvm .class files on-the-fly or ahead-of-time as requested. |
| 05:34 | vanila | interesting! |
| 05:34 | TEttinger | almost everything gets its own .class file, like each fn |
| 05:35 | TEttinger | I don't know how it assembles the .class files other than "it's complicated and don't touch it" |
| 05:36 | TEttinger | you can go through clojure's source on github, but it's pretty big |
| 05:36 | cfleming | And pretty ugly the first time you see it. |
| 05:36 | cfleming | The compiler, that is. |
| 05:37 | TEttinger | a lot of it is in https://github.com/clojure/clojure/tree/master/src/jvm/clojure/asm |
| 05:37 | CookedGryphon | cfleming: I don't know about that. I couldn't imagine being able to go and confidently make changes to the compiler of any other language I've used, but with Clojure I can look at the source and understand most of what's going on |
| 05:37 | TEttinger | then there's this 8563-line file, https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java |
| 05:38 | danielcompton | https://www.refheap.com/91008 |
| 05:38 | danielcompton | TEttinger: not a lot in it between them |
| 05:38 | danielcompton | though I do realise they're not all doing the same thing |
| 05:39 | cfleming | CookedGryphon: I've read a few compilers but I find the Clojure one pretty difficult to read. You're right that it's pretty concise for a production language though. |
| 05:39 | TEttinger | danielcompton, why does the last one not show criterium bench stuff? |
| 05:39 | cfleming | CookedGryphon: I like the Clojurescript compiler source a lot. |
| 05:42 | vanila | What compiler might I be better to read? |
| 05:42 | TEttinger | vanila, it might be good to start with some small ones in the compile-to-JS area |
| 05:42 | TEttinger | what are you familiar with now, vanila? https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS |
| 05:43 | vanila | thanks! I'll look at some of these |
| 05:46 | TEttinger | wat is a nice tiny core of a language that may be a good starting point. not compiled though. https://github.com/manuel/wat-js |
| 05:47 | TEttinger | the cola stuff is apparently fascinating to compiler buffs http://www.piumarta.com/software/cola/ |
| 05:48 | vanila | these links are great cheers! |
| 05:48 | rritoch | vanilla why are you digging into the clojure compiler? If your not familiar with compiler design it may take you years. I've watched some of the MIT course on the subject (https://www.youtube.com/watch?v=k-bpyDgBxAo&list=PL0300FE43396456C1&index=1) but it put me to sleep after a few classes since most of it I'm already famliar with. |
| 05:49 | TEttinger | http://www.piumarta.com/software/maru/ is another tiny compiler in C, this one looks quite interesting but I have no idea how cross-platform it is |
| 05:55 | TEttinger | vanila, I would strongly consider the translator rather than compiler route, like clojurescript does (translates to js, then use a compiler like google closure to make it optimized) |
| 05:56 | TEttinger | ki is another apparently very small model that uses clojurescript |
| 05:57 | TEttinger | http://ki-lang.org/ |
| 05:58 | amano- | 木 |
| 05:58 | TEttinger | this is basically the whole thing https://github.com/lantiga/ki/blob/master/src/ki.sjs |
| 05:58 | TEttinger | it macroexpands to javascript, which is extremely clever |
| 05:59 | vanila | wow! |
| 05:59 | vanila | That is really nifty |
| 06:06 | rritoch | TEttinger, are you aware of a clojure form -> C "translator"? One of my clients requested I compile clojure forms to C for use with OpenCL but the project is far beyond the complexity I'm willing to swallow. |
| 06:06 | TEttinger | yes, there's a clojurec out there. |
| 06:06 | rritoch | Cool, I'll have to check it out |
| 06:06 | TEttinger | https://github.com/schani/clojurec |
| 06:08 | TEttinger | bertfrees' fork seems slightly further along, rritoch https://github.com/bertfrees/clojurec |
| 06:09 | TEttinger | oh, and there is opencl support in java, shouldn't be too hard to use if you have a JVM handy |
| 06:09 | TEttinger | https://github.com/ztellman/calx |
| 06:09 | TEttinger | oh mr. tellman, is there anything your libs don't do? |
| 06:09 | TEttinger | (be slow, I guess) |
| 06:11 | rritoch | TEttinger, this is the project so far, it's been sleeping for awhile https://github.com/rritoch/WarpCTL, I used JOCL for the OpenCL support.. |
| 06:13 | rritoch | I lost interest in the project after trying to grab Cuda GPU temperatures using swig, most Cuda libraries are very platform dependent, I had some luck with NVML, but that's as far as I got on the project. |
| 06:14 | TEttinger | cuda itself won't even run on AMD or intel graphics, so there's a limit right off the bat.. |
| 06:15 | rritoch | The library itself uses OpenCL, but for temperatures you need to directly access the device drivers. For AMD it was the ADL-SDK which was fairly easy |
| 06:17 | rritoch | But for Cuda I tried multiple libraries, most won't compile on linux, but the NVML library seems to work, at least on windows, I don't have a Linux+NVidia system to test on. |
| 06:17 | TEttinger | yeah sounds nasty |
| 06:18 | rritoch | Well, my linux box has 2X280X R9's crossfired, without accurate temperature controls they'll burn themselves to death in a short time. |
| 06:19 | rritoch | I'm just assuming similar thermal problems with NVidia high-end GPU's |
| 06:20 | rritoch | Either way, if I can find the way to translate forms to C and inject them into OpenCL that would be awesome. Right now I just make task-specific, hard-coded, kernels. |
| 06:21 | rritoch | That clojurec project looks promising though, if I can find my way through to the parts that can convert forms to C |
| 06:24 | aztak | any suggestions for how to make this more dry and clojuresque? :) https://gist.github.com/metamorph/754c59eba4186c6c4981 (I'm adding a :winner entry to a map depending on existing entries in the map) |
| 06:27 | noncom | how do i select the s-expression where the cursor is currently, in emacs/prelude ? |
| 06:27 | clgv | did ClojureC progress lately? is it usable at all for non-trivial clojure functions? |
| 06:28 | TEttinger | clgv, it has not progressed lately |
| 06:28 | noncom | same as alt + shift + up in ccw |
| 06:28 | clgv | TEttinger: so probably pretty dead... |
| 06:29 | TEttinger | I'd think calx would be the way to go, but I think the client requirements may be different than what it provides |
| 06:31 | clgv | TEttinger: but calx is like embedded assembler in c/c++ ;) |
| 06:41 | pellis | ddellacosta_: thanks for the secretary tip. is there a listing of typical clojurescript frontend stack? |
| 06:42 | ddellacosta_ | pellis: I don't know if there is a typical front-end stack, actually! plenty of folks using reagent along with Om, not to mention server-side rendered stuff w/enlive, etc... |
| 06:43 | ddellacosta_ | pellis: take a look at the Om readme for Om-related stack stuff, at least... |
| 06:43 | pellis | ah, thanks |
| 06:49 | borkdude | I am the only one who wants to turn a C-x-f action into a dired buffer half way through cd-ing a path? |
| 06:50 | borkdude | if not, how do the others do it? |
| 06:54 | borkdude | just C-d does it - yes! |
| 07:11 | clgv | borkdude: I did only hear spanish ;) |
| 07:12 | vijaykiran | hey - that's emacsish |
| 07:14 | clgv | so that's emacs lisp? ;) :P |
| 07:15 | borkdude | clgv key chords |
| 07:16 | vijaykiran | borkdude: I thought (from your tweet) you are using that cursive thingie |
| 07:16 | borkdude | vijaykiran I try to be tool agnostic :) |
| 07:17 | borkdude | vijaykiran normally I use emacs, but for a workshop I will recommend cursive, so I have to have some knowledge about it myself |
| 07:17 | cfleming | vijaykiran: except he loves Cursive, he can't help himself :-) |
| 07:17 | borkdude | cfleming true! |
| 07:18 | borkdude | vijaykiran yesterday I tried emacs with lein ring: didn't work. cursive did. (inc cursive) |
| 07:18 | cfleming | vijaykiran: (disclaimer: I develop Cursive, so take anything I say about how much people love it with a grain of salt) |
| 07:18 | vijaykiran | man all these new-age-ide people ... |
| 07:19 | vijaykiran | cfleming: great work, btw. I'm not a Cursive user ... yet. |
| 07:19 | cfleming | vijaykiran: Thanks! There's always time, we'll be waiting. |
| 07:20 | borkdude | vijaykiran you have emacs and cursive open on the same project and have benefits from both sides |
| 07:20 | cfleming | borkdude: Out of curiosity, what's nicer in Emacs than Cursive at the moment? |
| 07:21 | LauJensen | Has anyone here been able to connect LightTable to an nrepl started from Immutant yet? |
| 07:21 | vijaykiran | Emacs *is* nicer :) well for me it's not just for clojure dev |
| 07:22 | vijaykiran | Not that I don't have IntelliJ open all the time (for lesser lang-dev) |
| 07:22 | borkdude | cfleming I'd have to think about that while developing. I'm just more used to emacs keybindings |
| 07:22 | clgv | LauJensen: what's the problem? unknown port? middleware problems? http transport? |
| 07:23 | borkdude | cfleming I tried C-k in Intellij. It removed the whole line instead of structurally |
| 07:23 | cfleming | borkdude: Sure, just wondering - familarity is huge. |
| 07:23 | LauJensen | clgv: Unsure - Its simply hanging in the "Connecting" phase |
| 07:23 | clgv | LauJensen: can you connect with another client? e.g. leiningen? |
| 07:24 | cfleming | borkdude: Ah, you can fix that. Bind the Kill action to C-k, it'll override the built-in action in Clojure contexts and leave it in others. |
| 07:24 | LauJensen | clgv: Connecting to the same port via cider/emacs works fine |
| 07:24 | borkdude | cfleming I'll try |
| 07:24 | clgv | LauJensen: lein repl :connect host.port |
| 07:24 | kyrre | How can I use clojure.data.zip.xml/xml-> (or any other function) to find the first occurrence of a tag in an XML file (without specifying all the parents) ? |
| 07:24 | cfleming | borkdude: The next drop actually has a keybinding panel that lets you configure all the keybindings at once to the Emacs defaults if you like. |
| 07:24 | clgv | LauJensen: ah ok. so probably a lighttable issue |
| 07:25 | borkdude | cfleming that's very nice |
| 07:25 | cfleming | borkdude: Except for the cider ones unfortunately, since I can't take over C-c by default. |
| 07:25 | LauJensen | clgv: Thats what Im thinking |
| 07:25 | cfleming | borkdude: But paredit etc should all be there. |
| 07:26 | clgv | LauJensen: they have their issues managed on github |
| 07:27 | borkdude | ah nice, C-k works now |
| 07:27 | cfleming | borkdude: Great |
| 07:29 | dysfun | is there a builtin that's equivalent to (partial filter id) ? |
| 07:30 | gfredericks | no; keep is the composition of that with map I think |
| 07:30 | gfredericks | (= (partial filter identity) (partial keep identity)) ;; probably |
| 07:30 | dysfun | that sounds quite handy |
| 07:31 | gfredericks | ,(keep first [[3 4] [] [5 6] [] [] [] [7]]) |
| 07:31 | clojurebot | (3 5 7) |
| 07:32 | dysfun | yeah, i can use that for some of this |
| 07:32 | dysfun | thanks |
| 07:32 | gfredericks | I use (remove nil? ...) a lot, which is slightly different |
| 07:33 | dysfun | ,(remove nil? (map first [[3 4] [] [5 6] [] [] [] [7]])) |
| 07:33 | clojurebot | (3 5 7) |
| 07:34 | borkdude | I wondered, does the clojure compiler optimize when you use collection literals in functions, like (fn [x (#{:a :b} x)), or does it construct the collection in every call? |
| 07:35 | borkdude | (fn [x] ... I mean |
| 07:35 | gfredericks | borkdude: I *think* if the collection contains only literals, the whole thing can be stored once |
| 07:35 | gfredericks | I haven't double checked that it actually does that though |
| 07:35 | gfredericks | hey hey easy to find out |
| 07:35 | gfredericks | ,(defn make-a-set [] #{2 3 7}) |
| 07:35 | clojurebot | #'sandbox/make-a-set |
| 07:35 | gfredericks | ,(identical? (make-a-set) (make-a-set)) |
| 07:35 | clojurebot | true |
| 07:36 | gfredericks | whereas of course: |
| 07:36 | gfredericks | ,(defn make-a-set [x] #{2 3 7 x}) |
| 07:36 | clojurebot | #'sandbox/make-a-set |
| 07:36 | gfredericks | ,(identical? (make-a-set 42) (make-a-set 42)) |
| 07:36 | clojurebot | false |
| 07:36 | borkdude | clojure is fantastic :) |
| 07:40 | gfredericks | iterate-while would be a nice function to have sometimes |
| 07:42 | gfredericks | I hesitate to use iterate + take-while if overshooting the underlying lazy seq would throw an exception |
| 07:47 | m1dnight | My very basic actor implementation is taking shape. It gets ugly real quick though, due to not having pattern matching like Erlang. |
| 07:48 | dysfun | core.match? |
| 07:48 | clojurebot | core.match is a pattern-matching library available for use by anybody but technomancy |
| 07:48 | dysfun | :) |
| 07:48 | dysfun | although i've found in a lot of cases it works out cleaner to not use it than to use it. really depends what your functions look like |
| 07:49 | m1dnight | dysfun: In parameters that is. Like pong(<something>, 1) <body> and pong(<something>, othe_than_1): <body> |
| 07:49 | dysfun | i had a particularly bad example earlier though where the smallest reasonable core.match was 9 lines and the regular clojure 3 lines |
| 07:52 | gfredericks | core.matrix is the first place I've seen the PFoo naming convention for protocols |
| 07:57 | dysfun | (commonly along with (defrecord foo [] foo-proo ... ) |
| 07:58 | dysfun | m1dnight: you can use guards for some of that |
| 07:59 | dysfun | (a :guard my-type?) |
| 07:59 | m1dnight | oh, like haskell |
| 07:59 | m1dnight | ill check it out dysfun |
| 07:59 | m1dnight | thnx |
| 07:59 | dysfun | np |
| 07:59 | dysfun | you may also like core.logic |
| 07:59 | daniel___ | any frameworks built on garden? a bootstrap/foundation type framework would be cool |
| 08:00 | dysfun | or core.unify |
| 08:00 | daniel___ | at least with a grid and some basic components |
| 08:00 | dysfun | it wouldn't take you long to adapt blueprint, for example |
| 08:01 | dysfun | much of it could be done automatically |
| 08:01 | daniel___ | dysfun: how would you do it automatically? |
| 08:01 | daniel___ | but i might start one as a little side project |
| 08:01 | dysfun | find a css parser and process it |
| 08:02 | daniel___ | problem is, im not a css expert |
| 08:02 | dysfun | why do you have to be an expert? |
| 08:02 | dysfun | the syntax is intentionally very simple |
| 08:02 | daniel___ | theres a lot of things to learn when it comes to responsive design |
| 08:02 | daniel___ | media queries etc |
| 08:03 | dysfun | what are you trying to do? |
| 08:03 | daniel___ | have a framework to make sites quickly that look half decent |
| 08:03 | daniel___ | bootstrap and foundation are fine, i'd just like to use clojure |
| 08:03 | daniel___ | since i use clj/cljs all over |
| 08:04 | dysfun | i'm not seeing the problem with using bootstrap and just writing new css in garden |
| 08:04 | daniel___ | if everything was written in garden from the ground up, it would be easier to extend |
| 08:04 | daniel___ | extending bootstrap with plain css doesnt really give you power over all the variables and functions less/sass provide |
| 08:05 | dysfun | ah. well for that, you have compass (which has blueprint mixins), but it's not garden syntax obviously |
| 08:05 | dysfun | you could automatically translate bootstrap to provide garden primitives i think |
| 08:06 | daniel___ | i probably could, i'll give it a go if i have time |
| 08:06 | dysfun | it seems like the element translation function would be <5 lines |
| 08:14 | daniel___ | dysfun: element translation function? |
| 08:15 | daniel___ | to translate less into garden? |
| 08:16 | dysfun | well, slightly more to translate something like less perhaps. but the pure css, yeah |
| 08:17 | daniel___ | yeah, i could try and work backwards |
| 08:17 | daniel___ | and then just refactor |
| 08:47 | silasdavis | is there any way to produce an (AOT'd) record with typed (non-Object) member fields |
| 08:47 | silasdavis | I was sort of hoping annotations might do it |
| 08:48 | stuartsierra | silasdavis: no |
| 08:48 | silasdavis | just write a Java class then I suppose.. ? |
| 08:54 | stuartsierra | ya |
| 09:07 | clgv | silasdavis: primitive member fields? |
| 09:08 | clgv | silasdavis: otherwise you won't win much except you can omit type hints |
| 09:12 | craigglennie | Stupid question… why doesn’t this return two lists, with even numbers in one and odd in the other? (split-with even? (range -5 5)) |
| 09:13 | craigglennie | This works to split into negative and non-negative: (split-with neg? (range -5 5)) |
| 09:13 | stuartsierra | craigglennie: That's not what `split-with` does. |
| 09:14 | stuartsierra | oh, nevermind |
| 09:14 | stuartsierra | ignore me |
| 09:14 | stuartsierra | no, I'm right |
| 09:14 | clgv | ,(split-with neg? (range -5 5)) |
| 09:14 | clojurebot | [(-5 -4 -3 -2 -1) (0 1 2 3 4)] |
| 09:14 | stuartsierra | `split-with` divides a collection into two lists, one *before* the predicate was true, and one *after* |
| 09:15 | Bronsa | craigglennie: use (comp vals group-by) to get what you want |
| 09:15 | stuartsierra | ,(split-with #(= :split %) [1 2 3 :split 4 5 6 :split 7 8 9]) |
| 09:15 | clojurebot | [() (1 2 3 :split 4 ...)] |
| 09:15 | stuartsierra | bah, whatever |
| 09:15 | clgv | or `group-by` with destructuring ^^ |
| 09:15 | stuartsierra | that's what it does |
| 09:16 | stuartsierra | ,(split-with keyword? [:a :b :c 1 2 3 :d :e :f]) |
| 09:16 | clojurebot | [(:a :b :c) (1 2 3 :d :e ...)] |
| 09:16 | clgv | ,(let [{negative true, others false} (group-by neg? (range -5 5))] [negative others]) |
| 09:16 | clojurebot | [[-5 -4 -3 -2 -1] [0 1 2 3 4]] |
| 09:16 | craigglennie | stuartsierra: ahh, I see… I guess that makes sense, given it’s called “split-with” and not “group-by” |
| 09:17 | clgv | ,(let [{even true, others false} (group-by even? (range -5 5))] [even others]) |
| 09:17 | clojurebot | [[-4 -2 0 2 4] [-5 -3 -1 1 3]] |
| 09:17 | clgv | craigglennie: ^^ |
| 09:17 | stuartsierra | The docstring says exactly what it does. "Returns a vector of [(take-while pred coll) (drop-while pred coll)]" |
| 09:18 | clgv | so actually the better name would include a "first" ;) |
| 09:18 | the-kenny | Anyone using weasel with the latest clojurescript/cider/cider-nrepl releases? It seems to "forget" the current namespace when evaluating stuff. Always drops me back into the user namespace in the repl. |
| 09:20 | craigglennie | clgv: thanks, your solution makes sense |
| 09:35 | the-kenny | hm, cider just sets nrepl-buffer-ns when evaluating cider-repl-set-ns. I wonder if either weasel or austin cache the current ns somewhere else. I wonder if cider should emit a call to `in-ns' in such situations. |
| 09:36 | martinklepsch | how big is the memory overhead of having a few million maps vs. a vector just containing the values? |
| 09:36 | martinklepsch | (stored in one big set) |
| 09:36 | clojurebot | Excuse me? |
| 09:39 | dumptruckman | hmm, can someone tell me why nothing prints on this? http://pastie.org/9610294 |
| 09:40 | dumptruckman | shouldn't seq? return false if the collection is empty? |
| 09:41 | joegallo | http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/seq |
| 09:41 | dumptruckman | oh, i just want seq |
| 09:41 | dumptruckman | switching to that and it still doesn't print |
| 09:43 | clgv | martinklepsch: you might be force to drop down to java arrays (or specific tuple classes) depending on the scenario - I had problems with millions of maps that needed to fit into 8GB at the same time |
| 09:44 | martinklepsch | clgv: I'm fine with 16GB but it's tight |
| 09:45 | clgv | martinklepsch: that's why I hated the incater approach to use persistent maps for rows |
| 09:46 | dumptruckman | ok so |
| 09:46 | dumptruckman | http://pastie.org/9610317 |
| 09:46 | dumptruckman | it still doesn't print |
| 09:46 | dumptruckman | and if it's not printing, how is it not stuck in an infinite loop? |
| 09:48 | clgv | dumptruckman: it fails with an exception since you call `pop` on a lazy-seq |
| 09:49 | dumptruckman | oh? |
| 09:49 | clgv | dumptruckman: https://www.refheap.com/91019 |
| 09:49 | sg2002 | Hello. Does anyone here uses that breakpoint macro from the Joy Of Clojure book? In the version they provided there's no way to exit the debugger. Maybe someone has an updated one? |
| 09:50 | sg2002 | Decided to check here before doing this myself. |
| 09:50 | dumptruckman | clgv: noooo i wanted to solve it myself D: |
| 09:51 | clgv | dumptruckman: I only fixed your strange usage of range there |
| 09:51 | clgv | dumptruckman: you can still try the version without loop-recur that's based on range |
| 09:52 | clgv | sg2002: afaik that wont work in an nrepl setup anyway |
| 09:52 | clgv | sg2002: since handling *in* and *out* is different there |
| 09:53 | dumptruckman | clgv: yes, i thought of a way to do it without recurring but this exercise is specifically for recursion |
| 09:55 | dumptruckman | something like (defn factorial [n] (reduce 1 (range 1 (inc n))) |
| 09:55 | clgv | dumptruckman: but you should have seen the exception in your previous version |
| 09:55 | clgv | dumptruckman: almost ;) |
| 09:55 | dumptruckman | koan is not printing any exceptions |
| 09:56 | clgv | that's bad. so you should probably try out in your own repl to see those |
| 09:56 | dumptruckman | oh right |
| 09:57 | dumptruckman | (defn factorial [n] (reduce * 1 (range 1 (inc n))) |
| 09:57 | clojurebot | Cool story bro. |
| 09:58 | dumptruckman | +) |
| 09:59 | dumptruckman | how come you can't pop a lazy seq? |
| 09:59 | clgv | dumptruckman: because it is not a stack |
| 10:00 | clgv | dumptruckman: lists and lazy seqs can only be read from front to back |
| 10:00 | clgv | dumptruckman: you can use `first` and `rest` or `next` |
| 10:00 | clgv | but the lazy seq was not appropriate in that implementation anyway |
| 10:03 | atyz | clgv: you should be able to use peek too |
| 10:05 | clgv | ,(peek (range 10)) |
| 10:05 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IPersistentStack> |
| 10:05 | clgv | atyz: nope, both are specifically for stacks |
| 10:05 | clgv | atyz: e.g. vector |
| 10:09 | justin_smith | ,(peek (list 0 1 2 3 4)) ; or list |
| 10:09 | clojurebot | 0 |
| 10:10 | clgv | ,(pop (list 0 1 2 3 4)) |
| 10:10 | clojurebot | (1 2 3 4) |
| 10:11 | dumptruckman | clgv: i see |
| 10:11 | clgv | yeah well stacks with different ends ^^ |
| 10:11 | dumptruckman | so just not lazy seq |
| 10:12 | atyz | Ah yeah, I know I had used it with lists before, I must have just assumed it was lazy ;) |
| 10:12 | clgv | dumptruckman: you could also restrict to first, rest in the beginning. when preserving types is important you might need those other functions |
| 10:13 | clgv | atyz: though there is actually no good reason why peek/pop don't work on lazy sequences when they do in lists. |
| 10:13 | atyz | ,(peek (range 0 3)) |
| 10:13 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IPersistentStack> |
| 10:13 | justin_smith | ,(peek (into () (range 0 3))) |
| 10:13 | clojurebot | 2 |
| 10:13 | atyz | clgv: Thats what I thought, I was wrong I guess |
| 10:14 | justin_smith | I have never done into () before |
| 10:14 | clgv | ,(peek (cons 1 (cons 2 nil))) |
| 10:14 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack> |
| 10:14 | pyrtsa | ,(peek '(0 1 2 3)) |
| 10:14 | clojurebot | 0 |
| 10:14 | pyrtsa | ,(into () (range 3)) |
| 10:14 | clojurebot | (2 1 0) |
| 10:14 | clgv | nice :D |
| 10:14 | clgv | ,(list* (range 3)) |
| 10:14 | clojurebot | (0 1 2) |
| 10:14 | justin_smith | ,(peek (reverse (range 3))) |
| 10:14 | clojurebot | 2 |
| 10:15 | clgv | ,(peek (list* (range 3))) |
| 10:15 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.ChunkedCons cannot be cast to clojure.lang.IPersistentStack> |
| 10:15 | justin_smith | (def reverse (partial into ())) |
| 10:15 | clgv | muhaha |
| 10:15 | justin_smith | ,(peek (apply list* (range 3))) |
| 10:15 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 10:15 | clgv | a rule of thumb to be safe: use peek and pop only with vectors... |
| 10:16 | pyrtsa | clgv: Well, and with clojure.lang.PersistentQueue. |
| 10:16 | clgv | just made up. but seems reasonable when you consider the above examples |
| 10:16 | pyrtsa | ,(peek (conj clojure.lang.PersistentQueue/EMPTY 1 2 3)) |
| 10:16 | clojurebot | 1 |
| 10:16 | clgv | pyrtsa: a queue implements ipersistentstack? TypeMismatchException! |
| 10:17 | justin_smith | pyrtsa: I was going to mention that one :) |
| 10:17 | pyrtsa | justin_smith: _o/ |
| 10:17 | justin_smith | clgv: and it works on list, list* does not return a list |
| 10:17 | clgv | ,(pop (conj clojure.lang.PersistentQueue/EMPTY 1 2 3)) |
| 10:17 | clojurebot | #<PersistentQueue clojure.lang.PersistentQueue@402> |
| 10:17 | justin_smith | (inc pyrtsa) |
| 10:17 | lazybot | ⇒ 8 |
| 10:17 | pyrtsa | ,(seq (pop (conj clojure.lang.PersistentQueue/EMPTY 1 2 3))) |
| 10:17 | clojurebot | (2 3) |
| 10:17 | clgv | woah that's awful naming. Stack != Queue from an algorithmic point of view |
| 10:18 | justin_smith | ,(peek (pop (conj clojure.lang.PersistentQueue/EMPTY 1 2 3))) |
| 10:18 | clojurebot | 2 |
| 10:18 | clgv | ~guards |
| 10:18 | clojurebot | SEIZE HIM! |
| 10:18 | pyrtsa | peek, pop and conj are all quite overloaded names in Clojure. That's their nature |
| 10:18 | pyrtsa | Well, into as well. |
| 10:18 | clgv | pyrtsa: I comlain about the interface that powers peek and pop ;) |
| 10:18 | clgv | *complain |
| 10:19 | pyrtsa | Nod. |
| 10:26 | verma | when I do a defrecord, how do I make sure that the created record has certain fields in it with some defaults, e.g. I am creating this ModelCache record and I want to have a :state property in it that's an atom? |
| 10:26 | verma | so far it seems to me like I need to accept it as one of the parameters to (ModelCache. (atom {})) |
| 10:26 | verma | s/to/like |
| 10:27 | verma | I want to create a ModelCache instance, but make sure that all of them have an internal key named :state or :__state or whatever |
| 10:28 | clgv | verma: write a constructor function for it |
| 10:28 | verma | clgv can't find any examples |
| 10:29 | clgv | verma: just a plain clojure function that creates the defrecord and initializes it |
| 10:29 | verma | oh ok ok |
| 10:29 | verma | clgv like (defn make-cache [] (assoc (ModelCache.) :state (atom {}))) |
| 10:29 | verma | ? |
| 10:29 | verma | nice |
| 10:31 | clgv | verma: yeah. you could also use (map->ModelCache {:state (atom {})}) - but thats probably a matter of taste |
| 10:31 | clgv | ,(defrecord ModelCache [state]) |
| 10:31 | clojurebot | sandbox.ModelCache |
| 10:32 | clgv | ,(defn make-cache [] (map->ModelCache {:state (atom {})}) |
| 10:32 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 10:32 | clgv | ,(defn make-cache [] (map->ModelCache {:state (atom {})})) |
| 10:32 | clojurebot | #'sandbox/make-cache |
| 10:32 | clgv | ,(make-cache) |
| 10:32 | clojurebot | #sandbox.ModelCache{:state #<Atom@1921250: {}>} |
| 10:32 | verma | nice |
| 10:35 | verma | (inc clgv) |
| 10:35 | lazybot | ⇒ 28 |
| 10:43 | dysfun | (into {} (when (map? a) (filter ... seems like a nice idiom for default-to-{} when writing map filters |
| 10:45 | notofi | Hi, does someone know why with enlive the h2 tag is not inside the a tag with this example? (html/html-snippet "<a> <h2> Foo </h2> </a>") ->> ({:tag :a, :attrs nil, :content (" ")} {:tag :h2, :attrs nil, :content (" Foo ")} " ") |
| 10:54 | xeqi | notofi: enlive uses tagsoup with closes the <a> when it hits <h2>. https://github.com/cgrand/enlive/issues/110 |
| 10:54 | clgv | dysfun: you want to filter map entries? I'd do that with reduce-kv and transient |
| 10:56 | dysfun | reduce-kv is handy too, transient, not so much given the data sizes we're talking about |
| 10:57 | mikepence | hi clojurians :) |
| 10:57 | clgv | dysfun: into uses transients if possible so that point is through ;) |
| 10:57 | tbaldridge | hi mikepence :-) |
| 10:57 | TEttinger | clourers and clojurists too |
| 10:57 | mikepence | yesterday was my first day actually producing a bit of code in clojure for the day job (Living Social) |
| 10:57 | TEttinger | *clojurers |
| 10:57 | mikepence | I am wondering where the community hangs out, and is tolerant of newb questions. :) |
| 10:57 | justin_smith | clojurmancers |
| 10:58 | clgv | haha awakening the dead with lisp |
| 10:58 | mikepence | ah, that is better |
| 10:58 | TEttinger | *I've been up for 17 of the last 24 hours, give me a break |
| 10:58 | justin_smith | this place is definitely tolerant of newb questions |
| 10:58 | dysfun | clgv: clojure does a lot of smart things so i don't have to |
| 10:58 | mikepence | I knew technomancy back in the early rails days |
| 10:58 | mikepence | awesome |
| 10:58 | xeqi | here and the clojure mailing list are both good places for newb questions |
| 10:58 | mikepence | is the clojure mailing list a google group? |
| 10:58 | justin_smith | yes |
| 10:58 | mikepence | thx |
| 10:59 | mikepence | I am coming from ruby, and super-excited by everything about clojure |
| 10:59 | clgv | dysfun: that's a trouble some attitude in general since there are usually several choices in clojure where you should choose the appropriate one... |
| 11:00 | dysfun | clgv: practicalities depend on a few things though. i know the size of the data will never be very large so i'm not concerned about performance implications |
| 11:00 | TEttinger | mikepence, clojure is a wonderful language and I imagine it would come easily to a ruby pro |
| 11:01 | mikepence | I have also had the awesome tutelage of ghadi shaban |
| 11:04 | TEttinger | so here's a nice artificial example of some of the strengths of clojure. |
| 11:04 | TEttinger | ,(take-while #(> (second %) 1) (sort-by (comp - val) (frequencies "the king james bible"))) |
| 11:04 | clojurebot | ([\space 3] [\e 3] [\b 2] [\i 2]) |
| 11:04 | knosys | hi ! |
| 11:04 | TEttinger | that finds all characters in the string "the king james bible" that show up more than 1 time. there are other ways to do it that are better, but i wanted to show comp and sort-by |
| 11:05 | grandy___ | quick question: lein doesn't appear to be loading the files in src, so i have to load them manually and specifiy the paths (in the repl)... is there a way to have it load them automatically when i start the repl? |
| 11:06 | TEttinger | grandy___, have you set a :main namespace in project.clj ? |
| 11:06 | TEttinger | not sure quite what causes that |
| 11:06 | grandy___ | TEttinger: i have not |
| 11:07 | alejandro1 | grandy___: src should be on your loadpath, so all you should need to do is require them. the issue could be the naming of the files not matching what the namespaces are expected to be |
| 11:07 | alejandro1 | I know that's bitten me a few times |
| 11:07 | grandy___ | alejandro1: hmm how can i tell what it's expecting? |
| 11:08 | justin_smith | grandy___: do any namespaces have - in the name? |
| 11:08 | alejandro1 | so like src/example/cool_thing.clj => example.cool-thing |
| 11:08 | TEttinger | ah, that one. |
| 11:08 | grandy___ | alejandro1: i don't believe so |
| 11:08 | justin_smith | grandy___: what does your require invocation in the repl look like? |
| 11:09 | grandy___ | justin_smith: well, i tried to use (in-ns 'myproject.namespace) |
| 11:09 | grandy___ | justin_smith: and then it couldn't find it until I typed (load "myproject/filename") |
| 11:09 | alejandro1 | grandy___: also, does `lein classpath` have your src directory in the first few entries? |
| 11:10 | justin_smith | grandy___: that's not how it owrks |
| 11:10 | justin_smith | grandy___: (require 'myproject.namespace) |
| 11:10 | grandy___ | alejandro1: it does |
| 11:10 | justin_smith | that will load it up |
| 11:11 | grandy___ | justin_smith: indeed it does |
| 11:11 | grandy___ | thanks everyone! |
| 11:11 | justin_smith | grandy___: none of your source files are (or should be) automatically loaded in a repl. They must be required first. |
| 11:12 | grandy___ | justin_smith: ok i guess that makes sense... |
| 11:13 | justin_smith | grandy___: there may be a project.clj trick for making the repl auto-require your core namespace (which then requires the rest) |
| 11:13 | grandy___ | always nice when the problem was my logical reasoning :) |
| 11:14 | grandy___ | can anyone advise me on the best practice for using a repl with cljs? |
| 11:14 | justin_smith | grandy___: well, it's more about the conventions and expectations of the language - Clojure is often logical, but not so much so that you can figure things out by first principles :) |
| 11:14 | grandy___ | :) |
| 11:17 | mikepence | so structured editing is interesting |
| 11:17 | mikepence | I am using cursive |
| 11:22 | dumptruckman | what's that function that puts a string inbetween elements of a collection |
| 11:23 | schmir | dumptruckman: clojure.string/join |
| 11:24 | justin_smith | or interpose, if you want the result to be a collection too |
| 11:24 | justin_smith | (interpose "," (range 10)) |
| 11:24 | justin_smith | ,(interpose "," (range 10)) |
| 11:24 | clojurebot | (0 "," 1 "," 2 ...) |
| 11:25 | dumptruckman | oh |
| 11:25 | dumptruckman | so join does the same thing but turns it into a single string? |
| 11:26 | alejandro1 | dumptruckman: yup |
| 11:26 | alejandro1 | ,(clojure.string/join "," (range 10)) |
| 11:26 | clojurebot | "0,1,2,3,4,5,6,7,8,9" |
| 11:26 | dumptruckman | cool, thanks |
| 11:34 | verma | can't get :notify-command to work for lein-cljsbuild, anyone tried it/ |
| 11:35 | verma | just saying :notify-command ["pwd"] .. should at least print the current working directory after every build |
| 11:36 | verma | ok worked this time :P |
| 11:46 | mikepence | I am not sure if I love structural editing yet, but obviously worth getting to know |
| 11:50 | jcsims | mikepence: you will |
| 11:51 | TimMc | mikepence: You'll become addicted to it soon enough. |
| 11:54 | mikepence | there has been some discusson on the cursive list about what non-emacs-inspired keyboard bindings to use on os x for structural editing commands |
| 11:54 | alejandro1 | mikepence: is structural editing the same thing as paredit in emacs? |
| 11:58 | mikepence | yes, same thing |
| 12:41 | magopian | are people using the (. foo -bar) notation to stay in line with the (.. foo -bar -baz) notation? |
| 12:42 | magopian | because at first, i found the (foo.-bar) notation much shorter and readable, but maybe it's just me? |
| 12:43 | xeqi | I thought (.-bar foo) was the prefered |
| 12:43 | magopian | ah, there's also this notation, i forgot |
| 12:43 | magopian | (foo.-bar works, right?) |
| 12:44 | magopian | i'm looking at some code from https://github.com/Prismatic/om-tools#mixin-tools |
| 12:45 | magopian | there's (. owner -intervals), then (.. owner -intervals (map js/clearInterval)) |
| 12:45 | magopian | btw, would (map .clearInterval) just work the same? |
| 12:47 | hiredman | .clearInterval is not a symbol that is bound to a function object in the environment |
| 12:48 | hiredman | (.clearInterval foo) is syntactic sugar for (. foo (clearInterval)), where . is the interop special form |
| 12:49 | hiredman | it is not calling .clearInterval as a function |
| 12:49 | magopian | I see |
| 12:49 | magopian | so (foo.clearInterval) wouldn't work either? |
| 12:50 | Bronsa | magopian: it will probably work in cljs for reasons, but don't use it |
| 12:50 | Bronsa | it's not clojure syntax |
| 12:50 | magopian | understood ;) |
| 12:50 | magopian | so the canonical way of writing is it (. foo clearInterval) or (. foo -className) (or whatever the property name is) |
| 12:51 | Bronsa | magopian: (.-bar foo) if it's a field, (.bar foo) if it's a method call |
| 12:51 | Bronsa | or (. foo -bar) if you prefer |
| 12:51 | magopian | ok ;) |
| 12:51 | magopian | thanks a lot Bronsa and hiredman |
| 12:51 | Bronsa | but it's rare to use . directly |
| 13:05 | andyf | For anyone out there who has dealt with type tags in Clojure a bit, I've written a few paragraphs about them, and ones that the next version of Eastwood will warn about. Interested in corrections, comments, etc. if you do read it: https://github.com/jonase/eastwood/blob/master/README.next.md#wrong-tag---an-incorrect-type-tag |
| 13:06 | andyf | Note: Eastwood 0.1.5 has not been released yet. Any comments you have can be filed as an issue on Github |
| 13:07 | ambrosebs | andyf: looks reasonable to me |
| 13:07 | Bronsa | andyf: I just read it and it looks fine to me -- an aside note, is this https://github.com/jonase/eastwood/blob/master/README.next.md#known-libraries-eastwood-has-difficulty-with still true? the bit about data.fressian/test.generative |
| 13:07 | andyf | Bronsa: not sure. Let me check the output from my latest test runs... |
| 13:08 | Bronsa | andyf: I believe they should now get :wrong-tag warnings rather than fail |
| 13:10 | andyf | I'm getting exception with latest Eastwood and latest of data.fressian/test.generative |
| 13:11 | andyf | because of weird tags |
| 13:12 | andyf | Eastwood still has tools.reader 0.8.4, in case that might have any bearing on it. |
| 13:13 | m1dnight | Is there a way to recur an enclosing loop/function? I found recur-to but it's a proof of concept atm |
| 13:14 | Bronsa | andyf: shouldn't be relevant, I'll look into it later, I'm pretty sure eastwood should be able to handle them now (my guess is that the wrong-tag handler needs some tweaking :) |
| 13:15 | dbasch | m1dnight: I hope there isn't a way :) |
| 13:15 | m1dnight | Well, it's be nice tbh |
| 13:16 | m1dnight | I need it to something like recur loop until condition is met, then recur function |
| 13:16 | andyf | Bronsa: Thanks for all the quick bug-turnarounds lately. Feels like December & January over again, albeit with fewer bugs :) Note: TGEN-5 patch you suggested has not been committed, but I guess you plan to make t.a(.j) changes that avoid throwing exception even without that test.generative change. |
| 13:16 | m1dnight | ill just have to rethink my code i guess |
| 13:29 | zenoli | So, I need to consume a continuous stream of HTTP data and do something with each chunk. Recommendations for the best library? |
| 13:29 | zenoli | I've been trying with http-kit's client, but it looks like it might be trying to read in the entire (infinite) stream before returning anything. |
| 13:30 | Bronsa | andyf: yeah it looks like I forgot to handle a tag validation path with :validate/wrong-tag-handler, I'll fix that later & data.fressian/test.generative et all should work & just print a warning |
| 13:31 | andyf | Bronsa: Sounds good. Let me know and I'll give it a whirl. |
| 13:32 | Bronsa | andyf: later might mean tomorrow, depending on whether or not I can stay awake long enough to fix it :P |
| 13:33 | andyf | Bronsa: No rush on my part. I'm hoping to release 0.1.5 of Eastwood within a week or two, just to get the new linters out there. |
| 13:34 | bbyler_t_ | hello! i'm running into the error "goog is not defined" when trying to boot up .. what's a good way to get around that? |
| 13:35 | bbyler_t_ | (optimizations: whitespace)... |
| 13:36 | nullptr | bbyler_t_: make sure you're including the goog base.js in your html file |
| 13:38 | bbyler_t_ | hmm...is there by any chance a cdn for base.js nullptr ? |
| 13:39 | bbyler_t_ | i could do a quick download of closure, but just curious |
| 13:39 | nullptr | no, because you wouldn't (well, _shouldn't_) use base.js in production |
| 13:39 | nullptr | base.js should get generated somewhere in your project space by cljsbuild |
| 13:39 | nullptr | cd project-root; find . -name base.js |
| 13:41 | bbyler_t_ | ah of course! thanks nullptr, |
| 14:11 | edbond | async question: if I have a (chan 10000), put! some values and close! chan. Values that are not consumed yet will be destroyed? |
| 14:11 | tbaldridge | edbond: no, data is not destroyed by close!. close! events happen "after" any other puts |
| 14:12 | edbond | tbaldridge, thanks, will have a better sleep now. This question bothered me for some time. |
| 14:13 | edbond | so it's safe to close after all put!s, no need to define :end-of-stream or something |
| 14:13 | tbaldridge | edbond: right, you should never need a signal value like that |
| 14:15 | mi6x3m | Is there a function like map which ignores the result? |
| 14:15 | mi6x3m | useful for side effects |
| 14:16 | ToBeReplaced | justin_smith: do you know if this ever got resolved: http://stackoverflow.com/questions/21706497/why-is-my-clojure-project-slow-on-raspberry-pi |
| 14:16 | tbaldridge | ,(doc doseq) |
| 14:16 | clojurebot | "([seq-exprs & body]); Repeatedly executes body (presumably for side-effects) with bindings and filtering as provided by \"for\". Does not retain the head of the sequence. Returns nil." |
| 14:16 | mi6x3m | (f tbaldridge: I don't need bindings |
| 14:16 | ToBeReplaced | then dorun |
| 14:17 | mi6x3m | ToBeReplaced: I need to invoke a function with every element of the seq |
| 14:18 | mi6x3m | (something f seq) |
| 14:18 | ToBeReplaced | (->> coll (map f) dorun) |
| 14:19 | mi6x3m | ToBeReplaced: the problem is that my sequence is large |
| 14:19 | mi6x3m | and map constructs a new sequence |
| 14:19 | dbasch | mi6x3m: why do you need to realize your sequence for side effects? |
| 14:19 | ToBeReplaced | people often use (doseq [x coll] (f x)) because it better matches the execution paradigm -> you want to side effect, in order, so it's actually imperative |
| 14:20 | mi6x3m | dbasch: it's a bit hard to explain but there's also another way |
| 14:20 | mi6x3m | ToBeReplaced: yes, a good compromise |
| 14:20 | mi6x3m | it's nicely explicit |
| 14:21 | justin_smith | ToBeReplaced: hmm - are you trying to do audio with clojure on a pi? |
| 14:22 | ToBeReplaced | justin_smith: yes; i'm actually trying to do much more and getting a little frustrated since i lack the systems knowledge to debug the performance issue |
| 14:22 | ToBeReplaced | i reduced down to just playback a file as in the stackoverflow question and am seeing skipping as well |
| 14:22 | justin_smith | ToBeReplaced: the behavior described in the question indicates that either there is too much work being done in the processing thread for the tiny CPU, or, more likely, lack of CPU-cache line coherency in the processing task |
| 14:23 | tbaldridge | ToBeReplaced: the rpi is a very, very slow machine. I'm surprised people get a JVM running on it at all. |
| 14:23 | justin_smith | ToBeReplaced: so if you just play back a file, and nothing else, you see skipping? What if you make a minimal java program that plays the file? |
| 14:24 | hiredman | pffft |
| 14:25 | justin_smith | ToBeReplaced: reconsidering my response to the question before, it could be the context switch from the audio data to the clojure data between buffer writes that is killing perf |
| 14:25 | ToBeReplaced | thanks guys... i don't have a size or power restriction, i just need some hardware IO, so i think i might just run a more powerful computer and a usb gpio chip, like the FTDI FT245R |
| 14:27 | ToBeReplaced | justing_smith: yeah i was using AudioSystem/getClip and AudioSystem/getInputStream... i didn't override any of the defaults |
| 14:28 | m1dnight | Ugh, I'm stuck with my actors :p |
| 14:28 | justin_smith | ToBeReplaced: hmm, come to think of it, that might mean that none of clojure was competing for the cache line, so it's just the device / the quality of the jvm on that device to blame |
| 14:28 | m1dnight | I guess it could write a part in Java.. :p |
| 14:28 | ToBeReplaced | i need to ship somewhat soon... and i'm undecided between a) run down the pi rabbit hole and see what i can do... b) upgrade to something like beaglebone black... c) run a more powerful and learn the shenanigans for serial gpio over usb |
| 14:31 | justin_smith | ToBeReplaced: I've had excellent luck with using a csound process for audio processing controlled by a clojure process (either using the OSC protocol over UDP on localhost, or using stdio). csound runs very smoothly on tiny devices. I've done spectral manipulation and resynthesis without glitches on arm devices weaker than an rpi using csound. |
| 14:33 | justin_smith | of course supercollider (the audio backend for overtone) has a nicer api, but it will not run nicely on an rpi |
| 14:33 | ToBeReplaced | justin_smith: good to know... yeah, it's odd... i was able to run sphinx (voice recognition) without hassle... option d) rewrite in python |
| 14:33 | hiredman | ToBeReplaced: which jvm are you using? |
| 14:33 | ToBeReplaced | yeah i tried reading in keyboard notes via overtone and it creeped along |
| 14:33 | ToBeReplaced | openjdk8 |
| 14:34 | ToBeReplaced | pidora, openjdk8, uberjar aot compiled |
| 14:34 | hiredman | ToBeReplaced: sure, but is it using shark or whatever? |
| 14:35 | hiredman | shark is the jvms portable non-optimizing compiler, basically, until somewhat recently it was the only thing available on the pi |
| 14:35 | ToBeReplaced | ah i didn't know that... is there a command line check? |
| 14:36 | hiredman | dunno, on systems that use apt it tends to be part of the package name when you install a jvm |
| 14:37 | ToBeReplaced | ohhhhhh i think that's what i'm on... the package name doesn't say that... but java -version gives me: OpenJDK Zero VM... gotta mean non-optimizing? (build 25.5-b02, interpreted mode) |
| 14:37 | hiredman | I've used clojure on my beaglebone for various things (home automation, simple robots) using oracles jdk and it has worked just fine |
| 14:37 | hiredman | yeah zero |
| 14:38 | hiredman | http://openjdk.java.net/projects/zero/ |
| 14:39 | ToBeReplaced | hiredman: thanks that's really interesting... i'll see if oracle gives me anything better... that would be the triple fistpump success story |
| 14:39 | hiredman | http://www.oracle.com/technetwork/articles/java/raspberrypi-1704896.html has some instructions that may be adaptable |
| 15:04 | mikerod | There was a cool webapp that I found one day where you could search for clojure function usages across many of the known popular libraries. |
| 15:04 | mikerod | Now I can find this with a search, my bookmarks, history, etc |
| 15:04 | mikerod | :( |
| 15:04 | mikerod | Does anyone know the link to what I'm describing |
| 15:06 | mikerod | ?* |
| 15:07 | dbasch | mikerod: you mean http://crossclj.info/ ? |
| 15:08 | mikerod | dbasch: yes! |
| 15:08 | mikerod | (inc dbasch) |
| 15:08 | lazybot | ⇒ 12 |
| 15:08 | mikerod | Thanks, I couldn't figure out how to refind that.... |
| 15:09 | mikerod | Turns out if I would have though "search clojure ecosystem" |
| 15:09 | mikerod | I would have found a reddit |
| 15:09 | mikerod | that would hvae linked to this :P |
| 15:45 | michaelr524 | hmm |
| 15:45 | michaelr524 | so, multiple cider sessions - is it supposed to just work - I don't get it from the documentation.. |
| 15:45 | michaelr524 | ? |
| 15:46 | michaelr524 | do i have to be an alien for this emacs voodoo to ever make sense to me? :) |
| 15:47 | michaelr524 | _everything_ works exactly the way you wouldn't expect it work |
| 15:56 | m1dnight | Ugh, I need some help guys. I've been breaking my head over this the entire day, I have something that shows what I want but now how I want it. |
| 15:56 | m1dnight | Does nyone have a minute? |
| 15:56 | clojurebot | I don't understand. |
| 15:57 | michaelr524 | m1dnight: shoot |
| 15:57 | cbp | Does anyone who knows cider.el know with what the 'cider-find-or-create-repl-buffer' function was replaced? |
| 15:58 | m1dnight | I have a thread Y, and that thread has to look over a queue. I can say in that thread "get element X" and then that thread has to look at a ref/atom/.. and see if it has an element in it. If not, it has to block until that ref/atom has one. If it never gets one, the function never returns. |
| 15:58 | m1dnight | I have this, and it works. The point is, that function that blocks util an element is available spins and thus uses A LOT of cpu power, which I don't want. |
| 15:59 | m1dnight | In java, i'd go about using .wait() and .notify(), but that's not really possible in clj, afaik. So i'm not sure how to go about it.. |
| 15:59 | michaelr524 | m1dnight: sounds like a task for core.async - have you looked at it? |
| 15:59 | m1dnight | http://pastebin.com/0Z3e6eW1 <- This is what I have at the moment but not really good |
| 16:00 | m1dnight | Hmm, I was reading that a few hours ago and that looked promising indeed. It's CSP, right? |
| 16:00 | m1dnight | I'll have a look at it :) |
| 16:00 | m1dnight | Thnx |
| 16:01 | michaelr524 | m1dnight: also, I see there that you are importing LinkedBlockingQueue |
| 16:01 | michaelr524 | Why don't you use it? |
| 16:02 | michaelr524 | m1dnight: check this also: http://clojuredocs.org/clojure.core/seque |
| 16:05 | dbasch | m1dnight: btw, (if (not (nil? match)) ...) is almost the same as (if match ...) |
| 16:05 | dbasch | the only difference is that the first will return true when match is boolean false |
| 16:08 | m1dnight | michaelr524: Yeah, that was for an implementation I already had. I constructed a minimal example to figure out how to go about implementing it in the code I already have. That one involves macros and stuff so not comfy to start experimenting in it. |
| 16:09 | m1dnight | Perhaps I'll use a Java object to do it and use .wait and .notify. I'm not really sure yet |
| 16:10 | michaelr524 | m1dnight: usually the most intimidating clojure code is the most gratifying when you finally understand it :) |
| 16:12 | m1dnight | Well, that's very much true though! :) |
| 16:13 | m1dnight | I was happy to accept to challenge to implement almost all concurrency models in clojure for my thesis |
| 16:13 | m1dnight | "Actors are going to be the easiest so i'll start with that" |
| 16:13 | m1dnight | the challenge* |
| 16:14 | justin_smith | m1dnight: maybe you mistook the simplicity of a description of actors for simplicity of implementation? |
| 16:16 | ToxicFrog | Yeah, speaking as someone who has implemented actor-like APIs on two different platforms, they're a lot easier to describe than they are to implement robustly. |
| 16:16 | m1dnight | justin_smith: I did, as well as my promotors :p |
| 16:17 | m1dnight | it's not a lack of a feature, it's a feature something something |
| 16:29 | michaelr524 | who is using cider with emacs-live here? |
| 16:30 | m1dnight | i'm using cider and emacs, no clue what emacs-live is though |
| 16:30 | michaelr524 | m1dnight: C-c C-p does it popup a window or somtehing for you? |
| 16:30 | tbaldridge | michaelr524: I've used it on and off, sadly I've found it too heavy for my day-to-day use. |
| 16:30 | m1dnight | michaelr524: Undefined |
| 16:31 | tbaldridge | ...so I now use Cursive. Sad when a Java IDE is more responsive than emacs. |
| 16:31 | michaelr524 | cursive is great - once the new machine arrives by mail I might switch to it :) |
| 16:31 | michaelr524 | I'm currently on a T60 |
| 16:32 | ro_st | tbaldridge: admittedly very tempted to try cursive, really enjoy seeing it in your vids. but i'm just so used to my keybinds in emacs now |
| 16:32 | michaelr524 | C-c C-p is described as "Evaluate the form preceding point and pretty-print the result in a popup buffer." |
| 16:33 | michaelr524 | but instead of poping up something it just displays a one line buffer at the bottom of the screen - a bit similar to the "echo area" of C-c C-e |
| 16:33 | ro_st | when i use C-c C-p i get the popup buffer |
| 16:34 | michaelr524 | I suspect it's the combination of cider with emacs-live.. |
| 16:34 | tuft | hello clojureverse |
| 16:34 | michaelr524 | I really like the fact that cursive has a clojure debugger |
| 16:34 | noonian | i found the emacs setup from brave clojure to be pretty nice, and i'd heard previously from people who tried emacs-live that it felt a little bloated |
| 16:34 | michaelr524 | it saves me lot's of time once in a while |
| 16:34 | noonian | hello tuft |
| 16:35 | ro_st | i use rkneufeld's gist with some addons. very light and simple |
| 16:35 | michaelr524 | ro_st: url |
| 16:35 | ro_st | https://gist.github.com/rkneufeld/5126926 |
| 16:36 | michaelr524 | thanks |
| 16:36 | ro_st | its out of date because nrepl.el -> cider |
| 16:39 | erdos | hello everyone. i need some help with defrecords, please. i would like to type annotate an argument of my function, but when the function is called, i get the following exception: "erdos.ps.PSto" cannot be cast to "erdos.ps.PSto". the type names do match here, howerver the `instanceof?` call on the value of argument also fails. it is like there are two versions of the type with the same name, despite being defined only once. thank you |
| 16:39 | tbaldrid_ | erdos: are you doing this at the REPL? |
| 16:39 | hiredman | oh, well it isn't defined only once |
| 16:40 | hiredman | everytime clojure runs a defrecord it defines the type again, so if you are loading the namespace code more than once then there you go |
| 16:40 | ro_st | yup. restart jvm and see if the problem persists |
| 16:41 | michaelr524 | tbaldridge: oh, btw - could you share your key bindings for cursive? |
| 16:41 | tbaldridge | you don't really have to do that, just re-eval the functions that use the record |
| 16:42 | erdos | tbaldrid_: yes, on the repl, even after completely restarting it. |
| 16:42 | tbaldridge | well hiredman is right, something is re-evaling your defrecord |
| 16:46 | erdos | tbaldridge: so you mean that requiring an ns twice from two differenc places creates the type twice? |
| 16:46 | tbaldridge | erdos: no, that's fine, I mean either two defrecords, or evaling a defrecord twice |
| 16:46 | mi6x3m | does anyone know how to easily get the post parameters out of the body with httpkit? |
| 16:46 | hiredman | or requiring with :reload and :reload-all |
| 16:48 | hiredman | or if you are aot compiling and have a generate class file sitting on disk |
| 16:48 | hiredman | that can cause these issues |
| 16:48 | hiredman | a generated |
| 16:48 | erdos | hiredman: "lein clean" does remove these classes, right? |
| 16:49 | hiredman | erdos: I forget, it seems like it should |
| 16:49 | hiredman | if are aot compiling, stop |
| 16:49 | hiredman | if you are |
| 16:52 | justin_smith | mi6x3m: are you using ring? |
| 16:52 | mi6x3m | justin_smith: no |
| 16:52 | justin_smith | any particular reason not to use ring? because it's easy to get the post parameters with a ring middleware |
| 16:53 | justin_smith | and there is a ring adaptor for http-kit |
| 16:53 | amalloy | it's probably pretty easy with http-kit too, justin_smith, we just don't happen to know it |
| 16:53 | mi6x3m | justin_smith: because this is a demo application with nothing related to a web module :) |
| 16:53 | mi6x3m | I just use httpkit to demonstrate something |
| 16:54 | justin_smith | so http, but not at all web? |
| 16:54 | mi6x3m | justin_smith: yes :) |
| 16:54 | clojurebot | Cool story bro. |
| 16:54 | amalloy | (inc clojurebot) |
| 16:54 | lazybot | ⇒ 46 |
| 16:54 | mi6x3m | justin_smith: meh, I'll just parse them myself |
| 16:54 | justin_smith | there is an apache library for that sort of thing |
| 16:55 | amalloy | mi6x3m: it sounds like you are making things harder for yourself because the goal is "simple", as if you believe the default choices are hard to use but parsing http requests by hand is easy |
| 16:55 | justin_smith | amalloy: I think more likely http-kit gives you a stream for the body, and lets you leverage the various libs available for parsing or utilizing it |
| 16:56 | mi6x3m | yes it's just (slurp :encoding "UTF-8") in my case |
| 16:57 | justin_smith | well, that gets the text, but doesn't do the parsing - probably easier to hand the stream to the apache.data.codec or whatever it was called rather than construct a string then parse it by hand |
| 16:59 | mi6x3m | justin_smith: I can't seem to find that library :/ |
| 17:07 | justin_smith | https://github.com/clojure/data.codec I misremembered, it's clojure/data.codec and it uses apache commons codec |
| 17:07 | justin_smith | erm, never mind, that's not it |
| 17:12 | borkdude | is http kit now seen as the future replacement for jetty also for local development? |
| 17:12 | amalloy | i can't imagine why. i'd just use jetty |
| 17:13 | amalloy | or aleph/netty if asynchrony is important to me |
| 17:13 | noonian | well, i always use http-kit now just because of its support for websockets and stuff |
| 17:13 | noonian | but i had already stopped using the ring leiningen plugins in development so lack of tooling support didn't affect me |
| 17:15 | dbasch | when I see questions like this one, I just want to answer "use clojure" http://stackoverflow.com/questions/26149732/how-to-sort-an-arraylist-using-two-sorts#26149840 |
| 17:16 | mi6x3m | justin_smith: indeed i'll just use form-decode in ring.util |
| 17:16 | amalloy | dbasch: it was tempting to answer http://stackoverflow.com/q/26129172/625403 with "use haskell" |
| 17:17 | dbasch | I'm tempted to upvote that answer just because it's long! |
| 17:17 | amalloy | and you'd upvote "use haskell" because it's short! everybody wins! |
| 17:18 | m1dnight | https://github.com/puniverse/pulsar/blob/master/src/main/clojure/co/paralleluniverse/pulsar/actors.clj#L479 This is the receive code for Pulsar. Why on earth would I be able to do it with less :p |
| 17:19 | tbaldridge | m1dnight: you don't need all that crap for actors, you only need it if you're trying to duplicate erlang processes |
| 17:20 | tbaldridge | m1dnight: the stuff here is way simpler http://www.dalnefre.com/wp/ |
| 17:20 | m1dnight | tbaldridge: Yeah, I kinda have to duplicate the actor model in clojure. |
| 17:20 | justin_smith | tbaldridge: it's like the difference between having a digital movie as accurate as film, vs perceptibly identical to film (the latter being orders of magnitude larger a task) |
| 17:20 | m1dnight | I might be better off doing it in Java though. I havent thought it through yet. |
| 17:21 | tbaldridge | that's kindof what I'm saying, Erlang isn't "the actor model" it's "the actor model plus a ton of stuff that complicates everything" |
| 17:21 | m1dnight | Oh, okay that's what you meant |
| 17:21 | m1dnight | Sorry I can't really brain properly anymore :p |
| 17:22 | noonian | the actor model is really very simple |
| 17:22 | tbaldridge | http://www.dalnefre.com/wp/2010/06/actors-in-clojure-why-not/ <- the Blog's author vs comments Rich made about actors |
| 17:22 | tbaldridge | for the record, I agree with Rich when it comes to actors, but that post points out some really important misconceptions people have about actors |
| 17:27 | m1dnight | That was a very very very good read tbaldridge |
| 17:28 | m1dnight | However, I senses a bit of passive agression in Rich's statements, or is it just me? |
| 17:28 | muraiki | I'm trying to choose between erlang and clojure for concurrency currently, so that article should be a big help. thanks |
| 17:29 | m1dnight | I had a LOT of fun writing Erlang! :) But clojure has a more modern feel to it. I can't put it into words :p |
| 17:30 | devn | how do people just run a .clj file as a script (basically relying on whatever clojure version that's bundled with lein)? |
| 17:30 | technomancy | devn: lein run -m clojure.main/main myfile.clj |
| 17:30 | technomancy | (is one way) |
| 17:30 | gfredericks | does anybody know if core.matrix is extensible wrt scalars? or does a new scalar type require a new matrix impl? |
| 17:31 | gfredericks | what I want in particular are complex scalars |
| 17:31 | technomancy | gfredericks: have you tried using SBT? |
| 17:31 | devn | technomancy: thanks -- didn't want to have to grab lein-oneoff or something |
| 17:32 | muraiki | m1dnight: that's good to know, and also the sense that I got. I've also considered elixir, but I'm not sure if it's ready yet, and it seems like I'd also have to learn erlang anyways to really take advantage of the ecosystem |
| 17:32 | technomancy | devn: the downside is that will work differently if invoked from a project directory |
| 17:33 | gfredericks | technomancy: haven't heard of that |
| 17:33 | gfredericks | nor is google helpful |
| 17:34 | hiredman | gfredericks: scala joke |
| 17:34 | hiredman | (scala build tool) |
| 17:34 | gfredericks | it all makes sense now |
| 17:34 | gfredericks | I should expect technomancy to make jokes about build tools. |
| 17:34 | technomancy | lots of complicated scalars there! |
| 17:35 | technomancy | complex |
| 17:35 | technomancy | whatever |
| 17:35 | technomancy | complected |
| 17:35 | gfredericks | hey technomancy so three build tools walk into a bar |
| 17:36 | gfredericks | no they don't. |
| 17:37 | amalloy | hiredman: is the s in sbt scala? i thought it was supposed to be simple |
| 17:37 | hiredman | whichever |
| 17:37 | gfredericks | or smalltalk |
| 17:37 | gfredericks | or sea++ |
| 17:37 | dbasch | amalloy: scala was supposed to be simple |
| 17:38 | dbasch | or maybe it wasn't |
| 17:38 | justin_smith | if it was, that reflects badly on their design skills |
| 17:39 | gfredericks | what does it take to get `lein repl` to use a forked version of nrepl? |
| 17:39 | dbasch | I would have called it Javaskell |
| 17:39 | technomancy | that joke works better with a non-rhotic accent, so sorry all non-commonwealth persons |
| 17:39 | justin_smith | haskpresso |
| 17:41 | m1dnight | :D |
| 17:41 | cfleming | michaelr524: The next drop of Cursive (in a day or two) has a panel to configure your keybindings in one go. |
| 17:41 | m1dnight | If Hitler ever made a programming language, I think it would Haskell |
| 17:41 | m1dnight | I just tried Cursive, but the formatting is WAY off :p |
| 17:42 | m1dnight | (formatting of source) |
| 17:42 | dbasch | Ha ࿕kell |
| 17:42 | cfleming | michaelr524: It has two sets, basically what I use (see https://cursiveclojure.com/userguide/paredit.html) and Emacs |
| 17:42 | cfleming | m1dnight: What are you seeing with formatting? |
| 17:42 | cfleming | m1dnight: There are various options. |
| 17:43 | m1dnight | Parts that hav too much tabbing. A manual indentation, with a tab too much, followed by a format did fix it though |
| 17:43 | m1dnight | might be because I edited in emacs |
| 17:43 | cfleming | m1dnight: Can you show me an example? |
| 17:43 | michaelr524 | cfleming: Great! Thanks :) |
| 17:45 | m1dnight | let me look it upt cfleming it's a few commits back |
| 17:45 | cfleming | m1dnight: Thanks - a few people have mentioned this when starting with Cursive but I've never seen an example. |
| 17:52 | gfredericks | so I see tools.nrepl is included with leiningen's :base profile; does that mean the only way to exclude tools.nrepl is to somehow exclude the :base profile? |
| 17:53 | gfredericks | or is there some special merge feature I'm unaware of? |
| 17:53 | technomancy | gfredericks: it should defer to nrepl in :dependencies if one is present |
| 17:54 | technomancy | oh, unless you're changing the group-id? |
| 17:54 | technomancy | in that case you can shadow :base by putting :base {} in project.clj |
| 18:01 | gfredericks | hmm |
| 18:01 | gfredericks | okay |
| 18:01 | gfredericks | I guess a local install with the same group ID is probably easiest |
| 18:01 | gfredericks | although none of these options in :base look too crucial |
| 18:02 | technomancy | gfredericks: hm; oh right you would lose some other :base things |
| 18:04 | user9865 | anyone around? |
| 18:04 | technomancy | nope |
| 18:05 | justin_smith | user9865: if you have a question you can go ahead and ask |
| 18:06 | user9865 | Persistent data structures - can they be shared safely between threads outside STM? |
| 18:06 | justin_smith | if used as intended, yes |
| 18:06 | hiredman | of course |
| 18:06 | hiredman | by definition |
| 18:07 | hiredman | they are immutable |
| 18:07 | user9865 | so what is the point of refs? Safe update of a single reference ? |
| 18:07 | jeremyheiler | yes |
| 18:07 | hiredman | user9865: I recommend rich's "our we there yet talk" |
| 18:08 | justin_smith | refs are a reference to an immutible datatype - the ref changes, the data it points to does not |
| 18:08 | user9865 | OK i see - threads can share PDS's but single ref updates have to be co-ordinated |
| 18:08 | hiredman | I would also pretty much recommend ignoring the stm |
| 18:08 | m1dnight | Simply put: if you "change" a data structure in clojure, it tries to share as much with the original as possible |
| 18:09 | hiredman | user9865: they are by definition coordinated |
| 18:09 | m1dnight | if you cons 1 to '(2 3 4) you have a pointer to a list that starts with 1, but '(2 3 4) are shared. |
| 18:09 | m1dnight | Correct me if im wrong |
| 18:09 | user9865 | yep that is as I understand it |
| 18:09 | noonian | yep, and all the core datastructures work that way |
| 18:10 | user9865 | @midnight - why ignore STM ? |
| 18:10 | hiredman | I am pretty sure I said that |
| 18:10 | user9865 | yeah sorry you did |
| 18:10 | hiredman | in practice the stm doesn't really get used |
| 18:11 | hiredman | it of course depends a lot on what you are doing, maybe if you are writing a big simulation or something you may use refs |
| 18:11 | technomancy | user9865: most state change is either trivial (no need for coordination) or cross-server, where STM doesn't help |
| 18:11 | noonian | user9865: the 'ref' reference type uses the stm but you usually don't need that level of coardination between multiple mutable refs, most clojure programs have 1 or maybe 2 mutable things in them if any |
| 18:11 | gfredericks | I used refs once and it was almost as a joke |
| 18:11 | hiredman | but generally you might use an atom here or there |
| 18:13 | user9865 | ok i can see why refs wouldn't be used much if you have PDS's anyway - the book i am reading made a big deal of them though |
| 18:13 | technomancy | they are conceptually very cool |
| 18:14 | gfredericks | just like erlang |
| 18:14 | technomancy | these days almost all server-side software is distributed systems, where thety don't help at all |
| 18:14 | hiredman | I dunno, most large clojure shops use it for large data processing jobs, the stm just isn't useful there |
| 18:16 | hiredman | rich's example of the stm is the ants simulation, and in my limited circle I don't know people who write things like that |
| 18:17 | technomancy | if clojure got used for non-server things, STM would get used more I bet |
| 18:18 | hiredman | well, thinking about, I think the ants simulation is really a demo, if I was charged with writing such a thing, I don't think I would write it like that |
| 18:19 | gfredericks | my use was qubit simulation....so that goes with the simulation theme |
| 18:20 | hiredman | it seems like the best way to run a large scale simulation is to figure out how to formulate it as matrix algebra and turn some fortran library loose on it |
| 18:20 | hiredman | so I dunno |
| 18:20 | vIkSiT | hello all |
| 18:21 | vIkSiT | in a clojurescript om app, I'm getting an issue using transact! and update! |
| 18:21 | vIkSiT | https://gist.github.com/viksit/ffe8a79a50e84f623128 |
| 18:21 | hiredman | an important thing to realize though is the STM is just refs, the other reference types are not part of the stm (agents are slightly coupled, but entirely useable without it) |
| 18:21 | vIkSiT | Uncaught Error: No protocol method ITransact.-transact! defined for type cljs.core/Atom: [object Object] |
| 18:21 | noonian | vIkSiT: you need to use transact! and update! on a cursor that Om passes your component, not on the atom itself |
| 18:21 | vIkSiT | Do you guys know what I'm doing wrong? |
| 18:21 | hiredman | (not that I really use agents for anything either) |
| 18:22 | vIkSiT | noonian, ah - how do I simulate what om passes? |
| 18:24 | noonian | vIkSiT: are you trying to use Om? or just update your atom? |
| 18:25 | vIkSiT | noonian, well, I'm using Om. |
| 18:25 | vIkSiT | I'm just trying to also figure out what's different in doing (om/root timeline-view timeline-state {:target (. js/document (getElementById "main"))}) |
| 18:25 | vIkSiT | vs updating it myself |
| 18:26 | vIkSiT | how does that cursor get formed, exactly and how do I simulate to test whether it works? |
| 18:26 | noonian | vIkSiT: thats my one gripe about Om, if you want to have toplevel things affect toplevel app state you need to do some hacks to make the root cursor available |
| 18:26 | vIkSiT | because right now, I haven't figured out yet how to write an om component with the Irender and whatnot |
| 18:26 | vIkSiT | noonian, ah :/ |
| 18:27 | vIkSiT | noonian, what kind of hacks? any documented ones/I can read about somewhere? gists? |
| 18:27 | noonian | vIkSiT: your timeline-view in that example will get passed a cursor that looks and acts like app-state that you can transact! on |
| 18:28 | vIkSiT | noonian, right- but right now, that (get-posts function isn't integrated into my view |
| 18:28 | vIkSiT | since I haven't quite figured out the lifecycle yet |
| 18:28 | vIkSiT | I know I need to do a reify (IWillMount (..))) |
| 18:29 | vIkSiT | but still hacking through that hehe |
| 18:29 | vIkSiT | I figured if I call (get-posts) before |
| 18:29 | vIkSiT | atleast my app state is populated |
| 18:29 | vIkSiT | and my view will render it |
| 18:30 | noonian | yeah, i can't help more right now; at work, but i usually use core.async to coordinate, a simple hack for testing would be in your views IWillUpdate lifecycle protocol store the root cursor in a top level atom |
| 18:31 | vIkSiT | ah |
| 18:31 | vIkSiT | k thanks. Will check |
| 18:57 | theseb | 2 newb questions....1. Why/how does clojure use brackets?...[] ....I thought there was an unspoken law that lisps had to only use parens?!? 2. Does Clojure have wrappers to call Java functions?...I don't get how that works since Java functions are in a different language |
| 18:57 | theseb | any help appreciated |
| 18:58 | hiredman | clojure compiles to jvm bytecode just like java does, so clojure can emit the same jvm bytecode for a method call as java to call a java method |
| 18:59 | hiredman | clojure has more data structure literals than traditional lisps and uses them as part of its syntax |
| 18:59 | hiredman | [] for a vector, {} for a map, #{} for a set |
| 18:59 | theseb | hiredman: thanks..but by allowing brackets doesn't that interere with desire to have code and data look the same? |
| 18:59 | technomancy | schemes use square brackets too; the "parens are the only true form of homoiconicity" is a CL trope |
| 19:00 | hiredman | theseb: how so? vectors are both valid code and data in clojure |
| 19:00 | hiredman | technomancy: being scheme it of course depends on the scheme |
| 19:00 | technomancy | hiredman: hm; I thought it was in r5rs |
| 19:00 | theseb | hiredman: ok....so they at least only allow parens, brackets and braces..at least they kept the deviations to a minimum |
| 19:00 | technomancy | been a few years so I could be thinking of something else |
| 19:01 | technomancy | theseb: there's no "deviation" |
| 19:01 | theseb | hiredman: and lastly how call Java libraries from Clojure? |
| 19:01 | hiredman | technomancy: could me I just read stuff that refers to old schemes |
| 19:01 | technomancy | data structures are valid code |
| 19:01 | hiredman | theseb: checkout clojure.org or one of the many tutorials on the internet that google can find for you |
| 19:01 | technomancy | though I guess you don't see any core macros using sets; you could certainly write your own |
| 19:02 | theseb | ok thanks |
| 19:03 | hiredman | technomancy: well, you don't have to use them in a macro to be code, a literal is code |
| 19:06 | noonian | they probably don't use set syntax for code because the # makes it uglier than the other literals available |
| 19:07 | technomancy | it would scare away those with perl allergies |
| 19:07 | hiredman | code that evaluates in an undefined order is weird |
| 19:07 | hiredman | (which is technically true of maps to, but array maps sort of get around that) |
| 19:07 | hiredman | too |
| 19:17 | vIkSiT | eeh |
| 19:17 | vIkSiT | how do you guys parse json in clojure? |
| 19:17 | vIkSiT | using transit? |
| 19:17 | amalloy | cheshire |
| 19:17 | vIkSiT | ah |
| 19:18 | vIkSiT | amalloy, cheshire vs transit? any thoughts? |
| 19:18 | justin_smith | transit is a whole other thing. It isn't a json parser. |
| 19:18 | noonian | thank god transit came out, it was getting rediculous not being able to parse json :P |
| 19:19 | vIkSiT | hehe |
| 19:19 | hiredman | transit is a new set of formats above and beyond json |
| 19:19 | hiredman | chesire is a json parser |
| 19:19 | justin_smith | vIkSiT: data.json comes with clojure, but many of us prefer cheshire |
| 19:19 | hiredman | (as is clj-json and data.json) |
| 19:19 | dbasch | ibm needs to come up with transitx |
| 19:19 | technomancy | justin_smith: "comes with" clojure? |
| 19:19 | vIkSiT | ah hmm |
| 19:19 | vIkSiT | I didn't realize data.json was included? |
| 19:19 | technomancy | vIkSiT: it's not |
| 19:20 | vIkSiT | *whew* |
| 19:20 | justin_smith | technomancy: oh, I was wrong about that |
| 19:20 | vIkSiT | of course, I wish it was :) |
| 19:20 | dbasch | vIkSiT: use cheshire |
| 19:20 | justin_smith | cheshire is better anyway, yeah |
| 19:20 | noonian | yeah, it's named after a cat |
| 19:21 | justin_smith | and would you believe, it handles smile data? |
| 19:21 | vIkSiT | ah |
| 19:21 | vIkSiT | thanks for the info! |
| 19:23 | vIkSiT | haha |
| 19:24 | vIkSiT | *small problem* - clojurescript vs clojure. sigh |
| 19:24 | vIkSiT | I forgot I was writing clojurescript. |
| 19:25 | dbasch | vIkSiT: in that case just use the native js parser |
| 19:30 | technomancy | aka eval |
| 19:32 | dbasch | well, it's eval after verifying that's it's actually json |
| 19:32 | dbasch | otherwise the web would be a horrible(r) place |
| 19:34 | dbasch | I'm convinced that all the unnecessary json generation/parsing we do is one of the root causes of global warming |
| 19:42 | {blake} | I'm having trouble figuring out dependencies. |
| 19:43 | {blake} | I've got a rather complex project with many files. One of them :requires clj-time.core (for example). |
| 19:43 | {blake} | But I don't have clj-time (anything) in my project.clj. |
| 19:43 | justin_smith | {blake}: lein deps :tree |
| 19:44 | {blake} | justin_smith Well...that's...a thing. |
| 19:44 | hiredman | {blake}: that is bad, if it works at all it is because some other dependency you do depend on is pulling in clj-time, so you are getting it transitively |
| 19:45 | {blake} | hiredman, aha...so that actually answers all of my questions. Since the next one was going to be: "Not only is it not in the project.clj, the version being used is horribly out-of-date." |
| 19:45 | hiredman | you should not directly depend on (via require, etc) any code that lein thinks you only transitively depend on |
| 19:45 | {blake} | There it is...it's in compojure. |
| 19:47 | {blake} | Boy, does that seem bad. I can use different versions in the same code I presume. |
| 19:48 | hiredman | can't |
| 19:49 | {blake} | hiredman, Well, that seems like a problem. I need a newer version but rely on code that uses an older version? |
| 19:50 | hiredman | well, if the api hasn't changed, you can tell lein to ignore compojure's dependency and then specify your own dependency |
| 19:50 | technomancy | or if the API has changed only in additive ways |
| 19:50 | hiredman | right |
| 19:51 | hiredman | if not then that won't work |
| 19:51 | {blake} | I think it's only additive. If I specify a particular clj-time in the project.clj, that'll override? |
| 19:52 | technomancy | yeah, direct deps win over transitive ones |
| 19:52 | hiredman | I'd suggest using :exclude too |
| 19:53 | hiredman | you could upgrade your version of compojure, it doesn't look like clj-time is in the project.clj for the latest |
| 19:53 | amalloy | it seems pretty weird for compojure to depend on clj-time anyway |
| 19:54 | hiredman | yeah |
| 19:54 | {blake} | hiredman, To exclude...? And, actually, I'm not sure why compojure is in this project at all. It might just be a leftover. (Old, large project, never refactored.) |
| 19:54 | hiredman | I am trying to figure out when compojure ever depended on clj-time, and I don't see that anywhere |
| 19:55 | justin_smith | {blake}: was clj-time being used directly by compojure, or by one of compojure's deps? |
| 19:55 | hiredman | {blake}: then rip it out |
| 19:56 | {blake} | compojure 1.1.5 used ring/ring.,core 1.1.7, which in turn used clj-time 0.3.7, if I'm reading this correctly. |
| 19:57 | amalloy | {blake}: yep, sounds right to me |
| 19:57 | justin_smith | it's pulling it in for calculating intervals and seconds in cookies |
| 19:57 | justin_smith | https://github.com/ring-clojure/ring/search?utf8=%E2%9C%93&q=clj-time |
| 19:57 | amalloy | in fact latest compojure still depends on clj-time transitively |
| 19:58 | hiredman | ah |
| 19:58 | hiredman | I assumed "it's in compojure" meant "compojure directly depends on it" |
| 19:58 | {blake} | Muchas gracias, clojuros. Very educational. |
| 19:59 | {blake} | hiredman, apologies for the imprecision. |
| 20:01 | hiredman | I should have known better than to assume, and it didn't really matter anyway |
| 20:02 | {blake} | Is there any way to tell from inside a repl what version of a lib you're using? |
| 20:02 | gfredericks | sorta |
| 20:02 | gfredericks | it takes a lot of fumbling |
| 20:02 | amalloy | {blake}: not really. library versions don't exist at runtime |
| 20:03 | {blake} | Bummer. I notice there seems to be some sort of lag between Cursive and...well, things NOT Cursive. It can be very confusing. |
| 20:04 | hiredman | the dependency stuff comes from maven, which lein grafts on top of clojure with a lot of other stuff |
| 20:05 | {blake} | And lord knows, I'm grateful. They keep threatening to make me go back to Ruby, and I get the cold sweats thinking about gemsets. |
| 20:05 | hiredman | if you are new to clojure a good 50% of what you think of as clojure is behaviour from lein and not "clojure" per se |
| 20:06 | {blake} | hiredman, Very true. I picked that up pretty fast, I think. |
| 20:07 | {blake} | (It's probably the only thing I've picked up fast in Clojure. That and the REPL.) |
| 20:08 | {blake} | See, now I've got clj-time/core 0.8.0 in my app, and it knows all the functions up to line 599. |
| 20:13 | dbasch | compojure depends on ring which uses clj-time only for cookies |
| 20:14 | justin_smith | dbasch: as I showed with my above github link |
| 20:14 | dbasch | yes, that's what I was looking at. Was I typing out loud again? :P |
| 20:52 | vIkSiT | hmm |
| 20:52 | vIkSiT | I think I'm missing something here : https://gist.github.com/viksit/8079734bf051ee1a435f |
| 20:52 | vIkSiT | what's wrong with this JSON? |
| 20:53 | irctc | ,(time (repeatedly 10000 (vec 0))) |
| 20:53 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unable to convert: class java.lang.Long to Object[]> |
| 20:54 | irctc | ,(time (repeatedly 10000 #(vec 0))) |
| 20:54 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unable to convert: class java.lang.Long to Object[]> |
| 20:54 | justin_smith | ,(do (time (repeatedly 10000 (vector 0))) (time (doall (repeatedly 10000 (vector 0))))) |
| 20:54 | clojurebot | "Elapsed time: 0.046326 msecs"\n#<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentVector> |
| 20:55 | justin_smith | ,(do (time (repeatedly 10000 #(vector 0))) (time (doall (repeatedly 10000 #(vector 0))))) |
| 20:55 | clojurebot | "Elapsed time: 0.123552 msecs"\n"Elapsed time: 11.683289 msecs"\n([0] [0] [0] [0] [0] ...) |
| 20:55 | justin_smith | it's 100 times faster when you don't realize it |
| 20:55 | irctc | ,(time (doall (repeatedly 10000 (vector 0)))) |
| 20:55 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentVector> |
| 20:56 | mdeboard | Anyone using Cursive with IntelliJ? |
| 20:56 | irctc | ,(time (doall (repeatedly 10000 #(vector 0)))) |
| 20:56 | clojurebot | "Elapsed time: 4.741657 msecs"\n([0] [0] [0] [0] [0] ...) |
| 20:56 | mdeboard | I'm curious if it's possible to start a new Clojure project somehow with it, and I'm just missing something |
| 20:57 | amalloy | irctc: please /msg clojurebot any test expressions you aren't intentionally making public |
| 20:58 | irctc | thanks |
| 20:58 | amalloy | vIkSiT: that's not json, it's an object. json is a string representation of a javascript object |
| 20:58 | dbasch | vIkSiT: you're assigning an object to a variable |
| 20:58 | dbasch | there's nothing to parse |
| 21:00 | irctc | i think clojurebot is ignoring me :( |
| 21:00 | irctc | oh, nm, new window |
| 21:04 | theseb | is clojure authore some kind of lisp genius? he had strong options about mutability and concurrency.....most people don't even know what those terms mean let alone know enough to go their own way in lang development?! |
| 21:04 | theseb | s/authore/author |
| 21:04 | dbasch | most people don't create programming languages |
| 21:05 | cfleming | mdeboard: Yep, what's up? |
| 21:05 | theseb | dbasch: is clojure getting the love from clispers and rest of lisp community? |
| 21:05 | theseb | dbasch: it seems to attempt to solve a lot of gripes people have with lisp |
| 21:05 | cfleming | {blake}: What is the problem you're seeing with lag? |
| 21:06 | mdeboard | cfleming: Trying to sort out how to start a new project but I see that they recomend just doing lein new |
| 21:06 | dbasch | theseb: clojure is obviously quite popular within the list community for several reasons |
| 21:06 | dbasch | s/list/lisp |
| 21:07 | cfleming | mdeboard: Right (I develop Cursive) - there's no way to create a new lein project from within Cursive right now, sorry |
| 21:07 | dbasch | but also pretty much everyone who has had to deal with concurrency has strong opinions about concurrency |
| 21:07 | mdeboard | it's no problem |
| 21:07 | mdeboard | just wanted to make sure I wasn't missing something |
| 21:07 | theseb | dbasch: is there any reason lispers would *not* love clojure? |
| 21:07 | cfleming | mdeboard: No, there's an issue out there about it and it's on at least one to-do list |
| 21:08 | mdeboard | cool |
| 21:08 | mdeboard | I'm coming from emacs and stuff so this is pretty normal workflow |
| 21:08 | mdeboard | to me |
| 21:08 | justin_smith | theseb: it's not common lisp, it has syntax and symbols that common lisp does not use |
| 21:09 | dbasch | theseb: perhaps the fact that it hard to use clojure properly without having some knowledge of java and the jvm |
| 21:09 | justin_smith | theseb: when I first started using clojure I found the many differences from other lisps annoying (now I love them) |
| 21:09 | cfleming | mdeboard: Ok great. Let me know if you have any issues. |
| 21:10 | dbasch | especially if you need to optimize for performance |
| 21:11 | mdeboard | seems awesome. emacs is pretty flakey on Windows (for me anyway) so I'm looking for a way to work on projects when I'm playing a game or watching Netflix (I do neither on Linux). And I've heard great things about Cursive |
| 21:12 | cfleming | mdeboard: Great, glad to hear it! Windows support is one of the reasons I want to be able to create a project from within Cursive actually, since people often aren't as used to using the command line. |
| 21:13 | mdeboard | yeah, no doubt |
| 21:13 | mdeboard | I assumed it was like a pretty easy thing to build into a plugin for IntelliJ since "Create Project" is right there on the splash page |
| 21:13 | mdeboard | but I guess not |
| 21:15 | dbasch | this is somewhat offtopic, but I went back to my kinesis Keyboard a few days ago and I'm trying to figure out a layout for the modifier keys that works well with emacs as well as the rest of osx. Suggestions welcome. |
| 21:16 | mdeboard | cfleming: cursive was mentioned at strangeloop in the typed clojure talk actually |
| 21:16 | mdeboard | as adding support or some such |
| 21:17 | cfleming | mdeboard: Yeah, there's some preliminary support in there I added recently. There's no doc for it yet unfortunately. |
| 21:18 | cfleming | mdeboard: If you're interested, you can type check your current ns using Tools->REPL->Type check current NS |
| 21:19 | mdeboard | oh I don't use typed clojure whatsoever |
| 21:19 | mdeboard | but the talk was interesting |
| 21:19 | cfleming | mdeboard: Errors are marked in the editor and so forth. |
| 21:19 | cfleming | Ah, ok |
| 21:19 | cfleming | Yeah, I haven't watched it yet |
| 21:19 | mdeboard | btw do you have a theme besides darcula you use? Too much orange |
| 21:19 | mdeboard | I have an orange house with an orange window. Orange is the color of all that I wear |
| 21:20 | amalloy | mdeboard: you can also run emacs in a linux vm, if don't want to learn a new editor |
| 21:20 | mdeboard | amalloy: naw I like IntelliJ actually, I have the emacs keybinds all set up and so forth |
| 21:20 | cfleming | mdeboard: I'm old school, I have black on white. You can get a lot of themes (solarized etc) around. |
| 21:20 | amalloy | cfleming: old school is black on white?? i think you mean orange on black |
| 21:21 | amalloy | mdeboard: i tried the emacs bindings for eclipse, and found myself in a kind of uncanny valley where some things worked well enough to make me surprised and angry at the millions of things that didn't work at all |
| 21:21 | cfleming | amalloy: Or green on black, I guess. But all the cool kids seem to be on some kind of dark theme these days. |
| 21:22 | amalloy | cfleming: i do use green on black for my terminal, although i think orange predates it a bit |
| 21:22 | amalloy | a nice solid 0000FF on 000000, no compromises |
| 21:22 | amalloy | errrrrr, 00FF00 |
| 21:24 | dbasch | anything but a black background would destroy your monitor quickly back in the day |
| 21:25 | amalloy | interesting. "An amber screen was claimed to give improved ergonomics, specifically by reducing eye strain; this claim appears to have little scientific basis." i remember my dad telling me this is why he bought amber screens instead of green for the house |
| 21:25 | dbasch | the first monitor I bought looked like this http://cdn.arstechnica.net//wp-content/uploads/2012/06/s_p_11716_1__49099_zoom.jpg |
| 21:25 | dbasch | it was significantly nicer than green |
| 21:26 | amalloy | dbasch: that's what i grew up around; i was far too young to buy them, but not so young that i don't remember them |
| 21:26 | dbasch | I went from a color tv to that, and it was much more tolerable |
| 21:27 | cfleming | amalloy: Yeah, 0000FF on 000000 might be a bit subtle - only for those really dark coding caves |
| 21:31 | theseb | say...clojure uses first and rest instead of car and cdr.....how does it access the SECOND element of a cons cell....does it is use rest? |
| 21:31 | theseb | that is only place were rest seems awkward |
| 21:32 | justin_smith | ,(second '(0 1 2)) |
| 21:32 | clojurebot | 1 |
| 21:32 | justin_smith | or do you mean in terms of implementation? |
| 21:32 | theseb | justin_smith: does clojure have cons cells like (a . b) ? |
| 21:33 | theseb | justin_smith: how would you access the b? |
| 21:33 | justin_smith | no |
| 21:33 | theseb | justin_smith: whoa...clojure hides the list implementation details of cons cells? |
| 21:33 | theseb | justin_smith: i'm interested |
| 21:34 | theseb | justin_smith: i personally wrote a list that hid that...i'm intrigued that clojure author avoided cons cells too |
| 21:34 | justin_smith | ,(type (cons :a nil)) |
| 21:34 | clojurebot | clojure.lang.PersistentList |
| 21:34 | justin_smith | the source is open, if you want to check out how it was done |
| 21:34 | mdeboard | cfleming: Only thing I've bumped into so far is that some of the default keybinds (Ctrl-W for example) bump into emacs keybinds. You mention this somewhere in the docs, but I'm not sure how/where to modify this. Can you point me in the right direction? |
| 21:35 | dbasch | theseb: it's an interface called ISeq that has many different implementations |
| 21:35 | justin_smith | theseb: cons is not as primative and universal in clojure |
| 21:35 | mdeboard | meaning, you explicitly address the "shipping default keybinds is hard because of conflicts" issue in the docs |
| 21:35 | justin_smith | theseb: we use many different data types, without building them out of conses |
| 21:35 | dbasch | theseb: more detail here: http://clojure.org/sequences |
| 21:35 | cfleming | mdeboard: Right - there's actually a new panel coming in the next build to help with setting that up. |
| 21:35 | theseb | justin_smith: for *years* i've hearing in lisp docs about how lisp are "really conses" |
| 21:36 | cfleming | mdeboard: You're using emacs bindings, right? |
| 21:36 | mdeboard | oh, keymap, derp |
| 21:36 | mdeboard | Yeah |
| 21:37 | cfleming | mdeboard: Yeah, it's under Settings->Kemap. Cursive actions will take precedence in Clojure settings, so you should only have to rebind the built-in actions that your keybindings conflict with. |
| 21:37 | justin_smith | theseb: many data structures in clojure are not lists, and are in no way made of lists. It ends up being pretty useful to do things that way. |
| 21:38 | mdeboard | cfleming: The list of keybinds under the Cursive section is pretty small-ish, are the Ctrl-W/Ctrl-P etc. binds under Editor actions |
| 21:38 | dbasch | theseb: probably one of the nicest features of clojure is the data structures and the functions to interact with them |
| 21:38 | mdeboard | If this is annoying doing tech support like this let me know :P |
| 21:38 | cfleming | mdeboard: Hehe, no worries. Check the bottom of the page here: https://cursiveclojure.com/userguide/paredit.html |
| 21:39 | cfleming | mdeboard: There are a couple of groups, the easiest way to find them is from Main Menu in the tree. |
| 21:39 | mdeboard | ahso |
| 21:39 | cfleming | mdeboard: The REPL commands are all under Tools->REPL |
| 21:40 | vIkSiT | amalloy, dbasch - yeah, I realized that - something in the way I'm returning json data I guess |
| 21:43 | mdeboard | cfleming: aha! great re: the docs nestled at the bottom there. May be worth breaking out into a "Keyboard Navigation" section in the docs or something.... maybe. With all the time I'm sure you have |
| 21:43 | mdeboard | :P |
| 21:43 | cfleming | mdeboard: haha, I'm lounging in a hammock with a cocktail right now. |
| 21:44 | cfleming | mdeboard: Amazingly I actually have updated those docs for the next drop, which has the new config panel |
| 21:44 | mdeboard | well look at you |
| 21:44 | mdeboard | with your cocktails |
| 21:44 | mdeboard | and your hammocks |
| 21:45 | cfleming | mdeboard: Sadly it was a total lie |
| 21:46 | mdeboard | good |
| 21:46 | mdeboard | Misery loves company |
| 21:48 | raspasov | LightTable vs cursive - opinions? |
| 21:48 | mdeboard | cursive |
| 21:49 | mdeboard | lighttable will be abandonware eventually |
| 21:49 | mdeboard | if it's not already |
| 21:49 | mdeboard | raspasov: |
| 21:49 | raspasov | ok 0:1, more takes? :) |
| 21:49 | justin_smith | cursive |
| 21:49 | raspasov | 0:2 :) |
| 21:49 | justin_smith | oh, I know the right way to do this |
| 21:49 | justin_smith | (inc cursive) |
| 21:49 | lazybot | ⇒ 1 |
| 21:50 | raspasov | LOL |
| 21:50 | cfleming | raspasov: I'd say Cursive but I develop it, so that's worth half a point at best |
| 21:50 | raspasov | oh, haha lol |
| 21:50 | raspasov | ok 0:2.5 :D |
| 21:50 | mdeboard | raspasov: I'm basing my comment on http://www.chris-granger.com/2014/10/01/beyond-light-table/ |
| 21:50 | justin_smith | cfleming: raspasov: the fact that the developer of cursive is here talking to users about bugs, docs, and features and the developer of lighttable is not is worth ∞ points. |
| 21:50 | mdeboard | well |
| 21:50 | mdeboard | now let's be fair |
| 21:51 | mdeboard | chris was a fixture in here for a long, long time |
| 21:51 | justin_smith | OK |
| 21:51 | mdeboard | but, yeah, in practical terms... |
| 21:51 | cfleming | It's actually a shame LT is gradually becoming abandonware, it had some nice ideas I think |
| 21:52 | cfleming | It's still great for getting started with Clojure |
| 21:52 | mdeboard | Yeah, that's what I heard on all points |
| 21:52 | cfleming | For something like ClojureBridge it's probably still really good. |
| 21:53 | mdeboard | Yeah I need to test that hypothesis |
| 21:53 | cfleming | But I think a lot of the live-REPL ideas don't work so well once you have more complex code with state etc. |
| 21:53 | mdeboard | My girlfriend is going to the next cljbridge down here in Austin, whenever it is, wonder what they recommnd editor-wise |
| 21:53 | cfleming | I'm still planning to implement painting REPL results in the editor at some point, but I need to inc my swing-fu |
| 21:54 | raspasov | cfleming: what do you mean painting REPL? |
| 21:54 | mdeboard | justin_smith: Actually the creator of light table IS in the channel :P |
| 21:54 | raspasov | like color the REPL output? |
| 21:55 | justin_smith | mdeboard: OK |
| 21:55 | cfleming | raspasov: No, Light Table's main selling feature is that the REPL is not in a separate editor pane like in Cursive or Emacs, when you evaluate things in the REPL the result is shown right in your editor. |
| 21:55 | cfleming | raspasov: Along with intermediate results like let-bindings and so on. |
| 21:55 | mdeboard | :( |
| 21:55 | justin_smith | mdeboard: my point was more about activity / responsiveness of the main developer, long term future of the tool, etc. |
| 21:56 | raspasov | cfleming: yea I know... not sure if I really see the benefit of that past the fact I have to click-erase that damn bubble in the middle of my page :) |
| 21:56 | justin_smith | in case that wasn't clear |
| 21:56 | mdeboard | justin_smith: I understand |
| 21:56 | mdeboard | text chat, easily misunderstood, etc., etc. |
| 21:56 | cfleming | raspasov: Yeah, it's not so useful to have them sticking around long term - I guess it should be easy to clear them though |
| 21:57 | raspasov | cfleming: are you the guy responding on Twitter as well? |
| 21:57 | mdeboard | I think ReactJS/Om would lend themselves quite well to live-REPL'ing, if done right |
| 21:57 | cfleming | Watches were also an interesting idea, but I heard they didn't work very reliably |
| 21:57 | cfleming | raspasov: Yup, that's me. |
| 21:57 | mdeboard | since there's a "football" of state that's being handed off from component to component (in the worst case) |
| 21:58 | raspasov | cfleming: cool! are you doing cursive by yourself? in any case, keep up the good work! |
| 21:58 | mdeboard | in the... what's the word, pathological case? |
| 21:58 | cfleming | raspasov: Yep, it's just me, right now at least. |
| 21:58 | raspasov | cfleming: I would definitely be a buyer whenever it's ready |
| 21:59 | mdeboard | well-behaved React & Om applications don't pass state around that much at all |
| 21:59 | mdeboard | cfleming: what, I thought cursive was a biz |
| 21:59 | cfleming | raspasov: Great, that's the best way to make sure it stays maintained :-) |
| 21:59 | mdeboard | like you had multiple people maintaining |
| 21:59 | cfleming | mdeboard: Yup, I set up a company the other day and everything. |
| 21:59 | mdeboard | oh, wild |
| 21:59 | cfleming | But it's a small company of one. |
| 22:00 | mdeboard | So I know nothing about IntelliJ-as-a-platform development, I assumed it was like WordPress, and that the people (!) behind Cursive were in a company that did multiple plugins as their source of revenue |
| 22:00 | mdeboard | apparently not |
| 22:01 | cfleming | mdeboard: No, Cursive is kind of unique actually, no-one else who isn't jetbrains is charging for plugins. |
| 22:01 | raspasov | mdeboard: not at all, anyone can make I plugin I believe |
| 22:01 | cfleming | mdeboard: There's quite a lot of unknown around how that will work, but I'm optimistic. |
| 22:01 | mdeboard | Well yeah but anyone can make WordPress themes/plugins too, but there's an industry around it etc |
| 22:02 | cfleming | And I'd like to branch out into more plugins once Cursive is stable if there's a market and time allows. |
| 22:02 | cfleming | OCaml, Julia or Rust, maybe - there are already OSS plugins for Go and Erlang |
| 22:02 | mdeboard | Seems like best bet might be to find some wealthy entity out there who would benefit from wider Clojure adoption? |
| 22:03 | mdeboard | Elixir |
| 22:03 | mdeboard | There's a gy working on one of those here in Austin |
| 22:03 | mdeboard | we were commisserating over syntax highlighting being difficult ot get right (I maintain elixir-mode for emacs) |
| 22:03 | cfleming | Yeah, I think Cursive could really help drive Clojure adoption in enterprise, atcually |
| 22:03 | mdeboard | er, s/syntax highlighting/indentation/ |
| 22:03 | mdeboard | Ya no doubt |
| 22:04 | mdeboard | I am a workaday Python programmer who uses emacs exclusively but PyCharm is pretty sweet. |
| 22:06 | cfleming | Yeah, no doubt - I'm a huge fan of JetBrains and their products |
| 22:06 | raspasov | JetBrains rocks |
| 22:07 | cfleming | mdeboard: Interesting, Elixir looks really cool - I've heard a few people talking about it recently |
| 22:07 | cfleming | But it does look like something you'd have to parse properly rather than regexing |
| 22:07 | mdeboard | Yeah it builds on Erlang pretty well. But from a language mode maintainer's perspective, the syntax is so squishy. So many ways to express everything |
| 22:07 | cfleming | mdeboard: Tell me about it! |
| 22:08 | mdeboard | hahaha, yeah I guess preaching to the choir with a lisp |
| 22:08 | mdeboard | but fortunately Emacs has pretty decent faculty for doing comprehensive indentation handling. It's just a bear to get productive in it |
| 22:09 | mdeboard | In Cursive is there a command for "Send this form to the repl" |
| 22:09 | cfleming | Yeah, formatting code is amazingly hard. |
| 22:09 | cfleming | Steve Yegge talked about it in his article about JS2 mode - it's well worth a read if you haven't read it already |
| 22:09 | mdeboard | Yeah, it's one of those things that you never think about. Something as "simple" as triple-quoted strings """like this""" is... so hard. |
| 22:09 | mdeboard | Oh man I need to re-read that, been a long time |
| 22:10 | cfleming | Yup Tools->REPL->Run form before cursor/Run top form |
| 22:10 | raspasov | mdeboard: you can setup custom key combination for it as well |
| 22:10 | mdeboard | raspasov: do tell |
| 22:11 | cfleming | That article really brings home how hard it is to retrofit proper syntax analysis to an editor that isn't built for it from the ground up |
| 22:11 | raspasov | fyi I was never a Emacs person - what are some Pro tips for arranging ()? |
| 22:11 | raspasov | the only thing I know is |
| 22:11 | mdeboard | oh there it is, the thing for the repl keybind |
| 22:12 | cfleming | mdeboard: Settings->Keymap then find the action in the tree under Main Menu->Tools->REPL |
| 22:12 | mdeboard | cfleming: I got it this time, I think I see how the keymap thing is laid outnow |
| 22:13 | mdeboard | raspasov: What do you mean, arranging ()? cider has pretty sensible defaults, and paredit works wonders (though I don't use it) |
| 22:14 | raspasov | I'm talking about the Slurp, Barf, Move Form Up, Down etc |
| 22:16 | mdeboard | oh, I don't know that stuff. I might be the most unproductive emacs person |
| 22:16 | mdeboard | no paredit, no structural editing, etc. |
| 22:19 | cfleming | Anyone here who might be able to help with a test.check problem? |
| 22:20 | reiddraper | cfleming: sure |
| 22:21 | cfleming | reiddraper: You sound like just the man. I'm trying to get the recursive generation working - we exchanged a couple of mails about it on the mailing list. |
| 22:21 | reiddraper | okie |
| 22:21 | mdeboard | Anyone know of a template for liberator projects |
| 22:21 | mdeboard | lein template* |
| 22:22 | cfleming | reiddraper: This is what I have: https://www.refheap.com/91043 |
| 22:22 | mdeboard | https://github.com/flyingmachine/liberator-templates |
| 22:22 | mdeboard | Oh this isn't what I need at all. |
| 22:23 | cfleming | reiddraper: primitives and (compound primitives) work fine |
| 22:24 | cfleming | reiddraper: (gen/sample (gen/recursive-gen compound primitives)) also works |
| 22:24 | cfleming | reiddraper: But I'd like object to generate objects that can recursively contain other objects |
| 22:24 | cfleming | reiddraper: I get an NPE when I try that |
| 22:25 | reiddraper | cfleming: it seems to me that your example should work, and will contain recursive objects |
| 22:26 | reiddraper | cfleming: for example, your refheap example should generate vectors of vectors of nil |
| 22:27 | cfleming | reiddraper: I get this: https://www.refheap.com/91044 |
| 22:28 | reiddraper | cfleming: okie, let me try locally |
| 22:28 | cfleming | reiddraper: Thanks |
| 22:30 | reiddraper | cfleming: oh |
| 22:30 | reiddraper | cfleming: you want (def object (gen/recursive-gen compound primitives)) |
| 22:30 | reiddraper | not (def object (gen/recursive-gen compound object)) |
| 22:31 | cfleming | reiddraper: But then will the objects recursively contain other objects? |
| 22:31 | reiddraper | cfleming: yes |
| 22:32 | reiddraper | try it |
| 22:32 | cfleming | reiddraper: You're absolutely right, they do - thanks! |
| 22:32 | reiddraper | cfleming: no problem |
| 22:35 | bcm | anyone own an ergodox? |
| 22:40 | scottj | bcm: you might want to ask you specific question in, say, #geekhack |
| 22:40 | scottj | bcm: there are people here with ergodox, best to just ask your question |
| 22:46 | bcm | scottj: that was my only question :( |
| 22:46 | scottj | bcm: oh :) |
| 22:47 | scottj | way to troll the ,anyone police |
| 23:08 | mdeboard | idk if any cursive users are still around, but do I have to do anything specific for cursive to know where leiningen is keeping the projects it downloads? |
| 23:09 | mdeboard | e.g. configure Maven settings to know there are jars in C:\Users\matt\.m2 |
| 23:09 | cfleming | Ummm, I'm not sure what you mean - are you talking about the libs or the sources? |
| 23:09 | cfleming | mdeboard: You shouldn't have to, Cursive will find them (via lein) |
| 23:09 | mdeboard | ah ok |
| 23:10 | cfleming | How are you setting your project up? Are you importing from your lein project? |
| 23:10 | cfleming | mdeboard: It should Just Work (tm) if you do that. |
| 23:10 | mdeboard | I followed the instructions (I think), everything seems to be going ok. I imported from VCS |
| 23:10 | mdeboard | repl works and everything, that stuff is ine |
| 23:10 | mdeboard | fine* |
| 23:10 | cfleming | Ok, cool |
| 23:10 | mdeboard | just getting an error notification with the following block of code |
| 23:11 | mdeboard | https://gist.github.com/mattdeboard/a93d80c21b28340cd172 ... complaining about the first 'section' there after defresource |
| 23:12 | mdeboard | "section cannot be resolved". I figured it might be because it hasn't processed the defresource macro or some such |
| 23:12 | cfleming | mdeboard: So this is the biggest problem with Cursive - there's no way for it to know what macros are doing. |
| 23:13 | cfleming | mdeboard: I've taught it about a lot of them, and Cursive is built around an extension api that people will be able to use to contribute support for libs they use or write. |
| 23:13 | cfleming | mdeboard: But that's not open yet, it's not totally stable yet. |
| 23:13 | mdeboard | ahh ok |
| 23:13 | mdeboard | interesting |
| 23:14 | cfleming | mdeboard: I keep finding new functionality I have to add to it as I add refactorings and so on, but it's getting there. |
| 23:18 | mdeboard | For my purposes (I'm in bottom 10% of users easily) I just wanna turn off the error notification :( |
| 23:36 | cfleming | mdeboard: You can do that - Settings->IDE Settings->Clojure->Highlight unresolved symbols |
| 23:43 | joshuafcole_ | What's the most idiomatic way to loop through a seq and do side-effecty things that can provide the current index? |
| 23:43 | joshuafcole_ | e.g. |
| 23:44 | amalloy | map-indexed |
| 23:44 | justin_smith | joshuafcole_: dotimes |
| 23:44 | joshuafcole_ | (do (map my-fn some-seq (range (count some-seq))) |
| 23:44 | justin_smith | for side-effecty |
| 23:44 | joshuafcole_ | ah, map-indexed is already a big improvement |
| 23:44 | amalloy | justin_smith: dotimes won't work, unless you want to call (nth mycoll n) and make it O(n*n) |
| 23:45 | justin_smith | ahh, right |
| 23:45 | joshuafcole_ | thanks amalloy! |
| 23:45 | joshuafcole_ | (inc amalloy) |
| 23:45 | lazybot | ⇒ 172 |
| 23:45 | justin_smith | joshuafcole_: putting it in a do will ensure none of the side effects happen |
| 23:45 | justin_smith | use dorun instead |
| 23:45 | joshuafcole_ | none of them? |
| 23:45 | amalloy | yeah, indeed |
| 23:45 | joshuafcole_ | oh right |
| 23:45 | joshuafcole_ | that's what I meant |
| 23:45 | joshuafcole_ | that would have been fun to debug |
| 23:46 | joshuafcole_ | heh |
| 23:46 | justin_smith | ahh, sorry, there was nothing else in the do block - so it would have *maybe* run :) |
| 23:46 | justin_smith | if there was anythinhg else after it, it would be guaranteed not to |
| 23:46 | joshuafcole_ | you're right though, I would've just typed do thinking I'd done dorun and been in for a bad time |