2015-11-06
| 01:57 | jonathanj | how do i run my tests with cider? |
| 01:57 | jonathanj | M-x cider-test-run-tests doesn't actually seem to have done anything |
| 03:08 | jonathanj | in Python there is a count() function that returns an iterator that produces a number one greater than the last: counter = count(); print next(counter); print next(counter) # => 0 1 |
| 03:08 | jonathanj | i thought this would be straightforward in clojure but apparently not so, do i need to use an atom? |
| 03:09 | jonathanj | (i'm writing code where i can replace the function that generates IDs, so i can replace (uuid/v4) with something predictable) |
| 03:09 | Kneiva | ,(take 10 (iterate inc)) |
| 03:09 | clojurebot | #error {\n :cause "Wrong number of args (1) passed to: core/iterate"\n :via\n [{:type clojure.lang.ArityException\n :message "Wrong number of args (1) passed to: core/iterate"\n :at [clojure.lang.AFn throwArity "AFn.java" 429]}]\n :trace\n [[clojure.lang.AFn throwArity "AFn.java" 429]\n [clojure.lang.AFn invoke "AFn.java" 32]\n [sandbox$eval25 invokeStatic "NO_SOURCE_FILE" 0]\n [sandbox$eva... |
| 03:09 | jonathanj | Kneiva: i think you need a starting value |
| 03:10 | jonathanj | Kneiva: but so i'm not quite sure how you turn that into something that when *called* produces the next value |
| 03:10 | Kneiva | ,(take 10 (iterate inc 0)) |
| 03:10 | clojurebot | (0 1 2 3 4 ...) |
| 03:13 | jonathanj | i think this is what i want: (defn count [n] (let [counter (atom n)] #(swap! counter inc))) |
| 03:15 | Kneiva | ah, of course |
| 03:16 | Kneiva | but do you need the state? |
| 03:16 | jonathanj | well, i want to be able to pass a value in place of (uuid/v4) and get predictable results |
| 03:16 | jonathanj | (constantly 5) would do something but unfortunately then it's a bit hard to verify identity |
| 03:18 | jonathanj | i don't know how else to write it |
| 04:13 | McDougal | Is clojure mature for web dev or is the community more focused on data processing, machine learning, etc? |
| 04:14 | powered | clojurescript is an solid choice for web dev |
| 04:14 | powered | lots of libraries are available |
| 04:15 | McDougal | Thats for front end, I was thinking ref server side |
| 04:20 | the_nonameguy | gfredericks: thx! |
| 04:21 | qsys | server side: clojure, surely mature enough, client side: (compiled) clojurescript. |
| 04:24 | qsys | ring seems to be popular for server side stuff, I like vert.x, which is something very different (and for the latest version, clojure is not supported yet, although it's rather easy to just call clojure from Java) |
| 04:24 | McDougal | gsys: Is clojure more performant on vertx? |
| 04:24 | McDougal | Ho about security in clojure web apps? |
| 04:26 | the_nonameguy | this is the most common lib for that: https://github.com/cemerick/friend |
| 04:28 | qsys | 'more performant' looks somewhat euh... vague. clojure is very performant, so it depends what you're planning. I wouldn't say 'more performant'. I'm just used to using vert.x and never tried ring (and such). |
| 04:29 | qsys | compojure is another one, by the way: http://www.lispcast.com/what-web-framework-should-i-use |
| 04:30 | qsys | so well, the usual problem: you have (too many?) choices :p |
| 04:31 | McDougal | Thankyou, I'l try out compujure as a starting point |
| 04:31 | the_nonameguy | it really depends on what you are trying to achieve |
| 04:32 | qsys | or just google web dev clojure :) http://www.luminusweb.net/ |
| 04:32 | qsys | so yeah, what d'you want to do? |
| 04:55 | powered | is there a shorter way to do: (map (fn [a b] [a b]) coll-a coll-b) ? |
| 04:58 | danneu | powered: (map vector coll-a coll-b) |
| 04:59 | powered | thanks that makes sense |
| 05:04 | danneu | McDougal: i recommend compojure. simple layer built on top of Ring. check out `lein new compojure hello-world` to generate a small boilerplate to work off of |
| 05:21 | mpenet | There are a lot of very performant/flexible ring based adapters, just pick what you like best depending on your needs |
| 05:22 | mpenet | for raw "perf" numbers, they were a few benchmark where some clj adapters were tested and they were doing very good |
| 05:24 | mpenet | ex: netty or undertow based adapters seems to shine in these kind of benchmarks |
| 05:25 | mpenet | Then you can use compojure or whatever framework you want, as long as it's ring compatible. |
| 05:37 | owlbird | how to solve module circular dependencies? (app.a/f1) call (app.b/f1), and (app.b/f1) call (app.a/f2) ? |
| 05:38 | oddcully | ,(doc declare) |
| 05:38 | clojurebot | "([& names]); defs the supplied var names with no bindings, useful for making forward declarations." |
| 05:41 | mpenet | wont work accross namespaces with vars that call each other |
| 05:41 | oddcully | ah didn't pay attention to that |
| 05:42 | mpenet | you need to refactor your code so this doesn't happen |
| 05:42 | oddcully | so the answer to that is: fix your code? |
| 05:42 | mpenet | yup, it's very often a code smell anyway |
| 05:43 | owlbird | By putting all functions in one ns, and name them like a-f1, a-f2, b-f2 ? |
| 05:43 | AeroNotix | or a third module with the dependencies of both, if you can |
| 05:43 | mpenet | that |
| 05:45 | starlord | could someone recommend a good websocket client library? Aleph perhaps? |
| 05:46 | mpenet | aleph or jet both have decent jvm based clients |
| 05:46 | starlord | great, thanks! |
| 05:49 | the_nonameguy | Sente has a client: https://github.com/ptaoussanis/sente |
| 05:51 | mpenet | only js based for the client part if I recall tho |
| 06:20 | thangappan | I tried to connect clojure web application with mysql database but it's not working..iam new to clojure.Do anyone know this? |
| 06:21 | tripleclones | hi, any recommendations on finding freelance devs who work with clojure? |
| 06:24 | mavbozo | thangappan, how it didn't work? please provide more context such as used library, error stacktrace |
| 06:24 | oddcully | thangappan: "is not working" is a wide field. could put the error/exception on refheap? |
| 06:31 | xeqi | tripleclones: If you're looking for someone locally I'd start at a meetup, otherwise post an ad on https://groups.google.com/forum/#!forum/clojure, in here, or at http://clojurians.net in the jobs room. |
| 06:33 | tripleclones | xeqi thanks i'll get it together and post here cheers. |
| 06:52 | qsys | tripleclones: local or not? I might be interested :p. |
| 07:07 | tripleclones | qsys doesnt have to be local |
| 07:11 | dnolen | ClojureScript 1.7.170 released! https://groups.google.com/forum/#!msg/clojurescript/AiCARjGT2Mg/J2TdxtHgBAAJ |
| 07:24 | gfredericks | dnolen: I just upgraded cljs in the test.check codebase to see if anything would happen -- afaict, the dev build went fine and the test passed, but then the advanced build crashed |
| 07:25 | dnolen | gfredericks: you really should trying pre-releases if I mention those :) |
| 07:25 | dnolen | gfredericks: but I'm skeptical at the moment - lots of people ran the pre-releases on non-trivial projects without issue. |
| 07:26 | gfredericks | yeah it might just be something about the config in test.check |
| 07:26 | gfredericks | or me running on a really old node? |
| 07:26 | dnolen | to debug advanced builds |
| 07:26 | dnolen | :pseudo-names true :pretty-print true |
| 07:27 | dnolen | it should be pretty clear what the code is breaking on then. |
| 07:27 | dnolen | gfredericks: also are you using cljsbuild to build? |
| 07:27 | gfredericks | yeah |
| 07:27 | dnolen | the post above is very clear about needing to use edge tooling for this release |
| 07:27 | gfredericks | oh okay sorry |
| 07:27 | gfredericks | disregard |
| 07:36 | gfredericks | dnolen: yeah it all passes w/ the cljsbuild snapshot |
| 07:37 | dnolen | gfredericks: cool |
| 07:50 | gfredericks | would love feedback from test.check users about this; am planning on working on it today http://dev.clojure.org/jira/browse/TCHECK-81 |
| 08:16 | Glenjamin | gfredericks: as (bind) is arguably more complex anyway, i'd be tempted to only sugar (fmap)? |
| 08:16 | Glenjamin | i dunno whether it's because of the name, but i always do custom generators as an fmap over an existing generator |
| 08:21 | gfredericks | Glenjamin: bind is necessary for some things, and it's what you expect as a user from a variant of let |
| 08:21 | gfredericks | (because let lets (ha!) you use previous bindings (ha!) which implies bind) |
| 08:44 | Glenjamin | Oh, gen/let wouldn't behave like let unless it used bind? |
| 08:45 | Glenjamin | The examples you provided look great, I guess the whole point is I no longer care if it's bind or fmap |
| 08:50 | gfredericks | right -- and that's actually the one thing that feels messy to me from a design perspective, so I care about how useful it would be to real users |
| 08:50 | gfredericks | it feels messy because of this, which I guess I should link to in the ticket: https://brehaut.net/blog/2013/duck_wrapping |
| 08:51 | gfredericks | oh wait I already did |
| 08:51 | gfredericks | wtg past me |
| 09:37 | Glenjamin | gfredericks: don't think of it as fmap/bind, think of it as "i want a generator that does this please" |
| 09:38 | Glenjamin | does fmap generalise to bind? could it just always bind? |
| 09:44 | hyPiRion | Glenjamin: Yes. fmap f coll = coll >>= (return . f) |
| 09:48 | tomjack | is an om.next query like [{:foo [:bar1]} {:foo [:bar2]}] a user error? |
| 11:36 | soleado | I get an error, "contains? not supported on type: clojure.lang.LazySeq" passing the results of `(doall (map #(f %) coll)`. Why is that? I thought `doall` realizes the lazy sequence? |
| 11:38 | soleado | e.g. `(contains? (doall (map inc [1 2 3])) 1)` |
| 11:39 | justin_smith | soleado: contains? isn't supported on lazy-seq, it doesn't do what you probably think it does |
| 11:39 | justin_smith | soleado: contains? only works on the keys of associative types, and seqs are not associative |
| 11:39 | justin_smith | ,(contains? [:a :b :c] 1) |
| 11:39 | clojurebot | true |
| 11:39 | justin_smith | because it has an item at index 1 |
| 11:39 | justin_smith | ,(contains? [:a :b :c] :a) |
| 11:39 | clojurebot | false |
| 11:40 | justin_smith | because it has no index keyed by :a |
| 11:40 | justin_smith | ,(.contains [:a :b :c] :a) |
| 11:40 | clojurebot | true |
| 11:40 | justin_smith | that's a java method, and actually checks if the collection has an = item, and is probably what you want |
| 11:41 | soleado | I understand and I'd be happy with this result: |
| 11:41 | soleado | (contains? [:a :b :c] :a) |
| 11:41 | justin_smith | soleado: :a is not a key on a vector |
| 11:41 | justin_smith | so it does not contain it, according to contains? |
| 11:41 | justin_smith | contains? does not check contents, only associative keys |
| 11:42 | justin_smith | which is why (contains? [:a :b :c] 1) returns true - it has an item at key 1 |
| 11:42 | soleado | justin_smith: thanks, I understand, but that's not what I'm asking |
| 11:43 | justin_smith | what are you asking? |
| 11:43 | soleado | my question is why I'm getting a "lazy-seq not supported" error instead of a true/nil |
| 11:43 | justin_smith | soleado: lazy-seqs don't have keys |
| 11:43 | justin_smith | they are not associative collections |
| 11:43 | justin_smith | so contains? can't do anything with them |
| 11:44 | justin_smith | I think it would be better if contains? had a different name, like "has-key?" |
| 11:44 | justin_smith | but too late for that now |
| 11:44 | sdegutis | ,(sort-by (juxt (comp - first) second) [[1 2] [2 1] [3 3] [2 3] [3 2]]) |
| 11:44 | clojurebot | ([3 2] [3 3] [2 1] [2 3] [1 2]) |
| 11:44 | sdegutis | Cool. |
| 11:45 | oddcully | soleado: doall just realizes the whole thing. but it does not change the type |
| 11:45 | oddcully | at least that is my interpreation of things |
| 11:46 | oddcully | soleado: if you want contains? in the way described, maybe do an (into [] (map...)) instead? |
| 11:49 | soleado | So nevermind `contains?` :-) Why is this still a LazySeq? `(doall (map keyword ["a" "b" "c"]))` |
| 11:49 | justin_smith | doall doesn't change the type |
| 11:50 | snowell | justin_smith: Especially since I am constantly wanting to do (contains? [2 4 6] 2) |
| 11:50 | snowell | Which will return true in that case, but for entirely the wrong reason |
| 11:51 | justin_smith | snowell: (.contains [2] 2), of course |
| 11:51 | snowell | ...I'll just be over here |
| 11:51 | mavbozo | justin_smith, i thought core.async has 2 thread pools. the pool with 42 + x for c.a/go and the unbounded pool for c.a/thread . I was wrong again. |
| 11:52 | justin_smith | mavbozo: right, but I wasn't using thread :P |
| 11:52 | justin_smith | mavbozo: but that is the tool that solves my problem, of course |
| 11:54 | bluezone | THANKS A LOT GUYS. Now I can't sleep anymore. Every time I close my eyes I see parenthesis all over the place :( Language is too sexy for my eyes |
| 11:57 | mavbozo | justin_smith, yeah, c.a/thread doesn't make differences in your mongo case either |
| 11:57 | {blake} | bluezone: The real shift comes when you STOP seeing parentheses. Then you'll know you're One Of Us. |
| 11:57 | justin_smith | mavbozo: right, well, it makes it slightly less painful but does not solve it |
| 11:59 | justin_smith | now I am doing an audit of our usage of core.async, and seriously considering replacing mongo with a table in postgres with a string key and byte-array value, and encoding that byte-array with transit :P |
| 12:36 | Glenjamin | justin_smith: i think that's a solid plan: mongo query perf is pretty bad on unindexed keys, so it's not like you can really actually query the json properly |
| 12:37 | Glenjamin | although new postgres i think has json column, json functions and function indexes |
| 12:53 | the_nonameguy | is it possible to write a fn with an example use like this? |
| 12:53 | the_nonameguy | (source-2 clojure.lang.Keyword clojure.lang.IFn) |
| 12:53 | the_nonameguy | which would display the protocols implementation for the given type |
| 12:54 | the_nonameguy | like source does for plain fn-s |
| 13:03 | {blake} | How does Clojure not have an .indexOf for vectors? |
| 13:06 | justin_smith | ,(.indexOf [:a :b :c] :b) ; {blake} |
| 13:06 | clojurebot | 1 |
| 13:07 | {blake} | justin_smith: That's not Clojure. =P |
| 13:07 | justin_smith | {blake}: that's clojure |
| 13:07 | gfredericks | weelllll |
| 13:07 | gfredericks | ,(.indexOf [1 2 3] 2N) |
| 13:07 | clojurebot | 1 |
| 13:07 | gfredericks | hmm |
| 13:07 | {blake} | Heh. |
| 13:08 | gfredericks | ,(.indexOf [1N 2N 3N] 2) |
| 13:08 | clojurebot | 1 |
| 13:08 | gfredericks | how does that wark |
| 13:08 | justin_smith | gfredericks: equality |
| 13:08 | justin_smith | ,(= 1 1N) |
| 13:08 | clojurebot | true |
| 13:08 | gfredericks | oh I forgot this was clojure.lang code being run |
| 13:08 | gfredericks | for some reason |
| 13:08 | justin_smith | gfredericks: see, it's clojure |
| 13:08 | gfredericks | yeah okay it's all fine |
| 13:09 | justin_smith | if it didn't use a .equals or .equiv defined by clojure, then I'd agree it wasn't clojure |
| 13:09 | {blake} | justin_smith: It's invoking a Java object method, yes? Wouldn't work in ClojureScript? Might or might not work in .NET? |
| 13:10 | justin_smith | {blake}: sure, but that's the case for much of the language |
| 13:10 | {blake} | I mean, there's a clojure.string/capitalize, fercryinoutloud. |
| 13:11 | {blake} | So, I'm surprised by the absence of an index-of. |
| 13:11 | gfredericks | I think you're supposed to not want to use it |
| 13:11 | gfredericks | but I still want to use it sometimes |
| 13:12 | {blake} | gfredericks: What, .indexOf? Well, I'm open to alternatives. Given a symbol, I want to cycle to the next item in the collection (with wrapping). |
| 13:12 | {blake} | This is user driven. |
| 13:15 | strtok | anyone using the clj-slackbot? i get java.security.AccessControlException when trying. |
| 13:16 | gfredericks | {blake}: sometimes there are alternate data structures. like it sounds like you could easily create a map that tells you what the next thing is |
| 13:16 | gfredericks | ,(def things '[item1 item2 item32 item5]) |
| 13:16 | clojurebot | #'sandbox/things |
| 13:17 | gfredericks | ,(def next-item (->> things (concat things) (partition 2 1) (take (count things)) (into {}))) |
| 13:17 | clojurebot | #error {\n :cause "clojure.lang.Symbol cannot be cast to java.util.Map$Entry"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to java.util.Map$Entry, compiling:(NO_SOURCE_FILE:0:0)"\n :at [clojure.lang.Compiler$InvokeExpr eval "Compiler.java" 3661]}\n {:type java.lang.ClassCastException\n :message "clojure... |
| 13:17 | {blake} | gfredericks: Yeah. I actually did that the other day. It just seems like more work than should be necessary. |
| 13:17 | gfredericks | {blake}: the upside is you don't have to think about indexes |
| 13:17 | gfredericks | why the hell didn't my code work |
| 13:17 | {blake} | I always have this problem with SQL, too. Sometimes order is significant. |
| 13:18 | gfredericks | we're still dealing with ordering |
| 13:18 | gfredericks | just not indexes |
| 13:18 | gfredericks | ,(def next-item (->> things (concat things) (partition 2 1) (take (count things)))) |
| 13:18 | clojurebot | #'sandbox/next-item |
| 13:18 | gfredericks | ,next-item |
| 13:18 | clojurebot | ((item1 item2) (item2 item32) (item32 item5) (item5 item1)) |
| 13:18 | gfredericks | oh vectors |
| 13:18 | gfredericks | thanks conj |
| 13:18 | gfredericks | ,(def next-item (->> things (concat things) (partition 2 1) (map vec) (take (count things)))) |
| 13:18 | clojurebot | #'sandbox/next-item |
| 13:18 | gfredericks | ,next-item |
| 13:18 | clojurebot | ([item1 item2] [item2 item32] [item32 item5] [item5 item1]) |
| 13:18 | gfredericks | baaah |
| 13:18 | {blake} | lol |
| 13:18 | gfredericks | ,(->> things (concat things) (partition 2 1) (map vec) (take (count things)) (into {})) |
| 13:18 | clojurebot | {item1 item2, item2 item32, item32 item5, item5 item1} |
| 13:18 | {blake} | Friday |
| 13:18 | gfredericks | there we go |
| 13:19 | gfredericks | so it's easy to make a map like that one, and to do it in a way where you never refer to indexes |
| 13:19 | {blake} | gfredericks: Yeah, it's not bad. I'm just not sure I buy this indexes-considered-harmful stuff. =P |
| 13:19 | gfredericks | yeah I'm on the fence |
| 13:20 | gfredericks | they don't seem necessary for this case though; and my code even handles the cycling in a less special-casey kind of way |
| 13:20 | {blake} | It also seems processor intensive. The way I did this--I forget who put this in the chat--but it was with an order function: (zipmap s (range)). |
| 13:21 | {blake} | It's slick but I'm just making a map every time. |
| 13:21 | gfredericks | that should be the same amount of work as mine |
| 13:21 | gfredericks | mine just makes a map |
| 13:22 | {blake} | Right. So why wouldn't I just use a map, other than feeling that a vector should be treatable as a map? I can say nth, after all, so why not itemth? |
| 13:25 | mgaare_ | ,(zipmap (drop-last things) (drop 1 things)) |
| 13:25 | clojurebot | {item1 item2, item2 item32, item32 item5} |
| 13:25 | mgaare_ | oh but you want a cycle |
| 13:29 | mgaare | ,(zipmap things (-> things (rest) (vec) (conj (first things))) |
| 13:29 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 13:29 | mgaare | doh |
| 13:29 | mgaare | well, that's the idea |
| 13:30 | {blake} | mgaare: So, just add it to the back when we run out? Heh. |
| 13:30 | TEttinger | ,(nth (cycle things) 15) |
| 13:30 | clojurebot | #error {\n :cause "Unable to resolve symbol: things in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: things in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6704]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: things in t... |
| 13:31 | TEttinger | ,(def things '[item1 item2 item32 item5]) |
| 13:31 | clojurebot | #'sandbox/things |
| 13:31 | TEttinger | ,(nth (cycle things) 15) |
| 13:31 | clojurebot | item5 |
| 13:31 | mgaare | ahhh cycle, of course |
| 13:31 | TEttinger | infinite lazy seq |
| 13:31 | mgaare | might be a little nicer to use |
| 13:32 | mgaare | ,(zipmap things (rest (cycle things))) |
| 13:32 | clojurebot | {item1 item2, item2 item32, item32 item5, item5 item1} |
| 13:33 | {blake} | ,things |
| 13:33 | clojurebot | [item1 item2 item32 item5] |
| 13:33 | kungi | How can I split build configurations for lein cljsbuild in dev and production. Production should be activated when compiling an uberjar. |
| 13:34 | mgaare | ah, and just using cycle handles the original request more elegantly too |
| 13:35 | Glenjamin | is there anything in core I can use to put vars / locals in a map with keys of the same name? |
| 13:35 | Glenjamin | (??? name key val) -> {:name name :key key :val val} |
| 13:37 | mgaare | I don't think so, but you could do something like #(zipmap (map keyword %) %) |
| 13:43 | noncom | justin_smith: oh wow, core async + mongo sabotage |
| 13:43 | {blake} | justin_smith: Oh, yeah, did you get that figured out? |
| 13:43 | noncom | i even afraid to imagine what you had to go through to find that out... |
| 13:44 | {blake} | It was a mix of async and mongo? *gets nervous* |
| 13:45 | justin_smith | heh |
| 13:45 | justin_smith | noncom: yourkit, it's like magic |
| 13:46 | justin_smith | mgaare: I think Glenjamin wants the name of the binding mapped to the bound value - iirc something in flatland/useful does this |
| 13:46 | Glenjamin | of course, flatland/useful does everything :) |
| 13:46 | justin_smith | Glenjamin: I think this does what you want https://github.com/flatland/useful/blob/develop/src/flatland/useful/map.clj#L9 |
| 13:47 | Glenjamin | i'm noticing i'm doing this a fair bit when passing context to (ex-info) |
| 13:47 | Glenjamin | yup, that's the one |
| 13:47 | mgaare | mm, I see |
| 13:51 | Glenjamin | and is there a variant of (get) which throws on unknown keys? |
| 13:51 | TEttinger | justin_smith: dammit yourkit... here I am trying out JVM profilers last updated in 2007 |
| 13:52 | TEttinger | ,(get {:a 1 :b 2} :a) |
| 13:52 | clojurebot | 1 |
| 13:52 | TEttinger | ,(get {:a 1 :b 2} :c) |
| 13:52 | clojurebot | nil |
| 13:52 | TEttinger | hm |
| 13:52 | TEttinger | nth fails with vectors... |
| 13:52 | TEttinger | but get doesn't with maps |
| 13:53 | TEttinger | ,(nth [1 2] 3) |
| 13:53 | clojurebot | #error {\n :cause nil\n :via\n [{:type java.lang.IndexOutOfBoundsException\n :message nil\n :at [clojure.lang.PersistentVector arrayFor "PersistentVector.java" 157]}]\n :trace\n [[clojure.lang.PersistentVector arrayFor "PersistentVector.java" 157]\n [clojure.lang.PersistentVector nth "PersistentVector.java" 161]\n [clojure.lang.RT nth "RT.java" 846]\n [sandbox$eval73 invokeStatic "NO_SOURCE... |
| 13:53 | justin_smith | ,(nth [1 2] 3 :not-found) |
| 13:53 | clojurebot | :not-found |
| 13:53 | TEttinger | yeah, that's a good example |
| 13:53 | bluezone | Theses docs http://clojure-doc.org/ are so much better than the living clojure book |
| 13:53 | justin_smith | different defaults, but you can get the same behavior |
| 13:55 | Glenjamin | (if (contains? @conf name) (get @conf key-name) (throw (ex-info "Unknown config key" {:name name}))) |
| 13:56 | justin_smith | (get {:a 0} :b (lazy-seq (throw (Exception. "boom")))) ; works, but is a hack |
| 13:56 | Glenjamin | heh |
| 13:57 | justin_smith | but the lazy-seq means no throw happens if the key is found |
| 13:57 | justin_smith | but also means no exception if you don't use the return value :P |
| 13:59 | noncom | justin_smith: hmmm! yourkit... i heard of it.. i think i'll try learning more of it |
| 14:00 | noncom | maybe it will come to use one day |
| 14:00 | noncom | for me too |
| 14:03 | TEttinger | noncom: if your company is paying for it I would use it like there's no tomorrow |
| 14:04 | justin_smith | TEttinger: or start / contribute to a healthy and useful open source project |
| 14:05 | TEttinger | I have no idea what yourkit considers useful, haha |
| 14:05 | oddcully | justin_smith: why bother, if nomcoms company would pay for tettingers version? |
| 14:05 | TEttinger | haha |
| 14:05 | TEttinger | right, I mixed up your and I |
| 14:09 | justin_smith | TEttinger: sometimes I forget which guy I am too, I get myself mixed up with gfredericks all the time and I'm all like "wait, I thought I was supposed to live in Chicago?" |
| 14:10 | TEttinger | I can't remember which time zone the noisesmith is in |
| 14:10 | justin_smith | hipster central |
| 14:11 | noncom | TEttinger: yeah its probably payed |
| 14:26 | phaseNi | cd |
| 14:26 | phaseNi | whoops |
| 14:28 | bluezone | What's the difference between a keyword and a symbol? A keyword doesn't have to be explicitly defined with def? |
| 14:28 | Bronsa | bluezone: a keyword is more like a string than like a symbol |
| 14:29 | bluezone | mmm i see |
| 14:29 | Bronsa | keywords are self-evaluating |
| 14:29 | Bronsa | but like symbols, they have an (optional) namespace and name component |
| 14:29 | Bronsa | and like symbols, they are also functions |
| 14:32 | TimMc | bluezone: Keywords are generally intended to represent themselves, usually as lookup keys or sometimes as sentinals or out-of-band values. |
| 14:33 | TimMc | bluezone: Symbols are generally intended to be bound to values in a program, or represent them. |
| 14:34 | TimMc | Symbols are most often seen in compilation or related contexts, and keywords are usually seen in data. |
| 14:53 | bluezone | Not sure If I grasped it yet, i am missing terminology. But will move on for now, seems to only be used as keys and certain actions (like :as in require) |
| 14:54 | bluezone | https://www.refheap.com/111431 In this example why aren't they forced to (declare do-it) before making the call to (do-it) ? |
| 14:54 | bluezone | The example is under the heading "Layout of functions" here http://clojure-doc.org/articles/tutorials/introduction.html#functions-defining-your-own |
| 14:55 | justin_smith | bluezone: certain functions or macros treat keywords specially - because they are looking for that keyword |
| 14:55 | bluezone | ah okay |
| 14:55 | justin_smith | so it's like a pseudo-syntax |
| 14:57 | oddcully | bluezone: this (to me) makes no sense. you can not call (do-it) even if you would declare it |
| 14:57 | oddcully | ,(declare do-it) |
| 14:57 | oddcully | ,(do-it) |
| 14:57 | clojurebot | #'sandbox/do-it |
| 14:57 | clojurebot | #error {\n :cause "Attempting to call unbound fn: #'sandbox/do-it"\n :via\n [{:type java.lang.IllegalStateException\n :message "Attempting to call unbound fn: #'sandbox/do-it"\n :at [clojure.lang.Var$Unbound throwArity "Var.java" 43]}]\n :trace\n [[clojure.lang.Var$Unbound throwArity "Var.java" 43]\n [clojure.lang.AFn invoke "AFn.java" 28]\n [sandbox$eval47 invokeStatic "NO_SOURCE_FILE" 0]\n... |
| 14:57 | bluezone | I think you need to put it in the same line |
| 14:58 | bluezone | ,(declare do-it) (do-it) |
| 14:58 | clojurebot | #'sandbox/do-it |
| 14:58 | justin_smith | bluezone: no, that just works accidentally |
| 14:58 | bluezone | ,(do-it) (declare do-it) |
| 14:58 | clojurebot | #error {\n :cause "Attempting to call unbound fn: #'sandbox/do-it"\n :via\n [{:type java.lang.IllegalStateException\n :message "Attempting to call unbound fn: #'sandbox/do-it"\n :at [clojure.lang.Var$Unbound throwArity "Var.java" 43]}]\n :trace\n [[clojure.lang.Var$Unbound throwArity "Var.java" 43]\n [clojure.lang.AFn invoke "AFn.java" 28]\n [sandbox$eval93 invokeStatic "NO_SOURCE_FILE" 0]\n... |
| 14:58 | oddcully | no i't does not know, what to run |
| 14:58 | justin_smith | bluezone: clearly what they meant in the example is (declare doit) (defn foo [] (doit)) (defn doit []) |
| 14:58 | justin_smith | that works |
| 14:59 | justin_smith | but what they have on that page is broken |
| 14:59 | bluezone | ,(declare do-it) (do-it) ;; <- is that okay? |
| 14:59 | clojurebot | #'sandbox/do-it |
| 14:59 | oddcully | no |
| 15:00 | oddcully | "one line" does not matter here |
| 15:01 | bluezone | ,(declare do-it) (do-it "fanculo"]) (defn do-it [x] (println x)) |
| 15:01 | clojurebot | #'sandbox/do-it |
| 15:01 | justin_smith | bluezone: clojurebot is not a repl, it ignores everything after the first form |
| 15:01 | bluezone | o |
| 15:02 | justin_smith | ,:foo (/ 1 0) (println "this doesn't happen") |
| 15:02 | clojurebot | :foo |
| 15:02 | mgaare | evidence: it ignored unmatched ] in (do-it "fanculo"]) ;) |
| 15:02 | bluezone | Okay I shall try in repl i suppose |
| 15:03 | oddcully | you will get the error with the "unbound fn" |
| 15:03 | bluezone | yeah I saw that ^_^ |
| 15:03 | oddcully | unless you have defined that fn beforehand at any point in your repl |
| 15:03 | justin_smith | bluezone: declare is for putting things in function definitions that are not yet defined, but you still need to define the thing before the function is called or you get an error |
| 15:06 | bluezone | so you can use (delcare func) (defn test [] (func)) (defn func [] (println "abc")) . But you can't do (delcare func) (func) (defn func [] (println "abc")) ? |
| 15:07 | bluezone | Seems odd to me that you could use the function inside a function definition, but you can't call it if it hasn't been defined above the call |
| 15:08 | amalloy | bluezone: forms are evaluated sequentially |
| 15:08 | amalloy | how could (func) be evaluated if you haven't supplied a definition? |
| 15:08 | bluezone | yeah the definition is below :( but what's the point of declare then? |
| 15:09 | bluezone | Just so you can use (func) in another function definition before declaring (defn func [] () ) ? |
| 15:09 | oddcully | it's a forward declaration |
| 15:10 | johannbestowrous | hey guys im working with a coworker to get lein up and running on his computer |
| 15:10 | johannbestowrous | and he's running into an issue similar to this gist https://gist.github.com/brandonbloom/d3598b6f2e4ef493ed56 |
| 15:10 | bluezone | I blame them for confusing me with their terrible example :) |
| 15:10 | johannbestowrous | anyone have any familiarity with this issue? |
| 15:11 | amalloy | johannbestowrous: looks to me like his project.clj has junk in it? |
| 15:11 | amalloy | maybe |
| 15:11 | johannbestowrous | hey amalloy--no project.clj, literally just running lein repl |
| 15:12 | bluezone | maybe your lein is 32 bit? ^_^ random guess |
| 15:12 | oddcully | bluezone: ignore that example. it is wrong and makes no sense |
| 15:13 | amalloy | johannbestowrous: honestly that's a pretty weird error to me. maybe upgrade lein? like i got 2.5.2 months ago so i'm a little confused why someone who's starting out is on 2.5.1 |
| 15:13 | oddcully | johannbestowrous: maybe bork in ~/.lein/profiles.clj? |
| 15:13 | johannbestowrous | good call |
| 15:14 | oddcully | also isn't that java there ancient? |
| 15:14 | oddcully | erm sorry... that is not _your_ error |
| 15:15 | johannbestowrous | oddcully |
| 15:15 | johannbestowrous | excellent excellent excellent |
| 15:15 | johannbestowrous | i owe you a beer :) |
| 15:15 | johannbestowrous | fixed his profiles.clj :) |
| 15:16 | bluezone | I e-mailed the docs author :) |
| 15:17 | oddcully | johannbestowrous: cheers! |
| 15:21 | johannbestowrous | hell everyone who offered help gets a beer |
| 15:26 | PMunch | Hi I want to use map on a set of data (read from a file) with a function that takes in two arguments (one which is the element, the other which is constant). What I've done is to create an anonymous function #(func % 10) which I try to use in the map but I've getting an error Wrong number of args. What gives? |
| 15:27 | TEttinger | PMunch: that fn always takes one arg |
| 15:27 | TEttinger | the #() I mean |
| 15:28 | PMunch | TEttinger, yes and that's all it gets from map isn't it? |
| 15:28 | PMunch | http://pastebin.com/7uEhdBrN << complete code |
| 15:28 | TEttinger | thanks |
| 15:30 | PMunch | TEttinger, keep in mind I'm fairly new to Clojure so that code might be quite horrible.. |
| 15:30 | TEttinger | no no, it actually looks fine |
| 15:30 | TEttinger | so stack-hash takes two args? |
| 15:32 | TEttinger | PMunch, that really doesn't look like "fairly new to clojure" style code. my first clojure program used ref everywhere |
| 15:33 | xeqi | and there isn't any nested defns |
| 15:33 | PMunch | Haha, I took some time with it the first time around. Used it for a school project to write a distributed hash map running on a cluster, but that's the only time I've used it |
| 15:34 | TEttinger | nice |
| 15:34 | TEttinger | so what does stack-hash's arglist look like? |
| 15:34 | PMunch | [in size] |
| 15:34 | TEttinger | and that isn't in another set of square brackets, right? |
| 15:35 | PMunch | It's basically a function that hashes the input and places in a bucket within size |
| 15:35 | PMunch | No |
| 15:35 | TEttinger | ok |
| 15:35 | PMunch | http://pastebin.com/ZU7xHY1T |
| 15:36 | PMunch | There's the stack-hash function (poor name I know, it's a hashing algorithm I got from stackexchange..) |
| 15:36 | TEttinger | so what error does it throw, and does it have a meaningful line number? |
| 15:36 | xeqi | PMunch: (stack-hash (str first-four)) only recurses with one argument |
| 15:37 | PMunch | Shit, just realised -_- |
| 15:37 | PMunch | Sorry, my bad. I've been struggling for so long to get the file reading right I just assumed the error was there.. |
| 15:38 | PMunch | And sorry if swearing isn't allowed.. |
| 15:38 | TEttinger | no worries |
| 15:38 | TEttinger | you may want to make that recur like you do earlier |
| 15:39 | PMunch | The whole function? What would the benefit be over recursing like I do now? Or is it just idiomatic? |
| 15:40 | PMunch | Hmm, I guess I could let n and mask be the same by doing it that way. No need to recompute them.. |
| 15:40 | justin_smith | PMunch: (fn foo [] (foo)) uses stack, (fn foo [] (recur)) does not |
| 15:40 | timvisher | is there a way to take an arbitrary clojure structure that i can quote and pretty print it? |
| 15:40 | timvisher | it has 'seqs' embedded in it |
| 15:40 | justin_smith | timvisher: I assume there is a problem with clojure.pprint/pprint ? |
| 15:40 | timvisher | it's a logged ring response from ring.middleware.logger if you're familiar with it |
| 15:41 | PMunch | justin_smith, really? I thought it did and that recur was simply a different way of doing it. Neat! |
| 15:41 | justin_smith | PMunch: no automatic TCO in clojure, only explicit |
| 15:42 | timvisher | justin_smith: oh duh. i didn't think to pass the quoted form to pprint. i kept trying to pass the unquoted form. :facepalm: |
| 15:42 | TEttinger | ,(map seq [1 2 3 4] [10 20 30 40]) |
| 15:42 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core/seq--4116> |
| 15:42 | TEttinger | ,(map list [1 2 3 4] [10 20 30 40]) |
| 15:42 | clojurebot | ((1 10) (2 20) (3 30) (4 40)) |
| 15:42 | TEttinger | ,(str (map list [1 2 3 4] [10 20 30 40])) |
| 15:42 | clojurebot | "clojure.lang.LazySeq@1e56653" |
| 15:42 | TEttinger | ,(pr-str (map list [1 2 3 4] [10 20 30 40])) |
| 15:42 | clojurebot | "((1 10) (2 20) (3 30) (4 40))" |
| 15:43 | justin_smith | yeah, pr-str helps, but pprint already does the equivalent of pr-str, recursively |
| 15:43 | TEttinger | ah |
| 15:43 | TEttinger | that does appear to recurse by two levels though |
| 15:44 | TEttinger | ,(pr-str (map #(seq %&) (map list [1 2 3 4] [10 20 30 40]) (map list [1 2 3 4] [10 20 30 40]))) |
| 15:44 | clojurebot | "(((1 10) (1 10)) ((2 20) (2 20)) ((3 30) (3 30)) ((4 40) (4 40)))" |
| 15:45 | drorbemet | Hi, what's an easy way to eval a string of clojure code from emacs lisp when using cider? |
| 15:45 | justin_smith | another underappreciated gem is clojure.pprint/print-table |
| 15:45 | justin_smith | (for lists of hash-maps) |
| 15:46 | justin_smith | s/lists/sequable |
| 15:46 | mikerod_ | @drorbemet cider-read-and-eval |
| 15:46 | mikerod_ | specifically |
| 15:46 | mikerod_ | M-x cider-read-and-eval |
| 15:47 | mikerod_ | if you want to do it in minibuffer that is |
| 15:47 | mikerod_ | or perhaps you wanted to do it not in minibuffer? |
| 15:59 | drorbemet | mikerod_: yes, I want to pass clojure code directly to cider-read-and-eval. I just tried that without success. Now I am looking at cider-eval-region trying to learn from it (cider-interactive-eval nil nil (list start end)) ... but I don't know jet how to pass a string instead of a region. |
| 16:00 | mikerod | @drorbemet to me it looks like most of the API there is tailored towards the interactive eval |
| 16:00 | drorbemet | mikerod_: So I am missing cider-eval-string I guess. |
| 16:00 | mikerod | that is just my preliminary thoughts though |
| 16:01 | justin_smith | drorbemet: iirc there is a function with "send" in the name that takes a string... |
| 16:02 | drorbemet | mikerod: yes to me it looks like that too ... maybe I sould send an issue to the cider developers |
| 16:02 | drorbemet | justin_smith: oh, let me check |
| 16:02 | mikerod | you could probably just call the nrepl-client stuff directly too |
| 16:02 | mikerod | that may be undesirable |
| 16:03 | drorbemet | justin_smith: there are a lot of functions with "send" in their names |
| 16:05 | justin_smith | yeah, sorry I can't remember more specifically |
| 16:05 | drorbemet | mikerod: whell I am starting a cider repl via cider-jack-in and then I want to eval some code that I don't want to put into a file ... maybe should I just give up and put it in a file |
| 16:06 | mikerod | drorbemet: yeah, there are ways to implement it yourself, but not sure how to reuse the most out of cider for it |
| 16:07 | justin_smith | drorbemet: cider-eval-defun-at-point |
| 16:07 | drorbemet | mikerod: I'll ask the cider people, thanks for discussing the issue though, have a nice day |
| 16:08 | justin_smith | drorbemet: oh, you want to type the code into the minibuffer? |
| 16:08 | justin_smith | drorbemet: in that case cider-read-and-eval |
| 16:09 | drorbemet | justin_smith: cider-read-and-eval and cider-eval-defun-at-point do not take a string as an argument, I want to call elisp code from the command line |
| 16:10 | justin_smith | drorbemet: ahh, right - look at the functions in cider-client.el |
| 16:10 | justin_smith | drorbemet: also, it's a common enough thing in elisp code to create a "temp buffer" that the user can't see, and put a string in it, for functions that want a buffer |
| 16:11 | mikerod | I don't even understand how cider-read-and-eval can take forms that are not readable in elisp |
| 16:11 | mikerod | magic |
| 16:11 | mikerod | example |
| 16:11 | mikerod | #{1} |
| 16:11 | drorbemet | justin_smith: ah, ok thanks for that hint. I found that to cumbersome at first, but right in emacs thats the way to go. |
| 16:11 | justin_smith | mikerod: because the minibuffer is not an elisp repl |
| 16:12 | mikerod | I was trying to see if you could just break out the read-from-string part and than pass that form through to what wants a form |
| 16:12 | mikerod | oh |
| 16:12 | justin_smith | mikerod: you can make an elisp repl with ielm, it's handy for when you want to debug elisp code |
| 16:12 | justin_smith | M-x ielm that is |
| 16:13 | mikerod | justin_smith: this is interesting |
| 16:13 | mikerod | I'll have to look at this some more |
| 16:13 | drorbemet | mikerod: cider-eval-region gets close I think |
| 16:16 | justin_smith | drorbemet: there's also this, plus a function that handles the result as a callback https://github.com/clojure-emacs/cider/blob/master/cider-client.el#L451 |
| 16:17 | justin_smith | who knows what the data you get back is, but it shouldn't be too hard to experiment |
| 16:17 | justin_smith | oh, and even simpler, the sync version https://github.com/clojure-emacs/cider/blob/master/cider-client.el#L463 should do exactly what you expect |
| 16:24 | drorbemet | justin_smith: I tested those, now I figured that I want to see the output in the cider repl buffer. Both functions don't do that. I will return to cider-load-file I guess. |
| 16:26 | justin_smith | drorbemet: a callback can totally do that |
| 16:28 | drorbemet | justin_smith: ok, but then I have a new dependency in my emacs config ... which I was trying to avoind |
| 16:29 | drorbemet | justin_smith: It's ok I will bend around it :-) |
| 16:33 | PMunch | Hmm I'm having some trouble porting this hashing algorithm from Python. I would say they are the same but they don't give the same results.. Clojure version: http://pastebin.com/hzgQWTXS |
| 16:33 | PMunch | Python version: http://pastebin.com/utAnsngp |
| 16:34 | PMunch | I've tested that the last_four thing gives the same numbers and that the n is the same for both.. |
| 16:34 | PMunch | But the Clojure version seems to put a lot more (about 3x intended) into one bucket.. |
| 16:41 | TEttinger | PMunch: I suspect it may have to do with the behavior of math in clojure having some different defaults |
| 16:43 | PMunch | TEttinger, could be.. |
| 16:44 | justin_smith | PMunch: what's up with stack_hash, which full_hash calls in the python version? |
| 16:46 | justin_smith | PMunch: one thing to check out is that clojure assumes vals are 64 bits (long not int, double not float) |
| 16:48 | PMunch | justin_smith, It does? |
| 16:48 | justin_smith | ,(type (+ Integer/MAX_VALUE 1)) ; PMunch - also, auto-promotes |
| 16:48 | clojurebot | java.lang.Long |
| 16:48 | justin_smith | PMunch: yes |
| 16:48 | justin_smith | PMunch: it strongly prefers 64 bit numbers |
| 16:48 | justin_smith | ,(type 1) |
| 16:48 | clojurebot | java.lang.Long |
| 16:49 | TEttinger | ,(Long/highestOneBit 5) |
| 16:49 | clojurebot | 4 |
| 16:50 | TEttinger | ,(dec (* 2 (Long/highestOneBit 5))) |
| 16:50 | justin_smith | TEttinger: oh, that would simplify his code wouldn't it |
| 16:50 | clojurebot | 7 |
| 16:50 | TEttinger | yeah I use it or methods like it a fair amount in java |
| 16:50 | PMunch | Hmm, I think one of the reasons might be that Python reads in newlines as part of a line.. |
| 16:51 | justin_smith | oh yeah, line-seq doesn't give you the newlines either |
| 16:51 | TEttinger | ,(Long/numberOfTrailingZeros (Long/highestOneBit 5)) |
| 16:51 | clojurebot | 2 |
| 16:51 | TEttinger | ,(inc (Long/numberOfTrailingZeros (Long/highestOneBit 5))) |
| 16:51 | clojurebot | 3 |
| 16:52 | TEttinger | ,(Math/ceil (/ (Math/log 5) (Math/log 2))) |
| 16:52 | clojurebot | 3.0 |
| 16:52 | TEttinger | ah, that might be another gotcha |
| 16:52 | TEttinger | ceil returns a double |
| 16:52 | TEttinger | it doesn't in all languages |
| 16:52 | justin_smith | TEttinger: but it's only used in the pow call right? |
| 16:53 | TEttinger | yeah, which is where... |
| 16:53 | PMunch | Hmm, I stripped the newline in python and while I get different results they are still better distributed.. |
| 16:53 | TEttinger | ,(int (- (Math/pow 2 (Math/ceil (/ (Math/log 5) (Math/log 2)))) 1)) |
| 16:53 | clojurebot | 7 |
| 16:54 | TEttinger | ,(dec (* 2 (Long/highestOneBit 5))) |
| 16:54 | clojurebot | 7 |
| 16:54 | TEttinger | I think this might be a bit simpler/mor efficient |
| 16:55 | TEttinger | also, PMunch, what's the difference between stack_hash and full_hash in the python? |
| 16:56 | PMunch | It's basically the same |
| 16:56 | PMunch | You can change that line to: return full_hash(str(Hv),N) |
| 16:56 | PMunch | And it does the exact same thing |
| 16:57 | TEttinger | but full_hash takes 3 args |
| 16:57 | TEttinger | assuming there's an 'n' in there somewhere |
| 16:58 | TEttinger | and I realy have no idea what this does: first_four = int(to2sCompStr(Hv,64)[64-n:],2) |
| 17:00 | PMunch | It selects the 4 least significant bits of Hv |
| 17:02 | PMunch | Okay, I have now found one word that classifies differently "you" over 30 buckets. It starts of equal, both evaluating to 31, then on the second go clojure gives hash 1630 while Python gives hash 1449834469 |
| 17:03 | TEttinger | ,(reduce #(mod (+ (* %1 31) (int %2)) 2147483647) 0 "alpha") ; Hv = (Hv*31+ord(c))%2147483647 |
| 17:03 | clojurebot | 92909918 |
| 17:03 | TEttinger | ,(reduce #(mod (+ (* %1 31) (int %2)) 2147483647) 0 "you") ; Hv = (Hv*31+ord(c))%2147483647 |
| 17:03 | clojurebot | 119839 |
| 17:03 | TEttinger | ,(reduce #(mod (+ (unchecked-multiply-int %1 31) (int %2)) 2147483647) 0 "you") ; Hv = (Hv*31+ord(c))%2147483647 |
| 17:03 | clojurebot | 119839 |
| 17:04 | PMunch | Yea, that's the first round |
| 17:04 | PMunch | The four least significant bits makes that number 31 |
| 17:04 | PMunch | ,(reduce #(mod (+ (unchecked-multiply-int %1 31) (int %2)) 2147483647) 0 "31") ; Hv = (Hv*31+ord(c))%2147483647 |
| 17:04 | clojurebot | 1630 |
| 17:04 | PMunch | Python gives 1449834469 |
| 17:05 | TEttinger | wait wait |
| 17:05 | TEttinger | "31") |
| 17:06 | TEttinger | are you feeding the number back as a string? |
| 17:06 | justin_smith | TEttinger: yup - it's in the code |
| 17:06 | TEttinger | also 31 is... |
| 17:06 | PMunch | TEttinger, yes that's because I used a hashing algorithm for strings.. |
| 17:06 | TEttinger | ,(Integer/toBinaryString 31) |
| 17:06 | clojurebot | "11111" |
| 17:06 | PMunch | I should probably change that |
| 17:06 | TEttinger | 31 is 5 bits all 1 |
| 17:06 | PMunch | Yes |
| 17:07 | PMunch | Oh sorry, I was working with 4 bits before. I meant 5 least significant bits |
| 17:07 | TEttinger | oh ok |
| 17:07 | PMunch | So it seems like it is actually Python which is doing something weird. But somehow it ends up more right.. |
| 17:08 | justin_smith | which "unchecked-multiply-int" ? |
| 17:08 | PMunch | Oooooh |
| 17:08 | PMunch | Found the bug.. |
| 17:08 | TEttinger | justin_smith: hm? |
| 17:09 | PMunch | In clojure I do (recur (str first-four)), while in Python it is full_hash(str(Hv),N) |
| 17:09 | justin_smith | TEttinger: sorry, meant "why" |
| 17:10 | TEttinger | I thought we were expecting 32 bit precision |
| 17:10 | PMunch | So it wasn't related to Clojure at all. Sorry guys for wasting your time |
| 17:10 | TEttinger | to match python |
| 17:10 | TEttinger | no prob |
| 17:11 | PMunch | But you had some good ideas on improving the bit checking algorithm so it wasn't all for nothing |
| 17:17 | TEttinger | ,(defn stack-hash [in size] (let [mask (* 31 (Long/highestOneBit size)) Hv (reduce #(mod (+ (unchecked-multiply %1 31) (int %2)) 2147483647) 0 in) first-five (bit-and Hv mask)] (if (< first-five size) first-five (recur (str Hv) size)))) |
| 17:17 | clojurebot | #'sandbox/stack-hash |
| 17:17 | TEttinger | ,(stack-hash "you") |
| 17:17 | clojurebot | #error {\n :cause "Wrong number of args (1) passed to: sandbox/stack-hash"\n :via\n [{:type clojure.lang.ArityException\n :message "Wrong number of args (1) passed to: sandbox/stack-hash"\n :at [clojure.lang.AFn throwArity "AFn.java" 429]}]\n :trace\n [[clojure.lang.AFn throwArity "AFn.java" 429]\n [clojure.lang.AFn invoke "AFn.java" 32]\n [sandbox$eval52 invokeStatic "NO_SOURCE_FILE" 0]\n ... |
| 17:17 | TEttinger | ,(stack-hash "you" 5) |
| 17:17 | clojurebot | 4 |
| 17:17 | TEttinger | I don't know what size should be |
| 17:17 | TEttinger | ,(stack-hash "you" 31) |
| 17:17 | clojurebot | 16 |
| 17:19 | TEttinger | ,(defn stack-hash [in size] (let [mask (* 31 (Long/LowestOneBit size)) Hv (reduce #(mod (+ (unchecked-multiply %1 31) (int %2)) 2147483647) 0 in) first-five (bit-and Hv mask)] (if (< first-five size) first-five (recur (str Hv) size)))) |
| 17:19 | clojurebot | #error {\n :cause "No matching method: LowestOneBit"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: No matching method: LowestOneBit, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6891]}\n {:type java.lang.IllegalArgumentException\n :message "No matching method: LowestOneBit"\n :at [clojure... |
| 17:19 | TEttinger | ,(defn stack-hash [in size] (let [mask (* 31 (Long/lowestOneBit size)) Hv (reduce #(mod (+ (unchecked-multiply %1 31) (int %2)) 2147483647) 0 in) first-five (bit-and Hv mask)] (if (< first-five size) first-five (recur (str Hv) size)))) |
| 17:19 | clojurebot | #'sandbox/stack-hash |
| 17:19 | TEttinger | ,(stack-hash "you" 31) |
| 17:19 | clojurebot | 5 |
| 17:19 | TEttinger | hm |
| 17:20 | TEttinger | ,(stack-hash "you" 1024) |
| 17:20 | clojurebot | 0 |
| 18:01 | Trioxin | question: Let's say I want to be able to make use of multiple cores and the full power of GPUs, is OpenCL the best route? This would be for machine learning algorithms. |
| 18:02 | Trioxin | OpenCL seems to be the easiest route. That's what i mean by best (Most portable across all architectures) |
| 18:03 | Trioxin | Or would it be best to just use the JVM for the CPU cores and openGL for GPU processing? |
| 18:03 | Trioxin | but then again I'm using two different things at that point for 1 algorithm whereas openCL... |
| 18:05 | rhg135 | u8n-o oh7o .7ohq. cy6 cq,qc" |
| 18:05 | rhg135 | err, wrong dhan |
| 19:16 | domokato | if two threads force a delay at the same time, is the delay body invoked twice? |
| 19:16 | justin_smith | domokato: you could try, but my strong guess is no |
| 19:19 | justin_smith | domokato: looks good to me https://www.refheap.com/111441 |
| 19:21 | domokato | thanks! |
| 19:21 | domokato | where is the parallelization in your code, though? |
| 19:21 | justin_smith | the futures |
| 19:22 | domokato | oops |
| 19:22 | domokato | missed those |
| 19:23 | justin_smith | you can try the same function calls, but eg. add (Thread/sleep (rand-int 300)) into the doseq before the @d |
| 19:24 | justin_smith | I am not sure where sleeps would maximize the collission possibility actually, now that I think about it - maybe (delay (Thread/sleep (rand-int 300)) (swap! undelay inc)) |
| 19:29 | McDougal | justin_smith: Are you using any external libs to beef up security in Caribou? |
| 19:30 | justin_smith | sure, bcrypt |
| 19:30 | justin_smith | (for one) |
| 19:31 | McDougal | How about csrf? |
| 19:32 | justin_smith | no, that one would be a good reason to bring in friend or buddy yourself |
| 19:32 | McDougal | Gotcha, am using Buddy |
| 19:32 | McDougal | And yesql |
| 19:47 | TEttinger | domokato: futures are awesome, especially for the kind of thing you're making |
| 19:48 | domokato | TEttinger: yeah, i'm using them in a few places |
| 19:48 | TEttinger | in a game I partly made, that was 100% clojure, I would generate a level and do some expensive calcs on it before the player reached it, in another thread due to futures |
| 19:49 | TEttinger | I'm currently making that approach easy enough to do for java devs with my current lib |
| 19:49 | TEttinger | (it would be easier in clojure) |
| 19:53 | domokato | nice |
| 19:53 | domokato | i'm using them for my ai calculations |
| 19:53 | domokato | for each agent |
| 19:58 | Trioxin | domokato, Tettinger, Have you guys used OpenCL? I'm wanting to do machine learning calculations with it. |
| 19:59 | TEttinger | I wanted to at one point, but the lib I'm making has android as a target. it's crazy how much google wants to keep openCL off of phones |
| 20:00 | TEttinger | Trioxin: it's true that a good GPU is extremely powerful at certain tasks |
| 20:00 | Trioxin | Tettinger, a google search is showing results for doing it on android |
| 20:00 | TEttinger | not officially. look up nexus opencl |
| 20:00 | Trioxin | tettinger, well I want to use both cpu cores and gpu and would rather use 1 thing to do it |
| 20:01 | Trioxin | goal would be to deploy to all desktop and mobile platforms using the JVM and cordova |
| 20:01 | TEttinger | http://streamcomputing.eu/blog/2013-08-01/google-blocked-opencl-on-android-4-3/ |
| 20:02 | TEttinger | if you can find a way to use cpu and gpu on both desktop and mobile platforms, will you tell me please? |
| 20:03 | Trioxin | so this is just for nexus and they've blocked it in favor of some other thing |
| 20:04 | Trioxin | renderscript |
| 20:04 | Trioxin | opencl seems like a no brainer. wtf |
| 20:04 | Trioxin | and i don't think the current version is in cuda |
| 20:04 | Trioxin | but 1. something |
| 20:08 | Trioxin | doesn't sounds like fun to have to use GL along with something else for CPU cores to perform the same computations |
| 20:08 | TEttinger | Trioxin: there's a hare-brained set of excuses in here https://code.google.com/p/android/issues/detail?id=36361 |
| 20:10 | Trioxin | tettinger, "If you need "maximum control and speed", you should probably be pursuing custom hardware/software for your use-case." |
| 20:10 | Trioxin | like that? |
| 20:10 | Trioxin | loll |
| 20:11 | Trioxin | makes no sense |
| 20:11 | Trioxin | and fragmentation. isn't that sort of a principal of a linux-based OS? |
| 20:12 | TEttinger | yeah, their solution is just going to cause fragmentation |
| 20:12 | TEttinger | if you have Mali or certain other GPUs, you can use OpenCL |
| 20:12 | TEttinger | if you don't, you can't |
| 20:13 | Trioxin | and the solution then is to use renderscript? or GL? |
| 20:13 | Trioxin | on mobile are the cpu and gpu cores separate? |
| 20:25 | TEttinger | Trioxin: man... I haven't found a solution that's very good. there's the old way of GPGPU stuff using pixel shaders to do calculations |
| 20:32 | eseg | Hey everyone, how can I destructure a vector into parts while still binding a name to the whole data structure, like as patterns in haskell? |
| 20:37 | Frozenlock | ,(let [[a b :as v] [1 2 3 4 5]] {:a a :v v}) |
| 20:37 | clojurebot | {:a 1, :v [1 2 3 4 5]} |
| 20:38 | Frozenlock | destructuring tutorial https://gist.github.com/john2x/e1dca953548bfdfb9844 |
| 20:39 | eseg | thanks guys |
| 22:14 | Trioxin | tettinger, meh. but I guess on desktop and server it should be okay with CL? maybe? except nvidia doesn't support latest versions? |
| 22:22 | TEttinger | OpenCL should be perfect for desktop |
| 22:22 | TEttinger | it will be supported on windows, mac, linux, with intel, AMD, or NVIDIA GPUs |
| 22:23 | justin_smith | TEttinger: have you tried using jocl from clojure? |
| 22:25 | TEttinger | no |
| 22:25 | Trioxin | tettinger, I think not the current version on nvidia though due to them wanting to promote cuda? |
| 22:25 | TEttinger | CUDA is technically a better choice if you know what hardware you're running on |
| 22:25 | TEttinger | but you don't know that if distributing an app |
| 22:26 | Trioxin | says nvidia supports 1.2 |
| 22:26 | Trioxin | cl 1.22 |
| 22:26 | Trioxin | 1.2* |
| 22:27 | Trioxin | the point for me is that if I'm computing something with openCL I don't have to write any extra code for the CPU than the GPU right? |
| 22:28 | Trioxin | other than maybe some settings but don't have to modify the code for the computation? |
| 22:43 | TEttinger | I think so yeah |
| 23:02 | bluezone | Broadcasting my failures. Can't figure out a null pointer exception -.- https://www.livecoding.tv/bluezone/ |
| 23:02 | bluezone | You are welcome to make fun of me |
| 23:17 | Frozenlock | Nice |
| 23:17 | Frozenlock | With music! |
| 23:18 | bluezone | ^_^ |
| 23:21 | justin_smith | bluezone: eventually, first sequ is nil |
| 23:21 | bluezone | yeah I tried to avoid that in the and statement hmm |
| 23:21 | justin_smith | ,(odd? nil) |
| 23:21 | clojurebot | #error {\n :cause "Argument must be an integer: "\n :via\n [{:type java.lang.IllegalArgumentException\n :message "Argument must be an integer: "\n :at [clojure.core$even_QMARK_ invokeStatic "core.clj" 1359]}]\n :trace\n [[clojure.core$even_QMARK_ invokeStatic "core.clj" 1359]\n [clojure.core$odd_QMARK_ invokeStatic "core.clj" 1362]\n [clojure.core$odd_QMARK_ invoke "core.clj" -1]\n [sandbox... |
| 23:22 | Frozenlock | bluezone: Montréal? |
| 23:22 | justin_smith | (mod nil 2) |
| 23:22 | bluezone | Frozenlock: Yeah ^_^ |
| 23:22 | justin_smith | ,(mod nil 2) ; this is your error, bluezone |
| 23:22 | clojurebot | #error {\n :cause nil\n :via\n [{:type java.lang.NullPointerException\n :message nil\n :at [clojure.lang.Numbers ops "Numbers.java" 1013]}]\n :trace\n [[clojure.lang.Numbers ops "Numbers.java" 1013]\n [clojure.lang.Numbers remainder "Numbers.java" 173]\n [clojure.core$mod invokeStatic "core.clj" 3448]\n [clojure.core$mod invoke "core.clj" -1]\n [sandbox$eval49 invokeStatic "NO_SOURCE_FILE"... |
| 23:22 | Frozenlock | bluezone: Sherbrooke :-D |
| 23:23 | justin_smith | now you have an infinite loop I think |
| 23:24 | bluezone | yeah hmm |
| 23:24 | justin_smith | you know how to fix that though I am sure |
| 23:28 | bluezone | can't believe it's taking me this long lol |
| 23:28 | justin_smith | notice that all those prints have your answer in them |
| 23:28 | justin_smith | why didn't it exit? |
| 23:29 | justin_smith | ,(rest ()) |
| 23:29 | clojurebot | () |
| 23:31 | justin_smith | bluezone: or more to the point, how do you make it stop when you have the answer? |
| 23:31 | bluezone | hmmm |
| 23:32 | bluezone | something is not right here ^_^ |
| 23:32 | bluezone | It needs to stop when sequ is empty |
| 23:32 | justin_smith | bluezone: so, don't you need another if to see if you are done? |
| 23:37 | justin_smith | bluezone: very close |
| 23:37 | justin_smith | bluezone: check your if scope... |
| 23:38 | bluezone | Oh my god :D |
| 23:39 | bluezone | this takes some getting used to I guess :) Thanks |
| 23:40 | bluezone | Not sure why the and statement wasn't working there mhmm |
| 23:40 | Trioxin | maybe I'll just take the easy way out and use a node opencl implementation |
| 23:40 | Trioxin | and a webkit frontend |
| 23:41 | TEttinger | Trioxin: that wouldn't be much help if there's no OpenCL drivers on a phone |
| 23:41 | justin_smith | bluezone: you need three conditions! |
| 23:41 | Trioxin | didn't mean for phone |
| 23:41 | TEttinger | oh ok |
| 23:41 | TEttinger | you mentioned cordova at one point |
| 23:41 | justin_smith | one if can't do it |
| 23:41 | Trioxin | yeah I suppose I'd have to port to their crap |
| 23:41 | TEttinger | renderscript, le ugh |
| 23:42 | Trioxin | for mobile |
| 23:42 | Trioxin | yea |
| 23:42 | bluezone | justin_smith: I thought I only had two :O |
| 23:42 | justin_smith | bluezone: even (keep going) odd (keep and keep going) empty (done) |
| 23:42 | justin_smith | so you need at least two ifs |
| 23:42 | justin_smith | or a cond |
| 23:46 | bluezone | Not sure hmm |
| 23:47 | justin_smith | bluezone: there are tree conditions to check for |
| 23:47 | justin_smith | right? |
| 23:47 | clojurebot | right is not wrong |
| 23:47 | justin_smith | even, odd, done |
| 23:47 | bluezone | yeah but even and odd is checked by 1 form |
| 23:47 | justin_smith | OK, so you need how many ifs? |
| 23:48 | justin_smith | also you don't need that (do ...) |
| 23:48 | bluezone | I would need 2 ifs, but why can't I put the conditions together with (and x x ) |
| 23:48 | bluezone | and then just use 1 if |
| 23:48 | justin_smith | bluezone: because that's still only one condition with two branches |
| 23:48 | justin_smith | you need three branches |
| 23:48 | bluezone | urghh I'm so stupid :D |
| 23:49 | bluezone | I see it |
| 23:49 | bluezone | Just not use to reasoning in this lisp style |
| 23:49 | justin_smith | while you are at it, look at the doc for cond on clojuredocs |
| 23:51 | justin_smith | bluezone: sorry, I might have jumped too far ahead with cond - cond replaces nested ifs |
| 23:51 | justin_smith | so you use it instead of if |
| 23:55 | thomsey | Hey friends, I'm messing around with seesaw & nothing I do will make (timer) fire it's callback. Has the API changed since the docs were updated last? |
| 23:57 | TEttinger | thomsey, what does your callback look like? |
| 23:57 | thomsey | (fn [e] (print "works")) |
| 23:58 | bluezone | REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEKT |
| 23:58 | thomsey | bcuz I didn't (fn [e] (print "works") e) |
| 23:58 | thomsey | ? |
| 23:58 | bluezone | justin_smith: Thanks so much :) |
| 23:59 | justin_smith | bluezone: np - one other small thing - you can define multiple arities for one function (and that way combine odd-num-seq and _odd-num-seq into one definition) |