2013-11-29
| 00:00 | bitemyapp | justin_smith: well let me know how it shakes out for you |
| 00:00 | justin_smith | sure |
| 00:01 | justin_smith | as far as I am concerned I am still learning, it could turn out this ends up being a failed experiment, it could be it solves a bunch of problems that I won't have to worry about any more |
| 00:01 | justin_smith | or more importantly, pre-empts what could be a disaster |
| 00:04 | justin_smith | and, if nothing else, it could replace my passwords.org.gpg with something I can look things up in using clojure |
| 00:37 | bitemyapp | justin_smith: onward and upward doesn't necessarily mean monotonically :) |
| 00:38 | justin_smith | rarely |
| 00:38 | bitemyapp | justin_smith: well, I think FP has mostly been a win so far over the course of its development |
| 00:39 | bitemyapp | justin_smith: but I think that's only partly because it was relatively virgin territory and the alternatives were *terrible* |
| 00:39 | Raynes | bitemyapp: You use a lot of big words. |
| 00:39 | justin_smith | it had some rough days when the hardware was scarce and expensive |
| 00:39 | bitemyapp | Raynes: http://lichess.org/qoomapve lets rock. |
| 00:39 | justin_smith | though yeah, I guess the alternatives were not so great |
| 00:44 | bitemyapp | Raynes: might be the longest we've gone without a casualty. |
| 00:46 | logic_prog | let G be a directed acyclic graph, where some users are following other users. Are there better field names than "followers" and "following" ? |
| 00:47 | justin_smith | logic_prog: acyclic? how do you ensure that? |
| 00:48 | logic_prog | actually, you're right |
| 00:48 | logic_prog | it's not necessairly acyclic |
| 00:48 | logic_prog | it's a directed graph, some objects are "following" other objects |
| 00:48 | logic_prog | I'm wondering if there is better field names than "listeners / listening-to" or "followers / following" |
| 00:48 | justin_smith | publishers / subscribers |
| 00:49 | justin_smith | followers / following works |
| 00:49 | justin_smith | from / to |
| 01:02 | yedi | anyone have some cljs utility fns they use a lot? |
| 01:06 | bitemyapp | Raynes: little did you know, my king moonlights as an assassin. |
| 01:07 | Raynes | bitemyapp: Bawls! |
| 01:07 | bitemyapp | LOL |
| 01:07 | bitemyapp | I was wondering if that would catch you. |
| 01:09 | Raynes | bitemyapp: Bang. |
| 01:09 | bitemyapp | Raynes: what a sack of bs. |
| 01:09 | Raynes | gg |
| 01:09 | bitemyapp | Raynes: gg |
| 01:09 | Raynes | bitemyapp: You can turn off 'time control'. |
| 01:09 | Raynes | Just FYI. :P |
| 01:09 | bitemyapp | Raynes: lskdfglnkdgklh |
| 01:13 | yedi | hm, should i bother with a cljs specific dom library or just keep using google closure's/native js |
| 01:29 | bitemyapp | yedi: use Domy |
| 01:29 | bitemyapp | Dommy* |
| 01:35 | yedi | bitemyapp: have you looked into https://github.com/lynaghk/singult at all? |
| 01:36 | bitemyapp | yedi: no but you should use Dommy if you don't have specific needs that singult addresses. |
| 01:38 | arrdem | do we have a nice way to extend a record type? |
| 01:39 | bitemyapp | arrdem: http://stackoverflow.com/questions/3589569/whats-the-rationale-behind-closed-records-in-clojure |
| 01:39 | yedi | bitemyapp: k, i think i'll go with that... i've been avoiding hiccup like templates but it seems like theyre way more useful in cljs |
| 01:39 | bitemyapp | arrdem: don't use records if you need flexibility. |
| 01:39 | arrdem | bitemyapp: I'll take that as a no |
| 01:39 | bitemyapp | arrdem: don't use protocols if you need flexibility. |
| 01:40 | bitemyapp | yedi: I don't use hiccup-esque libraries outside of frontend/CLJS |
| 01:48 | arrdem | OH. |
| 01:48 | arrdem | bitemyapp: did you get a commander on commander kill on Raynes? |
| 01:49 | bitemyapp | arrdem: no, but I did pick off the last of his non-pawn pieces with my king. |
| 01:49 | bitemyapp | arrdem: he won due to the timer, sigh, but I was going to win. I had a second queen, he had nothing. |
| 01:49 | arrdem | oh. literal chess. I was thinking planetary annihilation |
| 01:57 | crispin | hi there people! |
| 01:57 | bitemyapp | crispin: hi |
| 01:57 | crispin | Im wondering if comeone can help me with a clojure functional approach |
| 01:57 | crispin | I can do it procedurally with refs and such, but it feels dirty |
| 01:58 | bitemyapp | crispin: so don't do that. Do you have a book? |
| 01:58 | crispin | I do. I have a few books |
| 01:58 | crispin | chas emmericks one |
| 01:58 | crispin | and some others |
| 01:58 | crispin | its a question about approach |
| 01:58 | crispin | I have two BufferStreams |
| 01:59 | bitemyapp | crispin: stop asking to ask, and just put up a refheap. |
| 01:59 | crispin | a BufferedOutputStream and a BufferedInputStream |
| 01:59 | bitemyapp | crispin: https://www.refheap.com/ |
| 01:59 | crispin | whats a refheap? |
| 02:01 | crispin | https://www.refheap.com/21344 |
| 02:01 | crispin | the final write/read line writes one chunk |
| 02:01 | crispin | of 1024 bytes |
| 02:01 | bitemyapp | crispin: https://github.com/dakrone/clj-http |
| 02:01 | crispin | whats the best construct to pump over something like this until its exhausted |
| 02:01 | crispin | I looked at clj-http |
| 02:02 | crispin | and at http-kit |
| 02:02 | crispin | but I need to track progress of download |
| 02:02 | bitemyapp | crispin: streaming |
| 02:02 | crispin | a very large download |
| 02:02 | crispin | thats what Im doing |
| 02:02 | bitemyapp | welp. |
| 02:03 | bitemyapp | crispin: you could wrap it as lazy-seqs. *shrug* |
| 02:03 | crispin | ah ok... |
| 02:03 | crispin | yeah. let me try attackng it that way |
| 02:31 | dakrone | crispin: wrap it in a FilteredInputStream and override the method you want |
| 02:57 | amalloy | dakrone, crispin: if you use https://github.com/flatland/io/blob/develop/src/flatland/io/core/InputStream.java, you can reify InputStreamable rather than having to override something in a concrete class |
| 03:22 | crispin | is it ok to use clojure keywords as names? like 'count' and 'num'? |
| 03:22 | crispin | (let [count 1] (do...)) |
| 03:22 | crispin | it works, but is it bad form? |
| 03:23 | clgv | crispin: it is only a problem if you want to use the function in that scope |
| 03:23 | clgv | crispin: btw. you can skuo the `do` within the `let` |
| 03:23 | clgv | *skip |
| 03:24 | crispin | cool thanks |
| 03:25 | clgv | crispin: I wouldnt do it if there are better alternatives, e.g. `n` instead of `count` ;) |
| 03:26 | crispin | bitemyapp dakrone: implemented it using recursion. https://www.refheap.com/21345 |
| 03:26 | crispin | clgv: yeah, i just chenged them to byte-count and bytes-read |
| 03:26 | crispin | more meaningful now |
| 03:28 | clgv | crispin: if you are doing a lot swing gui you should check out seesaw |
| 03:31 | crispin | clgv: Im using it! Its very good! |
| 03:31 | crispin | saving heaps of time |
| 03:31 | crispin | I have to use SwingUtilities/invokeLater because proxy cant call protected methods |
| 03:32 | crispin | this is for a SwingWorker |
| 03:33 | clgv | crispin: then you probably missed the `invoke-later` function ;) |
| 03:33 | crispin | OMG yes. missed that. changing... |
| 03:34 | clgv | or wait, probably macro and not function ;) |
| 03:52 | bitemyapp | crispin: http://clojuredocs.org/clojure_core/clojure.java.io/copy |
| 04:25 | crispin_ | in seesaw, how do I exit an application prematurely |
| 04:25 | crispin_ | (dispose! frame) closes the frame |
| 04:25 | crispin_ | but the app stays running |
| 04:33 | TEttinger | crispin_: System/exit ? |
| 04:33 | TEttinger | http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#exit(int) |
| 04:34 | crispin_ | TEttinger: yep very nice. Thanks |
| 04:36 | crispin_ | ok, another one. How do I find out (via Java Interop I suppose) what platform Im running on |
| 04:36 | crispin_ | Unix vs Windows etc |
| 04:37 | crispin_ | ok. cot it |
| 04:37 | crispin_ | http://stackoverflow.com/questions/3282498/how-can-i-detect-a-unix-like-os-in-java |
| 04:37 | crispin_ | a more clojure way? let me know... |
| 04:43 | TEttinger | crispin, I think interop is the clojure way for System stuff |
| 04:58 | oriig | #/join #julia |
| 04:58 | oriig | sorry |
| 05:06 | sm0ke | ,```y |
| 05:06 | clojurebot | (clojure.core/seq (clojure.core/concat (clojure.core/list (quote quote)) (clojure.core/list (quote sandbox/y)))) |
| 05:06 | sm0ke | i do not understand that? |
| 05:07 | sm0ke | how is ##``y ; with one more quote turns to the above |
| 05:07 | lazybot | ⇒ (quote clojure.core/y) |
| 05:18 | broquaint | Because that's the unevaluated form? |
| 05:19 | sm0ke | i mean shouldnt it be (quote (quote user/y)), like ##''`y |
| 05:19 | lazybot | ⇒ (quote (quote clojure.core/y)) |
| 05:20 | sm0ke | ,''''''''''''y |
| 05:20 | clojurebot | (quote (quote (quote (quote (quote (quote (quote (quote (quote (quote #)))))))))) |
| 05:20 | sm0ke | like thatif you want |
| 05:20 | broquaint | To the source! |
| 05:20 | sm0ke | hmm weird where did y go? |
| 05:21 | sm0ke | hold back, i am going to try synta-quotes |
| 05:22 | sm0ke | ,```````````y |
| 05:22 | clojurebot | #<StackOverflowError java.lang.StackOverflowError> |
| 05:22 | sm0ke | hah! |
| 05:22 | broquaint | At 6 ` I get a screen full of code :) |
| 05:22 | sm0ke | yea pretty ugly |
| 05:23 | sm0ke | i wonder if syntax-unqote is more than just full resolution of symbols |
| 05:28 | broquaint | I think this is where that happens - https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L816 |
| 05:30 | sm0ke | does that helps? |
| 05:31 | sm0ke | i dont think i understand anything |
| 05:32 | broquaint | I know the feeling :) |
| 05:32 | sm0ke | you have shown me the ugly side of clojure |
| 05:33 | sm0ke | its a shock site for people who dont know clojure source |
| 05:33 | sm0ke | and wow, the indentation is shit |
| 06:07 | philandstuff | and the mix of crlfs and lfs |
| 06:09 | d11wtq | I wish you could use a regex as a predicate: (#"\d{4}-\d{2}-\d{2}" some-string) |
| 06:10 | d11wtq | Let Over Lambda makes a reader macro for Common Lisp to do that. Sort of. |
| 06:12 | bitemyapp | that is not a good idea. |
| 06:23 | wei__ | not a fan of the clojars plugin some people are using to display the latest maven coords-- it displays an SVG which you can't copy/paste |
| 06:24 | wei__ | ok, i can copy the text, but not before it opens a new link in my browser. defeats the purpose if you ask me |
| 06:31 | bitemyapp | ddellacosta: they added the HOFs not too long ago. |
| 06:32 | ddellacosta | bitemyapp: I'm very pleased about the way core.async is shaping up. It's profoundly useful. |
| 06:33 | bitemyapp | ddellacosta: It's nice, I've been mostly thinking about the alternatives to channels lately. |
| 06:33 | ddellacosta | bitemyapp: I'd be interested to hear what you come up with. I still have a ways to go to wrap my head around the implications of CSP. |
| 06:34 | ddellacosta | *in terms of wrapping |
| 06:35 | bitemyapp | ddellacosta: the implications are moderately far-reaching as long as you can actually trust it to work, which is only the case in go, haskell, clojure, and erlang. |
| 06:35 | bitemyapp | ddellacosta: when I say alternatives, I'm talking about things like Haskell's MVars, etc. |
| 06:35 | ddellacosta | bitemyapp: btw, your help with Elm/FRP was instrumental in me understanding how this all fits together. Thanks again for that! |
| 06:35 | ddellacosta | bitemyapp: ah, not familiar with MVars |
| 06:35 | bitemyapp | ddellacosta: glad I could be of use, did you see the wiki? |
| 06:35 | ddellacosta | !? |
| 06:35 | clojurebot | BOT FIGHT!!!!!111 |
| 06:36 | ddellacosta | bitemyapp: no, sorry! |
| 06:36 | bitemyapp | MVars are an STM container type |
| 06:36 | ddellacosta | bitemyapp: link? |
| 06:36 | bitemyapp | http://clojurewiki.com/ |
| 06:36 | bitemyapp | ddellacosta: I couldn't sleep last night, so I put it up (it's git-backed) and bootstrapped some content |
| 06:37 | ddellacosta | haha, nice |
| 06:38 | ddellacosta | I will add stuff to it as I think of it. |
| 06:38 | bitemyapp | ddellacosta: please do :) |
| 06:38 | ddellacosta | bitemyapp: just registered |
| 06:45 | bitemyapp | ddellacosta: awesome |
| 07:41 | jkj | hola |
| 07:41 | jkj | i've got some trouble wrapping my head around lamina |
| 07:42 | jkj | i want to do sql inserts in a executor pool of several threads |
| 07:43 | jkj | and i have a lamina executor-channel that does just that. i just need to figure out how to register a permanent callback |
| 09:35 | magnars | I'm using clojure.core.memoize/ttl - and I get a deprecation warning - likely coming from here: https://github.com/clojure/core.memoize/blob/master/src/main/clojure/clojure/core/memoize.clj#L327-L338 ... which says "Please use clojure.core.memoize/ttl instead." ... what am I not understanding here? |
| 09:39 | magnars | oh wait, I'm using memoize/ttl, but I'm getting a deprecation warning for memoize/lu - that it is not constructed right. But then I'm not creating any lu cache. |
| 10:31 | steerio | hi |
| 10:32 | steerio | does anyone know the reason for this weird behaviour of if/resolve/def? http://pastie.org/8517153 |
| 10:33 | Bronsa | steerio: you should not use def there. |
| 10:33 | steerio | i figured that much, but there's probably an explanation behind this |
| 10:34 | Bronsa | steerio: on the third expression zazaz gets internet at compiled time |
| 10:34 | Bronsa | resolve runs at run time |
| 10:34 | steerio | i see |
| 10:34 | Bronsa | interned* |
| 10:34 | steerio | so by the time resolve runs, it's been interned, yet unbound. the false branch never runs. |
| 10:34 | Bronsa | well, yes |
| 10:34 | steerio | i'm trying to make my own version of defonce that can define private vars (and won't destroy this metadata on existing vars) |
| 10:35 | Bronsa | this is to allow for things like (def foo (do something with #'foo)) |
| 10:35 | steerio | that makes sense |
| 10:42 | xeqi | cemerick: do I remember correctly that your using emacs again? |
| 10:59 | technomancy | xeqi: he is! |
| 11:06 | justin_smith | technomancy: leiningen question. I have a plugin that finds some data to provide to the project, what is the right way to provide that data to the project? I guess I could put it in an atom in the plugin namespace, but is there a better option? |
| 11:06 | justin_smith | can my project access it's own project.clj? that way I could put the data in there |
| 11:08 | steerio | justin_smith: environ (https://github.com/weavejester/environ) might help you. your lein plugin could edit the env map and environ theoretically picks it up. |
| 11:08 | steerio | it all comes down to what happens first |
| 11:08 | technomancy | justin_smith: maybe emit it into :compile-path so the project can read it from the classpath |
| 11:08 | justin_smith | ah right, I could just straight up put the stuff into the env with System/setenv too |
| 11:08 | technomancy | best prior art here is probably configleaf |
| 11:09 | steerio | your plugin editing it or lein-environ picking it up |
| 11:09 | technomancy | there is no setenv, but there are ways to do it |
| 11:09 | steerio | i believe the order in the :plugins vector is respected |
| 11:09 | xeqi | technomancy, cemerick : was wondering which version of nrepl.el / cider, and if it worked well with piggieback. trying to get an report of things working before upgrading |
| 11:10 | justin_smith | ahh, there is System/setProperty though |
| 11:10 | justin_smith | that could suffice |
| 11:10 | cemerick | xeqi: I'm using emacs-live, which bundles old nrepl.el. Everything works as I'd expect FWIW, though I don't think anyone should be asking me for emacs advice. |
| 11:13 | justin_smith | technomancy: OK, if I can bundle configleaf into my plugin, that would totally do it, thanks |
| 11:13 | xeqi | cemerick: ah, does M-tab cause your cpu to spike? |
| 11:13 | cemerick | xeqi: no idea what M-tab is? :-P |
| 11:14 | justin_smith | it prompts for completion |
| 11:14 | cemerick | ah |
| 11:14 | justin_smith | that happens sometimes for me after long runtimes |
| 11:14 | cemerick | emacs-live always pops completion automatically |
| 11:14 | cemerick | on every keystroke |
| 11:14 | justin_smith | even worse, you would get cpu spikes from typing |
| 11:14 | justin_smith | if you had that bug |
| 11:14 | xeqi | hmm, and that works in .cljs files? |
| 11:14 | cemerick | something on my checklist to turn off |
| 11:15 | cemerick | xeqi: yes, though it returns *clojure* results; no tools support code completion in CLJS yet, due to everyone's reliance on eval for everything tool-related |
| 11:16 | xeqi | :/ |
| 11:16 | jcromart_ | so I'm giving event sourcing a shot in this new system, and I wanted someone to take a look at the core code for me |
| 11:16 | jcromart_ | https://gist.github.com/jcromartie/4ece8fbd63ef7ada6923 |
| 11:17 | jcromart_ | I want it to be as generic as possible, so that I could change to, for instance, a SQL database or Datomic |
| 11:17 | jcromart_ | that's not really a crucial requirement though |
| 11:18 | jcromart_ | (change to another event store, not changing away from the event sourcing model) |
| 11:19 | xeqi | cemerick: what kind of results were you expecting in cemerick/piggieback#19 |
| 11:19 | lazybot | Namespaced keywords cannot be evaluated in CLJS over piggieback -- https://github.com/cemerick/piggieback/issues/19 is open |
| 11:19 | jcromart_ | the data model state and the event store are tied together by the command! function, which is not really unsafe per se, so maybe that's badly named |
| 11:19 | xeqi | I've got changes to use tools.reader so I get sourcemaps all the way through, but get the same result |
| 11:20 | xeqi | I'm assuming I've got to do the right thing for reader/*alias-map* still |
| 11:27 | cemerick | xeqi: Without digging into it too much, it should probably use cljs.analyzer/forms-seq |
| 12:40 | tangrammer | Hi folks, can anyone guide me (showign some sorted reading resources list ) in learning logic programming (core.logic)? |
| 12:45 | rkneufeld | seancorfield: making another round on the jdbc recipe since things have changed. How confident are you that the core namespaces will stay the same leading up to release? |
| 12:48 | amalloy | tangrammer: the reasoned schemer |
| 12:50 | jonasen | Bronsa: I'm trying to use your tools.analyze.jvm. Am I on the right track here: https://www.refheap.com/21355 ? I'm trying to analyze a file and return a sequence of ast-trees |
| 12:50 | jonasen | Bronsa: is analyze-forms all I need or do I need to do something more complicated? |
| 12:52 | Bronsa | jonasen: there are a couple of issues but it looks ok |
| 12:52 | tangrammer | amalloy: thanks, I'm just reading it but … i think i need an introductory text .. |
| 12:53 | Bronsa | jonasen: one is that you cannot safely reuse the same empty-env for analyzing multiple forms |
| 12:53 | jonasen | Bronsa: ok |
| 12:53 | Bronsa | jonasen: that's a limitation due to the fact that namespaces can change at runtime |
| 12:53 | tangrammer | amalloy: i feel that I'm not understanding how to work with it |
| 12:53 | jonasen | so I'll create a new env for each call to analyze |
| 12:54 | Bronsa | jonasen: yes, that should be ok |
| 12:54 | Bronsa | jonasen: the other is, I'm not sure if evaluating the form *before* analyzing it will cause troubles or not |
| 12:54 | tangrammer | amalloy: and the worst thing is when i search for some fn in core.logic and i don't find it, |
| 12:55 | jonasen | Bronsa: I'm looking at what Andy's done here https://github.com/jafingerhut/eastwood/blob/try-upgrade-to-tools.analyzer.jvm/src/eastwood/analyze_ns.clj and it seems kind of complicated so I'm just trying to cut it down to its minimum in order to understand it correctly |
| 12:56 | tangrammer | amalloy: example "split" |
| 12:56 | jonasen | Bronsa: but the previous form might be a macro which is used in the following form? |
| 12:56 | jonasen | that's why I call eval |
| 12:58 | Bronsa | jonasen: sure, what I'm saying is that I would (let [ast (analyze form env)] form) ast) rather than (do (eval form) (analyze form env)) |
| 12:58 | Bronsa | err (let [ast (analyze form env)] (eval form) ast) |
| 12:59 | jonasen | Bronsa: ok. You're right. That is better. |
| 13:01 | Bronsa | jonasen: BTW if i were you, I'd add a big fat warning making people aware that eastwood evalauates the ns it's analyzing |
| 13:03 | jonasen | Bronsa: yeah. It might fire the rockets |
| 13:04 | justin_smith | side effects in ns definitions are a bad idea anyway |
| 13:04 | jonasen | as long as there are only defs in the namespace it should be ok. |
| 13:04 | jonasen | and no (launch!) |
| 13:05 | Bronsa | justin_smith: it actually needs to eval the whole namespace, not only (ns ..) |
| 13:06 | Bronsa | jonasen: well, (def foo (launch!)) would screw you just as well :) |
| 13:07 | jonasen | Bronsa: true |
| 13:07 | jonasen | Bronsa: but that's the only way to (correctly) use your analyzer? Or am I missing something? |
| 13:08 | Bronsa | jonasen: analyze does eval under the hood too |
| 13:09 | Bronsa | (ambrosebs's analyze i mean) |
| 13:09 | Bronsa | jonasen: you *could* analyze a clojure file without evaluating it but you don't get macroexpansion for macros/class validations etc |
| 13:11 | jonasen | Bronsa: and you wouldn't know if some symbol foo is clojure.core/foo or my.namespace/foo? |
| 13:11 | Bronsa | jonasen: you could tweak the macroexpander to do some magic statically recognizing defmacro/import/require et all if you really wanted though |
| 13:11 | Bronsa | jonasen: basically, yeah |
| 13:12 | jonasen | And then there's not much more info there than when I just read the file and traverse the s-exprs. |
| 13:12 | Bronsa | right |
| 13:13 | Bronsa | in the cljs case it's different, there's no runtime macros & runtime require, so file analysis is trivial |
| 13:13 | zhbfvuvabar87r | YOU MAY BE WATCHED |
| 13:13 | zhbfvuvabar87r | WARNING WARNING WARNING, WARNING |
| 13:13 | zhbfvuvabar87r | WARNING WARNING WARNING, WARNING WARNING |
| 13:13 | zhbfvuvabar87r | YOU MAYWATCHED |
| 13:13 | zhbfvuvabar87r | YOU MAY BE WATCHED |
| 13:13 | Bronsa | but for clojure code, you need it |
| 13:13 | Bronsa | (eval) |
| 13:14 | jonasen | well, not trivial.. you still need to find and eval the macros. |
| 13:14 | jonasen | in cljs |
| 13:14 | Bronsa | yeah, but those are clojure macros not cljs macros |
| 13:15 | jonasen | Bronsa: but there is not much of a difference between compiling a file and running eval on each top level form. Right? |
| 13:15 | Bronsa | it's just a matter of (loop [forms forms file-ast []] (if (next form) (recur (next form) (conj file-ast (analyze (first form)))) file-ast) |
| 13:16 | Bronsa | jonasen: right |
| 13:16 | tangrammer | amalloy: i found this good resource "Relational programming in miniKanren: Techniques, applications, and implementations" |
| 13:16 | jonasen | so if your project is safe to compile it's safe to run eastwood over it... perhaps :) |
| 13:17 | Bronsa | jonasen: yes |
| 13:18 | amalloy | Bronsa: isn't that loop just (rest (reductions #(analyze %2) nil forms))? |
| 13:18 | Bronsa | amalloy: I wasn't trying to write good code, just the idea :) |
| 13:19 | amalloy | good code conveys ideas so much better :) |
| 13:19 | justin_smith | Bronsa: sorry, I shouldn't have said ns definitions, I meant "at load time" |
| 13:19 | jonasen | Bronsa: There should be a warning, but maybe not big and fat. :) |
| 13:20 | Bronsa | amalloy: I'm guilty of fogetting the existence of reductions every two days |
| 13:20 | Bronsa | jonasen: fair enough |
| 13:20 | jonasen | it's no more dangerous than 'lein uberjar' |
| 13:20 | justin_smith | jonasen: indeed, (def foo (launch!)) would be bad there too :) |
| 13:23 | justin_smith | bitemyapp: http://www.smo.uhi.ac.uk/sengoidelc/donncha/maldacht/ |
| 13:51 | wei__ | how do you set the isolation level for a transaction in java.jdbc? |
| 13:55 | VFe | Anyone been having issues with Light-Table? I updated it and now it throws errors connecting to projects that had no issues before. |
| 13:55 | yedi_ | if anyone is bored and wants to give advice/feedback on some clj/cljs core.async code, take a look at https://github.com/yedi/chatter |
| 13:56 | yedi_ | it's one of my first projects and if anyone has suggestions for doing certain things better, lmk |
| 13:59 | amalloy | yedi_: https://github.com/yedi/chatter/blob/master/src-clj/chatter/chat.clj#L20-L21 is a multithreading problem; line 16 could pr-str once instead of doing it for every chatter |
| 14:01 | yedi_ | amalloy: why is it a multithreading problem? |
| 14:02 | amalloy | yedi_: what if someone else swap!s the atom in between lines 20 and 21? |
| 14:02 | xificurC | I'd like to let a user input one character an read it in as a character, how can I do that the easiest way? |
| 14:02 | justin_smith | xificurC: do you want them to just type one letter, or do you want them to enter the clojure literal for a character? |
| 14:03 | xificurC | justin_smith: just one letter or number |
| 14:03 | yedi_ | amalloy: the log would just get sent to the client twice, (right now im stupidly sending the entire log and rendering it each time so it should still work) |
| 14:03 | yedi_ | amalloy: i guess a better thing to do is to make l20-21 more transactional? |
| 14:03 | xificurC | justin_smith: let's say from 1-26 and from A-z |
| 14:04 | justin_smith | xificurC: somewhat out of date, but this should be a start http://stackoverflow.com/questions/3225025/single-character-console-input-in-java-clojure |
| 14:04 | amalloy | yes, an easy replacement is (send-log (swap! log conj user-msg)) |
| 14:05 | yedi_ | sweet, thanks |
| 14:05 | yedi_ | (inc amalloy) |
| 14:05 | lazybot | ⇒ 79 |
| 14:05 | justin_smith | xificurC: you don't need clojure contrib, you should use 1.5.1 version of clojure not 1.1.0, but the jline part should be the same |
| 14:07 | xificurC | justin_smith: thanks |
| 14:07 | justin_smith | https://github.com/clojure-cookbook/clojure-cookbook/blob/master/local-io/console/read-unbuffered-keystroke/read-unbuffered-keystroke.asciidoc |
| 14:07 | justin_smith | more info on that link |
| 14:07 | dnolen | xeqi: have you tried your patch with austin? |
| 14:07 | justin_smith | including the fact that it won't work with lein repl, you'll need lein trampoline repl instead |
| 14:10 | xeqi | dnolen: the brepl source maps? |
| 14:10 | dnolen | xeqi: yes |
| 14:11 | xeqi | it is going to require changes in both austin and piggieback. I've got it all working locally, but was waiting till cljs changes finish before making PRs for them |
| 14:11 | xeqi | basically piggieback need tools.reader |
| 14:11 | xeqi | and austin needs to add :source-map true to its repl-env, and change the cljs-build call slightly to ignore that like the cljs browser repl does |
| 14:12 | xeqi | I can publish this all as forks if interested |
| 14:23 | allsystemsarego | Hi all, I'm trying to solve the seating arrangement problem with core.logic, but I get an unexpected ClassCastException, this is my REPL session: http://lpaste.net/96380 Help? |
| 14:24 | `cbp | I don't know about core.logic but == is used for number comparison |
| 14:25 | `cbp | maybe you want = or some other core.logic stuff? |
| 14:25 | allsystemsarego | in core.logic == means unification |
| 14:25 | `cbp | oh well I cant be of help then :P |
| 14:29 | allsystemsarego | mayne I'll try l/== then, instead of just == |
| 14:30 | allsystemsarego | yup, sure enough |
| 14:30 | justin_smith | allsystemsarego: you could also (:refer-clojure :exclude [==]) in your ns form |
| 14:31 | justin_smith | unless you really think you will need the other version of == |
| 14:31 | allsystemsarego | justin_smith, this being a repl session, does that advice still hold? |
| 14:32 | justin_smith | you can still define an ns in a repl |
| 14:32 | justin_smith | though it is less likely you need it :) |
| 14:32 | allsystemsarego | let me copy/paste that in my repl |
| 14:32 | justin_smith | well :refer-clojure goes in the ns form |
| 14:33 | justin_smith | but you can use (refer-clojure ...) |
| 14:33 | allsystemsarego | oh ok |
| 14:34 | also | is there a better way to accomplish this in clojurescript: |
| 14:34 | also | (js/goog.exportSymbol "cljs.core.enable_console_print_BANG_" enable-console-print!) |
| 14:35 | justin_smith | allsystemsarego: I am trying it in the repl, it is not doing what I expect |
| 14:35 | justin_smith | ahh, the trick is to define a new namespace |
| 14:36 | justin_smith | (ns user2 (:refer-clojure :exclude [==])) ; this works |
| 14:36 | justin_smith | if you tried that with an existing ns, it silently fails to do what it should |
| 14:38 | allsystemsarego | justin_smith, also, what if I want 2 operators, as in (refer-clojure :exclude [== !=]) |
| 14:38 | allsystemsarego | that fails |
| 14:39 | justin_smith | you need a quote on the vector |
| 14:39 | allsystemsarego | ok thanks |
| 14:39 | justin_smith | but it needs to be called at the time of ns creation to really work anyway |
| 14:39 | justin_smith | so you should create a new ns (like I showed with user2 above) |
| 14:39 | allsystemsarego | but the one you showed me initially works as I expected |
| 14:40 | allsystemsarego | but I'll try with user2 as you said |
| 14:40 | justin_smith | wait, the (:refer-clojure ...) one? |
| 14:40 | justin_smith | ,(:any-key 'anything) |
| 14:41 | clojurebot | nil |
| 14:41 | justin_smith | that is just silently not doing its thing |
| 15:09 | tangrammer | amalloy: that's the path to clojure logic I'm searching for (clojure/core.logic ( friedman/reasoned-schemer (byrd/relational-programming-in-miniKanren) |
| 15:09 | jcromart_ | ring-serve doesn't seem to actually work, when following the directions in https://github.com/mmcgrana/ring/wiki/Interactive-Development |
| 15:09 | jcromart_ | I have always written my own stuff to set up a serve |
| 15:10 | jcromart_ | server |
| 15:10 | jcromart_ | but following these directions yields when requiring ring.util.serve ClassNotFoundException org.mortbay.log.Logger |
| 15:10 | jcromart_ | err, yields that exception |
| 15:12 | jcromart_ | https://gist.github.com/jcromartie/f95d94731ab0ca811a54 |
| 15:14 | jcromart_ | I even put [ring-serve "0.1.2"] in my regular old project.clj :dependencies, since I read somewhere that [:profiles :dev :dependencies] wouldn't do the trick |
| 15:15 | justin_smith | jcromart_: I just start nrepl from within ring |
| 15:16 | justin_smith | I luanch it in the handler init |
| 15:16 | also | jcromart_ the directions have examples for leiningen 1 and 2 |
| 15:16 | also | [:profiles :dev :dependencies] is for leiningen 1 |
| 15:17 | also | err, never mind that |
| 15:18 | jcromart_ | justin_smith: huh, interesting |
| 15:19 | tommo | i'm kinda new to clojure, what is the typical dev pipeline, for example once i've written some code and started up a repl |
| 15:19 | tommo | is there a way to 'hotswap' my changes into the existing repl or do i have to relaunch another? |
| 15:19 | also | jcromart_: does lein classpath show jetty-util-6.1.25.jar? |
| 15:19 | llasram | tommo: In fact, the most common work flow depends on it :-) |
| 15:20 | llasram | tommo: When you recompile a namespace (usually via editor integration) all of your existing definitions are replaced and most "normal" use just picks up the new stuff automatically |
| 15:20 | justin_smith | tommo: you can (require 'some.ns :reload) to get any changes into the repl |
| 15:20 | justin_smith | or just evaluate new definitions |
| 15:21 | jcromart_ | also: jetty-util-7.6.8.v20121106.jar |
| 15:21 | tommo | cool, ty llasram and justin_smith |
| 15:22 | jcromart_ | tommo: I like to send a buffer (file) to the REPL using CIDER in Emacs with the C-c C-k command |
| 15:23 | tommo | nice to know jcromart, i'm using emacs too |
| 15:24 | justin_smith | jcromart_: I am not sure which it does, because I don't use that workflow, but send file and send buffer are not the same - send file would have it load what you last saved, send buffer would have it load the current state of the buffer even if you have not saved (even if the buffer is a buffer with no file) |
| 15:24 | also | jcromart_: lein deps :tree shows me https://gist.github.com/also/1e9393f8cfab1bbf774e |
| 15:25 | jcromart_ | " cider-load-current-buffer |
| 15:25 | jcromart_ | that's what C-c C-k is |
| 15:25 | jcromart_ | which does depend on saving the file, yes |
| 15:26 | arrdem | ,(meta #_[1]) |
| 15:26 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: core$meta> |
| 15:27 | jcromart_ | also: and you can (require 'ring.util.serve) with that setup? |
| 15:27 | arrdem | what exactly does the #_ reader annotation do? looks like it's a single form comment... |
| 15:28 | llasram | arrdem: Essentially. Causes the reader to discard the next form |
| 15:28 | justin_smith | arrdem: yeah, completely eliminates the next object (balanced form) as if it were not present |
| 15:28 | justin_smith | ,(+ #_(can't add this) 1 1) |
| 15:28 | clojurebot | 2 |
| 15:28 | arrdem | herm. okay, good to know. thanks! |
| 15:28 | arrdem | justin_smith: har har |
| 15:28 | also | jcromart_ yes. looks like you've got a newer/wrong version of org.mortbay.jetty/jetty-util from somewhere |
| 15:29 | justin_smith | arrdem: showing the thing it comments doesn't need to be valid, but it uses balancing rules to eliminate it |
| 15:29 | justin_smith | ,(+ #_(can't #add this) 1 1) ; though it still does need to be readable |
| 15:29 | clojurebot | #<RuntimeException java.lang.RuntimeException: No reader function for tag add> |
| 15:31 | jcromart_ | also: from requiring ring 1.2.1 it would appear |
| 15:34 | also | ah, i only added ring-serve |
| 15:35 | also | i don't know if that dependency specifically is the problem, that's just the jar where the missing class was |
| 15:52 | dnolen | xeqi: ok cool, was just double checking, patch looks cool will give it a spin soon |
| 16:01 | cYmen | Okay, I'd like your thoughts on a common problem. |
| 16:01 | cYmen | At least I assume it is common. |
| 16:02 | cYmen | When I have a function that takes whichever parameter I want and I realize that I would like to apply a transformation to the result, what should I do? |
| 16:03 | cYmen | This happens to me when doing 4clojure problems all the time and just wrapping around more functions just feels odd. |
| 16:03 | cYmen | Maybe it's not common but a 4clojure thing. Your thoughts? |
| 16:03 | cYmen | https://www.refheap.com/0d19e5eb17acdd75e4a5840d5 |
| 16:04 | cYmen | This is the problem I just did before and after I realized I had forgotten to turn the result into a set. |
| 16:04 | cYmen | Is it just me or does this end up pretty cryptic considering how simple the idea is? |
| 16:05 | jcromart_ | cYmen are you looking for -> |
| 16:07 | cYmen | I feel like saying no but I should probably just try and use that excessively to get a feel for it. |
| 16:08 | justin_smith | as-> is also great for that kind of thing |
| 16:09 | Rhymor | ,(doc as->) |
| 16:09 | clojurebot | "([expr name & forms]); Binds name to expr, evaluates the first form in the lexical context of that binding, then binds name to that result, repeating for each successive form, returning the result of the last form." |
| 16:10 | cYmen | hm |
| 16:10 | justin_smith | ,(as-> 1 ☕ (inc ☕) (* ☕ 3) [☕ ☕ ☕]) |
| 16:10 | clojurebot | [6 6 6] |
| 16:11 | justin_smith | of course in real usage you wouldn't use ☕ as your placeholder |
| 16:11 | cYmen | I wouldn't? How do I show off my unicody prowess then? |
| 16:11 | Rhymor | :) |
| 16:15 | cYmen | Googling for ->> really doesn't work to well. |
| 16:15 | cYmen | ,(doc ->>) |
| 16:15 | clojurebot | "([x form] [x form & more]); Threads the expr through the forms. Inserts x as the last item in the first form, making a list of it if it is not a list already. If there are more forms, inserts the first form as the last item in second form, etc." |
| 16:16 | justin_smith | cYmen: there is a search engine for that, symbolhound |
| 16:16 | justin_smith | try searching ->> clojure on symbolhound |
| 16:17 | cYmen | just finds a lot of stackoverflow |
| 16:17 | cYmen | not the docs, though |
| 16:17 | `cbp | hello |
| 16:24 | cYmen | Note to self "wrong arguments (0)" maybe you have too many parentheses... |
| 16:24 | amalloy | justin_smith: as-> was designed to read better inside of a -> context: (-> 1 (as-> x (inc x) (dec x))) |
| 16:25 | amalloy | there it reads like "okay, take the thing we're currently threading, call it x. then..." |
| 16:25 | justin_smith | amalloy: I find myself using it instead of -> if the positioning ever changes |
| 16:26 | Raynes | justin_smith: Congrats, you invented let. :P |
| 16:27 | justin_smith | heh |
| 16:28 | amalloy | ,(-> [1 2] (as-> [x y] [(inc y) (dec x)] [y x])) |
| 16:28 | clojurebot | [0 3] |
| 16:29 | amalloy | looks kinda like a shell game |
| 16:29 | justin_smith | indeed |
| 16:30 | cYmen | It does? |
| 16:34 | amalloy | cYmen: the x and the y are swapping places every step and you have to guess which ends up where, see |
| 16:35 | amalloy | (-> '[win lose lose] (as-> [a b c] [b a c] [c b a] [a c b] [b c a])) ;; where's the win? |
| 16:35 | seangrove | amalloy: Yeah, interesting. |
| 16:36 | seangrove | ,(nth (-> '[win lose lose] (as-> [a b c] [b a c] [c b a] [a c b] [b c a])) 1) |
| 16:36 | clojurebot | win |
| 16:36 | seangrove | boom. |
| 16:36 | seangrove | The rebinding at each step is definitely interesting. |
| 16:46 | allsystemsarego | Hi, I'm attempting to solve a logic puzzle with core.logic and it goes into an endless loop, here are the details: http://lpaste.net/96384 The puzzle I'm trying to solve is here: http://www.brainbashers.com/showpuzzles.asp?puzzle=ZJLX |
| 16:49 | dnolen | xeqi: inline source map patch landed - THANK YOU for this, it's pretty sick! :) |
| 16:53 | dnolen | sweet, sweet patch, http://github.com/clojure/clojurescript/commit/f02775ebe78ef787f128e37f164763ce492927e8 |
| 16:57 | bbloom | cool |
| 16:57 | seangrove | xeqi: Yes, thank you, looking forward to seeing this in action |
| 16:58 | seangrove | Tiny patch too, that's great |
| 16:58 | bbloom | allsystemsarego: try using core.logic.fd |
| 16:58 | bbloom | allsystemsarego: your non-relational projections might be a big part of the problem |
| 16:58 | bbloom | allsystemsarego: you'll get much better perf out of fd too |
| 16:59 | seangrove | $seen sritchie |
| 16:59 | lazybot | sritchie was last seen quitting 2 days and 23 hours ago. |
| 16:59 | allsystemsarego | bbloom, thanks for the hint, I'll learn about fd and try again |
| 16:59 | Raynes | seangrove: Ain't nothing but a quitter. |
| 17:00 | mercwithamouth | so...domina vs enfocus? |
| 17:00 | seangrove | mercwithamouth: Dommy? |
| 17:00 | Raynes | I wish I could quickly hack the bot to make it say "Raynes was last seen winning 5 seconds ago" |
| 17:00 | amalloy | you mis-spelled whining, bro |
| 17:00 | bbloom | allsystemsarego: https://github.com/clojure/core.logic/wiki/Features#clpfd |
| 17:00 | seangrove | Raynes: With a 0.1 chance of "bi-winning" |
| 17:00 | mercwithamouth | seangrove: hmm really? |
| 17:01 | seangrove | mercwithamouth: Certainly my favorite, by far. Simple, fast, well made. |
| 17:01 | seangrove | That said, enfocus' approach is obviously totally different, so if you're looking for a totally different philosophy, it's not a bad source of ideas |
| 17:01 | egosum | Hi y'all, pinging from KY. Any great extended finite state machine libraries in Clojure? |
| 17:02 | mercwithamouth | well i guess i'll have to play with both. starting with dommy, thanks |
| 17:02 | bbloom | egosum: state machines are pretty easy to make in clojure. what are you trying to do? |
| 17:02 | egosum | bbloom: i want an extended one that basically confirms to the UML spec |
| 17:03 | egosum | I've written a few libraries in other langs for them already, but it's always nice to see what people are doing |
| 17:03 | egosum | I haven't found one in Clojure that's very powerful (which is great! I want to make one :) |
| 17:03 | bbloom | egosum: do you have an example in another language you could share? i'm not sure what you could possibly be looking for |
| 17:04 | egosum | I haven't made my open source yet, but e.g. https://github.com/ifandelse/machina.js is a pretty good one |
| 17:05 | bbloom | egosum: you want core.async |
| 17:06 | egosum | bbloom: I don't understand how core.async solves the same problem? Could you explain? |
| 17:07 | bbloom | egosum: your "why would i use it" section discusses several use cases that you can address better with other mechanisms than explicitly coded state machines |
| 17:07 | bbloom | egosum: the first thing discussed is callbacks/deferred, which is *precisely* where core.async is dramatically superior |
| 17:07 | bbloom | the common pattern is a "go loop" |
| 17:08 | bbloom | (go (loop [ ...] ...)) ; this is your state machine, where the loop variables are the state |
| 17:08 | bbloom | you alt on inbound channels for your state transitions |
| 17:09 | bbloom | RE: persistence, you can simply respond to a message to serialize by prn-ing the loop control variables to a file and using them as the initial values when you deserialize |
| 17:09 | bbloom | you can build very robust message bus systems too |
| 17:10 | egosum | Some of them, sure. That's not my library, to be clear. core.async, from my understanding, can't really be used model the same problems that an extended FSM can (though it uses a FSM internally). That also doesn't model an eFSM very well, nor is it representable as "data" as nicely. |
| 17:10 | bbloom | basically everything in that "why" section gets better & easier w/ first class channels and multiplexing |
| 17:10 | egosum | That library may have been misleading. It's used for coordination, but eFSMs in general are not always just for that |
| 17:11 | bbloom | sure, there are LOTS of uses for state machines |
| 17:11 | egosum | I'm interested in FSMs as a way to describe logical processes. Along the lines of traditional UML FSMs. |
| 17:11 | egosum | core.async doesn't seem as amenable for those use-cases |
| 17:11 | CaptainLex | How can I get Clojure to recognize advanced Unicode characters like in strings? |
| 17:12 | egosum | Unless I'm missing something (and I haven't used with core.async much) |
| 17:12 | bbloom | the question is: do you want to explicitly reify your states and transitions |
| 17:12 | bbloom | core.async will derive states & transitions for you from straight-line code |
| 17:12 | bbloom | if you want to data-drive the compilation of a state machine, then yeah, it's not a good fit |
| 17:13 | cYmen | How do I type a newline in the REPL instead of evaluating? |
| 17:13 | egosum | Yeah, I'm very much interested in data-driven FSMs. I intend to graph them, display them live, etc. |
| 17:15 | bbloom | dnolen: http://www.scala-lang.org/news/2013/11/29/announcing-scala-js-v0.1.html |
| 17:15 | dnolen | bbloom: yep saw that |
| 17:15 | bitemyapp | it produces some really messy output though. |
| 17:15 | bitemyapp | Fay is much cleaner. |
| 17:15 | `cbp | cYmen: whats your client? |
| 17:15 | cYmen | emacs |
| 17:16 | bitemyapp | c-j? |
| 17:16 | seangrove | We need more mutation in the dom. Not sure how we're getting by with the current status quo. |
| 17:16 | `cbp | C-j |
| 17:16 | seangrove | I'm almost able to get things to work sometimes by accident, clearly that shouldn't be possible. |
| 17:16 | cYmen | thanks :) |
| 17:16 | dnolen | bbloom: tried it on their example project w/ optimizations - OOMed after eatng up 600mb of RAM |
| 17:16 | bitemyapp | seangrove: I had to do something involving mutation and recursion in Python the other day, I eventually gave up. lol. |
| 17:17 | bitemyapp | dnolen: totes normal for Scala. Gotta bump that Xmx |
| 17:17 | seangrove | Wow, very cool to see scala.js. Seems like they took the same closure approach. |
| 17:18 | seangrove | Good omens for js as a compile target! |
| 17:18 | bbloom | dnolen: yeah, i couldn't get anything but OOM a few months ago last we discussed |
| 17:19 | dnolen | seangrove: agreed |
| 17:21 | cYmen | oooh my first NullPointerException. |
| 17:26 | allsystemsarego | why do I get this http://lpaste.net/96387 when requiring clojure.core.logic.fd in the repl? |
| 17:27 | bbloom | allsystemsarego: (require '[clojure.core.logic.fd :as fd]) |
| 17:27 | justin_smith | CaptainLex: can you give me an example it does not handle? |
| 17:27 | allsystemsarego | oh, thanks |
| 17:29 | CaptainLex | justin_smith: Sure. In the REPL, (str "Hello! " " 2013") outputs "Hello! ?? 2013" |
| 17:29 | justin_smith | CaptainLex: in my usage, I have had no usage with unicode in strings, symbols, or keywords |
| 17:30 | dnolen | allsystemsarego: having seen some of your trouble might I suggest working through a thorough Clojure book/tutorial first? Your core.logic'ing will be a lot more fun productive if you do :) |
| 17:30 | CaptainLex | justin_smith: 2013 is what happens when it gets put on my website |
| 17:30 | justin_smith | CaptainLex: your irc client does not send whatever unicode you are trying to send |
| 17:30 | CaptainLex | Hahahaha oops |
| 17:31 | CaptainLex | It's the copyright symbol |
| 17:31 | allsystemsarego | dnolen, point taken |
| 17:31 | justin_smith | ,(str "Hello! ©" " 2013") |
| 17:31 | clojurebot | "Hello! � 2013" |
| 17:31 | justin_smith | your terminal is likely messed up? |
| 17:31 | seangrove | ,(str "Hello! " " © 2013") |
| 17:31 | clojurebot | "Hello! � 2013" |
| 17:31 | seangrove | Yeah, works here just fine |
| 17:31 | dnolen | allsystemsarego: just a bit of advice, core.logic alone is challenging enough as it is |
| 17:31 | CaptainLex | Haha stupid KVIRC is not transmitting those for me |
| 17:31 | justin_smith | ##(str "Hello! ©" " 2013") |
| 17:31 | lazybot | ⇒ "Hello! © 2013" |
| 17:32 | justin_smith | lazybot has his unicode set up properly |
| 17:32 | CaptainLex | But it's not just at the REPL |
| 17:32 | justin_smith | what OS? |
| 17:32 | CaptainLex | Arch Linux. It also happens when it processes HTML strings through Ring requests |
| 17:32 | justin_smith | like I said, I have had no issues with unicode in strings, symbols, or keywords in my code |
| 17:33 | CaptainLex | Interesting |
| 17:34 | justin_smith | are your content type headers matching the string format? |
| 17:35 | justin_smith | http://sprunge.us/aJfH <- from my repl |
| 17:35 | CaptainLex | justin_smith: The processing all goes on in the backend. Huh. Interesting |
| 17:36 | justin_smith | if your content type headers you send to the client are wrong, it will often not display unicode properly |
| 17:36 | justin_smith | I don't know what the repl issue would be |
| 17:37 | justin_smith | is the terminal you run the repl in usually good about displaying this sort of thing? |
| 17:38 | dnolen | bbloom: bitemyapp: bumping memory allowed it to succeed - however it took 164 seconds to compile. |
| 17:38 | bbloom | dnolen: what did you compile with it? |
| 17:38 | dnolen | bbloom: sbt |
| 17:38 | CaptainLex | justin_smith: Well, it can display it when I type it! |
| 17:38 | seangrove | dnolen: The link mentioned it had support for incremental compilation, presumably it should be better after the first time. |
| 17:38 | bbloom | "with it", not "it with" |
| 17:39 | bbloom | oh, you just compiled the compiler? |
| 17:39 | CaptainLex | justin_smith: echo handles it fine |
| 17:39 | bbloom | like you didn't even run the compiler let? |
| 17:39 | justin_smith | hmm |
| 17:39 | dnolen | bbloom: no the example app they suggset trying |
| 17:39 | bbloom | oh ok |
| 17:39 | justin_smith | CaptainLex: maybe your jvm is buggy or misconfigured? java is usually pretty good about handling unicode properly |
| 17:40 | justin_smith | and clojure just piggybacks on java for all that stuff |
| 17:40 | CaptainLex | justin_smith: That was my next thought. Arch has a tendency to require poking around sometimes, but I certainly haven't done anything to the default install |
| 17:40 | justin_smith | I have seen none of these issues on my ubuntu with openjdk or the sun jdk, fwiw |
| 17:40 | justin_smith | except when I sent the wrong content type header for a page |
| 17:40 | dnolen | bbloom: that said it does generate a reasonable amount of code for "hello world" that is their example app so they got their deps issues sorted out. |
| 17:41 | bbloom | dnolen: cool, but you can't draw that conclusion from hello world. try using a tree or something :-) |
| 17:41 | CaptainLex | justin_smith: I'll just ignore it until I deploy to Heroku. If it's still a problem there, I'll file a bug report with the universe :P |
| 17:41 | dnolen | bbloom: heh, yeah :) |
| 17:42 | justin_smith | CaptainLex: lol. If you have the patience for it you could start up a free tier amazon ec2 instance, and verify everything works when you ssh in |
| 17:43 | justin_smith | http://instantserver.io/ <- took me about 4 minutes to get a clojure repl on instantserver last I tested it out |
| 17:43 | justin_smith | free, no account needed, etc. |
| 17:43 | justin_smith | n/m, it is off line |
| 17:44 | dnolen | seangrove: I don't think incremental compilation helps advanced optimizations much - 138s for the second compile |
| 17:44 | dnolen | seangrove: it might also be particular bad on my machine, not sure if I have enough RAM to do this properly |
| 17:45 | dnolen | seangrove: the standard lib is 20mb, so the Closure Compiler has to churn through that |
| 17:46 | dnolen | 20mb of generated JS |
| 17:46 | justin_smith | CaptainLex: what does (System/getProperty "file.encoding") return in your repl? |
| 17:47 | justin_smith | it should return "UTF-8" |
| 17:47 | CaptainLex | It did :( |
| 17:48 | justin_smith | well that rules out that issue |
| 17:48 | seangrove | dnolen: How's that compare to cljs' stdlib? |
| 17:48 | dnolen | seangrove: 700k |
| 17:48 | seangrove | dnolen: We need more MB's to catch up, it seems. |
| 17:48 | seangrove | Else how will anyone take cljs seriously? |
| 17:49 | dnolen | seangrove: :) |
| 17:49 | justin_smith | what happens when you do (spit "copied-file" (slurp "file-with-unicode")) do the files cmp as the same? |
| 17:49 | seangrove | But yeah, it seems like the amount of code core.logic + core.async generate is enough to make gclosure struggle... 20MB of stdlib is pretty big. |
| 17:52 | xeqi | dnolen: hurray 2 cljs patches in one day |
| 17:52 | dnolen | seangrove: that hasn't been my experience, cold compile of core.async, core.logic tests ~30s, recompiles <4secs |
| 17:53 | dnolen | seangrove: w/ advanced optimizations |
| 17:53 | xeqi | I'll see about submitting the ones needed for austin/piggieback to cemerick in the next couple days |
| 17:53 | dnolen | on my wimpy MacBook Air 4gb of RAM 1.7ghz |
| 17:54 | dnolen | xeqi: great work, CLJS easily has one of the best source map stories out there all of a sudden :) |
| 17:55 | seangrove | xeqi: Looking forward to that |
| 17:56 | seangrove | dnolen: Didn't you send out a warning on the ml about using core.async and core.logic together in cljs due to possible compilation problems? |
| 17:57 | dnolen | seangrove: oh you mean core.async & core.match |
| 17:58 | dnolen | seangrove: yes putting complex core.match expressions in core.async is gnarly - core.async should maybe be enhanced to avoid transforming forms that have :not-transform metadata attached |
| 17:58 | dnolen | :no-transform |
| 17:59 | seangrove | dnolen: What's the upper-limit on code size for safe compilation? |
| 17:59 | seangrove | Purely academic curiosity, we're nowhere near that. |
| 17:59 | dnolen | seangrove: I'm not aware of anything really |
| 18:00 | bitemyapp | seangrove: make a javascript code generator and find out :P |
| 18:00 | andyf | Bronsa: ping |
| 18:00 | seangrove | bitemyapp: That'll go under the category of pending side-projects labelled "neither useful nor particularly fun." |
| 18:01 | bitemyapp | seangrove: ¯\_(ツ)_/¯ |
| 18:01 | Bronsa | andyf: pong |
| 18:02 | Bronsa | andyf: I just saw your comment on TANAL-9, I'm going to check that out |
| 18:02 | andyf | Bronsa: Man, you have been awesome at bug fixing. Thanks. I just wanted to let you know I added a comment to TANAL-9 with some additional info on the exception I am seeing. |
| 18:02 | andyf | Cool. Thanks. I am probably at the point of not knowing how to set up the env arg to analyze correctly, but my problem could lie elsewhere. |
| 18:03 | dnolen | tbaldridge: http://dev.clojure.org/jira/browse/ASYNC-40, something to think about - not sure how hard this would be |
| 18:04 | tbaldridge | dnolen: then you could never to a >! or <! inside a match? |
| 18:05 | dnolen | tbaldridge: updated the patch to clarify what I want to avoid |
| 18:05 | dnolen | tbaldridge: (match [x y ...] ;; <-- async works here) |
| 18:05 | andyf | Bronsa: Some good news -- my latest mods to Eastwood allow it to analyze 32 contrib libraries with no errors and no obviously incorrect warnings. There are 7 contrib libraries with errors that I don't know what to do about yet, but I am still investigating those. |
| 18:05 | dnolen | tbaldridge: (match [x y] [1 2] ... async works here ...) |
| 18:05 | danielsz` | cemerick: Not AFK yet? |
| 18:06 | dnolen | tbaldridge: but (match [x y] [1 2] ;; <-- async leave this alone! ...) |
| 18:06 | cemerick | danielsz`: only here in spirit |
| 18:06 | seangrove | cemerick: We all appreciate your presence. |
| 18:06 | danielsz` | cemerick: haha. |
| 18:07 | tbaldridge | dnolen: let me think about it. my not happen until I integrate tools.analyzer into core.async |
| 18:07 | dnolen | tbaldridge: I don't expect that to work in the near term - but I think something like this important for other "serious" macros |
| 18:07 | danielsz` | cemerick: Was going to ask when or how austin will deal with the new sourcemap functionality... But I can't ask a spirit, can I? |
| 18:08 | dnolen | tbaldridge: cool to hear you're going to integrate tools.analyzer - I assume will make reasoning about the Clojure code more displined |
| 18:09 | cemerick | danielsz`: that's xeqi's ball to run. I'll keep an eye out, but no guarantees until mid-December. |
| 18:09 | Bronsa | andyf: ok now I can reproduce, I'll see if it's a tools.analyzer issue or if there's something wrong with your setup and let you know |
| 18:09 | tbaldridge | dnolen: that's the plan, it'll take a re-write of about half of ioc_macros, but I plan on doing it sometime "soon" |
| 18:09 | Bronsa | andyf: in the meantime, thanks again for the help, you've been really helpful |
| 18:09 | andyf | Bronsa: The sentiments are mutual :) |
| 18:10 | danielsz` | cemerick: Awesome. Austin + sourcemaps, that's going to be so cool. |
| 18:11 | dnolen | tbaldridge: I'm assuming using analyzer will also make source maps more sane |
| 18:13 | cored | hi |
| 18:14 | cored | http://www.loper-os.org/?p=42 the comments in this have a flame war which let me thinking |
| 18:14 | cored | in a lot of stuffs, like is Clojure selling itself as modern LISP it's seems that to be LISP it should be LISP all the way down, is that correct? |
| 18:14 | coventry | How's the starcraft clone coming along? Found any assistants? |
| 18:14 | dnolen | cored: loper-os is good mostly for laughs |
| 18:16 | cored | dnolen: :-) |
| 18:16 | cored | dnolen: but is because he is telling the truth or what? |
| 18:16 | dnolen | cored: there's hardly anything resembling rhyme, reason or computer science discussed therein - just emotional garbage |
| 18:17 | cored | dnolen: I see, he post a lot of links which back up what he is saying |
| 18:18 | justin_smith | cored: citations don't back up hyperbole and vitriol |
| 18:18 | danielsz` | You should regard loper-os as a character. He's fucking brilliant some of the time. Sometimes he doesn't make sense. |
| 18:19 | danielsz` | The Clojure rant is just the expression of an old Lisp smug weenie not wanting to open his mind to new perspectives. Happens all the time. |
| 18:19 | cored | would like to take as much knowledge from him as I can, but every 6 words is bad things for Clojure |
| 18:20 | cored | danielsz`: but if you are the one saying that, he can say the same a new Clojure smug weenie -> because he says that Clojure is not a real LISP |
| 18:20 | danielsz` | Forget about this rant. It doesn't make sense. |
| 18:20 | dnolen | cored: if you get your opinions about Lisp from like loper-os, not much we can do for you |
| 18:21 | dnolen | cored: best to go to the real sources, like LISP BOOKS, and come to your own conclusions |
| 18:22 | xeqi | danielsz`: I'll make some PRs for austin/piggieback this weekend, and will probably publish some forks until cemerick is back |
| 18:22 | seangrove | It's pretty awesome to see tools.analyzer getting integrated into libraries, seems like an extremely powerful avenue |
| 18:22 | andyf | seangrove: Which libraries is it being integrated into? |
| 18:23 | cored | dnolen: I'm taking it slow, kinda new to the entire thing. But as I'm a follower of Michael Fogus I just found out that blog from him and start to read |
| 18:23 | cored | dnolen: I'm reading functional programming for object oriented programmers |
| 18:23 | danielsz` | xeqi: That is so awesome. |
| 18:23 | xeqi | danielsz`: have them all working locally |
| 18:23 | tbaldridge | cored: I'm much less concerned with if Clojure is a real Lisp, and more concerned with building cool things. |
| 18:23 | Bronsa | andyf: looks like a classloader issue ouch |
| 18:23 | seangrove | andyf: tbaldridge mentioning integrating it into core.async for example |
| 18:23 | cored | dnolen: it's seems that apart from learning about the language I have to make some room to learn about the community and the history behind it |
| 18:23 | cored | tbaldridge: good point |
| 18:24 | tbaldridge | cored: if some awesome feature of Clojure makes it "not a lisp" what to I care? |
| 18:24 | cored | tbaldridge: but what I was concerned about was that if that could make a limitation for it, I think that's what this loper-os guy is talking about |
| 18:24 | dnolen | cored: Lisp has an amazing history, I love it. And the books, they are some amazing Lisp books nearly all of them applicable to Clojure in one for or another |
| 18:24 | tbaldridge | cored: for example, the fact that "pure lisps" don't have hash-map literals is a major flaw in lisp, not a feture |
| 18:25 | justin_smith | using linked lists as if they were an associative data structure is an abomination |
| 18:25 | andyf | Bronsa: Not sure I can be of any help there, at least not given my current state of knowledge on the subject. |
| 18:25 | justin_smith | nested linked lists at that |
| 18:26 | cored | oh |
| 18:26 | cored | I found something interesting |
| 18:26 | cored | http://abcl.org/ |
| 18:26 | cored | isn't this the same idea as Clojure? |
| 18:26 | danielsz` | Nobody in his right mind disputes the fact that Clojure is a Lisp, as much as Lispiness goes. |
| 18:26 | dnolen | cored: no, Common Lisp is a very different Lisp dialect |
| 18:27 | justin_smith | cored: no, it wants to actually be common lisp, and so doesn't integrate as nicely with its vm |
| 18:27 | andyf | cored: I know less about abcl than Clojure, but I believe abcl is an attempt to implement Common Lisp using Java as the implementation language. Clojure has significant differences from Common Lisp. |
| 18:27 | danielsz` | Clojure vs ABCL came up recently on the CL G+ group: https://plus.google.com/+DaveTenny/posts/5ekuTDTnTWj |
| 18:32 | cored | neat |
| 18:32 | cored | I have to read so much stuff, quite exciting |
| 18:33 | seangrove | cored: Also good to do stuff at some point. |
| 18:34 | seangrove | Great way to explore for some of the qualitative aspects of languages and their ecosystems |
| 18:34 | cored | seangrove: I have to build a list of things to do |
| 18:35 | danielsz` | /nickname danielszmulewicz |
| 18:35 | cored | btw, this catch my attention yesterday (def third (fn [list] (nth list 2))) and (def third (fn [list] (first (rest (rest list))))) |
| 18:35 | cored | the author of the book ask to build that function mine wsa the first implementation but his solution was the second one |
| 18:36 | justin_smith | cored: (defn third [[_ _ three]] three) |
| 18:36 | cored | he teached the nth function so I just use it, but it's catch my attention on why he did the solution the way he did it and not use a more clear way |
| 18:36 | cored | justin_smith: eh? |
| 18:36 | cored | justin_smith: don't know about that syntax |
| 18:36 | cored | :-( |
| 18:36 | justin_smith | ,((df third [[_ _ three]] three) (range)) |
| 18:36 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: df in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 18:36 | justin_smith | er |
| 18:36 | justin_smith | ,((fn third [[_ _ three]] three) (range)) |
| 18:36 | clojurebot | 2 |
| 18:36 | seangrove | hah |
| 18:37 | justin_smith | cored: destructuring, it matches the structure of the input collection |
| 18:37 | seangrove | ,((fn third [[first-thing second-thing third-thing]] [third-thing first-thing second-thing]) (range)) |
| 18:37 | clojurebot | [2 0 1] |
| 18:37 | seangrove | Maybe better without the range... |
| 18:38 | seangrove | ,((fn third [[first-thing second-thing third-thing]] [third-thing first-thing second-thing]) [:a :b :c]) |
| 18:38 | clojurebot | [:c :a :b] |
| 18:38 | coventry | What do people think of this use of atoms? Abomination, or just an ugly compromise? https://github.com/coventry/troncle/blob/master/src/troncle/macroshka.clj |
| 18:38 | justin_smith | seangrove: nicely illustrative, though the name third is no longer helpful :) |
| 18:39 | seangrove | s/third/destructive power! |
| 18:40 | justin_smith | cored: destructuring can be don in fn (and thus defn) let, loop, doseq, for etc. and is often a good way to reduce verbosity / increase clarity of how you are using the input |
| 18:40 | justin_smith | cored: it can also destructure maps |
| 18:40 | justin_smith | ,((fn [{x :a}] (* x x)) {:a 12}) |
| 18:40 | clojurebot | 144 |
| 18:47 | cored | justin_smith: I'm lost :-( |
| 18:48 | cored | justin_smith: are you talking on the implementation in particular on why he did what he did in his solution ? |
| 18:48 | seangrove | cored: Don't worry about it, it's a cool feature but nothing you need to worry about |
| 18:48 | justin_smith | cored: the destructuring clause matches the structure of the input |
| 18:48 | seangrove | cored: He was just showing you a cool alternative approach to the implementation of 'third' |
| 18:48 | cored | seangrove: oh ok |
| 18:48 | cored | justin_smith: got it |
| 18:48 | cored | thanks |
| 18:49 | cored | have to study it |
| 18:49 | justin_smith | also, I'd say nth is better in clojure than (first (first (rest x))) |
| 18:49 | justin_smith | err first rest rest |
| 18:49 | cored | :-) |
| 18:50 | justin_smith | not that it does something different, but it is clearer |
| 18:50 | justin_smith | the compiler likely generates the same output from either |
| 18:50 | coventry | justin_smith: No, it calls a java method. |
| 18:50 | coventry | ~nth |
| 18:51 | clojurebot | Titim gan éirí ort. |
| 18:52 | justin_smith | coventry: even on a list or lazyseq? |
| 18:52 | seangrove | Would be cool if clojurebot could link to the source of clojure/clojurescript functions |
| 18:52 | coventry | seangrove: There is a syntax for that, but I have forgotten it. |
| 18:52 | justin_smith | $source nth |
| 18:52 | lazybot | nth is http://is.gd/hLMyIH |
| 18:53 | justin_smith | in the repl there is (clojure.repl/source foo) also |
| 18:53 | `cbp | ,(source nth) |
| 18:53 | clojurebot | Source not found\n |
| 18:54 | justin_smith | in your own repl, the bots don't do it |
| 18:54 | coventry | I suppose the hotspot compiler might end up with similar bytecode after a while. |
| 18:54 | seangrove | Nice, now it just needs to know how to keep track of the latest definition and also syntax for the cljs implementation |
| 18:55 | coventry | Seriously, if anyone could take a look at that macroshka macro and tell me a better way to reconstruct the macroexpand-all from recursive macroexpansions, I would be grateful. It's ugly, but I haven't been able to think of a better way. |
| 18:57 | justin_smith | coventry: I took a quick look, it was hard reading for me though that could be because my brain is momentarily on vacation for all I know. I'll let you know if I fail to find it comprehensible, or find it comprehensible enough to offer meaningful feedback. |
| 18:57 | seangrove | coventry: it's all over my head as well |
| 19:01 | coventry | Thanks for looking, justin_smith, seangrove. The idea is to use a macro which wraps itself around the evaluable components of any form it is passed, so that all macroexpansions are seen during evaluation, and the full macroexpansion can be reconstructed from them. But I couldn't think of a better way for the macro to communicate the macroexpansion components forward to the reconstruction phase without storing them in a tree of atoms. |
| 19:02 | coventry | Basically, it's trying to do the same thing as riddley.walk, but without touching compiler internals. |
| 19:02 | justin_smith | it seems like each branch could be replaced with the expanded version as the form returns - or does this mess up the order of evaluation or something? |
| 19:06 | coventry | Hmm, if that worked, things in the leaves would be evaluated many times, in that case, but it would be a lot simpler. And it should all be side-effect-free anyway... |
| 19:06 | coventry | Thanks, I'll think about it. |
| 19:06 | justin_smith | you could use memoization to avoid the leaf re-evaluation, no? |
| 19:07 | justin_smith | or would that break things by preventing intended side effects |
| 19:09 | coventry | The reason for this recursion is that a macro only gets expanded accurately in its evaluation context. So for each form, you have to make sure that the forms containing it are evaluated. E.g. (defmacro n [t] (println (macroexpand t) (-> 1 inc))) (let [-> (fn [& args] args)] (n (-> 1 inc))) |
| 19:09 | justin_smith | ahh right |
| 19:10 | coventry | riddley.walk fixes this by faking the local bindings. I was trying to find a way to do it which cooperates with the compiler instead. |
| 19:19 | justin_smith | regarding the nth conversation above, yeah, nth is actually much faster on vectors (though it may be a toss up for something like getting the third item) |
| 19:43 | d11wtq | As a TDD/BDD guy coming to clojure, I'm exploring my options for test frameworks. One thing that's important to me is the ability to nest tests, like in RSpec. Is midje basically the best thing out there in that regard? I've just read a blog about a project that moved from midje to clojure.test... are there any strong opinions around the two options out there? |
| 19:48 | d11wtq | Oh, clojure.test does nesting too. (testing ...) looks nicer than (deftest ...). The tests just read better and feel more natural to write. |
| 19:48 | yedi_ | +1 to d11wtq's question -- oh paralysis of choice |
| 19:52 | coventry | d11wtq: You might look at the logs for this channel. That post was discussed here in the last week or so. |
| 19:52 | d11wtq | coventry: thanks. Is this channel on irclogger or something? |
| 19:52 | coventry | http://clojure-log.n01se.net/ |
| 19:53 | d11wtq | coventry: thanks! |
| 19:54 | d11wtq | Looks like http://clojure-log.n01se.net/date/2013-11-25.html |
| 19:56 | d11wtq | Yeah, I agree with the "too much magic" thing. Given clojure.test offers the same nesting, I'll give it a shot. |
| 20:01 | technomancy | d11wtq: you can put calls to c.t./is in any old function |
| 20:01 | technomancy | so the regular tools you use to abstract functions work fine on tests too |
| 20:01 | technomancy | in fact, deftest just creates a function |
| 20:02 | d11wtq | Yeah. Simpler is better. Although deftest feels too xUnit-style to me, which I don't like so much. |
| 20:04 | technomancy | yeah, a better way to do it would be (defn ^:test mytest [] ...) |
| 20:04 | technomancy | too late for that, but the difference is very minor |
| 20:10 | justin_smith | d11wtq: the way I wrote the caribou database backend tests was basically to write a function that runs a db through the hoops, and call it with each database in turn |
| 20:10 | justin_smith | that way I didn't need to duplicate code excessively, and I did not need to interleave the various backends |
| 20:10 | justin_smith | the function of course contained various calls to test/is |
| 20:14 | technomancy | the one problem with an c.t/is called from multiple places is the line number becomes less helpful |
| 20:14 | justin_smith | true |
| 20:14 | justin_smith | that's what the testing form is for |
| 20:15 | technomancy | I like to factor out a bunch of predicates and share logic there, keeping the is in the deftest |
| 20:15 | technomancy | but c.t/testing helps too |
| 20:15 | justin_smith | my actual test is more like (deftest mysql-test (with-db mysql (testing "mysql and creation" (creation-test mysql)) ...)) |
| 20:16 | justin_smith | then all the test/is calls are in creation-test |
| 20:16 | justin_smith | but I see the value of keeping is in the deftest too, but I opted not to |
| 20:18 | technomancy | I should hook up C-x ` into clojure.test; that would be bangin' |
| 20:18 | justin_smith | hmm, never mind. I misremember or it changed since then - I think patchwork refactored it |
| 20:19 | justin_smith | https://github.com/caribou/caribou-core/blob/master/test/caribou/test/model.clj#L907 |
| 20:25 | emaphis | /banlist |
| 20:28 | general-general | I've got a question. How do I alter a clojure.java.io/writer function to accept a url, I'm finding it hard to find an example.. I think I'm supposed to put as-url in there somewhere... not sure where. |
| 20:28 | general-general | ? |
| 20:28 | general-general | I forgot the question mark. |
| 20:29 | justin_smith | call io/input-stream on the url |
| 20:29 | justin_smith | or are you trying to write to the url? |
| 20:29 | general-general | Yes, trying to write. |
| 20:29 | justin_smith | I think you'll do better to use clj-http.client for that kind of thing |
| 20:30 | general-general | Essentially trying to do something like post a "like" for a comment on a forum. |
| 20:30 | justin_smith | yeah, with clj-http.client you can just specify the data for the body as a map |
| 20:30 | general-general | Shame, I was hoping I could do it using just 'the core'. |
| 20:30 | justin_smith | and you don't even need to mess with streams |
| 20:30 | justin_smith | you could |
| 20:30 | justin_smith | it would just be more hassle than it is worth, in my experience |
| 20:31 | general-general | OK. |
| 20:31 | general-general | I wonder would the source of clj.http-client tell me. |
| 20:31 | justin_smith | unless you think using streams and sockets and io/copy is fun - in that case go for it, you are sure to learn a lot |
| 20:31 | justin_smith | but it is not likely to get you the easiest, the most correct, or even the most performant result |
| 20:31 | justin_smith | it could |
| 20:32 | general-general | Thanks Justin. |
| 20:35 | justin_smith | general-general: https://github.com/dakrone/clj-http/blob/master/src/clj_http/core.clj#L199 this looks like the meat of it in http.client |
| 20:35 | justin_smith | mostly using apache libs |
| 20:35 | justin_smith | for clojure code, that is epic in size |
| 21:33 | yedi_ | ugh this fixed header is so fucking huge, why do ppl do this: http://www.nearform.com/nodecrunch/how-node-js-has-revolutionized-the-mailonline#.Upk4JWRDtvZ |
| 21:41 | yedi | 155k lines of java to 4k lines of clojure??? that has to be bullshit |
| 21:43 | dsrx | "lines of code" isn't the best metric of code complexity or even length |
| 21:44 | Raynes | yedi: Well, if it was crappy Java and good Clojure... |
| 21:44 | Raynes | But I feel like they left something out. |
| 21:44 | Raynes | Like the 100k lines of mustache templates that they included in that count or something :P |
| 21:44 | dsrx | also w/ judicious use of macros you can end up with insanely tight java->clojure replacement |
| 21:44 | dsrx | probably |
| 21:45 | Raynes | yedi: More importantly, I bet they could replace those 4k lines of Clojure with 4 lines of J. |
| 21:45 | Raynes | :P |
| 21:46 | bitemyapp | yedi: I don't think it's bullshit, I've seen some ridiculous Java codebases. |
| 21:46 | bitemyapp | it's definitely an uncommon/extreme case, and there was probably a second system effect involved where they were able to cut away cruft, but it's still possible. |
| 21:48 | coventry | I think this micro-services architecture idea is interesting and slightly scary. (Dozens or hundreds of little servers, each just a few hundred LOC, all talking amongst themselves.) Anyone have experience with something like that? |
| 21:49 | coventry | It's mentioned in the article just before the "Journey to Node" section. |
| 21:49 | scottj | "155k lines of Java rewritten in 4k lines of Java" 10 day ago 0 points |
| 21:52 | coventry | Hmm "...about 4000 lines of Clojure (accompanied by a large number of Moustache templates shared by Node)." I wonder if that's where the java bloat was. |
| 21:53 | bitemyapp | coventry: I've worked on SOA and micro-SOA deployments. |
| 21:53 | bitemyapp | coventry: they're as much about formalizing inter-dependence into contracts/APIs as anything else. I like them because they make your services language-independent, enabling teams to use the tools they actually like. |
| 21:55 | bitemyapp | SOA gives the use of things like Clojure a huge leg-up because then your components are reusable APIs instead of java libraries that have to be language native across a variety of services. |
| 21:55 | bitemyapp | can make scaling easier to pull off when there's an abstraction layer between provider and consumer too |
| 21:56 | coventry | bitemyapp: How many services? Were you releasing multiple versions of the same API simultaneously, as Fred George recommends? Were interactions between servers any harder to debug than systems with fewer, larger components? |
| 21:57 | bitemyapp | coventry: depends on which company, but in one case it was like 5-6 main services and a group of smaller ones. Multiple versions of the API simultaneously, yes. |
| 21:57 | yedi | Raynes: i guess the joke is that J does fucking _everything_ ? |
| 21:57 | Raynes | yedi: The joke is that J is an extremely compressed language. |
| 21:57 | bitemyapp | coventry: harder to debug depends on how you think about it. If you do it amateur-hour style and have to manually pull in logs from multiple services, that sucks, but it's supposed to incentivize you to setup centralized logging, search, and analytics (as a service) |
| 21:57 | Raynes | yedi: You can write bitemyapp's personality in two lines of j. |
| 21:58 | bitemyapp | coventry: I found that I preferred searching and grouping log messages in a centralized interface to grepping (or just plain trying to find) log files on naive deployments |
| 21:58 | coventry | bitemyapp: Cool. What tools did you use to aggregate the logs? |
| 21:58 | bitemyapp | coventry: elasticsearch and a custom dashboard. |
| 21:59 | bitemyapp | coventry: servers creating log events emitted JSON that could be filtered by server name, service name, timestamps, etc. |
| 21:59 | bitemyapp | they emitted JSON to haproxy fronting the ES nodes. |
| 22:00 | coventry | bitemyapp: Thanks. |
| 22:01 | bitemyapp | coventry: part of the impetus towards this SOA-esque setup was to move away from the really *really* bad default target for most companies where you have a bunch of backend and frontend services independently mutating a MySQL/PostgreSQL database. |
| 22:01 | yedi | ahh i love this channel |
| 22:01 | bitemyapp | coventry: it's easier to debug SOA log messages than it is to play "whodunnit" with a global mutable data store. |
| 22:03 | coventry | bitemyapp: How does SOA mitigate the problems of having a centralized DB? |
| 22:04 | bitemyapp | coventry: independent data stores, single responsibility infrastructure, easier to know why/how something happened or cahnged. |
| 22:04 | bitemyapp | coventry: it's infrastructural decomplection. |
| 22:05 | bitemyapp | I'm slowly getting my company to do the same thing with their various Python/MySQL/MongoDB/PostgreSQL things running around. Luckily they're a sharp bunch and knew to make things accessible via API rather than database mutation, so they're half-way there. |
| 22:07 | coventry | bitemyapp: Oh, "API rather than database mutation" makes it clear. Thanks. |
| 22:07 | bitemyapp | coventry: this is important because as you scale, you can start to enforce/provide guarantees at the API level, like, "this operation is idempotent...this operation is commutative" etc etc |
| 22:07 | bitemyapp | these constraints/guarantees are necessary for sanity, hygiene, and scaling. |
| 22:08 | bitemyapp | unless you *enjoy* being in a systems-level tarpit >:) |
| 22:09 | coventry | Yeah, sounds like a huge win. |
| 22:09 | bitemyapp | coventry: it can be, you still need to write good documentation so your coworkers don't get pissed. |
| 22:11 | coventry | bitemyapp: Right, well in the organizational structure George is talking about, I guess you make your service useable or it doesn't get used and you get voted off the island. |
| 22:11 | bitemyapp | coventry: yeah, which is appropriate. |
| 22:11 | bitemyapp | coventry: that's another reason I like SOA, technologies/infrastructure move forward on a more evolutionary and somewhat less legacy-oriented basis. |
| 22:12 | francis_wolke | There is a paper (co?)authored by Oleg Kiselyov on creating a miniKanren logic programming system in haskell that didn't work out as well as the implementation in scheme. I'm not sure of the name or where look. His site didn't help me out at all. Could someone give me a hint here? Right now I'm looking at his papers one by one. :/ |
| 22:13 | bitemyapp | francis_wolke: narrowing down Oleg papers is an NP hard problem. |
| 22:13 | bitemyapp | Oleg is the bane of Comp sci graduate students everywhere. "Oleg already did it." |
| 22:14 | coventry | One link: http://scholar.google.com/scholar?q=author%3AOleg-Kiselyov+minikanren+haskell&btnG=&hl=en&as_sdt=0%2C33 |
| 22:17 | gfredericks | hunter3 |
| 22:19 | bitemyapp | gfredericks: hunter2 |
| 22:21 | gfredericks | oh right that was it |
| 22:47 | technomancy | oleg uses eshell |
| 23:01 | francis_wolke | technomancy: yay? |
| 23:02 | beppu | How do you guys debug your clojure code? |
| 23:02 | beppu | Take something like this for example: https://gist.github.com/beppu/7715205 |
| 23:08 | `cbp | you can use something like http://clojurewiki.com/Tracing or printlns :) |
| 23:08 | `cbp | with anonymous fns you can try giving them names as if you have an error in one of them it will tell you which one |
| 23:11 | beppu | `cbp During the ->>, how would I println an intermediate value? |
| 23:11 | beppu | (based on the gist I posted earlier) |
| 23:12 | `cbp | define a function that prints a value and then returns a value |
| 23:12 | `cbp | then just plug it in |
| 23:12 | beppu | ok |
| 23:12 | xeqi | &(->> :x (#(doto % println))) |
| 23:12 | lazybot | ⇒ :x :x |
| 23:12 | `cbp | that returns the same value |
| 23:13 | `cbp | * |
| 23:13 | clojurebot | * is just for when you are lazy and sloppy |
| 23:13 | `cbp | clojurebot: botsmack |
| 23:13 | clojurebot | clojurebot evades successfully! |
| 23:13 | `cbp | :( |
| 23:13 | beppu | doto is new to me |
| 23:14 | coventry | Hey, bitemyapp, thanks for the mention of troncle on the wiki. :-) |
| 23:14 | beppu | that's a cool idiom. thanks `cbp and xeqi . |
| 23:14 | bitemyapp | coventry: thanks for making useful things. |
| 23:14 | `cbp | its for java interop mostly thats a weird ass use of it |
| 23:15 | bitemyapp | coventry: you can return the favor by writing stuff on the wiki :) |
| 23:16 | coventry | I'll keep an eye out for places where I can contribute. |
| 23:16 | xeqi | beppu, `cbp : true, I think debug output like this is the only non interop object mutating code I use it for |
| 23:16 | bitemyapp | coventry: libraries needs letters below "D" ported over. |
| 23:17 | bitemyapp | boring work but needs done. |
| 23:17 | bitemyapp | akurilin: I can't wait for the new Alcest album. |
| 23:18 | bitemyapp | Gonna buy it so I can use the CD in my car. |
| 23:18 | coventry | bitemyapp: yeah, that calls for a script. |
| 23:18 | bitemyapp | coventry: Ordinarily I agree but I'm curating stuff that should be elided or added in the course of the transfer. |
| 23:21 | bitemyapp | I'm not going to stop anybody that adds stuff back in, but when they do, I'll probably comment on it. |
| 23:21 | bitemyapp | which is something I've already done. |
| 23:21 | bitemyapp | I'd rather trend in the direction of more information rather than less. |
| 23:22 | bitemyapp | but the elisions are tended to spare me explaining that something is old or not very good. |
| 23:22 | bitemyapp | not that that's necessarily why somebody's library isn't in there yet. |
| 23:37 | coventry | bitemyapp: It's just a dumb transformation, but it might save you a little work: https://www.refheap.com/21363 |
| 23:38 | bitemyapp | coventry: thank you very much |
| 23:39 | coventry | It was easy: https://www.refheap.com/21364 |
| 23:46 | bitemyapp | coventry: http://clojurewiki.com/Libraries ding a ling. |
| 23:46 | bitemyapp | you used Python? you're a terrible person :P |
| 23:47 | coventry | BeautifulSoup is the Right Tool for that job. :-) |
| 23:47 | bitemyapp | coventry: true, just found it amusing :) |
| 23:48 | francis_wolke | dnolen: While working at the the cljs-repl the representation of the eval'd data structures gets printed - even when using `def'. When working with large amounts of data, this can cause slowdowns in the development experience (Emacs freezes). What is the intended end-game function of the cljs-repl? EG: is printing defs and the js representations of function defnitions desirable? What are the tradeoffs involved? |