2014-06-12
| 00:02 | umpa | Any way to keep score with immutable seqs ? |
| 00:05 | jonasen | umpa: not sure what you mean |
| 00:07 | umpa | jonasen: now I manually mutate (atom ()). Maybe there is a better way to keep score for a two player game ? |
| 00:09 | jonasen | umpa: An atom is probably the way to go |
| 00:11 | umpa | ,(doc partial) |
| 00:11 | clojurebot | "([f] [f arg1] [f arg1 arg2] [f arg1 arg2 arg3] [f arg1 arg2 arg3 & ...]); Takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args." |
| 00:11 | amalloy | jonasen: i think it's too early to conclude that. it could easily be a lazy seq of scores or game states, or a state variable that you reduce or loop over |
| 00:12 | jonasen | amalloy: thats true |
| 00:13 | umpa | ,(doc lazy-seq) |
| 00:13 | clojurebot | "([& body]); Takes a body of expressions that returns an ISeq or nil, and yields a Seqable object that will invoke the body only the first time seq is called, and will cache the result and return it on all subsequent seq calls. See also - realized?" |
| 00:14 | umpa | that (doc lazy-seq) is kind of lazy |
| 01:09 | umpa | what if the state depends on the score ? |
| 01:12 | dbasch | umpa: the score is part of the state, isn’t it? you’re asking what if the state depends on the state, which is a tautology |
| 01:14 | umpa | dbasch: score is the only state ? |
| 01:14 | dbasch | how should I know? |
| 01:15 | umpa | it just sounds like one big recur loop |
| 01:15 | dbasch | umpa: is your game single-threaded? |
| 01:17 | umpa | i don't make use of threads no |
| 01:17 | dbasch | umpa: in that case you can keep your score in an immutable structure |
| 01:18 | dbasch | you can recur with the new score at the end of each “round” |
| 01:18 | umpa | this might be a good opportunity to learn about states |
| 01:19 | dbasch | imagine a jeopardy game for example, where for each round the three contestants are given the chance to guess in order |
| 01:19 | dbasch | there’s no concurrency, and at the end of the round you have the updated scores of the three players |
| 01:23 | umpa | ok, in my case the 2nd round would take each player's scores and create a new state according to the score of each player |
| 01:24 | dbasch | umpa: yes, that sounds like a regular recur based on the computation that happened during the sequential evaluation of the loop |
| 01:26 | umpa | is that optimal in clojure ? clojure.org/state talks about alter, commute and send |
| 01:28 | dbasch | umpa: optimal for what? if you have no concurrency, you don’t need to worry about that |
| 01:29 | umpa | dbasch: i'm yet to see an example of concurrency, but at this point just figuring best practices |
| 01:30 | dbasch | umpa: you usually know when you need concurrency |
| 01:31 | dbasch | umpa: if you can model your game without concurrency and it performs well, you don’t need concurrency |
| 01:32 | dbasch | umpa: a typical example of concurrency is when you want to provide a service to different people and you don’t want to keep them waiting |
| 01:33 | dbasch | although that’s typically done with a parallel implementation, which is more than just concurrency |
| 01:33 | umpa | dbasch: would running two recur loops at the same time be an example of concurrency |
| 01:33 | dbasch | umpa: it would be concurrent if you cannot predict the order in which operations take place |
| 01:34 | dbasch | you mean running two loops at the same time in two different threads? |
| 01:34 | dbasch | that would be parallelism, but if they don’t interact with each other they are not necessarily concurrent |
| 01:35 | umpa | hmm |
| 01:35 | dbasch | an example of concurrency could be a busy intersection, where at each “turn” an indeterminate number of cars can go through |
| 01:36 | Jaood | clojure is dead: http://uautoinsurance.com/b/yclanguages-cm465/ |
| 01:36 | dbasch | and if you could turn back time and restart the flow of traffic, it might happen differently every time |
| 01:37 | dbasch | e.g. you have cars 1, 2 and 3 trying to cross north-south, and cars 4 5 6 east-west |
| 01:37 | dbasch | one possibility would be 1 4 2 5 3 6 |
| 01:37 | dbasch | another one would be 1 2 3 4 5 6 |
| 01:38 | dbasch | cars 1 and 4 are concurrently trying to access the intersection at the beginning |
| 01:38 | dbasch | if you have a loop that takes one car from each direction and makes it go through, you have no concurrency issues |
| 01:39 | dbasch | if on the other hand you just put the cars in there and something makes them go through for you in a way that you cannot predict the order, that’s concurrency outside of your control |
| 01:42 | umpa | so its not ([1 4][2 5][3 6]), that would be parallelism ? |
| 01:48 | dbasch | umpa: in this case there probably wouldn’t be parallelism, because we can assume that only one car moves at a time |
| 01:48 | dbasch | two cars cannot move at the same time |
| 01:48 | umpa | Jaood: Wit.AI is actually the only one I would be interested in working for from that list |
| 01:48 | Jaood | umpa: parallelism is just a technicque to perform an operation more faster |
| 01:49 | dbasch | umpa: the point is that parallelism and concurrency are different things, often combined |
| 01:50 | dbasch | when programming nondeterministic access to resources, you usually care about concurrency |
| 01:51 | dbasch | for example, let’s suppose your cars decide to cross in whichever order they negotiate on their own, because they are autonomous |
| 01:51 | umpa | ok |
| 01:51 | dbasch | if you want [1 2 3] to always be together, you could impose a condition that they move “atomically" |
| 01:51 | dbasch | e.g. 1 4 5 6 2 3 would not be a possible order for crossing the intersection |
| 01:52 | dbasch | you could have 1 2 3 4 5 6 or 4 5 6 1 2 3 |
| 01:52 | dbasch | (if [4 5 6] are also atomic) |
| 01:52 | dbasch | or 4 1 2 3 5 6 might be allowed if you care about the atomicity of 1 2 3 and not the others |
| 01:53 | dbasch | that’s when you start using synchronization with things like atoms |
| 01:54 | dbasch | the important question is whether someone could observe your system during the transition and find it in an inconsistent state, or not |
| 01:54 | dbasch | if there are no observers but you, it’s a moot question |
| 01:55 | johnwalker | oh hi dbasch |
| 01:55 | dbasch | hi johnwalker |
| 01:55 | johnwalker | small world |
| 01:55 | umpa | nice dbasch |
| 01:56 | dbasch | the world of clojure is still pretty small :) |
| 02:01 | umpa | dbasch: now the terms futures, promises, delays, atoms, refs make more sense |
| 02:01 | dbasch | cool |
| 02:17 | IbrahimA | somewhat abstract question, hope it's appropriate: i notice umpa mentioned wit.ai, and that article mentions that they think perhaps they can iterate faster on machine learning algorithms with clojure? |
| 02:17 | IbrahimA | as a first year graduate student working on machine learning and starting to dabble in clojure for fun, i can't see how/why clojure would be particularly better for machine learning than something more numerically oriented like matlab or python? |
| 02:18 | IbrahimA | but im certainly curious if anyone is doing that kind of thing |
| 02:18 | IbrahimA | i've done some scheme before and i always recall people saying lisps were good for AI, but i never really saw why they said that |
| 02:19 | IbrahimA | there's certainly some elegance to sexps which makes them nice languages to work with, especially if you use emacs, but i dont see how that relates to AI |
| 02:20 | dbasch | IbrahimA: I personally don’t think that any language is better than any other for AI, what matters most are whatever libraries people have written |
| 02:20 | IbrahimA | right |
| 02:20 | IbrahimA | i agree completely, with the minor point that some languages have better syntax for eg. linear algebra |
| 02:21 | IbrahimA | but python doesn't, and yet there's plenty of numerical stuff for it |
| 02:21 | dbasch | IbrahimA: python is useful because of SciPy |
| 02:21 | IbrahimA | righto |
| 02:21 | IbrahimA | i just want to understand where the "lisp is good for AI" meme comes from |
| 02:21 | dbasch | honestly I don’t know |
| 02:21 | IbrahimA | is it more of a correlation vs causation thing, maybe just happens that early ai pioneers liked lisp? |
| 02:22 | dbasch | IbrahimA: yeah, at the time you didn’t have many good choices |
| 02:22 | IbrahimA | that sounds like the case from this SO post: http://stackoverflow.com/questions/130475/why-is-lisp-used-for-ai |
| 02:22 | umpa | or perl, lisp lost popularity when AI proved to be not very promising |
| 02:23 | umpa | back in 70s |
| 02:23 | dbasch | IbrahimA: have you checked out incanter? |
| 02:23 | IbrahimA | i barely know clojure at this point |
| 02:23 | IbrahimA | err |
| 02:23 | johnwalker | is there a way to make the charts in incanter look nice? |
| 02:23 | IbrahimA | i mean, i've barely started learning |
| 02:24 | IbrahimA | and honestly, if i were to switch away from matlab it'd probably be to python/numpy |
| 02:24 | dbasch | johnwalker: the charts in the incanter examples look nice enough to me, at least better than what I can do with R |
| 02:24 | IbrahimA | clojure im learning completely for fun |
| 02:25 | johnwalker | they're ok, but for example |
| 02:25 | johnwalker | http://data-sorcery.org/2010/04/04/new-chart-theme/ |
| 02:25 | dbasch | IbrahimA: I know a company that was doing statistical software in clojure and switched to python because incanter wasn’t there yet for their particular needs |
| 02:25 | IbrahimA | yeah, the python numpy/scipy/pandas ecosystem is pretty strong |
| 02:25 | dbasch | johnwalker: I like those charts |
| 02:25 | johnwalker | if you look at the sin wave's they're all janky looking, and i didn't see a way to control the legend |
| 02:26 | IbrahimA | i mean, really i prefer ruby as a language over python, but i dont think sciruby is anywhere close to replacing scipy |
| 02:26 | IbrahimA | i hope i dont start a language flame war :P |
| 02:26 | IbrahimA | forget i said anything |
| 02:26 | dbasch | IbrahimA: don’t worry about it. Who can argue about personal preferences. |
| 02:26 | johnwalker | there isn't really a flamewar threat |
| 02:27 | IbrahimA | i've managed to derail #emacs with random topics like that, though i think #emacs exists to be derailed |
| 02:27 | dbasch | there’s a pretty big intersection of domains for which using python, clojure or ruby is a matter of preference |
| 02:27 | IbrahimA | mhm |
| 02:28 | IbrahimA | thankfully in these days of modern hardware we don't have to care as much about performance 90% of the time :D |
| 02:29 | umpa | you do if its a mobile device |
| 02:31 | dbasch | IbrahimA: the main reason I like clojure is repl-driven development on the jvm |
| 02:31 | IbrahimA | yea |
| 02:32 | dbasch | johnwalker: yes, that sine chart doesn’t look particularly pretty |
| 02:32 | umpa | optimized recursion is nice as well |
| 02:49 | hellofunk | anyone know why simply restarting a REPL would cause this exception to go away: FileNotFoundException: Could not locate compojure__init.class or compojure.clj on classpath |
| 03:06 | ddellaco_ | hellofunk: could just be weirdness with dependencies getting loaded...I've seen that happen. namespace state can get messed up in the repl, unfortunately. |
| 03:09 | hellofunk | ddellaco_ ok seems like a rather basic and fundamental aspect to how clojure works, i would expect that to be more stable |
| 03:14 | hellofunk | ddellacosta when using Om is it better to use directly DOM stuff like #js {:onClick ... or to use goog closure's event listening abstractions? |
| 03:15 | ddellacosta | hellofunk: regarding namespaces in repl, I recommend reading this article for a bit better context: http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded |
| 03:16 | ddellacosta | hellofunk: re: Om, I've found it's a lot better to lean on React's events as much as possible. |
| 03:17 | ddellacosta | hellofunk: depends on what you're doing--in some cases you have to do some event handling outside of the React lifecycle. But generally, if you can use the React event handlers, components logic will be a lot cleaner. |
| 03:17 | ddellacosta | *component logic |
| 03:18 | hellofunk | ddellacosta thanks. i see in om tuts that basic js/document getElementById is used for things like om/root rather than a goog closure abstraction as well. |
| 03:20 | ddellacosta | hellofunk: as far as actually getting stuff from the DOM, I tend to use a library that makes that easy on top of Om--if I had my choice I'd use Dommy (https://github.com/Prismatic/dommy), but we use Domina in the app I work on at work day-to-day. David Nolen falls back on the default built-in DOM stuff a lot, but I suspect that has more to do with not wanted to bring in other dependencies than anything (although he d |
| 03:20 | ddellacosta | oes use Google Closure stuff in his tutorials/example code too when it's appropriate, since it is "built-in"). |
| 03:21 | ddellacosta | hellofunk: however, if you find yourself doing a ton of DOM stuff outside of React, I would suggest you ask yourself if you aren't doing something that would be easier by working within the React lifecycle and managing your data vs. fiddling with the DOM. |
| 03:21 | ddellacosta | hellofunk: ...that's based on my experience up until now. YMMV. |
| 03:23 | hellofunk | ddellacosta thanks, i guess there is always a non-react part that must load the html element that om has control over, but i guess relying on built-in DOM for that is excusable |
| 03:24 | ddellacosta | hellofunk: ah, yeah, the very initial load to hand something off to root requires that. But if that's all you're doing of course it doesn't make sense to add another DOM lib dependency to your app. |
| 03:58 | hellofunk | ddellacosta Dommy and Domina would be similar tools to Goog Closure for accessing DOM *outside* React, then right? |
| 04:00 | ddellacosta | hellofunk: yeah, they are both just DOM manipulation libs. Dommy has some templating and AJAX stuff as well I believe. Google Closure is quite a bit more full-featured however, and includes an extensive set of UI widgets as well as mamy other utilities. |
| 04:00 | ddellacosta | hellofunk: self-promotion but this is a pretty good survey of the DOM libs out there: http://davedellacosta.com/cljs-dom-survey |
| 04:01 | hellofunk | ddellacosta oh cool, i'll read that |
| 04:13 | ddellacosta | hellofunk: oh sorry, I was wrong, Dommy doesn't have any AJAX stuff--I was thinking of event handling, rather. |
| 06:34 | clgv | afair in primatic/plumbing the result of lazy-compile can be treated as usual clojure map. but I only get nil values when applying `select-keys` on it |
| 06:43 | clgv | well, unrelated error. the map behavior is fine |
| 07:18 | sveri | Hi, I am wondering if its possible to run clojure tests (testing java code) as part of a junit test suite? Has anyone experience with this? |
| 07:20 | andyf | Bronsa: ping |
| 07:20 | Bronsa | andyf: hi |
| 07:21 | andyf | Saw your comment. I can do a quick test on this, but the reason I changed mapv to loop is that I had this idea that with mapv, the *ns* value would get 'captured' once at closure creation time, and not update during each call to that closure. |
| 07:21 | andyf | Testing out that guess now |
| 07:22 | engblom | If I need to change the nth value in a list, is there a ready function for that? |
| 07:22 | Bronsa | andyf: that's not the case, mapv is eager |
| 07:22 | andyf | Yeah, I wasn't worried about lazy/eagerness of mapv. |
| 07:23 | andyf | But does (fn ...) capture values of free vars, or only references to them? |
| 07:23 | andyf | scratch the "only" |
| 07:24 | agarman | engblom: update-in |
| 07:24 | agarman | ,(update-in [1 [2 [3]]] [1 1] inc) |
| 07:24 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.Number> |
| 07:24 | agarman | ,(update-in [1 2 3] [2] inc) |
| 07:24 | Bronsa | andyf: (fn [] *ns*) resolves *ns* at call time |
| 07:24 | clojurebot | [1 2 4] |
| 07:25 | Bronsa | andyf: you'd need something like (let [ns *ns*] (fn [] ns)) to capture it at compilation time |
| 07:25 | andyf | ok, makes sense. Switching the code back to more like it was and testing |
| 07:25 | Bronsa | cool, thanks a lot |
| 07:27 | andyf | Should the recursive call to analyze+eval for statements-expr also have last arg of opts? |
| 07:27 | andyf | it wasn't there before. |
| 07:27 | Bronsa | yeah I saw that, good catch |
| 07:27 | Bronsa | should definitely be there |
| 07:27 | andyf | ok |
| 07:37 | andyf | patch attached |
| 07:38 | Bronsa | thanks |
| 07:56 | engblom | Today I wrote this function: https://www.refheap.com/86508 . How would you indent this function? Is there anything made in a stupid way that could be done better? |
| 08:04 | andyf | engblom: I did not notice anything being done in a stupid way, but didn't check extremely carefully. Here is another way to structure it using ->> https://www.refheap.com/86510 |
| 08:05 | engblom | andyf: Thanks! |
| 08:08 | andyf | I haven't tested, but isn't (update-in (vec heaps) [index] (fn [n] new-heap)) equivalent to (assoc (vec heaps) index new-heap) ? |
| 08:14 | engblom | andyf: Thanks, that made it a bit shorter! |
| 08:14 | engblom | The function looks like this now: https://www.refheap.com/86511 |
| 08:14 | engblom | I corrected one bug I had. |
| 08:17 | andyf | engblom: Instead of flattening out all structure, and then putting it back in with partition, I think you could do something like (apply concat) instead of flatten (partition 3) |
| 08:21 | engblom | andyf: Before flattening and partitioning it back, it is looking like this '(([0 2 1] [1 2 1] [2 2 1]) ([3 1 1] [3 0 1]) ([3 2 0])) |
| 08:21 | engblom | It is a list of lists of vectors |
| 08:23 | engblom | ,(apply concat '(([0 2 1] [1 2 1] [2 2 1]) ([3 1 1] [3 0 1]) ([3 2 0]))) |
| 08:23 | clojurebot | ([0 2 1] [1 2 1] [2 2 1] [3 1 1] [3 0 1] ...) |
| 08:23 | engblom | It is not becoming what I want the end-result to be. |
| 08:23 | andyf | You mean you prefer that the result is a list of lists, rather than a list of vectors? |
| 08:23 | engblom | End-result should be like this: ((0 2 1) (1 2 1) (2 2 1) (3 0 1) (3 1 1) (3 2 0)) |
| 08:24 | engblom | Yes |
| 08:25 | andyf | Out of curiosity, why? |
| 08:25 | engblom | Because my other functions already operate over lists, so it is easier to convert this one list of lists, rather than rewrite the other. |
| 08:27 | andyf | ok, no problem. Note that many (not all) Clojure functions can work on vectors and lists equivalently, treating them as sequences. |
| 08:28 | engblom | Actually, it would not be that difficult for the other ones, now when I look at it. |
| 08:40 | andyf | Bronsa: taj/analyze+eval should return :raw-forms just like taj/analyze does, yes? I'm not getting it, but I may be messing something up. |
| 08:40 | Bronsa | andyf: only in the nodes where the form gets macroexpanded, yes |
| 08:41 | Bronsa | andyf: do you have a test case where you're not getting it? |
| 08:41 | andyf | trying to reproduce with original libs |
| 08:43 | engblom | andyf: Now the function is looking like this: https://www.refheap.com/86512 . I made the suggested change to use vectors instead. |
| 08:44 | andyf | Try (-> '(comment 1 2 3) taj/analyze :raw-forms) and then again with taj/analyze+eval |
| 08:45 | Bronsa | andyf: arg I'm an idiot |
| 08:46 | Bronsa | forgot to commit that line |
| 08:47 | Bronsa | andyf: https://github.com/clojure/tools.analyzer.jvm/commit/95d45bc808f1aa299f1f6345e5ac5031a351d147 |
| 08:48 | andyf | engblom: I can't speak for everyone, but it is easier for me to follow now. |
| 08:49 | Glenjamin | i think you could use mapv instead of map-indexed and assoc |
| 08:49 | Glenjamin | is heaps a vector of ints? |
| 08:51 | justin_smith | quoting the maintainer of cider.el: "the final nrepl.el release is about an year old and I doubt many people are still using it" |
| 08:51 | justin_smith | if only he knew how many of us are still using slime |
| 08:52 | engblom | Glenjamin: Yes, it is! |
| 08:52 | andyf | Bronsa: grazie |
| 08:52 | Bronsa | andyf: grazie a te! :) |
| 08:53 | andyf | My Italian is limited to about 20 words, but that plus 1 year of Latin 30 years ago makes me guess "thanks to you" |
| 08:53 | Bronsa | correct |
| 08:53 | engblom | Glenjamin: I can find any information about mapv: http://clojuredocs.org/search?x=0&y=0&q=mapv&lib=clojure_core |
| 08:53 | Glenjamin | ,(doc mapv) |
| 08:53 | clojurebot | "([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & ...]); Returns a vector consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments." |
| 08:54 | Bronsa | andyf: fun fact: I can't help but read Italian phrases in a really weird accent in my head when I know the persons that's writing them is not a native speaker |
| 08:55 | Glenjamin | for some reason i really can't seem to follow the combination of for and assoc |
| 08:55 | andyf | Once in Venice I spoke a few sentences of probably-broken Italian to a vaporetti ticket seller "I would like 4 72-hour tickets", and without me having spoken a single word of English, he said that back to me (in English), and said "You speak very good English" |
| 08:56 | Glenjamin | oh, i think it get it now |
| 08:57 | Bronsa | andyf: ahah |
| 08:58 | andyf | engblom: Unfortunately clojuredocs.org has nothing added to Clojure since version 1.3. That is not a lot of symbols, but mapv is one of them. |
| 08:58 | arrdem | 'mornin |
| 08:59 | Bronsa | I'd rather have clojuredocs die forever than keep being outdated |
| 08:59 | engblom | Why is nobody updating clojuredocs? |
| 09:00 | andyf | People are updating ClojureDocs for the symbols that are already there, but only the developers can add new symbols. They haven't had the time/interest. |
| 09:00 | engblom | I think they are great as they provide examples for almost everything, so you know you understood the documentation right |
| 09:01 | andyf | Someone could come out with a replacement if they were interested and had the right skills, but it would take a chunk of time, initially and ongoing. |
| 09:02 | arrdem | engblom: there was a ticket closet on the clojuredocs github page to the effect that there's a clojure rewrite of clojuredocs (it's ruby atm) in the works but "at a point where it's a single committer project" in the last week. |
| 09:02 | engblom | Ok |
| 09:02 | Glenjamin | arrdem: do you have a link to the rewrite project? |
| 09:03 | arrdem | Glenjamin: it's not open yet. |
| 09:03 | Glenjamin | oh |
| 09:03 | arrdem | afaik |
| 09:03 | Glenjamin | is it the one that had about 50 essays about it on the mailing list? |
| 09:03 | engblom | I am still trying to get my brain to understand how mapv could be used in my function |
| 09:03 | Glenjamin | engblom: i tend to use the cheatsheet, which links to clojuredocs for old fns, and github api docs for new ones |
| 09:03 | Glenjamin | engblom: i think i was incorrect |
| 09:03 | arrdem | https://github.com/zk/clojuredocs/issues/66 |
| 09:04 | Glenjamin | i didn't realise that the index was used to produce permutations of the original input vector |
| 09:05 | andyf | engblom: My personal favorite variety of the cheatsheet is here: http://jafingerhut.github.io/cheatsheet-clj-1.3/cheatsheet-tiptip-cdocs-summary.html |
| 09:05 | andyf | Can get there from clojure.org/cheatsheet in 2 clicks if you forget that link. |
| 09:15 | engblom | andyf: Thanks! |
| 09:17 | JokerDoom | what's up with the # sign in clojure, I can't figure out the pattern, it seems to be used for a bunch of different stuff, what's the deal |
| 09:17 | Glenjamin | think of it like a modifier |
| 09:18 | Glenjamin | in fact no |
| 09:18 | broquaint | JokerDoom: http://clojure.org/reader#The%20Reader--Macro%20characters |
| 09:18 | Glenjamin | think of it like the first character in a two-character thing |
| 09:18 | engblom | JokerDoom: You should look up sets and anonymous functions. |
| 09:18 | Glenjamin | #{ = sets, #( = fn, #" = regex, #_ = comment etc |
| 09:19 | engblom | (inc Glenjamin) |
| 09:19 | lazybot | ⇒ 5 |
| 09:19 | broquaint | See also - http://yobriefca.se/blog/2014/05/19/the-weird-and-wonderful-characters-of-clojure/ |
| 09:19 | whodidthis | so many syntax |
| 09:21 | arrdem | on the contrary, all reader macros! |
| 09:22 | engblom | Think about this: You could count with only 1 and 0, but then each number becomes quite long to write. That is why we are using 0..9 when forming numbers. Advanced set of elements (which actually are still quite simple) makes shorter code |
| 09:23 | arrdem | also since #{} does nothing that (into #{} [ .. elements ]) does it's still entirely first class since you can generate the same datastructure, forget clojure.core/set which wraps the constructor. |
| 09:25 | philandstuff | not quite true, you can't do #{(rand-int 100) (rand-int 100)} as that'll fail at read time |
| 09:26 | arrdem | yeah but that's the reference compiler being shitty, not a fundimental language limitation |
| 09:26 | philandstuff | wait, I got your logic backwards. never mind, carry on |
| 09:26 | JokerDoom | so all uses of pound are reader macros? |
| 09:26 | JokerDoom | k, that makes sense to me |
| 09:27 | arrdem | JokerDoom: all leading uses of #. |
| 09:27 | arrdem | ,foo#bar |
| 09:27 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo#bar in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 09:27 | JokerDoom | Yes, leading uses of it definitely |
| 09:27 | eraserhd_ | No filter-indexed? |
| 09:27 | JokerDoom | hrm? |
| 09:27 | eraserhd | Hrmm.. |
| 09:27 | Glenjamin | (map (range) coll) === (map-indexed coll) |
| 09:28 | Glenjamin | oh, filter only accepts one coll |
| 09:28 | Glenjamin | so that doesn't really help you |
| 09:28 | eraserhd | Yeah, that too. |
| 09:28 | JokerDoom | thx guys, I think I get it now |
| 09:29 | justin_smith | Glenjamin: "(map (range) coll) === (map-indexed coll)" correct in that they are both erroneous in missing a function |
| 09:29 | Glenjamin | haha |
| 09:29 | Glenjamin | good point |
| 09:30 | justin_smith | (map 𝑓 (range) coll) === (map-indexed 𝑓 coll) |
| 09:30 | arrdem | if you go throwing out tickets post em here so we can vote 'em up or not. |
| 09:30 | justin_smith | why does emacs want 𝑓 to be so tall? |
| 09:31 | Glenjamin | ,(defn filter-indexed [f coll] (map second (filter f (map (range) coll))) |
| 09:31 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 09:31 | Glenjamin | ,(defn filter-indexed [f coll] (map second (filter f (map (range) coll)))) |
| 09:31 | clojurebot | #'sandbox/filter-indexed |
| 09:31 | Glenjamin | ,(filter-indexed = [0 2 2 4]) |
| 09:31 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn> |
| 09:31 | Glenjamin | bah |
| 09:31 | Glenjamin | something like that anyway |
| 09:31 | hyPiRion | heh. |
| 09:32 | justin_smith | Glenjamin: again your example above with map (range)... was missing an f |
| 09:32 | Glenjamin | oh, i forgot the damn function to map again |
| 09:32 | Glenjamin | ,(defn filter-indexed [f coll] (map second (filter f (map identity (range) coll)))) |
| 09:32 | clojurebot | #'sandbox/filter-indexed |
| 09:32 | Glenjamin | ,(filter-indexed = [0 2 2 4]) |
| 09:32 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core/identity> |
| 09:32 | Glenjamin | gah |
| 09:32 | justin_smith | maybe you want list? |
| 09:32 | Glenjamin | ,(defn filter-indexed [f coll] (map second (filter f (map vector (range) coll)))) |
| 09:32 | clojurebot | #'sandbox/filter-indexed |
| 09:32 | justin_smith | or vector |
| 09:32 | Glenjamin | ,(filter-indexed = [0 2 2 4]) |
| 09:32 | clojurebot | (0 2 2 4) |
| 09:32 | Glenjamin | meh, doesn't work anyway |
| 09:32 | Glenjamin | the point was supposed to be that you can just define your own filter-indexed trivially |
| 09:33 | Glenjamin | but maybe its not so trivial |
| 09:33 | Glenjamin | (it is, i'm just not very good at IRC repling) |
| 09:33 | hyPiRion | ,(defn filter-indexed [f coll] (map second (filter (fn [[a b]] (f a b)) (map vector (range) coll)))) |
| 09:33 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 09:34 | eraserhd | ,(defn filter-indexed [f coll] (->> coll (map-indexed (fn [[i v]] [(f i v) v])) (filter first) (map second))) |
| 09:34 | clojurebot | #'sandbox/filter-indexed |
| 09:34 | Glenjamin | ,(filter-indexed = [0 2 2 4]) |
| 09:34 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: sandbox/filter-indexed/fn--237> |
| 09:35 | eraserhd | wut? |
| 09:35 | Glenjamin | hyPiRion's seems correct to me, not clear what the error there is |
| 09:36 | hyPiRion | mine works, but I had a nbsp in there |
| 09:36 | hyPiRion | ,(defn filter-indexed [f coll] (map second (filter (fn [[a b]] (f a b)) (map vector (range) coll)))) |
| 09:36 | clojurebot | #'sandbox/filter-indexed |
| 09:36 | hyPiRion | ,(filter-indexed = [0 2 2 4]) |
| 09:36 | clojurebot | (0 2) |
| 09:37 | eraserhd | Oh. I see what's wrong with mine. |
| 09:37 | hyPiRion | eraserhd: map-indexed uses [], not [[]] |
| 09:37 | eraserhd | ,(defn filter-indexed [f coll] (->> coll (map-indexed (fn [i v] [(f i v) v])) (filter first) (map second))) |
| 09:37 | clojurebot | #'sandbox/filter-indexed |
| 09:37 | eraserhd | ,(filter-indexed = [0 2 2 4]) |
| 09:37 | clojurebot | (0 2) |
| 09:37 | justin_smith | ((fn filter-indexed [filt coll] (map second (filter filt (map list (range) coll)))) #(even? (first %)) [:a :b :c :d :e :f :g]) |
| 09:37 | justin_smith | ,((fn filter-indexed [filt coll] (map second (filter filt (map list (range) coll)))) #(even? (first %)) [:a :b :c :d :e :f :g]) |
| 09:37 | clojurebot | (:a :c :e :g) |
| 09:38 | hyPiRion | And while we're at it, here's the swearjure version: |
| 09:38 | hyPiRion | (no) |
| 09:38 | justin_smith | heh |
| 09:38 | eraserhd | Is there a swearjure compiler yet? |
| 09:39 | eraserhd | i mean, with swearjure as the target language? |
| 09:39 | arrdem | A Clojure→Swearjure translater? |
| 09:39 | arrdem | hyPiRion: get on this |
| 09:40 | Glenjamin | https://github.com/timmc/swearjure |
| 09:40 | hyPiRion | arrdem: I think TimMc actually attempted to |
| 09:40 | hyPiRion | ah yeah, there we go |
| 09:40 | hyPiRion | I do have some code which converts a number to a swearjure number, but that's it for my part |
| 09:42 | eraserhd | There is a keep-indexed, but no filter-indexed. |
| 09:42 | eraserhd | Interesting: http://dev.clojure.org/jira/browse/CLJ-670?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs |
| 09:43 | arrdem | Clojure:Lisp::LSD:Meditation lowut |
| 09:43 | justin_smith | ? |
| 09:43 | arrdem | https://groups.google.com/forum/#!topic/clojure/uaXwkcjBxkg |
| 09:44 | justin_smith | sounds like a grumpy old lisper |
| 09:44 | arrdem | ikr |
| 09:44 | eraserhd | ,(defn filter-indexed [f coll] (keep-indexed #(or (f %1 %2) nil) coll)) |
| 09:44 | clojurebot | #'sandbox/filter-indexed |
| 09:44 | eraserhd | ,(filter-indexed = [0 2 2 4]) |
| 09:44 | clojurebot | (true true) |
| 09:44 | hyPiRion | that's no good |
| 09:44 | justin_smith | congratulations clojure, welcome to the world of "mindshare" and "popularity" |
| 09:45 | eraserhd | ,(defn filter-indexed [f coll] (keep-indexed #(if (f %1 %2) true) coll)) |
| 09:45 | clojurebot | #'sandbox/filter-indexed |
| 09:45 | eraserhd | ,(filter-indexed = [0 2 2 4]) |
| 09:45 | clojurebot | (true true) |
| 09:45 | kzar | Anyone here managed to use the include tag in a Selmer template? |
| 09:45 | justin_smith | maybe if we modified it to say (true :dat) instead, that would help |
| 09:47 | eraserhd | Oh, I didn't understand keep-indexed. |
| 09:47 | eraserhd | That's a weird function. |
| 09:47 | hyPiRion | ,(defn filter-indexed [f coll] (keep-indexed #(if (f %1 %2) %2) coll)) |
| 09:47 | clojurebot | #'sandbox/filter-indexed |
| 09:48 | hyPiRion | ,(filter-indexed = [0 2 2 4]) |
| 09:48 | clojurebot | (0 2) |
| 09:48 | hyPiRion | eraserhd: keep is equivalent to (remove nil? (map f coll)) |
| 09:48 | hyPiRion | keep-indexed is the same, but with map replaced as map-indexed |
| 09:48 | eraserhd | ,(filter-indexed even? [nil nil nil nil]) |
| 09:48 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core/even?> |
| 09:49 | eraserhd | ,(filter-indexed #(even? %2) [nil nil nil nil]) |
| 09:49 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Argument must be an integer: > |
| 09:49 | eraserhd | ,(filter-indexed #(even? %1) [nil nil nil nil]) |
| 09:49 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: sandbox/eval129/fn--130> |
| 09:49 | hyPiRion | and index is first |
| 09:49 | hyPiRion | heh, hard this thing |
| 09:49 | eraserhd | ,(filter-indexed (fn [i v] (even? i)) [nil nil nil nil]) |
| 09:49 | clojurebot | () |
| 09:49 | Glenjamin | the true reason why filter-indexed isn't in core ;) |
| 09:49 | eraserhd | ,(filter-indexed (fn [i v] (even? i)) [:a :b :c :d]) |
| 09:49 | clojurebot | (:a :c) |
| 09:49 | eraserhd | Why? |
| 09:49 | hyPiRion | eraserhd: oh, nice call. |
| 09:49 | clojurebot | http://clojure.org/rationale |
| 09:50 | eraserhd | I don't understand how keep-indexed is useful, though. That seems really arbitrary. |
| 09:50 | hyPiRion | You cannot use keep-indexed to simulate filter-indexed. |
| 09:51 | hyPiRion | eraserhd: keep-indexed is way more useful than when-first though |
| 09:51 | hyPiRion | which is the strangest one out there. |
| 09:51 | justin_smith | I think we should run the permutations, and keep all the good ones |
| 09:51 | Glenjamin | ,(doc when-first) |
| 09:51 | clojurebot | "([bindings & body]); bindings => x xs Roughly the same as (when (seq xs) (let [x (first xs)] body)) but xs is evaluated only once" |
| 09:51 | justin_smith | swap!-indexed |
| 09:51 | hyPiRion | justin_smith: commute-indexed |
| 09:54 | engblom | Would anyone want to check up the last function (best-move) and see if there is something stupid done, or something that could be better: https://www.refheap.com/86513 |
| 09:55 | TimMc | eraserhd: Yeah, I was working on a Clojure -> Swearjure compiler, but then I realized I was wasting valuable hours of my life. :-P |
| 09:55 | TimMc | I'm happy to give pointers to anyone who wants to move it forward, though! It's a fun exercise. |
| 09:56 | TimMc | (If you want to learn more about compilers, that is.) |
| 09:56 | arrdem | TimMc: I think that Bronsa and I have plenty of real work for compiler people, besides our stuff could actually be useful one day |
| 09:56 | TimMc | *nod* |
| 09:57 | TimMc | I would encourage people to work on that instead. |
| 09:57 | kzar | Is selmer a good library for django style templates? |
| 09:58 | hyPiRion | arrdem: are you implying that Swearjure is not useful? What blashpemy. |
| 09:58 | hyPiRion | *blasphemy |
| 09:58 | arrdem | hyPiRion: until we get a TCO compiler totally |
| 09:58 | eraserhd | arrdem: I actually signed the CA because of tools.analyzer/clojurescript, and wanting embedded compilation. |
| 10:00 | sveri | Hi, I am wondering if its possible to run clojure tests (testing java code) as part of a junit test suite? Has anyone experience with this? |
| 10:03 | TimMc | sveri: You mean wih mvn test? |
| 10:03 | TimMc | I think the clojure-maven-plugin might provide that. |
| 10:04 | kzar | yogthos: If you have a minute I'm having trouble using the include tag from Selmer https://github.com/yogthos/Selmer/issues/45 |
| 10:05 | sveri | TimMc: Hm, We dont use maven here, so, if I understand you correct, I have to look up for a plugin for the build tool we are using and besides that, a plugin that lets me execute that tests in eclipse |
| 10:05 | yogthos | kzar: just commented on the issue on github, you have to use render-file instead of render |
| 10:06 | TimMc | sveri: Or just put in a Makefile that runs junit tests and then lein test. :-P |
| 10:07 | sveri | TimMc: :D ok, thats another option |
| 10:07 | kzar | But with stasis I've already loaded all the files into a map using slurp-directory (and pre-processed them a bit) |
| 10:07 | TimMc | What build tool are you using? |
| 10:07 | sveri | ant and gradle |
| 10:17 | engblom | If I want to check if '([1 2 3] [4 5 6]) contains [1 2 3], is there a ready function i could use? |
| 10:17 | arrdem | Clojure core has no O(N) contains scan. |
| 10:18 | arrdem | however you can just say (any (map (partial = X) ys)) |
| 10:18 | justin_smith | ,(some #(= [1 2 3] %) '([1 2 3] [4 5 6])) |
| 10:18 | clojurebot | true |
| 10:18 | arrdem | or that :P |
| 10:18 | engblom | Thanks! |
| 10:19 | engblom | arrdem: (doc any) gives nothing and it is not on the cheat-sheet either. |
| 10:20 | kzar | yogthos: I need to process the contents first (I'm using the Jekyll way of having some YAML at the start of each file setting variables). I then pass the map of variables I've read to selmer for rendering along with the file contents minus the header. Can you think of how I could parse and strip out the yaml, pass the variables through to selmer in a way that I can use include without having to read the file twice? |
| 10:20 | arrdem | engblom: any is some, I just get the name wrong all the time. |
| 10:24 | justin_smith | arrdem: also no need for the map |
| 10:25 | arrdem | ,(source some) |
| 10:25 | clojurebot | Source not found\n |
| 10:25 | justin_smith | $source some |
| 10:25 | lazybot | some is http://is.gd/IAmtiP |
| 10:25 | arrdem | eh gets you the same linear scan, but some will yield on the first positive result |
| 10:25 | justin_smith | right |
| 10:26 | arrdem | Which is T(N)=N/2 on average |
| 10:26 | ddellacosta | ,(some #{[1 2 3]} '([1 2 3] [4 5 6])) |
| 10:26 | clojurebot | [1 2 3] |
| 10:27 | ddellacosta | also can skip the predicate & |
| 10:27 | ddellacosta | erp |
| 10:27 | ddellacosta | ^ |
| 10:27 | justin_smith | ddellacosta: well, a set is a predicate :P |
| 10:27 | ddellacosta | soo, in the end some would be the more efficient choice regardless, huh? |
| 10:27 | justin_smith | I like them for multiple cases, but for only one match a set seems a little silly |
| 10:28 | ddellacosta | justin_smith: fair enough, you can use a set vs. fn |
| 10:28 | ddellacosta | justin_smith: yeah, suppose that's reasonable |
| 10:28 | justin_smith | ddellacosta: some would be more efficient than? |
| 10:28 | toast | ,(some irc://irc.freenode.net:6667/#%7B%5B1 2 3]} '((1 2 3) [4 5 6])) |
| 10:28 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]> |
| 10:28 | ddellacosta | justin_smith: oh, that was directed at arrdem, asking about efficiency of the some solution you wrote vs. his any solution |
| 10:29 | szymanowski | Hi, i've spotted a thing in prismatic's schema that I don't understand, (s/check [s/Int] nil) => nil ; is it feature? |
| 10:29 | justin_smith | ,any ddellacosta |
| 10:29 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: any in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 10:29 | arrdem | ddellacosta: hum? |
| 10:29 | toast | ,(some irc://irc.freenode.net:6667/#%7B%5B1 2 3]} '((1 2 3) [4 5 6])) |
| 10:29 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]> |
| 10:29 | ddellacosta | woah, what's going on here |
| 10:29 | justin_smith | toast, what are you trying to do? |
| 10:29 | ddellacosta | crazytown |
| 10:29 | arrdem | toast is failing at URLs |
| 10:29 | justin_smith | looks like a hotkey for [ |
| 10:30 | justin_smith | or something |
| 10:30 | ddellacosta | toast, are you a mess bot? |
| 10:30 | toast | I was trying to change the vector to a list |
| 10:30 | ddellacosta | oh |
| 10:30 | justin_smith | toast - there is pretty much never a reason to turn a vector into a list in clojure |
| 10:30 | justin_smith | at least not explicitly |
| 10:30 | ddellacosta | if you really want to, I suppose you could |
| 10:30 | ddellacosta | ,(into '() [1 2 3]) |
| 10:30 | clojurebot | (3 2 1) |
| 10:31 | Glenjamin | heh |
| 10:31 | toast | ,(some #{[1]} '((1))) |
| 10:31 | clojurebot | [1] |
| 10:31 | Glenjamin | into uses conj |
| 10:31 | toast | no |
| 10:31 | toast | not programatically |
| 10:31 | ddellacosta | not...programatically? |
| 10:32 | toast | I was changing the vector in ddellacosta's example to a list |
| 10:32 | philandstuff | ,(seq [1 2 3]) turns it into a seq, which is close enough |
| 10:32 | clojurebot | (1 2 3) |
| 10:32 | ddellacosta | toast: ah, I see, you wanted to see if it would match on that? |
| 10:32 | ddellacosta | ,(some #{[1 2 3]} '((1 2 3) [4 5 6])) |
| 10:32 | clojurebot | [1 2 3] |
| 10:33 | toast | yeah |
| 10:33 | ddellacosta | gotcha |
| 10:33 | toast | is there a pred that would return false? |
| 10:33 | toast | (or nil) |
| 10:34 | toast | not that I need to do this, just idle curiosity |
| 10:34 | toast | ; |
| 10:34 | justin_smith | ,(#(apply = (map class %&)) [1 2 3] '(1 2 3)) |
| 10:34 | clojurebot | false |
| 10:34 | justin_smith | checking for equal type and equal contents together is left as an exercise for the reader |
| 10:35 | ddellacosta | this channel is getting out of hand |
| 10:35 | llasram | ddellacosta: How so? |
| 10:35 | CookedGryphon | hi, if I'm using a deftype generated class from Java, and my code has been aot compiled, do I still need to invoke require of the appropriate namespace in java? |
| 10:35 | TimMc | justin_smith: identical? :-P |
| 10:36 | justin_smith | TimMc: much better, thanks |
| 10:36 | llasram | ddellacosta: JOKES????! |
| 10:36 | llasram | ~guards |
| 10:36 | clojurebot | SEIZE HIM! |
| 10:36 | justin_smith | ,(identical? '(1 2 3) '(1 2 3)) TimMc; probably not what we want here |
| 10:36 | clojurebot | false |
| 10:37 | TimMc | justin_smith: It will work sometimes, though! |
| 10:37 | TimMc | ,(identical? '() '()) |
| 10:37 | clojurebot | true |
| 10:37 | justin_smith | ~sometimes |
| 10:37 | clojurebot | Huh? |
| 10:38 | arrdem | friggin really... can you not make a vector with an explicit length? |
| 10:39 | TimMc | What, like one filled with nils? |
| 10:39 | arrdem | looks like even going array to vector incurs O(N) conj's. |
| 10:39 | ddellacosta | hmm |
| 10:39 | TimMc | &(count (vec (object-array 5))) |
| 10:39 | lazybot | ⇒ 5 |
| 10:39 | TimMc | &(class (vec (object-array 5))) |
| 10:39 | lazybot | ⇒ clojure.lang.PersistentVector |
| 10:39 | justin_smith | TimMc: but is that calling conj 5 times? |
| 10:40 | TimMc | arrdem: I thought that would just adopt the array. |
| 10:40 | arrdem | TimMc: I'll check core.clj but PersistentVector.java doesn't seem to allow that |
| 10:40 | TimMc | &(let [a (object-array 5), v (vec a)] (aset a 0 :hi) v) |
| 10:40 | lazybot | ⇒ [:hi nil nil nil nil] |
| 10:41 | TimMc | ^ I think that demonstrates a lack of conj'ing. |
| 10:41 | justin_smith | oh, fascinating |
| 10:41 | TimMc | Mileage may vary if array is larger than 32, or if you try to conj to this one. |
| 10:41 | arrdem | ,(let [a (object-array 64), v (vec a)] (aset a 0 :hi) v) |
| 10:41 | clojurebot | [nil nil nil nil nil ...] |
| 10:41 | TimMc | I was expecting a LazilyPersistentVector. |
| 10:42 | arrdem | ,(drop 30 (let [a (object-array 64), v (vec a)] (aset a 0 :hi) v)) |
| 10:42 | clojurebot | (nil nil nil nil nil ...) |
| 10:42 | arrdem | funky |
| 10:42 | TimMc | &(let [a (object-array 5), v (conj (vec a) :end)] (aset a 0 :hi) v) |
| 10:42 | lazybot | ⇒ [nil nil nil nil nil :end] |
| 10:42 | clgv | ,(binding [*print-length* 64] (let [a (object-array 64), v (vec a)] (aset a 0 :hi) (prn v))) |
| 10:42 | clojurebot | [nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil]\n |
| 10:42 | TimMc | ^ So conj'ing creates a new array. You take the hit at first modification. |
| 10:43 | arrdem | hum... |
| 10:43 | clgv | the small array optimization is weird |
| 10:43 | clgv | wouldnt be too expensive to just use System/arraycopy there |
| 10:43 | TimMc | Right? It's a *small* array, why wouldn't you just copy it? |
| 10:43 | clgv | TimMc: exactly! jira ticket! |
| 10:43 | TimMc | Not a chance. |
| 10:44 | clgv | or maybe there is already one since the observation is not new ;) |
| 10:44 | clgv | TimMc: why not? windmills? |
| 10:44 | TimMc | There's probably something about frequent use of vectors to wrap tiny arrays produced during compilation. |
| 10:44 | TimMc | Windmills. |
| 10:45 | clgv | :( |
| 10:46 | clgv | that's a real weird special case that has almost php quality ;) |
| 10:47 | Glenjamin | windmills? |
| 10:47 | TimMc | Tilting at. |
| 10:47 | clgv | :D |
| 10:48 | Glenjamin | ah |
| 10:48 | Glenjamin | thats two new phrases i've learnt in two days here |
| 10:48 | Glenjamin | although i forgot what yesterday's was |
| 10:48 | clgv | yeah that was a little indirect, I am glad TimMc knew what I meant ;) |
| 11:11 | hellofunk | Yes |
| 11:12 | justin_smith | ~coin |
| 11:12 | clojurebot | Pardon? |
| 11:13 | hyPiRion | there is no coin, only (rand 2) |
| 11:13 | arrdem | 2d6 |
| 11:13 | clojurebot | 9 |
| 11:13 | arrdem | hyPiRion is a pack of lies |
| 11:13 | hyPiRion | ~flip |
| 11:13 | clojurebot | It's greek to me. |
| 11:13 | justin_smith | hyPiRion: lazybot has a coin command |
| 11:13 | hellofunk | "There is no ass." -- Woody Allen |
| 11:13 | justin_smith | hyPiRion: I had the wrong bot |
| 11:13 | hyPiRion | $coin |
| 11:13 | lazybot | hyPiRion: Heads. |
| 11:14 | fenrock_away | $die |
| 11:14 | justin_smith | $coin |
| 11:14 | lazybot | justin_smith: Tails. |
| 11:14 | fenrock_away | $dice |
| 11:14 | fenrock_away | what, no dice? |
| 11:14 | hyPiRion | die is probably not something lazybot would do on command |
| 11:14 | justin_smith | $3d6 (rolling up a paladin) |
| 11:14 | hyPiRion | not intentionally at least |
| 11:15 | arrdem | 2d20 |
| 11:15 | clojurebot | 22 |
| 11:15 | fenrock | haha |
| 11:15 | fenrock | 1d6 |
| 11:15 | clojurebot | 5 |
| 11:15 | arrdem | 21+3d6 |
| 11:15 | justin_smith | 1d1 |
| 11:15 | clojurebot | 1 |
| 11:16 | arrdem | 3d6+21 |
| 11:16 | clojurebot | 27 |
| 11:16 | clgv | :P |
| 11:16 | arrdem | wow fail roll |
| 11:16 | arrdem | 3d6+21 |
| 11:16 | clojurebot | 31 |
| 11:16 | arrdem | there we go |
| 11:16 | fenrock | 1d100 |
| 11:16 | clojurebot | 70 |
| 11:16 | fenrock | i parry the blow |
| 11:16 | clgv | 1dLong/MAX_VALUE |
| 11:16 | clgv | :/ |
| 11:16 | clgv | ;) |
| 11:17 | TimMc | 1d८ |
| 11:17 | TimMc | :-( |
| 11:17 | hyPiRion | 100d100 |
| 11:17 | clojurebot | 4827 |
| 11:17 | arrdem | (inc justin_smith) |
| 11:17 | lazybot | ⇒ 47 |
| 11:17 | hyPiRion | 2147483647d2147483647 |
| 11:17 | hyPiRion | =( |
| 11:17 | arrdem | hyPiRion: wat |
| 11:17 | clgv | 2147483647d2147483647d2147483647d2147483647 |
| 11:18 | clgv | oops :P |
| 11:18 | llasram | 1d-6 |
| 11:18 | fenrock | 1d2147483647 |
| 11:18 | clgv | 1d9223372036854775807 |
| 11:18 | hyPiRion | arrdem: isn't it obvious what I'm trying to do? roll 2**31-1 2**31-1 sided dies? |
| 11:18 | hyPiRion | dice* |
| 11:19 | fenrock | ok clojurebot, what's the largest dice you have in your bag? |
| 11:19 | arrdem | hyPiRion: wat |
| 11:19 | arrdem | fenrock: dice is plural... |
| 11:19 | hyPiRion | 2d2 |
| 11:19 | hyPiRion | oh, it's probably doing my calculation. Hurray! |
| 11:19 | fenrock | i know, someone thought it was rude to say die to the bot |
| 11:19 | llasram | Or hiredman tired of our games |
| 11:20 | cbp | ,(+ 1 1) |
| 11:20 | cbp | o gods |
| 11:20 | fenrock | oh dear, bot is busy |
| 11:20 | justin_smith | I think that dice roll is going to take a long time to calculate |
| 11:20 | clgv | hyPiRion: :P well seems that not all plugins have timeouts ;) |
| 11:20 | arrdem | hyPiRion: what have you done |
| 11:21 | cbp | i hope it doesn't have clgv's queued up |
| 11:21 | clgv | let us hope that clojurebot is on a vserver and not something aws like ;) |
| 11:21 | hyPiRion | cbp: it contains 3 d's, not sure if that would be parsed correctly |
| 11:21 | clgv | cbp: unlikely since the first one is illformated |
| 11:21 | cbp | oh |
| 11:21 | justin_smith | lets cross our fingers that it uses a promoting integral type, so we get a crazy big number, and not a random overflow result |
| 11:21 | clgv | probably also a lot of boxing unboxing happening there ;) |
| 11:22 | justin_smith | yeah |
| 11:22 | arrdem | BigInts get so big for rollin that die up |
| 11:22 | hyPiRion | justin_smith: would've crashed by now if that were the case, I think. |
| 11:22 | sdegutis | We're one step closer to 0-downtime deploys :D |
| 11:22 | clgv | hyPiRion: damn what did I paste there? :P |
| 11:22 | sdegutis | Currently we can do so as long as there are no database changes. |
| 11:23 | sdegutis | But I wonder if Datomic makes that even easier if there are database changes... |
| 11:23 | hyPiRion | clgv: I think you did "2147483647d2147483647" d "2147483647d2147483647", i.e. copypaste my query and forgot to remove the d's |
| 11:24 | fenrock | ,(println "i'm alive!") |
| 11:25 | fenrock | do println's normally work, or only returns with meaningful value? |
| 11:25 | fenrock | ,(str "hello") |
| 11:25 | clgv | use lazybot |
| 11:25 | TimMc | Bot's not talking. |
| 11:25 | gtrak | &wat |
| 11:25 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: wat in this context |
| 11:25 | clgv | fenrock: clojurebot is currently busy with important business ;) |
| 11:25 | clgv | &(println "use me!") |
| 11:25 | Glenjamin | oh neat, clojars got web 3.0-ed |
| 11:25 | lazybot | ⇒ use me! nil |
| 11:26 | fenrock | well calculating the hardest paladin hit in the world |
| 11:26 | clgv | Glenjamin: wow! |
| 11:26 | clgv | isnt that 2.0? :P |
| 11:26 | justin_smith | fenrock: ##(nth 100 (iterate str "hello")) |
| 11:26 | lazybot | java.lang.ClassCastException: clojure.lang.Cons cannot be cast to java.lang.Number |
| 11:26 | justin_smith | err |
| 11:26 | justin_smith | fenrock: ##(nth (iterate str "hello") 100) |
| 11:26 | lazybot | ⇒ "hello" |
| 11:26 | TimMc | justin_smith: I always get nth's arg order wrong. |
| 11:27 | cbp | clojars got bootstrap'ed |
| 11:27 | Glenjamin | web 2.0 would be social features |
| 11:27 | fenrock | so & is working, but not , ? |
| 11:27 | justin_smith | TimMc: it's that whole "collection comes last, except for when we don't feel like it" thing |
| 11:27 | Glenjamin | large masthead and 3-wide boxes for feature lists is 3.0 |
| 11:28 | justin_smith | fenrock: the bot that does , is busy rolling obscene numbers of dice |
| 11:28 | fenrock | ah, multibots |
| 11:28 | gtrak | &(Thread/sleep 100000) |
| 11:28 | justin_smith | it must be intentional that clojurebot does not use threads to execute requests |
| 11:29 | justin_smith | gtrak: lol |
| 11:29 | lazybot | Execution Timed Out! |
| 11:29 | clgv | the "clojars" text color is not optimal yet ;) |
| 11:29 | justin_smith | bots do need naps after all |
| 11:29 | fenrock | &(str "i'm not that stupid") |
| 11:29 | lazybot | ⇒ "i'm not that stupid" |
| 11:29 | Glenjamin | xeqi: i think the background colour on the bits to copy-paste on package pages is a tad low contrast |
| 11:29 | Glenjamin | looks ace in general though :) |
| 11:29 | clgv | justin_smith: for eval he has a timeout.. |
| 11:29 | justin_smith | fenrock: ##"he's also not this stupid" |
| 11:29 | fenrock | haha |
| 11:30 | justin_smith | fenrock: str on a java.lang.String is kind of silly |
| 11:30 | gtrak | &@(future "TESTING") |
| 11:30 | lazybot | java.lang.SecurityException: You tripped the alarm! future-call is bad! |
| 11:30 | gtrak | awww |
| 11:30 | fenrock | but ##"didn't work" |
| 11:30 | justin_smith | right, that's a lazybot thing, not a clojure thing |
| 11:30 | justin_smith | &"OK" |
| 11:30 | lazybot | ⇒ "OK" |
| 11:30 | gtrak | &(send (agent) (println "How about agents")) |
| 11:30 | lazybot | java.lang.SecurityException: You tripped the alarm! send is bad! |
| 11:31 | gtrak | bad syntax anyway, it's for the best. |
| 11:31 | fenrock | &true |
| 11:31 | lazybot | ⇒ true |
| 11:31 | clgv | should work: ##(inc 42) |
| 11:31 | lazybot | ⇒ 43 |
| 11:32 | justin_smith | I think ## must require a ( |
| 11:32 | fenrock | #true |
| 11:32 | TimMc | clojurebot should be restarting shortly. 15 minute restart cycle, right? |
| 11:33 | fenrock | ##true |
| 11:33 | clgv | TimMc: ah lol, I thought that were timed sessions... |
| 11:33 | justin_smith | where there is alway ##(identity identity) |
| 11:33 | lazybot | ⇒ #<core$identity clojure.core$identity@1c34652> |
| 11:33 | TimMc | Nah, nuke and reload. |
| 11:33 | sdegutis | ,((identity identity)) |
| 11:33 | clgv | pretty crafty ;) |
| 11:33 | TimMc | Or rather, the eval service is restarted. |
| 11:33 | justin_smith | sdegutis: too few args |
| 11:34 | sdegutis | justin_smith: why did not the bot tell me? |
| 11:34 | clgv | TimMc: well currently it is not evaluating ;) |
| 11:34 | justin_smith | sdegutis: it is busy rolling an assload of dice |
| 11:34 | justin_smith | and maybe restarting |
| 11:34 | sdegutis | really?? |
| 11:34 | lazybot | sdegutis: Uh, no. Why would you even ask? |
| 11:34 | nbeloglazov | Is there any reason why 'vec' uses 2 different styles for calling static method: https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L354 ? Or is it simply inconsistency? |
| 11:34 | gfredericks | technomancy: here's a middle ground for the having-things-refered-in-every-namespace issue |
| 11:35 | gfredericks | technomancy: have a hook in the nrepl client or nrepl middleware that preps a namespace only when you switch your repl to it |
| 11:35 | sdegutis | Finally negated our dependency on lein-ring! |
| 11:35 | sdegutis | (Successfully, too.) |
| 11:35 | TimMc | sdegutis: Scroll up, clojurebot is busy rolling some 2147483647-sided dice. |
| 11:35 | gfredericks | that way you at least aren't mucking in arbitrary lib namespaces you don't care about |
| 11:35 | tbaldridge | nbeloglazov: the LazyPersistentVector works better on things that are already collections (non seqs). So it just wraps the existing structure |
| 11:36 | sdegutis | TimMc: lazybot also answers ,() forms, no? |
| 11:36 | hyPiRion | sdegutis: that's clojurebot |
| 11:36 | TimMc | Only in private chat. |
| 11:36 | sdegutis | ##((identity identity) identity) |
| 11:36 | lazybot | ⇒ #<core$identity clojure.core$identity@1c34652> |
| 11:36 | clgv | sdegutis: no |
| 11:36 | clgv | &(inc 42) |
| 11:36 | lazybot | ⇒ 43 |
| 11:36 | hyPiRion | lazybot: ,() |
| 11:36 | sdegutis | ##(take 3 (iterate identity)) |
| 11:36 | lazybot | clojure.lang.ArityException: Wrong number of args (1) passed to: core$iterate |
| 11:36 | fenrock | 1d6 |
| 11:36 | justin_smith | (nth (iterate identity identity) 100000) |
| 11:36 | justin_smith | &(nth (iterate identity identity) 100000) |
| 11:36 | lazybot | ⇒ #<core$identity clojure.core$identity@1c34652> |
| 11:37 | nbeloglazov | tbaldridge: the question why use (. MyClass (method)) and (MyClass/method) in the same method? Why not to use same notation for both cases. |
| 11:37 | sdegutis | ##(take 3 (iterate identity identity)) |
| 11:37 | lazybot | ⇒ (#<core$identity clojure.core$identity@1c34652> #<core$identity clojure.core$identity@1c34652> #<core$identity clojure.core$identity@1c34652>) |
| 11:37 | gfredericks | gtrak: what happens at the nrepl level when I switch my repl namespace? |
| 11:37 | tbaldridge | nbeloglazov: ah, no clue. One is probably older than the other |
| 11:38 | sdegutis | ##(->> (iterate identity identity) (take 404) (reduce #(%1 %2))) |
| 11:38 | lazybot | ⇒ #<core$identity clojure.core$identity@1c34652> |
| 11:38 | gtrak | gfredericks: hrm :-), probably just an eval, lemme check. |
| 11:38 | TimMc | sdegutis: http://clojure-log.n01se.net/date/2013-04-03.html#19:51b |
| 11:38 | sdegutis | TimMc: :D |
| 11:39 | gfredericks | gtrak: I'm thinking I want a prep-namespace hook of some sort |
| 11:39 | rkneufeld | tpope: In the last little while it seems like cpr has evolved to Require|RunTests. In my case, I feel like it is just running the tests, not requiring the file. Can I ask you what the expected behavior is? |
| 11:42 | clgv | ,:back? |
| 11:43 | fenrock | clearly didn't like all those die commands |
| 11:43 | justin_smith | TimMc: ##(identity (identity ((identity nth) (iterate identity identity) (identity 1000000)))) in that same spirit |
| 11:43 | lazybot | ⇒ #<core$identity clojure.core$identity@1c34652> |
| 11:47 | gtrak | gfredericks: its' just evaling in-ns |
| 11:47 | gfredericks | gtrak: hmmmmmmmm |
| 11:47 | gfredericks | gtrak: does a middleware seems like the right place to solve this problem? |
| 11:48 | clgv | TimMc: how about NPjure? probably you wont be able to program anything in deterministic polynomial time ;) |
| 11:48 | clgv | +with it |
| 11:48 | gtrak | gfredericks: not sure, I'm guessing you might want to require the ns before switching to it? seems like that might be better with an elisp defcustom. |
| 11:50 | gfredericks | gtrak: I'm talking about referring things after switching to the namespace; |
| 11:50 | gfredericks | the tricky part being detecting that you've just switched namespaces |
| 11:50 | TimMc | clgv: Hmm? |
| 11:50 | TimMc | What would NPjure be? |
| 11:51 | gtrak | oh, hmm. |
| 11:51 | clgv | TimMc: that the problem you cant decide efficiently which programs are written with it ;) |
| 11:52 | TimMc | Sorry, still not getting it. |
| 11:52 | clgv | TimMc: NP referring to http://en.wikipedia.org/wiki/NP-complete |
| 11:53 | gtrak | gfredericks: yea, I'm not sure how that would work, since eval itself is a middleware. |
| 11:53 | gfredericks | gtrak: one approach to this is to just shove vars into clojure.core; there's a lib that does that somewhere; seems terrible |
| 11:54 | gtrak | is it that bad to throw it in user? |
| 11:54 | gfredericks | huh? |
| 11:54 | gfredericks | are you assuming we only use the user namespace at the repl? |
| 11:54 | gtrak | instead of having extra symbols, just qualify them with user/ |
| 11:54 | gfredericks | oooh |
| 11:54 | gfredericks | it's...no fun? |
| 11:55 | gtrak | hahaha |
| 11:55 | gfredericks | a single character namespace might be tolerable |
| 11:55 | gfredericks | u/pprint |
| 11:55 | gfredericks | ,(ns u) (def x 42) |
| 11:55 | gtrak | yea, I do that all the time, but u's an alias for a project ns. |
| 11:56 | justin_smith | (ns ∀ ...) |
| 11:56 | gtrak | we ended up with a util.util namespace after a while, uu :-). |
| 11:56 | gfredericks | I'm wondering what happens when a namespace uses :as u |
| 11:56 | gfredericks | yeah the alias overrides the actual namespace name |
| 11:56 | gfredericks | which is good |
| 11:56 | TimMc | clgv: Right, but I'm not getting what you're proposing. A language that does what? Has what characteristics? |
| 11:57 | gtrak | you can also have aliases with dots in them. |
| 11:57 | gtrak | so go figure. |
| 11:57 | gfredericks | &'//3 |
| 11:57 | lazybot | java.lang.RuntimeException: Invalid token: //3 |
| 11:57 | gfredericks | &'//x |
| 11:57 | lazybot | java.lang.RuntimeException: Invalid token: //x |
| 11:57 | gfredericks | I was hoping it would interpret / as the namespace portion :) |
| 11:58 | clgv | TimMc: no it was no real proposal. since with palindromjure the valid expressions of the language got more complicated - I thought why not make it inefficient to findout whether the expression belongs to the language ;) |
| 11:58 | clgv | *probably inefficient |
| 11:58 | TimMc | Ah, hmm. |
| 11:58 | TimMc | You mean like C++? |
| 11:59 | clgv | :P |
| 12:00 | TimMc | My understanding is you need a Turing machine to parse C++. |
| 12:00 | gfredericks | (ns =) ; goes well with dvorak |
| 12:00 | arrdem | TimMc: correct, C++ is a context sensitive grammar |
| 12:01 | TimMc | arrdem: I thought CSG wasn't sufficient either. |
| 12:01 | TimMc | I don't know C++ though, so I'm happy to take your word for it. |
| 12:02 | arrdem | TimMc: CSG is the weakest grammar that requires a TM for its implementation.. |
| 12:02 | arrdem | beyond that you have undecidable grammars and infinite grammars |
| 12:02 | arrdem | c++ may in fact be undecidable, but I hope not |
| 12:02 | TimMc | Oh! We never got into CSGs in my theory of compuation course, so I assumed there was a weaker machine you could use for them. |
| 12:03 | justin_smith | Schroedinger's grammer - the compiler both compiled and failed to compile your code, until you run the program and find out |
| 12:03 | justin_smith | (aka perl for example) |
| 12:03 | arrdem | hehe |
| 12:04 | hyPiRion | TimMc: you can use weaker machines for some specific CSGs, but that's sort of cheating |
| 12:05 | clgv | huh, outofmemoryexception immanent on 16GB RAM :( I need a better data format than clojure maps for that data... |
| 12:05 | dbasch | out-of-context grammars: where the compiler errors out with “sorry, that was too funny” and posts it to http://www.reddit.com/r/nocontext |
| 12:05 | justin_smith | hah |
| 12:07 | philandstuff | CSGs require linear bounded automata |
| 12:07 | justin_smith | clgv: maybe is vanilla java.util.HashMap, but have a strict handoff semantics (where the map is never modified by a previous owner after being passed to the next function)? but of course you cannot enforce that, it takes discipline to do it properly |
| 12:07 | philandstuff | http://en.wikipedia.org/wiki/Linear_bounded_automaton |
| 12:08 | clgv | justin_smith: yeah or maybe I should start to use a database for that stuff since that looks suitable and I could probably split certain tasks into multiple queries |
| 12:09 | justin_smith | clgv: another option: a core.async go block reading [k v] pairs from a channel |
| 12:09 | justin_smith | then it is clear that only that block owns the map, and via lexical closure it can't be accidentally tampered with |
| 12:10 | justin_smith | where map here is a java.util.HashMap |
| 12:10 | clgv | justin_smith: that would only help if it served as a pipe between two files but not for the current situation where all the data needs to be in memory |
| 12:10 | justin_smith | clgv: well it could also have a copy on output channel to provide the map to others |
| 12:11 | clgv | I dont think core.sasync would serve me well here |
| 12:11 | justin_smith | or is it that all the data is really too big for one map (and not the gc pressure of clojure map impl being a concern) |
| 12:11 | justin_smith | clgv: just a way to close over the mutable object without increasing size |
| 12:12 | justin_smith | but if it is really just too much info for a map, even a non-persistent one, yeah use a db, of course (which is effectively a mutable map with a high latency) |
| 12:14 | tbaldridge | clgv: the caching ability of Datomic might help there. You can walk entities like clojure hashmaps, Datomic will cache commonly accessed data |
| 12:15 | tbaldridge | clgv: that being said, I haven't the slightest clue about what you're trying to do, so ignore me if I'm saying stupid stuff. :-) |
| 12:16 | clgv | tbaldridge: analysis of data, mostly calculating metrics |
| 12:17 | tbaldridge | clgv: might be worth looking into then. Roomkey uses Datomic for both online and offline data analysis. |
| 12:20 | arrdem | tbaldridge: thoughts on trying to rewrite multi-arity functions to single-arity functions (where possible mod apply usage) and then tree shaking? I just had the thought that if single arity resolution is possible it may open up inlining opportunities. |
| 12:22 | Bronsa | arrdem: :inline works for multi arities too IIRC |
| 12:22 | tbaldridge | why is single-arity conversion a prerequisite for inlining? I think you should be able to just inline the single arity being used. |
| 12:22 | arrdem | Bronsa: really? /me checks definline |
| 12:23 | clgv | arrdem: don't use definline just use :inline metadata |
| 12:23 | arrdem | clgv: I know that, but definline has the restriction documentation |
| 12:24 | clgv | arrdem: for itself yes |
| 12:24 | clgv | arrdem: clojure.core has examples for multi-arity inlines |
| 12:25 | arrdem | clgv: looks like vardic is the only thing that inline doesn't support. |
| 12:25 | cbp | ,1 |
| 12:25 | clgv | arrdem: https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L1417 |
| 12:26 | cbp | dammit guys |
| 12:27 | TimMc | ^ When neither a facepalm or a headdesk will quite express your emotions. |
| 12:28 | clgv | :D |
| 12:29 | TimMc | palmdesk is of course something else entirely ("Dammit, hyPiRion!") |
| 12:29 | kzar | laptopwindow |
| 12:30 | technomancy | keyboarddefenestration |
| 12:30 | arrdem | http://arrdem.com/i/spock.gif |
| 12:30 | arrdem | frik |
| 12:30 | technomancy | http://p.hagelb.org/spock.gif |
| 12:30 | cbp | uh |
| 12:30 | technomancy | it's cool; I got it =) |
| 12:30 | cbp | step down son |
| 12:31 | arrdem | (inc technomancy) |
| 12:31 | lazybot | ⇒ 114 |
| 12:31 | Bronsa | ahaha |
| 12:31 | Bronsa | (inc technomancy) |
| 12:31 | lazybot | ⇒ 115 |
| 12:32 | hlship | So, I'm pretty committed to some solutions using core.async |
| 12:32 | hlship | and I'm getting a bit of pushback |
| 12:32 | hlship | the "well, name some high-profile apps that use it" |
| 12:32 | TimMc | ugh |
| 12:32 | hlship | (this is JVM, not JS use of core.async) |
| 12:33 | gtrak | lol. |
| 12:33 | gtrak | Google. |
| 12:33 | Glenjamin | what would you use if you didn't use core.async? |
| 12:33 | TimMc | Name some high-profile apps that use *Clojure*. |
| 12:33 | hlship | exactly, it's pretty silly |
| 12:33 | Kowboy | quick, name some high profile apps that use the JVM |
| 12:34 | technomancy | "It's got Tony Hoare's name on it; it's gotta be good." |
| 12:34 | cbp | I can't imagine doing gui without async honestly :-S |
| 12:34 | gfredericks | name some high profile apps |
| 12:34 | TimMc | gfredericks: Naming is hard! |
| 12:34 | hlship | without core.async I would need a significant redesign, and throw lots of cpu/threads/memory at same problem |
| 12:34 | arrdem | cpus are cheap... |
| 12:34 | TimMc | But, uh... icarus-firewall, there's a name you can use. |
| 12:34 | gtrak | forgiveness instead of permission? |
| 12:35 | gtrak | datomic must definitely uses it. |
| 12:36 | tbaldridge | most of datomic predates core.async |
| 12:36 | gfredericks | best single-character name for a repl util namespace? I'm thinking "u" or "=" |
| 12:36 | tbaldridge | I have absolutely no clue one way or the other, but I'm sure looking at the datomic deps would provide some answers |
| 12:37 | gfredericks | I'd like one of #{"$" "%" "&" "*"} also but I still have to use shift to type them |
| 12:37 | TimMc | gfredericks: . |
| 12:37 | Bronsa | gtrak: looking at the datomic pom I don't see a core.async dep |
| 12:37 | gfredericks | TimMc: holy crap I didn't know that worked |
| 12:37 | TimMc | Wait, does it? |
| 12:37 | gfredericks | in my repl |
| 12:37 | arrdem | ,(require '[clojure.string :as .]) |
| 12:37 | clojurebot | eval service is offline |
| 12:37 | TimMc | ahhhhhhh |
| 12:37 | hlship | I'm downloading Datomic right now to see what's in it |
| 12:37 | TimMc | I'm sorry I mentioned it. |
| 12:37 | gfredericks | ./ is pretty quick for me to type too |
| 12:38 | TimMc | That's horrifying. |
| 12:38 | Bronsa | TimMc: well . is a valid symbol so I don't see why that shouldn't work |
| 12:38 | arrdem | good grief ./ works.. |
| 12:39 | Bronsa | I mean you can even (def . 1) |
| 12:39 | hlship | yes, no sign that Datomic uses core.async |
| 12:39 | arrdem | Bronsa: you're still gonna get that cdot patch |
| 12:39 | TimMc | Bronsa: I would expect interop to claim it in a bunch of contexts. |
| 12:39 | Bronsa | TimMc: in call position, yes |
| 12:39 | Bronsa | arrdem: you'll have to try real hard to convince me on that. |
| 12:39 | tbaldridge | pedestal uses core.async. But I'm not sure if that's "high profile" enough |
| 12:40 | gfredericks | man I'm totally about to do ./ |
| 12:40 | arrdem | TimMc: should be ok so long as it's just in symbol/var strings.. |
| 12:40 | TimMc | what have I done |
| 12:40 | gfredericks | I've already got special neurons dedicated to this key combination thanks to bash |
| 12:41 | TimMc | (./join "a" "bc") -- it's just an accident of the compiler that that isn't turned into (. "a" /join "bc"), right? |
| 12:41 | clgv | 1d5 |
| 12:41 | clgv | ? ;) |
| 12:41 | arrdem | Bronsa: I'm open to better aliases for concat |
| 12:41 | clgv | oh ok accidental reply |
| 12:41 | clgv | ,(inc 42) |
| 12:41 | clojurebot | 43 |
| 12:41 | nullptr` | :as . all the things! |
| 12:41 | clgv | ^^ |
| 12:41 | Bronsa | arrdem: whatever I can reach from my keyboard without using AltGr is fine :P |
| 12:42 | technomancy | gfredericks: I like it |
| 12:42 | arrdem | Bronsa: dude you just need to use TeX as your input method :P |
| 12:42 | technomancy | it's twisted |
| 12:42 | Bronsa | TimMc: not really an accident, .foo works on the symbol name |
| 12:42 | Bronsa | arrdem: rrrright at that point I'd rather AltGr . than \cdot |
| 12:42 | gfredericks | technomancy: ./ you mean? |
| 12:42 | technomancy | yup |
| 12:43 | Bronsa | TimMc: ie. try (foo/.toString 1) |
| 12:43 | arrdem | Bronsa: hah fair |
| 12:43 | clgv | &(read-string "(./join a bc)") |
| 12:43 | lazybot | ⇒ (./join a bc) |
| 12:43 | clgv | &(macroexpand-1 (read-string "(./join a bc)")) |
| 12:43 | lazybot | ⇒ (./join a bc) |
| 12:44 | philandstuff | is there a way to access clojure's jira over https? |
| 12:44 | philandstuff | and I'm not being paranoid; one of my colleagues owns a wifi pineapple :P |
| 12:45 | arrdem | philandstuff: have you checked your ethernet for throwing star splitters? :P |
| 12:45 | TimMc | Bronsa: Hmm... yeah, true. The interop stuff only takes a swing at already-parsed syntax. |
| 12:46 | gfredericks | ,(require '.) |
| 12:46 | clojurebot | #<FileNotFoundException java.io.FileNotFoundException: Could not locate /__init.class or /.clj on classpath: > |
| 12:46 | Bronsa | TimMc: my point was that the "." interop thingy only works on the name part of a symbol |
| 12:46 | TimMc | philandstuff: Ever since a year ago, it's not paranoia, it's common sense. |
| 12:46 | gfredericks | lol apparently I will have to call this file "src/.clj" |
| 12:46 | philandstuff | TimMc: well quite |
| 12:47 | arrdem | gfredericks: please do |
| 12:47 | TimMc | I mean, we already knew, but now we *know*. |
| 12:47 | TimMc | gfredericks: oh jesus |
| 12:47 | clgv | gfredericks: not "..clj"? |
| 12:47 | gfredericks | apparently not |
| 12:47 | clgv | gfredericks: have fun AOTing that thing ;) |
| 12:48 | clgv | or does it convert to __DOT__ ? |
| 12:48 | gfredericks | ,(fn . []) |
| 12:48 | clojurebot | #<sandbox$eval123$_DOT___124 sandbox$eval123$_DOT___124@1c7b3c2> |
| 12:48 | gfredericks | in other cases |
| 12:48 | gfredericks | not namespace names though |
| 12:48 | gfredericks | I wonder how the core team would react to a jira ticket asking for better support for (ns .) |
| 12:48 | TimMc | &(ns-munge ".") |
| 12:48 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: ns-munge in this context |
| 12:49 | TimMc | &(namespace-munge ".") |
| 12:49 | lazybot | ⇒ "." |
| 12:50 | clgv | haha ^^ |
| 12:50 | Bronsa | oh boy ns-munge is really called namespace-munge? |
| 12:50 | Bronsa | that's so inconsistent |
| 12:51 | gfredericks | &(apropos "namespace") |
| 12:51 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: apropos in this context |
| 12:51 | arrdem | Bronsa: jira ticket! |
| 12:51 | gfredericks | &(clojure.repl/apropos "namespace") |
| 12:51 | lazybot | ⇒ (*print-suppress-namespaces* namespace namespace-munge file->namespaces namespaces-on-classpath namespaces-in-dir) |
| 12:51 | clgv | Bronsa: why? it does not operate on a give namespace |
| 12:51 | TimMc | &(apropos-better 'apropos) |
| 12:51 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: apropos-better in this context |
| 12:51 | clgv | it's only lengthy |
| 12:51 | clgv | ,(use 'clojure.repl) |
| 12:51 | clojurebot | nil |
| 12:51 | Bronsa | clgv: you have a point |
| 12:51 | clgv | ,(apropos "namespace") |
| 12:51 | clojurebot | (namespace namespace-munge) |
| 12:51 | gfredericks | now I need to decide where to setup this special namespace |
| 12:52 | gfredericks | e.g., src/.clj, or my leiningen :repl options, or... |
| 12:52 | clgv | I still wonder why it is not "..clj" |
| 12:53 | gfredericks | clgv: because it turns "." into "/" |
| 12:53 | gfredericks | &(namespace-munge "foo.bar") |
| 12:53 | lazybot | ⇒ "foo.bar" |
| 12:53 | gfredericks | sorta |
| 12:54 | clgv | ,(require .) |
| 12:54 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: . in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 12:54 | clgv | ,(require '.) |
| 12:54 | clojurebot | #<FileNotFoundException java.io.FileNotFoundException: Could not locate /__init.class or /.clj on classpath: > |
| 12:55 | clgv | &(clojure-version) |
| 12:55 | lazybot | ⇒ "1.4.0" |
| 12:55 | clgv | &(require '.) |
| 12:55 | lazybot | java.io.FileNotFoundException: Could not locate /__init.class or /.clj on classpath: |
| 12:55 | TimMc | gfredericks: So you have your heart set on (require '.) instead of (require '[my.utils :as .])? |
| 12:55 | clgv | at least ".clj" is a "hidden" file ;) |
| 12:55 | gfredericks | TimMc: yes, because I want it to work everywhere instead of having to prep every namespace I use yn my repl |
| 12:55 | gfredericks | that's the main problem I'm trying to solve |
| 12:56 | TimMc | I see, so you want a very short way to get it. |
| 12:56 | TimMc | and you don't want keyboard macros or whatever |
| 12:57 | gfredericks | hadn't considered keyboard macros |
| 12:57 | whodidthis | clgv: file name is whatever comes after . i guess |
| 12:58 | CookedGryphon | Hey, does anyone know if I can use classes made with deftype in java directly? |
| 12:58 | CookedGryphon | if so how? |
| 12:58 | gfredericks | CookedGryphon: AOT probably? you could also write interfaces in java and code to those, then have the deftype implement them |
| 12:58 | CookedGryphon | not what I'm trying for |
| 12:59 | CookedGryphon | I'm writing some stuff in java, and want to generate a tuple as defined by clj-tuple |
| 12:59 | llasram | CookedGryphon: By `directly` do you mean e.g. mentioning the `deftype` type by name in the Java source? |
| 12:59 | arrdem | gtrak: the deftype should become <ns path>.MyType from Java's point of view. |
| 12:59 | llasram | CookedGryphon: Oh, for that just use the Clojure API to get the tuple-creating var-function |
| 12:59 | hiredman | CookedGryphon: sure, just load the clj-tuple namespace and call the clj-tuple functions from java |
| 12:59 | llasram | And call it from Java just like you would like from Clojure |
| 12:59 | gtrak | arrdem: thanks :-) |
| 12:59 | arrdem | gtrak: herp derp |
| 13:00 | CookedGryphon | yep, I can do that, I was just wondering if I could actually use the underlying classes it generates directly |
| 13:00 | llasram | Best not to |
| 13:00 | danneu | I run an active forum where I render Markdown posts to HTML and cache them in resources/cache/posts/<post-id>.html. My forum now has 1,172,002 posts. What are the implications of having so many files in an Ubuntu folder? |
| 13:00 | CookedGryphon | for example the 2-arity implementation of (tuple 2 2) is just (Tuple2 2 2 nil) |
| 13:00 | CookedGryphon | sorry (Tuple2. 2 2 nil) |
| 13:00 | danneu | `ls` takes forever to run and I ctrl-C'd it after 40 seconds |
| 13:01 | llasram | Introducing a multi-way Java<->AOT-Clojure dependency would make your build sad and tricky |
| 13:01 | CookedGryphon | fair enough, that sounds like my answer |
| 13:01 | ToxicFrog | danneu: ...are you sure you have the right channel? |
| 13:01 | CookedGryphon | I'll just invoke the clj-tuple/tuple fn, thanks for the discussion |
| 13:03 | hiredman | CookedGryphon: if you are just looking for jvm tuples boundary has a neat jvm tuple library |
| 13:04 | danneu | ToxicFrog: i ask generic dev questions here cuz yall my people |
| 13:04 | fenrock | CookedGryphon: there's good examples of this on page 389 of Clojure Programming. |
| 13:04 | CookedGryphon | hiredman: thanks, but I'm passing into clojure code which makes use of tuple's fast destructuring etc |
| 13:08 | TimMc | danneu: Probably depends on your filesystem. |
| 13:09 | TimMc | Do a search for something like ext2 directory size |
| 13:09 | Bronsa | danneu: maybe you have something mounted via ssh-fs and it's no longer reachable? |
| 13:10 | Bronsa | danneu: oh sorry I didn't read the first part of your question :) |
| 13:12 | ToxicFrog | danneu: fair enough |
| 13:12 | ToxicFrog | danneu: anyways, as you've already noticed doing anything with that dir will be slow as hell. You won't be able to use * in it, since you'll exceed the command line length limit. |
| 13:12 | ToxicFrog | You may eventually start hitting filesystem limits, although that depends on the fs and what settings it was created with. |
| 13:14 | umpa | How do you loop recur with sequences as parameters ? https://www.refheap.com/86521 |
| 13:17 | danneu | ToxicFrog: it's an ext3 disk. folder has 1170377 files which is way above the ext3 limits i find from casual google queries |
| 13:18 | johnwalker | how do you use clojure.java.io/writer with a FileWriter? |
| 13:20 | ToxicFrog | danneu: ext3 doesn't have a maximum number of files per directory, AFAIK, although it does have a maximum per filesystem (based on how many inodes were allocated at fs creation time). |
| 13:20 | ToxicFrog | danneu: it does have a maximum number of subdirectories per directory, though. |
| 13:21 | stain | the shell will have limits though |
| 13:21 | ToxicFrog | Oh yeah |
| 13:21 | ToxicFrog | Hence my comment about not being able to use * in that directory |
| 13:21 | danneu | looks like i'm doing `if (io/resource (str "cache/posts/" (:post/uid post) ".html")) ...` to see if a post exists in that massive directory. i guess i can recreate a massive directoring in a VM to see how long that takes |
| 13:21 | stain | that's why it is good to use part of the filename/id as subdirectories.. for instance .git/objects/59/1d2525b691251bd9f52848a1e9e2325f013ae2 |
| 13:22 | danneu | i saw that HN recently moved from a similar system to a /12/12345.html, /12/12346.html |
| 13:23 | stain | I do a similar thing in a zipfile structure I build.. where every data item has a UUID, so I just use the first two characters as subfolder to make it managable |
| 13:23 | stain | I keep those characters still in the filename at the end though (unlike git) |
| 13:25 | umpa | stain: danneu: what exactly are you guys talking about? |
| 13:26 | stain | 18:00 < danneu> I run an active forum where I render Markdown posts to HTML and cache them in resources/cache/posts/<post-id>.html. My forum now has 1,172,002 posts. What are the implications of having so many files in an Ubuntu folder? |
| 13:27 | stain | danneu: is your io/resource call slow at the moment? |
| 13:27 | stain | as long as you are accessing one and one post it should be fine |
| 13:27 | stain | as you are hand-crafting the filename |
| 13:27 | stain | not sure why you are doing it through the classpath though |
| 13:27 | stain | you might have URLClassLoader a bit overworked |
| 13:28 | stain | why not just do it as files? I mean you have to write to those files anyway? |
| 13:28 | stain | (or is this bundled inside a WAR or something?) |
| 13:30 | danneu | stain: i didnt really have a rhyme or reason for going through io/resource. and it's not even deployed as a jar, just run with lein-ring. |
| 13:31 | danneu | i'm going to recreate my server locally in virtualbox to see if it's slow |
| 13:34 | arrdem | (inc amalloy) ;; eclipse suggestion from yesterday |
| 13:34 | lazybot | ⇒ 124 |
| 13:35 | danneu | stain: what do you mean 'just do it as files'? |
| 13:36 | gfredericks | (inc amalloy) ; hangin out here all the time |
| 13:36 | lazybot | ⇒ 125 |
| 13:38 | justin_smith | (inc amalloy) ; all the cool kids are doing it |
| 13:38 | lazybot | ⇒ 126 |
| 13:53 | TimMc | &(let [Long String] (instance? Long "abc")) |
| 13:53 | lazybot | ⇒ false |
| 13:54 | TimMc | ,(let [Long String] (instance? Long "abc")) |
| 13:54 | clojurebot | true |
| 13:54 | TimMc | niiice, glad that got fixed |
| 13:54 | TimMc | (CLJ-1171) |
| 14:04 | Glenjamin | ,*clojure-version* |
| 14:04 | clojurebot | {:major 1, :minor 6, :incremental 0, :qualifier nil} |
| 14:04 | Glenjamin | &*clojure-version* |
| 14:04 | lazybot | ⇒ {:major 1, :minor 4, :incremental 0, :qualifier nil} |
| 14:05 | Glenjamin | does that mean the LHS of instance? cannot be a variable? |
| 14:08 | amalloy | Glenjamin: uhhhhh, he just demonstrated that it can |
| 14:08 | Glenjamin | oh, duh |
| 14:08 | Glenjamin | i saw "abc" |
| 14:08 | Glenjamin | and read that as "should be a Long" |
| 14:09 | Glenjamin | then got confused when i checked the versions |
| 14:09 | amalloy | three letters is pretty long |
| 14:09 | Jaood | (dec amalloy) |
| 14:09 | lazybot | ⇒ 125 |
| 14:09 | Jaood | for recommending eclipse to amalloy |
| 14:09 | amalloy | amalloy: never use eclipse |
| 14:09 | Jaood | to arrdem :P |
| 14:10 | Jaood | (inc amalloy) |
| 14:10 | lazybot | ⇒ 126 |
| 14:10 | TimMc | Glenjamin: If you have a lexical shadowing a class, instance?'s inlining would treat it as a literal class name. |
| 14:10 | Jaood | for recommending eclipse to amalloy |
| 14:10 | dbasch | there are always cases for using eclipse |
| 14:10 | Glenjamin | TimMc: yeah, makes sense now - i just read the conditionals the wrong way around |
| 14:10 | amalloy | dbasch: it's okay. i know to ignore advice from tricksters like amalloy |
| 14:10 | TimMc | dbasch: It's great for browsing random Java projects. |
| 14:10 | justin_smith | dbasch: "I sure do have a lot of free ram on this computer, whatever shall I do to use it up?" |
| 14:11 | arrdem | elipse solves my primary frustration with Compiler.java, being my inability to visualize the class higherarchy let alone navigate it unaided |
| 14:11 | dbasch | justin_smith: “I work at the Eclipse foundation and I don’t want to get fired for being a traitor to the cause” |
| 14:11 | amalloy | justin_smith: for when firefox isn't an option? |
| 14:11 | justin_smith | heh |
| 14:11 | arrdem | 16GB, 1.2 in use |
| 14:12 | Jaood | I though IDEA was the sane recommendation when users have a choice |
| 14:13 | amalloy | i'm sure intellij, idea, whatever it is, is fine |
| 14:13 | dbasch | Jaood: IDEA was the last IDE that I used, when I had to code in Scala |
| 14:13 | dbasch | I cannot imagine Scala without an IDE |
| 14:14 | agarman | IDEA isn't at all as impressive now as it was in 2008-2010 |
| 14:14 | dbasch | amalloy: it’s totally fine, although it feels like you’re staring at the cockpit of a 747 in terms of controls |
| 14:15 | amalloy | dbasch: tried eclipse? |
| 14:15 | dbasch | amalloy: yes but not in the past decade |
| 14:15 | agarman | if you're not using UML & refactoring (neither of which are useful in Scala or Clojure) IDEA isn't better than Eclipse |
| 14:15 | dbasch | agarman: refactoring is useful in Scala |
| 14:15 | amalloy | it's got a lot of buttons too, i guess is all i was going to say |
| 14:16 | amalloy | it's not as obviously-dominant now as it was when i first tried it in...2003? 2004? but it's still very good for java |
| 14:16 | agarman | dbasch: The Scala IDE for Eclipse is better than what IDEA has for Scala |
| 14:16 | dbasch | agarman: I’ll try it the next time I use Scala, which I hope is never |
| 14:17 | noncom|2 | i used to use scala and then switched to clojure |
| 14:17 | agarman | dbasch: I hope to never have to do extensive Scala again... 4 years in hell was long enough for me! |
| 14:17 | noncom|2 | i am happy now |
| 14:17 | dbasch | but everyone in my old team that did Java was very happy with Eclipse |
| 14:17 | noncom|2 | (almost) |
| 14:17 | amalloy | dbasch will next use scala in Option[Years] time |
| 14:17 | noncom|2 | scala eclipse ide is the official one, that's what it is good |
| 14:18 | dbasch | amalloy: where Years is Long or null |
| 14:18 | noncom|2 | Long.MAX_VALUE |
| 14:18 | amalloy | ah, good old null |
| 14:19 | noncom|2 | nil |
| 14:19 | arrdem | None |
| 14:19 | amalloy | a cornerstone of typesafe programming |
| 14:19 | dbasch | yeah, I almost typed nil |
| 14:19 | noncom|2 | ,((symbol (name :.noSuchMethod)) (Thread.)) |
| 14:19 | clojurebot | #<SecurityException java.lang.SecurityException: no threads please> |
| 14:20 | dbasch | arrdem: yeah, hopefully that Option will return None |
| 14:20 | noncom|2 | ,((symbol (name :.noSuchMethod)) (ArrayList.)) |
| 14:20 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: ArrayList, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:20 | noncom|2 | ,((symbol (name :.noSuchMethod)) (java.util.ArrayList.)) |
| 14:20 | clojurebot | nil |
| 14:20 | noncom|2 | see? ^^ |
| 14:20 | amalloy | dbasch: that was the joke i was hoping to offer, but i like your Long-or-null better |
| 14:20 | noncom|2 | why? |
| 14:20 | clojurebot | why is the ram gone |
| 14:21 | noncom|2 | why it happens so?\ |
| 14:21 | amalloy | noncom|2: http://stackoverflow.com/questions/12281631/what-do-clojure-symbols-do-when-used-as-functions |
| 14:21 | arrdem | because we use a language that doesn't believe in update in place, next! |
| 14:21 | dbasch | one day I made the mistake of trying to run an open-source project from Twitter written in Scala |
| 14:22 | amalloy | i'm having "fun" trying to use kafka |
| 14:22 | dbasch | oh, they retired it now https://github.com/twitter/snowflake/ |
| 14:22 | noncom|2 | amalloy: is there a way to dynamically generaet a java class interop method to call? |
| 14:22 | ystael | dbasch: which part was the mistake? "open-source", "twitter", "scala", or "run"? |
| 14:22 | dbasch | amalloy: Kafka is arguably the best OS project released by my former employer |
| 14:23 | dbasch | ystael: open-source and Twitter, probably |
| 14:23 | amalloy | dbasch: linkedin, presumably, not apache? |
| 14:23 | justin_smith | noncom|2: what do you need to generate? |
| 14:23 | dbasch | amalloy: yes, LinkedIn |
| 14:23 | dbasch | amalloy: Voldemort is pretty good too |
| 14:23 | noncom|2 | a java class has many methods, i want to create a method call from a :keyword that someone passes to my func |
| 14:23 | amalloy | noncom|2: in general if you're trying to do that you've already made a mistake |
| 14:24 | noncom|2 | what would you propose? |
| 14:24 | dbasch | noncom|2: what’s the broader picture? |
| 14:24 | amalloy | just calling methods on the object directly. what is the point of an intermediary who converts :size to .size? |
| 14:25 | amalloy | but, yes, reconsidering the broader picture will probably lead you to a better answer than my random instincts |
| 14:26 | noncom|2 | i want to encapsulate the work with the object because i do not want to make the user to import the class |
| 14:27 | noncom|2 | i want to create a wrapper for this class: http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/utils/MeshBuilder.html |
| 14:28 | dbasch | noncom|2: but if the user is sending you things like :capsule or :circle or :box you’re not really encapsulating anything |
| 14:28 | amalloy | (inc dbasch) |
| 14:28 | lazybot | ⇒ 6 |
| 14:28 | noncom|2 | well, maybe i will later have a map with {:circle 10 10 10 10 ...] |
| 14:28 | noncom|2 | sorry, i meant } |
| 14:29 | noncom|2 | maybe i want to build something upon it |
| 14:29 | noncom|2 | if the methods were clojrue functions that would be easy |
| 14:29 | noncom|2 | but them java methods are different |
| 14:29 | dbasch | noncom|2: I would start by thinking about the api I want to present to the user, and then think about a clean way to do that |
| 14:30 | dbasch | if you’re going to simply put sugar around the java api, might as well just let them use the java api |
| 14:30 | noncom|2 | ummm.. the user just writes or generates a set of declarative instructions, just as i have said above |
| 14:30 | noncom|2 | yeah, i agree with you |
| 14:31 | noncom|2 | but sometimes sugar means much too. and this is not only sugar, this will help to write cleaner drawing routines |
| 14:31 | dbasch | noncom|2: do you need to expose the entire api, or just a small subset? |
| 14:31 | noncom|2 | ideally all api. overtime this will be required anyway.. |
| 14:31 | noncom|2 | currently i am leaning towards a condp :) |
| 14:32 | dbasch | noncom|2: if you’re adding methods that do things that the api doesn’t, then I would write those in idiomatic clojure |
| 14:32 | dbasch | noncom|2: for the rest, I’d just give the user the option to go down to java, like the rest of clojure does |
| 14:33 | noncom|2 | ummm, you see, these sequences of calls like [:circle 20 20 20 20] will be generated from sort of data that resembles a bytecode or DNA |
| 14:33 | noncom|2 | so that :circle is a building block as well as 20 |
| 14:33 | noncom|2 | homoiconicity |
| 14:34 | noncom|2 | i just need an automata there |
| 14:34 | noncom|2 | which will pick the right method by the keyword |
| 14:34 | noncom|2 | so condp is the simplest |
| 14:35 | AeroNotix | A colleague wants to use an IDE for Clojure, I heard there was some good integration between some IDE and a plugin |
| 14:35 | AeroNotix | anyone know? |
| 14:35 | noncom|2 | eclipse + ccw |
| 14:35 | AeroNotix | ccw? |
| 14:35 | noncom|2 | or emacs |
| 14:35 | Jaood | AeroNotix: cursive |
| 14:35 | dbasch | noncom|2: why is it less work to generate those sequences than to generate the actual clojure code that calls the java api? |
| 14:35 | clojurebot | ccw is http://code.google.com/p/counterclockwise/ |
| 14:35 | AeroNotix | noncom|2: he's not an emacs user |
| 14:35 | cbp | ,1 |
| 14:35 | clojurebot | 1 |
| 14:36 | noncom|2 | dbasch: the sequences will be generated automatically, from sound or eeg |
| 14:36 | AeroNotix | thanks noncom|2 |
| 14:36 | noncom|2 | (this is a very simplifies explanation) |
| 14:36 | cbp | I tried ccw to teach a coworker a few months ago and it was very underwhelming |
| 14:36 | systemfault | Cursive or lighttable :P |
| 14:37 | systemfault | Anything touching eclipse sucks (my opinion) |
| 14:37 | amalloy | systemfault: that's a sucky opinion (objectively) |
| 14:37 | dbasch | noncom|2: I’m out of ideas :) |
| 14:38 | systemfault | amalloy: Could very well be. But the day I switched to IntelliJ, I had no more problem with bad third-party plugins. |
| 15:07 | dagda1 | I have this query which is running pig slow in production. Can anyone suggest any pointer as to how I might improve it? http://sqlfiddle.com/#!12/33cd7/20 |
| 15:10 | amalloy | you seem to have accidentally posted a sql optimization question to #clojure, dagda1 |
| 15:10 | dagda1 | haha |
| 15:10 | dagda1 | amalloy: please feel free to answer in clojure :) |
| 15:19 | danneu | Do jvm opts passed via command line override :jvm-opts in project.clj? |
| 15:19 | technomancy | danneu: how do you pass jvm opts via the command line? |
| 15:24 | danneu | technomancy: when you compile an uberjar, are :jvm-opts 'baked in' to the jar as default opts when you `java -jar app.jar`? |
| 15:24 | amalloy | danneu: no, you can't do that. you're the one typing java, so you get to pass the jvm opts |
| 15:25 | technomancy | yeah, what he said |
| 15:25 | danneu | oh, i see. so :jvm-opts is just used by `lein` commands |
| 15:37 | cbp | does anyone have a fn handy to walk the body of a macro, find an expression and do a kind of update-in? |
| 15:39 | sveri | Hi, I am reading in a file with "with-open" with this contents: key: value\n key2: value2... and want to convert it to a map {key value key2 value}. I made it so far that I can convert each line to one single map: http://pastebin.com/698gRiu5 But I have trouble reducing it into one single map, can someone help me please? |
| 15:41 | allenj12 | so does hiccup and enlive replace html completely/ or atleast mostly? |
| 15:44 | justin_smith | allenj12: well they produce and interpret html. Whether you still use html directly probably depends on the skillset of the people you collaborate with. |
| 15:45 | justin_smith | allenj12: for example I did not use either very much when working on web stuff, because I worked with frontend developers who did not know clojure at all |
| 15:45 | allenj12 | justin_smith: gotcha so if im doing this solo, would i need/be recommended to use any html? |
| 15:46 | justin_smith | allenj12: you would probably end up learning some html whether or not you meant to (much like I learned java despite myself by using clojure enough) |
| 15:47 | justin_smith | but I mean hiccup is html, it just has some tags embedded in it |
| 15:47 | justin_smith | and those tags produce more html... |
| 15:47 | allenj12 | justin_smith: yea i know that i was just wondering if there was any real point in making any html files directly |
| 15:47 | dbasch | sveri: you shouldn’t be using doseq. What does your file look like? |
| 15:48 | dbasch | sveri: is it “colon-separated values” ? |
| 15:50 | justin_smith | sveri: would lines have the same keys, or would a key be unique across all lines? |
| 15:50 | sveri | dbasch: yea, I just found out reduce is better and am fiddling with it :D |
| 15:50 | sveri | dbasch: justin_smith I am not sure how it will look exactly, so I am taking a split function here |
| 15:53 | Jarda | has anyone created a sqlkorma store for clauth? |
| 15:55 | justin_smith | ,(reduce (fn [mp line] (reduce (fn [m [k v]] (assoc m k v)) mp (partition 2 (clojure.string/split line #":")))) {} ["a:0:b:1" "c:2:d:3"]) ; sveri - maybe soemthing like this? |
| 15:55 | clojurebot | {"d" "3", "c" "2", "b" "1", "a" "0"} |
| 15:56 | justin_smith | sveri: but if multiple lines may have the same keys, you probably want to do an something liek update-in m [k] (fnil conj []) v or however that is done |
| 15:57 | dbasch | sveri: how about https://www.refheap.com/86526 |
| 15:57 | dbasch | (assumes no repeated keys) |
| 15:58 | justin_smith | ,(reduce (fn [mp line] (reduce (fn [m [k v]] (update-in m [k] (fnil conj []) v)) mp (partition 2 (clojure.string/split line #":")))) {} ["a:0:b:1:c:hello" "c:2:d:3"]) |
| 15:58 | clojurebot | {"d" ["3"], "c" ["hello" "2"], "b" ["1"], "a" ["0"]} |
| 15:58 | justin_smith | works with repeated keys |
| 15:59 | sveri | justin_smith: dbasch thats both awesome solutions :-) I wonder which day will be the day my head starts to think of them himself :D |
| 15:59 | justin_smith | sveri: work from the inside out, and always visualize the shape of the data - eventually it is like legos |
| 16:00 | dbasch | sveri: one step at a time :) first, remember that doseq returns nothing, so you don’t want to use it if you’re trying to transform one thing into another |
| 16:00 | justin_smith | sveri though I tend to go overly generic and just reach for my favorite building blocks - so my solution will work but not be the most concise / elegant / clear |
| 16:00 | dbasch | doseq is for side effects, e.g. printing stuff to stdout |
| 16:01 | sveri | yea |
| 16:01 | dbasch | you have a line-seq, and you want to convert it into another structure via application of functional transformations |
| 16:01 | sveri | I get that, understanding the difference between doseq and reduce is the easiest part :D |
| 16:01 | justin_smith | someone should really make a clojure flavored pharmaceutical commercial spoof (side effects may include the mutation of values in another thread or printing to stdout, ask your tech director if clojure is right for you) |
| 16:02 | dbasch | my thinking was: first, split every line into two pairs, then convert those pairs into a map where each pair is a mapping |
| 16:03 | dbasch | sorry, split every line into a pair |
| 16:03 | justin_smith | dbasch: oh, was it really one pair for a line? that would have been easier than my overgenerlization then |
| 16:03 | dbasch | (inc justin_smith ) |
| 16:03 | lazybot | ⇒ 2 |
| 16:04 | justin_smith | is inc sensitive to paren placement or something? |
| 16:04 | justin_smith | $karma justin_smith |
| 16:04 | lazybot | justin_smith has karma 47. |
| 16:04 | dbasch | (inc justin_smith) |
| 16:04 | lazybot | ⇒ 48 |
| 16:05 | dbasch | lazybot’s parsing clearly is |
| 16:05 | dbasch | (inc ) |
| 16:05 | dbasch | (inc ) |
| 16:05 | lazybot | ⇒ 1 |
| 16:05 | dbasch | haha |
| 16:05 | justin_smith | (inc significant white space ) |
| 16:05 | lazybot | ⇒ 1 |
| 16:05 | allenj12 | domina hasnt seem to be updated recently, why is that? |
| 16:06 | justin_smith | $karma significant white space |
| 16:06 | lazybot | significant has karma 0. |
| 16:06 | dbasch | $karma |
| 16:06 | dbasch | $karma |
| 16:06 | justin_smith | dbasch: your client is not sending trailing white space |
| 16:06 | dbasch | $karma ; |
| 16:06 | lazybot | ; has karma 0. |
| 16:06 | justin_smith | $karma |
| 16:07 | dbasch | $karma ; |
| 16:07 | lazybot | has karma 0. |
| 16:07 | dbasch | $karma ; |
| 16:07 | lazybot | has karma 0. |
| 16:07 | justin_smith | odd |
| 16:07 | dbasch | justin_smith: the convert-line-to-map-entry function implied that it was one pair per line |
| 16:08 | clojurebot | Gabh mo leithscéal? |
| 16:08 | justin_smith | dbasch: yeah, sometimes I code faster than I read |
| 16:09 | dbasch | clojurebot: one day you’ll |learn| that not everything can be solved with the Irish language. |
| 16:09 | clojurebot | Ok. |
| 16:18 | TimMc | justin_smith: I'll do the voice if someone else wants to provide a good mic. :-P |
| 16:20 | justin_smith | heh |
| 16:41 | sveri | Hm, I have generated a template with enlives deftemplate function, now I would like to store that in a html file on disk, but deftemplate returns a persistentvector, anyone knows if there is a method to convert it? Or do I have to do it by hand? |
| 16:43 | sveri | nevermind, doseq over the vetcor and writing the result just does the trick |
| 16:50 | stephenjudkins | what are good OSS clojure projects to read? |
| 16:52 | technomancy | maybe syme if you want a small web app |
| 16:53 | justin_smith | stephenjudkins: flatland/useful is pretty great |
| 16:54 | nDuff | stephenjudkins, ...if you're interested in clojurescript with core.async, I found the dots game implementation by Bruce Hauman to be a good one -- thorough walkthrough of the code and the process of refactoring it in his blog. |
| 16:56 | hiredman | https://github.com/liebke/analemma is nice, small, was created as an example of using clojure, does lots of datastructure fiddling, and you get to draw pictures |
| 16:56 | hiredman | (but it hasn't been touched in 3 years) |
| 16:57 | justin_smith | analemma is pretty cool, yeah |
| 16:57 | justin_smith | and very easy to use |
| 16:58 | justin_smith | (it even makes animated svg) |
| 16:58 | hiredman | oh, neat, I haven't seen the animated bits |
| 16:59 | justin_smith | http://liebke.github.io/analemma/ animations here |
| 17:00 | stephenjudkins | thanks for the links, all |
| 17:05 | cbp | / |
| 17:16 | gfredericks | huh. so having a "src/.clj" apparently isn't working |
| 17:17 | justin_smith | src/..clj maybe? |
| 17:18 | hiredman | the arc of history is long but it bends toward justice |
| 17:18 | gfredericks | I guess it's worth a try |
| 17:18 | justin_smith | even better would be if you namespace was my...something.other such that the containing directory would have to be parallel with its parent |
| 17:18 | gfredericks | nope ..clj doesn't work either |
| 17:19 | gfredericks | I'm just going to have to use user.clj |
| 17:27 | technomancy | gfredericks: can you use load instead of require? |
| 17:27 | technomancy | not that it's a thing I'd recommend |
| 17:34 | gfredericks | technomancy: yeah that totes works; not sure how to do that as a library though |
| 17:34 | gfredericks | oh wait |
| 17:34 | gfredericks | hm |
| 17:34 | gfredericks | I'm not sure I attempted load correctly |
| 17:35 | amalloy | gfredericks: what tomfoolery are you up to here? |
| 17:35 | gfredericks | amalloy: trying to gain myself repl utils that work from everywhere but without being too evil |
| 17:35 | gfredericks | referring things everywhere is hard, so I settled on (ns .) |
| 17:35 | gfredericks | then I can use ./foo from everewhere |
| 17:36 | technomancy | the tommest of foolery |
| 17:36 | hiredman | is refering things everywhere actually hard? |
| 17:37 | gfredericks | hiredman: I think so |
| 17:37 | hiredman | can't you just alter the refer function to refer your code when it refers clojure.core? |
| 17:37 | technomancy | monstrous |
| 17:37 | gfredericks | hiredman: yeah there are techniques like that that definitely work, but changing EVERY namespace (including all lib namespaces) rather than just the ones I actually end up using is a lot scarier |
| 17:38 | technomancy | gfredericks: have you tried adding a cider hook for the change-namespace command there? |
| 17:38 | hiredman | gfredericks: maybe it should be custom nrepl middleware |
| 17:38 | gfredericks | technomancy: nope |
| 17:38 | hiredman | technomancy will tell you all about nrepl discover |
| 17:39 | gfredericks | hiredman: I was imagining that, but gtrak told me namespace changes are done by simply evaling (in-ns ...) |
| 17:39 | gfredericks | so that'd be weird to intercept |
| 17:39 | gfredericks | technomancy has told me about nrepl-discover every time I've brought this up, except for today |
| 17:39 | amalloy | gfredericks: you're attempting black magic, right? does "weird" matter? |
| 17:39 | hiredman | gfredericks: oh, but with custom middleware you can intercept (foo) and load gfredericks.utils and run (gfredericks.utils/foo) instead |
| 17:39 | gtrak | nrepl-discover is not 'mature' enough to make it into cider yet, heh, heh. |
| 17:39 | gfredericks | ./ has the advantage of not being dependent on my tooling |
| 17:40 | hiredman | fah |
| 17:40 | gtrak | I'm pretty sure that just means 'not my code'. |
| 17:40 | hiredman | you are always dependent on tooling |
| 17:40 | gfredericks | hiredman: that only works if it's a top-level call |
| 17:40 | ludwig` | is it possible that component local state in om is entirely broken? |
| 17:40 | arrdem | gtrak: now there's damning with faint praise.. |
| 17:40 | gfredericks | hiredman: yeah but I can easily end up running code in various contexts |
| 17:42 | {blake} | I thought there were :when bindings for let. (Not when-let, I know that's a thing.) My REPLs are disagreeing. |
| 17:42 | amalloy | {blake}: no, there aren't |
| 17:42 | gfredericks | hiredman: e.g., somebody in a web browser via session, or in a deployment with a raw clojure.main |
| 17:42 | gfredericks | s/somebody// |
| 17:42 | {blake} | amalloy, Dammit. I should've known you'd take their side. |
| 17:42 | arrdem | {blake}: for has :when |
| 17:43 | amalloy | arrdem: another entry in "weird things programmers say" |
| 17:43 | {blake} | arrdem, That's probably where I'm getting the idea from, thanks. |
| 17:43 | amalloy | {blake}: egamble has a macro that includes :when and various other nonsense in a let-binding |
| 17:43 | arrdem | amalloy: heh |
| 17:43 | amalloy | $google egamle let-else |
| 17:43 | lazybot | [guitar chords, guitar tabs and lyrics - chordie] http://www.chordie.com/song.php |
| 17:43 | amalloy | $google egamble let-else |
| 17:43 | lazybot | [egamble/let-else · GitHub] https://github.com/egamble/let-else |
| 17:44 | hiredman | gfredericks: session should really be using nrepl |
| 17:45 | {blake} | Ooh. Guitar tabs. |
| 17:46 | gfredericks | hiredman: agreed |
| 17:46 | {blake} | amalloy, Thanks. |
| 17:49 | Nikentic | Any tips on how to reslove function from a string? |
| 17:50 | arrdem | please don't, use a static dispatch table and resort to clojure.core/resolve if you know what you're doing. |
| 17:50 | TEttinger | Nikentic, yeah it uh can be a pain with namespaces |
| 17:51 | gfredericks | amalloy: I guess by weird I meant unreliable; sensitive to client changes, doesn't necessarily work across clients, etc |
| 17:53 | hiredman | gfredericks: so what would you put in such a bag of tricks? |
| 17:54 | gfredericks | hiredman: if you're asking what goes in the namespace: https://github.com/gfredericks/repl-utils/blob/master/src/com/gfredericks/repl.clj |
| 17:54 | gfredericks | the best one is the bg macro at the bottom |
| 17:55 | hiredman | huh |
| 17:57 | amalloy | gfredericks: canonizing a record seems like a dangerous plan |
| 17:57 | amalloy | in that it won't print as a record |
| 17:58 | gfredericks | amalloy: totes; I just added that today |
| 17:58 | gfredericks | amalloy: it's just for pretty-printing, so not too risky |
| 17:59 | amalloy | gfredericks: your hack could be to add all these functions to clojure.core |
| 17:59 | amalloy | then you wouldn't need to refer them |
| 17:59 | gfredericks | amalloy: yeah I've tried that |
| 17:59 | gfredericks | amalloy: you have to be careful about doing it before *any other* namespace boots up |
| 17:59 | gfredericks | and it still has the universality disadvantage, of modifying namespaces you'll never need to touch |
| 18:00 | amalloy | but it can't do anything bad to those namespaces |
| 18:00 | amalloy | just cause them to get a warning about overwriting a var |
| 18:00 | gfredericks | no but I'll get warnings from clojure.repl about dir already being defined and crap like that |
| 18:02 | hiredman | but, I mean, come on, how often do you really use dir? |
| 18:02 | gfredericks | a lot |
| 18:03 | technomancy | why not just use tab completion? |
| 18:03 | gfredericks | autocomplete in cider is super janky and I want to turn it off |
| 18:03 | technomancy | seriously, afaik everything in clojure.repl is obsoleted by cider |
| 18:03 | amalloy | technomancy: apropos |
| 18:03 | technomancy | not auto-complete, just regular completion |
| 18:03 | gfredericks | technomancy: I don't think that really applies |
| 18:04 | gfredericks | if I don't know the name of a function |
| 18:04 | technomancy | amalloy: huh... I didn't realize that got moved to clojure.repl, but touche |
| 18:04 | gfredericks | just what namespace it is in |
| 18:04 | technomancy | gfredericks: you can still use tab completion |
| 18:04 | technomancy | alias/ TAB |
| 18:04 | gfredericks | on what basis does it figure that out? |
| 18:04 | gfredericks | oh crap that works |
| 18:05 | gfredericks | how does that work |
| 18:05 | technomancy | it's the same algorithm with "" as the input |
| 18:05 | amalloy | technomancy: not that i actually use apropos, or anything in clojure.repl. but whenever i say "just use emacs, bro" someone complains about apropos |
| 18:05 | amalloy | it's fun to be on the other side for a change |
| 18:05 | technomancy | heh |
| 18:06 | technomancy | time to add apropos it to cider I guess |
| 18:06 | gfredericks | just added debug-repl break! and unbreak! as well |
| 18:06 | amalloy | most of my programs could use an unbreak! |
| 18:06 | gfredericks | :P |
| 18:06 | technomancy | debug-repl *really* needs cider support |
| 18:06 | technomancy | err |
| 18:07 | technomancy | nrepl-discover support I mean =D |
| 18:07 | amalloy | so, i left (future (while true (swap! a inc))) running for about 20 hours. any guesses how high it's gotten? |
| 18:07 | gfredericks | you're talking about my debug-repl or some other identically named project? |
| 18:07 | technomancy | gfredericks: talking about the original debug-repl |
| 18:07 | arrdem | amalloy: I'm sure it hasn't overflowed ;P |
| 18:07 | gfredericks | alex-and-georges? |
| 18:07 | amalloy | oh, i actually used inc' |
| 18:07 | amalloy | so it can't |
| 18:07 | technomancy | gfredericks: yeah |
| 18:07 | gfredericks | technomancy: I rewrote that as nrepl middleware |
| 18:08 | technomancy | oh right |
| 18:08 | technomancy | anyway, not being able to M-x that and bind it to an emacs binding is sadface |
| 18:08 | gfredericks | I was trying to factor out an nrepl-mux functionality when I ran into nrepl boogs |
| 18:09 | gfredericks | someday gtrak will just fix them for me |
| 18:09 | amalloy | okay well you all failed to guess anything, so [spoiler]: 2851591830804 |
| 18:09 | gfredericks | amalloy: also brazil just won 3-1 |
| 18:09 | gfredericks | that's another way of counting things |
| 18:10 | technomancy | gfredericks: man, it feels kinda nice not to be the person referenced in that sentiment |
| 18:10 | gtrak | gfredericks: what did I do this time? |
| 18:10 | arrdem | aaaah I need to start watching the cup |
| 18:10 | technomancy | arrdem: a watched cup never boils |
| 18:10 | gfredericks | gtrak: declare your desire to git into the nrepl bug |
| 18:10 | gtrak | haha |
| 18:10 | amalloy | gfredericks: you just angered hordes of people who are excited enough about football to watch the game, but not so excited that they mind tivoing it |
| 18:10 | gtrak | yea, I just wanted CLJS to work, look what happened |
| 18:10 | gfredericks | technomancy: man thank goodness gtrak wrote leiningen what would we do without him |
| 18:11 | gtrak | lol wut. |
| 18:11 | gfredericks | amalloy: those hordes of people aren't part of my mental model of the world |
| 18:11 | amalloy | it turns out they're pretty laid back anyway |
| 18:12 | gfredericks | hah |
| 18:13 | brehaut | huh apparently sportsball is on in my office and i hadnt even noticed |
| 18:13 | arrdem | "sportsball" |
| 18:13 | arrdem | Dota is the only real sport besides CouterStrike amirite? :P |
| 18:13 | devn | Anyone want to hear a cool rant about LSD and Clojure? Here's the link... |
| 18:13 | devn | ;) |
| 18:14 | arrdem | devn: -_- |
| 18:14 | arrdem | devn: where's that lsd and systems programming article.. |
| 18:14 | technomancy | best sportsball: https://en.wikipedia.org/wiki/FIRST_Robotics_Competition |
| 18:14 | devn | List comprehensions dude. So groovy. |
| 18:14 | arrdem | $google lsd unix systems programming |
| 18:14 | lazybot | [Famous quotations about the Unix operating system] http://www.linfo.org/q_unix.html |
| 18:14 | gtrak | I remember he came on the list initially and was like, 'hi guys, I'm going to do some cool things later' |
| 18:15 | technomancy | gtrak: whom? |
| 18:15 | devn | gtrak: it's cool. he's not being a jerk about it |
| 18:15 | gtrak | the LSD Clojure blog post. |
| 18:15 | allenj12 | justin_smith: hey if i use hiccup for everyithng, does that mean its being re loaded every time a user accesses a page? or does it cache it? |
| 18:15 | gtrak | yea, he seems nice, it's just not good manners, maybe inadvertently. |
| 18:16 | devn | i mean, it could make for an interesting discussion |
| 18:16 | devn | but not on a huge public ML |
| 18:16 | justin_smith | allenj12: I forget if / how much / hiccup caches. you could put a memoize around your hiccup function |
| 18:16 | justin_smith | or put varnish in front of your server with smart parameters on it |
| 18:16 | devn | "This one time..." :X |
| 18:16 | gtrak | honestly I hoped there would be more talk about neurochemical aspects of LSD and Clojure. |
| 18:16 | allenj12 | justin_smith: varnish? |
| 18:16 | justin_smith | varnish is a universal caching layer you put in front of a web server |
| 18:16 | devn | gtrak: i think the "ugh, don't post this here" probably stopped any interesting conversation from happening |
| 18:17 | hiredman | I dunno that hiccup caches anything, but it does try to generate as much html at macro expansion time as it can |
| 18:17 | justin_smith | most clojure web servers should have at least nginx in front in production, and may benefit from having varnish in front too |
| 18:17 | devn | gtrak: there are some pretty interesting LSD programming experience reports i read a long while ago |
| 18:17 | amalloy | yeah, exactly what hiredman said. no caching, but clever pre-generation |
| 18:18 | gtrak | devn: I bet if you posted a thoughtful response it would blow over, I don't have much to say. |
| 18:18 | gtrak | also I'm curious :-) |
| 18:19 | allenj12 | justin_smith: hmm kk ill look more into that once im done with this, thanks dude |
| 18:19 | philandstuff | am I missing something or is there a reason that butlast isn't lazy? |
| 18:19 | devn | gtrak: i suppose this channel is logged and public |
| 18:19 | allenj12 | justin_smith: ill also try to find out more about hiccup and letya know if i fond anything |
| 18:19 | devn | but again, im not so hot on chatting LSD in a public ML |
| 18:19 | gtrak | haha |
| 18:20 | arrdem | ^^ yeah.... why would you think this is a good idea... |
| 18:20 | amalloy | philandstuff: i'm not aware of any good reason; you can use (drop-last coll 1) if you want |
| 18:20 | justin_smith | "we would consider for this position, but according to the Internet you used LSD once" |
| 18:20 | devn | "HI DEVIN I WORK WITH A LARGE BAY AREA TECH COMPANY AND WE FOUND YOUR GITHUB PROFILE. IT ALSO LOOKS LIKE YOU'RE INTERESTED IN LSD. YOU MIGHT BE A PERFECT FIT. HAVE TIME TO CHAT ABOUT THE OPPORTUNITY?" |
| 18:20 | arrdem | haha |
| 18:20 | gtrak | so, what we're saying is thoughtful responses are less likely than usual. |
| 18:20 | justin_smith | lol |
| 18:21 | justin_smith | (inc devn) |
| 18:21 | lazybot | ⇒ 19 |
| 18:21 | devn | gtrak: lol i just think it's kind of a weird forum for it |
| 18:22 | devn | can you imagine recruiters reaching out based on a healthy interest in psychedelics? |
| 18:22 | philandstuff | amalloy: oh awesome, thanks :) |
| 18:23 | philandstuff | (inc amalloy) |
| 18:23 | lazybot | ⇒ 127 |
| 18:23 | devn | i am not interested in those kinds of things /these/ days, but i wonder what kind of company you'd wind up with if you hired a bunch of "experienced" engineers |
| 18:23 | devn | if you get what im layin' down |
| 18:24 | technomancy | clojurebot: are you experienced? |
| 18:24 | clojurebot | Excuse me? |
| 18:24 | philandstuff | amalloy: and drop-last defaults n to 1, so I can just do (drop-last coll) |
| 18:24 | arrdem | heh |
| 18:24 | philandstuff | ,(drop-last [1 2 3]) |
| 18:24 | devn | haha technomancy |
| 18:24 | clojurebot | (1 2) |
| 18:24 | arrdem | devn: well if they're youngish you get dogecoin, reddit and pineapples on everything. |
| 18:24 | cbp` | clojurebot was offended |
| 18:25 | technomancy | sorry clojurebot; I didn't mean to pry |
| 18:25 | gtrak | devn: sounds 'innovative' |
| 18:25 | devn | yeah, a real "heady" crew |
| 18:26 | justin_smith | or just your typical Portland startup |
| 18:26 | shaun | hi, can someone explain what "pending state" means in Om, in the context of the `get-state` function? https://github.com/swannodette/om/wiki/Documentation#get-state |
| 18:27 | umpa | is this an optimal loop recur? |
| 18:28 | umpa | ,(defn looper [x y] (loop [x1 x, y1 y] (if (< x1 5) (let [x1 x1](println x1) (recur (inc x1) y1))))) |
| 18:28 | clojurebot | #'sandbox/looper |
| 18:28 | umpa | ,(looper 1 1) |
| 18:28 | clojurebot | 1\n2\n3\n4\n |
| 18:29 | Bronsa | umpa: that let is useless and you never use y1 |
| 18:29 | gtrak | umpa: you don't need to loop either, recur will hit the top of the fn. |
| 18:29 | umpa | Bronsa: how to do without let ? |
| 18:30 | justin_smith | umpa: the recur creates a new binding |
| 18:30 | justin_smith | you don't need let for that |
| 18:30 | Bronsa | umpa: (defn looper [x y] (when (< x 5) (println x) (recur (inc x) y))) |
| 18:30 | Bronsa | y is still useless though |
| 18:31 | justin_smith | Bronsa: I assumed it is a simplification of some code where y did something |
| 18:31 | Bronsa | justin_smith: you're probably right |
| 18:31 | umpa | justin_smith: is correct |
| 18:45 | shaun | Nevermind about the Om question, pending state is explained by the distinction between `get-state` and `get-render-state` |
| 18:47 | amalloy | incidentally, has anyone ever looked at the implementation of drop-last? it's a pretty neat way to do it, i've always thought: it's not immediately obvious how to remove the last N items of a collection while being as lazy as possible |
| 18:49 | Bronsa | amalloy: yeah I've always thought drop-last was really cool |
| 18:50 | justin_smith | amalloy: oh wow, that is really cool |
| 18:51 | amalloy | oh, interesting. looked at one of the commits that affected drop-last, and apparently at the time (if x y z) was a macro that just expanded to (if* x y z) for some reason |
| 18:52 | hiredman | amalloy: when nil punning went away |
| 18:52 | hiredman | if become a macro that expanded to if*, and if would check for nil punning and warn |
| 18:52 | amalloy | hah, neat |
| 18:52 | hiredman | clojure: days of future past |
| 18:55 | amalloy | hiredman: in this context by nil punning you mean that empty seqs used to be falsey, right? |
| 18:59 | cbp` | (inc drop-last) |
| 18:59 | lazybot | ⇒ 1 |
| 19:00 | Bronsa | I wonder if there's a way to write drop-last without realizing the whole seq |
| 19:01 | justin_smith | Bronsa: well, drop-last is already lazy and you can't know where the end is until you hit it, right? |
| 19:01 | Bronsa | it would require a lazyseq type that was also counted |
| 19:01 | Bronsa | which sounds counterintuitive |
| 19:02 | justin_smith | but there are many cases where the seq should be lazy, but you know the max length at creation time |
| 19:02 | justin_smith | ie. when lazy-seq is abstracting over map on an expensive calculation - you know the size of the input, but don't want all the results unless you need them |
| 19:03 | justin_smith | s/know/may know |
| 19:03 | Bronsa | right |
| 19:03 | Bronsa | the issue there is that some lazy functions would be able to preserve this info while others wouldn't, e.g. map vs filter |
| 19:04 | justin_smith | but in that case you still could know an upper bound |
| 19:04 | brehaut | Bronsa: i think that haskell achieves something like what you are talking about with its rewrite rules |
| 19:04 | Bronsa | that would be pretty useless justin_smith |
| 19:05 | Bronsa | justin_smith: for a drop-last, at least |
| 19:06 | justin_smith | right, but I can think of other situations where hypothetically knowing an upper bound would be useful |
| 19:08 | dbasch | justin_smith: more obvious case: (range some_big_number) |
| 19:09 | amalloy | counted lazy seqs are pretty hard to work with, but a counted reducer is somewhat viable |
| 19:10 | amalloy | eg, in http://dev.clojure.org/jira/browse/CLJ-993 i include Counted for my Range reducer |
| 19:10 | justin_smith | dbasch: sure, but we often use lazy operators on vectors or even maps via seq |
| 19:11 | dbasch | justin_smith: you’re right. A real-life case that comes to mind is a vector of imap envelopes for which you want to get the contents lazily |
| 19:15 | gfredericks | should I use auto-complete-mode in the repl buffer? |
| 19:18 | cbp | when I did that it would randomly create massive amounts of new lines which was pretty annoying |
| 19:18 | cbp | I've been told it's because of popup.el |
| 19:18 | cbp | company mode works fine though |
| 19:21 | mdeboard | hi, Can anyone recommend a good lightweight testing library? I'm modeling a board game and I'm getting to the point where there's too much code for me to test everything by hand :P |
| 19:21 | gfredericks | clojure.test is the lightweightiest |
| 19:21 | mdeboard | I used midje a couple years ago with a cascalog thing but idk if that's still a good choice |
| 19:21 | amalloy | midje has never been lightweight |
| 19:22 | gfredericks | "midge is a lightweight set of maven coordinates to locate a heavyweight testing library" |
| 19:22 | mdeboard | gfredericks: Is tehre a caveat there or? |
| 19:22 | mdeboard | (wrt clojure.test) |
| 19:22 | gfredericks | mdeboard: it's missing a few things that feel obvious, but they're not major; it's simple enough that you can pretty well understand what it's doing |
| 19:23 | justin_smith | clojure.test is good. it is simple. |
| 19:23 | justin_smith | gfredericks: what occurs to you as missing from clojure.test? |
| 19:23 | mdeboard | Someone linked http://jayfields.com/expectations/ the other day |
| 19:24 | gfredericks | justin_smith: docstrings on tests |
| 19:24 | gfredericks | the order of args to is feels pretty backwards |
| 19:24 | dbasch | if I’d written that library, I would have called it Inquisition |
| 19:25 | mdeboard | Every time I see "Expectations" i think of old SNL skit, "Lowered Expectations" |
| 19:25 | justin_smith | gfredericks: that is what clojure.test/testing is for |
| 19:25 | gfredericks | fixtures can be a little weird |
| 19:25 | gfredericks | justin_smith: extra nesting just to add the docstring? |
| 19:26 | justin_smith | I like it because it nests and allows multiple descriptions in one test |
| 19:26 | amalloy | &(macroexpand '(clojure.test/are [x y] (let [y (+ x y)] (= y x)) 0 0)) |
| 19:26 | lazybot | ⇒ (do (clojure.test/is (let [0 (+ 0 0)] (= 0 0)))) |
| 19:26 | justin_smith | it's more than a docstring, it is also part of what prints on failure |
| 19:27 | gfredericks | justin_smith: yeah that's what I mean by docstring |
| 19:28 | hiredman | amalloy: there used to be no such thing as an empty seq, there was just nil |
| 19:28 | hiredman | there was no lazy-seq macro, there was this lazy-cons thing |
| 19:29 | hiredman | subtlety different |
| 19:37 | mdeboard | No let-binding with deftest ? |
| 19:39 | justin_smith | mdeboard: huh? I use let in deftest all the time |
| 19:39 | mdeboard | I see |
| 19:40 | justin_smith | another thing I do that may be more counterintuitive, is make a defn that calls test/is and run it inside a deftest |
| 19:40 | mdeboard | one o' them watchacall pebcak errors on my part |
| 19:40 | justin_smith | ahh |
| 19:43 | allenj12 | can someone tell me whats going on here? (defmacro defpage [page-name & body] '(def page-name (memoize (fn [] (html5 ~@body))))) ;; body is not being recognized, why? |
| 19:43 | allenj12 | woops |
| 19:43 | allenj12 | i ment here ? |
| 19:43 | allenj12 | https://www.refheap.com/86533 |
| 19:43 | allenj12 | yea |
| 19:44 | justin_smith | do you want ` instead of ' ? |
| 19:45 | dbasch | you probably want to unquote page-name as well |
| 19:45 | justin_smith | also, if you leave [] out, then the caller of defpage can decide if and what arguments should be provided for a given page |
| 19:45 | allenj12 | dbasch: i did but then it complains that page-name is not a symbol |
| 19:46 | mdeboard | I think clojure.test is plenty good for my needs atm |
| 19:46 | justin_smith | ~'page-name |
| 19:46 | clojurebot | Huh? |
| 19:46 | justin_smith | or maybe '~page-name |
| 19:46 | justin_smith | I forget now |
| 19:46 | allenj12 | why would you quote it just to unquote it |
| 19:47 | Bronsa | `~'a |
| 19:47 | Bronsa | ,`~'a |
| 19:47 | clojurebot | a |
| 19:47 | Bronsa | ,`a |
| 19:47 | clojurebot | sandbox/a |
| 19:47 | dbasch | allenj12: actually, why is that even a macro? |
| 19:47 | justin_smith | because it is an argument, but it is an argument used as a symbol, not evaluated for avalue |
| 19:47 | justin_smith | because he wants to make a def for a certain symbol |
| 19:47 | Bronsa | justin_smith: with def actually there's no need for ~' |
| 19:47 | Bronsa | ,*ns* |
| 19:47 | clojurebot | #<Namespace sandbox> |
| 19:48 | Bronsa | ,(def sandbox/a 1) |
| 19:48 | clojurebot | #'sandbox/a |
| 19:49 | allenj12 | so i tried '~page-name ~'page-name as well and same problem |
| 19:50 | allenj12 | page-name not a symbol for def |
| 19:50 | justin_smith | oh yeah, ~page-name actually works |
| 19:51 | justin_smith | my bad |
| 19:51 | dbasch | allenj12: btw, what is body? can you give a usage example? |
| 19:51 | justin_smith | (defmacro defpage [page-name & body] `(def ~page-name (memoize (fn [] (html5 ~@body))))) |
| 19:52 | allenj12 | its hicuup code |
| 19:52 | justin_smith | dbasch: idiomatically, it would be the body of a function, or some other (do ...) |
| 19:52 | allenj12 | i know the problems |
| 19:53 | allenj12 | I used ' not ` im a dumbass |
| 19:53 | allenj12 | lol |
| 19:55 | dbasch | with ` and ~page-name it works fine for me |
| 19:56 | allenj12 | dbasch: yea as i said before i accidentally used ' |
| 19:57 | allenj12 | dbasch: i feel dumb |
| 19:57 | dbasch | allenj12: that’s what macroexpand-1 is for :) |
| 19:57 | dbasch | it tells you before other people tell you :P |
| 19:57 | justin_smith | allenj12: an idea, you could turn the args list into [name args & body] and replace the (fn [] ...) with (fn ~args ...) then an individual defpage could decide what arg list to take |
| 19:58 | allenj12 | justin_smith: good idea, thanks? btw memoizing like that should work right? |
| 19:58 | justin_smith | in case you eventually want dynamic content of any sort |
| 19:58 | justin_smith | yeah, memoize makes a map from args to results |
| 19:59 | justin_smith | so a new arg means looking up a different result |
| 19:59 | justin_smith | just don't expect memoize to work with things that randomize their output or depend on things that are not args |
| 20:00 | justin_smith | so if you have anything like social activity or whatever that will vary with page loads, they should come in as args for memoize to work properly |
| 20:00 | allenj12 | justin_smith: yea alright thanks! if i cant run this all the way through all try varnish like you mentioned |
| 20:02 | johnwalker | justin_smith: ordered my copy of jcip :) |
| 20:02 | allenj12 | justin_smith: actually what if some of the pages i write are static, would i still benefit from memoize |
| 20:04 | justin_smith | absolutely |
| 20:04 | justin_smith | johnwalker: awesome |
| 20:04 | justin_smith | allenj12: even more so, since that way it only needs to generate once, and there is only one value in the table to look up |
| 20:07 | allenj12 | justin_smith: awsome |
| 20:14 | nkozo | how do you run "lein test" only for clojure test in a project (in this case, Prismatic Schema) that also compiles to clojurescript (using cljx) |
| 20:15 | justin_smith | nkozo: you can use test selector metadata on your test definitions, and use lein test :foo to run only tests with metadata foo |
| 20:15 | justin_smith | nkozo: oh, this is someone else's codebase? hopefully they have defined selectors, or you could add them I guess |
| 20:16 | nkozo | mm, I don't see any selector, the tests are defined in a .cljx file |
| 20:27 | cpetzold | nkozo: so you want to run the clj tests and not the cljs ones? |
| 20:27 | nkozo | cpetzold: exactly |
| 20:27 | cpetzold | you can temporarily comment out this line: https://github.com/Prismatic/schema/blob/master/project.clj#L17 |
| 20:28 | nkozo | cpetzold: oh, I see, thanks! |
| 20:28 | cpetzold | np :) |
| 20:28 | cpetzold | out of curiosity though, why don’t you want to run the cljs tests? |
| 20:29 | justin_smith | probably because of making changes to clj and not cljs and cljs takes a long time to run? |
| 20:29 | justin_smith | just a guess |
| 20:30 | nkozo | yes, an because I'm making some changes in the clj version temporary incompatible with the cljs one |
| 20:32 | boov | hi |
| 20:32 | boov | where i can find young girls? |
| 20:33 | boov | where i can find young girls? |
| 20:34 | boov | which one holocaust was your favourite one? |
| 20:38 | TEttinger | yeah that'll work... |
| 20:38 | TEttinger | seems to be more trolls lately |
| 20:39 | mdeboard | russia |
| 20:39 | TEttinger | he was from poland |
| 20:45 | allenj12 | is there any site that explains how to have leiningen to update localhost on file save? i remember running into one but cant find it now |
| 20:49 | bob2 | as in reload your code? |
| 20:49 | allenj12 | bob2: as in re compile the clojurescript file and re fresh local host |
| 20:49 | allenj12 | bob2: pretty much just restart everything |
| 20:50 | allenj12 | bob2: i remember a guy doing it with :alias and adding something to his script but i forget how |
| 20:50 | allenj12 | bob2: and using a light table connection |
| 20:55 | allenj12 | this is gonna drive me net |
| 20:55 | allenj12 | nuts |
| 21:02 | allenj12 | i remember he called the alias lein up |
| 21:02 | allenj12 | still cant find it tho |
| 21:07 | devn | how do you get "\space" from \space? |
| 21:07 | devn | i cant brane good. i have the dums |
| 21:08 | brehaut | ,(str \space) |
| 21:08 | clojurebot | " " |
| 21:08 | brehaut | probably not |
| 21:08 | brehaut | ,(pr \space) |
| 21:08 | clojurebot | \space |
| 21:08 | devn | doy, thanks dude |
| 21:08 | justin_smith | ,(pr-str \space) |
| 21:08 | clojurebot | "\\space" |
| 21:09 | justin_smith | pr-str is awesomesauce |
| 21:09 | devn | ,(with-out-str (pr \space)) |
| 21:09 | clojurebot | "\\space" |
| 21:09 | justin_smith | ,(pr-str \ ) |
| 21:09 | clojurebot | "\\space" |
| 21:09 | devn | oh weird, i swear i tried pr-str and it didn't work |
| 21:10 | allenj12 | where is a good site to find out to set up leiningen to recompile clojurescript and to refresh localhost on save? |
| 21:12 | nDuff | allenj12, I'd suggest using figwheel for that. |
| 21:14 | nDuff | allenj12, ...see http://rigsomelight.com/2014/05/01/interactive-programming-flappy-bird-clojurescript.html |
| 21:14 | devn | honestly, the reason i wanted this is a bit silly, but... in this particular case I'd like to use destructuring on a map for characters |
| 21:14 | allenj12 | nDuff: awsome thank you :) |
| 21:14 | devn | but alas, we only have strs, syms, keys |
| 21:14 | justin_smith | no chars, it's an outrage |
| 21:15 | nDuff | (though, err, *grumble* re: asking for a link about doing X, as opposed to just "how do I do X?") |
| 21:15 | devn | why /dont/ we have :chars, :ints, etc.? |
| 21:15 | justin_smith | :ints would imply that the symbol '1 would not be bound to 1, which sounds evil to me |
| 21:16 | justin_smith | but yeah, :chars makes sense |
| 21:16 | justin_smith | ,(= '1 1) |
| 21:16 | clojurebot | true |
| 21:16 | nDuff | ...note that figwheel goes beyond just reloading the page completely from fresh, and actually tries to keep state across code revisions. :) |
| 21:17 | devn | justin_smith: yeah i can dig that |
| 21:19 | justin_smith | now I am remembering amalloy_'s evil reflection trick to change the value of one of the integers... |
| 21:20 | devn | haha, i was just thinking about that today |
| 21:26 | jack_rabbit | devn, what's the trick? |
| 21:31 | justin_smith | ,(let [five (long (int (+ (int 1) (int 4)))), field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field five (int (+ (int 1) (int 4))))) |
| 21:31 | clojurebot | nil |
| 21:31 | justin_smith | ,(range 10) |
| 21:31 | clojurebot | (0 1 2 3 4 ...) |
| 21:31 | justin_smith | ,(range 2 6) |
| 21:31 | clojurebot | (2 3 4 5) |
| 21:32 | justin_smith | hmm |
| 21:32 | justin_smith | ahh |
| 21:32 | justin_smith | that was the undo :) |
| 21:32 | justin_smith | ,(let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field 5 2)) |
| 21:32 | clojurebot | nil |
| 21:32 | justin_smith | ,(range 2 6) |
| 21:32 | clojurebot | (2 3 ...) |
| 21:32 | justin_smith | (inc 5) |
| 21:32 | lazybot | ⇒ 1 |
| 21:33 | justin_smith | ,(inc 5) |
| 21:33 | clojurebot | 3 |
| 21:33 | _ato | nice |
| 21:33 | johnwalker | ,(inc .4) |
| 21:33 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: .4 in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 21:33 | justin_smith | ,(+ 5 5) |
| 21:33 | clojurebot | 4 |
| 21:33 | johnwalker | (def .4 4) |
| 21:33 | johnwalker | ,(def .4 4) |
| 21:33 | clojurebot | #'sandbox/.4 |
| 21:33 | johnwalker | ,(inc .4) |
| 21:33 | clojurebot | 2 |
| 21:33 | john2x | is there a similar emacs plugin for core.test like Midje's plugin? where I can do `C-c ,` to run a fact? |
| 21:33 | justin_smith | ,(dec 5) |
| 21:33 | clojurebot | 1 |
| 21:34 | johnwalker | ,(inc *1) |
| 21:34 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to java.lang.Number> |
| 21:35 | johnwalker | john2x: use projectile with clojure-mode |
| 21:35 | johnwalker | oh, you want a particular test to run |
| 21:35 | justin_smith | johnwalker: because of the way clojurebot evaluates, *1 is usually not bound |
| 21:36 | johnwalker | justin_smith: was worth a shot :) |
| 21:37 | john2x | johnwalker: yes, e.g. run the test under the cursor |
| 21:38 | johnwalker | have you tried clojure-test-mode? |
| 21:39 | johnwalker | C-c M-, runs a deftest |
| 21:40 | justin_smith | one thing to note is that every deftest actually creates an fn of no args, and you can call that fn to run the test and see its result |
| 21:41 | justin_smith | ,(do (require '[clojure.test :as test]) (test/deftest f (test/testing "this fails" (test/is false))) (f)) |
| 21:41 | clojurebot | \nFAIL in (f) (NO_SOURCE_FILE:0)\nthis fails\nexpected: false\n actual: false\n |
| 21:42 | justin_smith | "expected: false actual: false" |
| 21:42 | justin_smith | worst kind of failure |
| 21:43 | johnwalker | when i run it i just get nil |
| 21:43 | justin_smith | in clojure.test no output means success |
| 21:43 | justin_smith | you don't get the summary, since it is just one test |
| 21:43 | johnwalker | when the test breaks i also get nil |
| 21:43 | justin_smith | no printed output? |
| 21:44 | johnwalker | oh, i do get output |
| 21:44 | johnwalker | still weird though |
| 21:44 | justin_smith | all testing does is print, what else would it do? |
| 21:45 | johnwalker | i dunno, return :fail or :success |
| 21:46 | allenj12 | figwheel is pretty picky lol |
| 21:55 | allenj12 | i think figwheel is broken, when i try lein figwheel, i get the error is output-dir in resources QMARK. but when i check the function that sends this error all it does in (.startsWith (get-in build [:compiler :output-dir]) (str "resources/") |
| 21:55 | allenj12 | :output-dir "resources/public/js" |
| 21:55 | allenj12 | is my lein |
| 21:59 | justin_smith | and you have a resources/ directory I assume? |
| 22:00 | johnwalker | :x |
| 22:02 | allenj12 | justin_smith: yea definatley |
| 22:04 | nDuff | allenj12, *shrug*. figwheel works well for me; did have to follow the setup directions with a certain (nontrivial) level of care. If your code is public, I might have time to look at it in a bit. |
| 22:05 | allenj12 | nDuff: its just the project.clj right? ill link it |
| 22:06 | nDuff | allenj12, ...well, that's not the _only_ thing that can matter. Would prefer a full reproducer, TBH. |
| 22:07 | allenj12 | nDuff: wait would it matter i have no starting html file? there all being generated by hiccup right now |
| 22:07 | allenj12 | nDuff: buildings closing brb 10 min |
| 22:12 | gfredericks | cider-nrepl just started breaking with an unresolved var in clojure.tools.trace |
| 22:14 | cbp | well on the bright side, I'll make sure not to update for now |
| 22:15 | gfredericks | it's a snapshot you update all the time |
| 22:15 | justin_smith | someone should make one of those static sites "is-the-current-cider-broken.com" |
| 22:15 | cbp | oh crap youre right |
| 22:16 | justin_smith | page will just be the word "yes", or maybe the word "no" |
| 22:16 | cbp | justin_smith: lol |
| 22:17 | justin_smith | backend would be a ring server, that periodically pulls from cider, and runs an emacs batch with some elisp that checks if stuff works |
| 22:17 | cbp | (inc justin_smith) |
| 22:17 | lazybot | ⇒ 49 |
| 22:18 | justin_smith | http://isitraining.in/portland <- are these things still cool? |
| 22:18 | justin_smith | http://isitraininginportland.com/ <- less serious / lower effort version |
| 22:19 | allenj12 | im back |
| 22:20 | gfredericks | I'm still here |
| 22:22 | allenj12 | gfredericks: :) |
| 22:23 | allenj12 | nDuff: hey does it matter that my html files are being generated by hiccup and there are non actually saved |
| 22:25 | tvanhens | how do I refer to a directory using resources so it will be compatible with an uberjar? |
| 22:26 | gfredericks | clojure.io/resource |
| 22:26 | gfredericks | and the /resources directory in your project |
| 22:26 | tvanhens | I'm using resource and it works for lein run |
| 22:26 | tvanhens | but when I make an uberjar |
| 22:26 | nullptr` | http://isitraining.in/downinafrica |
| 22:26 | tvanhens | it fails to run that task |
| 22:27 | gfredericks | tvanhens: how does it fail? |
| 22:27 | nullptr` | justin_smith: useless! |
| 22:27 | justin_smith | what are you doing with the result of io/resource? |
| 22:27 | justin_smith | nullptr`: lol |
| 22:27 | justin_smith | tvanhens: a common mistake is to call io/file or make a java.io.File out of the result of io/resource |
| 22:27 | justin_smith | this works if a resource is on disk, but not in a jar |
| 22:27 | tvanhens | using io/file to convert it into a file object and then using file-seq to get everything |
| 22:28 | justin_smith | (io/input-stream (io/resource "something")) works in both cases |
| 22:28 | justin_smith | you cannot use io/file on a jar resource |
| 22:28 | tvanhens | cool let me try that thanks justin |
| 22:31 | tvanhens | now I'm getting a file not found exception even in development |
| 22:31 | tvanhens | odd thing is the file it says is missing is there |
| 22:31 | tvanhens | the path its showing is right |
| 22:31 | TEttinger | justin_smith: is it raining? http://dl.dropboxusercontent.com/u/11914692/dogeweather/weather.html?place=portland |
| 22:32 | justin_smith | it was overcast all day, I saw no actual rain |
| 22:33 | justin_smith | but the "is cider broken" site should definitely do it doge style |
| 22:33 | TEttinger | my thing is kinda open source |
| 22:33 | TEttinger | it doesn't have a server side |
| 22:33 | justin_smith | oh, is that yours? |
| 22:33 | TEttinger | not really |
| 22:34 | TEttinger | dogeweather was credited to the people in the bottom right of the page |
| 22:34 | TEttinger | but it used php for no good reason |
| 22:34 | TEttinger | I refactored it to pure JS API calls and HTML |
| 22:34 | justin_smith | I like the var names http://dl.dropboxusercontent.com/u/11914692/dogeweather/js/jquery.dogeweather.js |
| 22:34 | justin_smith | nice job |
| 22:35 | tvanhens | justin_smith any common errors that lead to file not found when it exists where the uri it says it doesn't exist? |
| 22:35 | justin_smith | tvanhens: remember that inside a jar, it is not a file |
| 22:35 | justin_smith | it is a resource |
| 22:35 | devn | who has a sweet way to generate this sequence? '((2 3) (3 4 5) (4 5 6) (5 6 7) (6 7)) |
| 22:36 | tvanhens | It stopped working outside the jar though |
| 22:36 | tvanhens | thats where I'm getting the error |
| 22:36 | justin_smith | tvanhens: are you asking for it relative to the resource (class) path? |
| 22:36 | justin_smith | ie. if it is resources/macros/sloth.gif you need to ask for (io/resource "macros/sloth.gif") |
| 22:37 | tvanhens | the folder is ./resources/db/schema from the project root I'm refering to it as db/schema in resource |
| 22:37 | justin_smith | oh, so what you want is a handle to the containing directory |
| 22:37 | justin_smith | I don't know if that is portable between resource and fs actually, I haven't tried it |
| 22:38 | tvanhens | ah interesting |
| 22:38 | cbp | devn: i don't get it |
| 22:38 | justin_smith | there should be some way to abstract over that |
| 22:39 | TEttinger | devn, the 2-element subseqs are odd |
| 22:39 | tvanhens | yeah really what I need is a way to get all the items within a "folder" in an uberjar |
| 22:39 | tvanhens | that also works in development |
| 22:40 | TEttinger | resources |
| 22:40 | TEttinger | there's a way to declare it in project.clj |
| 22:41 | xeqi | devn: looks like a constant, I'd just use it like that |
| 22:41 | devn | cbp: TEttinger: If you give me an upper and lower bound, and then you give me a number, I want to hand you back an interval that doesn't violate the bounds |
| 22:41 | cbp | devn: here's one way tho ##(map seq [[2 3] [3 4 5] [4 5 6] [5 6 7] [6 7]]) |
| 22:41 | lazybot | ⇒ ((2 3) (3 4 5) (4 5 6) (5 6 7) (6 7)) |
| 22:41 | tvanhens | TEttinger I'm using a resources directory. Problem is iterating over all the items in a folder in resources |
| 22:42 | Jaood | cbp: use the range man |
| 22:42 | TEttinger | ah. |
| 22:42 | devn | so like, if the range is 2-8 (exclusive on the end), then if you give me 7, I want to give you back (6 7) |
| 22:42 | justin_smith | TEttinger: what he wants is to iterate the contents, inside a jar |
| 22:42 | justin_smith | oh, he just said that |
| 22:42 | devn | if you give me 2, then i want to give you (2-3) |
| 22:42 | devn | if you give me 3, i can give you (2 3 4) |
| 22:42 | devn | and so on |
| 22:43 | tvanhens | If theres a way to list all items in a directory in resources within a jar then I could figure out a workaround |
| 22:43 | devn | tvanhens: there is |
| 22:43 | devn | err i havent been following along, but my understanding is that you can get at that stuff |
| 22:44 | devn | i bet michaniskin knows the answer to this |
| 22:46 | TEttinger | ##((fn [start end] (map (fn [item] (filter #(and (>= % start) (< % end)) [(dec item) item (inc item)])) (range start end))) 2 8) |
| 22:46 | lazybot | ⇒ ((2 3) (2 3 4) (3 4 5) (4 5 6) (5 6 7) (6 7)) |
| 22:46 | michaniskin | tvanhens: devn: https://github.com/tailrecursion/boot.core/blob/master/src/tailrecursion/boot/deps.clj#L17-L21 |
| 22:47 | michaniskin | :) |
| 22:47 | justin_smith | tvanhens: there is a .getProtocol method on java.net.URL |
| 22:47 | justin_smith | which is the class returned by io/resource |
| 22:47 | TEttinger | ##((fn [start end] (map (fn [item] (filter #(and (>= % start) (< % end)) [(dec item) item (inc item)])) (range start end))) 5 15) |
| 22:47 | lazybot | ⇒ ((5 6) (5 6 7) (6 7 8) (7 8 9) (8 9 10) (9 10 11) (10 11 12) (11 12 13) (12 13 14) (13 14)) |
| 22:47 | justin_smith | tvanhens: you can check if the protocol is "file" and do the directory scan as file, and otherwise there may be some other action that works |
| 22:48 | devn | michaniskin: nice! |
| 22:48 | devn | michaniskin to the rescue |
| 22:48 | tvanhens | michaniskin giving that a go thanks |
| 22:48 | michaniskin | it's expecting a JarFile object there |
| 22:48 | TEttinger | (inc michaniskin) |
| 22:48 | lazybot | ⇒ 1 |
| 22:49 | TEttinger | devn, what was that non-violating-bounds fn work? |
| 22:49 | TEttinger | *does that |
| 22:50 | devn | TEttinger: oh, i missed that |
| 22:50 | devn | let me try that out |
| 22:50 | justin_smith | tvanhens: michaniskin: so I guess if .getProtocol is file, you use io/file and fileseq to get the contents, otherwise you use entries if it is inside a jar |
| 22:51 | TEttinger | devn, that's with ## as the equivalent to , for lazybot instead of clojurebot btw |
| 22:51 | devn | TEttinger: like a charm |
| 22:51 | devn | thanks dude |
| 22:51 | devn | i feel like there's /got to be a better way!/ *pounds fist* |
| 22:51 | justin_smith | I feel like something like this should be in clojure.java.io too, since accessing something in a directory at dev time and in a jar at deploy time is common enough |
| 22:52 | devn | a modified partition would be nice |
| 22:52 | tvanhens | I guess slightly higher level question: is storing the schemas for my db in a jar not the best idea in the world? |
| 22:52 | devn | version coupling |
| 22:52 | justin_smith | tvanhens: with caribou we get the schemas for the db from the db |
| 22:53 | justin_smith | at boot |
| 22:53 | justin_smith | we kind of reify things though to make the sql db be more "homoiconic" I guess |
| 22:53 | tvanhens | interesting |
| 22:53 | justin_smith | and more clearly self describing |
| 22:54 | justin_smith | so we have a table called model, and another called field |
| 22:54 | justin_smith | and each row in model has many fields |
| 22:54 | justin_smith | etc. |
| 22:54 | devn | TEttinger: maybe a reduce would be simpler? |
| 22:55 | michaniskin | anyone here familiar with sonatype aether? |
| 22:57 | justin_smith | ,((fn [input] (concat [(take 2 input)] (partition 3 1 input) [(take-last 2 input)])) (range 5 15)) devn |
| 22:57 | clojurebot | eval service is offline |
| 22:57 | justin_smith | &((fn [input] (concat [(take 2 input)] (partition 3 1 input) [(take-last 2 input)])) (range 5 15)) ; devn |
| 22:57 | lazybot | ⇒ ((5 6) (5 6 7) (6 7 8) (7 8 9) (8 9 10) (9 10 11) (10 11 12) (11 12 13) (12 13 14) (13 14)) |
| 22:57 | justin_smith | michaniskin: I know alembic.still is much easier to use |
| 22:58 | devn | justin_smith: yeahhhh, im being picky and should just move on |
| 22:58 | michaniskin | justin_smith: what i want is to get a list of jars on the classpath, sorted in dependency order |
| 22:58 | michaniskin | justin_smith: alembic uses pomegranate, no? |
| 22:58 | justin_smith | I think so, yeah |
| 22:59 | TEttinger | I love how good #clojure is at shaving yaks on these kinds of problems |
| 22:59 | TEttinger | (inc justin_smith) |
| 22:59 | lazybot | ⇒ 50 |
| 22:59 | michaniskin | for the life of me i can't figure out how to do that simple thing without a ton of gratuitous calls to resolve-dependencies |
| 22:59 | justin_smith | michaniskin: I think some of the abstractions here may help you actually https://github.com/pallet/alembic/blob/develop/src/alembic/still.clj |
| 23:00 | michaniskin | the aether/resolve-dependencies function doesn't provide a true dependency graph |
| 23:00 | justin_smith | oh, and that is what alembic is using, yeah |
| 23:00 | justin_smith | well they wrap it - what is wrong with aether/resolve-dependencies? |
| 23:01 | michaniskin | justin_smith: aether/resolve-dependencies returns the information you'd want for something like `lein deps :tree` |
| 23:01 | michaniskin | deps :tree doesn't give you a true deps graph, it elides info you're not interested in when you're debugging deps issues |
| 23:02 | xeqi | michaniskin: you're looking for something more then https://github.com/cemerick/pomegranate/blob/master/src/main/clojure/cemerick/pomegranate/aether.clj#L790 ? |
| 23:02 | michaniskin | xeqi: yes, that only gives you info about which things aether chose, but it elides a lot of info you need to make a true dep graph |
| 23:03 | xeqi | "true dep graph" ? |
| 23:03 | justin_smith | michaniskin: what about going through all the deps, loading the pom.xml for each, and doing your own graph calculation then? |
| 23:03 | michaniskin | for instance, if you specify foo/bar and foo/baz in your project dependencies, and both of those depend on foo/quux, it will only show foo/quux as a child of one or the other, not both |
| 23:03 | xeqi | ah, right |
| 23:04 | michaniskin | so yes, i could bring in xml parsers and everything |
| 23:04 | justin_smith | I hope that's not what you need to do |
| 23:04 | michaniskin | but it seems unlikely that there's no way to just do it via aether |
| 23:04 | xeqi | I ended up needing that info in pedantic... let me find where it was |
| 23:04 | michaniskin | currently i gave up and just do aether/resolve-dependencies individually for each dep |
| 23:05 | michaniskin | and then i do the topo sorting |
| 23:11 | xeqi | ugh, its been so long since I've delved into the aether area |
| 23:13 | michaniskin | xeqi: https://github.com/xeqi/pedantic/blob/master/src/pedantic/core.clj#L81 that guy looks promising |
| 23:13 | xeqi | my recollection is you have to inject a DependencyGraphTransformer that will gather the info you want and then "return" it through an atom |
| 23:13 | michaniskin | perhaps the :ignored ones are the deps i'm looking for? |
| 23:13 | xeqi | and it looks like http://wiki.eclipse.org/Aether/Transitive_Dependency_Resolution says a similar thing |
| 23:13 | michaniskin | the ones that are hidden by resolve-dependencies? |
| 23:14 | xeqi | :ignored would be a dep w/ a version that wasn't choosen, so yes |
| 23:15 | xeqi | though I wrote this stuff >1year ago, so don't take it as gospel |
| 23:15 | michaniskin | whew! this is hopeful :) |
| 23:15 | michaniskin | my current project has a ton of dependencies, and it's taking forever to do it my naive way |
| 23:16 | johnwalker | devn: what is this cloclogo you're working on? |
| 23:16 | johnwalker | is this for core.typed? |
| 23:16 | xeqi | your naive way was the same way my proof of concept code for lein-pedantic worked, before I actually dove into aether's api |
| 23:17 | xeqi | which was mostly undocumented around this stuff :p |
| 23:19 | michaniskin | xeqi: where does the session come from? |
| 23:19 | michaniskin | xeqi: in the use-transformer function |
| 23:20 | xeqi | michaniskin: hmm, lein just uses cemerick.pomegranate.aether/repository-session https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/classpath.clj#L291 |
| 23:21 | michaniskin | xeqi: dude thank you. i owe you a beer at the next conj! |
| 23:22 | tvanhens | is there a way to use globbing with io/resource? |
| 23:23 | xeqi | michaniskin: heh, I hope you're able to crib together what you need. I feel like I'm grabbing just enough straws to point you somewhere but not actually 100% this is exactly it |
| 23:23 | xeqi | though I'm getting more confident this is the right area as I stare at it |
| 23:24 | michaniskin | tvanhens: https://github.com/tailrecursion/boot/blob/master/boot-classloader/src/tailrecursion/boot_classloader.clj#L76-L77 |
| 23:24 | michaniskin | tvanhens: that takes a pattern and path both strings, and boolean result |
| 23:24 | michaniskin | it has an unfortunate dependency on Ant, but it works with < java7 |
| 23:25 | justin_smith | tvanhens: what about creating a compile time task that records the resources that should be loaded, based on the directory contents? |
| 23:25 | michaniskin | in java7 there is nio stuff to do glob matching on Path objects |
| 23:25 | justin_smith | michaniskin: you can get a Path from a jar resource? that's cool |
| 23:26 | michaniskin | justin_smith: well i'm not sure about that, but i was assuming you could make one that would allow you to decide if the resource matches or not |
| 23:26 | justin_smith | michaniskin: wait, javadoc for path makes it look filesystem specific |
| 23:26 | justin_smith | ahh, based on a list of resources for example |
| 23:26 | michaniskin | justin_smith: you could do (.getPath (io/file "foo/bar")) and the file doesn't need to exist |
| 23:26 | justin_smith | right, then you can use path matching |
| 23:27 | michaniskin | xeqi: thanks, i've been at this for a while now, i feel like this may be the breakthrough lol |
| 23:27 | tvanhens | oy this bit is ending up a lot more complicated than I thought it would be |
| 23:28 | xeqi | michaniskin: what are you building? |
| 23:29 | michaniskin | xeqi: i'm overhauling boot: https://github.com/tailrecursion/boot-ng |
| 23:29 | michaniskin | xeqi: i have "pods" working now (not fully tested though, so ...) |
| 23:29 | michaniskin | pods are a way to dynamically start a child boot session in a segregated classloader |
| 23:30 | michaniskin | from within boot itself, so a task can do its actual work in the pod |
| 23:30 | michaniskin | basically each task can now load whatever deps it needs to do its work without needing to pollute the classpath of other tasks or the project |
| 23:31 | michaniskin | but the build process itself (which has no deps of its own) runs in your project |
| 23:31 | allenj12 | is domina still used? |
| 23:31 | allenj12 | seems a while since it was updated |
| 23:31 | Jaood | allenj12: looks like react wrappers took oever |
| 23:32 | michaniskin | allenj12: how was your hoploning? |
| 23:32 | Jaood | *over |
| 23:34 | justin_smith | ,(.getPathMatcher (java.nio.file.FileSystems/getDefault) "glob:*.clj") |
| 23:34 | clojurebot | #<CompilerException java.lang.ClassNotFoundException: java.nio.file.FileSystems, compiling:(NO_SOURCE_PATH:0:0)> |
| 23:34 | justin_smith | &(.getPathMatcher (java.nio.file.FileSystems/getDefault) "glob:*.clj") |
| 23:34 | lazybot | java.lang.ClassNotFoundException: java.nio.file.FileSystems |
| 23:34 | allenj12 | Jaood: so like om then |
| 23:35 | justin_smith | old jvms :( |
| 23:35 | allenj12 | michaniskin: hehe pretty great so far :) although only have done a little since we last talked |
| 23:36 | allenj12 | michaniskin: right now im playing with a couple things |
| 23:36 | justin_smith | michaniskin: that looks really cool! |
| 23:36 | justin_smith | (the boot project that is) |
| 23:36 | michaniskin | justin_smith: the actual production version is here: https://github.com/tailrecursion/boot |
| 23:37 | michaniskin | it works, you can try it out! |
| 23:37 | justin_smith | very nice |
| 23:37 | Jaood | I though everyone here was against running clojure script |
| 23:37 | Jaood | s |
| 23:37 | allenj12 | why? |
| 23:37 | clojurebot | why not? |
| 23:37 | Jaood | clojurebot: why yes? |
| 23:37 | clojurebot | Cool story bro. |
| 23:38 | Jaood | clojurebot: thanks |
| 23:38 | clojurebot | the best way to thank your friendly #clojure resident is with (inc nick) |
| 23:38 | Jaood | (inc clojurebot) |
| 23:38 | lazybot | ⇒ 40 |
| 23:38 | justin_smith | haha |
| 23:38 | justin_smith | $karma lazybot |
| 23:38 | lazybot | lazybot has karma 26. |
| 23:38 | michaniskin | justin_smith: you can do cool things like this: https://github.com/tailrecursion/hoplon-demos/blob/master/google-maps/build.boot |
| 23:38 | justin_smith | man, clojurebot is totally winning |
| 23:38 | michaniskin | that's the build script for a hoplon web app thing |
| 23:39 | justin_smith | nice |
| 23:39 | Jaood | michaniskin: is boot meant to be use with external dependecies too? |
| 23:39 | michaniskin | Jaood: boot is a build tool, like leiningen |
| 23:40 | michaniskin | you can use it to pull in external dependencies |
| 23:40 | michaniskin | (set-env! :dependencies '[[foo/bar "0.1.0"]]) |
| 23:40 | Jaood | michaniskin: oh, the was reading just the first about running clojure scripts |
| 23:40 | Jaood | *part |
| 23:41 | Jaood | with the shebang |
| 23:41 | michaniskin | yeah i mean in lisp, all you need for a build tool is a way to run lisp code and bring in dependencies |
| 23:41 | michaniskin | all the build stuff is just functions you can call |
| 23:41 | xeqi | michaniskin: ah, I thought about trying to do some similar container type things with lein and how it handles tool/project seperation |
| 23:41 | xeqi | ended up postponing it due to native deps and possibly something else |
| 23:42 | michaniskin | xeqi: it's tricky. i currently have things talking to each other through sockets and evaling things in repls lol |
| 23:42 | michaniskin | xeqi: i'm not really concerned with native deps i guess |
| 23:43 | xeqi | sockets and evaling? I was leaning towards using classlojure and eval-in-classloader |
| 23:43 | xeqi | ah right |
| 23:43 | xeqi | clojure's namespaces are global |
| 23:43 | michaniskin | xeqi: i started with that route |
| 23:43 | xeqi | *namespace list |
| 23:44 | michaniskin | but i found that things leaked between sibling classloaders |
| 23:44 | michaniskin | and there was no way to communicate upward in the tree without sockets |
| 23:44 | Jaood | nice how all the hoplon demos have a a view live option |
| 23:44 | xeqi | so that made sharing objects between classloaders couldn't keep diffent loaded namespaces seperate |
| 23:44 | michaniskin | like with classlojure the child can't pass messages up to the parent |
| 23:45 | xeqi | yep, just returning |
| 23:45 | hellofunk | re |
| 23:45 | michaniskin | so now i have a master process that starts many children who communicate with each other via sockets and repls |
| 23:46 | Jaood | michaniskin: is hoplon planning on using react? |
| 23:46 | michaniskin | Jaood: it's compatible with react, meaning you can embed react in there if you want |
| 23:47 | michaniskin | but there hasn't been a need so far |
| 23:47 | michaniskin | in my work anyway |
| 23:47 | michaniskin | far more useful to me has been being able to use jquery plugins and things like that |
| 23:48 | michaniskin | Jaood: the dom diffing, virtual dom, and dirty checking isn't necessary with hoplon because of the javelin cells thing |
| 23:49 | michaniskin | cells are evaluated in a dependency graph, which is the alternative to dirty checking |
| 23:51 | Jaood | michaniskin: I see, gonna read on the javelin stuff to understand that approach |
| 23:52 | michaniskin | Jaood: https://github.com/tailrecursion/javelin |