2013-12-15
| 00:00 | andyf_ | rovar: I have often defined a function map-vals defined as (into {} (for [[k v] my-map] [k (f v)])) where my-map and f are args. |
| 00:01 | andyf_ | another short way is (zipmap (keys my-map) (map f (vals my-map))) |
| 00:01 | rovar | ooh |
| 00:01 | rovar | zipmap |
| 00:02 | rovar | me likey |
| 00:02 | rovar | very haskellish |
| 00:02 | rovar | my existing implementation was the into.. for comprehension |
| 00:02 | rovar | I just figured such an operation is common, and would have a clever combinator.. |
| 00:04 | andyf_ | It is reasonably common, but there is nothing in the core library for it. I think flatland/useful might define the into/for version for map-vals, map-keys, and map-keyvals IIRC |
| 00:04 | rovar | someone on stackoverflow had one using reduce, which might do well for large values of m |
| 00:06 | andyf_ | The into version uses transients, so I would guess it would be faster than the zipmap version, which doesn't use transients, for large maps. |
| 00:11 | coventry | andrei: You can do something like htis, though. https://www.refheap.com/21941 |
| 00:12 | rovar | andyf_, ya.. constructing two new lists to make a 3rd new list is most definitely slow. |
| 00:14 | andrei | coventry: Thanks! |
| 00:21 | seangrove | technomancy: Any thoughts on improving the `heroku run lein repl` experience? Or do you recommend live-repls to the running app instead? |
| 00:24 | rukor | interesting situation with clojurescript. when i have a macro in the project sources, lein cljsbuild takes 18s to compile the first time and 9s for each subsequent compilation. If i move the macro file to a library or project inside checkouts, initial compile time returns to 8s with subsequent compile times in subsecond. Is this expected? |
| 00:26 | dsrx | ,(doc zipmap) |
| 00:26 | clojurebot | "([keys vals]); Returns a map with the keys mapped to the corresponding vals." |
| 00:30 | murtaza52 | needed help on core.async |
| 00:31 | murtaza52 | I wanted to broadcast a msg on two different channels, how do I do that ? |
| 00:32 | bbloom | murtaza52: you can just write in to two different channels, unless you really need it to appear "simultaneous" |
| 00:32 | bbloom | murtaza52: but there is also some new stuff: https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L635 |
| 00:33 | bbloom | murtaza52: i'd be cautions however, you *probably* don't need that |
| 00:33 | murtaza52 | I have a program which receives some input from http, these have to be then processed by two different fns independently |
| 00:33 | murtaza52 | so I wanted to relay the data to the 2 diff fns, and then get it back |
| 00:33 | rovar | murtaza52, sounds like a job for mult |
| 00:34 | rovar | what do you mean get it back, exactly? |
| 00:34 | coventry | Is mult preferred to broadcast in core.async.lab? http://clojure.github.io/core.async/#clojure.core.async.lab/broadcast |
| 00:34 | murtaza52 | I mean after the data is processed, send it back on another channel, where the main thread of the program is listening |
| 00:34 | rovar | murtaza52, this is the best examples I've found for async so far : https://github.com/halgari/clojure-conj-2013-core.async-examples/blob/master/src/clojure_conj_talk/core.clj |
| 00:35 | rovar | so if your functions are passed in and out channels, and the in channels have 'tap'ped into a mult, the you're good to go |
| 00:36 | rovar | broadcast is very sweet, but if you don't need arbitrary topics, it might be overkill |
| 00:36 | rovar | pub/sub against topics, instead of just tapping into channels.. |
| 00:37 | rovar | if you want to get crazy, you can even 'mix' the two output channels from your functions |
| 00:37 | rovar | into a single channel |
| 00:39 | murtaza52 | rovar: thanks |
| 00:40 | murtaza52 | currently my fns only take a coll, however now I will create a higher order one which will also take in and out channels, isnt this complecting things ? |
| 00:40 | murtaza52 | how do u separate out the concerns |
| 00:46 | alew | is there a good way to test lein plugins that use eval-in-project? |
| 01:39 | logic_prog_ | does clojurescript have something like refer-clojure :exclude ? |
| 01:48 | tony | a |
| 02:32 | dnolen | logic_prog_: yes |
| 02:33 | dnolen | bbloom: todomvc in cljs is awesome |
| 03:58 | andrei | How can I get the version number of a loaded library in the repl? |
| 03:58 | justin_smith | andrei: I don't know that that is possible |
| 03:59 | justin_smith | lein classpath will show you the jar versions that would be pulled in |
| 04:00 | andrei | justin_smith: Ah. So version numbers are just in the filenames and are not recorded in the jars themselves? |
| 04:01 | justin_smith | they are in the project.clj |
| 04:01 | andrei | I have a library with a function that isn't public, but I'd like to expose it anyway. Is there a way to mark it as public? |
| 04:01 | justin_smith | the classpath reveals it via the path to the jar |
| 04:01 | andrei | justin_smith: Yup, I understand. But if it was recorded in the jar it should be available somehow |
| 04:01 | justin_smith | problem is project.clj has the same name |
| 04:01 | justin_smith | in every resource |
| 04:02 | justin_smith | how would you find the right one? |
| 04:02 | justin_smith | most projects don't define the version outside that (or the pom.xml that is generated from it) |
| 04:03 | andrei | justin_smith: Ah, oh well. Thanks! |
| 04:04 | andrei | justin_smith: And clojure doesn't read in the pom.xml file? |
| 04:04 | justin_smith | it does |
| 04:04 | justin_smith | but it uses it for resolving the dep |
| 04:04 | andrei | justin_smith: And then discards it? |
| 04:04 | justin_smith | it is not stored in the namespaces of the project anywhere |
| 04:04 | justin_smith | not that I know of |
| 04:04 | andrei | justin_smith: Oh ok. That's kinda strange. Seems like useful information to have around |
| 04:05 | justin_smith | regarding the private fn (in-ns 'other-ns) (def now-public private-fn) ; now "now-public" can be called from anywhere |
| 04:06 | justin_smith | also you could alter the var metadata and set :private false I think, but I find the above easier |
| 04:06 | andrei | justin_smith: Ah, awesome. Thanks! |
| 04:17 | Alfred | Can someone explain why " (iterate #(rand-int %) 10) " produces result sequence like this: " (10 8 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...) "? |
| 04:19 | progo | Alfred: rand-int is right-exclusive so the seq is bound to converge at some point |
| 04:19 | progo | (rand-int 10) produces numbers from 0 to 9. The next application will be atmost (rand-int 9) that produces numbers from 0 to 8. And so on. |
| 04:21 | Alfred | thank you for your explanation, any solution to this problem? |
| 04:21 | progo | Alfred: do you want a steady stream of random numbers? Try 'repeatedly' |
| 04:23 | Alfred | yes, steady series of random. but does 'repeatedly' behaves differently from 'iterate'? |
| 04:24 | progo | 'iterate' reuses the result of the last function call to the next iteration. 'Repeatedly' is more for side-effects and so |
| 04:25 | Alfred | bingo. you bring up an important point of 'iterate' which i missed, thank you very much! |
| 04:25 | progo | ie. (iterate f 0) => (0 (f 0) (f (f 0)) ...); while (repeatedly f) = ((f) (f) (f) ...) |
| 04:26 | progo | you're welcome. |
| 04:49 | markusXY | Hi, what is the recommended way to output an xml file which i modified with clojure.xml and clojure.zip? clojure.xml/emit seems to be discouraged and i am getting a npe. Does clojure.data.xml have a function that takes the same datastructure? |
| 04:49 | noprompt | bitemyapp: ah! i'm having a good time with this! wee! |
| 04:50 | noprompt | bitemyapp: i guess i just couldn't appreciate it before. |
| 04:59 | bitemyapp | noprompt: :D |
| 05:00 | noprompt | bitemyapp: the only thing that's been irritating is some minor things about haskell mode. |
| 05:01 | bitemyapp | noprompt: highly fixable, keep an eye on chris done's github |
| 05:14 | markusXY | I guess i'll just rewrite my code to fit it to clojure.xml.data. |
| 09:27 | ddellacosta | why is the second argument to subvec exclusive? |
| 09:28 | ddellacosta | any particular reason? Seems counter-intuitive to me |
| 09:28 | opqdonut | because half-open intervals make sense |
| 09:28 | opqdonut | a) if it were inclusive, you couldn't have an empty subvec (without using e.g. -1 as the pair for 0) |
| 09:29 | opqdonut | b) (subvec v start (+ start len)) is pretty elegant |
| 09:29 | opqdonut | c) see also http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html |
| 09:30 | progo | good stuff. |
| 09:30 | ddellacosta | opqdonut: checking out that link now, thanks |
| 09:30 | ddellacosta | opqdonut: re: a, sorry I don't get it--what do you mean an empty subvec? Like, (subvec v 4) or something? |
| 09:31 | opqdonut | ddellacosta: like (subvec v 0 0) will give you [] |
| 09:32 | progo | and that's rather elegant for some of the recursive applications. |
| 09:32 | opqdonut | yeah, it's a useful corner case often |
| 09:33 | opqdonut | you don't have to treat the empty case specially |
| 09:33 | ddellacosta | opqdonut: okay, that is helpful, thank you! #clojure is full of awesome, as usual... |
| 09:48 | danielszmulewicz | howy |
| 09:48 | danielszmulewicz | *howdy* |
| 10:38 | edw | Anyone (else) having cider blow up on them with a stack overflow when you try to eval `ns` forms in a file? |
| 10:46 | luxbock | is there a way to call an anonymous function from inside of itself? |
| 10:47 | justin_smith | luxbock: (fn named [n] (named (dec n))) |
| 10:47 | justin_smith | that of course will go infinitely, but you get the idea |
| 10:47 | luxbock | ah great |
| 10:47 | luxbock | how did I not think to try that |
| 10:48 | justin_smith | the extra name arg is not intuitive, I found it in some docs at some point |
| 10:50 | luxbock | also wanted to ask if doing stuff like this is considered bad style: https://gist.github.com/7974531 |
| 10:50 | luxbock | the (eval `(mget ~@indices)) part |
| 10:51 | Bronsa | luxbock: that's (apply mget indices) |
| 10:52 | pdk | anything involving eval is bad style |
| 10:52 | luxbock | ah right |
| 10:52 | luxbock | durr |
| 10:52 | Bronsa | assuming mget is a function and not a macro |
| 10:52 | luxbock | yep, it is |
| 10:58 | pepijndevos | how do I convert a js datastructure to cljs? |
| 11:00 | luxbock | https://gist.github.com/luxbock/6d8250cdc12b9eb27567 |
| 11:00 | brainproxy | pepijndevos: tried js->clj ? |
| 11:00 | luxbock | does this happen because I gave the anonymous function a name? how would I fix this? |
| 11:01 | pepijndevos | brainproxy, yes. gives nil |
| 11:02 | pepijndevos | oh durr... string keys |
| 11:04 | brainproxy | yeah, I've made that mistake too |
| 11:04 | justin_smith | luxbock: keyword application does not work that way |
| 11:05 | justin_smith | (:utility-fn pd [:confess :confess]) says look for :utility-fn and return [:confess :confess] if not found |
| 11:05 | justin_smith | you want ((:utility-fn pd) [:confess :confess]) |
| 11:06 | justin_smith | ,(:a {} :b) ; viz |
| 11:06 | clojurebot | :b |
| 11:06 | justin_smith | ,(:a {:a 0} :b) |
| 11:06 | clojurebot | 0 |
| 11:06 | luxbock | ah right, thanks |
| 11:35 | supersym | anyone got experience with the googl api client libraries? whats the deal with them, since they aren't hosted on maven or anything... can I just include this with my app for redeployment? And if so, how do I ensure they are picked up by leiningen? Do I just do a mvn local install and its good or? |
| 11:36 | seangrove | supersym: They're not especially nice |
| 11:37 | jonasen | Bronsa: andyf: experimenting with ast-indexing in eastwood https://github.com/jonase/eastwood/compare/indexing |
| 11:37 | seangrove | supersym: They're on maven though, you'll need something like https://www.refheap.com/ea915eb226642598ecfeb5ab9 in your lein dependencies |
| 11:37 | jonasen | Bronsa: andyf: It's a port of an old project of mine (https://github.com/jonase/scape) |
| 11:38 | supersym | seangrove: thank you... I figured about as much (that they weren't friendly and all... ^^) |
| 11:54 | Bronsa | jonasen: uuh nice! |
| 11:59 | adomokos | #clojure |
| 12:07 | instilled | anyone knows how to exclude ns from being read with 'lein cloverage'? I've tried 'lein cloverage -n "some-regex" but that does not work. it seems that cloverage will read the lein's :source-paths property no matter what options i'm passing to lein cloverage. any idea? |
| 12:16 | xcthulhu | Is there a way to insert if not exists in clojure? |
| 12:16 | xcthulhu | Erm, korma |
| 12:18 | logic_prog | for a svg group element, is it possible to (1) set it's size and (2) setup a background color? or do I have to (3) put a rectangle in the svg group element? |
| 12:18 | logic_prog | wrong channel, sorry |
| 12:19 | logic_prog | though if you're an svg expert, you're welcome to answer |
| 12:20 | munderwo | Hi all, I played around with the clojure koans a little while ago and in that the jam that ran the tests stayed running and re-ran the tests when a file changed? Is there a plugin that makes that happen? |
| 12:24 | supersym | erh...clojure 'import' doesn't error on ficticious names? |
| 12:24 | supersym | no way of telling |
| 12:27 | supersym | oh... only on ns directives it does I see |
| 12:28 | instilled | xcthulhu: you can use a raw query to achieve that. |
| 12:28 | xcthulhu | logic_prog: For a <g> in sag, you can set it's dimensions, and you can also set its scale using a transformation attribute |
| 12:28 | xcthulhu | s/sag/svg/ |
| 12:29 | xcthulhu | stupid auto-correct |
| 12:29 | xcthulhu | Also its*, but that's just me being bad at grammar so I can't blame autocorrect on that one |
| 12:30 | xcthulhu | You can't set the background in a <g>; I recommend using a <rect> for that |
| 12:30 | andyf_ | Bronsa: ping |
| 12:31 | Bronsa | andyf_: pong |
| 12:31 | xcthulhu | instilled: Yeah, whenever I'm using an ORM, part of me just wants to cut to the chase and use RAW SQL |
| 12:31 | andyf_ | jonasen: That use of datomic looks interesting. I'll have to understand it some day, but not today :-) |
| 12:32 | xcthulhu | But then someone always complains about Little Bobby Tables... |
| 12:33 | andyf_ | Bronsa: I haven't been understanding all of your (very welcome) changes to Eastwood's code for calling the analyzer, and was trying to a bit more. Do you consider 'emit-form' a phase of analysis, compilation, code generation, or something else? I know that there might not always be a clear bright line between those. |
| 12:34 | Bronsa | andyf_: basically emit-form transforms an AST back into a clojure form |
| 12:34 | Bronsa | andyf_: the problem was this: suppose you have (defmacro x [] (println "foo")) |
| 12:34 | andyf_ | Bronsa: Would you expect a CinC compiler to need emit-form? Or is it intended for debugging purposes? |
| 12:35 | Bronsa | when you call (analyze '(x) (empty-env)) it gets macroexpanded and "foo" gets printed |
| 12:35 | Bronsa | then we eval that, we macroexpand it again and print "foo" twice |
| 12:35 | Bronsa | calling emit-form on the AST returns an already macroexpanded ofmr |
| 12:36 | Bronsa | andyf_: I don't use emit-form in t.a.jvm or t.e.jvm, it's there for convenience |
| 12:36 | andyf_ | OK, so this is part of the changes you made where the commit comment mentioned macros with side effects. |
| 12:36 | LordVanSprang | Raynes, ping |
| 12:37 | Bronsa | andyf_: yes, the other part is, if analyze has a bug and returns a wrong AST, we're now trying to eval the form corresponding to that AST |
| 12:37 | xcthulhu | Bronsa: Looks like you want "once-only" semantics for macros: |
| 12:37 | Bronsa | this makes it crash instead of simply accepting a wrong AST |
| 12:37 | xcthulhu | http://tsdh.wordpress.com/2011/09/23/once-only-evaluation-for-clojure-macros/ |
| 12:37 | Bronsa | and i can fix it. |
| 12:37 | xcthulhu | Doug Hoyt would be pleased |
| 12:38 | instilled | xcthulhu: i suggest you write it as raw sql and forget about it :) |
| 12:38 | xcthulhu | instilled: Yeah, someone's gonna complain about Little Bobby Tables probably |
| 12:38 | andyf_ | Bronsa: So this way of doing it should also give more complete test coverage of tools.analyzer. That's good. |
| 12:38 | xcthulhu | But so much for ORMs |
| 12:39 | Bronsa | andyf_: yeah, the failures you're seeing on core.async have nothing to do with TANAL-30, I'm investigating now the cause |
| 12:40 | andyf_ | Bronsa: I am going to try adding in some code to Eastwood to catch exceptions from emit-form, and eval, so that Eastwood's messages can give everyone (but especially us) a quick indication of where the exception is occurring. |
| 12:41 | Bronsa | yeah, that would be nice. right now most of the errors will be swallowed by a "no method in multimethod -emit-form for value null" or something like that |
| 12:43 | andyf_ | Bronsa: I wasn't yet thinking of making it more refined than that, just give a likely guess as to why that exception is occurring. You are saying that sometimes that same exception is thrown for different root cause than TANAL-30 example? |
| 12:43 | Bronsa | yes |
| 12:45 | andyf_ | OK, I will make sure to make any error message I make for now have weasel words like "this might be because of X, but there may be other reasons", and elaborate on those more later. |
| 12:46 | Bronsa | yeah, don't spend too much time on that. |
| 12:47 | andyf_ | Most of my time on Eastwood now is spent finding new categories of crashes :-) |
| 12:47 | Bronsa | and I thank you for that :P |
| 12:47 | Raynes | LordVanSprang: Hi. |
| 12:50 | LordVanSprang | Raynes, would you know where Chousuke the Finn is at? |
| 12:51 | LordVanSprang | Also, I Worship His Shadow. |
| 12:51 | Raynes | lol |
| 12:51 | Raynes | gg |
| 12:51 | Raynes | Bronsa: How comes the Clojure in Clojuring? |
| 12:53 | Bronsa | Raynes: working mostly on the analyzer these days, will go back on the emitter once the analyzer is stable :P |
| 12:57 | bbloom | Bronsa: mmm decomplection |
| 13:08 | pcn | Raynes: Sorry to bother you, but I have a question about importing your fs module |
| 13:08 | pcn | rather requiring it |
| 13:09 | Raynes | Sure, shoot |
| 13:09 | pcn | I've got it in my project.clj: [me.raynes/fs "1.4.5"] |
| 13:09 | pcn | but when I lein repl, I keep getting this message#<FileNotFoundException java.io.FileNotFoundException: Could not locate fs__init.class or fs.clj on classpath: > |
| 13:10 | Raynes | What code are you typing? |
| 13:10 | Raynes | (require '[me.raynes.fs :as fs]) |
| 13:11 | pcn | The core.clj has a (ns [...] :require [me.raynes/fs :as mrfs] |
| 13:11 | pcn | Ah me.raynes.fs not /fs |
| 13:12 | Raynes | :) |
| 13:13 | pcn | Is there a doc about what that means - the difference between lein's dependencies syntax and the require syntax? |
| 13:13 | pcn | Or as in this case how they're probably only tenuously connected? |
| 13:14 | andyf_ | pcn: require uses Clojure namespaces. Leiningen uses Maven artifact/<something> |
| 13:14 | andyf_ | Probably Maven <group>/<artifact> |
| 13:14 | andyf_ | A single line in the project.clj file could pull in many many namespaces |
| 13:16 | pcn | I feel like little pitfalls like this will be a fact of life. I've been dodging java since it was created, so I'm not particularly good with its ecosystems |
| 13:16 | pcn | andyf_ thanks though, that does give me a point of reference. |
| 13:27 | pcn | '10 |
| 13:29 | andyf_ | pcn: If you want a form to be evaluated in the IRC channel, put a , first |
| 13:31 | egosum | andyf_: he was quoting it; he wanted to prevent evaluation ;) |
| 13:31 | pcn | Sorry, that was my tmux binding for commands leaking out :( |
| 13:32 | pcn | Raynes: really, java 1.6 doesn't have methods for hard links? |
| 13:32 | pcn | Wow |
| 13:34 | pcn | It doesn't look like seq can be run on a namespace to check for functions existing? I want to issue a loud "fail" if I can't get fs/link. |
| 13:34 | pcn | What can I do to check that? |
| 13:35 | bbloom | i wish my file browser could topologically sort files by the dependency tree, rather than alphabetically |
| 13:36 | bbloom | i've gotten so used to reading big clojure files in order. i dunno what to do when there are like 10 files :-P |
| 13:36 | Raynes | pcn: Check ns-publics. |
| 13:36 | pcn | (ns-publics fs) seems to fail: CompilerException java.lang.RuntimeException: Unable to resolve symbol: fs in this context [etc.] |
| 13:36 | pcn | but the namespace is otherwise valid |
| 13:37 | TEttinger | quote it? |
| 13:37 | Raynes | That isn't a namespace. That's a symbol. |
| 13:37 | Raynes | &(doc ns-publics) |
| 13:37 | lazybot | java.lang.SecurityException: You tripped the alarm! ns-publics is bad! |
| 13:37 | Raynes | ugh |
| 13:37 | pcn | l0l |
| 13:37 | TEttinger | ,(doc ns-publics) |
| 13:37 | clojurebot | "([ns]); Returns a map of the public intern mappings for the namespace." |
| 13:37 | Raynes | ,(doc the-ns) |
| 13:37 | clojurebot | "([x]); If passed a namespace, returns it. Else, when passed a symbol, returns the namespace named by it, throwing an exception if not found." |
| 13:37 | Raynes | (ns-publics (the-ns 'me.raynes.fs)) |
| 13:41 | pcn | OK, I'll put the difference between the local binding and the ns on my list of things for deep thought. Thanks! |
| 13:42 | alew | Can I rely on the lein function eval-in-project to return the last form evaluated? |
| 13:44 | pepijndevos | probably |
| 13:44 | alew | It seems to want to return nil... and looking at the source I can't figure out why that would be |
| 13:45 | Bronsa | andyf_: mhph this is a problem ##`(~Object ~'Object) |
| 13:45 | lazybot | ⇒ (java.lang.Object Object) |
| 13:46 | Bronsa | ,#`(~Object ~'Object) |
| 13:46 | clojurebot | #<RuntimeException java.lang.RuntimeException: Reader tag must be a symbol> |
| 13:46 | TEttinger | ,`(~Object ~'Object) |
| 13:46 | clojurebot | (java.lang.Object Object) |
| 13:47 | Bronsa | ,#((juxt identity (partial mapv class)) `(~Object ~'java.lang.Object)) |
| 13:47 | clojurebot | #<sandbox$eval115$fn__116 sandbox$eval115$fn__116@16e6127> |
| 13:47 | TEttinger | one # will return the anon fn |
| 13:47 | Bronsa | ,((juxt identity (partial mapv class)) `(~Object ~'java.lang.Object)) |
| 13:47 | clojurebot | [(java.lang.Object java.lang.Object) [java.lang.Class clojure.lang.Symbol]] |
| 13:48 | TEttinger | that's uh interesting |
| 13:48 | TEttinger | one has Object and one has java.lang.Object... |
| 13:48 | andyf_ | Bronsa: Did you find an example of that in the wild? |
| 13:48 | coventry | In what context is that a problem? Isn't it what you'd expect? |
| 13:49 | Bronsa | andyf_: yeah, this is what's breaking core.async |
| 13:50 | Bronsa | because the defprotocol macro returns {:on the.protocol :on-interface the.protocol ..} |
| 13:50 | Bronsa | except one is a symbol, the other a class |
| 13:50 | coventry | Oh, I see. |
| 13:50 | Bronsa | but when we eval that, they both get evalauted as a Class |
| 13:50 | hyPiRion | Well |
| 13:50 | hyPiRion | ,(binding [*print-dup* true] (pr-str `(~Object ~'java.lang.Object))) |
| 13:50 | clojurebot | "(#=java.lang.Object java.lang.Object)" |
| 13:51 | Bronsa | andyf_: I don't know if I can "fix" the emit-form pass to wrap symbols with a (quote the-sym), we may need to use a different fix for avoiding a doubl eevaluation |
| 13:51 | Bronsa | hyPiRion: yeah well, the problem is we need to eval the form |
| 13:52 | andyf_ | "We" meaning in the context of Eastwood linting |
| 13:52 | hyPiRion | oh, hm. |
| 13:55 | Bronsa | A possible solution would be to walk the form replacing all the symbols with (list 'quote symbol), but we need to do that only outside of a (quote ..) form |
| 13:55 | Bronsa | so clojure.walk is a no-go there |
| 13:56 | coventry | riddley will avoid walking into quoted forms. |
| 14:00 | andyf_ | Bronsa: Don't mean to distract you, but regarding TANAL-30, when you say that this is a Clojure bug, do you mean that you believe that correct Clojure code for calling a fn in another namespace that is type-hinted with a Java class return value, that Java class must be imported wherever that function is called? |
| 14:01 | Bronsa | no, the opposite. the tag should get qualified |
| 14:04 | andyf_ | Bronsa: Qualified meaning a full Java package.classname ? But if it is not imported, in the calling namespace, how would fully qualifying it in that way help it compile? |
| 14:05 | andyf_ | Pardon my ignorance, but fully qualified package.classnames can be used without importing them? |
| 14:05 | Bronsa | andyf_: it should be qualified in the def |
| 14:06 | Bronsa | e.g. you have (ns foo (:import bar.Baz)) (defn x ^Baz []) |
| 14:06 | Bronsa | andyf_: sure |
| 14:06 | Bronsa | ,Collection |
| 14:06 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: Collection in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:06 | Bronsa | ,java.util.Collection |
| 14:06 | clojurebot | java.util.Collection |
| 14:07 | andyf_ | Got it. I've got to leave now. Thanks for the info. |
| 14:07 | Bronsa | np |
| 14:12 | ksaua | say i have a function, A, which returns a lazy sequence of numbers. How do I then create another function, B, which takes this function and lazily returns latest element of function A + last element of function B? |
| 14:13 | bbloom | ksaua: did you say that right? B is going to return something from itself? |
| 14:14 | ksaua | B is another function that returns a lazy seq |
| 14:14 | ksaua | so, yes? |
| 14:14 | bbloom | can you be more concrete about what you want? ie provide an example |
| 14:14 | ksaua | sure |
| 14:15 | ksaua | I have a function, A, which returns the following lazy sequence [1 2 3 4 5 7 ...], How do I create a function B, which takes A and returns [1 3 6 10 15 22 ..] |
| 14:16 | ksaua | if A had instead returned [1 1 1 1] B(A) would return the lazy seq [1 2 3 4] |
| 14:16 | bbloom | first, vectors with square brackets are not lazy. you're looking for parens :-) |
| 14:17 | ksaua | heh, yeah, i mean parens |
| 14:17 | bbloom | so you want to basically want to sum A0+A1, A1+A2, A2+A3 ... etc yes? |
| 14:17 | ksaua | Yup |
| 14:18 | coventry | ,(doc reductions) |
| 14:18 | ash__ | ^-- any storm users here? |
| 14:18 | clojurebot | "([f coll] [f init coll]); Returns a lazy seq of the intermediate values of the reduction (as per reduce) of coll by f, starting with init." |
| 14:18 | bbloom | ,(let [a [1 2 3 4 5 7]] (map + a (cons 0 a))) |
| 14:18 | clojurebot | (1 3 5 7 9 ...) |
| 14:19 | AeroNotix | Emacs/Clojure/Flymake, what do people use? |
| 14:19 | bbloom | something like that? |
| 14:19 | bbloom | but yeah, reductions is awesome too |
| 14:19 | bbloom | oh you don't want parallel sums, you want successive sums |
| 14:20 | bbloom | yeah, use reductions |
| 14:20 | ksaua | Hm, sure, as long as that works where a is a lazy sequence, which i guess it does because map and cons is lazy? |
| 14:20 | bbloom | cons is not lazy |
| 14:20 | bbloom | ,(reductions + 0 [1 2 3 4 5 7]) |
| 14:20 | clojurebot | (0 1 3 6 10 ...) |
| 14:21 | bbloom | ,(next (reductions + 0 [1 2 3 4 5 7])) |
| 14:21 | clojurebot | (1 3 6 10 15 ...) |
| 14:21 | bbloom | cons will preserve laziness past the non-lazy, prepended head |
| 14:21 | ksaua | okay |
| 14:21 | ksaua | I'll try reductions, seems to be what im looking for, thank you so much |
| 15:21 | logic_prog | how does parsec handle operator precedence? |
| 15:27 | pepijndevos | logic_prog #haskell? |
| 15:28 | coventry | Incidentally, what *is* the right channel for svg questions? |
| 15:29 | hyPiRion | the graphics format? |
| 15:29 | logic_prog | pepijndevos: good call |
| 15:29 | logic_prog | #svg |
| 15:29 | coventry | logic_prog: Thanks. hyPiRion: Yeah. |
| 15:29 | rovar | I'm trying to work through the clojure emacs to tutorial.. and it's telling me to execute tests via C-x C-- |
| 15:30 | hyPiRion | coventry: Well, I'd guess if there's not a lot of activity within #svg, you could piggyback on some JS framework using svg for visualisation. |
| 15:30 | hyPiRion | their IRC channel, that is |
| 15:30 | rovar | ooh nm |
| 15:31 | noncom | ,(name nil) |
| 15:31 | clojurebot | #<NullPointerException java.lang.NullPointerException> |
| 15:31 | dav | Is there a way to get lein test to print even when a test succeeds? |
| 15:31 | dav | Some verbosity level or something? |
| 15:31 | noncom | there is a problem ^ (name nil) gives up an exception. is there a way to write something like (or (name passed-name-maybe-nil) "default-name") ? |
| 15:32 | noncom | without risking an excetion |
| 15:32 | noncom | oh just realized that i can put (or) inside (name)! |
| 15:32 | noncom | nevertheless, it is weird that it gives an NPE |
| 15:33 | eric_normand | noncom: (if x (name x) "default") |
| 15:33 | coventry | ,(doc fnil) |
| 15:33 | clojurebot | "([f x] [f x y] [f x y z]); Takes a function f, and returns a function that calls f, replacing a nil first argument to f with the supplied value x. Higher arity versions can replace arguments in the second and third positions (y, z). Note that the function f can take any number of arguments, not just the one(s) being nil-patched." |
| 15:33 | justin_smith | ,((fnil name "nil") nil) |
| 15:33 | clojurebot | "nil" |
| 15:33 | justin_smith | ,((fnil name "nil") :ok) |
| 15:33 | clojurebot | "ok" |
| 15:34 | noncom | yes, i know the (if) approach but it is not as cool as (or)! |
| 15:34 | eric_normand | noncom: fnil is good, too |
| 15:35 | noncom | hmmm (fnil).. never heard of that.. but actually i just realized i can do (name (or smth "default")). |
| 15:35 | noncom | howwever thanks for the insight on fnil |
| 15:35 | noncom | is there any library for clojure that performs intelligent seatch like one in SublimeText? |
| 15:35 | noncom | s/seatch/search |
| 15:36 | noncom | like picking strings by relevence from a pool of strings |
| 15:39 | pepijndevos | define relevance |
| 15:40 | noncom | pepinjndevos: uhm.. it is hard to explain exactly.. just if you have used SublimeText 2 text search, then you would know. in its menus, it sorts items in the menu list in the order starting from the best matches |
| 15:41 | noncom | the point is that if you enter like "pc" and you have "popcorn" and "peach cake" and "pc" and "pocket" then the order will be like "pc" "pocket" "popcorn" "peach cake" |
| 15:42 | justin_smith | sounds like levenstein difference |
| 15:42 | justin_smith | http://en.wikipedia.org/wiki/Levenshtein_distance sp. sic |
| 15:42 | justin_smith | http://clojuredocs.org/incanter/1.2.3-SNAPSHOT/incanter.stats/levenshtein-distance |
| 15:42 | justin_smith | looks like it comes with incanter? |
| 15:43 | amalloy | i doubt if it's levenshtein distance, since then "id" would sort before "pocket", which seems pretty rubbish |
| 15:43 | justin_smith | ahh |
| 15:43 | justin_smith | good point |
| 15:43 | justin_smith | I wonder how iswitchb does it |
| 15:44 | justin_smith | it reminds me of that behavior |
| 15:44 | pepijndevos | i remember fish does this too |
| 15:44 | coventry | justin_smith: I haven't looked, but my impression is that time of last visit plays a big role there. |
| 15:45 | justin_smith | coventry: fair enough, but even on a virgin checkout it does sort matches based on character subset |
| 15:45 | cYmen | How do I install cider when this marmelade thing doesn't work? |
| 15:46 | coventry | justin_smith: Is it doing some kind of fuzzy matching? I thought it was just exact substrings. |
| 15:46 | justin_smith | cYmen: wait for them to fix it, or install package from a git checkout |
| 15:46 | justin_smith | coventry: it does fuzzy matching with my config |
| 15:46 | justin_smith | though that may be because of some customization I forgot I did |
| 15:47 | noncom | hmm, people menthion Levenshtein distance here too : https://www.sublimetext.com/forum/viewtopic.php?t=5661 |
| 15:47 | noncom | mabye it is some superset of it |
| 15:47 | noncom | or a subset :D |
| 15:47 | justin_smith | yeah, some parameterized generalization from it maybe |
| 15:48 | hyPiRion | I'd guess they use Damerau-Levenshtein |
| 15:48 | hyPiRion | And perhaps take into account keyboard layout |
| 15:48 | dav | Is there a way to get lein test to print even when a test succeeds? |
| 15:49 | coventry | cYmen: https://github.com/clojure-emacs/cider#manual |
| 15:50 | hyPiRion | dav: Are you interested in feedback from a test, or actually doing printing? |
| 15:51 | dav | hyPiRion: having some generic printing while tests are running |
| 15:51 | hyPiRion | ah |
| 15:52 | dav | hyPiRion: I ended up writing this macro: http://paste.debian.net/71019/ |
| 15:52 | dav | hyPiRion: wondering if there's a better way. |
| 15:53 | hyPiRion | dav: huh, `lein test` would print out e.g. "lein test my-lib.test.combined" whenever running that test namespace |
| 15:54 | cYmen | coventry: My lack of prior emacs knowledge makes it hard to fill in the gaps. :) |
| 15:54 | hyPiRion | along with total tests + assertions, plus failures and errors |
| 15:55 | coventry | cYmen: Try this: mkdir -p ~/.emacs.d/vendor && cd ~/.emacs.d/vendor && git clone https://github.com/clojure-emacs/cider.git |
| 15:55 | coventry | cYmen: Then put (add-to-list 'load-path "~/emacs.d/vendor") (require 'cider) in your ~/.emacs file. |
| 15:56 | coventry | Oh, you'll have to install clojure-mode, dash.el and pkg-info the same way. What a pain. |
| 15:56 | cYmen | Oh, I can't use the ones from marmalade? |
| 15:56 | coventry | If they install, that should be fine. |
| 15:57 | cYmen | In that case I don't understand what's wrong. |
| 15:57 | cYmen | File error: Cannot open load file, cider |
| 15:57 | pinkwerks | I'm missing some basic let usage and hiccup, how do i get both :h1 & :h2 to generate with this form? I only get the :h2 back : (let [dbval 1] [:h1 dbval] [:h2 dbval]) |
| 15:58 | cYmen | Oh wait, I put it in my init.el |
| 15:59 | cYmen | As expected that didn't change anything. |
| 15:59 | amalloy | pinkwerks: the forms in a 'let are evaluated for side effects, and only the last one is actually returned, so of course hiccup can't render the :h1 (which you never returned) |
| 15:59 | amalloy | instead, hiccup lets you use lists to group things: (let [dbval 1] (list [:h1 dbval] [:h2 dbval])) |
| 16:00 | coventry | cYmen: Oh, you'll probably need (add-to-list 'load-path "~/emacs.d/vendor/cider") if that's the path you put the cider repository on. Someone should PR the README to clarify. |
| 16:00 | pinkwerks | amalloy : now I understand thanks |
| 16:01 | cYmen | coventry: I tried that as well, didn't work either. d) |
| 16:01 | cYmen | :) |
| 16:02 | coventry | C-h v load-path RET. Check that it's actually getting on the load-path. |
| 16:03 | cYmen | Hm..that list is very long. |
| 16:03 | coventry | Search with C-s. :-) |
| 16:04 | xeqi | cYmen: are you using ~/emacs.d or ~/.emacs.d ? |
| 16:05 | xeqi | in the (add-to-list load-path ..) |
| 16:05 | cYmen | xeqi: That was exactly the error that I just corrected. How do you know? :) |
| 16:05 | xeqi | ran through the manual install yesterday |
| 16:05 | cYmen | haha |
| 16:06 | xeqi | something else to be PR/fixed in the cider readme |
| 16:06 | cYmen | xeqi: Other things I should know? Like why can't I just M-x cider-jack-in now? :/ |
| 16:07 | cYmen | Is that some shortcut that marmalade has added on my other machines? |
| 16:07 | xeqi | I usually open a clojure file and C-c C-j |
| 16:07 | emaphis | in reference to cYmen's question, would it be unwise to install cider from Melpa? |
| 16:08 | xeqi | works for me with the clojure-mode, dash.el and pkg-info from marmalade, and cider manually downloaded off melpa |
| 16:08 | coventry | In nrepl, at least, C-c M-j just does nrepl-jack-in. |
| 16:08 | xeqi | emaphis: I'm not big on running from master (like melpa does) |
| 16:09 | cYmen | Well, according to my emacs that symbols definition is void. |
| 16:09 | xeqi | C-c M-j is what I mean |
| 16:09 | emaphis | Yes, I just leave Melpa alone. :-) |
| 16:09 | cYmen | C-c M-j in a clojure file seems to work. |
| 16:10 | cYmen | *sigh* |
| 16:10 | cYmen | Using tools you only understand a fraction of, so much fun. |
| 16:10 | justin_smith | and what function does that run? |
| 16:10 | justin_smith | M-x describe-key |
| 16:11 | cYmen | nrepl-jack-in |
| 16:13 | cYmen | So...what does this mean? |
| 16:13 | amalloy | justin_smith: why M-x describe-key rather than C-h k? |
| 16:13 | justin_smith | they do the same thing, no? |
| 16:13 | justin_smith | I find for learners presenting the name rather than mnemonic helps |
| 16:13 | justin_smith | just a style thing I guess |
| 16:14 | amalloy | makes sense, i suppose |
| 16:14 | coventry | cYmen: It's unclear why nrepl-jack-in failed the first time and C-c M-j worked the second, since they are apparently doing the same thing. |
| 16:14 | cYmen | The first time I tried cider-jack-in. |
| 16:14 | justin_smith | amalloy: also it will tell you the key shortcut after any m-x command, so that info is still provided |
| 16:14 | coventry | Ah, right. |
| 16:14 | Bronsa | me too. |
| 16:15 | cYmen | Which works on the machines where I installed it with marmalade. |
| 16:15 | justin_smith | sounds like version skew |
| 16:16 | cYmen | Probably. Anyway, as usual, thanks for the great support. |
| 16:18 | bbloom | ,(bit-or 5) ; aw sad face |
| 16:18 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/bit-or> |
| 16:21 | letstest | Hi - I am bumbling along trying to learn clojure. I am trying to use a clojure library in the repl. how would I use a particular library. The one I am trying to use is this - "https://github.com/jdhollis/forecast-clojure" |
| 16:21 | letstest | what do I have to do in the repl to have access to it? |
| 16:23 | justin_smith | letstest: I would say adding the maven coords to your project.clj :dependencies vector |
| 16:23 | justin_smith | (in a project) |
| 16:23 | letstest | oh ok. I have to add it to a project. I can't just try using it without that |
| 16:23 | justin_smith | and then setting up the credentials in your ~/.lein/profiles.clj as they show in their readme |
| 16:23 | justin_smith | well you CAN, but that is not easier |
| 16:24 | letstest | alright. I will do that |
| 16:24 | justin_smith | (there is alembic / pomegranate) |
| 16:24 | letstest | i.e put it in project.clj |
| 16:24 | letstest | thank you |
| 16:24 | justin_smith | then for the key, probably easier to go the env var way, if you know how to set a shell environment variable |
| 16:24 | justin_smith | np |
| 16:25 | letstest | going to try it now |
| 16:30 | letstest | justin_smith - i did that and got into the repl and saw it being downloaded. But, when I do (require '[forecast-clojure.core :as forecast]) - i get back nil. What does that mean? |
| 16:31 | coventry | letstest: successful import. |
| 16:31 | letstest | oh! thanks coventry but when i use it (forecast "37.8267" "-122.423") |
| 16:32 | letstest | i get this CompilerException java.lang.RuntimeException: Unable to resolve symbol: forecast in this context, compiling:(/tmp/form-init1327445774299770078.clj:1:1) |
| 16:32 | letstest | shouldnt that have worked? |
| 16:32 | coventry | letstest: The readme is wrong. Try replacing forecast with forecast/forecast (guessing.) |
| 16:33 | letstest | i get back nil if i do that |
| 16:33 | letstest | user=> (forecast/forecast "37.8267" "-122.423") nil |
| 16:35 | coventry | Probably means the api call failed somehow. https://github.com/jdhollis/forecast-clojure/blob/master/src/forecast_clojure/core.clj#L14 |
| 16:35 | letstest | oh |
| 16:35 | letstest | i may have set my environment variable wrong |
| 16:35 | letstest | strange error if that is the case |
| 16:37 | noncom | why it is not that a namespace is a clojure datastructure, why is it something so different? |
| 16:37 | bbloom | noncom: a few reasons. for one thing, they are mutable |
| 16:37 | bbloom | by design |
| 16:38 | bbloom | noncom: also, they exist before clojure is fully bootstrapped, so there's that too |
| 16:38 | justin_smith | letstest: you can set env variables with (System/setenv "var" "new-value") |
| 16:38 | justin_smith | without restarting that is |
| 16:39 | noncom | hmm, i see, yes that makes.. |
| 16:39 | noncom | i have to learn more about environments though |
| 16:40 | noncom | oh you were talking to a different person1 |
| 16:45 | letstest_ | justin_smith - do i need someting in my project.clj to do that? |
| 16:46 | justin_smith | no, that works right in the repl |
| 16:46 | justin_smith | as long as the library looks in the env for the credentials that should work |
| 16:46 | letstest_ | i get "CompilerException java.lang.IllegalArgumentException: No matching method: setenv, compiling:(/tmp/form-init1327445774299770078.clj:1:1) " |
| 16:46 | justin_smith | erm... |
| 16:47 | justin_smith | I could have sworn there was a setenv |
| 16:47 | justin_smith | I was likely confused, sorry |
| 16:47 | letstest_ | np |
| 16:48 | letstest_ | would be useful if there was :) |
| 16:48 | justin_smith | I guess as far as the jvm is concerned mutating the env is non-portable |
| 16:49 | letstest_ | oh |
| 16:50 | hyPiRion | justin_smith: yes, that's exactly the reason |
| 16:52 | letstest_ | i still cant get that library to work, just gives me nil |
| 16:53 | letstest_ | is there a tutorial or article that that someone can point me to show how to write a similar library? Maybe I have to write my own |
| 16:53 | justin_smith | if you do (System/getenv "FORECAST_KEY") does that show your api key? |
| 16:53 | letstest_ | let me try |
| 16:53 | letstest_ | oh - nope |
| 16:53 | letstest_ | gives me nil |
| 16:53 | justin_smith | env FORECAST_KEY=supersecret lein repl |
| 16:54 | letstest_ | ok |
| 16:54 | justin_smith | try that from the command line in the top level of your project |
| 16:54 | justin_smith | and in the repl that runs you should be able to use the API |
| 16:55 | letstest_ | That worked!! |
| 16:55 | letstest_ | thank you! |
| 16:55 | justin_smith | awesome |
| 16:55 | justin_smith | np |
| 16:55 | justin_smith | so you can start your process with the var explicitly that way, or put the env key in your profiles.clj (as it mentions in that project's docs) |
| 16:56 | letstest_ | i actually did try profiles.clj but it didnt work. Will fool around with the environment variables. i have had similar problems before |
| 16:57 | letstest_ | now that i know this works. The issue is on my end |
| 17:26 | rukor | qz: /quit |
| 17:31 | noncom | how do i stop a server in nrepl? |
| 17:32 | noncom | (stop-server) accepts some args map but not what (start-server) returns |
| 17:32 | justin_smith | (System/exit 0) ? |
| 17:32 | noncom | :) |
| 17:32 | justin_smith | or do you mean some subprocess? |
| 17:32 | noncom | yeah, in my app i start an nrepl server |
| 17:32 | justin_smith | ahh |
| 17:33 | justin_smith | does it have a .stop method by any chance? |
| 17:33 | justin_smith | there should be a thread / process like object somewhere in what it returns, I would assume |
| 17:34 | noncom | (start-server) returns something like #clojure.tools.nrepl.server.Server{:server-socket ..bunch of stufff goes here ...} |
| 17:34 | noncom | what is that? |
| 17:34 | noncom | #Server{} what datatype is this? |
| 17:35 | noncom | oh its a defrecord.. |
| 17:35 | noncom | never used one |
| 17:35 | justin_smith | a record from defrecord |
| 17:35 | justin_smith | https://github.com/clojure/tools.nrepl/blob/master/src/main/clojure/clojure/tools/nrepl/server.clj#L52 |
| 17:35 | justin_smith | this is the code for stop-server |
| 17:35 | justin_smith | may help |
| 17:35 | noncom | so you were completely right, it is Cloaseble |
| 17:36 | justin_smith | well my first guess was .stop |
| 17:36 | justin_smith | but yeah |
| 17:37 | justin_smith | yeah, now that I look at the definition for Server defstruct, it implements close from Closeable |
| 17:38 | noncom | and i look too and see that (stop-server) must work with it. so it is a mistake somewhere in my code |
| 17:39 | justin_smith | .close calls stop-server |
| 18:00 | danielszmulewicz | technomancy: ping |
| 18:06 | logic_prog | is there a good explaination somewhere of how clojure's ident rules work (as implemented in emacs) ? |
| 18:12 | logic_prog | is there a way I can construct a symbol/object/something-magical that clojure.edn/read-string can not construct? |
| 18:12 | logic_prog | context: I'm annotating some clojure sexps, and I need certain annotations (that include data) that can not be part of any valid clojure sexp |
| 18:12 | bbloom | logic_prog: trivially: |
| 18:12 | bbloom | ,(Object.) |
| 18:12 | clojurebot | #<Object java.lang.Object@844a08> |
| 18:13 | logic_prog | *thinking* |
| 18:13 | bbloom | specifically, that's what the #<...> syntax is for |
| 18:13 | logic_prog | bbloom: googling for "#<...>" might be slightly troublesome |
| 18:13 | logic_prog | can you point me at readin gmaterial? |
| 18:14 | emaphis | logic_prog: the rules for indenting lisp have aways been what emacs does. :-) |
| 18:14 | logic_prog | emphais: it's like how python the interpreter is python the spec? |
| 18:15 | bbloom | logic_prog: the magic word you're looking for is "unreadable" |
| 18:15 | bbloom | logic_prog: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L109 |
| 18:15 | emaphis | logic_prog: good analogy. ;) |
| 18:16 | hyPiRion | ,#<this is not readable by the reader> |
| 18:16 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unreadable form> |
| 18:19 | logic_prog | does clojure provide some type of ordered list that has an O(log n) time insert? |
| 18:20 | logic_prog | vector's insert into the middle is O(n) time afaik |
| 18:20 | logic_prog | I want an ordered list where I can say "insert this after the n-th element" and have it be O(log n) time |
| 18:23 | akhudek | logic_prog: sorted-may or sorted-set |
| 18:24 | akhudek | logic_prog: that should be lorted-map |
| 18:24 | logic_prog | you may wish to invest in a new keyboard :-) |
| 18:24 | akhudek | logic_prog: work fingers, sorted-map |
| 18:24 | logic_prog | or a spell checker |
| 18:24 | `cbp | or invest less in alchohol |
| 18:26 | bbloom | logic_prog: see also https://github.com/clojure/data.avl |
| 18:26 | logic_prog | https://github.com/clojure/data.avl <-- is this meant to be empty? |
| 18:26 | justin_smith | logic_prog: insertion in a vector is guaranteed O(<7) |
| 18:26 | justin_smith | not O(n) |
| 18:27 | logic_prog | it's not O(length of vector?) ? |
| 18:27 | justin_smith | no |
| 18:27 | logic_prog | oh, this is chunks o 32 ? |
| 18:27 | justin_smith | O(7) is the worst case |
| 18:27 | justin_smith | yeah |
| 18:27 | gozala | Bronsa: I’d like to ask a question about tools.reader |
| 18:27 | bbloom | logic_prog: heh, sorry. guess michal didn't move the code over yet: https://github.com/michalmarczyk/avl.clj |
| 18:27 | logic_prog | so it can use chunks of 32 even if I don't insert 32 elements at once? |
| 18:27 | justin_smith | wait this has nothing to do with chunking |
| 18:27 | gozala | Bronsa: where does it saves column, line info for booleans and nil ? |
| 18:27 | Bronsa | gozala: tell me |
| 18:27 | justin_smith | it is the same tree structure used to implement persistent hashmaps |
| 18:27 | Bronsa | gozala: it doesn't |
| 18:28 | Bronsa | gozala: booleans and nil cannot have metadata attached to them |
| 18:28 | akhudek | there is also https://github.com/clojure/data.priority-map |
| 18:28 | logic_prog | bbloom: interesting, I always thought people used red-back trees, not avl for persistent trees |
| 18:28 | justin_smith | logic_prog: it uses a tree, max 7 levels deep, so assoc to a random index is at worst O(7) |
| 18:28 | gozala | Bronsa: so there is no source map for those then ? |
| 18:28 | bbloom | logic_prog: if you need sorted with nth, that's what AVL is for |
| 18:28 | Bronsa | gozala: there's no way to attach such info to objects that cannot have metadata attached to them |
| 18:28 | bbloom | logic_prog: clojure does use red/black trees |
| 18:28 | logic_prog | justin_smith : sure, but how do you get that insertion is only O(7) ? |
| 18:28 | amalloy | O(7) is like...a crime against notation |
| 18:28 | justin_smith | O(<7) |
| 18:28 | logic_prog | say, I have a list of 3200 elements |
| 18:29 | justin_smith | 7 is the worst case |
| 18:29 | justin_smith | because it is a tree |
| 18:29 | logic_prog | and I insert a element at index 6 |
| 18:29 | amalloy | O(<7) is even worse |
| 18:29 | justin_smith | 7 levels deep max |
| 18:29 | gozala | Bronsa: yeah I was hoping there was some clever hack I could not come up with :/ |
| 18:29 | logic_prog | it seems like that all the remainig elemnts gets "shifted" |
| 18:29 | pcn | Is there a way to loop, and ahve the initial bindings replaced, that doesn't rely on recur being in tail position? |
| 18:29 | logic_prog | I can believe that replace an elemento f a vector is O(log_32 n) |
| 18:29 | justin_smith | amalloy: just qouting "clojure high performance programming" |
| 18:29 | Bronsa | gozala: no I'm sorry |
| 18:29 | logic_prog | but I'm not convinced that insertion is O(log_32 n) |
| 18:29 | justin_smith | logic_prog: why would assoc shift anything? |
| 18:30 | justin_smith | yo uare replacing a single index |
| 18:30 | amalloy | justin_smith: all of those directly translate to "O(1) but i don't understand big-O notation" |
| 18:30 | justin_smith | amalloy: OK |
| 18:30 | logic_prog | because I'm inserting into an array, it had 3200 elements. Now it has 3201 elements |
| 18:30 | justin_smith | logic_prog: it is not an array |
| 18:30 | logic_prog | and if I insert at index 6, it seems that indices 7 to 3200 might all get shifted |
| 18:30 | justin_smith | it is a tree |
| 18:30 | gozala | Bronsa: tnx |
| 18:30 | justin_smith | no, no shifting |
| 18:30 | logic_prog | damn it, where is the source for clojure vectors ? :-) |
| 18:30 | justin_smith | that is the point of the tree |
| 18:30 | hyPiRion | clojurebot: PersistentVector.java? |
| 18:30 | clojurebot | Cool story bro. |
| 18:31 | amalloy | logic_prog: you can't insert-and-shift into a vector cheaply, only insert-replacing |
| 18:31 | logic_prog | amalloy: so "insert-and-shift" is O(n), correct? |
| 18:31 | justin_smith | amalloy: I think he knows that, and that's why he thought insert would not be cheap |
| 18:31 | logic_prog | this is what I'm confused about |
| 18:31 | hyPiRion | logic_prog: yes |
| 18:31 | justin_smith | logic_prog: I thought you meant insert as in "put this at that index", not "shift everything else to the right" |
| 18:31 | logic_prog | okay. great. Now, back to earlier question: is there some sorted-structure, where I can say "insert after k-th" elemnet, and it takes me only O(log n), where there is n elmeents in the collection. |
| 18:32 | hyPiRion | clojurebot: PersistentVector is https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentVector.java |
| 18:32 | clojurebot | You don't have to tell me twice. |
| 18:32 | logic_prog | justin_smith: sorry for not being clear, I meant "insert" not as in "replace" |
| 18:32 | hyPiRion | oh man |
| 18:32 | logic_prog | clojurebot has attitude |
| 18:32 | logic_prog | next thing you know, it's going to pass the turing test |
| 18:32 | andyf_ | amalloy: I know what you mean, but O(7) = O(1) clearly from the definition of big-O notation. |
| 18:32 | amalloy | andyf_: yes, of course |
| 18:32 | hyPiRion | logic_prog: ordered structure or sorted? |
| 18:33 | logic_prog | hyPiRion: imagine I'm implementing a really giantass todo list |
| 18:33 | logic_prog | and I click on an item, and I say "insert todo right below this item" |
| 18:33 | amalloy | but equally it's O(1024), and introducing arbitrary integers doesn't make things any clearer |
| 18:33 | hyPiRion | logic_prog: ordered then |
| 18:33 | andyf_ | By the same argument O(log_32 n) is a crime against big-O notation. |
| 18:33 | hyPiRion | logic_prog: http://infoscience.epfl.ch/record/169879/files/RMTrees.pdf |
| 18:33 | logic_prog | andyf_: how is O(log_32 n) bad? it's the same as O(log n) |
| 18:33 | hyPiRion | O(log_32 n) insert-at times |
| 18:33 | andyf_ | but often constant factors are important to call out explicitly |
| 18:33 | akhudek | https://github.com/clojure/core.rrb-vector |
| 18:34 | hyPiRion | (inc akhudek) |
| 18:34 | lazybot | ⇒ 1 |
| 18:34 | andyf_ | logic_prog: O(log_32 n) = O(log n), I know. I'm just commenting on amalloy's comment that O(7) is a crime against the notation. |
| 18:34 | logic_prog | O(<7) is weird |
| 18:34 | bbloom | logic_prog: use a sorted set and simply set the new item's key to the average of the target item & next item's keys |
| 18:35 | andyf_ | Oh, and if O(7) is being used to apply to hash sets and hash maps in Clojure, they are only that *if* there are no hash collisions. |
| 18:35 | andyf_ | When there are hash collisions, hash sets and hash maps can be O(n). |
| 18:35 | justin_smith | andyf_: if you are using numeric index, how would you collide? |
| 18:35 | justin_smith | we were talking vectors |
| 18:35 | andyf_ | justin_smith: Sorry, I didn't read carefully enough which data structures the O(7) was being applied to. |
| 18:36 | logic_prog | hyPiRion, akhudek: nice, thanks, rrb vectors look like what I want |
| 18:36 | andyf_ | Also anyone who wants to use the avl.clj library should do some performance testing -- last time I checked (but didn't publish results), their constant factors make them noticeably slower than other Clojure data structures I was comparing against. |
| 18:38 | andyf_ | amalloy: I don't think the 7 is arbitrary. We often use instructions executed as a time measurement, but on most recent processors the number of accesses to DRAM, i.e. cache misses, is often a far better measure of observed performance. I know that doesn't alter your argument on big-O notation abuse, but 7 cache misses is a lot better than 25 cache misses in practice. |
| 18:39 | joshua___ | Hmm. I'm using lighttable and running functions that take a while to finish. Lighttable seems to be quitting mid-computation. Do I have to use a different IDE or have I just done something wrong? |
| 18:44 | logic_prog | rrb-vectors are badas |
| 18:44 | logic_prog | s |
| 18:46 | andyf_ | The answer is probably staring me right in the face, but I don't see it. If I clone the Github repo for contrib lib data.zip, create a simple project.clj for it, start 'lein repl', and (require '[clojure.data.zip :as z]) it gives an error. There is no such error in a different project if I make data.zip a dependency. |
| 18:48 | justin_smith | andyf_: maybe you need to set the :src-path for leiningen? |
| 18:48 | andyf_ | justin_smith: I have :source-paths set to ["src/main/clojure"], which works for other Contrib libs |
| 18:49 | justin_smith | yeah, that looks right for clojure.data.zip |
| 18:49 | andyf_ | There is something different about data.zip, though. |
| 18:50 | Bronsa | andyf_: I was wondering why that didn't work too |
| 18:51 | andyf_ | Hmm. Could it be because there is an empty file src/test/clojure/clojure/data/zip.clj, and I also have :test-paths set to ["src/test/clojure"] ??? |
| 18:51 | lazybot | andyf_: Oh, absolutely. |
| 18:52 | Bronsa | if lazybot says so. |
| 18:52 | andyf_ | That empty file should probably be removed from the repo, or filled in with something useful, but it does seem odd that this happens as it is. |
| 18:53 | andyf_ | Yep, removing that empty file and the require works fine. |
| 18:54 | andyf_ | back later... |
| 19:12 | joshua___ | Are there any good tutorials on setting up Clojure in Eclipse? |
| 19:26 | coventry | joshua___: I hear Cursive Just Works. |
| 19:46 | justin_smith | cursive is intellij, but yeah I have heard good things about it |
| 19:47 | justin_smith | it is only available as a preview beta that you have to sign up for at the moment |
| 19:50 | akhudek | I use cursive, it's very good. Don't think you need to sign up. Just follow the instructions in the getting started docs of the EAP. |
| 19:51 | joshua___ | Oh no. I think I found out why my long running function wasn't returning results in lighttable. Tried the same thing in Eclipse and got: OutOfMemoryError Java heap space org.sqlite.NativeDB.column_text (NativeDB.java:-2). |
| 19:51 | akhudek | It's aimed to eventually be a paid plugin though, good to know if you were expecting something open source. Think it's worth the money though. |
| 20:00 | bitemyapp | yissss, have Halloway's attention on the Datomic documentation issues. |
| 20:00 | bitemyapp | I have a glimmer of hope, once again! |
| 20:02 | talios | is datomic's documentation as wonderful as clojures then? |
| 20:03 | bitemyapp | Datomic is really nice, but there is some implicit/semi-implicit information that needs documented. |
| 20:25 | logic_prog | why is (. js/console log (= :asdf "asdf")) false if cljs treats keywords as strings |
| 20:26 | logic_prog | [edit: in the context of cljs, not clj] ==> why is (. js/console log (= :asdf "asdf")) false if cljs treats keywords as strings |
| 20:26 | justin_smith | logic_prog: does it treat them as (name kw) or as (str kw)? |
| 20:26 | amalloy | logic_prog: "cljs treats keywords as strings" is very inaccurate |
| 20:26 | justin_smith | because if it treats them as (str kw) you want ":asdf" |
| 20:26 | logic_prog | amalloy: how are keywords stored in cljs? |
| 20:26 | logic_prog | I thought they were just js strings, but apparently not |
| 20:27 | logic_prog | cljs ==> (. js/console log (= :asdf ":asdf")) <- also returns false |
| 20:27 | amalloy | i know at one time they were implemented such that :foo was a string containing some wild unicode character followed by the characters f o o |
| 20:27 | amalloy | there was some talk about making them real objects; i don't know if that ever happened |
| 20:28 | amalloy | in any case how they're stored in the underlying representation isn't very important; what matters is that the clojure functions such as = treat them as keywords |
| 20:28 | logic_prog | https://groups.google.com/forum/#!topic/clojurescript/bSFK6CEE3PE <-- has this been integrated into mainline? |
| 20:29 | logic_prog | I have another dumbass question |
| 20:29 | logic_prog | in practice, when do "cljs treats keywords as strings" actually matter ? |
| 20:31 | amalloy | logic_prog: https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L206 is how cljs emits keyword literals |
| 20:31 | Bronsa | andyf_: I just used eastwood on tools.analyzer[.jvm] and found out some misplaced docstrings :) |
| 20:32 | amalloy | new cljs.core.Keyword(...) |
| 20:32 | bbloom | logic_prog: even before keywords were reified, that wouldn't have worked |
| 20:33 | bbloom | logic_prog: previously, keywords had some marker bytes in the front of the string |
| 20:33 | logic_prog | (thinking) |
| 20:33 | logic_prog | suppose I have a = :abc |
| 20:33 | logic_prog | is there a way to define b = "some crap" |
| 20:33 | logic_prog | such that (= a b) returns true? |
| 20:33 | logic_prog | (in cljs) |
| 20:33 | bbloom | logic_prog: no. why do you want that anyway? |
| 20:34 | logic_prog | bbloom: good. I don't want that. |
| 20:34 | logic_prog | "keywords are implemented as strings" confused me |
| 20:34 | bbloom | where does it say that? |
| 20:34 | bbloom | it's outdated |
| 20:35 | logic_prog | damn it, I actually can't find a refenrece |
| 20:35 | logic_prog | I thought it was https://github.com/clojure/clojurescript/wiki/Differences-from-Clojure , but it no longer states that |
| 20:35 | logic_prog | I am happy now. |
| 20:35 | bbloom | logic_prog: https://github.com/clojure/clojurescript/wiki/Differences-from-Clojure/_compare/2b66b7399e036d0703a07dd94f07bf7489b4579f...e524b1bf81bf1f14c06689670f77585816c653e2 |
| 20:36 | logic_prog | bbloom: ah, thanks :-) |
| 20:37 | bitemyapp | new hpmor.com chapters out. |
| 20:45 | andyf_ | Bronsa: Yep, there are a fair number of those throughout Clojure contrib libraries, and even one in Clojure itself. |
| 20:46 | andyf_ | I am (perhaps unrealistically) hoping to get Clojure core to adopt Eastwood or some variation of it for running automated checks on contrib libraries at some point. |
| 20:47 | Bronsa | yeah, I just ran ./lint.sh. Looks like all the failing libraries now are due to known bugs/limitations |
| 20:47 | bbloom | andyf_: have you submitted patches for the misplaced docstrings? :-) |
| 20:47 | andyf_ | bbloom: I could, but that might lead them to believe there was no use to adopt a linter for regular automated checks :-) |
| 20:48 | bbloom | andyf_: i ran a blame & it makes me feel better about myself that rich screws up the docstring order sometimes too :-P |
| 20:48 | andyf_ | bbloom: Call it passive aggressive or whatever you like, but I'd prefer if they were able to see that there are things that could bear cleaning up, and an automated process in place going forward is a good idea worth putting in place. |
| 20:49 | andyf_ | My original motivation for this was not the misplaced docstrings, but the deftest's with repeated names that silently cause some unit tests never to be run. |
| 20:50 | bbloom | andyf_: have you talked to alex miller? he's probably the place to start w/ discussions about improving process |
| 20:50 | andyf_ | bbloom: I agree, and he and I have a good working relationship. I don't think I'm ready to approach him on this topic just yet, until Eastwood is a bit more tested. |
| 20:51 | ddellacosta | eavesdropping on you guys...what is Eastwood? |
| 20:51 | andyf_ | A lint tool for Clojure |
| 20:51 | bbloom | andyf_: always good to start conversations early. i'd tell him your goal & ask him what it would take to get you there |
| 20:51 | andyf_ | https://github.com/jonase/eastwood |
| 20:51 | ddellacosta | ah, https://github.com/jonase/eastwood |
| 20:51 | ddellacosta | right, thanks andyf_ |
| 20:51 | bbloom | andyf_: if you wait until you feel it's 100% done, you'll just be disappointed when you sit around waiting for them to act |
| 20:51 | andyf_ | bbloom: I am used to waiting 1 year for things |
| 20:51 | bbloom | andyf_: i think the lines not dots thing applies here too :-) |
| 20:52 | andyf_ | bbloom: Lines not dots thing? |
| 20:52 | bbloom | andyf_: http://www.bothsidesofthetable.com/2010/11/15/invest-in-lines-not-dots/ <- it's about investments/startups, but it's true of mental/emotional investments too :-) |
| 20:53 | andyf_ | bbloom: I am mentally and emotionally prepared for Clojure core never to adopt an automated process for this, ever. |
| 20:54 | andyf_ | I just hope they do. |
| 20:54 | bbloom | andyf_: so then you won't be disappointed now, just like you won't be disappointed later :-) |
| 20:55 | bbloom | andyf_: set up a cron job to run it yourself, then submit a dozen patches & label each one with "This was discovered by Eastwood. A tools.analyzer based lint tool." |
| 20:55 | andyf_ | bbloom: If they don't within a year or so, I'll consider it. |
| 20:55 | bbloom | heh ok |
| 20:57 | amalloy | was eastwood always based on tools.analyzer? i thought it was around before then |
| 20:58 | bbloom | amalloy: appears not https://github.com/jonase/eastwood/commit/3789514b6729f0dd15ee01443207cfef0cbafdd6 |
| 20:58 | amalloy | oh wow, that's a really recent change |
| 20:58 | andyf_ | I started updating it to tools.analyzer about 2 weeks ago, and Nicola has been fixing tools.analyzer bugs like a man possessed since then. |
| 20:58 | bbloom | (inc bronsa) |
| 20:58 | lazybot | ⇒ 14 |
| 21:00 | andyf_ | Look at the graph on this page: http://dev.clojure.org/jira/browse/TANAL |
| 21:01 | andyf_ | Every time the green line goes up, that is Bronsa's work :-) |
| 21:02 | hyPiRion | And by the looks of it, every time the red line goes up, that is andyf_'s work :p |
| 21:02 | Bronsa | andyf_: looks like eastwood just found a bug in core.logic *highfive* |
| 21:02 | Bronsa | (inc andyf_) |
| 21:02 | lazybot | ⇒ 1 |
| 21:03 | joshua___ | How do I check the amount of memory java has in clojure. I'd be trying to say something like long heapMaxSize = Runtime.getRuntime().maxMemory(); but can't figure out how to write the first part of that in Clojure |
| 21:03 | Bronsa | well. |
| 21:03 | Bronsa | (inc andyf) |
| 21:03 | lazybot | ⇒ 1 |
| 21:03 | andyf_ | Yeah, I haven't been on IRC much. |
| 21:03 | andyf_ | *highfive* Which bug? |
| 21:04 | bbloom | Bronsa: how is having all the separate components working out? i'd imagine well, but i'm wondering if there were some subtle circular references lurking in clojure in a way that is annoying |
| 21:04 | hyPiRion | ,(.. Runtime getRuntime maxMemory) ; joshua___ |
| 21:04 | clojurebot | #<CompilerException java.lang.SecurityException: Reference To Runtime is not allowed, compiling:(NO_SOURCE_PATH:0:0)> |
| 21:04 | hyPiRion | well, that should work in a repl |
| 21:06 | Bronsa | andyf_: I have absolutely no idea what's the cause, but it looks like some macro in core.logic is emitting a (partition some-var), and partition doesn't have a 1-arity |
| 21:06 | andyf_ | Oh, yeah, I've seen that one before. It seems to be buried in a macro somewhere. |
| 21:06 | Bronsa | bbloom: it's definitely easier to develop this way as every component is a box -- not as easy to debug as I would have imagined though |
| 21:07 | joshua___ | Thanks hyPirion |
| 21:07 | bbloom | Bronsa: what causes the debugging challenge? |
| 21:07 | Bronsa | bbloom: this https://github.com/clojure/tools.analyzer.jvm/blob/master/src/main/clojure/clojure/tools/analyzer/jvm.clj#L349-L355 |
| 21:08 | Bronsa | bbloom: in short, there are some passes that depend on each other so multiple runs are required |
| 21:08 | Bronsa | when a bug is buried in one of those passes, it's difficult to reproduce the exact condition that caused the bug |
| 21:08 | bbloom | Bronsa: hmm, i'd imagine |
| 21:09 | bbloom | Bronsa: do you have a validation pass of some sort? |
| 21:09 | bbloom | or multiple, a la the nanopass language definitions idea? |
| 21:10 | Bronsa | bbloom: I have a validation pass but that's probably not what you're thinking |
| 21:10 | bbloom | if i'm reading this correctly, "cycling" is just a fixed point rewrite? |
| 21:10 | Bronsa | it checks for wrong arities & throws, tries to reflect methods etc |
| 21:11 | bbloom | ah ok so that's user level validation, not internal consistency checks for the analyzer |
| 21:11 | bbloom | makes sense |
| 21:11 | bbloom | Bronsa: typeos: https://github.com/clojure/tools.analyzer/blob/master/src/main/clojure/clojure/tools/analyzer/passes.clj#L67-L72 |
| 21:12 | bbloom | s/Shortrand/Shorthand/g |
| 21:12 | bbloom | s/typeos/typos |
| 21:12 | Bronsa | duh. thanks |
| 21:13 | bbloom | Bronsa: i'd be interested to know if some of the "cyclic" passes would be better addressed with a dynamic reference attribute grammar |
| 21:14 | bbloom | my experiments there: https://github.com/brandonbloom/ascribe |
| 21:14 | bbloom | i didn't do a cyclic evaluator, but it's pretty straightforward |
| 21:14 | Bronsa | bbloom: I'll look into that and let you know |
| 21:15 | Bronsa | I'm off to sleep now |
| 21:15 | bbloom | Bronsa: the literature is a pretty deep rabbit hole |
| 21:15 | bbloom | "Extensible Compiler Construction" is a good entry point |
| 21:15 | Bronsa | noted |
| 21:15 | bbloom | and this is a good practical implementation: https://code.google.com/p/kiama/wiki/Attribution |
| 21:16 | bbloom | (scala) |
| 21:16 | joshua___ | Has anyone else had the problem that the :jvm-opts ["-d64" "-Xmx2g"] part of there lein project file was being ignored when using Eclipse as the IDE? |
| 21:16 | bbloom | Bronsa: gnight |
| 21:17 | hyPiRion | joshua___: may be that you're using an old leiningen version. Try out :jvm-opts ^:replace ["-d64" "-Xmx2g"] |
| 21:20 | pcn | Heya, I've got a function that I want to run in a thread, and have it handle I/O. Most of the program is using core.async, and I'm wondering if I should be able to do this with thread from core.async, or if there's a better way to have something sit on a channel and perform disk I/O based on that? |
| 21:21 | hyPiRion | pcn: maybe agents? See http://clojure.org/agents |
| 21:24 | joshua___ | hyPiRion: thank you for trying to help, unfortunately adding the :^replace didn't seem to do anything. Still getting the same totaltMemory |
| 21:27 | pcn | hyPiRion: Maybe? I want this to close a file if it's not written to in a very short time, so I don't think I want it to be an agent since it responds to async events as well as looping |
| 21:28 | pcn | Is there an easy way to just start a thread aside from agents? |
| 21:30 | ddellacosta | compsci question: if I have a sorting algorithm, like an insertion sort, which is considered stable, but then I go and use Clojure's immutable data structures to implement it, can it still be considered stable? Seems like the answer would be "no," but I'm not sure it's even a meaningful distinction when using immutable data structures, is it? |
| 21:31 | amalloy | ddellacosta: i can't imagine why the answer would be no |
| 21:31 | amalloy | "stable" doesn't mean something like "moves no memory around", it means that an already-sorted list, if sorted again, will not be reordered |
| 21:33 | ddellacosta | amalloy: okay, thank you. I think I'm struggling with the definition of "stability," so this is helpful. |
| 21:34 | amalloy | http://en.wikipedia.org/wiki/Sorting_algorithm#Stability |
| 21:34 | hyPiRion | joshua___: I guess it's not a problem with the jvm opts, but how the jvm tends to ignore memory bounds |
| 21:34 | ddellacosta | amalloy: yeah, I was looking at that, thanks |
| 21:35 | hyPiRion | ddellacosta: it just means that if an element a appears before another element b in the list, and they "are equal", then, a will be before b in a sorted list |
| 21:37 | ddellacosta | hyPiRion: yes, I think I was getting confused by all the examples I've been reviewing, which exclusively seem to use c/c++ pointer semantics to move things around. But after considering what you and amalloy are saying, I realize that I'm confused about the difference between where things reside in memory and the implications of the algorithm itself--it doesn't matter so much *how* you swap something--whether that be by generating a |
| 21:37 | ddellacosta | new immutable data structure that swaps the elements vs. swapping their pointer addresses--but where you place them relative to other elements, in terms of what the sorting algorithm dictates. |
| 21:38 | hyPiRion | ddellacosta: exactly :) |
| 21:38 | andyf_ | ddellacosta: You can force any sorting algorithm to be stable by first comparing the items, and if they are equal, compare their original indices in the input list as a tie-breaker. But some sorting algorithms can be made stable without adding that extra info or doing the extra comparison. |
| 21:38 | amalloy | indeed. sorting algorithms really can't have anything to do with memory, since you can apply the same algorithm to bits of paper in the real world |
| 21:39 | ddellacosta | andyf_: gotcha...thanks. |
| 21:39 | andyf_ | The Computer History Museum in San Jose has a great collection of mechanical radix sorters built by IBM in the early and mid 20th century |
| 21:40 | ddellacosta | oh, I was just reading about radix sort in the Cormen book...very cool. Would love to see that. |
| 21:40 | andyf_ | You feed it a stack of punched cards, and adjust a setting to indicate which 'column' contains the digit you want to sort on, and it takes an input stack of cards and sorts them into 10 separate piles. |
| 21:41 | andyf_ | Recursion on the next digit position requires manual intervention :-) |
| 21:41 | ddellacosta | oh wow, haha |
| 21:51 | pcn | Is there a way to start a polling thread instead of a reactive thread? |
| 21:52 | coventry | What is the difference between the two types? |
| 21:53 | pcn | My understanding of an async thread per an agent is that it's waiting for activity |
| 21:54 | pcn | I want a thread that will run a loop |
| 21:54 | coventry | You can use the java thread API as you can in java. |
| 21:55 | pcn | I was hoping there was something as simple as core.async/thread |
| 21:57 | hyPiRion | Well, a Thread isn't necessarily hard in Clojure |
| 21:58 | hyPiRion | (doto (Thread. #(if (wait-condition) (recur) (do-something-and-quit))) (.start)) |
| 22:00 | pcn | OK, I'll broaden my horizons |
| 22:00 | bbloom | is there an easy core.async equiv for Go's Ticker? specifically with these properties: http://golang.org/src/pkg/time/tick.go?s=765:917#L1 |
| 22:04 | amalloy | hyPiRion: why would you (doto (Thread. f) (.start)) rather than (future (f))? the only difference i know of is bindings conveyance |
| 22:06 | hyPiRion | amalloy: If you want to interrupt the Thread or need some other means to poke around at it? |
| 22:07 | hyPiRion | Well, I guess cancel and isCancelled would provide that too |
| 22:22 | bbloom | $mail tbaldridge I need http://golang.org/pkg/time/#Tick please :-) |
| 22:22 | lazybot | Message saved. |
| 22:23 | amalloy | bbloom: that's a channel that emits a message every X timeunits? why do you need that from tbaldridge? seems like it's easy enough to build yourself |
| 22:24 | coventry | Yeah, that go code looks pretty easy to translate. |
| 22:24 | bbloom | amalloy: it is easy enough to build yourself, however depends on a platform specific clock |
| 22:24 | bbloom | coventry: it uses the internal clock facilities to deal with period drift |
| 22:24 | bbloom | the interesting bit is the dropping to handle slow consumers |
| 22:24 | bbloom | you need to measure how much time has passed & schedule your next timeout accordingly |
| 22:25 | rovar | wouldn't ticking into a bounded channel do the same job? |
| 22:25 | bbloom | it's pretty easy to implement, but needs to use either (System/getCurrentMilliseconds) or (js/Date.) |
| 22:25 | bbloom | rovar: no, because the interval needs to be adjusted |
| 22:25 | rovar | does go's Tick really adjust its interval? |
| 22:26 | bbloom | rovar: read the comments on the NewTicker function: http://golang.org/src/pkg/time/tick.go?s=1482:1515#L40 |
| 22:26 | rovar | the challenging part is actually understanding when the consumer consumes.. |
| 22:26 | bbloom | http://golang.org/pkg/time/#NewTicker specifically |
| 22:26 | bbloom | that's not tricky if you have a 1 item buffer |
| 22:27 | bbloom | amalloy: also, it's much less efficient to build it in terms of timeout channels b/c you allocate a channel every tick |
| 22:27 | bbloom | amalloy: if you have a high frequency timer, that's a non-trivial savings you can have by using a non-allocating underlying timer |
| 22:27 | rovar | fair enough, so you just need to count the interval between the blocking write success |
| 22:28 | amalloy | fair enough |
| 22:28 | rovar | so you're basically getting as fast as the consumer but no faster than n |
| 22:28 | rovar | seems like a reasonable thing to have for UI's |
| 22:28 | bbloom | rovar: precisely why i want it :-) |
| 22:31 | rovar | so you'll need to be able to measure intervals of 16ms accurately |
| 22:47 | rovar | how does one get cider to connect to an existing nrepl? |
| 22:47 | rovar | I am running a webserver process which also spins up an nrepl port |
| 22:48 | rovar | but cider doesn't pick up on that and spins up its own process. |
| 22:49 | coventry | rovar: Try M-x nrepl (works in nrepl.el) |
| 22:53 | rovar | ah |
| 22:53 | rovar | instead of running cider-jack-in, I just run cider |
| 22:54 | rovar | which seems counterintuitive |
| 22:54 | coventry | Yes, the inconsistent name-change policy is frustrating. |
| 22:59 | rovar | hmm |
| 22:59 | rovar | so i'm attached to the nrepl for my web server.. but I can't access any of my symbols.. |
| 23:00 | rovar | even though I've loaded the bufer with C-c C-k |
| 23:00 | rovar | not that I think I'd have to.. |
| 23:00 | coventry | rovar: Have you set the namespace with something like C-c M-n in the buffer where you ran C-c C-k? |
| 23:02 | rovar | that doesn't seem to do anything.. |
| 23:03 | coventry | What does *ns* return in the repl? |
| 23:03 | rovar | hum |
| 23:03 | rovar | the correct thing |
| 23:03 | rovar | I guess it did behave correctly |
| 23:04 | coventry | Can you access the symbols in that ns, now? |
| 23:13 | rovar | coventry, yea. it's just wierd that there is no response from the UI when one types C-c M-n |
| 23:16 | coventry | What happens if you type (in-ns 'user) at the repl? |
| 23:18 | rovar | clojuremud.core> (in-ns 'user) |
| 23:18 | rovar | #<Namespace user> |
| 23:18 | coventry | Yeah, that is weird. |
| 23:19 | rovar | it all works now.. so I'm not too concerned |
| 23:21 | v4n | Any recommendations for handling hmac-sha256 with clojure? |
| 23:22 | v4n | I saw clj-oauth, but it is an overkill for what I need. |
| 23:54 | SegFaultAX | v4n: javax.crypto has everything you need to do hmac sha256 |
| 23:54 | SegFaultAX | v4n: If you can't find a self contained example already written in Clojure, try your hand at translating a Java implementation. |
| 23:56 | v4n | SegFaultAX: Thanks, just got it working with javax.crypto. |