2014-05-25
| 00:05 | amalloy | catern: why would you care that syntax-quote gives you a seq which is not a list? it's quite rare to need something that's specifically a list |
| 00:06 | catern | amalloy: because you can't check for clojure.lang.Cons with list? |
| 00:07 | amalloy | well, that's fine, because you shouldn't use list? either. if you want to know whether something is listy, seq? is the function to use (it works, among other things, on conses) |
| 00:07 | catern | ah, but I want to treat other seqs differently |
| 00:08 | catern | because this is a toy interpreter and I'm just making input to it, and maybe I want to use the map or vec types |
| 00:08 | amalloy | those aren't seqs |
| 00:09 | catern | huh! i thought they were |
| 00:09 | amalloy | they're collections |
| 00:10 | amalloy | there's only like three functions in clojure.core that treat lists differently from other seqs: list?, and pop/peek |
| 00:10 | catern | so what implements ISeq? |
| 00:10 | amalloy | seqs |
| 00:10 | catern | no, I mean besides PersistentList and Cons |
| 00:10 | amalloy | other collections, like maps and vectors, are *seqable*, ie you can produce seqs from them |
| 00:11 | catern | oh, I see |
| 00:11 | amalloy | like a million other things implement ISeq |
| 00:11 | amalloy | lazy sequences, ranges, seqs of vectors or maps... |
| 00:12 | catern | cool, then I will switch to using seq?, thanks |
| 00:16 | amalloy | you're welcome |
| 01:11 | sm0ke | hello is there a easy way to launch groovy repl with lein? |
| 03:15 | adsisco | how do you see the doc-string of a function in emacs? |
| 04:46 | mercwithamouth | o_O |
| 05:47 | r4vi | anyone have eldoc mode working with clojurescript or is it going to be a non-starter? |
| 06:18 | dissipate | how does the ':test' metadata key/value pair work? is the ':test' function run every time the var is evaluated? |
| 06:37 | mikker | I'm trying to stub out a function from an external library in my test |
| 06:37 | mikker | And I'm using Midje's provided |
| 06:37 | mikker | But I'm not doing it right |
| 06:41 | mikker | I get this error: |
| 06:41 | mikker | var: #'clostache.parser/render-template is not public |
| 06:42 | Glenjamin | is that the var you're trying to stub? |
| 06:42 | mikker | I suppose it is |
| 06:43 | Glenjamin | presumably non-public vars cannot be stubbed - which usually points to stubbing at the incorrect level |
| 06:43 | Glenjamin | as you generally should only stub public interfaces |
| 06:43 | mikker | But I'm pretty sure that IS a public interface |
| 06:43 | mikker | Clojure is pretty sure of the opposite though |
| 06:44 | mikker | I misnamed the function |
| 06:44 | mikker | Like an idiot |
| 06:44 | Glenjamin | "render" is the public one |
| 06:44 | mikker | render-resource was what I was after :) |
| 06:44 | mikker | Thanks |
| 06:46 | mikker | I'm very new to Clojure so I'm unsure of my every move right now |
| 06:46 | mikker | I'll probably end up with something resembling OOP |
| 06:57 | Glenjamin | i think thats always the way |
| 06:58 | mikker | probably is |
| 07:14 | mercwithamouth | ddellacosta: hola |
| 07:15 | ddellacosta | mercwithamouth: howdy there. :-) |
| 07:17 | ddellacosta | mikker: noooo, don't end up with OO...if you want OO just use Java |
| 07:19 | mikker | ddellacosta: I'm trying my best not to |
| 07:19 | ddellacosta | mikker: you can do it |
| 07:19 | mikker | I'm coming from ruby so most of my knowledge is based on OO principles |
| 07:20 | mikker | TBH clojure just seemed too rock'n'roll to not try it |
| 07:21 | gfredericks | clojurebot: clojure is too rock'n'roll to not try it |
| 07:21 | clojurebot | 'Sea, mhuise. |
| 07:26 | mercwithamouth | hmmm how to learn when you don't have a realistic project in mind =( |
| 10:02 | EClaesson | I'm a bit rusty on clojure, so sorry if i'm doing something stupid :) I'm trying to use a java.io.File. (if (.isDirectory file) ... I get "No matching field found: isDirectory for class [Ljava.io.File;" |
| 10:11 | ambrosebs | ,(.isDirectory (java.io.File. "")) |
| 10:11 | clojurebot | #<SecurityException java.lang.SecurityException: denied> |
| 10:13 | ljos | Eclaesson: that [.. , wouldn't that mean it is an array of java.io.File that you are trying to call .isDirectory on. |
| 10:13 | ljos | ? |
| 10:15 | EClaesson | I don't know. But 'file' is just a (File. "path/here/") so i don't think it's an array |
| 10:16 | ljos | EClaesson: I get the same error you get if I call it on an array of files. It works perfectly well if I call the same as ambrosebs wrote. |
| 10:21 | EClaesson | If i'm not missing something, it's not an array. https://gist.github.com/EClaesson/e60e2fbbe383e4556f32 Line 16 causes the error |
| 10:22 | EClaesson | That file is run by "lein exec" if that makes any difference |
| 10:24 | ljos | ECleasson: .listFiles. The second time around file will be an array of files. |
| 10:24 | _rc | EClaesson: so listFiles returns File[], so your iteration will be taking an array |
| 10:25 | EClaesson | Ahm of course. Thanks. I was completely stuck in (defn traverse |
| 10:25 | ljos | Eclaesson: Np. We are all here to learn. |
| 11:11 | arkh | why use 'complement' instead of 'not' ? |
| 11:13 | bbloom | arkh: complement operates on functions, not operates on booleans |
| 11:13 | bbloom | read their doc strings carefully |
| 11:14 | arkh | bbloom: will do - thanks |
| 11:15 | fifosine | How can I get a more detailed stack trace? I'm getting this error: http://pastebin.com/QXAJ3UjX but I don't understand it. Supposedly it comes from this file: http://pastebin.com/ket8epP0. |
| 11:17 | bbloom | fifosine: that error has all the info you need |
| 11:17 | bbloom | caused by handler.clj line 14 |
| 11:17 | bbloom | class can not be cast to ifn |
| 11:18 | bbloom | on line 14, you're trying to evaluate (java.io.File "./db.sql") |
| 11:18 | bbloom | java.io.File is a class |
| 11:18 | bbloom | not a function |
| 11:18 | bbloom | you need to use new: |
| 11:18 | bbloom | (new java.io.File "./db.sql") |
| 11:18 | bbloom | but more commonly, you can use the shorthand: |
| 11:18 | bbloom | (java.io.File. "./db.sql") |
| 11:20 | fifosine | bbloom: Does that mean the book I'm following is wrong? This is the snippet: https://imgur.com/GyyQWCi |
| 11:20 | bbloom | fifosine: look closely |
| 11:20 | fifosine | oh! |
| 11:20 | fifosine | Jeez, that period |
| 11:20 | fifosine | what does it mean? |
| 11:21 | bbloom | ,(macroexpand '(Foo. 1 2 3)) |
| 11:21 | clojurebot | (new Foo 1 2 3) |
| 11:21 | bbloom | ,(macroexpand '(Foo 1 2 3)) |
| 11:21 | clojurebot | (Foo 1 2 3) |
| 11:21 | arkh | bbloom, helping people like fifosine and me with reading comprehension :D (no offense meant at all fifosine) |
| 11:21 | fifosine | none taken! :) |
| 11:22 | fifosine | bbloom: And what does that ".exists" mean? It applies it to the object? |
| 11:22 | bbloom | fifosine: http://clojure.org/java_interop |
| 11:22 | arkh | it's calling a method of the object |
| 11:23 | arkh | (instance method) |
| 11:23 | bbloom | fifosine: http://clojure.org/documentation is very terse and assumes you have some lisp/functional background, but it's also *very clear* and complete. worth reading in full |
| 11:24 | fifosine | bbloom: If the construction of an object is very expensive and would normally be static in a Java program, how do you analogously make static objects in your clojure program? |
| 11:25 | bbloom | fifosine: clojure files are basically giant static object constructors |
| 11:25 | bbloom | (def x (some-expensive-operation)) will occur once at file load time |
| 11:26 | fifosine | So in this snippet, the object is created before the method is called? http://pastebin.com/rbd7HrDx |
| 11:27 | bbloom | fifosine: let's be clear here, the only "method" in that code is .format |
| 11:27 | bbloom | format-time is a function, not a method |
| 11:27 | fifosine | oh gosh, ok, I don't know what the difference between those two are |
| 11:27 | bbloom | but no, that SimpleDateFormat will be constructed every time you call format-time |
| 11:27 | bbloom | in java parlance, methods are on objects |
| 11:28 | bbloom | in clojure, functions are first class and can live on their own |
| 11:28 | fifosine | bbloom: How would I write it so that it's constructed once but I can use it in every format-time call? |
| 11:29 | bbloom | fifosine: https://www.refheap.com/85889 |
| 11:29 | bbloom | fifosine: the defs occur when the file is loaded |
| 11:30 | fifosine | Got it |
| 11:39 | kmicu | New fastload branch… but how fast? ;) https://github.com/clojure/clojure/commit/8b07773ac7582628ca84ccff40ded7c942c79a8c |
| 11:46 | bbloom | interesting |
| 11:57 | _alejandro | Does anyone have advice on using environ for multiple environments (e.g. test/dev/prod)? |
| 12:02 | uvtc | me.raynes/fs has a base-name function. Why no dir-name? |
| 12:04 | fifosine | does "& provide |
| 12:04 | fifosine | optional parameters? |
| 12:24 | benmoss | does anyone have any experience with using JavaFX 8? having the same trouble this guy had: http://stackoverflow.com/questions/18089248/load-custom-fonts-in-javafx-clojure |
| 12:26 | benmoss | just doing a simple (import javafx.scene.control.TextField) is throwing a “NoClassDefFoundError” |
| 13:59 | owl-v- | omg javascript++! clojure needs clojure++ |
| 14:05 | pdurbin | huh. this, I guess: http://jspplang.org |
| 14:11 | owl-v- | pdurbin: i was looking at this >> http://jspp.javascript.am/ |
| 14:11 | owl-v- | holy crap, Destructors!!! |
| 14:12 | owl-v- | yes, that's what i want in clojure |
| 14:13 | bbloom | says "explicitly called" |
| 14:13 | bbloom | same for C# |
| 14:13 | bbloom | i don't know how java doesn't have that... we have finally blocks |
| 14:13 | bbloom | java has Closable which is effectively the same as Disposable |
| 14:14 | owl-v- | i don't want to use garbage collectors. |
| 14:14 | owl-v- | jspp morphing c++ into javascript >> http://youtu.be/D6stkg2Wm4w |
| 14:14 | Jaood | we need clojure on llvm |
| 14:20 | l3dx | I'm trying to call a function recursively for each element in a vector. (map #(recur % :something) [1 2 3]) - I don't expect this exact example to work, but is there something alike that I can use? |
| 14:21 | owl-v- | lol lambda on c++11. c++14 is on the way :-) |
| 14:22 | owl-v- | 13dx: make function what use recursive |
| 14:25 | owl-v- | 13dx: at the end (recur <argument1, argument2, ...>) |
| 14:26 | owl-v- | 13dx: but then u r not going to use 'map' |
| 14:26 | owl-v- | 13dx: if u r going to use recur |
| 14:26 | l3dx | no I guess I'd have to pass the vector as a function argument then |
| 14:27 | owl-v- | yes |
| 14:27 | expez- | Why does it not make sense to define take! and put! for channels backed by a dropping-buffer? |
| 14:28 | owl-v- | expez-: u lost me... |
| 14:31 | expez- | owl-v-: (def c (dropping-buffer 1)) (put! c 1) => No implementation of put! exceptoin |
| 14:33 | owl-v- | put! returns true unless port is already closed >> http://clojure.github.io/core.async/#clojure.core.async/put! |
| 14:34 | owl-v- | source >> https://github.com/clojure/core.async/blob/65b2d6c81350ba8b4bb3a8b82ad45ba984c0037c/src/main/clojure/clojure/core/async.clj#L128 |
| 14:34 | owl-v- | expez-: ^ |
| 14:35 | expez- | Are you saying my newly created channel is closed and that leads to a 'No implementation of method....' exception? |
| 14:40 | dnolen_ | expez-: that's not right, buffers are not themselves channels |
| 14:40 | dnolen_ | (def c (chan (dropping-buffer 1))) |
| 14:40 | expez- | heh, silly mistake. Thanks! |
| 15:21 | expez- | What does do-alts do? The docstring is unusably terse for beginners :/ |
| 15:29 | dnolen_ | expez-: do-alts is not really meant to be used directly as far as I know |
| 15:30 | expez- | ok |
| 16:16 | noprompt | if anyone i'm curious what is the best way to approach porting the clojure.lang.IFn portion of clojure.algo.generic.functor/fmap to cljs. |
| 16:21 | gfredericks | functions as functors just map the return value amirite? |
| 16:22 | noprompt | gfredericks: it's namely this part https://github.com/clojure/algo.generic/blob/master/src/main/clojure/clojure/algo/generic/functor.clj#L41-L47 |
| 16:22 | noprompt | it's dispatching on clojure.lang.IFn which AFAIK you can't do in cljs. |
| 16:22 | gfredericks | I'd be surprised if you couldn't at least do something equivalent |
| 16:23 | noprompt | derive? |
| 16:38 | amalloy | https://github.com/clojure/algo.generic/blob/master/src/main/clojure/clojure/algo/generic/functor.clj#L49 seems silly - why isn't it on ISeq? |
| 16:39 | noprompt | i was wondering the same thing. |
| 16:48 | yedi | for learning purposes, how does iseq and llazyseq differ |
| 17:21 | patrickod | I'm trying to use core.async in a project but I'm unable to load it in a repl due to the following error https://gist.github.com/patrickod/0f9bb3defee87065838d |
| 17:22 | patrickod | I'm using clojure 1.6.0 with the latest core.async so I'm unsure why I'd be seeing issues with a core namespaced lib |
| 17:26 | patrickod | http://dev.clojure.org/jira/browse/CMEMOIZE-14?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel seems like there's an open issue for this :/ |
| 17:34 | yedi | what's the time complexity for a diffing algo? i'm guessing O(n) |
| 17:58 | gfredericks | yedi: that might depend on what you mean by diffing algo? |
| 18:02 | noprompt | hmm... this seems like a bit of a rat's nest. i'm drawing a blank here. maybe I'll stick with js/Function and seek guidance in the PR. |
| 18:03 | yedi | is there a better way to do: (for [[msg id] (map vector avec (range))] (do stuff)) |
| 18:04 | yedi | (pretty much getting the index of a vector as you iterate over it in a for comprehension) |
| 18:04 | noprompt | (map-indexed vector avec) |
| 18:04 | noprompt | then you can say (for [[id msg] ...) |
| 18:05 | noprompt | ,(map-indexed vector [:a :b :c]) |
| 18:05 | clojurebot | ([0 :a] [1 :b] [2 :c]) |
| 18:05 | noprompt | yedi: ^ |
| 18:05 | lodin | Is it a bad idea to want to dispatch multimethods on protocols? |
| 18:06 | noprompt | lodin: it depends on what you're doing. |
| 18:06 | yedi | noprompt: that just replaces this part right: (map vector avec (range)) |
| 18:06 | noprompt | yedi: yes. |
| 18:06 | noprompt | lodin: it doesn't work in clojurescript. :-( |
| 18:07 | lodin | I have two-three protocols and records that implement them. I want to write a function that takes to records and handle them differently depending on what protocols they implement. |
| 18:08 | lodin | I guess I should set up another is-a hierarchy, but that would be kind of double declaration. |
| 18:09 | noprompt | lodin: there's also the option of "marker" protocols if it makes sense in your case. |
| 18:11 | lodin | Yes, but I thought that multimethods use isa? and not extends?, and protocol use extends and not derive. Am I confused? |
| 19:02 | ToxicFrog | What's the inverse of (empty?)? |
| 19:10 | pdk | (identity)? |
| 19:15 | amalloy | seq |
| 19:42 | owl-v- | ,(next [1 2 3]) |
| 19:42 | clojurebot | (2 3) |
| 19:43 | owl-v- | i don't understand this ^ |
| 19:43 | owl-v- | i'm expecting a vector as an output... like [2 3] |
| 19:48 | akhudek | owl-v-: next always returns a seq. The difference between next and rest is that next is lazy. |
| 19:49 | akhudek | owl-v-: if you want a vector you can use subvec |
| 19:50 | owl-v- | ,(rest [1 2 3 4]) |
| 19:50 | clojurebot | (2 3 4) |
| 19:51 | owl-v- | ,(subvec (rest [1 2 3 4])) |
| 19:51 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/subvec> |
| 19:52 | owl-v- | ,(subvec [1 2 3 4] 1) |
| 19:52 | clojurebot | [2 3 4] |
| 19:52 | owl-v- | ah |
| 19:53 | hyPiRion | just be aware that subvec leaks memory. |
| 19:53 | owl-v- | but why use (rest) on input vector on (recur) ? |
| 19:53 | hyPiRion | probably not an issue, just have that in mind |
| 19:54 | owl-v- | oh no. leaky memory is bad in embedded system |
| 19:54 | owl-v- | superBAD! |
| 19:55 | owl-v- | but why (subvec) leaks memory? |
| 19:56 | hyPiRion | because it's essentially just an object with an offset and a reference to the old vector |
| 20:02 | owl-v- | hyPiRion:if it's just a reference why does it leak memory? |
| 20:03 | hyPiRion | owl-v-: Java/the JVM cannot detect that the object with the offset will not look at the first or last elements in the vector. So everything in the original vector is kept |
| 20:03 | ssswdon | looking for a good emacs setup using cider |
| 20:05 | owl-v- | hyPiRion: original is kept as long as something is referencing it. yes, but if the reference is not used anymore? |
| 20:06 | owl-v- | hyPiRion: it will be collected by garbage collector |
| 20:07 | bbloom | it doesn't leak memory |
| 20:07 | bbloom | it simple holds pointers to more memory than it strictly needs to |
| 20:07 | bbloom | it will properly reclaim that memory if you stop pointing to it |
| 20:08 | bbloom | the official term for that sort of issue is "semantic garbage" |
| 20:08 | owl-v- | so why (subvec) leaks memory? |
| 20:08 | bbloom | https://en.wikipedia.org/wiki/Garbage_(computer_science) |
| 20:08 | hyPiRion | today I learned about the idiom "semantic garbage" |
| 20:09 | owl-v- | lol |
| 20:09 | bbloom | (doc subvec) |
| 20:09 | clojurebot | "([v start] [v start end]); Returns a persistent vector of the items in vector from start (inclusive) to end (exclusive). If end is not supplied, defaults to (count vector). This operation is O(1) and very fast, as the resulting vector shares structure with the original and no trimming is done." |
| 20:09 | bbloom | owl-v-: read the last phrase: "no trimming is done" |
| 20:09 | bbloom | it shares structure |
| 20:09 | bbloom | it's the same as if you pointed to a linked list of one million items, but only ever looked at the first two |
| 20:09 | bbloom | you'd "leak" the last million minus two |
| 20:10 | akhudek | technically not a leak |
| 20:10 | akhudek | “hold onto” is maybe a better term |
| 20:10 | bbloom | akhudek: retain |
| 20:11 | owl-v- | hyPiRion: r u sure (subvec) leaks memory? |
| 20:12 | hyPiRion | owl-v-: it doesn't leak memory, but as bbloom says, it retains objects which can never be referenced from the subvector |
| 20:12 | hyPiRion | I agree with bbloom, I just didn't know the proper name of the "leak" |
| 20:13 | owl-v- | proper name of the 'leak' is leak |
| 20:14 | owl-v- | there is no memory leak in JVM unless JVM itself is leaking memory. |
| 20:14 | technomancy | no *true* scotsman would leak memory |
| 20:15 | noprompt_ | bbloom: any ideas on porting this to cljs: https://github.com/clojure/algo.generic/blob/master/src/main/clojure/clojure/algo/generic/functor.clj#L41-L47 |
| 20:15 | noprompt_ | i've moved most of the low hanging fruit over. |
| 20:16 | noprompt_ | i'm debating whether or not to just skip the IFn stuff. |
| 20:16 | bbloom | noprompt_: what's the issue? |
| 20:16 | bbloom | noprompt_: can't you just use cljs.core.IFn ? |
| 20:16 | noprompt_ | no because afaik you can't dispatch on protocols like that in cljs multimethods |
| 20:16 | bbloom | oh, right, no interface for it |
| 20:17 | noprompt_ | is that just a limitation of cljs multimethods? |
| 20:17 | noprompt_ | i haven't read through the impl. |
| 20:18 | bbloom | noprompt_: i'd just special case ifn? |
| 20:19 | bbloom | (defn fmap [f s] (if (ifn? x) ... (-fmap f s))) |
| 20:19 | bbloom | or isntead of -fmap, fmap-method or something else like that |
| 20:20 | owl-v- | what's difference between vector an list in clojure? just the order i want to keep? |
| 20:20 | bbloom | ~colls |
| 20:20 | clojurebot | colls is seqs and colls |
| 20:20 | noprompt_ | bbloom: i dunno if it even makes sense for fmap in this case to be a multimethod. |
| 20:20 | bbloom | ~seqs |
| 20:20 | clojurebot | seqs is seqs and colls |
| 20:20 | bbloom | fucking bot |
| 20:20 | bbloom | ~seqs and colls |
| 20:20 | clojurebot | seqs and colls is http://www.brainonfire.net/files/seqs-and-colls/main.html |
| 20:21 | bbloom | noprompt_: i'm not convinced that fmap is useful at all |
| 20:21 | noprompt_ | yeah, althought (fmap inc {:a 1 :b 2}) is much nicer than the alternative. |
| 20:22 | bbloom | noprompt_: except that i have no idea if that maps keys or values or key value pairs... and whatever you say, why wouldn't it be the other one? |
| 20:23 | noprompt_ | well the result there is {:a 2 :b 3} |
| 20:23 | bbloom | noprompt_: sure, i guessed that from your choice of inc, but ... why? |
| 20:23 | bbloom | seems like an arbitrary choice |
| 20:23 | noprompt_ | honestly, i don't really care about the fmap stuff in this case. i just more or less care about finishing the patch. |
| 20:24 | bbloom | i dunno what patch you're talking about |
| 20:24 | noprompt_ | i want clojure.algo.generic to be available in cljs. |
| 20:24 | bbloom | i'd either just inline all the uses of fmap or special case with the ifn? predicate |
| 20:24 | bbloom | ok, then go with ifn? |
| 20:25 | bbloom | you can put that in to the :default case if you want |
| 20:25 | noprompt_ | good idea. i'll go that route. that was my last option. |
| 20:27 | noprompt_ | this seems a bit useless to me: https://github.com/clojure/algo.generic/blob/master/src/main/clojure/clojure/algo/generic/math_functions.clj#L25 |
| 20:27 | bbloom | noprompt_: agreed |
| 20:28 | bbloom | i think defn- should be deprecated too |
| 20:28 | noprompt_ | is ^:private so hard? |
| 20:29 | bbloom | apparently |
| 20:32 | bbloom | fmap seems like almost as bad an idea as CanBuildFrom |
| 20:36 | bbloom | also those algo/generic impls don't obey the functor laws |
| 20:37 | bbloom | ,(defn fmap-set [f s] (into (empty s) (map f s))) |
| 20:37 | clojurebot | #'sandbox/fmap-set |
| 20:38 | bbloom | ,(fmap-set (comp #(if (odd? %) (inc %) %) dec) #{1 2 3}) |
| 20:38 | clojurebot | #{0 2} |
| 20:38 | bbloom | ,(fmap-set #(if (odd? %) (inc %) %) (fmap dec #{1 2 3})) |
| 20:38 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: fmap in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 20:38 | bbloom | ,(fmap-set #(if (odd? %) (inc %) %) (fmap-set dec #{1 2 3})) |
| 20:38 | clojurebot | #{0 2} |
| 20:38 | bbloom | ,(fmap-set dec (fmap-set #(if (odd? %) (inc %) %) #{1 2 3})) |
| 20:38 | clojurebot | #{1 3} |
| 20:39 | bbloom | er hard to construct an example |
| 20:40 | bbloom | point is that (fmap (comp f g) s) is not necessarily the same as (fmap f (fmap g s)) because g may create duplicate intermediate values that the intermediate set will eliminate |
| 20:40 | akhudek | the only thing I’ve used it for is as a map-vals, but there is a map-vals in the prismatic lib, or you can easily write it yourself |
| 20:43 | bbloom | it's generally quite difficult to write correct higher order operations that work over differing data structures and abstract collections |
| 20:43 | bbloom | it's also of highly questionable utility |
| 20:47 | amalloy | bbloom: well, it's not so much that the algo.generic implementations don't follow the functor laws, as that it's impossible for a set to be a functor |
| 20:47 | bbloom | amalloy: right |
| 20:48 | bbloom | amalloy: is there ever a time a generic functor is actually useful outside of appeasing a type system? |
| 20:48 | amalloy | huh? |
| 20:48 | bbloom | ie is polymorphic fmap actually useful? |
| 20:49 | bbloom | not as far as i can tell, curious if you think so |
| 20:50 | amalloy | sure. a tree is a useful functor, for example |
| 20:51 | amalloy | and so's maybe; in clojure, we do fmappy things with some-> and so on |
| 20:51 | bbloom | really? when do you ever want to create an isomorphic tree where each node's value is only ever a function of the node in that position's previous value? surely you want some context |
| 20:52 | bbloom | surely you'd want to specify pre or post order traversal, and maintain context, potentially changing the shape of the tree... generic fmap seems useless there |
| 20:52 | bbloom | fmappy-things are different than generic fmap |
| 20:52 | amalloy | *shrug* maybe i have a tree of strings and want to parse-int them all. perfectly plausible |
| 20:53 | bbloom | seems highly unlikely to me :-P |
| 20:59 | amalloy | bbloom: agents and refs? those are kinda functors, except for the mutation |
| 21:00 | amalloy | er, atoms and refs, i mean |
| 21:00 | amalloy | and it'd be nice to have a single function that worked on them all |
| 21:00 | bbloom | why would that be useful? seems like that would be an anti feature.... if i had one function that worked on all of them, then i'd write generic code which may or may not be correct given the semantics of all the possible implemetnations |
| 21:01 | bbloom | ie would fmap be commute or alter? |
| 21:01 | bbloom | presumably alter, but then it would need the dosync somehow, which is meaningless for atoms |
| 21:01 | bbloom | sometimes, the lack of generic behavior is every bit as much of a feature as the presence of it |
| 22:10 | Frozenlock | Urr... "java.util.zip.ZipException: duplicate entry <my-file.cljs>" when doing lein jar |
| 22:10 | Frozenlock | Any ideas why? :-/ |
| 22:20 | fifosine | How do I view changes made in a liberator-service project? I've loaded the repl.clj file and am "use"ing it, but when I make changes to home.clj I have to quit the repl and re open and reload everything to see the changes. Is there a better way of doing this? |
| 22:22 | justinholguin | fifosine: I think you want "in-ns" instead of "use" |
| 22:23 | justinholguin | If you're in the REPL |
| 22:24 | fifosine | It moves me into the namespace? What happens when I change a function in the ns? |
| 22:24 | justinholguin | If you change a function in ns x and evaluate it, the change should carry to the REPL session where you called (in-ns x) |
| 22:25 | fifosine | ugh, I don't understand why this isn't working. Are you familiar with liberator projects? |
| 22:25 | justinholguin | Not really, sorry. I think I'm out of ideas for this one. |
| 22:26 | justinholguin | Are you using CIDER or fireplace or something? |
| 22:27 | justinholguin | Or are you just saving the changes to the files? |
| 22:29 | justinholguin | fifosine: I think I get what you're running into. Try (use 'namespace :reload-all) |
| 22:29 | justinholguin | I was assuming that you're developing with an active nREPL connection, which is my mistake. |
| 22:30 | fifosine | justinholguin: No, that doesn't work. I must be reading this wrong |
| 22:31 | fifosine | justinholguin: Does this make it clear what I should be doing? |
| 22:31 | fifosine | https://imgur.com/G2O2A0U |
| 22:32 | fifosine | What I've been doing is performing "lein repl" then loading "src/liberator_service/repl.clj" then (use 'liberator-service.repl) then (start-server) |
| 22:32 | fifosine | is that what's expected? |
| 22:33 | justinholguin | That should work. Does it? |
| 22:34 | fifosine | Not really, because when I change something, I don't see the change |
| 22:35 | justinholguin | What kind of change? You might need to run (stop-server) and (start-server) again |
| 22:35 | fifosine | yea I've been doing that :/ |
| 22:35 | fifosine | Just a small change, e.g., it starts out saying "Hello World!" just changing those words doesn't show |
| 22:36 | cbp | (require '[foo.repl :refer :all :reload true]) |
| 22:36 | justinholguin | Even if you do (stop-server) (use 'liberator-service.repl :reload-all)? |
| 22:36 | fifosine | cbp: Do that instead of (use…) or before? |
| 22:39 | fifosine | cbp: still doesn't work :/ |
| 22:40 | fifosine | I'm making changes in another file, do I have to do something else so that that file is reloaded? |
| 22:43 | cbp_ | agh |
| 22:43 | cbp_ | I had massive lag |
| 22:44 | cbp_ | fifosine: can you explain what you're trying to do? |
| 22:44 | fifosine | I'm following along a project in "Web Development with Clojure" but I've hit a snag and can't continue with the tutorial because of it |
| 22:45 | cbp_ | well that doesn't tell me much |
| 22:45 | rhg135 | fifosine, yes, (require 'the.ns) |
| 22:46 | cbp_ | fifosine: when you say "change" you mean you want your repl to use the changed function or your running webserver? |
| 22:46 | rhg135 | i use fireplace to invoke this for me when i save to reload my code |
| 22:46 | fifosine | cbp_: I guess both? |
| 22:47 | cbp_ | fifosine: uh well, the line I gave you should work for the repl |
| 22:49 | rhg135 | unless start-server does somn like resolve all vars at invokation you shouldn't need to restart the server |
| 22:50 | justinholguin | The author of that book (yogthos) hangs around in here pretty regularly. Guess he's not around now. |
| 22:51 | fifosine | arggggg this is so frustrating, I don't know what's going on |
| 22:52 | cbp_ | fifosine: Need to see some code to help you, can't by just guessing what you're trying to do |
| 22:53 | fifosine | cbp_: The thing is there's so much skeleton code, even if I showed something to you, would it be understandable? |
| 22:53 | cbp_ | fifosine: probably with just what run-server does |
| 22:54 | fifosine | cbp_: The file I'm changing right now is 'home.clj': http://pastebin.com/sRAq0beM |
| 22:54 | fifosine | the thing is, when I change the text, I don't see it change |
| 22:55 | fifosine | but the repl.clj file says that changes should be applied to the server in the comments: http://pastebin.com/6XjGr7xs |
| 22:56 | fifosine | the way I'm loading it is first (load-file "…repl.clg") then (use 'liberator-service.repl) |
| 22:56 | fifosine | *clj |
| 22:57 | cbp_ | fifosine: you don't need to do load-file |
| 22:58 | fifosine | Even still, with exiting the repl, making changes to that small amount of text, reopening repl, re"use"ing repl.clj and reperforming start-server, I don't see the changes |
| 22:59 | fifosine | I think I need to tell it to recompile the file |
| 22:59 | fifosine | but I don't know how to do that |
| 23:00 | justinholguin | Wait, you can't see the changes even after you completely exit the REPL and start it back up again? |
| 23:01 | fifosine | justinholguin: Ye |
| 23:01 | fifosine | s |
| 23:01 | cbp_ | fifosine: show me the handler file |
| 23:01 | fifosine | cbp_: http://pastebin.com/B3PjVAz4 |
| 23:02 | fifosine | justinholguin: Actually, that's not necessarily true, sometimes when I restart I see the changes and other times I don't |
| 23:03 | justinholguin | Going for maximum weirdness |
| 23:05 | fifosine | I think it has to do with not recompiling on save |
| 23:05 | justinholguin | lein compiles that stuff when you load it in the REPl |
| 23:05 | fifosine | but then it needs to recompile it when I change it |
| 23:06 | cbp_ | have you tried doing a hard refresh on your browser? |
| 23:06 | rhg135 | require recompiles it then |
| 23:06 | fifosine | How do I do that? |
| 23:06 | cbp_ | uh depends on the browser + os |
| 23:06 | cbp_ | usually something like ctrl + shift + r |
| 23:07 | cbp_ | it might be liberator caching responses |
| 23:08 | cbp_ | the code looks fine |
| 23:08 | fifosine | now I see the change |
| 23:08 | fifosine | I think it had to do with hard refresh :/ |
| 23:08 | cbp_ | its liberator doing http caching then |
| 23:08 | fifosine | do you know how to turn it off? |
| 23:09 | cbp_ | maybe on the liberator docs, never used it myself |
| 23:09 | cbp_ | then again its not too uncomfortable to hard refresh |
| 23:11 | cbp_ | fifosine: anyway, when you do load-file, require or use clojure will compile the file for you if it finds it |
| 23:11 | cbp_ | fifosine: of all three require is the only one you should use |
| 23:11 | fifosine | oh, don't use "use"? |
| 23:12 | cbp_ | fifosine: no that's just left around for compatibility afaik |
| 23:12 | fifosine | ok |
| 23:12 | cbp_ | use (require '[foo :refer :all]) instead of (use 'foo) |
| 23:13 | cbp_ | fifosine: instead of the steps you were following you should do (require 'liberator-service.repl) followed by (in-ns 'liberator-service.repl) |
| 23:13 | fifosine | why is that better? |
| 23:14 | cbp_ | fifosine: load-file and require are redundant |
| 23:14 | cbp_ | fifosine: i mean load-file and use |
| 23:14 | fifosine | cbp_: hard refresh isn't working anymore :p |
| 23:15 | cbp_ | fifosine: eh? |
| 23:16 | fifosine | idk, the changes just aren't appearing |
| 23:17 | cbp_ | fifosine: I guess you could ask yogthos once he's back |
| 23:17 | fifosine | ok |
| 23:59 | yedi | guys |
| 23:59 | yedi | destructuring is so sexy |