2014-11-29
| 00:46 | kenrestivo | what would be the right clojure data structure to use, for a sliding buffer queue, where i want to look at the last 2 items every time something new is added? |
| 00:47 | kenrestivo | was originally going to use core.async sliding-buffer, but it's not quite right |
| 00:49 | kenrestivo | and i'd like to stay in the safe confines of clojure-land instead of having to read jcip |
| 01:23 | DrCherry | clojure n00b question. Trying to read some data from a txt file into some kind of data structure. anyone around to give me a starting point? |
| 01:24 | andyf | kenrestivo: It doesn't have the nicest Clojure-y API, but Clojure does have queues |
| 01:25 | DrCherry | the data looks like this: http://pastebin.com/M9MHyBVc |
| 01:25 | DrCherry | I'm exploring StructMaps and records which seem like black magick. |
| 01:26 | DrCherry | the data will ultimately be consumed by Factual/geo functions as polygons. |
| 01:27 | andyf | DrCherry: Clojure maps are nice and generic. |
| 01:28 | andyf | They take up more memory than something customized, but if the data set doesn't stress the memory you have available ... |
| 01:28 | DrCherry | looking into maps now. |
| 01:29 | DrCherry | thx, I thought this part would be trivial, lol. |
| 04:11 | hellofunk | is the "g" in leiningen pronounced like "good" or like "giraffe" ? |
| 04:12 | _segfault | hellofunk: giraffe |
| 04:12 | hellofunk | thanks. i've been doing it wrong. |
| 04:28 | rritoch | Is there any way to get the unicode integer value of a character directly without converting it into a string? Character/getNumericValue doesn't seem to work |
| 04:29 | rritoch | ,(map #(.getCodePointAt (str %) 0) "\u04D21234") |
| 04:29 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: getCodePointAt for class java.lang.String> |
| 04:29 | rritoch | ,(map #(.codePointAt (str %) 0) "\u04D21234") |
| 04:29 | clojurebot | (1234 49 50 51 52) |
| 04:29 | rritoch | Tjat |
| 04:29 | rritoch | That is the output I'm expecting |
| 04:30 | SagiCZ1 | and the char is not originally part of a string? |
| 04:31 | rritoch | SagiCZ1: It is part of a string, but I need the values of each character, this is for a cryptography function |
| 04:31 | rritoch | ,(map #(Character/getNumericValue %) "\u04D21234") |
| 04:31 | clojurebot | (-1 1 2 3 4) |
| 04:32 | rritoch | As far as I can tell from the documentation, this getNumericValueshould work, but it isn't returning the correccct values |
| 04:38 | rritoch | I finally found a solution :) |
| 04:38 | TEttinger | ,"\u04D2" |
| 04:38 | clojurebot | "Ӓ" |
| 04:38 | rritoch | ,(map int "\u04D21234") |
| 04:38 | clojurebot | (1234 49 50 51 52) |
| 04:38 | TEttinger | heh yep |
| 04:38 | rritoch | Apparently int does it automatically :) |
| 04:40 | TEttinger | ,(map int "int") |
| 04:40 | clojurebot | (105 110 65279 116) |
| 04:40 | TEttinger | ,[(count "int") (count "int")] |
| 04:40 | clojurebot | [4 3] |
| 04:41 | rritoch | ? |
| 04:41 | rritoch | Did you find a bug or are you using characters that require 32 bits to represent? |
| 04:41 | hellofunk | in emacs, does anyone know how to interrupt/break a running REPL command? I know you can do this in Eclipse with CCW using the "interrupt" feature, but I've never done that successfully in emacs and usually have to restart the REPL. |
| 04:43 | mavbozo | hellofunk: cider-interrupt |
| 04:43 | hellofunk | mavbozo thanks |
| 04:49 | TEttinger | rritoch, invisible chars |
| 04:49 | TEttinger | ,(char (int \ufeff)) |
| 04:49 | clojurebot | \ |
| 04:51 | TEttinger | rritoch: ##(Character/getNumericValue \百) |
| 04:51 | lazybot | ⇒ -1 |
| 04:52 | TEttinger | aww |
| 04:52 | rritoch | Yeah, I have no idea what getNumericValue is supposed to be doing |
| 04:52 | TEttinger | ##(Character/getNumericValue \2) |
| 04:52 | lazybot | ⇒ 2 |
| 04:52 | TEttinger | ##(int \2) |
| 04:52 | lazybot | ⇒ 50 |
| 04:53 | TEttinger | see the difference? |
| 04:53 | rritoch | ,(Character/getNumericValue \A) |
| 04:53 | clojurebot | 10 |
| 04:53 | TEttinger | geNumericValue converts a char that represents a digit to the int value of that digit |
| 04:53 | rritoch | ,(Character/getNumericValue \a) |
| 04:53 | clojurebot | 10 |
| 04:53 | TEttinger | ,(Character/getNumericValue \z) |
| 04:53 | clojurebot | 35 |
| 04:53 | rritoch | Aaah |
| 04:54 | TEttinger | base 36 there |
| 04:54 | TEttinger | it returns -1 if it can't figure out what base it should use or whatever |
| 04:55 | TEttinger | you can specify radix in clojure numbers, which is ##(+ 36rCOOL 36rSTUFF) |
| 04:55 | lazybot | ⇒ 49013568 |
| 05:12 | rritoch | Thats cool, I try to avoid using anything other than base 10 in code, but there are probably some cases where it will help make code more readable when dealing with bitwise operations. |
| 05:13 | SagiCZ1 | ,(Character/getNumericValue \ť) |
| 05:13 | clojurebot | -1 |
| 05:48 | SagiCZ1 | when i have a collection, how can i remove some elements? |
| 05:48 | SagiCZ1 | [:a :b :a :c :d :b] --> remove :a :b --> [:c :d] |
| 05:48 | SagiCZ1 | im not sure if is should make it into a set first |
| 05:50 | SagiCZ1 | yeah i guess i will use set and disj |
| 05:50 | SagiCZ1 | thanks |
| 05:52 | ucb | SagiCZ1: alternatively you can filter the collection |
| 05:53 | SagiCZ1 | ucb: but that would still remove everything, not just the first occurence, so it has the same effect as disjoining set |
| 05:53 | ucb | you never said you wanted to remove just the first occurrence ^_^ |
| 05:54 | SagiCZ1 | ucb: i know.. i am not sure whether i want it or not :) |
| 05:54 | ucb | I was mentioning filter in case you don't want to turn your original collection into a set |
| 05:55 | ucb | but in any case you could do something like (filter (complement #{:a :b}) [:a :b :c :d]) |
| 05:55 | ucb | ,(filter (complement #{:a :b}) [:a :b :c :d]) |
| 05:55 | clojurebot | (:c :d) |
| 05:55 | SagiCZ1 | ,(remove #{:a :b} [:a :b :c :d]) |
| 05:55 | clojurebot | (:c :d) |
| 05:55 | ucb | heh |
| 05:55 | ucb | YES |
| 05:55 | SagiCZ1 | good idea with the predicate |
| 05:55 | SagiCZ1 | very concise |
| 05:55 | ucb | didn't know remove existed :) |
| 06:29 | SagiCZ1 | ,(= (new JFrame) (JFrame.)) |
| 06:29 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: JFrame, compiling:(NO_SOURCE_PATH:0:0)> |
| 06:30 | SagiCZ1 | ,(= (new String) (String.)) |
| 06:30 | clojurebot | true |
| 06:46 | jonathanj | could someone explain the reasoning behind writing HTML in a Lisp DSL (ala hiccup etc) instead of serving an HTML file? |
| 06:49 | geekyvin | Hi Everyone, I am new to clojure and I'm stuck with a small problem.Any help will be appreciated than you. I have a list of map say, [{:name Tom :child {:name Mark :child{:name Jimmy}} } {:name Ben :child {:name John}} {:name Tom :child {:name Lucy}}] it should be converted to something like [{:name Tom :child [{:name Mark :child {:name Jimmy}} {:name Lucy}]} {:name Ben :child [{:name John}] }] |
| 06:49 | geekyvin | I tried a few methods unsuccessfully...could anyone kindly help. |
| 06:50 | SagiCZ1 | geekyvin: hi, i remember you from yesterday |
| 06:50 | geekyvin | yeah...I am still stuck I could not find any significant suggestion yesterday :( |
| 06:51 | SagiCZ1 | it would be better if you could specify the problem more than with just one example |
| 06:52 | geekyvin | basically I have a list of hash-map with nested children I need to merge them but instead of replacing the values for a given key I want it to be added to the existing value |
| 06:53 | SagiCZ1 | geekyvin: let me look into it, but it might take a long time |
| 06:54 | geekyvin | no problem, thanks :) |
| 06:56 | rritoch | SagiCZ1: When using comparables you should use compare instead of =, I had a hard time finding a good example but the following seems to show this fairly clearly |
| 06:56 | rritoch | ,(= (reify Comparable (compareTo [this x] 0)) (reify Comparable (compareTo [this x] 0))) |
| 06:56 | clojurebot | false |
| 06:57 | rritoch | ,(compare (reify Comparable (compareTo [this x] 0)) (reify Comparable (compareTo [this x] 0))) |
| 06:57 | clojurebot | 0 |
| 06:58 | SagiCZ1 | geekyvin: are the names like Tom and Mark variables? |
| 06:58 | geekyvin | no they are values |
| 06:58 | SagiCZ1 | geekyvin: values? containing what? |
| 06:59 | SagiCZ1 | they have to be either strings or symbols |
| 06:59 | SagiCZ1 | this is invalid |
| 06:59 | SagiCZ1 | ,{:name Tom :child nil} |
| 06:59 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: Tom in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 06:59 | geekyvin | string values |
| 06:59 | SagiCZ1 | why do you missing the quotes then? |
| 06:59 | SagiCZ1 | ,{:name "Tom" :child nil} |
| 06:59 | clojurebot | {:name "Tom", :child nil} |
| 06:59 | geekyvin | there should be quotes its just a example. |
| 06:59 | SagiCZ1 | alright |
| 07:03 | SagiCZ1 | geekyvin: sorry i cant wrap my brain around it |
| 07:05 | geekyvin | @SagiCZ1: which part? may be I can elaborate. |
| 07:06 | SagiCZ1 | geekyvin: i think i understand what you need, but i dont think i am able to code it |
| 07:07 | geekyvin | @SagiCZ1: thats ok. I appreciate the effort. thank you :) |
| 07:07 | alhimik45 | hi! what mean #_ here: https://github.com/clojure/clojure/blob/clojure-1.6.0/src/clj/clojure/core.clj#L3044 |
| 07:07 | SagiCZ1 | alhimik45: it comments out the whole sexp |
| 07:08 | SagiCZ1 | forcing the reader to skip it entirely |
| 07:09 | alhimik45 | SagiCZ1: thanks! |
| 07:11 | SagiCZ1 | alhimik45: np |
| 07:31 | rritoch | geekyvin: You should be able to achieve the results you want with reduce. I have a solution but I'm not sure if the line is too long to paste here, working on a reduction of it now |
| 07:36 | rritoch | ,(def data [{:name "Tom" :child {:name "Mark" :child {:name "Jimmy"}}} {:name "Ben" :child {:name "John"}} {:name "Tom" :child {:name "Lucy"}}]) |
| 07:36 | clojurebot | #'sandbox/data |
| 07:36 | rritoch | ,(reduce (fn [f s] (if-let [p1 (first(filter(partial (fn [p1 p2] (= (:name p1) (:name p2)))s)f))] (conj(filterv(partial (fn [p1 p2] (not= (:name p1) (:name p2))) s)f) (if (and (:child p1) (:child s)) (assoc p1 :child (conj(conj [] (:child p1)) (:child s)))p1)) (conj f s))) [] data) |
| 07:36 | clojurebot | [{:name "Ben", :child {:name "John"}} {:name "Tom", :child [{:name "Mark", :child {:name "Jimmy"}} {:name "Lucy"}]}] |
| 07:39 | rritoch | geekyvin: You may need to modify this a bit to more generically deal with child values, but it takes conditional logic to turn single items into lists when combined, and leave them singular otherwise. |
| 08:01 | rritoch | geekyvin: Here is a better version that's less order dependent |
| 08:01 | rritoch | ,(def data [{:name "Tom" :child {:name "Mark" :child {:name "Jimmy"}}} {:name "Ben" :child {:name "John"}} {:name "Tom" :child {:name "Lucy"}}]) |
| 08:01 | clojurebot | #'sandbox/data |
| 08:01 | rritoch | ,(reduce (fn [f s] (if-let [p1 (first(filter(partial (fn [p1 p2] (= (:name p1) (:name p2)))s)f))] (conj(filterv(partial (fn [p1 p2] (not= (:name p1) (:name p2))) s)f) (if (and (:child p1) (:child s)) (assoc p1 :child (conj(conj [] (:child p1)) (:child s))) (if (or (:child p1) (:child s))(assoc p1 :child (or (:child p1) (:child s)))p1))) (conj f s))) [] data) |
| 08:01 | clojurebot | [{:name "Ben", :child {:name "John"}} {:name "Tom", :child [{:name "Mark", :child {:name "Jimmy"}} {:name "Lucy"}]}] |
| 08:13 | OscarZ | i was reading up on core.async.. was wondering would it be good practice to try to implement a web server on core.async ? |
| 08:17 | OscarZ | im not sure if i understood it right.. but is it good for the kind of stuff that in javascript you use promise api for? like on a web server i have a http request, then i want to start 3 async calls to get some results, and when all of the results are ready, then do some next thing etc. ? |
| 08:18 | OscarZ | but with core.async, theres no callbacks like in nodejs |
| 08:37 | alhimik45 | I have clojurescript and clojure code in my project. I have constants which I want to use at clojure and clojurescript side, but I don't want to copy-paste it. How to me require this file in clj and cljs file? http://code.re/6T1 |
| 08:43 | annelies | gfredericks: in your Deutsch–Jozsa example shouldn't you be observing output instead of (first inputs)? |
| 08:44 | annelies | You don't do seem to do anything to output except CNOTting it. |
| 08:46 | gfredericks | annelies: no I think it's correct as is, but definitely counterintuitive |
| 08:46 | gfredericks | annelies: the fact that they're entangled means doing things to one can affect the other |
| 08:51 | gfredericks | annelies: these 3 slides attempt to explain how it works, but I'm not sure if they make much sense standalone: http://upload.gfredericks.com/tmp/qc/qc.html#sec-6-1-1 |
| 08:56 | gfredericks | maybe should have pointed to this slide too for better context: http://upload.gfredericks.com/tmp/qc/qc.html#sec-4-1-2 |
| 08:57 | H4ns | any recommendations for a sql dsl? my db is postgres and i need no portability. jql, slingvo, sqlkorma, something else? |
| 09:01 | gfredericks | H4ns: I use honeysql and don't know anything about the ones you mentioned |
| 09:03 | H4ns | gfredericks: thanks, looks nice. |
| 09:08 | jonathanj | how does one bootstrap a database (ie. the database doesn't exist) with something like korma? |
| 09:08 | SagiCZ1 | does :refer :all refer even private functions? defn- ? |
| 09:11 | gfredericks | SagiCZ1: no |
| 09:12 | gfredericks | jonathanj: probable via whatever raw-sql fallback korma provides |
| 09:13 | jonathanj | bleh |
| 09:13 | jonathanj | maybe ragtime is a better starting point |
| 09:14 | SagiCZ1 | gfredericks: why can i still call the function from other namespace then? |
| 09:17 | gfredericks | SagiCZ1: you shouldn't be able to; maybe giving a more complete example would be helpful |
| 09:18 | SagiCZ1 | gfredericks: ok |
| 09:18 | gfredericks | SagiCZ1: e.g., compare to this I just did: https://www.refheap.com/94173 |
| 09:19 | SagiCZ1 | i think maybe its some bug in my editor |
| 09:19 | SagiCZ1 | btw does anyone know if count on clojure.lang.Cons is O(1) ? |
| 09:20 | gfredericks | I believe it's not |
| 09:20 | gfredericks | ,(doc counted?) |
| 09:20 | clojurebot | "([coll]); Returns true if coll implements count in constant time" |
| 09:20 | gfredericks | ,(counted? "hey") |
| 09:20 | clojurebot | false |
| 09:20 | gfredericks | hrm. |
| 09:20 | SagiCZ1 | cool |
| 09:20 | gfredericks | that's misleading though |
| 09:21 | SagiCZ1 | ,(counted? [:a :b]) |
| 09:21 | clojurebot | true |
| 09:21 | gfredericks | SagiCZ1: in any case I think of the seq-like things only a PersistentList will be counted |
| 09:21 | gfredericks | ,(counted? '(1 2 3)) |
| 09:21 | clojurebot | true |
| 09:21 | gfredericks | ,(counted? (cons :haha '(1 2 3))) |
| 09:21 | clojurebot | false |
| 09:21 | SagiCZ1 | i need the quickest way to find out that a coll contains at least 2 elements.. if one element was enough, i would use (empty? ..) but now i have to use (< 1 (count clusters)) which is overkill.. any idea? |
| 09:22 | gfredericks | (-> coll rest empty?) |
| 09:23 | SagiCZ1 | cool thanks! |
| 09:24 | SagiCZ1 | wow so much faster! i think i knocked it from n^3 to n^2 |
| 09:24 | gfredericks | ha great :) |
| 09:27 | SagiCZ1 | is this true? (-> coll rest empty?) == (empty? (rest coll)) |
| 09:27 | mearnsh | yes |
| 09:28 | SagiCZ1 | thanks |
| 09:31 | gfredericks | does anybody know if there's a ticket or discussion about how misleading counted? is? |
| 09:31 | gfredericks | I could at least update the docstring |
| 09:32 | alhimik45 | I have clojurescript and clojure code in my project. I have constants which I want to use at clojure and clojurescript side, but I don't want to copy-paste it. How to me require this file in clj and cljs file? http://code.re/6T1 |
| 09:34 | gfredericks | alhimik45: have you seen cljx? |
| 09:40 | annelies | gfredericks: is there also a talk with these slides or just the slides? |
| 09:41 | alhimik45 | gfredericks: I am using Hoplon, that uses boot instead lein, but cljx is lein plugin |
| 09:42 | gfredericks | annelies: not a recorded talk |
| 09:42 | gfredericks | alhimik45: ah, that sounds difficult then. |
| 09:42 | gfredericks | maybe there is a hoplon-specific way of doing it |
| 09:43 | annelies | oh ok |
| 09:46 | SirRobin | Hi |
| 09:46 | gfredericks | hi |
| 09:46 | SirRobin | since things like filter<, map< are deprecated in favor of transformers |
| 09:47 | SirRobin | is there an example/article on how to do this nicely? |
| 09:47 | justin_smith | SirRobin: transducers |
| 09:48 | justin_smith | right prefix though |
| 09:48 | mavbozo | SirRobin: what clojure version are you using? |
| 09:48 | SirRobin | the doc says "Use transformer instead", so I thought I'd use that word too |
| 09:48 | justin_smith | oh, weird |
| 09:48 | justin_smith | could be a doc typo? |
| 09:49 | justin_smith | or maybe there is a "transformer" i have yet to hear of |
| 09:49 | SirRobin | I don't think so, I've heard thte term in the context of transducers |
| 09:49 | SirRobin | we're talking about the same thing |
| 09:50 | SirRobin | and I'm using clojurescript "0.0-2371" with core.async "0.1.338.0-5c5012-alpha" |
| 09:51 | justin_smith | SirRobin: this is from martinklepsch, who may even be here :) http://www.martinklepsch.org/posts/using-coreasync-and-transducers-for-direct-s3-upload.html |
| 09:51 | SirRobin | yeah, just found it searching with transducers instead of transformers :) |
| 09:51 | martinklepsch | haha, does the documentation still call them transformers? :) |
| 09:52 | justin_smith | yeah, I think the transducer search term will find better results |
| 09:52 | SirRobin | in core.async, yes |
| 09:53 | mavbozo | martinklepsch: your code is meant for clojure, not clojurescript, right? |
| 09:53 | martinklepsch | SirRobin: depending on what you want to do it might also be worth looking at pipeline-async |
| 09:53 | martinklepsch | mavbozo: clojurescript |
| 09:54 | martinklepsch | I still haven't really come accross a problem where I thought "transducers are the right solution" |
| 09:55 | martinklepsch | recently a guy on twitter asked me about real-world usage of transducers because my post was apparently the only one he found in that direciton |
| 09:55 | justin_smith | martinklepsch: I think most problems where transducers are the right solution are performance problems |
| 09:55 | mavbozo | back to SirRobin question, I think filter> and filter< is deprecated because in clojure 1.7 we can use ordinary filter |
| 09:55 | justin_smith | martinklepsch: that, or you are making a new thing in league with collections or channels, and want cheap map / filter / etc. impl |
| 09:55 | mavbozo | but I don't know about clojurescript |
| 09:56 | justin_smith | mavbozo: yes, you can, because transducers |
| 09:56 | justin_smith | they generalize map / filter over data sources |
| 09:56 | SirRobin | ok right, that makes sense |
| 09:56 | martinklepsch | mavbozo: thanks for keeping this on track, got off a bit I guess :) |
| 09:57 | mavbozo | but what clojurescript version that starts to support ordinary map, filter, etc for tranducers? |
| 09:58 | justin_smith | mavbozo: transducers are a new impl of map, filter etc. |
| 09:58 | justin_smith | as soon as you have transducers, you can use them with channels |
| 09:58 | justin_smith | do you mean, which version of cljs has transducers? |
| 09:58 | mavbozo | justin_smith: yes |
| 10:00 | SagiCZ1 | can gc free up some cache used by memoized function? |
| 10:00 | justin_smith | no |
| 10:01 | SagiCZ1 | well can i set manually the maximum cache for memoized function or at least an expiration date? |
| 10:01 | justin_smith | https://groups.google.com/forum/#!topic/clojurescript/ghpbnZKjx3w mavbozo - here is the announcement of cljs transducers |
| 10:01 | justin_smith | SagiCZ1: things like core.cached can, but regular memoize cannot |
| 10:02 | mavbozo | (inc justin_smith) |
| 10:02 | lazybot | ⇒ 150 |
| 10:02 | justin_smith | I didn't like some of the complexities of core.cached (and some issues with using it with lein) so I made something I thought was simpler - https://github.com/caribou/spawning-grounds |
| 10:03 | mavbozo | then SirRobin can use filter in his clojurescript version |
| 10:03 | SagiCZ1 | justin_smith: cool thanks |
| 10:03 | justin_smith | mavbozo: well, the presence of that warning was a good indicator :) |
| 10:05 | justin_smith | SagiCZ1: much of that README can be ignored unless you want to use spawning-grounds to make a new type of cache. Also, it could be the issues I saw with core.cached are fixed |
| 10:06 | justin_smith | sorry, core.cache https://github.com/clojure/core.cache |
| 10:06 | SagiCZ1 | justin_smith: it looks good and easy to use.. |
| 10:08 | justin_smith | if you mean spawning-grounds - thanks |
| 10:08 | SagiCZ1 | justin_smith: yes thats what i meant |
| 10:08 | justin_smith | I think the api for implementing caches could be cleaner, but I tried to keep the basic caches pretty simple |
| 10:08 | SagiCZ1 | the api seems very powerful though.. |
| 10:09 | justin_smith | that was the goal, yeah |
| 10:10 | SagiCZ1 | im just wondering.. with regular memoize.. is it possible that the cache gets so big, that looking up the parameters in cache takes more time than actually evaluating the memoized function? |
| 10:11 | DrCherry | I'm having trouble with the truthyiess of this test. Why is it failing? http://pastebin.com/Hdqps751 |
| 10:11 | justin_smith | SagiCZ1: regarding you initial question about memoize removing unused items, the timed cache is more about requesting new data from the source after some time, it doesn't clean up it's store |
| 10:12 | justin_smith | SagiCZ1: though it could be modified to do a sweep / purge on each usage |
| 10:12 | DrCherry | whoops let me repost the code |
| 10:12 | SagiCZ1 | justin_smith: i see.. that is different |
| 10:12 | mavbozo | ,(true? (true)) |
| 10:12 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn> |
| 10:12 | justin_smith | SagiCZ1: it's for caching data from a backend |
| 10:12 | justin_smith | mavbozo: true is not a function |
| 10:12 | SagiCZ1 | i understand |
| 10:13 | justin_smith | SagiCZ1: I think the core.cache LRU cache may be closer to what you need |
| 10:13 | mavbozo | justin_smith: oops, dumb copy-paste from DrCherry gist :) |
| 10:13 | DrCherry | http://pastebin.com/pLv8SE9C |
| 10:13 | mavbozo | ,(not (true? '(true)) |
| 10:13 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 10:13 | justin_smith | DrCherry: map will never return true |
| 10:14 | mavbozo | ,(not (true? '(true))) |
| 10:14 | mavbozo | |
| 10:14 | clojurebot | true |
| 10:14 | DrCherry | I'm trying to see if the file is there. |
| 10:14 | justin_smith | &(true? [1 2 3]) |
| 10:14 | lazybot | ⇒ false |
| 10:14 | DrCherry | I'm trying to see if the file is there. |
| 10:14 | justin_smith | then don't use a predicate |
| 10:14 | justin_smith | just use seq |
| 10:14 | SagiCZ1 | justin_smith: and what do you think about the possibilty of the cache getting so big it diminishes the advantages of look up? |
| 10:14 | justin_smith | ,(if (seq []) :yes :no) |
| 10:14 | clojurebot | :no |
| 10:15 | DrCherry | so just drop the true? |
| 10:15 | justin_smith | ,(if (seq [1]) :yes :no) |
| 10:15 | clojurebot | :yes |
| 10:15 | justin_smith | yes |
| 10:15 | justin_smith | haha |
| 10:15 | justin_smith | or you can use not-empty if you feel that makes it more clear |
| 10:15 | justin_smith | but not-empty is not strictly needed |
| 10:15 | justin_smith | ,(not-empty []) |
| 10:15 | clojurebot | nil |
| 10:15 | justin_smith | ,(not-empty [1]) |
| 10:15 | clojurebot | [1] |
| 10:15 | DrCherry | derp |
| 10:16 | mavbozo | &(some? []) |
| 10:16 | lazybot | ⇒ true |
| 10:16 | justin_smith | mavbozo: that's why I used seq or not-empty |
| 10:17 | justin_smith | &(some? (not-empty [])) |
| 10:17 | lazybot | ⇒ false |
| 10:17 | annelies | gfredericks: thanks, I think I get it now except it seems to contradict with http://physics.stackexchange.com/a/2209/1313 |
| 10:18 | annelies | the "the correlation only becomes evident after combining the results from the measurements afterwards" part |
| 10:19 | annelies | Or does this work because the qubits are known to be in state |0⟩ when the algorithm begins? |
| 10:20 | DrCherry | okay, I changed the name of the file to a file that doesn't exist and test doesn't fail |
| 10:23 | gfredericks | annelies: well it certainly relies on them starting at 0, yeah |
| 10:23 | DrCherry | it appears to return an object even if it fails, making it true. |
| 10:24 | annelies | gfredericks: right, and the spin of the pions in the Physics SE answer is unknown unlike the qubit states |
| 10:24 | annelies | thanks a lot! |
| 10:24 | gfredericks | hrm |
| 10:24 | gfredericks | I'm not quite making the connection |
| 10:25 | gfredericks | but one thing to note is that the measurement at the end is deterministic |
| 10:26 | gfredericks | which might be what you meant |
| 10:29 | annelies | Oh I meant electron and positron, not pion. |
| 10:30 | annelies | I should read up on Bell's theorem. |
| 10:43 | DrCherry | So in repl this comes back as (false) as it should: (map #(.exists (clojure.java.io/as-file %)) '("data/gr_neighborhoods.tx")) |
| 10:43 | DrCherry | how do I make test recognize that? |
| 10:44 | DrCherry | I tried wrapping it in (true? ) didn't work. |
| 10:44 | justin_smith | ,(= [false] '(false)) ; DrCherry |
| 10:44 | clojurebot | true |
| 10:45 | DrCherry | justin_smith, I don't exactly understand your syntax |
| 10:45 | justin_smith | ,(some? identity [false]) ; alternatively |
| 10:45 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core/some?> |
| 10:45 | justin_smith | ,(some identity [false]) ; alternatively |
| 10:45 | clojurebot | nil |
| 10:46 | justin_smith | DrCherry: which part don't you understand? |
| 10:46 | DrCherry | justin_smith, how to apply your response to my line of code |
| 10:47 | justin_smith | (= [false] (map ...)) |
| 10:47 | justin_smith | that only works if you know it is only one item |
| 10:47 | justin_smith | and then I wonder why you are mapping at all |
| 10:47 | justin_smith | you could also verify (nil? (some identity (map ...))) |
| 10:47 | DrCherry | (=[false] (map #(.exists (clojure.java.io/as-file %)) '("data/gr_neighborhoods.tx"))) : ok! |
| 10:48 | justin_smith | you are verifying that it returns a collection, with only one item, that is false |
| 10:49 | DrCherry | that passes weather I use [true] or [false] |
| 10:49 | justin_smith | it shouldn't |
| 10:49 | justin_smith | are you using is? |
| 10:49 | DrCherry | nope, let me try that |
| 10:50 | justin_smith | without is, no test is run |
| 10:50 | DrCherry | oh. Is there a good tutorial on test? |
| 10:50 | justin_smith | https://clojure.github.io/clojure/clojure.test-api.html |
| 10:50 | DrCherry | that was it. I had no is |
| 10:51 | DrCherry | this is going to be a long day |
| 10:51 | justin_smith | DrCherry: clojure is worth it though |
| 10:51 | justin_smith | note that the very beginning of the docs for clojure.test is the "is" macro :) |
| 10:51 | DrCherry | Meh, it's just for a job. I'm going to fail this programming test. |
| 10:52 | DrCherry | They gave me an exercise in a language I've never used. |
| 10:52 | bobpoekert | I should be able to import clojure.lang.Murmur3, right? |
| 10:52 | DrCherry | thinking about becoming a gypsy |
| 10:53 | justin_smith | bobpoekert: looks like it, yeah |
| 10:54 | bobpoekert | hm. I get a ClassNotFoundException when I try |
| 10:55 | dbasch | bobpoekert: are you importing it or requiring it? |
| 10:55 | bobpoekert | dbasch: I’m importing it |
| 10:56 | justin_smith | bobpoekert: works for me in a clojure 1.7-alpha3 repl |
| 10:56 | dbasch | &(import 'clojure.lang.Murmur3) |
| 10:56 | lazybot | ⇒ clojure.lang.Murmur3 |
| 10:56 | justin_smith | &(import clojure.lang.Murmur3) |
| 10:56 | lazybot | ⇒ clojure.lang.Murmur3 |
| 10:56 | justin_smith | hehe |
| 10:56 | bobpoekert | weird |
| 10:56 | bobpoekert | must be a version issue |
| 10:56 | dbasch | also works for me on 1.6.0 |
| 10:57 | bobpoekert | this project was originally using 1.4.0, so maybe lein-vimclojure is still using 1.4.0 for some reason |
| 11:01 | dbasch | bobpoekert: what is the value of *clojure-version* ? |
| 11:01 | bobpoekert | dbasch: {:major 1, :minor 5, :incremental 0, :qualifier "RC17"} |
| 11:01 | dbasch | bobpoekert: Murmur3 is from 1.6.0 |
| 11:02 | bobpoekert | yeah |
| 11:02 | bobpoekert | so the question is why is this running under 1.5 |
| 11:02 | bobpoekert | when my project.clj says 1.6 |
| 11:02 | justin_smith | bobpoekert: lein deps :tree |
| 11:02 | justin_smith | one of your deps is overriding your clojure version |
| 11:02 | bobpoekert | [org.clojure/clojure "1.6.0”], it says |
| 11:03 | justin_smith | run lein deps :tree |
| 11:03 | bobpoekert | justin_smith: all of my deps are java libraries |
| 11:03 | bobpoekert | I don’t have any clojure libraries as deps |
| 11:03 | justin_smith | so you are saying when you run the deps tree, it gives you a different version of clojure than the one that runs? |
| 11:03 | bobpoekert | yes |
| 11:04 | bobpoekert | than runs /in vimclojure/ |
| 11:04 | justin_smith | vimclojure uses lein |
| 11:04 | justin_smith | it will use the project.clj |
| 11:04 | justin_smith | unless vimclojure is seriously fucked up... |
| 11:04 | bobpoekert | it’s supposed to |
| 11:04 | bobpoekert | lein repl is using 1.6.0 |
| 11:05 | justin_smith | OK, file a bug with vimclojure I guess |
| 11:05 | justin_smith | do you know the exact command line vimclojure uses to run lein? maybe you can grab it from ps x |
| 11:06 | bobpoekert | justin_smith: good idea |
| 11:06 | justin_smith | it could be they are adding their own middleware that overrides the clojure version |
| 11:06 | redwire | Hello everyone. Is anyone here familiar enough with Clojure's transducers to tell me a bit about whether there is a relation between them and tranditional finite state transducers? |
| 11:07 | gfredericks | honk if you like better docstrings http://dev.clojure.org/jira/browse/CLJ-1607 |
| 11:07 | dbasch | maybe it’s picking up a version of clojure from your classpath or something |
| 11:10 | justin_smith | dbasch: what other than project.clj would be influencing his classpath? |
| 11:10 | bobpoekert | dbasch: it’s definitely adding it. when I delete the jar file for that version it downloads it again when I restart the vimclojure server |
| 11:21 | mattrepl | anyone using a graph/plot library? |
| 11:25 | leandro | why printf prints with leiningen and not in a .jar? this is my simple script http://ur1.ca/ixkpg |
| 11:26 | andyf | leandro: Try putting a (flush) call at the end, or at least after the last printf. printf does not flush for you |
| 11:26 | andyf | println does |
| 11:27 | leandro | yea, but println doesnt allow "%s\n", isnt it? |
| 11:27 | mattrepl | (println (format …)) |
| 11:27 | andyf | If you move the @ from your printf to your format call, you can just do (println (format ...)) as mattrepl suggests |
| 11:27 | leandro | oh, yes |
| 11:28 | andyf | or do (flush) at the end and use printf, or a mix of printf and println |
| 11:28 | leandro | :) |
| 11:28 | leandro | thanks |
| 11:28 | leandro | didn't know about the thing with flush & printf |
| 11:32 | andyf | Yeah, it is not obvious. I just added some notes about it to ClojureDocs.org here: http://clojuredocs.org/clojure.core/printf |
| 11:47 | SagiCZ1 | is there some abstract function like recur or something that lets me modify the source collection? |
| 11:48 | andyf | SagiCZ1: When you say 'let me modify the source collection' do you mean to mutate it? Actually modify something intended to be immutable? |
| 11:48 | SagiCZ1 | something like this (reduce ... [] [1 2 3 4 5 6]), but in the function i need to have the whole second collection, and modify it |
| 11:48 | SagiCZ1 | andyf: no |
| 11:49 | SagiCZ1 | andyf: its something i am able to achieve with regular loop.. im just wondering if there is a nicer way |
| 11:50 | justin_smith | SagiCZ1: what about (reduce f coll coll) |
| 11:50 | gfredericks | SagiCZ1: why not make it part of the "accumulator" arg in your reduce fn? |
| 11:50 | justin_smith | you get the collection as a base case to work with, and also deal with each element individually |
| 11:50 | SagiCZ1 | justin_smith: oh.. interesting |
| 11:51 | SagiCZ1 | justin_smith: i also need to be building a destination collection at the same time though |
| 11:52 | justin_smith | SagiCZ1: OK, (reduce f [coll []] coll) |
| 11:52 | andyf | you can pass an init value to reduce containing as much or little data as you wish, e.g. a map where one of the keys has a value that is the collection, and other keys with other values |
| 11:52 | justin_smith | exactly |
| 11:52 | SagiCZ1 | andyf: i see.. i could do that |
| 11:52 | SagiCZ1 | thank you both |
| 11:53 | justin_smith | SagiCZ1: with the help of destructuring on your reducing function, the parts of the accumulator can even look like separate args |
| 11:54 | SagiCZ1 | the source collection is still passed into the function sequentially right? |
| 11:54 | andyf | The collection that is the last arg to reduce is still stepped through, and your reduce fn called once per element, yes |
| 11:54 | andyf | reduce doesn't know whether the same collection is all or part of the init arg value, and doesn't care. |
| 11:56 | gfredericks | ,(let [xs (range 5)] (reduce conj xs xs)) |
| 11:56 | clojurebot | (4 3 2 1 0 ...) |
| 11:57 | gfredericks | ,(let [xs (range 5)] (pr-str (reduce conj xs xs))) |
| 11:57 | clojurebot | "(4 3 2 1 0 ...)" |
| 11:57 | gfredericks | pff |
| 11:57 | SagiCZ1 | this is refheap of my loop https://www.refheap.com/94174 |
| 11:57 | gfredericks | ,(let [xs (range 5)] (clojure.string/join " " (reduce conj xs xs))) |
| 11:57 | SagiCZ1 | not sure i can use reduce |
| 11:57 | clojurebot | "4 3 2 1 0 0 1 2 3 4" |
| 11:58 | gfredericks | SagiCZ1: depends on what "choose-one" is doing |
| 11:58 | gfredericks | SagiCZ1: are you just trying to pull things out of your collection in a random order? |
| 11:58 | SagiCZ1 | it returns one element from the source collection depending on what the previous chosen was |
| 11:58 | SagiCZ1 | the order is not random.. |
| 11:58 | gfredericks | SagiCZ1: btw (last a-vector) is slower than (peek a-vector) |
| 11:59 | bbloom | SagiCZ1: a loop is fine, but you can also consider reducing where your accumulator is a vector of [x coll] |
| 11:59 | SagiCZ1 | ,(peek [1 2 3]) |
| 11:59 | clojurebot | 3 |
| 11:59 | SagiCZ1 | thanks |
| 11:59 | gfredericks | but yeah the different-order thing probably precludes reduce |
| 12:00 | SagiCZ1 | bbloom: could you elaborate please? i am slow.. |
| 12:01 | gfredericks | bbloom might be lagging |
| 12:01 | bbloom | SagiCZ1: nothing new tha thasn't been said by the others here |
| 12:01 | justin_smith | SagiCZ1: I think you could use reduce if you rewrite choose-one |
| 12:01 | bbloom | dammit. |
| 12:01 | bbloom | wtf? |
| 12:01 | SagiCZ1 | what s |
| 12:01 | gfredericks | bbloom: I take it back |
| 12:01 | bbloom | gfredericks: ping |
| 12:01 | gfredericks | bbloom: pong |
| 12:01 | bbloom | ok... |
| 12:01 | bbloom | i guess i'm ok :-P |
| 12:02 | gfredericks | bbloom: it was a kind of gray case |
| 12:02 | gfredericks | clojurebot: bbloom |lags| sometimes |
| 12:02 | clojurebot | Ok. |
| 12:02 | andyf | SagiCZ1: The first time through your loop, dest is [] and (last dest) is nil. I guess choose-one does something reasonable then? |
| 12:02 | bbloom | gfredericks: but i think i've fixed it :-PP |
| 12:02 | SagiCZ1 | andyf: yeah it was pseudocode, the first thing in dest is chosen randomly from source.. the others always depend on the previous chosen |
| 12:02 | gfredericks | bbloom: okay I'm gonna keep bringing this up every week for the next three years and if we don't have another case of it by then then I'll drop it |
| 12:03 | bbloom | *sigh* |
| 12:11 | grandy | anyone know if there is a way to pass in a map to a yesql query-function (for passing in values for an insert)? |
| 12:12 | grandy | (new to clojure so apologies if this is obvious) |
| 12:12 | justin_smith | SagiCZ1: yeah, if that's the case, there is no pre-determined order of usage of items from source, so reduce won't make sense. Maybe something with iterate / take-last, but that wouldn't be much clearer than loop. |
| 12:15 | justin_smith | grandy: not that I see, but you can construct it using juxt |
| 12:15 | grandy | justin_smith: juxt? |
| 12:15 | justin_smith | ,((juxt :id :name :id) {:id 1 :name "bob"}) |
| 12:15 | clojurebot | [1 "bob" 1] |
| 12:15 | justin_smith | that lets you pass a map, and get specific keys in the order needed |
| 12:16 | grandy | justin_smith: awesome I didn't realize that existed :) |
| 12:16 | justin_smith | then you would (apply your-yesql-fn coll) with that collection |
| 12:16 | justin_smith | and obviously you can use every key in the map 0 or more times as needed |
| 12:16 | grandy | justin_smith: excellent, oh what about the other arg I have to have first (the db spec) ... best practice for including that ? |
| 12:17 | justin_smith | you could make a wrapper function that inserts that automatically, or include it in the map you pass in |
| 12:17 | grandy | justin_smith: ahh ok excellent |
| 12:18 | justin_smith | maybe you want a small helper (defn mapply-db [db] (fn [opts] (apply yesql-fn db ((juxt :keys :to :use) opts)))) |
| 12:18 | grandy | justin_smith: i had thought of doing it with a let binding to allow destructuring and then just wrapping the function call in the let binding, is that bad? |
| 12:19 | justin_smith | not at all |
| 12:19 | justin_smith | just showing how apply / juxt can get you most of the way there |
| 12:19 | grandy | justin_smith: yeah indeed it does, and I think it's a bit more concise in this case |
| 12:21 | martinklepsch | anyone here aware of a small java library that helps with syncing static websites to S3? |
| 12:22 | martinklepsch | thinking of this: https://github.com/laurilehmijoki/s3_website but hopefully more pluggable |
| 12:22 | justin_smith | martinklepsch: no, but clj-aws-s3 is easy to use |
| 12:22 | justin_smith | I guess you probably considered that already, I know you've used clj-aws-s3 |
| 12:23 | martinklepsch | justin_smith: yeah, that could work. was hoping something more specialized existed already :) |
| 12:24 | martinklepsch | also cloudfront stuff in s3_website is useful |
| 12:40 | jjttjj | I keep getting a "clojure.lang.Compiler$CompilerException: java.lang.Exception: No namespace: clojure.core.memoize" when trying to compile. I've narrowed it down to the dependency causing the issue. I think I just need to add an exclusion. How do I figure out what to exclude? I've just been staring at lein deps :tree for a while and trial/error isn't working |
| 12:41 | jjttjj | I think the issue is with mixing this project here: https://github.com/jamesmacaulay/shopify-clj/blob/master/project.clj with pedestal service |
| 12:41 | gfredericks | jjttjj: try `lein deps :tree` and look at the bits at the top |
| 12:44 | bobpoekert | update: upgrading lein and lein-tarsier fixed my clojure version problem |
| 12:48 | jjttjj | gfredericks: I fixed all the lein deps: tree warnings but still having the same issue |
| 12:51 | gfredericks | jjttjj: and you did `lein clean`? |
| 12:52 | jjttjj | gfredericks: yes |
| 12:53 | gfredericks | jjttjj: if you could share your project.clj we could try to reproduce |
| 12:53 | justin_smith | jjttjj: and you have org.clojure/core.memoize in your deps? it isn't part of clojure.core's artifact |
| 12:54 | justin_smith | oh wait, it is contrib, so it isn't even org.clojure |
| 12:54 | jjttjj | justin_smith: I don't have it but im not using it (i guess another dep is though so I'll try adding it) |
| 12:54 | jjttjj | gfredericks: here's the project.clj https://www.refheap.com/94176 |
| 12:55 | justin_smith | clearly if they are not explicitly depending it, but they use it, that would be a reportable bug |
| 12:55 | grandy | would anyone mind critiquing the style of this function for me? i'm new to clojure and building a simple compojure website for a friend as a first project... |
| 12:55 | grandy | https://gist.github.com/anonymous/06326dd2adb3048d14e3 |
| 12:56 | justin_smith | grandy: that if / let combo could be a single when-let |
| 12:56 | justin_smith | err - no, I guess not |
| 12:56 | justin_smith | heh |
| 12:56 | justin_smith | I mean you could shoehorn it |
| 12:57 | grandy | justin_smith: yeah good point |
| 12:57 | justin_smith | anothe option (defn create-user [params] {pre [(b/valid? params user-validator)]} (let ...)) |
| 12:57 | jjttjj | justin_smith: ok adding the core.memoize dep worked! thanks! |
| 12:57 | justin_smith | depending on whether you want an error in that case |
| 12:57 | grandy | justin_smith: ahh interesting |
| 12:57 | justin_smith | jjttjj: you should figure out which project was using core.memoize and file a bug report |
| 12:58 | grandy | justin_smith: i do like the way the pre feels |
| 12:58 | justin_smith | grandy: should that be an error, or just silently nil |
| 12:58 | jjttjj | justin_smith: yup looking into it now |
| 12:58 | justin_smith | because a :pre will trigger an AssertionError |
| 12:58 | weavejes_ | grandy: Why do you have b/validate and v/valid? |
| 12:58 | weavejes_ | Asserts shouldn't be used for validation purposes. |
| 12:59 | weavejes_ | Because a validation fail is not an error. |
| 12:59 | weavejes_ | Preconditions are there for fast failure. |
| 12:59 | grandy | weavejes_: i wanted to validate the data first, and if it's invalid then return the errors map |
| 12:59 | grandy | weavejes_: ahh interesting |
| 12:59 | weavejes_ | grandy: Which library is b/validate from? |
| 13:00 | grandy | bouncer |
| 13:00 | justin_smith | grandy: oh wait, I was mislead by the indentation |
| 13:00 | justin_smith | there are two clauses in that if... |
| 13:01 | grandy | justin_smith: oops hit tab in emacs and fixed it, not sure how that happened :) |
| 13:01 | justin_smith | so yeah, definitely don't want when there |
| 13:01 | grandy | fixed: |
| 13:01 | grandy | https://www.irccloud.com/pastebin/MErdwEfv |
| 13:01 | weavejes_ | If b/validate returns nil if there are no errors, you can only validate once. |
| 13:02 | weavejes_ | Or may only validate once. |
| 13:02 | grandy | weavejes_: true, do you think that is a smarter way to write it? was going for clarity |
| 13:03 | weavejes_ | Hm, the bouncer library is built a little differently to how I'd expect. |
| 13:03 | grandy | weavejes_: ahh also if you recommend a different way to validate data i'd be interested to hear your thoughts |
| 13:03 | weavejes_ | It looks like it doesn't return nil if there are no errors, which is a shame. |
| 13:03 | grandy | weavejes_: yeah that is what i would have expected actually, to allow just one call |
| 13:04 | justin_smith | weavejes_: if it did, you could just do an if-let on the validator, and make the error case the first branch |
| 13:04 | grandy | weavejes_: I think it's done that way so the calls can chained or something... not sure |
| 13:04 | weavejes_ | Right. Then you could just write: (if-let [errors (b/validate params)] ...) |
| 13:05 | grandy | any recommendations for other validation libraries? this one seemed nice but i haven't really done much research on that |
| 13:06 | weavejes_ | I haven't found a validation library that does everything I want to, yet... |
| 13:06 | justin_smith | seems like prismatic/schema would be flexible enough to build whatever |
| 13:06 | weavejester | grandy: Are you just validating URL params? |
| 13:07 | weavejester | Yeah, schema is one solution, but it's not as flexible as I'd like. |
| 13:07 | grandy | hmm interesting, ok i'll look at that one,... weavejester well yeah just putting some validation logic between the web forms and the db |
| 13:07 | SagiCZ1 | can i use apply on interop method? |
| 13:07 | SagiCZ1 | (apply .javaMethod args) |
| 13:07 | weavejester | Some validations are complex. For example, checking to make sure that a password typed twice is the same. |
| 13:07 | justin_smith | SagiCZ1: no, because methods are not first class |
| 13:07 | SagiCZ1 | ok |
| 13:08 | grandy | weavejester: yeah i haven't figured out the best way to handle that case using bouncer yet |
| 13:09 | grandy | schema does look very nice actually |
| 13:10 | weavejester | grandy: You might want to try out the schema/check function |
| 13:11 | grandy | weavejester: ok will check it out (pardon the pun) |
| 13:12 | grandy | weavejester: ahh yeah it looks like the exact behavior i'm looking for |
| 13:12 | weavejester | Ah crap, clojars has failed on a jar upload |
| 13:14 | weavejester | technomancy: Looks like I caught a 500 error in Clojars which resulted in a partially uploaded package: https://clojars.org/generators/lein-template/versions/0.2.2 |
| 13:14 | grandy | weavejester: really liking compojure... thanks much for creating it. |
| 13:14 | weavejester | grandy: You're welcome |
| 13:26 | engblom | Is there any IRC-client written in Clojure? I want to have an IRC-client with spell-checker. As I am wanting to learn Clojure, I could as well take it as a project to add the spell checker to a ready client (unless it already got spell-checker) |
| 13:26 | justin_smith | engblom: lazybot uses irclj |
| 13:27 | justin_smith | oh, you mean like a human usable client with a UI |
| 13:27 | justin_smith | irclj is a client in that it can connect to IRC and communicate with it |
| 13:27 | engblom | I would want something similar to Irssi/Weechat, but written in Clojure |
| 13:28 | justin_smith | engblom: yeah, pretty sure you would have to write that yourself |
| 13:28 | leandro | given a map, i want to acces to ":sunday", but i have the value in a variable "day" how can do (get mymap :day) ? |
| 13:28 | gfredericks | I've heard of precious few terminal UIs written in clojure |
| 13:28 | engblom | OK, bad luck then. I do not have time to write a whole irc client but I could have been modifying an existing one. |
| 13:28 | justin_smith | leandro: ##(let [day :sunday] (get {:sunday "hello"} day)) like this? |
| 13:28 | weavejester | leandro: What does the map look like? |
| 13:28 | lazybot | ⇒ "hello" |
| 13:29 | justin_smith | what do you mean by variable? |
| 13:29 | gfredericks | this is probably the only one I've heard of: https://github.com/maitria/avi |
| 13:29 | metellus | engblom: this doesn't help with the clojure but irssi has a couple spellcheck scripts |
| 13:30 | leandro | i get the day string with clj-time. the map has an index for each weekday |
| 13:30 | engblom | metellus: Those spell-check scripts for irssi are spamming the screen with suggestions, even for nicks. It is not important to see how the word should be spelled, but to know when I spelled a word wrongly. |
| 13:30 | engblom | metellus: Like changing color for badly spelled words. |
| 13:30 | justin_smith | engblom: how about erc and fly-spell? |
| 13:31 | justin_smith | err, flyspell that is |
| 13:31 | justin_smith | I just turned it on, the only issue I see so far is that flyspell is highlighting the ERC> prompt. Otherwise does what I expect. |
| 13:31 | creese | What's the best way to load a dependency when I start cider if I don't have a project? For example, clj-http. |
| 13:32 | engblom | justin_smith: That is what I am using right now, but I would rather have a good irc client than running emacs. Emacs is single threaded and will lock everything while reconnecting. Also it slowly eats a lot of memory. Today I restarted because it went up to 410Mb of RAM. |
| 13:32 | metellus | engblom: the one i use just cycles through spelling options when i press tab. you could modify it to do what you want but that's a whole perl effort rather than clj |
| 13:32 | justin_smith | creese: do you want it to always be available? |
| 13:32 | creese | sure |
| 13:32 | gfredericks | creese: I keep a library for loading deps dynamically |
| 13:32 | justin_smith | creese: I use pallet/alembic (in my .lein/profiles.clj) to load deps at runtime |
| 13:33 | justin_smith | but a lot of things in lein don't make much sense without a project |
| 13:33 | engblom | metellus: What script do you use? |
| 13:34 | metellus | aspell_complete.pl |
| 13:34 | engblom | Thanks |
| 13:36 | creese | justin_smith: even to use pallet/alembic, I need a project right? |
| 13:39 | gfredericks | hey does anybody [not] like utility libs? https://github.com/palletops/lein-shorthand/issues/2 |
| 13:40 | justin_smith | creese: no |
| 13:40 | justin_smith | creese: you can specify deps that should always be present in ~/.lein/profiles.clj |
| 13:40 | rritoch | Does anyone know about this error which I just started getting while compiling after upgrading to clojure 1.7.0-alpha4 : Exception in thread "main" java.lang.IllegalAccessError: tried to access method clojure.lang.RT.classForNameNonLoading(Ljava/lang/String;)Ljava/lang/Class; |
| 13:41 | gfredericks | rritoch: did you need to `lein clean`? |
| 13:41 | justin_smith | rritoch: either you need to run lein clean because of stale compiled artifacts, or you were relying on undocumented internals of clojure that have changed |
| 13:41 | rritoch | Yes, I ran lein do clean, compile |
| 13:42 | justin_smith | I seem to recall you had some hack to compile from a URI |
| 13:43 | rritoch | justing_smith: It has nothing to do with that hack, but I do call (.newInstance (.loadClass .... in the file that is crashing |
| 13:43 | bbloom | gfredericks: i've thought a bit about that problem. i generally don't use utility libs simply b/c they are often of inconsistent quality and extra stuff that i don't particularly want |
| 13:43 | bbloom | gfredericks: i really want to pull in ONE function |
| 13:43 | gfredericks | bbloom: yeah and this would let you do that, with a bit of project.clj noise |
| 13:44 | rritoch | This is the file that's crashing, and it doesn't do much |
| 13:44 | rritoch | https://github.com/rritoch/clj-grid-core/blob/master/src/com/vnetpublishing/clj/grid/lib/grid/jsp/instance_manager.clj |
| 13:44 | bbloom | gfredericks: was talking w/ somebody at clj/nyc too about a sort of utilities database site |
| 13:45 | gfredericks | with some crazy custom dependency resolution thing? :) |
| 13:45 | bbloom | gfredericks: basically idea was you have utility functions that are each in their own little namespace and you make your own (or your company's) utility database and then click a button and get a unified .clj file |
| 13:45 | bbloom | which could of course be part of the build process |
| 13:45 | bbloom | i think it would be super cool to see which utils were popular |
| 13:45 | bbloom | and to get dependency resolution at the def-level, rather than the project level |
| 13:46 | rritoch | Running lein clean doesn't make a difference, it's still crashing |
| 13:46 | bbloom | there's also Joe Armstrong's rant on this: http://lambda-the-ultimate.org/node/5079 |
| 13:46 | bbloom | seems more of a social/community problem than a technical one |
| 13:47 | gfredericks | bbloom: yeah |
| 13:47 | andyf | Not entirely sure, but I believe the annex project is shooting for function-level dependency management. Don't know how far along they are to realizing such a goal. |
| 13:51 | xelxebar | I've got a lazy, but naive, implementation of the sieve of erastothenes, so (take 5 (primes)) returns (2 3 5 7 11) etc. However, when trying to get largish primes it hammers the stack pretty hard: (nth (primes) 2000) produces a StackOverflowException. |
| 13:51 | gfredericks | xelxebar: is it a bunch of filters? |
| 13:52 | xelxebar | just a sec, gonna give you a pastebin, but yeah. |
| 13:53 | gfredericks | yeah I don't know if there's any good way to get that kind of code structure |
| 13:53 | gfredericks | composing a whole bunch of lazy operations inevitably becomes pretty stackful, and since you're presumably using an infinite seq you can't just give up laziness |
| 13:53 | xelxebar | what's a good pastebin for clojure? :P |
| 13:53 | gfredericks | ~paste |
| 13:53 | clojurebot | paste is https://refheap.com/ |
| 13:54 | xelxebar | https://www.refheap.com/94179 |
| 13:54 | kenrestivo | i think "we need letrec" would make a good t-shirt design |
| 13:54 | ricky_ | -/nick ricky_____ |
| 13:55 | justin_smith | kenrestivo: letfn isn't good enough? |
| 13:55 | kenrestivo | or like a protest, occupy kids on the street, with signs that say "we need letrec!" |
| 13:55 | justin_smith | kenrestivo: or you need it for recursive values, not just recursive functions? |
| 13:55 | kenrestivo | justin_smith: i'm referring to that joe armstrong post |
| 13:55 | kenrestivo | http://lambda-the-ultimate.org/node/5079 |
| 13:55 | kenrestivo | letfn works just fine in clojure, yes. |
| 13:56 | kenrestivo | in fact someone showed me a very cool technique for avoiding nested lets by using letfn |
| 13:56 | gfredericks | xelxebar: so are you still wondering why you get the exception? |
| 13:57 | xelxebar | gfredericks: well, I abstractly get why we're hammering the stack, but I was wondering if there's a good way to not do that. |
| 13:58 | xelxebar | Here, I also hacked together a sieve that finds the nth prime |
| 13:58 | xelxebar | https://www.refheap.com/94180 |
| 13:58 | xelxebar | And well, it's horrendously ugly. |
| 13:59 | gfredericks | xelxebar: I feel like this doesn't tend to show up in other programming problems. you can do something a little more manual with the lazy-seq macro wherein you keep a set of the primes so far and just check each one explicitly |
| 13:59 | xelxebar | Yeah, that's pretty much what the nth-prime func is doing. |
| 14:00 | gfredericks | I'll whip up a lazy-seq version that might be instructive |
| 14:00 | ricky_____ | If anyone has a chance, I'm having some get-metadata-from-ref problems @ http://pastebin.com/xdFuQVn5 |
| 14:00 | xelxebar | Thanks! |
| 14:01 | gfredericks | xelxebar: it's a different style of recursion so it's useful to see the difference |
| 14:01 | rritoch | justin_smith: Just to test I commented out the Compiler/compile function and it didn't make a difference. The odd part is this is crashing during loading |
| 14:02 | rritoch | Exception in thread "main" java.lang.IllegalAccessError: tried to access method clojure.lang.RT.classForNameNonLoading(Ljava/lang/String;)Ljava/lang/Class; from class com.vnetpublishing.clj.grid.lib.grid.kernel$loading__5295__auto____15, compiling:(instance_manager.clj:1:1) |
| 14:03 | rritoch | Is there now a block that you can't load child dependencies? |
| 14:04 | rritoch | I have another library that depends directly on the kernel and that compiled without a problem. |
| 14:04 | weavejester | ricky_____: You're trying to get metadata from vars that don't exist, not from refs. |
| 14:05 | weavejester | ricky_____: There's a distinction between a var and the data contained within it. |
| 14:05 | justin_smith | yeah, instead of using a macro to try to access a var, why not pass the var to the function? or attach the metadata to the account? or use a map which includes account info instead of a number in the ref |
| 14:05 | weavejester | #(do (def ^{:owner "foo"} v {:bar "baz}) (meta v)) |
| 14:06 | weavejester | ##(do (def ^{:owner "foo"} v {:bar "baz}) (meta v)) |
| 14:06 | gfredericks | xelxebar: https://www.refheap.com/94183 |
| 14:06 | weavejester | &(do (def ^{:owner "foo"} v {:bar "baz}) (meta v)) |
| 14:06 | lazybot | java.lang.RuntimeException: EOF while reading string |
| 14:06 | weavejester | &(do (def ^{:owner "foo"} v {:bar "baz"}) (meta v)) |
| 14:06 | lazybot | java.lang.SecurityException: You tripped the alarm! def is bad! |
| 14:06 | gfredericks | I tried to do a larger example of nth but it took too long :) |
| 14:06 | weavejester | ,(do (def ^{:owner "foo"} v {:bar "baz"}) (meta v)) |
| 14:06 | clojurebot | nil |
| 14:06 | xelxebar | gfredericks: cool. taking a look |
| 14:06 | weavejester | ,(do (def ^{:owner "foo"} v {:bar "baz"}) (meta #'v)) |
| 14:06 | clojurebot | {:ns #<Namespace sandbox>, :name v, :file "NO_SOURCE_PATH", :column 0, :line 0, ...} |
| 14:06 | rritoch | I was able to fix this compile error simply by adding the dependency directly, is this a bug in clojure? |
| 14:07 | rritoch | Until upgrading I had no problem accessing dependencies of dependencies. |
| 14:08 | gfredericks | xelxebar: could be a bit confusing since there's logically two different collections of primes involved |
| 14:08 | ricky_____ | weavejester: OK. Trying to "get it," but just started trying the concurrency stuff last night and it seems like a lot to take in. |
| 14:09 | justin_smith | ricky_____: this isn't about concurrency though |
| 14:09 | weavejester | ricky_____: Well, vars are essentially pointers to values. |
| 14:09 | xelxebar | gfredericks: cool! |
| 14:09 | weavejester | ricky_____: So if I (def x 1), then if I type x it automatically gets the value. |
| 14:10 | ricky_____ | OK |
| 14:10 | weavejester | ricky_____: It's essentially the opposite behaviour of refs |
| 14:10 | xelxebar | I had to look up what some did |
| 14:10 | weavejester | ricky_____: With a ref, you deref with @, and if you don't deref you get the ref itself, right? |
| 14:10 | weavejester | ricky_____: With vars, they're derefed automatically, and if you want to get the var itself, you use #' |
| 14:11 | xelxebar | gfredericks: I really like this! Thanks for taking the time to whip that up. |
| 14:11 | weavejester | ricky_____: You want to add metadata to the refs themselves, right? Not the vars? |
| 14:11 | ricky_____ | Ahhh, yeah! |
| 14:11 | gfredericks | xelxebar: np |
| 14:12 | weavejester | ricky_____: The ^ form attaches metadata at compile time. Runtime metadata can be added with with-meta |
| 14:12 | gfredericks | xelxebar: normally you don't have to stoop to using the lazy-seq macro directly, but lazy prime computation is kind of special |
| 14:12 | weavejester | ricky_____: So (with-meta (ref 100) {:owner "foo"}) to attach metadata, and meta to detach it. |
| 14:13 | weavejester | Or read it, rather |
| 14:13 | weavejester | ,(let [r (with-meta (ref 100) {:owner "foo"})] (meta r)) |
| 14:13 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Ref cannot be cast to clojure.lang.IObj> |
| 14:13 | weavejester | Huh... Refs aren't IObjs? |
| 14:13 | justin_smith | in general, representing the bank account as a map makes sense though, and you can have a :value key for the numeric value contained |
| 14:13 | xelxebar | gfredericks: Do you mean that usually we can just bank on the laziness of core functions and stuff? |
| 14:13 | xelxebar | gfredericks: And what makes primes special here? |
| 14:14 | gfredericks | xelxebar: it's unusual to take a collection and call filter on it *over and over and over* |
| 14:14 | weavejester | ricky_____: Looks like you might need to do something like: {:owner "foo", :value (ref 100)} instead |
| 14:14 | gfredericks | as long as you're just using a handful of transformation functions you should be fine |
| 14:14 | gfredericks | there's a related gotcha with repeated use of concat, which people run into pretty frequently |
| 14:15 | justin_smith | weavejester: why not (ref {:owner "foo" :value 100}) ? |
| 14:16 | ricky_____ | I would guess so the owner can't change? |
| 14:16 | ricky_____ | Depends if that's desired or not. |
| 14:16 | weavejester | justin_smith: I assumed the owner of the ref was fixed, but yep, you could do it like that. |
| 14:16 | justin_smith | ricky_____: it's easy to change metadata, and changing metadata isn't even thread safe |
| 14:17 | weavejester | justin_smith: When isn't it thread safe? |
| 14:17 | weavejester | with-meta obviously is, and I thought vary-meta! was as well... |
| 14:17 | xelxebar | gfredericks: hmmm. do you mean like if you concat an expensive-to-calculate eager seq to the head of a lazy one? |
| 14:18 | xelxebar | gfredericks: makes me wonder how lazy concated to eager works... |
| 14:19 | xelxebar | I'd guess that you keep getting lazily evaluated stuff until you hit the head of the eager seq. |
| 14:19 | gfredericks | xelxebar: no it's only a problem if you concat repeatedly |
| 14:19 | gfredericks | ,(->> (range 10000) (map list) (reduce concat) (last)) |
| 14:19 | clojurebot | #<StackOverflowError java.lang.StackOverflowError> |
| 14:19 | gfredericks | xelxebar: note that ^that involves 10000 calls to concat |
| 14:20 | xelxebar | gfredericks: noob question: what is the ->> , I'm guessing a macro? |
| 14:20 | gfredericks | yeah |
| 14:21 | gfredericks | ,(last (reduce concat (map list (range 10000)))) ;; same thing |
| 14:21 | clojurebot | #<StackOverflowError java.lang.StackOverflowError> |
| 14:21 | xelxebar | cute |
| 14:22 | ricky_____ | weavejester and justin_smith: The map-based approach looks like the way to go, so I'm going to give it a shot. Thanks for the help. |
| 14:22 | xelxebar | gfredericks: ->> feels like do notation in Haskell |
| 14:22 | gfredericks | it's definitely used about as often |
| 14:23 | gfredericks | at least if you include -> |
| 14:24 | justin_smith | weavejester: oh, you're right, they both return a new object |
| 14:30 | gfredericks | xelxebar: I just realized mine would be slightly more efficient with a vector for primes-so-far instead of a list |
| 14:30 | gfredericks | so that you check the smaller ones first |
| 14:30 | xelxebar | oh? let me look at that |
| 14:31 | xelxebar | I was just checking out how fast it was compared to my shitty nth-prime |
| 14:31 | gfredericks | it should be assymptotically the same |
| 14:31 | gfredericks | we're ignoring all sorts of numeric optimisations of course |
| 14:33 | kenrestivo | this crossclj has become indispensible. i have to wonder where the source code is for it though? does it use codeq? datomic? |
| 14:33 | kenrestivo | also, if it's not open source, maybe i shouldn't get used to it, otherwise soon it'll start demanding $10/month subscription fee or similar |
| 14:39 | xelxebar | gfredericks: what's a good way to profile clojure code? |
| 14:40 | xelxebar | I don't get why the vector would be more efficient... |
| 14:41 | gfredericks | xelxebar: criterium |
| 14:41 | gfredericks | xelxebar: the difference is which end of the collection conj adds to |
| 14:41 | gfredericks | ,(conj '(1 2 3) :zoo) |
| 14:41 | clojurebot | (:zoo 1 2 3) |
| 14:41 | gfredericks | ,(conj [1 2 3] :zoo) |
| 14:41 | clojurebot | [1 2 3 :zoo] |
| 14:42 | gfredericks | which in turn determines whether you're starting with big primes or small primes when calling `some` |
| 14:42 | gfredericks | obviously starting with small primes is faster in aggregate |
| 14:42 | gfredericks | your original filter algorithm gets this right |
| 14:47 | xelxebar | gfredericks: Thanks. I sort of just assumed that the compiler behaved as expected and it would be better to mod small primes. What's actually going on under the hood is still quite mysterious to me. |
| 14:50 | gfredericks | your expectation is different from what I described? |
| 14:51 | gfredericks | I was talking about a distinction that would be way over any compiler's head |
| 15:00 | xelxebar | I think we're talking about the same thing. Cutting out multiples of small primes first cuts out more numbers up front. |
| 15:02 | xelxebar | I'm just not sure how the code actually is getting evaluated and so just have some unspecified feeling that the compiler might be doing something that will go counter to what I expect. |
| 15:04 | gfredericks | well in my code there's a collection called `primes-so-far` which is what it uses to check divisibility |
| 15:05 | gfredericks | and the order it checks in depends on the order of that collection |
| 15:05 | gfredericks | if the collection has smaller primes up front, that's what you're checking first, and vice versa |
| 15:06 | justin_smith | xelxebar: for a functional language, clojure has a very simple compiler, most of the optimization work (other than smart design of datatypes and algorithms up front) is done by the jvm JIT compiler |
| 15:06 | rritoch | This is odd, I found a second solution to the compilation error I was getting. After checking the classpath generated by leiningen I realized that the wrong version of clojure was being used so adding the latest version of clojure to the dependencies also repairs the compile error. |
| 15:10 | rritoch | I believe that since there were gen-classes in the dependencies which were produced by 1.7.0-alpha4 when something caused 1.5.1 to load instead, it could no longer use the namespaces from 1.7.0-alpha4 |
| 15:56 | hiredman | java.nio.channels.ClosedChannelException |
| 15:57 | hiredman | pardon me |
| 15:58 | bbloom | clojure.irc.channels.WrongChannelError |
| 18:05 | gfredericks | ~ping |
| 18:05 | clojurebot | PONG! |
| 18:08 | andyf | clojurebot plays a mean game of table tennis |
| 18:08 | justin_smith | $ping |
| 18:08 | lazybot | justin_smith: Ping completed in 0 seconds. |
| 18:09 | gfredericks | ,(println "$ping") |
| 18:09 | clojurebot | $ping\n |
| 18:09 | gfredericks | ,(print "$ping") |
| 18:09 | clojurebot | $ping |
| 18:09 | lazybot | clojurebot: Ping completed in 0 seconds. |
| 18:09 | clojurebot | Excuse me? |
| 18:09 | gfredericks | nice |
| 18:09 | justin_smith | oh no... |
| 18:10 | llasram | yay! |
| 18:10 | llasram | Let the cross-bot games resume! |
| 18:11 | gfredericks | there wouldn't happen to be an existing lib with an instaparse grammar for jvm regexes would there? |
| 18:11 | gfredericks | I don't need a complete one |
| 18:11 | gfredericks | cuz I'm about to make my own otherwise |
| 18:12 | andyf | after your getting the bots talking to each other, and then asking that question, it sounds like a kid who just set off his first model rocket in the back yard without permission asking where the gas station is. |
| 18:12 | andyf | umm.... no reason. |
| 18:13 | gfredericks | it's just a 3-msg chain that doesn't suggest any method for getting anything longer |
| 18:13 | gfredericks | no reason to call the botcops |
| 18:15 | andyf | I'd check crossclj.info for uses of instaparse |
| 18:15 | lazybot | gfredericks: too late, you're in trouble now |
| 18:16 | justin_smith | andyf: someone really should |
| 18:16 | andyf | or even batbot |
| 18:17 | andyf | The vigilante bot |
| 18:17 | justin_smith | the bot #clojure deserves |
| 18:20 | gfredericks | Looking forward to testing this with test.check by generating random strings and filtering on passing the regex parser. no way that'll be efficient. |
| 18:20 | gfredericks | I guess and can special case just the things that make it unlikely to pass, like parethesis balancementhood |
| 18:20 | andyf | Skew test.check's string generation to have 15% backslash characters and you'll get coverage faster :) |
| 18:21 | gfredericks | yeah was gonna get a list of special chars and give'em a boost |
| 18:29 | gfredericks | huh; including /resources with a library means you should probably namespace things |
| 18:29 | gfredericks | andyf: thanks can I have chocolate next time |
| 18:31 | andyf | sure |
| 18:42 | SagiCZ1 | how do i peek into transient vector? |
| 18:43 | SagiCZ1 | ,(peek (transient [1 2 3])) |
| 18:43 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentVector$TransientVector cannot be cast to clojure.lang.IPersistentStack> |
| 18:43 | SagiCZ1 | ,(peek [1 2 3]) |
| 18:43 | clojurebot | 3 |
| 18:43 | andyf | SagiCZ1: Operations allowed on transients are quite limited |
| 18:44 | SagiCZ1 | but i just want a little peek! |
| 18:44 | andyf | Have you tried (vec (dec (count vec))) ? |
| 18:44 | SagiCZ1 | how should that work |
| 18:45 | SagiCZ1 | oh |
| 18:45 | SagiCZ1 | i see how |
| 18:45 | SagiCZ1 | sorry |
| 18:45 | SagiCZ1 | will try |
| 18:45 | andyf | seems to work |
| 18:45 | SagiCZ1 | yup |
| 18:46 | SagiCZ1 | not getting the speed up they promised in the doc.. :< |
| 18:46 | SagiCZ1 | it probably wasnt the bottleneck |
| 18:50 | alpheus | Is Clojurescript on-topic here? |
| 18:50 | SagiCZ1 | alpheus: yes |
| 18:51 | pllx | alpheus: what is clojurescript used for? |
| 18:52 | alpheus | clojurescript is clojure compiled to javascript, through Google closure. |
| 18:53 | alpheus | I'm failing to get a browser repl working. Some of the advice on the web suggests removing ~/.m2/repository, which sounds kind of drastic to me. |
| 18:53 | SagiCZ1 | alpheus: try to rename it if you dont want to remove it altogether |
| 19:00 | alpheus | OK, I did, and now my browser connects. |
| 19:01 | alpheus | That feels a lot like the Windows solution, but I guess I'd accumulated a lot of cruft. |
| 19:01 | gfredericks | xelxebar: I just made this "optimized" version out of curiosity and it was like 30 times faster |
| 19:02 | gfredericks | using an internal mutable data structure and primitives |
| 19:02 | gfredericks | (i.e., no number-theory tricks) |
| 19:02 | gfredericks | it's sooper ugly though |
| 19:02 | gfredericks | https://www.refheap.com/94188 |
| 19:14 | TEttinger | gfredericks, I wonder how that would (or could it?) compare to a version using transients |
| 19:14 | gfredericks | I think it could; it feels like an icky use of transients to me though |
| 19:14 | gfredericks | since you never convert them back |
| 19:14 | gfredericks | I don't have a specific reason why that would be bad |
| 19:15 | gfredericks | I'll go write it |
| 19:15 | SagiCZ1 | is there a way to remove first key and value from sorted map? |
| 19:15 | SagiCZ1 | rest returns a sequence.. not the map |
| 19:16 | gfredericks | yeah |
| 19:16 | gfredericks | what does first give you? |
| 19:16 | SagiCZ1 | key value pair in vector |
| 19:16 | TEttinger | remove the key? |
| 19:17 | TEttinger | (doc remove) |
| 19:17 | clojurebot | "([pred] [pred coll]); Returns a lazy sequence of the items in coll for which (pred item) returns false. pred must be free of side-effects. Returns a transducer when no collection is provided." |
| 19:17 | TEttinger | hm no |
| 19:17 | gfredericks | (doc dissoc) |
| 19:17 | clojurebot | "([map] [map key] [map key & ks]); dissoc[iate]. Returns a new map of the same (hashed/sorted) type, that does not contain a mapping for key(s)." |
| 19:17 | TEttinger | (inc gfredericks) |
| 19:17 | lazybot | ⇒ 111 |
| 19:17 | SagiCZ1 | i want this {:a 0 :b 1 :c 2} to become this {:b 1 :c 2} |
| 19:17 | andyf | SagiCZ1: dissoc |
| 19:17 | SagiCZ1 | i cant dissoc, i dont know what the first key is |
| 19:17 | gfredericks | TEttinger: looks a little bit slower |
| 19:18 | gfredericks | SagiCZ1: you can get the key from the key value pair, no? |
| 19:18 | gfredericks | (doc key) |
| 19:18 | clojurebot | "([e]); Returns the key of the map entry." |
| 19:18 | andyf | SagiCZ1: (dissoc sorted-m (key (first sorted-m))) |
| 19:18 | bbloom | ,(ffirst (sorted-map 1 2 3 4)) |
| 19:18 | TEttinger | ,(let [sm (sorted-map :a 0 :b 1 :c 2)] (dissoc sm (ffirst sm))) |
| 19:18 | clojurebot | 1 |
| 19:18 | clojurebot | {:b 1, :c 2} |
| 19:18 | SagiCZ1 | ,(apply sorted-map (flatten (rest (sorted-map :a 0 :b 1 :c 3)))) |
| 19:18 | clojurebot | {:b 1, :c 3} |
| 19:18 | SagiCZ1 | this is what i want |
| 19:18 | SagiCZ1 | looks ugly though |
| 19:18 | gfredericks | ,(def my-map (sorted-map :a 0 :b 1 :c 3)) |
| 19:18 | clojurebot | #'sandbox/my-map |
| 19:18 | gfredericks | ,(dissoc my-map (key (first my-map))) |
| 19:18 | clojurebot | {:b 1, :c 3} |
| 19:19 | gfredericks | SagiCZ1: ^^ |
| 19:19 | SagiCZ1 | ok i must say that does look better |
| 19:19 | dbasch | ,(let [m (sorted-map :a 0 :b 1 :c 2)] (dissoc m (ffirst m))) |
| 19:19 | clojurebot | {:b 1, :c 2} |
| 19:19 | SagiCZ1 | thank you |
| 19:19 | dbasch | oh, already there |
| 19:19 | TEttinger | yep |
| 19:19 | SagiCZ1 | thank you all |
| 19:19 | TEttinger | no prob |
| 19:19 | dbasch | SagiCZ1: avoid flatten btw |
| 19:19 | TEttinger | yes |
| 19:19 | TEttinger | ~flatten |
| 19:19 | clojurebot | flatten is rarely the right answer. Suppose you need to use a list as your "base type", for example. Usually you only want to flatten a single level, and in that case you're better off with concat. Or, better still, use mapcat to produce a sequence that's shaped right to begin with. |
| 19:19 | SagiCZ1 | oh gosh |
| 19:20 | SagiCZ1 | i know i know i know.. |
| 19:20 | SagiCZ1 | was just throwing it out |
| 19:20 | SagiCZ1 | ;) |
| 19:20 | SagiCZ1 | flatten haters |
| 19:20 | TEttinger | ,(into (sorted-map) (rest (sorted-map :a 0 :b 1 :c 3))) |
| 19:20 | clojurebot | {:b 1, :c 3} |
| 19:21 | TEttinger | does the same thing without flattening nesting |
| 19:21 | hyPiRion | could just do conj on it |
| 19:21 | SagiCZ1 | ,(sorted-map) |
| 19:21 | clojurebot | {} |
| 19:21 | SagiCZ1 | ,(empty sorted-map) |
| 19:21 | clojurebot | nil |
| 19:21 | hyPiRion | ,(conj (sorted-map) (rest (sorted-map :a 0 :b 1 :c 3))) |
| 19:21 | clojurebot | {:b 1, :c 3} |
| 19:21 | SagiCZ1 | um |
| 19:22 | metellus | ,(empty? (sorted-map)) |
| 19:22 | clojurebot | true |
| 19:22 | SagiCZ1 | what is empty for then? |
| 19:22 | metellus | ,(doc empty) |
| 19:22 | clojurebot | "([coll]); Returns an empty collection of the same category as coll, or nil" |
| 19:22 | hyPiRion | ,(empty [1 2]) |
| 19:22 | clojurebot | [] |
| 19:22 | hyPiRion | ,(empty (sorted-map 1 2)) |
| 19:22 | clojurebot | {} |
| 19:22 | SagiCZ1 | so its when you have FULL collection and want an empty coppy of the same type? |
| 19:23 | metellus | ,(empty "s") |
| 19:23 | clojurebot | nil |
| 19:24 | hyPiRion | yess |
| 19:24 | SagiCZ1 | metellus: :( |
| 19:24 | dbasch | ,(coll? “s”) ; SagiCZ1 |
| 19:24 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: “s” in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 19:25 | dbasch | &(coll? “s”) |
| 19:25 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: “s” in this context |
| 19:25 | dbasch | stupid smart quotes |
| 19:25 | SagiCZ1 | ,(coll? "s") |
| 19:25 | clojurebot | false |
| 19:25 | dbasch | ,(coll? (seq "s")) |
| 19:25 | clojurebot | true |
| 19:27 | SagiCZ1 | if i do this on an atom, the (count @a) has to be unchanged right? |
| 19:27 | SagiCZ1 | (do |
| 19:27 | SagiCZ1 | (swap! a #(dissoc % (first %))) |
| 19:27 | SagiCZ1 | (swap! a assoc key val)) |
| 19:28 | hyPiRion | SagiCZ1: no – key may already be present in a. |
| 19:29 | SagiCZ1 | that way the count would lower by one correct? |
| 19:29 | SagiCZ1 | it keeps increasing |
| 19:30 | dbasch | SagiCZ1: why would you do two swaps? |
| 19:30 | TEttinger | also, SagiCZ1, you want ffirst to get the first element of the first pair |
| 19:31 | TEttinger | (doc ffirst) |
| 19:31 | clojurebot | "([x]); Same as (first (first x))" |
| 19:31 | SagiCZ1 | TEttinger ok so its probably not removing anything |
| 19:31 | SagiCZ1 | dbasch: enjoyin mutability i guess? |
| 19:31 | dbasch | SagiCZ1: but two swaps defeats the purpose of swap |
| 19:31 | dbasch | if you're going to swap atomically, swap atomically |
| 19:32 | SagiCZ1 | dbasch: then they are two atomic swaps |
| 19:32 | TEttinger | (swap! a #(do (dissoc % (ffirst %)) (assoc % key val))) |
| 19:32 | dbasch | SagiCZ1: which is silly |
| 19:32 | hyPiRion | TEttinger: what |
| 19:33 | TEttinger | technicaly atomic? |
| 19:33 | TEttinger | remember, this is dissocing a different key than it is associng to |
| 19:34 | dbasch | SagiCZ1: it's like opening a drawer to put in a pair of socks, closing it, and then opening it again to remove another pair of socks |
| 19:34 | hyPiRion | TEttinger: what you wrote is equal to (swap! a #(assoc % key val)) |
| 19:34 | TEttinger | ah, right dammit |
| 19:34 | hyPiRion | You probably meant (swap! a #(-> (dissoc % (ffirst %)) (assoc key val))) |
| 19:34 | SagiCZ1 | #(assoc (dissoc % (ffirst %)) key val) ? |
| 19:35 | SagiCZ1 | dbasch: thank tou for the explanation |
| 19:35 | SagiCZ1 | makes sense |
| 20:21 | Morgawr | ,(str "test") |
| 20:21 | clojurebot | "test" |
| 20:22 | Morgawr | ,(sort-by (comp :z second) (complement compare) { :one {:z 1} :two {:z 0} :three {:z 10} :four {:z 5}}) |
| 20:22 | clojurebot | ([:one {:z 1}] [:three {:z 10}] [:four {:z 5}] [:two {:z 0}]) |
| 20:22 | Morgawr | what am I doing wrong? |
| 20:22 | Morgawr | ,(sort-by (comp :z second) { :one {:z 1} :two {:z 0} :three {:z 10} :four {:z 5}}) |
| 20:22 | clojurebot | ([:two {:z 0}] [:one {:z 1}] [:four {:z 5}] [:three {:z 10}]) |
| 20:22 | Morgawr | ^ this works |
| 20:22 | Morgawr | why does inverting the comparison function (using complement) doesn't reverse the order? |
| 20:23 | Morgawr | oh.. compare returns -1, 0 and 1, not true/false.. nevermind |
| 21:17 | kenrestivo | this smells bad ##(apply concat (conj '([1 0] [3 2]) '(4 5))) |
| 21:17 | lazybot | ⇒ (4 5 1 0 3 2) |
| 21:28 | justin_smith | kenrestivo: is ##(apply concat '(4 5) '([1 0] [3 2])) an option? |
| 21:28 | lazybot | ⇒ (4 5 1 0 3 2) |
| 21:29 | kenrestivo | that's simpler, thanks. the apply concat still bothers me a bit though. |
| 21:29 | justin_smith | it's the best way to concatenate items of a collection |
| 21:36 | Morgawr | kenrestivo: what about ##(concat '(4 5) (flatten '([1 0] [3 2]))) |
| 21:36 | lazybot | ⇒ (4 5 1 0 3 2) |
| 21:37 | kenrestivo | yeah, i was tryin to avoid flatten too |
| 21:37 | Morgawr | I mean, it's not that different but it shows the intent in the code |
| 21:37 | Morgawr | alright |
| 21:37 | Morgawr | D: |
| 21:37 | justin_smith | (dec flatten) |
| 21:37 | lazybot | ⇒ -6 |
| 21:38 | Morgawr | what's bad about flatten? |
| 21:38 | justin_smith | ~flatten |
| 21:38 | clojurebot | flatten is rarely the right answer. Suppose you need to use a list as your "base type", for example. Usually you only want to flatten a single level, and in that case you're better off with concat. Or, better still, use mapcat to produce a sequence that's shaped right to begin with. |
| 21:38 | kenrestivo | the first time i used flatten i got something like [\w \t \f \ \h \a \p \p \e \n \e d] and gave up ever using it again |
| 21:38 | Morgawr | ahah ok, fair enough |
| 21:38 | Morgawr | thanks justin_smith |
| 21:38 | justin_smith | kenrestivo: Morgawr: even better ##(flatten {:a 0 :b 1}) |
| 21:38 | lazybot | ⇒ () |
| 21:38 | justin_smith | lol |
| 21:39 | kenrestivo | wat? |
| 21:39 | justin_smith | inorite |
| 21:39 | Morgawr | well, it does look more flat |
| 21:39 | kenrestivo | what could be flatter than an empty list? |
| 21:39 | kenrestivo | maybe nil |
| 21:39 | Frozenlock | o_O |
| 21:39 | metellus | why does that happen? |
| 21:40 | Morgawr | ,(flatten '()) |
| 21:40 | clojurebot | () |
| 21:40 | Frozenlock | ##(-> {:a 1} first flatten) |
| 21:40 | lazybot | ⇒ (:a 1) |
| 21:40 | Frozenlock | ##(-> {:a 1} flatten) |
| 21:40 | lazybot | ⇒ () |
| 21:40 | kenrestivo | ,(flatten :pancake) |
| 21:40 | clojurebot | () |
| 21:40 | metellus | ##(flatten {}) |
| 21:40 | lazybot | ⇒ () |
| 21:40 | Frozenlock | (╯°□°)╯︵ ┻━┻ |
| 21:40 | justin_smith | &(flatten (seq {:a 0 :b 1})) |
| 21:40 | lazybot | ⇒ (:b 1 :a 0) |
| 21:40 | metellus | ##(flatten (seq {:a 1 :b 2{) |
| 21:40 | kenrestivo | things that are not flattenable return empty list? hmm. |
| 21:40 | Morgawr | ,(flatten [1 2 3 4])) |
| 21:40 | clojurebot | (1 2 3 4) |
| 21:40 | Morgawr | heh |
| 21:40 | metellus | beaten by typing speed and syntax errors |
| 21:41 | justin_smith | ,(flatten "hello, world!") |
| 21:41 | clojurebot | () |
| 21:41 | Morgawr | t-t-thanks clojure |
| 21:41 | metellus | ,(doc flatten) |
| 21:41 | clojurebot | "([x]); Takes any nested combination of sequential things (lists, vectors, etc.) and returns their contents as a single, flat sequence. (flatten nil) returns an empty sequence." |
| 21:41 | kenrestivo | has anyone compiled a list of clojure wat's? there are only a handful IIRC |
| 21:42 | Morgawr | my favorite is |
| 21:42 | Morgawr | ,(str (map + [1 2 3 4 5])) |
| 21:42 | clojurebot | "clojure.lang.LazySeq@1c3e4a2" |
| 21:42 | Morgawr | every time |
| 21:43 | kenrestivo | mapv ftw |
| 21:44 | kenrestivo | laziness, yeah, there's a whole class of those |
| 21:44 | godd2 | .(str (doall (map + [1 2 3 4 5]))) |
| 21:44 | kenrestivo | like... why does my code work in the repl but not in production |
| 21:44 | godd2 | ,(str (doall (map + [1 2 3 4 5]))) |
| 21:44 | clojurebot | "clojure.lang.LazySeq@1c3e4a2" |
| 21:44 | kenrestivo | ,(str (mapv + [1 2 3 4 5])) |
| 21:44 | clojurebot | "[1 2 3 4 5]" |
| 21:45 | justin_smith | ,(pr-str (map + [1 2 3 4 5])) |
| 21:45 | clojurebot | "(1 2 3 4 5)" |
| 21:46 | TEttinger | ,(pr-str (map inc (range))) |
| 21:46 | clojurebot | "(1 2 3 4 5 ...)" |
| 21:46 | godd2 | ,(doall str (doall (map + [1 2 3 4 5])))) |
| 21:46 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.core$str cannot be cast to java.lang.Number> |
| 21:46 | Morgawr | ,(apply str (map inc [1 2 3 4 5])) |
| 21:46 | clojurebot | "23456" |
| 21:47 | godd2 | wait, whose threw an exception |
| 21:47 | Morgawr | yours |
| 21:47 | godd2 | oh miner |
| 21:47 | justin_smith | godd2: yeah (doall str ...) makes no sense |
| 21:47 | godd2 | ,(doall (str (doall (map + [1 2 3 4 5])))) |
| 21:47 | clojurebot | "clojure.lang.LazySeq@1c3e4a2" |
| 21:47 | Morgawr | ,(let [str 1] (doall str (map inc [1 2 3 4]))) |
| 21:47 | clojurebot | (2 3 4 5) |
| 21:47 | Morgawr | ^ this made sense |
| 21:47 | Morgawr | ;) |
| 21:47 | justin_smith | haha |
| 22:46 | gfredericks | guys I've been using clojure for 18 years and I had no idea that do{all,run} took a second arg. |
| 22:56 | fairuz | gfredericks: Clojure is that old? |
| 22:59 | gfredericks | ~clojure |was invented by| C++ |
| 22:59 | clojurebot | You don't have to tell me twice. |
| 23:00 | jeremyheiler | huh |
| 23:00 | justin_smith | ~clojure |
| 23:00 | clojurebot | clojure can make the Kessel Run in under twelve parsecs. |
| 23:01 | justin_smith | OK, but can it calculate a prime number in under a millimeter? |
| 23:02 | gfredericks | I sure hope so |
| 23:03 | kenrestivo | is there a way in schema to have an either key that is exclusive? i.e. :foo OR :bar is required but both together are disallowed? |
| 23:03 | gfredericks | kenrestivo: pred at worst |
| 23:04 | kenrestivo | suppose, could just write a fn |
| 23:04 | gfredericks | kenrestivo: and I bet if you glance at the impl of `either` it'd be straightforward to implement the xeither you want |
| 23:04 | kenrestivo | it does some pretty hairy tree walking |
| 23:04 | gfredericks | those dang hairy trees |
| 23:05 | kenrestivo | not to mix metfers |
| 23:05 | kenrestivo | anyway, will ponder, thanks |
| 23:06 | justin_smith | https://www.google.com/search?q=hairy+tree&safe=on&espv=2&biw=1263&bih=954&source=lnms&tbm=isch&sa=X&ei=Npd6VK3REcSuogT9vYKQBQ&ved=0CAYQ_AUoAQ hairy trees |
| 23:28 | kenrestivo | that's not a tree, that's a graph |
| 23:30 | emaczen | does anyone here know how to configure a MongoDB database for a luminus project? |
| 23:31 | Balveda-2 | There's an automatic configuration for that |
| 23:31 | Balveda-2 | like, for when you make a project in leiningen |
| 23:32 | emaczen | yes if you do +mongo it sets up a 'db' folder with a default mongo connection |
| 23:32 | emaczen | lein new app +mongo |
| 23:32 | emaczen | It works when I test in the REPl, so I am very lost... |
| 23:33 | Balveda-2 | What is your problem exactly? |
| 23:34 | emaczen | Balveda: Are you familiar with luminus projects? |
| 23:36 | emaczen | Balveda-2: Are you familiar with luminus projects? |
| 23:36 | Balveda-2 | Sort of |
| 23:37 | emaczen | When you run "lein ring server," It will open up a browser and point you it to "localhost:3000/" |
| 23:37 | emaczen | On that page, there is a message that says: "MongoDB configuration is required" |
| 23:38 | emaczen | Under that it says "add the connection parameters in a .db.core" |
| 23:39 | emaczen | ^^ I did that too -- and tested it in the REPL |
| 23:39 | uris77 | newbie question, how can I load a properties file in clojure? I'm coming from java/groovy and writing my first clojure web app. Normally, I'd have a .env file that is just a property file with credentials for database, etc. When I deploy to heroku, those creds are just environment variables. But in development, I read the credentials from the .env file when the application boots up, and set them as property variables. What is the idiomatic way to do this in |
| 23:42 | Balveda-2 | Weird, the db core file has a config built in iirc |
| 23:43 | emaczen | Balveda-2: What is iirc? |
| 23:43 | Balveda-2 | if i recall correctly |
| 23:52 | justin_smith | uris77: you can use interop pretty easily, if you have specific questions about how the top answer here works, feel free to ask |
| 23:52 | justin_smith | http://stackoverflow.com/questions/7777882/loading-configuration-file-in-clojure-as-data-structure here, I mean |
| 23:59 | uris77 | sweet, thank you @justin_smith |