2014-05-20
| 00:00 | danielcompton | dbasch does this look correct for comparing two byte-buffers? https://www.refheap.com/85670 |
| 00:04 | dbasch | danielcompton: java.nio.ByteBuffer implements comparable, so you could just do (.compareTo b1 b2) |
| 00:05 | danielcompton | facepalm |
| 00:06 | danielcompton | dbasch that's why I was confused about the equality thing earlier |
| 00:06 | dbasch | it returns an int, so you want (= 0 (.compareTo ….)) |
| 00:07 | dbasch | yeah, ByteBuffer wraps byte buffers in objects with useful methods |
| 00:07 | danielcompton | dbasch the nio version? |
| 00:07 | dbasch | yes |
| 00:07 | danielcompton | dbasch wait, there is only the nio version rihgt? |
| 00:07 | dbasch | yeah, I don’t think there’s another one |
| 00:08 | danielcompton | dbasch thanks! What is = comparing on two byte-buffers, reference or value? |
| 00:10 | dbasch | danielcompton: it will do this: http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#equals(java.lang.Object) |
| 00:10 | dbasch | so it should work |
| 00:11 | danielcompton | dbasch what's the difference between equals and compareTo? They seem to be doing the same thing? |
| 00:11 | dbasch | danielcompton: compareTo is useful for sorting |
| 00:12 | dbasch | it puts them in order |
| 00:12 | danielcompton | dbasch ahh |
| 00:12 | dbasch | equals is binary |
| 00:12 | dbasch | compareTo is >, = or < |
| 00:16 | yeoj___ | is there any function that will convert "some-var" to :some-var to some-var ? I know about names and keywords, but seems like nothing goes into some-var |
| 00:17 | dissipate | yeoj___, yep, a macro would |
| 00:17 | tolstoy | or intern |
| 00:17 | yeoj___ | so in a macro i have to unquote? |
| 00:18 | tolstoy | I think some-var# generates a symbol for you. |
| 00:19 | yeoj___ | ahh ok thats what i'm mising |
| 00:19 | Frozenlock | yeoj___: Is this what you are talking about? https://www.refheap.com/11818 |
| 00:20 | yeoj___ | Frozenlock: i think i need the opposite of mapify, i have a :thingy inside a macro, and i'm trying to pass :thing as part of a larger string |
| 00:21 | dbasch | ,(name :thing) |
| 00:21 | clojurebot | "thing" |
| 00:22 | dbasch | yeoj___: isn’t that what you want? |
| 00:23 | ddellacosta | yeoj___: if you want a symbol from what dbasch did just do |
| 00:23 | ddellacosta | ,(-> :some-var name symbol) |
| 00:23 | clojurebot | some-var |
| 00:24 | yeoj___ | i must be thinking about it the wrong way... i'm trying to do something with this: https://www.refheap.com/85672 |
| 00:25 | yeoj___ | i've never really understood macros, and am just rewriting a bunch of boilerplate korma crud stuff |
| 00:25 | yeoj___ | i guess i want to create a function, that has a function name as a string composition. |
| 00:27 | ddellacosta | yeoj___: here's a very simple way to do it |
| 00:28 | ddellacosta | ,(defmacro defcrudfn [name] `(defn ~(symbol name) [args#] (println args#))) |
| 00:28 | clojurebot | #'sandbox/defcrudfn |
| 00:28 | ddellacosta | ,(defcrudfn "foo") |
| 00:28 | clojurebot | #'sandbox/foo |
| 00:28 | ddellacosta | (foo {:some "args"}) |
| 00:28 | ddellacosta | do'h |
| 00:28 | ddellacosta | ,(foo {:some "args"}) |
| 00:28 | clojurebot | {:some args}\n |
| 00:28 | ddellacosta | *d'oh |
| 00:29 | ddellacosta | anyways |
| 00:29 | ddellacosta | yeoj___: if you want to concat it, you can do this |
| 00:29 | ddellacosta | ,(defmacro defcrudfn [name] `(defn ~(symbol (str "my-crud-fn-" name) [args#] (println args#))) |
| 00:29 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 00:29 | ddellacosta | whoops |
| 00:29 | ddellacosta | ,(defmacro defcrudfn [name] `(defn ~(symbol (str "my-crud-fn-" name)) [args#] (println args#))) |
| 00:29 | clojurebot | #'sandbox/defcrudfn |
| 00:29 | danoyoung | i was wondering if someone could offer advice on how to repeatedly take 5K line from a file, do something with those 5K, and continue getting 5K more until the file contents are exhausted. |
| 00:30 | danoyoung | I'm new to clojure |
| 00:30 | ddellacosta | ,(defcrudfn "foo") |
| 00:30 | clojurebot | #'sandbox/my-crud-fn-foo |
| 00:30 | ddellacosta | (my-crud-fn-foo "args") |
| 00:30 | ddellacosta | ,(my-crud-fn-foo "args") |
| 00:30 | clojurebot | args\n |
| 00:30 | danoyoung | I have some files in S3 that I want to loop over and read, take the contents and then index them into elasticsearch using the bulk api. |
| 00:30 | yeoj___ | ddellacosta: ok i'm trying to make sense of all that, 1 min |
| 00:31 | danoyoung | so far I have something like this: http://pastebin.com/3ETqp8Fg |
| 00:31 | ddellacosta | yeoj___: sure thing--if anything is not clear definitely ask |
| 00:31 | danoyoung | but I don't know how to grab 5K @ a time…. |
| 00:31 | yeoj___ | ddellacosta: thank you |
| 00:33 | dbasch | danoyoung: 5k lines at a time you mean? |
| 00:33 | danoyoung | yea |
| 00:33 | danoyoung | something like take 5000 |
| 00:34 | dbasch | danoyoung: you have a sequence of lines, so you can do that, or you can partition it into chunks of 5k |
| 00:35 | dbasch | then doseq over the chunks |
| 00:35 | danoyoung | dbasch: this is what I have so far: http://pastebin.com/3ETqp8Fg |
| 00:36 | danoyoung | so I need to look into using the clojure.core/partition? I'm new to clojure….just need some direction…. |
| 00:37 | dbasch | danoyoung: you could do something like |
| 00:38 | dbasch | (doseq [chunk (partition 5000 (line-seq rdr))] (index chunk)) |
| 00:38 | dbasch | (doc partition) |
| 00:38 | clojurebot | "([n coll] [n step coll] [n step pad coll]); Returns a lazy sequence of lists of n items each, at offsets step apart. If step is not supplied, defaults to n, i.e. the partitions do not overlap. If a pad collection is supplied, use its elements as necessary to complete last partition upto n items. In case there are not enough padding elements, return a partition with less than n items." |
| 00:38 | danoyoung | ok…cool, let me look into those functions. |
| 00:38 | danoyoung | thanx! |
| 00:40 | danoyoung | dbasch: learning clojure has been pretty fun so far! |
| 00:43 | ddellacosta | danoyoung: awesome. :-) |
| 00:43 | dbasch | danoyoung: if you’re looking for a good clojure book, get The Joy of Clojure |
| 00:43 | danoyoung | great, thanx. Will do! |
| 00:43 | danoyoung | dbasch that worked like a charm! thank you. |
| 00:43 | dbasch | you’re welcome |
| 00:46 | mercwithamouth | hrmm can someone tell me why selmer is unable to find my index.html file even when the path is hard coded in? https://github.com/jamalburgess/pepper |
| 00:47 | servo | dafuq |
| 00:47 | servo | https://github.com/fogus/lemonad/blob/7e6137fed655777963ac7b74913c78073070adc5/lib/lemonad.js#L515 |
| 00:48 | servo | https://github.com/fogus/lemonad/blob/7e6137fed655777963ac7b74913c78073070adc5/lib/lemonad.js#L470 |
| 00:49 | mercwithamouth | lol!!! |
| 00:50 | beamso | mercwithamouth: i found that the selmer templates have to be under src |
| 00:51 | mercwithamouth | beamso: hmm really? i guess that's fine...good to know |
| 00:53 | mercwithamouth | beamso: yup! that does it...thanks |
| 00:53 | kenrestivo | servo: um, he's a fan of h.p. lovecraft and breaking bad? |
| 00:59 | yeoj___ | ddellacosta: thats great i think i got it, thanks for your help. |
| 00:59 | ddellacosta | yeoj___: Great! Glad to hear it. |
| 00:59 | yeoj___ | ddellacosta: i've been staring at macros like that for ages thinking d'oh |
| 01:00 | ddellacosta | yeoj___: it took me a while before it clicked. I think you just have to keep at it and eventually it'll become second nature. |
| 01:01 | ddellacosta | yeoj___: it's also really important to understand how symbols and vars work in Clojure--I found that a lot of my confusion about macros had to do with not understanding how those worked. So definitely read up on those if you haven't yet. |
| 01:02 | ddellacosta | yeoj___: ...as well as being clear about compile- vs. run- time. |
| 01:06 | tolstoy | mercwithamouth: Is compojure expecting index.html in /resources/public? |
| 01:07 | servo | watcher.core=> (🙈 '🙉 '🙊) |
| 01:07 | servo | Exception Death watcher.core/🙈 (NO_SOURCE_FILE:1) |
| 01:07 | servo | emoji all the symbols |
| 01:16 | mercwithamouth | tolstoy_: i assume the result says no. i assumed i could tell it where to pull the file from regardless but that wasn't the case |
| 01:17 | tolstoy_ | mercwithamouth: I think (route/resource "/view") might do it. It's been awhile. |
| 01:17 | mercwithamouth | that comes from a previous clojurescript attempt i made wher I was allowed to pull from the public folder. i just believe client/server code should be 100% separated |
| 01:18 | mercwithamouth | tolstoy_: i think you're right...i believe that IS what I did...i can't remember. it was over a month ago and i've been inconsistent with my clojure/compojure studying |
| 01:18 | beamso | has anyone used om in anger? |
| 01:18 | tolstoy_ | :) |
| 01:18 | tolstoy_ | http://weavejester.github.io/compojure/compojure.route.html |
| 01:18 | tolstoy_ | That :root thing. |
| 01:19 | servo | woo i have a legit question now after messing with emoji: |
| 01:19 | servo | watcher.core=> (map (comp byte int) "🙈") |
| 01:19 | servo | IllegalArgumentException Value out of range for byte: 55357 clojure.lang.RT.byteCast (RT.java:993) |
| 01:19 | servo | is there a way to coerce that into bytes? |
| 01:20 | mercwithamouth | beamso: it's on my todo list |
| 01:21 | mercwithamouth | tolstoy_: ah ha...i've heard of this so called 'documentation' thing |
| 01:21 | ddellacosta | beamso: what's going on? |
| 01:21 | mercwithamouth | i should really work through the project in web development with clojure before i go off on my own opposed to 'glancing' |
| 01:21 | tolstoy_ | mercwithamouth: The thing about documentation is you kinda already have to know it to even know how to use the documentation. |
| 01:22 | mercwithamouth | ddellacosta: tell me you use Om as well |
| 01:22 | mercwithamouth | tolstoy_: true... |
| 01:22 | beamso | ddellacosta: i was wondering how good it is/isn't |
| 01:22 | ddellacosta | beamso: I use Om almost constantly |
| 01:22 | ddellacosta | er, that was for mercwithamouth I suppose |
| 01:22 | beamso | the things i've read about it (and react) and the tutes seem okay |
| 01:22 | mercwithamouth | om and nolen are a God send...that is all |
| 01:22 | mercwithamouth | ddellacosta: i will be harassing you when ready. =) |
| 01:22 | ddellacosta | beamso: it's good. It doesn't solve all problems, but it solves a lot of UX dev problems. |
| 01:22 | ddellacosta | mercwithamouth: oh, sure thing. :-) |
| 01:23 | beamso | do you use anything in particular for models or just plain javascript objects? |
| 01:23 | ddellacosta | beamso: for models--you mean for the app data we pass in? |
| 01:23 | beamso | yeah |
| 01:23 | beamso | i notice the tutes send EDN across but i was concerned about that one |
| 01:24 | ddellacosta | beamso: well, it requires maps or vectors basically. Otherwise you can't create a cursor, which is the abstraction that dnolen created to coordinate Clojure data structures with React |
| 01:24 | beamso | okay |
| 01:25 | ddellacosta | beamso: ...and I think that speaks to the biggest problem with Om, is that there are some somewhat confusing concepts involved that I'm still not sure are very clear to me--even though I've been using Om in production for months. But leaving that aside, it works well. |
| 01:26 | beamso | forgive my ignorance but what would these concepts be? |
| 01:26 | ddellacosta | beamso: not at all--well, I was talking about the cursor concept in particular. I think that's the one that is hardest to grasp, and its purpose is the least clear. |
| 01:28 | ddellacosta | beamso: although I think this explanation is decent: https://github.com/swannodette/om/wiki/Cursors, I would like to see something that is even more general. "cursors wrap up and manage updating Clojure data structures within the React render cycle" or something |
| 01:28 | ddellacosta | mercwithamouth: what did you want to ask about btw.? You were talking about testing routes yesterday, no? |
| 01:29 | ddellacosta | mercwithamouth: if you have something concrete I can help you with it more easily. |
| 01:30 | mercwithamouth | ddellacosta: just now getting to it. for starters...i'd like to just create a route that collects a few fields and know that it does indeed catch the data sent |
| 01:30 | mercwithamouth | two secs...i'll create a route now and push it |
| 01:30 | ddellacosta | mercwithamouth: k |
| 01:41 | mercwithamouth | ddellacosta: ok we can use this to get my feet wet https://github.com/jamalburgess/pepper |
| 01:42 | ddellacosta | mercwithamouth: k, so, what within that in particular do you want to work with/test/etc.? |
| 01:43 | mercwithamouth | like either from the repl or command line i'd like to be able to do something like http:localhost:8080/register:"user-name":"pass" and then see that something has happened correctly |
| 01:43 | mercwithamouth | ^ new developer so i'm really not sure what to ask. i'm used to rails hiding a lot of this from me |
| 01:43 | ddellacosta | mercwithamouth: gotcha |
| 01:44 | ddellacosta | mercwithamouth: well, the first problem is that layout is throwing an error when I try to load up a repl |
| 01:44 | ddellacosta | ah, def -> defn |
| 01:44 | ddellacosta | also, content-type needs to be referenced |
| 01:46 | mercwithamouth | ahh hmm...disregard that. i'd just gotten to the point where selmer worked and I started to go through the code in web development in clojure where they change the template over to use selmer. let me go back |
| 01:47 | ddellacosta | mercwithamouth: also handle-registration is broken in pepper.routes.home, I just added an id arg to that fn for now |
| 01:48 | mercwithamouth | ok sorry about that. layout.clj is back to nromal and feel free to change handle registration. i'd even be fine if we were adding data to a map |
| 01:48 | ddellacosta | mercwithamouth: no worries |
| 01:48 | ddellacosta | one sec |
| 01:50 | ddellacosta | freaking noir |
| 01:51 | ddellacosta | mercwithamouth: I would suggest minimizing the use of noir...but I guess you're probably following someone's guide, no? |
| 01:51 | beamso | lib-noir? |
| 01:51 | mercwithamouth | ddellacosta: i am following someone but i'm not attached to any libraries..i'm very open |
| 01:52 | mercwithamouth | beamso: yeah i was going to use lib-noir |
| 01:52 | beamso | better to use validateur for map/record validation? |
| 01:53 | ddellacosta | yeah, I lazily call lib-noir noir |
| 01:53 | ddellacosta | hold on, making a refheap |
| 01:54 | beamso | oh, maybe i can use prismatic schema for validation |
| 01:54 | ddellacosta | mercwithamouth: so, I had to massage a few things in your code as I described--commented out noir for now--but this is a very simple way to test routes in the repl: https://www.refheap.com/85674 |
| 01:54 | ddellacosta | mercwithamouth: it's probably way easier than you had imagined. :-) |
| 01:55 | ddellacosta | beamso: we have our own custom validation thing, but I've prismatic's schema definitely seems good |
| 01:55 | mercwithamouth | it is and that's exacty what i was looking for =P |
| 01:56 | ddellacosta | mercwithamouth: great! I think there's probably a way to get lib-noir's session working with that too, but I'd have to play with it a bit. However, you can test out a lot of the basics of passing values around this way to start. |
| 01:56 | ddellacosta | mercwithamouth: alternatively just use the default ring session stuff for now |
| 01:57 | mercwithamouth | so like would it be as simple as (r/request :post "/register" "name" "pass")? |
| 01:57 | ddellacosta | mercwithamouth: oh, I think you pass in a map, lemme see |
| 01:58 | mercwithamouth | like if i could do (ph/app (r/request :post "/register" {:user-handle "Jamal" :pass "pastry"})) that would be interesting |
| 01:59 | ddellacosta | mercwithamouth: this should be illustrative: https://www.refheap.com/85675 |
| 01:59 | ddellacosta | mercwithamouth: yep, that's exactly what you can do. |
| 02:00 | mercwithamouth | ddellacosta: YUP!!! exactly what i wanted |
| 02:00 | mercwithamouth | thank you! |
| 02:00 | ddellacosta | mercwithamouth: those two lines of output after I call the handler are 1) the request dumped out in the fn, and 2) the redirect response. So you can get all of that easily. |
| 02:00 | ddellacosta | mercwithamouth: Great! Glad I could be of service. I'm going to go grab some lunch but let me know if you have more questions. :-) |
| 02:01 | mercwithamouth | Ok, I definitely will be back. this gives me enough to tinker around the way that I want to |
| 02:02 | ddellacosta | aweseom. |
| 02:02 | ddellacosta | *awesome |
| 02:28 | ivan | where do I get that neat macro to log all function calls and return values inside an expression? |
| 02:30 | ivan | I guess this could work https://github.com/flatland/useful/blob/develop/src/flatland/useful/debug.clj |
| 02:36 | amalloy | ivan: i doubt you want to log *all* function calls and return values. that's a lot of them |
| 02:36 | amalloy | but useful/? is pretty good for targeted debugging |
| 02:40 | ivan | thanks |
| 03:01 | michaelr525 | hi |
| 03:01 | michaelr525 | i |
| 03:02 | mengu | hi michaelr525 |
| 03:03 | michaelr525 | is lein-sub the commonly used plugin for development when your code is spread over multiple leiningen projects? |
| 03:05 | beamso | i'm unsure if you need a plugin for it : https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md#checkout-dependencies |
| 03:05 | michaelr525 | i'd like to reload code from a common project for example without restarting the repl.. |
| 03:05 | michaelr525 | ok, let me check that link.. |
| 03:08 | michaelr525 | beamso: thanks! looks like just what I've been looking for |
| 03:30 | mercwithamouth | hmm what's the difference between ring and ring-server...and why does the compojure-app template choose the latter as a dependency? |
| 03:32 | beamso | mercwithamouth: so you can do a 'lein ring server' at the command line and start the server |
| 03:32 | beamso | it should also let the source be recompiled on the fly (so long as you don't introduce any new dependencies) |
| 03:34 | visof | i have a bin file which need to use inside clojure, but this bin need some time to load things and then get result, i tried (sh "/bin/foo" "-q") |
| 03:35 | visof | what is the basic way to do this? |
| 04:31 | mercwithamouth | hmm are there any plans to have rows opposed to just horizontal tabsets with light table? |
| 04:54 | mercwithamouth | ahh how i miss emacs =P |
| 04:58 | visof | can i interact with utils which are reading from STDIN in clojure from inside the code? |
| 04:59 | visof | if i have program behaves like a shell, and waits commands to run from user, can i interact with it from inside clojure, to send commands and print outs ? |
| 05:00 | xsyn | read-line? |
| 05:00 | xsyn | ,(doc read-line) |
| 05:00 | clojurebot | "([]); Reads the next line from stream that is the current value of *in* ." |
| 05:02 | visof | xsyn: nope, what i meant if i have a problem called foo, when i run like /bin/foo i got >> , and after >> should write my commands to execute, that's inside shell, but i mean inside clojure can i do this? |
| 05:03 | visof | something like open a channel between my program and clojure, and send commands to the program, and return back the results |
| 05:04 | xsyn | like nrepl? |
| 05:04 | xsyn | wait |
| 05:04 | xsyn | your program and clojure? what is your program? |
| 05:05 | visof | yeah like even lieningen |
| 05:05 | visof | xsyn: well we can suppose the problem is leiningen |
| 05:05 | visof | s/problem/program |
| 05:05 | visof | can i run lein from inside clojure? |
| 05:06 | xsyn | yeah |
| 05:06 | xsyn | hold on |
| 05:06 | visof | okay |
| 05:06 | llasram | https://github.com/pallet/alembic |
| 05:06 | llasram | Although may not be quite what you mean |
| 05:07 | llasram | Oh, you want to launch Leiningen (or whatnot) as a subprocess |
| 05:08 | xsyn | https://github.com/zcaudate/vinyasa |
| 05:08 | xsyn | vinyasa/lein |
| 05:08 | llasram | xsyn: But that's also in-process |
| 05:08 | llasram | Which I don't think is what visof is trying to get a handle on |
| 05:08 | visof | llasram: yep |
| 05:08 | xsyn | I'm really not clear on the problem space, so.. :) |
| 05:09 | visof | xsyn: sorry for my English, but i'll explain again, when you open your terminal, it's waiting you to enter command to exec, can i make this behaviour in clojure ? |
| 05:10 | visof | run anything which waits for me to enter a commands |
| 05:10 | visof | from inside clojure |
| 05:11 | visof | xsyn: llasram got it? |
| 05:12 | xsyn | No, but it might be my fault |
| 05:12 | xsyn | like a repl? |
| 05:12 | beamso | wouldn't you just read from system.in until you get a ctrl+d? |
| 05:13 | llasram | visof: It depends on the program, and is a general Unix programming problem |
| 05:13 | ddellacosta | visof: you are trying to execute shell commands in Clojure? |
| 05:14 | llasram | Mostly depends on whether the other process expects to communicate over just stdin/out or expects to control a terminal; in which latter case things can get hairy |
| 05:15 | llasram | Either way though, is largely out of scope for Clojure |
| 05:15 | mercwithamouth | hmm how would one get autocomplete to work with emacs/clojure |
| 05:15 | mercwithamouth | https://raw.github.com/clojure-emacs/company-cider/master/screenshot.png <-- |
| 05:15 | mercwithamouth | i have cider installed...repl and everything works great as expected |
| 05:16 | ddellacosta | visof: not sure if this is what you want but check out https://github.com/Raynes/conch |
| 05:16 | visof | ddellacosta: llasram xsyn thanks |
| 05:17 | ddellacosta | mercwithamouth: Hmm, I got autocomplete working w/clojure, what did I do... |
| 05:17 | llasram | mercwithamouth: ac-nrepl ? |
| 05:17 | ddellacosta | mercwithamouth: ah, I installed auto-complete via emacs default (since 24) package manager |
| 05:18 | mercwithamouth | yeah i'm using 24.3 |
| 05:18 | mercwithamouth | hmm what keys? it definitely worked with emacs-live which i don't want to use again |
| 05:19 | mercwithamouth | ok i got it |
| 05:20 | mercwithamouth | well basic autocompletion...not the list that they're showing in that screenshot...but this works for now...i'm back to using emacs |
| 05:20 | ddellacosta | mercwithamouth: my config looks like this if it helps: https://www.refheap.com/85678 |
| 05:21 | ddellacosta | mercwithamouth: yeah, I don't have all of that either, perhaps needs a clojure-specific dictionary? |
| 05:21 | mercwithamouth | ddellacosta: thanks. yeah most likely |
| 05:21 | mercwithamouth | i'll play with it after i get some rest...good to be back on emacs...not that light table isn't very nice |
| 05:22 | ddellacosta | maybe ac-nrepl that llasram suggested would help too |
| 05:22 | mercwithamouth | beamso: eww =( |
| 05:22 | beamso | it works well enough for me |
| 05:23 | beamso | the code completion and warnings are nice |
| 05:23 | ddellacosta | now now, we are accepting of non-emacs editors here in #clojure |
| 05:23 | beamso | i haven't used it to connect to a repl though |
| 05:23 | mercwithamouth | ac-nrepl IS it |
| 05:24 | mercwithamouth | beamso: just playing around, i like intellij a lot. i'd assume their clojure setup is nice as well |
| 05:25 | ddellacosta | mercwithamouth, beamso: my boss uses it w/Clojure and likes it a lot |
| 05:25 | ddellacosta | I'm always giving him crap about not using the one true emacs though |
| 05:25 | beamso | i've used emacs for it as well |
| 05:27 | mercwithamouth | ac-nrepl then ctags... i'm a configuration junkie |
| 05:27 | mercwithamouth | i've never really mastered using ctags, i think it's time to do so |
| 05:28 | ddellacosta | mercwithamouth: me neither. :-/ |
| 05:58 | CookedGryphon | does anyone know how to make midje print proper stacktraces? I'm getting an exception when I run a test, but no line numbers annoyingly |
| 06:15 | cfleming | mercwithamouth: you wouldn't have to with Cursive, of course :-) |
| 06:16 | cfleming | mercwithamouth: Cursive isn't a Jetbrains product BTW, although we're trying for the same quality level |
| 06:17 | cfleming | We have a ways to go yet, though. |
| 06:23 | ssideris | cfleming: is there anything obvious that you can do with emacs that cursive doesn't do in its current version? |
| 06:23 | cfleming | ssideris: Well, it has a lot more community support, so there's modes for a lot of things we don't support yet (Expectations, Midje) |
| 06:24 | cfleming | ssideris: It has better REPL integration too, e.g. we don't have macroexpansion yet, there's a few other things |
| 06:25 | cfleming | But I think Cursive is pretty competitive now - we have pretty complete Paredit, although again we're missing some details here and there |
| 06:25 | ssideris | cfleming: ok, thanks :-) |
| 06:26 | cfleming | The main issue is that Cursive resolves symbols statically in the editor, which requires support for libraries using macros |
| 06:26 | cfleming | So some libs that are very macro-heavy (Midje, Storm, Cascalog) are a little painful till I fix them. |
| 06:26 | cfleming | I'm planning an extension API for that (in fact I use it internally) but I won't open it until it's stable. |
| 06:27 | cfleming | It's getting there, bit by bit. |
| 06:27 | ssideris | cfleming: about paredit: there is a "feature" that I have impemented in elisp but isn't supported in emacs paredit out of the box: re-ordering s-expressions, and moving the cursor along with the moved s-expression so that you can move it a few positions easily |
| 06:27 | ssideris | I think it's useful in some situations |
| 06:27 | cfleming | ssideris: So moving an sexp up or down and moving the cursor with it? |
| 06:27 | ssideris | yes |
| 06:28 | cfleming | Yeah, I'm planning that soon - that would be really useful. |
| 06:28 | ssideris | I'm just mentioning it as an idea for a feature |
| 06:28 | cfleming | It probably means you don't need transpose any more, I guess |
| 06:29 | ssideris | oh it seems that you're way ahead of me :-) thanks for your work, even if I don't use cursive, I think it's good for the community that it exists |
| 06:29 | cfleming | I think Cursive is going to be pretty cool in a couple of months, I'm starting work soon on a bunch of features that will be difficult/impossible to do in Emacs (or other REPL based editors). |
| 06:29 | cfleming | We're already marking unused locals in the editor, which is really useful. |
| 06:30 | cfleming | And having a decent rename + find usages is really great |
| 06:30 | cfleming | But it'll take us a while to catch up with everything Emacs does right now |
| 06:31 | cfleming | Thanks, it's a fun product to work on. |
| 06:32 | ssideris | I'm intrigued by what you said about features being impossible in emacs |
| 06:32 | cfleming | Maybe not impossible, but difficult |
| 06:33 | cfleming | The main difference is that Cursive resolves symbols statically in the editor |
| 06:33 | cfleming | So for a particular symbol, I know where it was declared, and thus what type of thing it is |
| 06:33 | clgv | cfleming: I saw that unused locals features - it seemed it had false alarms on macros that have binding definitions |
| 06:34 | cfleming | That allows me to mark unused locals right now |
| 06:34 | cfleming | clgv: Really? I'd be interested to see a case of that. |
| 06:35 | cfleming | None of this will ever be perfect with Clojure unfortunately, the language is just too flexible to do everything in an IDE you can do with Java |
| 06:35 | clgv | cfleming: I think the examples where in compojure code that a student showed me in cursive |
| 06:35 | cfleming | But you can get a long way |
| 06:35 | cfleming | Ok - do you mean that the IDE said that it couldn't resolve symbols? |
| 06:36 | cfleming | Yeah, that's what I mean by the fact that macros will require some code to identify those symbols |
| 06:36 | clgv | ah right. that's the exact description |
| 06:36 | cfleming | The unused locals is something else - this is where for a let-binding or a function parameter, or something similar, Cursive will tell you if it's never used. |
| 06:36 | clgv | I mixed up unused locals with undeclare symbols, sorry |
| 06:36 | cfleming | No worries |
| 06:36 | cfleming | It's really useful, since that is nearly always a bug |
| 06:37 | cfleming | We'll be marking unused imports and requires in the editor soon too. |
| 06:37 | clgv | cfleming: I know that ccw does a lot of this editor features via static analysis as well. I always thought it shouldnt be that complicated to run an additional repl for the UI which can provide exact infos, is it? |
| 06:37 | cfleming | You could probably do this in Emacs, and of course you can always use something like Slamhound externally, but having it live in the editor is really nice |
| 06:38 | cfleming | clgv: I don't think ccw does anything statically, it's all done in the REPL, like Emacs or Vim would do it. |
| 06:38 | clgv | cfleming: yeah, I definitiely wont argue against nice to have features. I hardly use emacs ;) |
| 06:38 | clgv | cfleming: the outline is definitely static |
| 06:38 | cfleming | AFAIK they don't even provide rename right now. |
| 06:39 | clgv | auto completion and such is done via the REPL |
| 06:39 | cfleming | Hehe, yeah, I'm not trying to start an editor war by any means, it's just interesting to compare them. |
| 06:39 | clgv | yeah, thought so ;) |
| 06:39 | cfleming | Emacs et al never have the problem of undefined symbols, even if they're generated by some gnarly macro |
| 06:40 | cfleming | Although with a REPL you can't do anything with local symbols, only globals |
| 06:40 | cfleming | Swings and roundabouts |
| 06:40 | clgv | cfleming: but again, do you think it would be that complicated to combine the static analysis with information from evaluating the project? |
| 06:41 | cfleming | No, and it's something I've thought about. The issue is that you need a REPL, and you either wait for the user to set one up (and have no support till that's done) or you try to do it automatically |
| 06:41 | cfleming | But people do some crazy things with macros, you can get all kinds of side effects, or it can require odd startup. |
| 06:42 | clgv | cfleming: I'd choose the automatic option and separate it completely from any repl the user launches |
| 06:42 | cfleming | Storm creates a bunch of vars from fields of a Java class, so for that to work you have to compile + load the class, and there's no way to know from looking at the code that you need to do that. |
| 06:42 | clgv | but depending on the features some communication might be needed between that repl and a user repl |
| 06:42 | cfleming | clgv: but you can't automatically start a REPL and just try to load everything into it. |
| 06:43 | cfleming | The user would have to specify what they want loaded. |
| 06:43 | cfleming | I dunno, it's messy. |
| 06:43 | cfleming | But you can't do macroexpansion without a REPL - for the moment I'll be using whatever the user has open |
| 06:43 | clgv | cfleming: you could lazyily load the namespace as soon as they are needed because the user edits a namespace |
| 06:44 | cfleming | clgv: yeah, but that wouldn't load Storm's Java class |
| 06:44 | clgv | when you open an editor for a namespace it can be loaded in the background to provide needed information |
| 06:44 | cfleming | Yeah, you can do that. I'm not sure, I'm going to see how far fully static will take me - combining the information from the two would be tricky |
| 06:45 | cfleming | But it might turn out to be necessary |
| 06:45 | cfleming | I'm hoping not, though :-) |
| 06:47 | clgv | cfleming: well, how can you do anything useful for custom macros defining symbols or functions? |
| 06:47 | clgv | cfleming: I think thats the main problem that static analysis will not solve |
| 06:50 | cfleming | clgv: I have an extension API, which is what I use internally - I'll open that up. |
| 06:51 | cfleming | It's pretty simple, you basically provide a function that takes a form and returns a map that looks very like var metadata |
| 06:51 | clgv | cfleming: ah, the user can provide the syntax of custom macros so that cursive is able to interprete them correctly? |
| 06:51 | cfleming | Yup |
| 06:51 | cfleming | Well, not yet, only I can right now. But that's the idea. |
| 06:51 | clgv | so the most popular libraries can get those annotations like that |
| 06:52 | cfleming | Yeah, and people can write support for their internal macros. |
| 06:52 | clgv | interesting. |
| 06:53 | cfleming | I'll probably have a central repo (like DefinitelyTyped for Javascript) |
| 06:53 | cfleming | But people would be able to use their own extensions. |
| 06:58 | ddellacosta | hmm, what is the plugin for emacs which lets you close/hide clojure forms? is it available in clojure-mode by default? Not sure what to call that operation |
| 06:58 | clgv | ddellacosta: fold/unfold? |
| 06:58 | ddellacosta | clgv: yah, that sounds right...know how to do that w/clojure in emacs? |
| 06:59 | clgv | ddellacosta: no idea. I just wanted to suggest what name you could search |
| 06:59 | ddellacosta | clgv: ah, okay...will see if that helps find the package |
| 06:59 | ddellacosta | thanks |
| 07:00 | agarman | I've honestly never missed collapsed code in emacs |
| 07:00 | agarman | but if you want it |
| 07:00 | agarman | hs-minor-mode |
| 07:00 | agarman | should be available with emacs by default |
| 07:01 | agarman | C-c @ C-c |
| 07:01 | agarman | is the default keybinding |
| 07:01 | ddellacosta | clgv, agarman: d'oh, just found that via this stackoverflow question: http://stackoverflow.com/questions/1085170/how-to-achieve-code-folding-effects-in-emacs ...but thanks! |
| 07:01 | ddellacosta | agarman: yeah, I haven't really ever needed it, but figured I'd play with it and see if it helped at all |
| 07:02 | ddellacosta | agarman: I wanted to get rid of a require form in particular... |
| 07:02 | agarman | IMO, if a require form is so large you don't want to see it, you may have a module that is due to be split apart ;-) |
| 07:02 | agarman | but enjoy |
| 07:03 | mercwithamouth | peep |
| 07:04 | ddellacosta | agarman: generally I'd agree, but this is my base wrapper for my web app, and loads up a bunch of other libs to wrap them up into one main handler. The require block is almost as big as the code in the file! |
| 07:09 | clgv | o_O |
| 07:10 | ddellacosta | (I exaggerate...maybe one-third as big.) |
| 07:17 | martinklepsch | Anyone experience getting nothing but "[Opened /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar]" when running an uberjar with "java -jar name.jar" ? |
| 07:17 | martinklepsch | I tried oracle jdk and openjdk, no luck |
| 07:17 | martinklepsch | (it's all on ubuntu in a docker container) |
| 07:18 | martinklepsch | oh and the command had a "-verbose" in it too |
| 07:21 | beamso | no logs from the application apart from that? |
| 07:22 | silasdavis | I'd like a function that truncates the number of children of any node to be less than n, where a child is either a either a key-value pair or an element in a sequence |
| 07:23 | silasdavis | so that I can print large structures without killing my terminal |
| 07:23 | silasdavis | does anyone know of an existing function that does this, or a nice way of doing it? |
| 07:24 | CookedGryphon | bind *print-length* |
| 07:24 | CookedGryphon | (binding [*print-length* 10] (pr-str (range 99999999)) |
| 07:24 | martinklepsch | beamso, no... same problem as yesterday :/ |
| 07:24 | beamso | oh. |
| 07:24 | beamso | it's still today for me :/ |
| 07:24 | beamso | have you tried running something else in the container? |
| 07:27 | silasdavis | CookedGryphon, ah! I didn't realise that would act recursively across the breadth |
| 07:28 | martinklepsch | beamso, haha, that's fun |
| 07:28 | martinklepsch | I slept the 8 of the last 10 hrs |
| 07:30 | mercwithamouth | hmm any ideas on how to stop my server when (stop-server) gives a null pointer error? |
| 07:30 | mercwithamouth | ps aux i suppose |
| 07:31 | mercwithamouth | good enough... |
| 07:33 | xsyn | (pgrep) |
| 07:34 | master_op | hello, how can handle global variables for my probram |
| 07:34 | mercwithamouth | '(pgrep) |
| 07:34 | mercwithamouth | lol break damn you |
| 07:34 | master_op | program |
| 07:34 | mercwithamouth | jk |
| 07:35 | ddellacosta | master_op: need more context |
| 07:35 | master_op | i have a map that change frequently , how can i update it |
| 07:35 | ddellacosta | master_op: still need more context |
| 07:35 | agarman | master_op: more context, but in general global variables should be minimized |
| 07:35 | master_op | i have a map defined when program start |
| 07:35 | ddellacosta | master_op: why/when do you need to update it? |
| 07:36 | master_op | and i have a function to update this map |
| 07:36 | master_op | add some keyword/value every time |
| 07:36 | agarman | master_op: wrap it in an agent, atom or ref |
| 07:37 | master_op | i use ref but when i try to use contains? it tell me that it not supported on refs |
| 07:37 | agarman | master_op: but there's likely a better way to do whatever you're trying to do without depending upon a mutable variable |
| 07:37 | master_op | how can i do it ? |
| 07:37 | agarman | you have to (contains? @v) |
| 07:37 | master_op | ok |
| 07:37 | agarman | master_op: read http://clojure.org/concurrent_programming |
| 07:38 | agarman | or rather http://clojure.org/refs |
| 07:43 | CookedGryphon | Is there a way to make core.async print line numbers on its exceptions, it's really really annoying having it tell me there's an issue doing a take! from nil but not giving me a clue where that's happening.... |
| 07:55 | gfredericks | CookedGryphon: haha :( |
| 07:59 | gfredericks | CookedGryphon: do you not at least have a stack trace? |
| 07:59 | gfredericks | I'd think there'd be line numbers from the core.async code at least |
| 07:59 | CookedGryphon | nothing, it just prints the message from the exception and nothing else |
| 07:59 | llasram | gfredericks: Unless tbaldridge has cut a new version, IIRC the last release includes some code (I assume accidentally left in debugging code) which just prints the exception |
| 08:00 | llasram | No trace, etc -- just the exception object |
| 08:00 | gfredericks | oh that's wonderful |
| 08:00 | CookedGryphon | it's better than failing silently like it used to iirc |
| 08:01 | gfredericks | my favorite thing is when an ExceptionInfo gets printed without the data |
| 08:01 | llasram | https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/exec/threadpool.clj#L33 |
| 08:01 | CookedGryphon | could someone change that to a print-stack-trace? |
| 08:01 | gfredericks | I bet you could monkey-patch it :P |
| 08:02 | llasram | Or locally install a snapshot build, or use Leiningen checkouts |
| 08:02 | CookedGryphon | I might actually do that, I'm already monkey patching the executor to tweak the threadpool on android |
| 08:02 | CookedGryphon | but hoped I wouldn't have to for my local unit tests |
| 08:02 | gfredericks | does anybody have a core.async utils lib yet? |
| 08:04 | gfredericks | cause if not I might have to make core.a-sink |
| 08:04 | llasram | ha! |
| 08:05 | gfredericks | it'll have a function for finding out how many messages are in a buffer |
| 08:06 | gfredericks | and for creating a lazy seq from a channel |
| 08:11 | gfredericks | stuart says: "The channel-to-sequence conversion seems like a questionable idea, making seqs that block." |
| 08:12 | gfredericks | any kind of IO-based seq is a seq that can block though, no? |
| 08:12 | llasram | I would say so |
| 08:13 | gfredericks | I wonder if he considers that questionable too |
| 08:15 | gfredericks | seque should be easy to write with core.async eh? |
| 08:16 | gfredericks | probably just as easy with one of those j.u.c queues though |
| 08:16 | gfredericks | although core.async would let you use the go macro without taking up a thread |
| 08:38 | mercwithamouth | ahh nice... ac-repl is now working |
| 09:07 | crispin | hey peeps |
| 09:07 | agarman | crispin: hello |
| 09:07 | crispin | what's some other ways of expressing (and (:key1 opts) (:key2 opts) (:key3 opts)) |
| 09:08 | crispin | that is, whether a handful of keys are in a hashmap? |
| 09:09 | agarman | (if-let [{:keys [key1 key2 key3} opts] ...) |
| 09:09 | agarman | nvm |
| 09:10 | agarman | not equivalent |
| 09:10 | crispin | reading up on if-let now. heh |
| 09:10 | crispin | so many functions |
| 09:14 | agarman | (every? #(% opts) keys) |
| 09:14 | mpenet | ,((every-pred :a :b) {:a 1 :b 2}) |
| 09:14 | clojurebot | true |
| 09:14 | mpenet | ,((every-pred :a :b) {:a 1 :c 2}) |
| 09:14 | clojurebot | false |
| 09:14 | kaw_ | How about (every? opts [:key1 :key2 :key3])? |
| 09:14 | mpenet | many ways to do this |
| 09:14 | mpenet | but many fail if entry val is nil :) |
| 09:15 | mpenet | or falsey |
| 09:15 | gfredericks | anything wrong with this impl of seque? https://gist.github.com/fredericksgary/2f6d21890bbe82ed5416 |
| 09:15 | gfredericks | it seems at least better than clojure.core/seque since it doesn't drop exceptions |
| 09:15 | agarman | I prefer (every? opts keys) as you're able to use key values that aren't keywords |
| 09:16 | crispin | i got (every? opts #{:k1 :k2 :k3}) |
| 09:17 | agarman | don't need set |
| 09:17 | agarman | ,(every? {:k1 1 :k2 2} [:k1 :k2 :k3]) |
| 09:17 | clojurebot | false |
| 09:17 | agarman | ,(every? {:k1 1 :k2 2 :k3 3} [:k1 :k2 :k3]) |
| 09:17 | clojurebot | true |
| 09:21 | gfredericks | TimMc: so in my team's chat room we have this chatbot that will do image searches |
| 09:21 | gfredericks | somebody just searched for "Gary Fredericks clojure" and up came your photo with the shoulder rodents |
| 09:22 | gfredericks | clojurebot: shoulder rodents |would be| an acceptable name for a rock band |
| 09:22 | clojurebot | Ik begrijp |
| 09:27 | CookedGryphon | Could someone help me write a version of alts which has an even stronger priority |
| 09:28 | CookedGryphon | i.e. I want to always take from the first channel as long as there's something there |
| 09:28 | CookedGryphon | and only when there's nothing to take look at the next channel |
| 09:28 | gfredericks | what does "when there's nothing" mean? |
| 09:28 | CookedGryphon | when there's no immediately available value |
| 09:28 | gfredericks | that sounds like what the :priority option already does |
| 09:29 | CookedGryphon | hmm, from my experience it seems to check them in order, but it still cycles through them |
| 09:29 | CookedGryphon | so if i have (alts! [a b] :priority true |
| 09:29 | CookedGryphon | it will check a first, but after it's taken something from a, it won't keep taking from a, it moves on to take something from b |
| 09:29 | gfredericks | hm. |
| 09:29 | gfredericks | I'll go try that. |
| 09:29 | CookedGryphon | I might be wrong and actually I've done something else wrong |
| 09:31 | gfredericks | that's my suspicion |
| 09:31 | gfredericks | given that alts! only takes one thing I'm not sure what you're even trying to describe |
| 09:31 | CookedGryphon | fair point |
| 09:31 | CookedGryphon | now I think about it, it was an utterly ridiculous question... |
| 09:31 | tbaldridge | alts! takes options as well gfredericks |
| 09:32 | tbaldridge | (alts! ports & {:as opts}) |
| 09:32 | CookedGryphon | what he means is, it's only taking one thing from one channel per alts! call |
| 09:32 | CookedGryphon | so my question is nonsensical |
| 09:32 | tbaldridge | ah right |
| 09:32 | gfredericks | haha "takes one thing" |
| 09:33 | CookedGryphon | I think the issue is my underlying structure needs a rethink |
| 09:34 | gfredericks | I tried to test this out and my code is hanging :( |
| 09:34 | gfredericks | oh I think it gave me a vector of way too many nils |
| 09:34 | gfredericks | because alts is happy to "take" from a closed channel |
| 09:36 | CookedGryphon | I'm making a system where events go in the top and there's a mult which broadcasts to various subscribers. These subscribers might themselves generate more events as a result of whatever they're listening for |
| 09:37 | CookedGryphon | I want these internally generated events to get processed first before working on any more externally generated events, so I have an external-input channel and a feedback channel, which I am trying to merge with alts! priority true and then doing mult on the result |
| 09:38 | CookedGryphon | and it seems to work in practice |
| 09:38 | CookedGryphon | but my tests are creating these, then doing onto-chan which closes immediately after the events are copied onto the input channel |
| 09:39 | CookedGryphon | and what's happening is that it's causing everything to close before all the internal events have been generated |
| 09:39 | tbaldridge | there's an option to onto-chan that makes it not close |
| 09:39 | CookedGryphon | yep, but then how do I know when it's done? |
| 09:39 | CookedGryphon | without just sticking a timeout on my tests |
| 09:40 | CookedGryphon | plus, I want to test that when the channel *is* closed, everything falls out of its go-loops and whatnot and is nicely cleaned up |
| 09:40 | CookedGryphon | and not sat there spinning or anything |
| 09:40 | CookedGryphon | (my tests also listen for the results of all the go blocks that get started to make sure everything has given up control by the end) |
| 09:41 | tbaldridge | it's hard to say without seeing the code |
| 09:42 | gfredericks | somebody plz write core.async.erlang |
| 09:43 | gfredericks | you could rewrite the go macro to support killing "processes" |
| 09:44 | tbaldridge | I've thought about it, but it gets pretty hard once you consider that a "go" may or may not be currently running or parked. It's easy to cancel a park, hard to kill a thread |
| 09:44 | gfredericks | yeah I was assuming you would only kill while parked |
| 09:45 | gfredericks | are rarely-parked gothreads a common pattern? |
| 09:45 | CookedGryphon | my issue is that I don't want to kill outright, I want to stop putting new input in the top, allow it to finish processing and then let me know when its finished so I can gather the results for my test |
| 09:47 | CookedGryphon | I sort of want to say "when all these go loops are parked, hand me control" |
| 09:47 | TimMc | gfredericks: This is acceptable to me. |
| 09:48 | CookedGryphon | is there any way of working out whether a go block is parked? |
| 09:50 | gfredericks | clojurebot: TimMc is the Gary Fredericks of Clojure |
| 09:50 | clojurebot | Roger. |
| 09:53 | clgv | TimMc? |
| 09:53 | clojurebot | TimMc is the Gary Fredericks of Clojure |
| 09:53 | clgv | :D |
| 09:54 | gfredericks | does seque actually suppress errors? I thought so but now I can't reproduce |
| 09:54 | gfredericks | ,(->> (iterate dec 10) (take 20) (map #(/ 6 %)) (seque 5)) |
| 09:54 | clojurebot | Execution Timed Out |
| 09:54 | gfredericks | &(->> (iterate dec 10) (take 20) (map #(/ 6 %)) (seque 5)) |
| 09:54 | lazybot | ⇒ (3/5 2/3 3/4 6/7 1 6/5 3/2 2 3) |
| 09:55 | gfredericks | &(->> (iterate dec 10) (take 20) (map #(/ 6 %)) (seque 5) (last)) |
| 09:55 | lazybot | ⇒ 3 |
| 09:55 | gfredericks | ,(->> (iterate dec 10) (take 20) (map #(/ 6 %)) (seque 5) (last)) |
| 09:55 | clojurebot | Execution Timed Out |
| 09:55 | gfredericks | in my repl that gives an arithmetic exception |
| 09:55 | gfredericks | so...three different behaviors. |
| 09:56 | gfredericks | &(->> (iterate dec 2) (take 5) (map #(/ 6 %)) (seque 5)) |
| 09:56 | lazybot | ⇒ (3) |
| 09:57 | gfredericks | ??? |
| 09:57 | lazybot | gfredericks: Oh, absolutely. |
| 09:59 | TimMc | clojurebot: gfredericks? |
| 09:59 | clojurebot | gfredericks is a menace to bots everywhere |
| 09:59 | ticking | I think the edn spec is missing fractions, any thoughts? |
| 10:01 | gfredericks | ticking: I hadn't noticed that, that's interesting |
| 10:02 | gfredericks | ticking: easy to do with data readers though |
| 10:20 | ticking | gfredericks: yes, but the clojure.edn parser does handle fractions |
| 10:20 | ticking | ,(clojure.edn/read-string "1/2") |
| 10:20 | clojurebot | #<ClassNotFoundException java.lang.ClassNotFoundException: clojure.edn> |
| 10:20 | ticking | hrmph |
| 10:20 | clgv | ,(require 'clojure.edn) |
| 10:20 | clojurebot | nil |
| 10:20 | clgv | try again ^^ |
| 10:20 | ticking | ,(clojure.edn/read-string "1/2") |
| 10:20 | clojurebot | 1/2 |
| 10:21 | hyPiRion | whut |
| 10:21 | ticking | clgv: ah thanks I didn't know that the clojurebot had state ^^ |
| 10:21 | clgv | ticking: yeah, clojurebot even supports "def" now. I think the variables are cleared after some time |
| 10:21 | ticking | ,(pr-str 2/4) |
| 10:21 | clojurebot | "1/2" |
| 10:21 | ticking | clgv: nice ^^ |
| 10:22 | ticking | so yeah either clojure.edn implements to much or the formal syntax is missing something |
| 10:24 | gfredericks | ticking: I mean doing e.g. #ratio [3 4] |
| 10:24 | ticking | gfredericks: yeah but that's not how the edn toolchain currently implements it |
| 10:24 | ticking | currently it simply understands ratios (which is the correct behaviour imho) but this is not conform with the spec |
| 10:34 | hyPiRion | ticking: yeah, I would file an issue over at the EDN spec, I guess |
| 10:34 | ticking | currently on it ^x |
| 10:34 | hyPiRion | nice |
| 10:38 | master_op | hello, i have a problem at merge-with http://pastebin.com/6DNBSGX3 |
| 10:40 | llasram | master_op: `merge-with` doesn't have any special handling for nested maps |
| 10:40 | master_op | ok |
| 10:41 | master_op | how can perform this ? any idea ? |
| 10:41 | llasram | You want something like (merge-with (partial merge-with +) ...), or define your own recursive version |
| 10:41 | master_op | ok |
| 11:14 | stuartsierra | master_op, llasram: some old code you can copy here https://github.com/clojure/clojure-contrib/blob/d04a63371ea8d5313ba427259a58e51270d8f7da/modules/map-utils/src/main/clojure/clojure/contrib/map_utils.clj#L41 |
| 11:49 | gfredericks | ,(clojure.edn/read-string "3/4") |
| 11:49 | clojurebot | #<ClassNotFoundException java.lang.ClassNotFoundException: clojure.edn> |
| 11:49 | gfredericks | ,(require 'clojure.edn) |
| 11:49 | clojurebot | nil |
| 11:49 | gfredericks | ,(clojure.edn/read-string "3/4") |
| 11:49 | clojurebot | 3/4 |
| 11:49 | gfredericks | ,(clojure.edn/read-string "3N") |
| 11:49 | clojurebot | 3N |
| 11:49 | gfredericks | ,(clojure.edn/read-string "3M") |
| 11:49 | clojurebot | 3M |
| 11:49 | gfredericks | ,(clojure.edn/read-string "3r222") |
| 11:49 | clojurebot | 26 |
| 12:04 | KeithPM | Good day. I am trying to implement fibonacci using a dictionary. I tried memoize but could not figure out a function to memoize - I am seeking to implement without recursion. I created a ref to a map, updated it on each iteration and looked up values. It appears that all the updates that are performed within the for comprehension are lost when I leave the for. https://gist.github.com/kpmaynard/f8b539326bf2e903f402 |
| 12:05 | TEttinger | KeithPM, for is lazy IIRC |
| 12:06 | gfredericks | KeithPM: you want let instead of def |
| 12:06 | gfredericks | KeithPM: and you can probably replace for with doseq and have it almost work |
| 12:06 | gfredericks | at which point you can remove your do |
| 12:06 | CookedGryphon | KeithPM: *why* do you want to do this without recursion? |
| 12:06 | KeithPM | gfredericks: OK, I will look up doseq |
| 12:07 | CookedGryphon | and memoize isn't a good fit because you have side effects everywhere, memoize works with pure functions |
| 12:07 | gfredericks | KeithPM: doseq has the exact same syntax as for |
| 12:07 | KeithPM | CookedGryphon: I was looking at a dynamic programming course and that was one of the techniques of handling certain classes of 'intractable' problems |
| 12:07 | gfredericks | memoize can only work if the recursion is memoized as well |
| 12:07 | KeithPM | gfredericks: Thanks |
| 12:08 | KeithPM | TEttinger: IIRC? |
| 12:08 | CookedGryphon | KeithPM: when you say without recursion, do you simply mean without blowing the stack by calling back into your function repeatedly? Because there's nicer ways of doing that |
| 12:08 | gfredericks | https://github.com/Prismatic/plumbing/blob/master/src/plumbing/core.clj#L305-320 |
| 12:09 | gfredericks | $google iirc |
| 12:09 | lazybot | [The IIRC | INTEGRATED REPORTING] http://www.theiirc.org/ |
| 12:09 | gfredericks | haha |
| 12:09 | CookedGryphon | :P |
| 12:09 | KeithPM | CookedGryphon: yes, I know some really neat approaches. I was trying the memo approach for savng subproblems that have already been solved |
| 12:10 | TEttinger | if I recall correctly |
| 12:11 | KeithPM | TEttinger: OK - cool :) I'll memoize that one LOL |
| 12:11 | clgv | KeithPM: for the dp approach you'd just use a loop-recur with a loop variable to fill the dp-vector |
| 12:12 | KeithPM | clgv: But in the case of exponential problems like Fib, you still perform fib(n) multiple times right? |
| 12:13 | gfredericks | ,(defn fib [n] (get (reduce (fn [m n] (assoc m n (+ (m (dec n)) (m (- n 2))))) {0 1 1 1} (range 2 (inc n))) n)) |
| 12:13 | clojurebot | #'sandbox/fib |
| 12:13 | gfredericks | ,(fib 20) |
| 12:13 | clojurebot | 10946 |
| 12:13 | clgv | KeithPM: I don't undestand that question |
| 12:13 | gfredericks | ,(map fib (range 20)) |
| 12:13 | clojurebot | (1 1 2 3 5 ...) |
| 12:13 | gfredericks | ,(defn fib [n] (get (reduce (fn [m n] (assoc m n (+ (m (dec n)) (m (- n 2))))) {0 1N 1 1N} (range 2 (inc n))) n)) |
| 12:13 | clojurebot | #'sandbox/fib |
| 12:13 | gfredericks | ,(fib 100) |
| 12:13 | clojurebot | 573147844013817084101N |
| 12:14 | gfredericks | ^ dynamic programming, no mutation necessary |
| 12:14 | clgv | gfredericks: I'd use a clojure vector though ;) |
| 12:14 | gfredericks | ,(defn fib [n] (get (reduce (fn [m n] (assoc m n (+ (m (dec n)) (m (- n 2))))) [1N 1N] (range 2 (inc n))) n)) |
| 12:14 | clojurebot | #'sandbox/fib |
| 12:14 | gfredericks | ,(fib 100) |
| 12:14 | clojurebot | 573147844013817084101N |
| 12:15 | gfredericks | (inc clgv) |
| 12:15 | lazybot | ⇒ 19 |
| 12:15 | clgv | :D |
| 12:15 | gfredericks | ,(fib 1000) |
| 12:15 | clojurebot | 70330367711422815821835254877183549770181269836358732742604905087154537118196933579742249494562611733487750449241765991088186363265450223647106012053374121273867339111198139373125598767690091902245245323403501N |
| 12:15 | gfredericks | ^ that guy is lonely because other fibonacci numbers are so far away |
| 12:15 | KeithPM | gfredericks: I will take a look at that |
| 12:16 | gfredericks | KeithPM: it's really common for algorithmic stuff like this to be solvable without any state/side-effects etc |
| 12:16 | gfredericks | the lazy seq approach is even more common than building up a vector though |
| 12:16 | adsisco | i have a function that f [index i, index j] that generates a float value, how do i use it to populate a matrix in clojure? |
| 12:17 | KeithPM | clgv: What I was referring to is that in the recursion tree you find the same problem occurring on two sides. The approach we're looking at is saving a problem the first time you meet it and check each new subproblem to determine whether it has been solved already |
| 12:17 | adsisco | [[(f 0 0) (f 1 1)] [(f 1 0) (f 1 1)]] |
| 12:17 | adsisco | i hope i'm making sense... |
| 12:17 | jcromartie | yeah |
| 12:17 | jcromartie | adsisco: you want for |
| 12:17 | KeithPM | gfredericks: Thanks. The power of reduce and map :) |
| 12:17 | adsisco | i could do loop in an imperative language |
| 12:17 | clgv | KeithPM: yeah that's memoization if you mean top-down, dynamic programming is bottom up |
| 12:17 | adsisco | is that the clojure way? |
| 12:18 | adsisco | jcromartie: a for loop? |
| 12:18 | jcromartie | ,(for [i (range 1) j (range 1)] [i j]) |
| 12:18 | clojurebot | ([0 0]) |
| 12:18 | jcromartie | oops |
| 12:18 | KeithPM | Yes I was doing bottom up |
| 12:18 | jcromartie | ,(for [i (range 2) j (range 2)] [i j]) |
| 12:18 | clojurebot | ([0 0] [0 1] [1 0] [1 1]) |
| 12:18 | KeithPM | clgv: yes I was doing the bottom up approach |
| 12:18 | jcromartie | clojurebot: for? |
| 12:18 | clojurebot | for is complected |
| 12:18 | jcromartie | hm |
| 12:18 | jcromartie | adsisco: anyway, for in Clojure is not a for loop, it's a seq comprehension |
| 12:18 | clgv | clojurebot: for |is| awesome |
| 12:18 | clojurebot | Roger. |
| 12:20 | adsisco | jcromartie ok, so i just map the function to the for to get my matrix right? |
| 12:20 | jcromartie | something like that |
| 12:21 | jcromartie | hm |
| 12:22 | jcromartie | let's say your function is str, so |
| 12:22 | jcromartie | ,(for [i (range 2) j (range 2)] (str i j)) |
| 12:22 | clojurebot | ("00" "01" "10" "11") |
| 12:22 | jcromartie | that's probably not what you want |
| 12:23 | jcromartie | ,(vec (for [i (range 2)] (vec (for [j (range 2)] (str i j))))) |
| 12:23 | clojurebot | [["00" "01"] ["10" "11"]] |
| 12:23 | jcromartie | that's better |
| 12:23 | jcromartie | adsisco: right? |
| 12:23 | jcromartie | (is forv a thing yet?) |
| 12:23 | jcromartie | ,forv |
| 12:23 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: forv in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 12:24 | jcromartie | it should be |
| 12:24 | sdegutis | Okay, I finally settled on having the production code be default, and with-redef'ing them out with test functions during tests. |
| 12:25 | sdegutis | Or the inverse, defaulting to the test version and resetting them in web-init.clj |
| 12:25 | jcromartie | (defmacro forv [bindings & body] `(vec (for ~bindings ~@body))) |
| 12:26 | jcromartie | there should be a macro that defmacros a macro wrapped in something |
| 12:27 | jcromartie | compmacro |
| 12:27 | gfredericks | so what's the use case for forv? |
| 12:29 | clgv | gfredericks: eager aggregation over nested maps |
| 12:29 | clgv | measurements etc. |
| 12:29 | adsisco | jcromartie: yup, thats really helpful, thanks alot! |
| 12:30 | clgv | but I'd implement it similarly to mapv with one collection |
| 12:32 | gfredericks | eagerness is only useful when your computation is tied to a stateful resource; and vectors are about indexed update/lookup |
| 12:32 | gfredericks | and indexed access seems hard to reconcile with list comprehensions |
| 12:32 | gfredericks | so my guess is this isn't actually useful very often |
| 12:33 | jcromartie | well in the case above, it was for creating a matrix, which is a great case for indexed lookup |
| 12:33 | gfredericks | for matrices I'd think something more specialized than for would be more useful |
| 12:33 | gfredericks | e.g., you probably don't need filtering with matrices |
| 12:34 | gfredericks | and you might not want the matrix impl to be concretized as vectors or lazy seqs |
| 12:34 | jcromartie | alright fine, no forv :) |
| 12:35 | gfredericks | unless you're doing tensor products you'd probably never need more than one clause in the for anyhow |
| 12:36 | KeithPM | Thanks all for your advice. I changed for to doseq and suddenly my ref was available all over. I will take another look at immutable DP approaches suggested here. Brain surgery in progress :) |
| 12:37 | adsisco | https://www.irccloud.com/pastebin/JQRXFSZ0 |
| 12:38 | adsisco | create a wrapper function? |
| 12:38 | jcromartie | (map (partial get-in-distance-by-index json-data) (for …)) |
| 12:38 | jcromartie | or #(get-in-distance-by-index json-data %) |
| 12:39 | clgv | gfredericks: eagerness is also usefull in the cases where you have to be pretty fast ;) |
| 12:40 | clgv | gfredericks: the above version of "forv" won't help for that though ;) |
| 12:40 | adsisco | jcromartie the partial fix works perfectly!? |
| 12:40 | adsisco | jcromartie: great! |
| 12:40 | gfredericks | clgv: fo sho |
| 12:49 | te | given "12", I want to add a padding digit to the front until the length of the string is = 4. ,(loop [id "12"] (if (< (count id) 4) (recur (str "0" id)) id)) |
| 12:49 | te | how would you do that without a loop? |
| 12:50 | clgv | ,(format "%04d" 12) |
| 12:50 | clojurebot | "0012" |
| 12:50 | TEttinger | yep |
| 12:50 | jcromartie | ^winner |
| 12:50 | storme | ,(format "%08d" 12) |
| 12:50 | clojurebot | "00000012" |
| 12:50 | arrdem | (inc clgv) |
| 12:50 | lazybot | ⇒ 20 |
| 12:51 | TEttinger | (inc clgv) |
| 12:51 | lazybot | ⇒ 21 |
| 12:51 | clgv | damn. a good day for karma ;) |
| 12:51 | arrdem | format is osum :D |
| 12:51 | sdegutis | (inc clgv) |
| 12:51 | lazybot | ⇒ 22 |
| 12:51 | hyPiRion | ,(require '[clojure.pprint :refer [cl-format]]) |
| 12:51 | clojurebot | nil |
| 12:51 | cbp | no format in cljs ;( |
| 12:51 | te | oh no... |
| 12:51 | te | here comes hyPiRion |
| 12:51 | hyPiRion | ,(cl-format true "~4,'0B" 12) |
| 12:51 | clojurebot | 1100 |
| 12:52 | hyPiRion | te: it's not *that* bad this time :p |
| 12:52 | hyPiRion | cbp: is clojure.pprint available in cljs? |
| 12:54 | sc4n | Hi |
| 12:54 | te | hmm, clgv -- that works, but there are some issues. for instance, it will not work on strings, which is the input |
| 12:54 | te | there are also situations where it's unlikely, but /possible/ to have a number bigger than a bigint, so it will blow up |
| 12:55 | te | err than an int |
| 12:55 | te | ,(format "%04d" 1243892704832094832904832) |
| 12:55 | clojurebot | #<IllegalFormatConversionException java.util.IllegalFormatConversionException: d != clojure.lang.BigInt> |
| 12:55 | arrdem | te: there is separate formatting for doing the same padding on strings |
| 12:56 | cbp | hyPiRion: I don't think so |
| 12:57 | hyPiRion | cbp: a sad day for humanity |
| 12:57 | te | arrdem: what is the syntax for that? |
| 12:57 | arrdem | te: http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax |
| 12:58 | hyPiRion | of course, the java formatter cannot do stuff like this though: |
| 12:58 | hyPiRion | ,(cl-format nil "~14,'0,' ,4:B" 451) |
| 12:58 | clojurebot | "0001 1100 0011" |
| 12:58 | arrdem | hyPiRion: that's fine, and why we have cl-format :P |
| 12:59 | hyPiRion | arrdem: shh you're interrupting my monologue |
| 13:00 | arrdem | hyPiRion: it's a dialog as long as you recognize my interrupts :P |
| 13:00 | arrdem | unless it's a platonic dialogue in which case I'll back off to saying "yes" and occasionally heckling |
| 13:01 | arrdem | s/platonic/socratic/ |
| 13:02 | te | arrdem: yeah, im looking, just not sure where there is something similar |
| 13:02 | hyPiRion | hrm, I am wrong yet again |
| 13:02 | hyPiRion | :p |
| 13:02 | arrdem | hyPiRion: it's ok, just write it in swearjure and nobody else will ever know |
| 13:02 | te | ,(format "%1$3s" "22") |
| 13:02 | clojurebot | " 22" |
| 13:02 | te | but where do i specify the character to pad with? |
| 13:03 | TEttinger | $google java.util.formatter |
| 13:03 | lazybot | [Formatter - Oracle Software Downloads] http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html |
| 13:03 | TEttinger | it's a mess |
| 13:04 | hyPiRion | arrdem: on my todo-list |
| 13:04 | te | TEttinger: is that for me? |
| 13:04 | te | im just saying, i dont think it's possible to pad with a specified char using format |
| 13:05 | te | you can pad left with a space, but then need to replace those spaces with your desired char |
| 13:05 | TEttinger | te, yeah, the syntax for format strings is derived from java's syntax for it which comes from C, and so on |
| 13:05 | cbp | te: maybe you want apache.commons stringutils |
| 13:05 | te | cbp: yeah, sounds that way |
| 13:06 | TEttinger | the other way is to just check the length, subtract length from desired padded length, and use that many chars of padding |
| 13:07 | hyPiRion | ,(cl-format nil "~4,,'0@A" "12") |
| 13:07 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: cl-format in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 13:08 | hyPiRion | ,(require '[clojure.pprint :refer [cl-format]]) |
| 13:08 | clojurebot | nil |
| 13:08 | hyPiRion | ,(cl-format nil "~4,,'0@A" "12") |
| 13:08 | clojurebot | #<RuntimeException java.lang.RuntimeException: Parameter minpad has bad type in directive "A": class java.lang.Character\n~4,,'0@A\n ^\n> |
| 13:08 | hyPiRion | ,(cl-format nil "~4,,,'0@A" "12") ; there |
| 13:08 | clojurebot | "0012" |
| 13:09 | TEttinger | ,(let [start "22" pad-char \: desired-length 10] (str (apply str (repeat (- desired-length (count start)) pad-char)) start) |
| 13:09 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 13:09 | TEttinger | ,(let [start "22" pad-char \: desired-length 10] (str (apply str (repeat (- desired-length (count start)) pad-char)) start)) |
| 13:09 | clojurebot | "::::::::22" |
| 13:10 | ampharmex | , (use '[clojure.java.shell :only [sh]]) (sh "free") (sh "top" "-bn1") |
| 13:10 | clojurebot | nil |
| 13:10 | hyPiRion | oh what |
| 13:11 | TEttinger | ,(print (sh "top" "-bn1")) |
| 13:11 | clojurebot | #<SecurityException java.lang.SecurityException: denied> |
| 13:11 | TEttinger | haha |
| 13:11 | hyPiRion | ,(sh "shutdown" "-h" "now") |
| 13:11 | clojurebot | #<SecurityException java.lang.SecurityException: denied> |
| 13:11 | hyPiRion | =( |
| 13:11 | arrdem | sdegutis: no worries we all have bad days |
| 13:12 | sdegutis | Well I must have missed them, you're all so nice :) |
| 13:15 | ampharmex | has anyone broken out the clojure bot jail? |
| 13:15 | arrdem | ampharmex: not for a while, but it's been done before |
| 13:16 | hyPiRion | ampharmex: xeqi did it once, see http://nelsonmorris.net/2012/09/06/breaking-lazybot-out-of-clojail.html |
| 13:16 | hyPiRion | essentially the shell access problem |
| 13:29 | sdegutis | Wow, took technomancy's advice and now my third party service proxy is down from 5 files to 2 small ones. |
| 13:29 | sdegutis | This is pretty great. |
| 13:29 | sdegutis | I should seriously consider other people's ideas more often. |
| 13:32 | sdegutis | You know, I find that the more I try to make our code robust, the less I'm relying on fancy language features, but only basic functions and values. |
| 13:33 | mdrogalis | sdegutis: Pour extra hot water from tea-making onto the sponge in the sink to kill bacteria. |
| 13:33 | mdrogalis | ... Other people's ideas that are good :) |
| 13:34 | technomancy | sdegutis: I think the "less reliance on fancy stuff" is just something that happens naturally as you get older. =) |
| 13:36 | gfredericks | talk to your doctor about using functions and data |
| 13:36 | technomancy | side-effects may include side-effects. |
| 13:36 | Glenjamin | that sponge trick is a neat one |
| 13:36 | hyPiRion | technomancy: I don't think it has anything to do with age, but rather with experience. Perhaps that's what you meant, but I don't want to think I have to be older to be better at something |
| 13:37 | technomancy | hyPiRion: I've noticed a correlation with being cranky and jaded but of course no causation implied. =) |
| 13:37 | hyPiRion | hehe |
| 13:40 | sdegutis | technomancy: LLOL |
| 13:40 | sdegutis | (literal lol) |
| 13:41 | sdegutis | about side effects |
| 13:45 | sorbo_ | what's the best way to write a leiningen alias that executes two tasks (i.e. the equivalent of lein cljsbuild clean && lein cljsbuild once)? |
| 13:45 | technomancy | sorbo_: `lein help do` |
| 13:46 | hyPiRion | sorbo_: :alias {"my-alias" ["do" ["cljsbuild" "clean"] ["cljsbuild" "once"]]} |
| 13:46 | sorbo_ | @technomancy perfect, thanks—I'd seen the "do" syntax in an example, but didn't realize there was a separate lein invocation |
| 13:46 | sorbo_ | technomancy: thanks! |
| 13:46 | technomancy | np |
| 13:46 | sorbo_ | hyPiRion: ditto, thanks! |
| 13:47 | hyPiRion | yw |
| 13:52 | cemerick | tcrawley: True to form :-D |
| 13:55 | TimMc | `lein let t clean do t t` |
| 13:56 | TimMc | Looking forward to lein having a full stack-based language for its argument syntax. |
| 13:57 | technomancy | TimMc: there is a half-finished "lein-ski" plugin in my ~/src |
| 13:58 | hiredman | port line lein's bash script to stack https://github.com/hiredman/stack/blob/master/foo.stack https://github.com/hiredman/stack/blob/master/stack2.sh |
| 13:58 | ystael | brb, writing a leiningen driver program for commodore 64 |
| 13:59 | arrdem | no way you can start a jvm on a c64... |
| 13:59 | arrdem | let alone a Clojure instance |
| 13:59 | amalloy | it'll be a virtual java virtual machine |
| 14:00 | arrdem | network jvm client? :P |
| 14:00 | ystael | arrdem: nah, the driver's just going to be a tiny Forth interpreter that translates the stack based lein command line syntax into a real script and emits it over the serial port |
| 14:00 | sdegutis | We are about to have no multi-methods, no protocols or interfaces, nothing but functions (and a few alter-var-roots for initialization). |
| 14:00 | arrdem | ystael: hehe |
| 14:00 | ystael | writing actual lein command lines in 6502 assembly is an exercise for the reader |
| 14:01 | adsisco | how do i turn [1 2 3 4] into [[1 2][3 4]] ? |
| 14:01 | amalloy | &(partition 2 (range 1 5)) |
| 14:01 | lazybot | ⇒ ((1 2) (3 4)) |
| 14:01 | technomancy | we should rename *read-eval* to *exercise-for-the-reader* |
| 14:01 | ystael | technomancy: ha |
| 14:03 | adsisco | amalloy: thanks! |
| 14:09 | arrdem | ew. Okay. so since the root of a var is volatile the JIT can never inline through it, right? |
| 14:10 | sdegutis | I wish you could do destructuring in conjunction with def. |
| 14:10 | sdegutis | I have some keys of a map that I want to put directly into this namespace. |
| 14:10 | arrdem | sdegutis: defn totally allows for param destructuring.. |
| 14:11 | jcromartie | sdegutis: interesting idea |
| 14:11 | sdegutis | I basically have (def name (:name config)) |
| 14:11 | sdegutis | Using destructuring with let would actually make it harder, since there would be shadowing. |
| 14:11 | gfredericks | sdegutis: https://github.com/fredericksgary/lib-4395 (defs-keys) |
| 14:12 | sdegutis | Oh boy. |
| 14:12 | sdegutis | Yep, macro time. |
| 14:12 | sdegutis | gfredericks: I may copy that. |
| 14:12 | sdegutis | Verbatim. |
| 14:14 | gfredericks | would a def-utils library be useful? |
| 14:14 | sdegutis | I think Clojure will be part of our homeschool curricula. |
| 14:14 | sdegutis | gfredericks: hard to say |
| 14:14 | amalloy | gfredericks: it'd just be a README, saying "dude, you don't need a million special kinds of def" |
| 14:14 | jcromartie | :) |
| 14:15 | gfredericks | deftwice |
| 14:15 | arrdem | lolwut |
| 14:15 | arrdem | better def it again just to be sure... |
| 14:15 | gfredericks | "Like defonce, but also works the second time." |
| 14:15 | amalloy | anyway, clojure.tools.macro already has the one def-util you need, name-with-attributes |
| 14:15 | jcromartie | (inc gfredericks) |
| 14:15 | lazybot | ⇒ 61 |
| 14:16 | gfredericks | I wonder how much of this karma is joke-related |
| 14:16 | amalloy | gfredericks: you could use def-utils to create def<nth> for all n up to some reasonable number |
| 14:16 | gfredericks | amalloy: and use my library forty-two to make english variants |
| 14:17 | amalloy | (def-one-hundred-eighty-eight-times foo 1) |
| 14:18 | gfredericks | no more implementing that one in every other project |
| 14:18 | amalloy | hah |
| 14:19 | gfredericks | ,(defmacro def...? [name & args] (if (zero? (rand-int 2)) `(def ~name ~@args) `(def ~name))) |
| 14:19 | clojurebot | #'sandbox/def...? |
| 14:19 | gfredericks | ,(def...? foo 42) |
| 14:19 | clojurebot | #'sandbox/foo |
| 14:19 | gfredericks | ,foo |
| 14:19 | clojurebot | 42 |
| 14:19 | gfredericks | ,(def...? bar 43) |
| 14:19 | clojurebot | #'sandbox/bar |
| 14:19 | gfredericks | ,bar |
| 14:19 | clojurebot | #<Unbound Unbound: #'sandbox/bar> |
| 14:19 | gfredericks | w00t |
| 14:20 | gfredericks | clojure should have antiprivate vars that can only be used from other namespaces |
| 14:20 | hyPiRion | gfredericks: sadly that one only works compile-time, so an AOT uberjared version would return the same result all the time, right? |
| 14:20 | tcrawley | cemerick: glad I could help |
| 14:21 | amalloy | hyPiRion: easily fixed |
| 14:21 | dbasch | I want a macro called deface that works just like defn, except it introduces random bugs you can’t know until you try |
| 14:21 | sdegutis | Clojure's got so much indirection with these vars. |
| 14:21 | sdegutis | I sometimes wish there were no vars. |
| 14:21 | amalloy | (defmacro def...? [name & args] `(when (zero? (rand-int 2)) (def ~name ~@args))) works, i think |
| 14:22 | gfredericks | ,(defmacro definitely [name val] `(def ~name (try ~val (catch Throwable t# :no-sweat)))) |
| 14:22 | clojurebot | gfredericks: Titim gan éirí ort. |
| 14:22 | gfredericks | clojurebot: whatever dude |
| 14:22 | clojurebot | It's greek to me. |
| 14:23 | llasram | clojurebot: Would it be so difficult to jut mumble *something* about exceptions? |
| 14:23 | clojurebot | Cool story bro. |
| 14:23 | gfredericks | ,(defmacro definitely-not [& args]) |
| 14:23 | clojurebot | #'sandbox/definitely-not |
| 14:23 | llasram | niiiice |
| 14:23 | llasram | (inc gfredericks) |
| 14:23 | lazybot | ⇒ 62 |
| 14:24 | gfredericks | see this library needs to exist |
| 14:24 | gfredericks | we just need a good pun for the name |
| 14:24 | amalloy | gfredericks: so misleading! (definitely-not (even? 2)) will make readers of my code think that math is broken |
| 14:25 | gfredericks | amalloy: what kind of weirdo gullible people do you get to read your code |
| 14:25 | amalloy | compilers are more gullible than any human being |
| 14:25 | gfredericks | ,(def three 4) |
| 14:26 | clojurebot | #'sandbox/three |
| 14:26 | gfredericks | lol he just believed me |
| 14:26 | amalloy | (def largest-prime 85) ;; sure, okay |
| 14:26 | gfredericks | ,(def _ "underscore") |
| 14:26 | clojurebot | #'sandbox/_ |
| 14:26 | llasram | clojurebot is a he? |
| 14:27 | amalloy | gfredericks: were you around when i broke clojurebot by redefining 5 to be 2? |
| 14:28 | amalloy | llasram: it's not super-hard. you use reflection to modify the .value field of (Long/valueOf 5) |
| 14:28 | technomancy | isn't this something we make fun of ruby for making possible? |
| 14:28 | technomancy | I'll have to update my Tome of Mockery |
| 14:31 | llasram | amalloy: Ah. Yeah, ok. IMHO using reflection to stomp on private final (I assume?) fields is basically the same as memcpy()ing |
| 14:31 | llasram | So I'm somewhat less impressed :-) |
| 14:31 | gfredericks | amalloy: no way that's nutso |
| 14:32 | TimMc | :-( |
| 14:32 | gfredericks | Tim does not like it |
| 14:36 | llasram | Well, unless someone re-defined TimMc's smiley face to use ":-(" |
| 14:37 | llasram | At this point we have no real way of knowing |
| 14:39 | hyPiRion | It's hard to know anything when everything is relative and changing. |
| 14:41 | gfredericks | except the undeniable objective fact that it's hard to know anything when everything is relative and changing |
| 14:42 | TimMc | amalloy: How's that? |
| 14:43 | amalloy | how's what? |
| 14:43 | TimMc | I did (.setAccessible (.getDeclaredField Long "value") true) but then this errors: (.setLong (.getDeclaredField Long "value") 5 2) |
| 14:43 | hyPiRion | gfredericks: but then it's not hard to know anything, it's hard to know anything with the exception of that statement |
| 14:43 | amalloy | TimMc: setAccessible mutates the Field object you have. you can't re-get the Field object |
| 14:43 | TimMc | Oh! Point. |
| 14:44 | amalloy | (doto (.getDeclaredField Long "value") (.setAccessible true) (.setLong 5 2)) or something |
| 14:44 | ystael | amalloy: does that break just one five or all the fives? |
| 14:44 | amalloy | all the (boxed) fives |
| 14:44 | llasram | Oh, language |
| 14:44 | amalloy | and since clojure boxes everything, that's all of them |
| 14:44 | TimMc | ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject 2) subject) |
| 14:44 | clojurebot | 2 |
| 14:45 | TimMc | D-: |
| 14:45 | hyPiRion | amalloy: not all the boxed fives? |
| 14:45 | amalloy | TimMc: ugh, don't do it to clojurebot again |
| 14:45 | llasram | ,(+ 5 5) |
| 14:45 | clojurebot | 4 |
| 14:45 | hyPiRion | ,(Long. "5") |
| 14:45 | clojurebot | 5 |
| 14:45 | TimMc | oops |
| 14:45 | amalloy | hyPiRion: true. all the ones boxed via Long/valueOf |
| 14:45 | TimMc | I should have use a bigger 5. |
| 14:45 | arrdem | ,(+ 2 2) |
| 14:45 | clojurebot | 4 |
| 14:45 | arrdem | ,(+ 5 5) |
| 14:45 | clojurebot | 4 |
| 14:45 | ystael | is there a numerical threshold above which boxed instances are not cached and shared? |
| 14:45 | jcromartie | wow, nice |
| 14:46 | TimMc | ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject 5) subject) ;; fixed? |
| 14:46 | clojurebot | 2 |
| 14:46 | hyPiRion | ystael: 128 or 256 I think |
| 14:46 | llasram | ,(+ 5 5) |
| 14:46 | clojurebot | 4 |
| 14:46 | amalloy | ystael: +/- 128 |
| 14:46 | TimMc | hahaha |
| 14:46 | amalloy | well, -128 to 127 |
| 14:46 | llasram | ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject (Long. "5") subject)) |
| 14:46 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: setLong for class java.lang.reflect.Field> |
| 14:46 | arrdem | http://i0.kym-cdn.com/photos/images/newsfeed/000/613/012/2fa.gif |
| 14:47 | hyPiRion | TimMc: You have seen nothing yet |
| 14:47 | llasram | ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject (Long. "5")) subject) |
| 14:47 | clojurebot | 5 |
| 14:47 | TimMc | It restarts every 12 minutes, right? |
| 14:47 | llasram | ,(+ 5 5) |
| 14:47 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 14:47 | TimMc | And by 12, I mean 12. |
| 14:47 | llasram | Hmm |
| 14:47 | amalloy | llasram: that's the way i tried to fix it the first time |
| 14:47 | amalloy | but you made the same mistake i did |
| 14:47 | amalloy | instead of defining 5 back to 5, you defined 2 to 5 |
| 14:48 | llasram | Oh, right |
| 14:48 | llasram | hah! |
| 14:48 | hyPiRion | hahah |
| 14:48 | amalloy | so now like every array access breaks |
| 14:48 | TimMc | I <3 FORTRAN. |
| 14:48 | amalloy | we never did find out if clojurebot's auto-restart actually fixes this problem |
| 14:48 | llasram | *amazing* |
| 14:48 | amalloy | hiredman gave it a manual hard-reset before waiting for that |
| 14:48 | arrdem | amalloy: one way to find out... |
| 14:50 | TimMc | ,(let [f (.getDeclaredField Long "value"), subject 0] (.setAccessible f true) (.setLong f subject 42) subject) ;; if it will even run... |
| 14:50 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 14:50 | TimMc | ,(.getDeclaredField Long "value") |
| 14:50 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 14:51 | TimMc | Amazing. |
| 14:51 | amalloy | TimMc: right, it's too late i think. you can no longer eval anything |
| 14:51 | dans | do most people really work with plain SQL migrations for big projects? nothing that generates SQL from some models defined in some clojure data structure? |
| 14:51 | amalloy | because eval uses the number 2 in an array somewhere |
| 14:51 | amalloy | ,1 |
| 14:51 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 14:51 | TimMc | Got it. |
| 14:51 | arrdem | hahaha |
| 14:51 | hyPiRion | ,'1 |
| 14:51 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 14:51 | arrdem | (inc TimMc) |
| 14:51 | lazybot | ⇒ 58 |
| 14:51 | TimMc | Only 28 points! |
| 14:52 | TimMc | I thought I had more. |
| 14:52 | hyPiRion | TimMc: well, since 2 is 5 and 5 is 2 |
| 14:53 | gfredericks | wait we can prove a contradiction with this right? and then derive anything? |
| 14:53 | gfredericks | let's derive bugfixes |
| 14:53 | arrdem | gfredericks: quick prove P!=NP then we can keep our jobs forever |
| 14:53 | TimMc | amalloy: Do you know any way to get ahold of that interned 5? |
| 14:53 | ystael | TimMc: it's no longer a number ... it's a free man now |
| 14:54 | amalloy | TimMc: what do you mean? |
| 14:54 | gfredericks | arrdem: or P = NP but only for galactic algorithms |
| 14:54 | TimMc | Well, I'm trying to restore my REPL's notion of small numbers. |
| 14:54 | arrdem | gfredericks: this is also an acceptable outcome. |
| 14:55 | amalloy | i don't think you can do it if you've gone to the second level of broken like llasram did |
| 14:55 | amalloy | but if you've only broken it one level, it is reversible |
| 14:55 | TimMc | Just one level of fail. |
| 14:56 | amalloy | iirc this works: (let [five (long (int (+ (int 1) (int 4)))), field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field five (int (+ (int 1) (int 4))))) |
| 14:56 | TimMc | I'm having trouble figuring out what's going on here: https://www.refheap.com/85696 |
| 14:57 | amalloy | fiddling with (Long. "5") doesn't help, because that's not the interned version |
| 14:57 | TimMc | Oh! Right-o. |
| 14:57 | llasram | Wouldn't (Long/valueOf "5") work? Or does the compiler do funny things? |
| 14:58 | amalloy | &(identical? (Long/valueOf "5") 5) |
| 14:58 | lazybot | ⇒ false |
| 14:58 | llasram | Oh, interesting |
| 14:58 | amalloy | &(identical? (Long/valueOf 5) 5) |
| 14:58 | lazybot | ⇒ true |
| 14:58 | llasram | That makes sense of course |
| 14:58 | amalloy | i don't know *why*, but apparently the string version bypasses interning |
| 14:59 | amalloy | llasram: does it? it should parse it as a long, then use the intern cache to get a Long |
| 14:59 | TimMc | valueOf probably just shortcuts, right? |
| 15:00 | amalloy | incidentally, three cheers for repl history: i just searched it for setAccessible to find this fix; i probably wouldn't have remembered it on my own |
| 15:01 | llasram | amalloy: Eh. It's not really clear to me why it should use the cache for the result of string parsing. Not saying it shouldn't -- it just doesn't seem unreasonable for it to not |
| 15:01 | hyPiRion | TimMc: Oh hey, if you find this sort of stuff funny, you should see this one: https://www.refheap.com/85697 |
| 15:01 | hyPiRion | That one segfaults or makes your JVM spin up an infinite loop |
| 15:02 | amalloy | hyPiRion: do you really have to remove its FINAL modifier? once you make it accessible i think you can already write to it |
| 15:02 | amalloy | just like for Long |
| 15:03 | amalloy | maybe you're doing something weird i don't see there |
| 15:04 | hyPiRion | amalloy: it's static, which makes it a bit different IIRC |
| 15:05 | hyPiRion | at least I just checked, and it doesn't work with just .setAccessible |
| 15:05 | TimMc | ,(+(*)(*)(*)(*)(*)) |
| 15:05 | clojurebot | 5 |
| 15:05 | TimMc | It's back! |
| 15:06 | llasram | ,(+ 5 5) |
| 15:06 | clojurebot | 10 |
| 15:06 | llasram | Yay! |
| 15:12 | TimMc | amalloy: I was able to fix it in my REPL by using "subject (+ 2 3)", but when I tried again with "subject 5" nREPL quit with an NPE. :-P |
| 15:12 | ystael | When building a custom coercion matcher in Prismatic/schema, if I'm trying to coerce into a multi-level record structure, it's supposed to recurse into coercing into the sub-schemas automatically, right? |
| 15:12 | amalloy | TimMc: my suggested fix didn't work? |
| 15:13 | TimMc | I didn't try it, since I was able to fix it a different way. |
| 15:14 | TimMc | "Bye for now!" https://www.refheap.com/85699 |
| 15:15 | sdegutis | Related: https://medium.com/message/81e5f33a24e1 |
| 15:15 | amalloy | TimMc: yeah, that's setting 2 to 5 again |
| 15:16 | amalloy | which really is a lot more disruptive than setting 5 to 2 |
| 15:17 | KeithPM | gfredericks: I just finished digesting the DP code you shared this morning. Surgery over now :) Thanks |
| 15:18 | TravisD | I'm curious about the DP code now. |
| 15:18 | KeithPM | LOL… (defn fib [n] (get (reduce (fn [memo n] (assoc memo n (+ (memo (dec n)) (memo (- n 2))))) {0 1N 1 1N} (range 2 (inc n))) n)) |
| 15:19 | KeithPM | I changed his m to memo… the 'm' was confusing me :) |
| 15:19 | KeithPM | I was seeking a way to use a map to store computed values |
| 15:19 | amalloy | KeithPM: and having n and m doesn't confuse you? |
| 15:20 | TravisD | Ah, so it stores the solutions in a dictionary and then if you ever need to recompute it, you can just look it up in the dictionary |
| 15:20 | TravisD | ? |
| 15:20 | TimMc | amalloy: Ah, OK. Makes sense. |
| 15:20 | TimMc | sdegutis: Good quotes in there. |
| 15:20 | KeithPM | No… Actually I think of m and n as integer types… I was struggling OK? :) |
| 15:21 | KeithPM | TravisD: Yes that is the idea. |
| 15:21 | TravisD | cool :) |
| 15:27 | sdegutis | I'm reminded of that article that says the Clojure software ecosystem has no security baked in. |
| 15:28 | dbasch | sdegutis: in what context? |
| 15:29 | dbasch | security is not really something you can have “baked in" |
| 15:30 | jcromartie | sdegutis: what does that even mean? |
| 15:31 | benmoss | https://hackworth.be/2014/03/26/clojure-web-security-is-worse-than-you-think/ |
| 15:31 | jcromartie | Clojure web security is exactly what I think. |
| 15:31 | benmoss | maybe you should ask the author to update his blog post |
| 15:32 | dbasch | agree with jcromartie |
| 15:32 | jcromartie | it's only "worse than you think" if what you think is "well I just wrote a networked service, I hope it's secure" |
| 15:33 | dbasch | and that’s the same in any language / platform really |
| 15:33 | jcromartie | like the Ruby secureheaders gem example… a library introduced in Jan 2013 |
| 15:34 | dbasch | what would be useful is a reference with best practices for writing relatively secure clojure apps |
| 15:34 | jcromartie | or just hit up OWASP and educate yourself |
| 15:35 | jcromartie | then you'll be prepared to reason about potential security problems of any web app |
| 15:35 | dbasch | what I mean is, here are a few libraries that are relatively battle-tested in clojure, and here’s how to use them |
| 15:36 | dbasch | of course you should reason about the problems of apps first, the question is when you get to the point of |
| 15:36 | sdegutis | No computer is secure. Some are far worse. |
| 15:36 | technomancy | relevant https://medium.com/message/81e5f33a24e1 |
| 15:36 | dbasch | “I need to build a password db, should I roll my own or is there a library that works reasonably well?” |
| 15:37 | nullptr | and remember, if you do an absolutely perfect job of web security in your application, someone can still sniff your server memory if your ssl vendor has a bug... |
| 15:41 | jcromartie | "perfect security" is basically the halting problem |
| 15:42 | jcromartie | if you're talking about depending on some other code to make your app secure at least |
| 15:43 | dbasch | in most contexts security is relative, e.g. nobody wants to be the app that got hacked and had to tell everyone to change their passwords everywhere because they were crappily hashed |
| 15:43 | lemonodor | i used to work with guys who did DRM for movie studios, they only browsed the web via BSD VMs they generated fresh every day. “it would cost someone $50K to buy a zero-day and target us, and we know it’s worth a lot more than that to them.” |
| 15:44 | jcromartie | lol DRM |
| 15:46 | llasram | jcromartie: Did you see this when it was making the rounds? https://plus.google.com/+IanHickson/posts/iPmatxBYuj2 |
| 15:47 | jcromartie | yes |
| 15:47 | dbasch | llasram: that came to mind too |
| 15:47 | llasram | I'd actually wondered for a while what was up with the total non-response on breakage in e-book DRM. That article seems spot on, at least for that instance, and stopped my lols :-( |
| 15:48 | mdrogalis | cemerick: ping |
| 15:48 | storme | ,(for [x (range 0 3) y (range 0 2)] { :x x :y y }) |
| 15:48 | cemerick | mdrogalis: pong |
| 15:48 | clojurebot | ({:x 0, :y 0} {:x 0, :y 1} {:x 1, :y 0} {:x 1, :y 1} {:x 2, :y 0} ...) |
| 15:48 | jcromartie | yeah, nobody cares about DRM |
| 15:49 | mdrogalis | cemerick: Is there a trick for using Austin in applications where browser-connected-repl-js can't come from the server? |
| 15:49 | jcromartie | like I don't believe for one second that anybody would even care to pay for a solution to movie studio DRM |
| 15:49 | jcromartie | they get it every other way you can think of |
| 15:49 | mdrogalis | Reading old IRC logs. Looks like setting up an endpoint just for that is what people are doing. |
| 15:49 | jcromartie | anyway </off-topic> |
| 15:49 | lemonodor | that post is somewhat correct. the incentives are definitely misaligned between, say, studios & player manufacturers. but the studios do care about their DRM getting cracked—though they only care that it holds up for about 30 days pas the street date. |
| 15:51 | lemonodor | jcromartie: there are offshore businesses making lots of money from subscription blu-ray pirating software. |
| 15:51 | jcromartie | interesting |
| 15:51 | storme | My big-o notation isn't the best, and I'm still new to Clojure... what would be the best way to turn ,(for [x (range 0 3) y (range 0 2)] { :x x :y y }) from O(n^2) to O(1)? |
| 15:52 | cemerick | mdrogalis: Nothing in Austin. People have hacked various ways to inject the necessary JS when they want. I think someone was working on a chrome extension to do roughly that. |
| 15:52 | llasram | storme: mu |
| 15:52 | storme | llasram, mu? |
| 15:52 | cbp | mooo |
| 15:53 | mdrogalis | cemerick: Interesting. Okay, thanks. |
| 15:54 | llasram | storme: Un-ask the question :-) Enumerating all those maps is necessarily linear w/ the number of maps you wish to emit |
| 15:55 | bgilbert | Hey guys, quick question.....does anyone know how to use apply with javascript interop in cljs? |
| 15:55 | storme | llasram, Ah, so there isn't anything that can be done about it? |
| 15:55 | bgilbert | I'm looking for something like: (apply (.foo bar) [1 2 3]) |
| 15:56 | bgilbert | would be rewrite to: foo.bar(1,2,3) |
| 15:56 | llasram | storme: Not unless I've misunderstood what you're trying to achieve |
| 15:56 | bgilbert | I guess this question would extend to java interop as well |
| 15:56 | turbofail | well in java interop you basically can't do it |
| 15:57 | jcromartie | I've done it in cljs |
| 15:57 | turbofail | with CLJS you should be able to arrange to call the .apply method |
| 15:57 | llasram | bgilbert: well, there's slightly different solutions depending on whether the .bar method is a Java varargs method |
| 15:57 | llasram | oh, javascript |
| 15:57 | llasram | la la la |
| 15:57 | bgilbert | ah, well I'm primarily looking for the answer in js |
| 15:57 | bgilbert | ya |
| 15:58 | ghadishayban | what turbofail said, make the seq a js array and call js's .apply |
| 15:58 | bgilbert | turbofail: ah duh, thanks :) |
| 16:07 | Rockdtben | Hey all |
| 16:08 | Rockdtben | Is there a way to output the code I wrote in the repl to a text file? |
| 16:12 | llasram | Rockdtben: Not as a built-in general solution, no. If you're using a REPL which saves history, you can find the history file |
| 16:14 | amalloy | storme: i mean, you want to create n^2 maps. assuming that creating a map takes constant (non-zero) time, you can't help having an n^2 solution |
| 16:15 | amalloy | and if it takes more than constant time, then you can only get worse |
| 16:16 | storme | amalloy: I was under the same impression but wanted to be sure given I don't come from a CS background. Thank you! |
| 16:19 | stw | Rockdtben: if you use cider in emacs you can write the history to a file |
| 16:19 | stw | Rockdtben: (setq cider-repl-history-file "path/to/file") |
| 16:23 | Rockdtben | llasram: Thanks |
| 16:25 | Rockdtben | stw: Alright |
| 16:25 | Fare | hi. Is there a python parser in clojure? |
| 16:26 | tuft | Fare: don't think so, but there is jython |
| 16:27 | tuft | Fare: you could probably use their parser |
| 16:27 | Fare | tuft: that's an interesting thought |
| 16:27 | Fare | thanks |
| 16:32 | michaelr525 | hi |
| 16:32 | michaelr525 | should I build checkouts the first time before running 'lein repl' or 'lein run' in the parent project? |
| 16:33 | michaelr525 | lein doesn't currently find the checkouts artifacts |
| 16:33 | technomancy | michaelr525: sounds like you're a bit confused about what checkouts are for |
| 16:34 | technomancy | they don't replace regular dependencies |
| 16:34 | michaelr525 | i've added them under :dependencies in project.clj |
| 16:35 | michaelr525 | linked as instructed under /checkouts |
| 16:35 | michaelr525 | and ran 'lein run' |
| 16:36 | technomancy | sounds like the lib isn't declaring its deps correctly then |
| 16:36 | llasram | Well, michaelr525 -- what specific issue are you seeing? |
| 16:37 | llasram | technomancy's psychic powers are pretty good especially about Leiningen, but you never know :-) |
| 16:37 | michaelr525 | Could not find artifact.. |
| 16:37 | michaelr525 | hmm.. i think the last thing technomancy said maybe |
| 16:37 | technomancy | michaelr525: yeah, that is unrelated to checkouts |
| 16:38 | noncom|2 | i'm trying emacs live, but when i jack-in into the simplest project created by lein, there is no "core" ns seen from the repl, what's wrong? |
| 16:38 | llasram | michaelr525: Has the checkout-dependency project never been deployed anyway, and exists only as a checkout dependency? |
| 16:38 | michaelr525 | llasram: yes |
| 16:39 | llasram | I believe that is unsupported, and you need to at least `lein install` the dependency so that *some* artifact is present to keep the aether bits happy |
| 16:40 | michaelr525 | llasram: ah, that's just what I suspected is happening |
| 16:40 | michaelr525 | let me try that out |
| 16:41 | michaelr525 | yes, that solved the problem.. |
| 16:41 | michaelr525 | thanks :) |
| 16:41 | llasram | np |
| 16:42 | tolstoy | noncom|2: No idea if this is helpful, but if you've got one of the project files loaded in the buffer and have that buffer in focus, then call jack-in, it should work. |
| 16:42 | noncom|2 | tolstoy: yeah, that's what it should be, but.. |
| 16:43 | michaelr525 | llasram: btw, which plugin would you recommend for building checkouts? |
| 16:43 | amalloy | michaelr525: fwiw, the reason you need to do this is that checkout dependencies only "replace" source files. the pom files, dependencies, all that stuff, needs to exist for real |
| 16:43 | tolstoy | noncom|2: Not that I use Emacs Live, so I don't know. |
| 16:43 | llasram | michaelr525: I have no such recommendation :-) |
| 16:43 | michaelr525 | heh |
| 16:43 | michaelr525 | oh btw guys, are you using smartparens or paredit? |
| 16:44 | llasram | <3 paredit |
| 16:44 | amalloy | paredit |
| 16:45 | Fare | if I wanted to write a parser for python syntax, which clojure tools would be best suited? |
| 16:45 | amalloy | i read smartparen's readme a while ago, and i recall it being kinda like a version of paredit that has one or two of the best features disabled by default |
| 16:45 | jcromartie | instaparse |
| 16:45 | Fare | jcromartie, thanks! |
| 16:45 | michaelr525 | oh really? |
| 16:46 | whomp | is there a literal for a sequence, or do i have to use something like (seq [1 2])? |
| 16:46 | whomp | to get (1 2) |
| 16:46 | seancorfield | why not just [1 2]? |
| 16:46 | tolstoy | '(1 2) |
| 16:47 | seancorfield | (i.e., why do you specifically need it to not be a vector? or '(1 2) for a list?) |
| 16:47 | whomp | just wondering |
| 16:47 | amalloy | michaelr525: https://github.com/Fuco1/smartparens/wiki/Paredit-and-smartparens#random-differences reads to me as like...a radioactive disaster. why would you turn all this important stuff off? |
| 16:48 | technomancy | amalloy: yeah I don't get that at all |
| 16:50 | whomp | ah thx i get it now :) |
| 16:51 | michaelr525 | I'm still getting myself fluent on paredit |
| 16:51 | michaelr525 | I wonder if I can detach this ERC buffer to a separate window? |
| 16:52 | nullptr | michaelr525: M-x make-frame |
| 16:53 | michaelr525 | haha it worked! thanks nullptr :) |
| 16:53 | michaelr525 | now I know that it's the same buffer in both frames ;) |
| 16:54 | nullptr | heh, figured :) |
| 16:54 | nullptr | fortunately these are lessons you only need to learn once and they apply to other buffers equally |
| 16:54 | nullptr | (inc emacs) |
| 16:54 | lazybot | ⇒ 3 |
| 17:09 | noncom|2 | so why could cider fail to determine that the current buffer is a part of a lein project? |
| 17:10 | gtrak | how does cider know if a buffer is part of a lein project? |
| 17:10 | gtrak | (I'm pretty sure it just recurses up dir parents until it finds a project.clj) |
| 17:11 | gtrak | when you do cider-jack-in, but I'm not sure if it uses that technique for anything else. |
| 17:11 | noncom|2 | right, that's what lein is supposed to do i think |
| 17:11 | noncom|2 | but from the emacs live doc: "Project discovery is made possible because each buffer has a buffer-local variable named default-directory which stores the directory the file associated with the buffer is located within." |
| 17:11 | noncom|2 | so maybe the buffers "buffer-local" variable is damaged? |
| 17:11 | noncom|2 | how can i check for it? |
| 17:11 | gtrak | what's emacs live got to do with it? |
| 17:12 | noncom|2 | emacs live uses cider |
| 17:12 | gtrak | what relies on this? |
| 17:13 | noncom|2 | well, emacs live fully relies on cider for clojure repling, and that is what the documentation emphasizes |
| 17:13 | gtrak | err, I mean the variable specifically |
| 17:13 | noncom|2 | idk, i am a emacs newb |
| 17:14 | arrdem | Bronsa`: question about locals metadata if you've got a minute |
| 17:14 | Bronsa` | sure |
| 17:14 | noncom|2 | i guess that the variable "buffer-local" is common for emacs buffers to specify filesystem location of buffer contents if the buffer contains an open file |
| 17:15 | arrdem | Bronsa: (->> (clojure.tools.analyzer.jvm.core-test/ast (defn alter-var-root [^clojure.lang.Var v f & args] (.alterRoot v f args))) :init :methods first :body :ret :target :form meta) => nil. wat. |
| 17:15 | noncom|2 | and that cider relies on it to know where from the repl start was issued |
| 17:15 | noncom|2 | and passes the dir to lein and then you know what should happen |
| 17:15 | gtrak | let me say it another way, how do you know it's broken? |
| 17:15 | noncom|2 | but apparently something is broken |
| 17:15 | bbloom | Bronsa: have you started on the js analyzer? or are you just about to? |
| 17:16 | noncom|2 | i am not sure that the variable is broken since idk how to verify this assumption. so it is just an assumption. the main symptome that i suffer from is that the launched repl is fully unaware of the project namespaces |
| 17:16 | noncom|2 | and when i go (ns my-project.core) it creates a new one, empty one |
| 17:16 | Bronsa | arrdem: well, "v" in "(.alterRoot v f args)" has no meta, :form just contains the original symbol |
| 17:17 | gtrak | noncom|2: sounds like just the parent-search thing is what's broken. |
| 17:17 | gtrak | ie lein is starting up the default project. |
| 17:17 | gtrak | which is not a project |
| 17:17 | noncom|2 | yeah, with just the user virtual ns.. so likely.. but this emacs setup is out-of-the-box, how can it be broken? |
| 17:18 | noncom|2 | emacs live is pretty popular |
| 17:18 | arrdem | Bronsa: sure, but it was my understanding (which apparently is wrong) that the same symbol object was used for "v" as an arg and here as a lvalue. So really the type hint exists only on the arg instance? |
| 17:18 | Bronsa | bbloom: I started working on it today, Alex created the repo a few hours ago https://github.com/clojure/tools.analyzer.js |
| 17:18 | bbloom | Bronsa: saw that, that's why i asked |
| 17:18 | bbloom | Bronsa: cool stuff. i know the cljs analyzer pretty well, so let me know if you find yourself head scratching. happy to help :-) |
| 17:18 | Bronsa | bbloom: yeah I'm going to start pushing working code in a day or two |
| 17:19 | Bronsa | bbloom: oh, thanks! |
| 17:19 | gtrak | Bronsa: when can I start relying on it in cider ;-) |
| 17:20 | Bronsa | arrdem: right, internally in tools.analyzer I use an atom to share that info between the :binding node and the :local nodes |
| 17:20 | Bronsa | gtrak: I'll let you know :) |
| 17:20 | noncom|2 | gtrak: so don't you have soe ideas on where to look to fix the problem? |
| 17:21 | gtrak | noncom|2: yea, not sure, I'd try running lein and narrowing down stuff. |
| 17:21 | noncom|2 | you mean lein from the OS? |
| 17:21 | gtrak | doesn't sound like anything that's cider's fault. |
| 17:21 | gtrak | yea |
| 17:21 | noncom|2 | but emacs is an os! |
| 17:21 | noncom|2 | hah :) |
| 17:21 | noncom|2 | joke |
| 17:21 | gtrak | it just needs an editor! |
| 17:21 | noncom|2 | yeah :) |
| 17:22 | Bronsa | arrdem: you'll see that (-> ast :init :methods first :body :ret :target :tag) will be clojure.lang.Var as you'd expect |
| 17:23 | Bronsa | arrdem: using ast1 at least. ast doesn't run any of the passes |
| 17:23 | technomancy | noncom|2: creating a new empty ns when you run (ns myproject.core) is totally normal behaviour |
| 17:23 | noncom|2 | gtrak: you're right, running from the host OS gives the same result |
| 17:23 | gtrak | welp |
| 17:23 | arrdem | Bronsa: something's fishy... that's nil for me. |
| 17:24 | Frozenlock | Is there any plan to add -?> to clojure? |
| 17:24 | noncom|2 | technomancy: but not when it is claimed that the repl session is guaranteed to start within the project...? or am i mistaken...? |
| 17:24 | technomancy | noncom|2: starting a repl session in the project just means you can require project code and dependencies |
| 17:24 | gtrak | Frozenlock: I think that's what some-> does |
| 17:24 | technomancy | it doesn't mean that it will require them for you |
| 17:25 | Frozenlock | gtrak: It is! Thanks! |
| 17:25 | noncom|2 | technomancy: oh, i see..... so i have to (require) them.. |
| 17:26 | Bronsa | arrdem: oh, it's :instance, not :target |
| 17:26 | Bronsa | arrdem: (->> (clojure.tools.analyzer.jvm.core-test/ast1 (defn alter-var-root [^clojure.lang.Var v f & args] (.alterRoot v f args))) :init :methods first :body :ret :instance :tag) |
| 17:27 | Frozenlock | ,(:added (meta #'some->)) |
| 17:27 | clojurebot | "1.5" |
| 17:27 | noncom|2 | just got too used to counterclockwise i guess.. strange... why does then ccw preloads all namespaces so they are already registered within the runtime.. ? |
| 17:27 | Frozenlock | Dang, how did I miss that. |
| 17:27 | Bronsa | arrdem: don't use the bare tools.analyzer `analyze`, always use tools.analyzer.jvm's `analyze` since you'll need all the passes. |
| 17:27 | arrdem | Bronsa: yeah that one bit me yesterday. |
| 17:27 | mmitchell | is there a fn to create a record from a map, but without knowing the record type until runtime? |
| 17:28 | michaelr525 | tools.analyzer, how do you use it? |
| 17:28 | gtrak | mmitchell: what? |
| 17:28 | gtrak | you can dynamically pass constructors as functions.. |
| 17:28 | gtrak | there's a ->MyRecord function generated. |
| 17:28 | mmitchell | ha, did that not make sense? :) |
| 17:28 | arrdem | woah where'd ast1 come from.. |
| 17:28 | Bronsa | arrdem: also in this case :target becomes :instance a pass in taj transforms the host-agnostic :host-call node in the jvm specific :instance-call |
| 17:29 | Bronsa | arrdem: https://github.com/clojure/tools.analyzer.jvm/blob/master/src/test/clojure/clojure/tools/analyzer/jvm/core_test.clj#L18 |
| 17:29 | mmitchell | gtrak: ahh ok right |
| 17:29 | gtrak | and map->MyRecord as well, that's probably more appropriate here. |
| 17:29 | arrdem | Bronsa: herp a derp. thanks. |
| 17:30 | Bronsa | arrdem: np. I know at first some differences between calling ta/analyze vs taj/analyze might be confusing, but they actually make sense :) |
| 17:30 | arrdem | Bronsa: sure. suggestions for pattern matching AST subtrees? I'm currently playing with var taint detection through blacklisting a few symbols and Var.set/Var.alter |
| 17:32 | Bronsa | arrdem: well, there's the datomic datalog interface that's pretty neat.. https://github.com/clojure/tools.analyzer/blob/master/src/main/clojure/clojure/tools/analyzer/ast/query.clj |
| 17:32 | arrdem | I gotta write a link rewriter so that just opens my emacs buffer :P |
| 17:33 | Bronsa | arrdem: though unfortunately I don't think you could make datomic a dependency for contrib libs :/ |
| 17:34 | arrdem | Bronsa: I'd agree with that, which is unfortunate because I think my "whole program AST" thing is gonna wind up looking freakishly like a Datomic db with symbol -> ast mappings .-. |
| 17:34 | arrdem | hum. excuse for me to learn datalog.... taken. |
| 17:36 | arrdem | Bronsa: awesome. thanks for the help. |
| 18:07 | ToxicFrog | Say I'm using core.typed. Can I do runtime type checking with it, and if so, can I use that type checking to impose certain constraints on values? |
| 18:08 | ToxicFrog | E.g. I have a type defined that is a map with exactly a certain set of keys; can I add the additional constraint that some of the values fall within a given set, and check that, e.g., structures read from EDN satisfy that constraint? |
| 18:09 | arrdem | ToxicFrog: ambrosebs would appear to be offline, but I think the answer is no. core.typed does static checking, you want schema to do complex dynamic checks. |
| 18:09 | arrdem | $google prismatic schema |
| 18:09 | lazybot | [Prismatic/schema · GitHub] https://github.com/Prismatic/schema |
| 18:10 | arrdem | ToxicFrog: you can use static checks to prove the consistency of your own code wrt those data constraints, but to impose them on read or sourced values you need to do schema equivalent checking. |
| 18:10 | ToxicFrog | Alright, thanks. |
| 18:11 | ToxicFrog | The c.t docs talk about "tags" (runtime types) vs "types" (static types) and it's unclear whether it also supports runtime "tag checking" |
| 18:11 | ToxicFrog | ...huh. I think I've broken core.typed, or possibly lein-typed. |
| 18:12 | ToxicFrog | 'lein typed check' vomits out lots of duplicate 'start collecting <namespace>' messages interspersed with nils and then says 'found errors' without reporting any errors. |
| 18:12 | ToxicFrog | 'lein typed coverage' straight up crashes. |
| 18:14 | numberten | is there a way to filter a collection by 'typeclass'? |
| 18:15 | amalloy | numberten: that probably depends on what typeclass means |
| 18:15 | numberten | so for example: (filter can-be-added collection) |
| 18:15 | numberten | returning a collection of things that can be used with the '+' function |
| 18:16 | amalloy | those typeclasses don't exist |
| 18:16 | amalloy | you can filter number?, which happens to be the set of things that is addable |
| 18:16 | numberten | so (filter can-be-added [1 2 3 :c \a]) giving you [1 2 3] |
| 18:16 | amalloy | but in general, for some function f, there's no way to check "is f callable on x" |
| 18:17 | numberten | i had a feeling, but I wanted to make sure I wasn't missing out on something |
| 18:17 | numberten | thank you, that answers my question |
| 18:31 | seangrove | Does it make sense to store a tree-structure in datomic, with each node being a datomic 'fact'? |
| 18:32 | arrdem | ,(number? \1) |
| 18:32 | clojurebot | false |
| 18:33 | arrdem | ,(char? \λ) |
| 18:33 | clojurebot | true |
| 18:37 | whomp | why is (fn [x] [x x]) valid but #([% %]) not? |
| 18:37 | hiredman | ,(macroexpand '#([% %])) |
| 18:37 | clojurebot | (fn* [p1__73#] ([p1__73# p1__73#])) |
| 18:37 | hiredman | ,(macroexpand '(fn [x] [x x])) |
| 18:37 | clojurebot | (fn* ([x] [x x])) |
| 18:39 | dbasch | seangrove: what is the tree for? |
| 18:39 | whomp | hiredman, now my head hurts |
| 18:40 | amalloy | hiredman: you don't need to call macroexpand there |
| 18:40 | amalloy | ,'#([% %]) demonstrates the issue as well |
| 18:40 | clojurebot | (fn* [p1__122#] ([p1__122# p1__122#])) |
| 18:40 | hiredman | oh, right, the reader does the expanding |
| 18:41 | whomp | still don't understand |
| 18:41 | aperiodic | whomp: the second form expands into (fn [x] ([x x])) |
| 18:41 | nullptr | whomp: it's because it's trying to call [x x] as a function |
| 18:41 | aperiodic | whomp: can you see the difference? |
| 18:41 | nullptr | ,([1 1]) |
| 18:41 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentVector> |
| 18:41 | nullptr | ,(vec [1 1]) |
| 18:41 | clojurebot | [1 1] |
| 18:42 | whomp | ah i see, thx :) |
| 18:42 | dbasch | this one should be in a faq, I’ve seen it asked several times recently |
| 18:42 | nullptr | everybody tries that at least once :) |
| 18:43 | dbasch | whomp: #(do [% %]) or #(-> [% %]) will do what you want |
| 18:44 | storme | This might be the wrong place to ask, but does anyone know of any companies in the bay area working with Clojure looking to hire? |
| 18:44 | nullptr | (map inc [hiredman dbasch]) |
| 18:44 | arrdem | nullptr: sadly that isn't supported |
| 18:44 | nullptr | bah, it's lazy anyways ;) |
| 18:44 | dbasch | storme: prismatic for sure |
| 18:45 | dbasch | storme: there’s clojure at Twitter |
| 18:45 | arrdem | yelp... |
| 18:45 | storme | dbasch: Thanks, I'll check out Prismatic :) |
| 18:54 | martinklepsch | beamso, figured out the issue. docker problem |
| 18:54 | beamso | okay |
| 18:59 | Fare | looks like instaparse has trouble specifically with contextful lexing: either implementing it, or using an external lexer that produces non-characters, is painful. |
| 19:01 | arrdem | Fare: yeah instaparse wasn't designed for parsing arbitrary token streams |
| 19:45 | seangrove | dbasch: Sorry, what do you mean? |
| 19:45 | l1x | storme: yes, i think prismatic is big on clojure and they are hiring |
| 19:46 | dbasch | seangrove: what’s your use for a tree in a db |
| 19:47 | storme | l1x, Thanks! |
| 19:47 | seangrove | dbasch: Storying UI components n children, and being able to walk the tree up or down from a given node |
| 19:47 | dbasch | seangrove: how fast do you need that to be? |
| 19:48 | dbasch | i.e. is it for real-time rendering? |
| 19:52 | seangrove | dbasch: No, not especially fast - it's for debugging the state of the application. I'm not sold on doing it yet, I was just wondering about the difficulty (and performance) of doing something tree-like in datomic/querying with datalog |
| 19:52 | whomp | how do i install incanter? i ran the .dmg for my mac but my repl still can't find it for (require 'incanter.core) |
| 19:53 | whomp | is cljr the standard? |
| 19:55 | l1x | whomp: https://github.com/incanter/incanter/wiki#building-incanter |
| 19:55 | l1x | i would go with this |
| 19:56 | dbasch | l1x, whomp just add the incanter dependencies to your project.clj |
| 20:19 | whomp | trying to install cljr by running the jar, and i'm getting this issue: https://gist.github.com/michaeleisel/2bd83c8dc95f188b1262. any ideas? |
| 20:20 | amalloy | don't use cljr. just install lein |
| 20:20 | whomp | lein is a package manager as well? |
| 20:20 | whomp | what i was trying to do was install the incanter package so that i could use it in the repl, because running incanter's dmg doesn't seem to have done that |
| 20:20 | arrdem | whomp: nope. it's a maven wrapper, and maven is a dependency management system. |
| 20:21 | whomp | ok so my main goal here is to install incanter. any ideas on that? |
| 20:21 | amalloy | you want to create a lein project, and add incanter to its dependencies |
| 20:21 | whomp | (require 'incanter.core) gives an error still after installing the .dmg |
| 20:21 | amalloy | don't touch any dmgs, or install anything but lein |
| 20:22 | amalloy | get lein 2.x, not the 1.1.0 that cljr apparently comes with |
| 20:22 | whomp | amalloy, i have to always do that? there's no global package management? that seems kind of crazy, considering that there are lots of repls i might use it in - lighttable's, emacs's, the basic one in bash, etc. |
| 20:22 | blr | lein is clojure's dependancy management tool whomp |
| 20:23 | amalloy | there are other things you can do, but not any you should do. lein encourages repeatable builds, not system-specific installations. and creating a project is not some big difficult task that you should shrink from doing; it takes ten seconds |
| 20:23 | blr | you'll be pleasantly surprised how nice to use it is compared to other similar tools you might have used |
| 20:27 | whomp | i'll look into it, thx :) |
| 20:33 | blr | how I feel every time I go back to my typical work tools http://i.imgur.com/uV2LyXC.png |
| 20:35 | beamso | lucky you, in a way. |
| 20:35 | blr | beamso: right, it could be worse |
| 20:36 | beamso | you could be in visual studio all day every day |
| 20:36 | beamso | i found it tremendously difficult to try and get a rails job |
| 20:36 | blr | beamso: yeah, most jobs in my little city are .Net, which I've done a fair bit of and have no desire to return to |
| 20:36 | dbasch | blr: at least it’s not this: http://allenrecruitmentjobs.ie/wp-content/uploads/2013/07/worst-jobs4.jpg |
| 20:37 | blr | oh yeah, it's all relative. |
| 20:38 | blr | beamso: any chance of covertly rewriting stuff in F#? :) |
| 20:38 | amalloy | dbasch: i don't get it. that renders an "Account Suspended" page for me |
| 20:38 | beamso | amalloy: it was an image of a very bad plumbing situation |
| 20:38 | dbasch | amalloy: it’s an image of a plumber in a flooded bathroom |
| 20:39 | pdk` | i like this site |
| 20:39 | pdk` | one link and im already banned |
| 20:39 | pdk` | that's a new record for me |
| 20:42 | beamso | i've never seen anyone using f#. |
| 20:43 | S11001001 | beamso: like, watched them program in it? Or knew someone who uses it? |
| 20:44 | beamso | uses it. |
| 20:44 | hiredman | I did some euler project problems in f#, and my last laptop had an ugly as sin f# sticker on it I spent a lot of time asking people if they had f# stickers to get |
| 20:44 | S11001001 | beamso: Hi there. |
| 20:44 | beamso | hello! |
| 20:44 | S11001001 | I use https://github.com/joshcough/f0/tree/master/fsharp/f0/f0 in production. |
| 20:45 | S11001001 | beamso: so now you can't say :) |
| 20:46 | blr | pity MS has never made asp.net VS project templates for their alternative languages.. always though the uptake of ironruby/python and possibly f# would be higher if they simply did that |
| 20:46 | blr | err asp.net mvc rather |
| 20:55 | l1x | woo uglier than haskel? |
| 21:16 | whomp | why is this so? (= '() []) |
| 21:17 | joegallo | seqs have equality semantics |
| 21:17 | joegallo | such that that will work |
| 21:17 | joegallo | it's a feature! |
| 21:17 | joegallo | :) |
| 21:17 | joegallo | ,(= [2 3 4] (map inc [1 2 3])) |
| 21:17 | clojurebot | true |
| 21:18 | joegallo | which is nice, it would be sortof lame if it were like, OH HO HO, BUT NO, those aren't equal, because you see, the latter thing returns a lazy seq and not a vector |
| 21:18 | Frozenlock | ,(= '(#".") [#"."]) |
| 21:18 | clojurebot | false |
| 21:18 | joegallo | now that's different, because regexes do not have equality semantics that make comparing regexes ever be = unless they are identical |
| 21:18 | joegallo | but you knew that ;) |
| 21:19 | Frozenlock | they are never equal |
| 21:19 | joegallo | (let [a #"."] (= a a)) |
| 21:19 | joegallo | ,(let [a #"."] (= a a)) |
| 21:19 | clojurebot | true |
| 21:19 | Frozenlock | They are the same object |
| 21:20 | joegallo | did i not just say this? |
| 21:20 | Frozenlock | ah, yes, identical -_- |
| 21:20 | joegallo | no worries, brother |
| 21:21 | mdedetrich | hey guys, im coming to clojure from scala/java land, was wondering if there is a very good book/resource in regards to getting started |
| 21:21 | Frozenlock | It's still making me mad that you can't test for equality with regexes. Exactly for stuff like that. |
| 21:21 | Frozenlock | ,(= [1 2 3 #"."] [1 2 3 #"."]) |
| 21:21 | clojurebot | false |
| 21:21 | amalloy | Frozenlock: you can't test for equality with functions either |
| 21:21 | joegallo | heh, yeah |
| 21:22 | joegallo | mdedetrich: i hear good things about "The Joy of Clojure" |
| 21:22 | amalloy | it's really pretty similar; regex is conceptually a lot like a function |
| 21:22 | mdedetrich | joegallo: thanks, will have a look |
| 21:22 | Frozenlock | amalloy: Ah? never tried. Perhaps I should fill a bug :-p |
| 21:22 | amalloy | Frozenlock: no way. never going to change |
| 21:22 | joegallo | i believe there's a second edition that's like, right about to hit the presses, so make sure you get that, if you can stand the wait |
| 21:23 | amalloy | (= inc #(+ 1 %))? testing functions for equality based on anything but reference identity is impossible |
| 21:23 | arrdem | amalloy: it may not change in the core compiler :P |
| 21:24 | Frozenlock | ,(= #(+ 1 %) #(+ 1 %)) |
| 21:24 | clojurebot | false |
| 21:25 | Frozenlock | That's somehow conterintuitive considering that you can clearly see that they are the same thing. I mean, you could check the symbols and say 'oh, look, it's the same thing'. |
| 21:25 | gfredericks | ,(assoc {} #"foo" 12 #"foo" 13) |
| 21:25 | clojurebot | {#"foo" 13, #"foo" 12} |
| 21:25 | arrdem | Frozenlock: sorta.. the compiler would have to know that + is commutative. |
| 21:25 | arrdem | gfredericks: ololololol |
| 21:25 | amalloy | Frozenlock: but you don't even *have* the symbols |
| 21:26 | amalloy | you just have two function objects. they're not even instances of the same class |
| 21:26 | gfredericks | Frozenlock: if something can't be done properly almost all of the time, why bother to do it at all? |
| 21:26 | Fare | what's the difference between "foo" and #"foo" ? How do I introspect the type of a value? |
| 21:26 | gfredericks | Fare: ##(type #"foo") |
| 21:26 | lazybot | ⇒ java.util.regex.Pattern |
| 21:26 | amalloy | ,(doc type) |
| 21:26 | clojurebot | "([x]); Returns the :type metadata of x, or its Class if none" |
| 21:26 | Fare | gfredericks, thanks |
| 21:27 | Frozenlock | amalloy: But I'm entering something into my repl! This is evaluated somewhere into the functions. Couldn't the equal function look at it before and see that it's the same thing? |
| 21:27 | Frozenlock | I suppose it would need to be a macro... |
| 21:28 | gfredericks | Frozenlock: where do you draw the line before giving up? |
| 21:28 | gfredericks | is inc the same as (fn [n] (+ n 17 -16))? |
| 21:29 | Frozenlock | I'd say the effect are the same, but the input isn't |
| 21:29 | gfredericks | you can put arbitrarily much computational effort into analyzing these things and you still won't cover everything |
| 21:29 | arrdem | Frozenlock: you cannot generally prove that two functions compute the same value. Example, solve the halting problem paired with itself or any other universal problem. If this is possible then you can compute infinite results in finite time, congratulations you broke the universe. |
| 21:29 | Frozenlock | yeah, that's shame :-p |
| 21:29 | gfredericks | you want equality only if the functions look identical in the source code? |
| 21:29 | Frozenlock | gfredericks: That would solve the regex, wouldn't it? ;-) |
| 21:29 | gfredericks | so (fn [x] x) != (fn [y] y)? |
| 21:30 | gfredericks | I think this would confuse the crap out of users |
| 21:30 | arrdem | gfredericks: hey you could prove that statically just by doing var renaming. |
| 21:30 | gfredericks | yep |
| 21:30 | Fare | gfredericks, why did you prefix that with ## ? |
| 21:30 | gfredericks | Fare: that's how lazybot knows to evaluate it |
| 21:31 | Fare | how do I get a list of methods for that class? |
| 21:32 | gfredericks | that is a tricksy question |
| 21:32 | gfredericks | at least if you meant what I think you did |
| 21:32 | gfredericks | if you meant what you said then the answer is http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html |
| 21:32 | Fare | trying to introspect things to discover them |
| 21:33 | Fare | programmatically, if possible |
| 21:33 | gfredericks | but my guess is you want to know what clojure functions you can use it with |
| 21:35 | gfredericks | Fare: (use 'clojure.repl) and then check out apropos and find-doc |
| 21:35 | gfredericks | you're not going to able to search by class though, since that's not how clojure code is organized |
| 21:36 | Fare | I knew about apropos — thanks for find-doc |
| 21:37 | Frozenlock | about clojure.repl, is there a way to use it in every namespace? |
| 21:37 | Frozenlock | (not just in 'user' with lein profile) |
| 21:39 | gfredericks | Frozenlock: depends on how you're starting your repl |
| 21:39 | gfredericks | oh wait |
| 21:39 | gfredericks | we were just discussing this kind of thing a couple days ago |
| 21:40 | arrdem | Frozenlock: in _every_ namespace? no there shouldn't be unless you want to create clojure.core/doc and bind it to clojure.repl/doc or whatever. |
| 21:40 | gfredericks | the only way to get that kind of magic is to monkey-patch things in to clojure.core, but then you get into sticky situations depending on whether any of your code gets loaded first |
| 21:40 | gfredericks | leiningen didn't seem to have much to offer in that department, but a user.clj file should let you do whatever you need to sufficiently early |
| 21:40 | gfredericks | just don't tell anybody else that you did it |
| 21:41 | Fare | so if I have a server application in java, and I want some request to open a clojure repl for interactive debugging, how do I do that? |
| 21:41 | Frozenlock | Interesting |
| 21:41 | gfredericks | Fare: a request? like HTTP? |
| 21:41 | Frozenlock | living dangerously :) |
| 21:41 | arrdem | Fare: you use the nrepl library, drop an nrepl instance on an arbitrary port on an address behind your vpn ideally and pray. |
| 21:41 | Fare | what should my request handler do (after proper validation) to start a server that my emacs can connect to? |
| 21:42 | Fare | yes, it's all properly firewalled, of course |
| 21:42 | Fare | hopefully, my server should only listen on 127.x.x.x addresses |
| 21:42 | gfredericks | yep look at nrepl's start-server function |
| 21:42 | blr | Frozenlock: I have :repl {:repl-options {:init (use 'clojure.repl)}} in my lein user profile, but that will only load clojure.repl in the user namespace |
| 21:43 | Frozenlock | blr: Yeah, I tend to not stay in that namespace for long. |
| 21:43 | blr | agree that it would be nice to have clojure.repl available from any ns though |
| 21:44 | arrdem | eh if it's for debugging just monkey patch what you want into core |
| 21:44 | Frozenlock | getting to use the 'doc' function takes so much time that I just M-. and check the source. |
| 21:45 | gfredericks | Frozenlock: if you reload code in emacs frequently you don't have to worry about the load order as much |
| 21:45 | gfredericks | that's basically my approach |
| 21:45 | Fare | and from the emacs side, how do I initiate connection with localhost 12345 ? |
| 21:46 | arrdem | M-x cider-connect |
| 21:46 | Frozenlock | M-x nrepl <enter> the addresse |
| 21:46 | arrdem | or that |
| 21:46 | Fare | can I have several cider connections in the same emacs? |
| 21:47 | Frozenlock | Yes, but I find it confusing |
| 21:47 | Frozenlock | --> switch to the nearest nrepl buffer and .... Noooooo what have I done?!?! |
| 21:48 | Fare | Frozenlock, fair point. I can start a separate emacs with a different background color |
| 21:48 | Fare | but still... how do I tell cider which host and port to connect to? |
| 21:48 | Frozenlock | That'd be wise, especially if you connect to your production server's repl |
| 21:48 | Frozenlock | M-x nrepl <enter> localhost <enter> port (or something like that with cider) |
| 21:49 | arrdem | Fare: nrepl/cider will ask you for a port |
| 21:50 | Fare | the cider web page suggests M-x cider-connect but that command doesn't look like it exists in my loaded cider |
| 21:50 | gfredericks | M-x cider asks for a port |
| 21:50 | arrdem | anyone know of codebases which use inline, bare load, use or require? |
| 21:51 | Fare | oh, so it's M-x cider not M-x cider-connect --- thanks |
| 21:51 | Fare | maybe the README.md should be updated. |
| 21:51 | gfredericks | arrdem: clojure.core? |
| 21:51 | Jaood | how do you access the 'doc' commando when you cider repl switches from the user ns? |
| 21:51 | gfredericks | Jaood: (use 'clojure.repl) |
| 21:51 | arrdem | gfredericks: well yeah they do use raw load... |
| 21:51 | Fare | how different is the second edition of the Joy of Clojure ? |
| 21:51 | Jaood | gfredericks: thanks |
| 21:53 | blr | Fare: more on clojurescript and logic programming from what I understand |
| 21:53 | arrdem | blr: no core.typed plug? |
| 21:54 | blr | just going by what's here http://www.joyofclojure.com/2nd |
| 21:55 | Fare | blr: thanks! |
| 21:55 | Fare | I just bought the first edition :-/ Now wondering about the second... |
| 21:56 | blr | pity books don't have upgrade pricing :) |
| 21:56 | arrdem | the first was good, I read it from $UNIVERSITY library. I may get the 2nd. |
| 21:56 | blr | you went to php university? |
| 21:56 | arrdem | and burned it down after I graduated. |
| 21:57 | Jaood | JoC is a good second book I guess |
| 21:58 | Fare | thanks a lot for your support. |
| 22:00 | arrdem | ,(macroexpand '(do (ns com.foo) (def bar 3) (ns com.oh-god-why) (def com.foo/bar 5))) |
| 22:00 | clojurebot | (do (ns com.foo) (def bar 3) (ns com.oh-god-why) (def com.foo/bar 5)) |
| 22:01 | arrdem | ,(do (ns com.foo) (def bar 3) (ns com.oh-god-why) (def com.foo/bar 5)) |
| 22:01 | clojurebot | #<CompilerException java.lang.RuntimeException: Can't create defs outside of current ns, compiling:(NO_SOURCE_PATH:0:0)> |
| 22:09 | quizdr | anyone know what the "mies" stands for with some line templates? |
| 22:09 | quizdr | *Lein templates |
| 22:10 | beamso | a minimal clojurescript template, apparently |
| 22:10 | beamso | https://github.com/swannodette/mies |
| 22:10 | beamso | i can't retrospectively add a template to a project, can i |
| 22:11 | quizdr | interesting, how the letters "mies" come from that as an acronym, i don't know |
| 22:12 | fortruce | beamso: no, there is no way to merge a template into a project, but you can look at the template and use it to setup your project.clj |
| 22:13 | beamso | okay |
| 22:29 | zeroem | ,(name (keyword "foo/bar")) |
| 22:29 | clojurebot | "bar" |
| 22:29 | zeroem | is that expected behavior for keywords? |
| 22:29 | gfredericks | yep |
| 22:29 | gfredericks | ,(namespace (keyword "foo/bar")) |
| 22:29 | clojurebot | "foo" |
| 22:30 | zeroem | oh, so keywords are namespaced too |
| 22:30 | zeroem | ok, learned something new |
| 22:30 | zeroem | thanks :) |
| 22:36 | blr | the mies templates are named after the architect Ludwig Mies van der Rohe, because "less is more" |
| 22:47 | blr | whatever you do, don't lein new gaudí |
| 22:49 | andreh | Is there any tutuorial on PrimeFaces with Clojure for someone who already knows Java or Common Lisp? |
| 22:50 | blr | andreh: things like JSF are kind of anathema to clj web developers for the most part |
| 22:51 | andreh | blr: They normally prefer a Clojure equivalent? |
| 22:52 | fortruce | will with-redefs get shadowed by a local let? |
| 22:52 | blr | andreh: right, most clojure web apps are composed of discrete libraries, rather than built on frameworks. It's a nice approach, but it does require you to hunt around and take a while to figure out which tools you like |
| 22:53 | andreh | blr: nice, thanks |
| 22:53 | blr | andreh: Pedestal is the closest thing to a framework, but it doesn't provide much in the way of UI components like JSF https://github.com/pedestal/pedestal |
| 22:54 | blr | Luminus is a good way to get a taste for the first approach http://www.luminusweb.net/ |
| 22:54 | blr | kind of a currated collection of libraries that work well together |
| 22:58 | bodie_ | does anyone know of a good functional database besides datomic? I can't afford the licensing for the version that doesn't suck |
| 22:59 | beamso | functional? |
| 22:59 | bodie_ | as in datomic |
| 22:59 | fortruce | bodie_: pretty sure datomic is the one and only |
| 22:59 | bodie_ | http://www.infoq.com/presentations/datomic-functional-database beamso |
| 23:00 | bodie_ | hrm |
| 23:00 | fortruce | bodie_: i haven't tried it yet, you enjoying it? |
| 23:00 | bodie_ | no, because I can't afford the version that doesn't suck ;) |
| 23:00 | bodie_ | so I haven't checked it out any further |
| 23:00 | beamso | you could simulate the immutability of that but i think it would take a lot of work |
| 23:01 | fortruce | it would basically take recreating datomic ;P |
| 23:01 | bodie_ | well, it's an implementation of datalog, right |
| 23:02 | fortruce | but datalog isn't just for databases |
| 23:02 | beamso | actually, i was thinking of the immutable part, not the functional part. |
| 23:03 | arrdem | I SOMMON THE MIGHTY INTERTUBEZ. Please help me find Clojure/Java/Haskell/Scala benchmarks :P |
| 23:03 | TEttinger | getting an up-to-date one might be challenging, arrdem |
| 23:03 | beamso | http://benchmarksgame.alioth.debian.org/ |
| 23:03 | fortruce | meh, benchmarks |
| 23:03 | TEttinger | reducers sped up clojure quite a bit, no? |
| 23:03 | bodie_ | benchmeh |
| 23:03 | arrdem | beamso: that's where I'm looking right now. |
| 23:04 | bodie_ | maybe I could learn haskell and work from this :P https://github.com/travitch/datalog |
| 23:05 | fortruce | anyone know how to use with-redefs to redefine a java ctor? |
| 23:05 | dissipate | isn't haskell a heavy syntax language? |
| 23:05 | dissipate | after perl i told myself i would never pursue a heavy syntax language again |
| 23:06 | TEttinger | arrdem, no scala here but https://github.com/jafingerhut/clojure-benchmarks |
| 23:06 | TEttinger | it has the other 3 |
| 23:06 | bodie_ | dissipate, pretty sure haskell makes perl look like clojure |
| 23:07 | bodie_ | but everyone who likes it swears it's easy |
| 23:08 | dissipate | bodie_, no haskell for me then. haskell will end up as the new perl. |
| 23:09 | amalloy | "haskell will end up as the new perl". literally the first time that sentence has ever been said in the history of english |
| 23:09 | TEttinger | haha |
| 23:09 | arrdem | glad I'm not the only one chuckling at that |
| 23:09 | TEttinger | $google swearjure |
| 23:09 | lazybot | [polymatheia - Swearjure - hyPiRion] http://hypirion.com/musings/swearjure |
| 23:10 | TEttinger | clojure can be quite perlish |
| 23:10 | dissipate | arrdem, you are chuckling because you don't think it is true? |
| 23:11 | arrdem | dissipate: the absurdit/irony of the statement more |
| 23:11 | bodie_ | amalloy, LOL |
| 23:11 | TEttinger | ,(#(`[{~% ~@%&}] (+)) \: \[ \? \]) |
| 23:11 | clojurebot | {\: \[, \? \]} |
| 23:11 | bodie_ | it's kind of like saying zebras are the new abrams tank |
| 23:12 | bodie_ | or potatoes are the new Mt. Everest |
| 23:12 | arrdem | ^ this |
| 23:12 | bodie_ | just... neurons sparking all over the place right now |
| 23:12 | bodie_ | just left a job that was 120,000+ lines of perl spaghetti code... |
| 23:12 | fortruce | anyone know how to mock a java object? |
| 23:12 | bodie_ | what has been seen cannot be unseen |
| 23:13 | arrdem | (inc bodie_) ;; karma cannot heal this pain but it may help |
| 23:13 | lazybot | ⇒ 1 |
| 23:26 | Kitty- | Hello, I am using Clojure to connect to a database and need to utilize . in my string. I've tried escaping it with \, so for example \. however it does not work. Any suggestions to try? The help would be much appreciated. |
| 23:26 | fortruce | Kitty-: can you show me what you mean? |
| 23:27 | Kitty- | fortruce: sure, let me come up with a pastie link |
| 23:29 | Kitty- | fortruce: so here is what I used before... http://pastie.org/9194703 however since "," is a special character I tried to escape it with ,\ in http://pastie.org/9194705 on line 12 however when I compile, it complains about "\" with a stack trace. |
| 23:30 | justin_smith | Kitty-: clojure complains about unneeded \ in string literals (and has differing rules for string vs regex literals |
| 23:31 | mange | Kitty-: Use \\. That'll put a literal \ in the string for the database to see. |
| 23:31 | ddellacosta | Kitty-: what are you using to run the SQL? Which clojure lib? |
| 23:31 | justin_smith | ,"this\." |
| 23:31 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unsupported escape character: \.> |
| 23:31 | justin_smith | ,"vs. This\\." |
| 23:31 | clojurebot | "vs. This\\." |
| 23:31 | justin_smith | ,(println "vs. This\\.") |
| 23:31 | clojurebot | vs. This\.\n |
| 23:32 | Kitty- | \\, |
| 23:40 | Kitty- | hmm, here is what I get http://pastie.org/9194732 |
| 23:41 | Kitty- | It's not liking "(\"OID\"... should I use \\ with ", so \\" maybe? |
| 23:42 | justin_smith | I think your string escaping is not properly balanced there - are you missing a " after TEMPT_SPINSTER\" ? |
| 23:42 | justin_smith | *TEMP lol freudian slip |
| 23:43 | Kitty- | Lol |
| 23:43 | Kitty- | justin_smith: thanks...let me try adding the " |
| 23:45 | justin_smith | also if you have a repl available, it is much faster to test things like this in a repl |
| 23:47 | Kitty- | justin_smith: it compiled yaay. so when I execute the .jar against the server, i get an error http://pastie.org/9194741 |
| 23:47 | justin_smith | Kitty-: what editor are you using? |
| 23:47 | Kitty- | I'm thinking it must have a ; however I'm not sure how to 'escape' those |
| 23:47 | Kitty- | justin_smith: notepad++ |
| 23:48 | justin_smith | in some editors (mine for example being emacs) there is an "escaped string composer" mode that automatically escapes a region after you are done editing it |
| 23:48 | Frozenlock | really? What's the command? |
| 23:48 | justin_smith | in leiu of that in a simpler editor, maybe try interactively using that str invocation in the repl, and take a look at what it generates |
| 23:48 | beamso | ORA-00933 is more to do with the query or queries that you are executing rather than clojure. |
| 23:49 | justin_smith | Frozenlock: string-edit-at-point |
| 23:49 | justin_smith | Frozenlock: the awesome part is it even works recursively for recursively embedded strings |
| 23:49 | blr | silly emacs question, is there a better indentation strategy than that provided by clojure-mode? The way the body of the anonymous function is indented bugs me: http://i.imgur.com/RmgUpo5.png |
| 23:50 | Frozenlock | justin_smith: I don't appear to have this function... o_O |
| 23:50 | justin_smith | oh, it may be a package I have |
| 23:50 | justin_smith | Frozenlock: string-edit.el |
| 23:50 | Frozenlock | Unless it came later than 24.3.1, I would say so :-p |
| 23:51 | justin_smith | Frozenlock: package require string-edit |
| 23:51 | justin_smith | I forgot it was not a vanilla thing |
| 23:52 | Kitty- | justin_smith: any hints on what could escape a ";" perhaps? fwiw, I don't think a repl would work because the code has about 213 lines and then on top of that, it relies on compiled code originally written in java which I don't think clojure could do in realtime? So for example, it has to run off of a .jar which I don't think the repl 'does' |
| 23:52 | justin_smith | Kitty-: I'm just talking about the generation of that one string |
| 23:52 | Frozenlock | 213 is nothing :-p |
| 23:52 | Frozenlock | Push that repl, cmon, push it! |
| 23:52 | Kitty- | Frozenlock: perhaps, but do you copy and paste 213+ lines in repl? |
| 23:53 | Kitty- | justin_smith: perhaps you have an example so I can understand further? |
| 23:53 | justin_smith | Kitty-: also, if you connect to your app by running an nrepl server from it, you can access data from the running process - you can make an atom and shove strings into it so you can experiment with them |
| 23:53 | Frozenlock | Kitty-: That's not the ideal, but I've pasted entire source code many times. |
| 23:53 | justin_smith | https://github.com/clojure/tools.nrepl it is really easy to host nrepl inside your app |
| 23:54 | justin_smith | make an atom, one of my favorites is a vector of a map, keys are args, vals are results |
| 23:54 | justin_smith | or you can throw timestamps in there if you have multiple things to look at ... |
| 23:54 | quizdr | does anyone know the emacs equivalent to the Light Table "add connection" command that you can use in Om to connect a script to a browser? I'm following the Om tutorial but using Emacs |
| 23:54 | Kitty- | justin_smith: hmm |
| 23:55 | Frozenlock | quizdr: Emacs doesn't have the magic LT connection. You'll have to configure a brepl |
| 23:55 | justin_smith | Kitty-: another option is to break your code down into smaller parts that can be tested for their output |
| 23:55 | justin_smith | this is good design anyway |
| 23:55 | beamso | for the om tutes i just saved then reloaded the browser |
| 23:55 | Kitty- | justin_smith: hmm yea |
| 23:55 | quizdr | but there is something the Om tutorial says to do about adding a script to the index.html, but it is not clear what it actually is, as it is done via this "connection" command |
| 23:55 | justin_smith | then you just (require ... :reload) on the ns as you update, and see what things do in a repl |
| 23:56 | Kitty- | justin_smith: I'm pretty sure it's just not liking ";" however I don't know how to escape that |
| 23:56 | justin_smith | ,(print "\\;") |
| 23:56 | clojurebot | \; |
| 23:57 | beamso | quizdr: the script is so that when you save in lighttable it forces the browser to reload or reevaluate the javascript it's referencing. simply saving the clojurescript file, waiting for the recompile and reloading the html page should let you see the changes you want. |
| 23:57 | Frozenlock | justin_smith: string-edit is amazing |
| 23:57 | Kitty- | woohooo http://pastie.org/9194755 compiles |
| 23:57 | Frozenlock | How could I live without it? |
| 23:57 | clojurebot | Gabh mo leithscéal? |
| 23:57 | justin_smith | Frozenlock: yeah, I know, I wish I had it years ago when I was fucking with shell scripts more often :) |
| 23:58 | quizdr | beamso ah ,thanks |
| 23:58 | Kitty- | thanks for the tips... I'm gonna keep at it |