2014-04-23
| 00:04 | cddr | It's an alternative approach to managing a big IT infrastructure |
| 00:36 | r00k | Does anyone have a link to a plugin that colorizes clojure.test output? |
| 00:37 | r00k | lein-difftest appears unmaintained an unworking. |
| 00:49 | jwm | is eval lazy? |
| 00:50 | amalloy | jwm: that's a pretty poorly-defined question |
| 00:50 | jwm | probably |
| 00:50 | amalloy | try constructing a sample call to eval, decide how it would behave if eval were lazy vs not lazy, and see which answer you actually get |
| 00:51 | jwm | I am trying to do an eval right after (use) |
| 00:51 | jwm | it works when I lein repl but the eval fails when I do lein run |
| 01:04 | expez | jwm: eval isn't lazy. Furthermore, eval isn't called directly very often, so if you're new to Clojure you're probably 'doing it wrong'. |
| 01:05 | jwm | I'm loading some code at runtime based on configuration using 'use' and then calling a init function from there |
| 02:06 | zanes | So, I have a sequence of data transformations during which I want to perform side effects based on the intermediate values. What’s the most idiomatic way to go about that? |
| 02:07 | zanes | Without the side effects this is very neatly expressed using the thread last macro. |
| 02:09 | Si_ | any one here use caribou at all ? |
| 02:13 | jwm | so lein run leaves me in the "user" namespace? |
| 02:14 | noidi | zanes, synthread has ->/aside for that purpose https://github.com/LonoCloud/synthread |
| 02:14 | zanes | Aha. |
| 02:15 | noidi | or you could do (as-> x (side-effect-1 x) (side-effect-2 x) x) |
| 02:15 | noidi | within (-> ...) |
| 02:16 | zanes | noidi: Those are both really helpful, thanks! |
| 02:17 | noidi | and if your side-effecty functions take the topic as the first parameter, you could do (-> ... (doto side-effect-1 side-effect-2) ...) but that doesn't read very well IMO |
| 02:17 | zanes | I’m threading last, fwiw. |
| 02:18 | beamso | so, in my programming, i build up maps of information to process. is that what that library is for, in a way? |
| 02:19 | zanes | So it seems like as-> won’t work for me in here. |
| 02:21 | noidi | ah, I forgot that as-> doesn't just give a name to the topic but it does threading as well |
| 02:22 | noidi | zanes, this should work |
| 02:22 | noidi | ,(-> 2 (as-> x (do (println x) x))) |
| 02:22 | clojurebot | 2\n2 |
| 02:22 | zanes | ,(-> [1 2] (as-> x (do (println x) x))) |
| 02:22 | clojurebot | [1 2]\n[1 2] |
| 02:22 | zanes | ,(->> [1 2] (as-> x (do (println x) x))) |
| 02:22 | clojurebot | #<Exception java.lang.Exception: Unsupported binding form: (do (println x) x)> |
| 02:22 | noidi | ah, right |
| 02:23 | zanes | ,(->> [1 2] #(as-> % (do (println x) x))) |
| 02:23 | clojurebot | #<CompilerException java.lang.Exception: Unsupported binding form: (do (println x) x), compiling:(NO_SOURCE_PATH:0:0)> |
| 02:24 | noidi | ,(-> [1 2 3] (as-> xs (map inc xs) (do (println xs) xs))) |
| 02:24 | clojurebot | (2 3 4)\n(2 3 4) |
| 02:24 | zanes | This seems relevant: http://missingfaktor.blogspot.com/2014/03/dead-simple-threading-with-functions-in.html |
| 02:24 | noidi | that's not as nice as ->> as you have to explicitly name the topic in each step, but it still does threading |
| 02:25 | zanes | Ah, I get it. |
| 02:25 | zanes | So as-> basically lets you choose your own position. |
| 02:25 | zanes | For each form. |
| 02:25 | noidi | yes |
| 02:26 | zanes | Okay. I was mistaken in my understanding of it. So I’d replace my use of ->> with as->. |
| 02:26 | zanes | Probably. |
| 02:37 | numberten | question |
| 02:37 | numberten | i was trying to write the shortest possible identity function |
| 02:38 | numberten | i thought #(%) might work but it doesn't seem to |
| 02:38 | numberten | i'm curious what makes that any different than (fn [x] x) which seems to work |
| 02:44 | dbasch | numberten: this answers your question http://stackoverflow.com/questions/13204993/anonymous-function-shorthand |
| 02:44 | numberten | thanks |
| 02:44 | numberten | i realized that it was the () around it |
| 02:44 | numberten | that was breaking it |
| 02:44 | numberten | i guess I don't fully understand the desugaring that happens |
| 02:46 | dbasch | numberten: #(%) tries to call % as a function, with no arguments |
| 02:47 | numberten | i see |
| 02:58 | noidi | ,'#(%) |
| 02:58 | clojurebot | (fn* [p1__25#] (p1__25#)) |
| 03:00 | numberten | woah |
| 03:00 | zanes | ,(#(%) #(print “Hello”)) |
| 03:00 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: “Hello” in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 03:01 | numberten | ,#(-> %) |
| 03:01 | clojurebot | #<sandbox$eval132$fn__133 sandbox$eval132$fn__133@ad08de> |
| 03:01 | numberten | ,(#(-> %) 5) |
| 03:01 | clojurebot | 5 |
| 03:09 | zanes | noidi: Turns out prismatic.plumbing has as->>. |
| 03:09 | zanes | https://github.com/Prismatic/plumbing/blob/master/src/plumbing/core.clj#L300...L303 |
| 03:10 | jwm | how do I use another namespace than "user" when executing -main from uberjar? |
| 03:12 | kelsey | hey I have a total newb question |
| 03:15 | kelseygi | i wanna map a function over a vector of maps |
| 03:16 | kelseygi | the function is select-keys, which takes the map as the first arg & a set of keys as the second arg |
| 03:16 | kelseygi | how do i get each member passed to select-keys in the map call? |
| 03:16 | amalloy | you have a fixed set of keys you want to select, across all maps? |
| 03:17 | kelseygi | yah |
| 03:17 | kelseygi | it's json--i probably should do something more robust for parsing but now i want to know the answer |
| 03:17 | amalloy | (map #(select-keys % [:x :y :z]) maps), although i would usually write that as (for [m maps] (select-keys m [:x :y :z])) |
| 03:18 | kelseygi | ah the placeholder % was what i couldn't google :) |
| 03:18 | amalloy | kelseygi: i mean, remember that #(f % x) is just shorthand for (fn [foo] (f foo x)) |
| 03:19 | amalloy | you don't ever need to use it |
| 03:19 | roelof | Hello, I have to make a script which checks if someone is older then 12 and younger then 20 |
| 03:19 | amalloy | show them a picture of a VHS tape |
| 03:19 | roelof | So i did this:http://pastebin.com/06mfqLjh |
| 03:20 | roelof | but now I see this error message: cannot be cast to clojure.lang.id |
| 03:20 | roelof | how to solve this ? |
| 03:21 | ebaxt | roelof: (> age 12) not (age > 12) |
| 03:22 | ebaxt | and you don't need the if |
| 03:22 | kelseygi | thank you amalloy |
| 03:23 | roelof | oke, still have to think about this, |
| 03:24 | roelof | last question : Can I do the same with one comparison and three arguments |
| 03:24 | roelof | I now I can do ( < x y x ) |
| 03:24 | amalloy | (< 12 age 20) |
| 03:25 | roelof | amalloy: does that not mean lesser then 12 ?? |
| 03:25 | lazybot | roelof: What are you, crazy? Of course not! |
| 03:25 | roelof | lazybot: ???? |
| 03:27 | amalloy | lazybot is right as always |
| 03:27 | roelof | I think lazybot is insulting me. I do not understand what he/she means |
| 03:27 | amalloy | he's a robot |
| 03:28 | amalloy | he just knows that if you ask a question with two exclamation marks the right answer is usually, as here, "no" |
| 03:28 | amalloy | er, question marks |
| 03:29 | roelof | oke, I refrase my question then |
| 03:30 | roelof | amalloy: does that not mean lesser then 12 ? |
| 03:30 | amalloy | why don't you try it on some sample values of x and see? |
| 03:31 | roelof | oke, I will do that |
| 03:31 | roelof | thanks for the help so far |
| 03:56 | martinklepsch | I'm using data.zip/data.xml and some other stuff and would like to parse a list of elements to a vector of strings: <parent><a>hello</a><b>you</b></parent> => ["hello" "you"] |
| 03:59 | martinklepsch | nevermind, got it |
| 04:08 | jwm | that is nice |
| 04:09 | jwm | now I have two repls going at once, one from lighttable and one from lein :) |
| 04:16 | bars0 | \quit |
| 04:23 | sveri | hi, why does this macro return a stack overflow error? http://pastebin.com/H1eHr6JZ I am wondering, cause it should stop recursion if i give it a map without the key :a |
| 04:26 | djcoin | sveri: as you are outputting |
| 04:26 | djcoin | a code that contain a macro, it keeps growing |
| 04:27 | djcoin | and macro expanding I guess - yet, I'm far from being a macro expert |
| 04:27 | sveri | djcoin: if I omit the (println there still is a stackoverflow error |
| 04:29 | djcoin | I think a println call has nothing to do with a stackoverflow error |
| 04:29 | djcoin | Maybe you could paste your error |
| 04:32 | sveri | djcoin: this is the error: clojure.lang.Compiler$CompilerException: java.lang.StackOverflowError, compiling: it occurs at the line with the recursion step |
| 04:33 | sveri | the stackoverflow also happens if you call the macro with no map at all, like a string for instance |
| 04:52 | augustl | sveri: out of curiousity, why the let? |
| 04:52 | sveri | augustl: I will need the binding later, but left that out in the example because it just complicates things |
| 04:53 | augustl | do you get the stack overflow when the code runs, or when the macro expands? |
| 04:53 | augustl | I assume the former :) |
| 04:54 | augustl | also, why the ~@, wouldn't (mein (:a ~t)) do the trick? |
| 04:55 | augustl | I seldom write macros so I forget all the terms.. But doesn't ~@ mean "inline this form"? |
| 04:55 | pyrtsa | Correct. |
| 04:56 | augustl | perhaps that's where you get the overflow, at expansion time, since you try to inline something that isn't around at expansion time.. </wildguess> |
| 04:56 | sveri | augustl: sry, copy and paste error, its actually ~t jeez |
| 04:56 | augustl | ah :) |
| 04:56 | sveri | however, the error occurs when running the code |
| 04:56 | augustl | what is the value of t initially? |
| 04:57 | sveri | it is supposed to be a map, but can be anyhting |
| 04:57 | sveri | I dont want the parameter to be restricted |
| 04:58 | augustl | also just realized I'm not sure what happens when you recursively call a macro |
| 04:58 | augustl | perhaps that's the problem |
| 04:58 | augustl | the checks you do are run-time, the macro expands forever? Not sure why that doesn't give you an expansion time stack overflow, though |
| 04:59 | sveri | hm, you think you cannot call a macro recursively? |
| 04:59 | augustl | well, it is called expansion time, not run time |
| 04:59 | augustl | so you can do it, but you need to make sure your recursion check is done expansion time |
| 05:00 | augustl | sounds like a classic case of trying to do too much in a macro? :) |
| 05:00 | sveri | :D |
| 05:01 | augustl | the fact that you get the overflow run-time makes no sense to me, though |
| 05:01 | augustl | I can guess.. But I don't understand macro expansion, apparently :) |
| 05:02 | augustl | is the inner "mein" expanded expand-time, or when it's called the first time? If so, that explains the run-time stack overflow, at least |
| 05:04 | sveri | ok, it also appears during macroexpand-all |
| 05:08 | sveri | this macro: (defmacro rec-macro [x] `(when ~x (rec-macro (first ~x)))) suffers the same problem |
| 05:09 | sveri | the "and" macro should be doing the same |
| 05:14 | augustl | sveri: but the check happens before expansion |
| 05:15 | augustl | sveri: in your case, the check happens inside the quoted form |
| 05:15 | augustl | sveri: in the case of "and", the check happens when the macro is invoked expansion time |
| 05:15 | sveri | augustl: ok, I think I got a slight feeling what you are telling me (my first time writing a macro ;-)) |
| 05:19 | augustl | sveri: stuff that happens inside `(+ 1 2) means + isn't invoked expansion-time |
| 05:19 | augustl | but if you do (if (= something 1) `(+ 1 2)), that if check before the ` form is actually evaluated expansion-time, not run-time |
| 05:20 | Kototama | hi, any idea how to get rid of this error when using timbre? http://paste2.org/tjDGvDPG |
| 05:20 | augustl | sveri: and vararg macros (which "and" is) are evaluated expansion time |
| 05:21 | sveri | augustl: ok, thank you |
| 05:21 | sveri | that sounds reasonable :-= |
| 05:21 | sveri | :-) |
| 05:22 | augustl | ~reasonable ;) |
| 05:55 | xsyn | Does Clojure have a spec? |
| 05:57 | clojurenoob | hey guys I'm getting a 'No such namespace' error with lein run which I am not getting with lein repl, any ideas ? |
| 06:12 | clojurenoob | hmmm seems I need a specific function level require on the namespace before I call an eval on it |
| 07:03 | karls | yep |
| 07:04 | karls | whoops! wrong window. |
| 07:22 | gfredericks | xsyn: no |
| 07:25 | xsyn | gfredericks: ta |
| 07:55 | octe | i seem to remember a quote in regards to clojure, something like "its better to have a few types which work with all functions instead of many types that work with a few functions" |
| 07:57 | katratxo | octe: chapter 5 of JoC book starts with "It’s better to have 100 functions operate on one data structure than 10 functions on |
| 07:57 | katratxo | 10 data structures. |
| 07:57 | katratxo | -- Alan Perlis |
| 07:57 | octe | ah |
| 07:57 | octe | thats where i got it from |
| 07:57 | octe | thanks |
| 07:59 | katratxo | http://books.google.es/books?id=nZTvSa4KqfQC&pg=PA84#v=onepage&q&f=false |
| 07:59 | katratxo | octe: also found the Clojure Programming |
| 07:59 | octe | can't see that page |
| 07:59 | katratxo | nope? |
| 07:59 | octe | but i bought JoC so i have it in pdf form somewhere |
| 08:00 | octe | "You have either reached a page that is unavailable for viewing or reached your viewing limit for this book" |
| 08:00 | katratxo | ok |
| 08:01 | agarman | here's a good page of Alan Perlis quotes http://www.cs.yale.edu/homes/perlis-alan/quotes.html |
| 08:01 | agarman | quote 9 is what you're looking for |
| 08:38 | irctc | hello everyone i am beginner in clojure.I want to be do the unit testing of clojure functions with a new database where i define the new database in a application structure and how, |
| 08:43 | agarman | clojure has decent test package built in |
| 08:43 | irctc | hello everyone i am beginner in clojure.I want to be do the unit testing of clojure functions with a new database where i define the new database in a application structure and how, |
| 08:44 | beamso | https://github.com/clojure/java.jdbc |
| 08:45 | agarman | and an intro to clojure.test http://java.dzone.com/articles/clojuretest-introduction |
| 08:45 | gtrak | irctc: unit test library has little to say on how you expose your database. |
| 08:45 | gtrak | keep it simple |
| 09:05 | boodle | hi, I'm learning clojurescript and want my ring server to determine if the current 'cljsbuild' build version is :dev or :production.. how do I access the current build version server-side (say using Selmer) |
| 09:07 | badlambda | does anyone know of any existing implementations in clojure of this algorithm? http://en.wikipedia.org/wiki/Knuth's_Algorithm_X |
| 09:07 | clgv | badlambda: not very likely. what is your problem with that one? |
| 09:08 | badlambda | clgv: I am having some problems coding it up |
| 09:08 | badlambda | would help to have something to learn from |
| 09:08 | clgv | badlambda: can you narrow down your problem? |
| 09:09 | badlambda | yeah, inexperience :-| |
| 09:10 | clgv | badlambda: that's too general to give you good pointers. |
| 09:11 | badlambda | clgv: sure, but that's the root cause |
| 09:12 | clgv | badlambda: try to implement it bottom up. first solution encoding. second the operations on the data structure. third one recursion procedure. finally the complete recursion |
| 09:12 | badlambda | thanks, I will give it a go |
| 09:12 | badlambda | btw, what is the best way to get feedback assuming I produce a solution? |
| 09:13 | badlambda | I feel like writing elegant, ideomatic clojure is still a problem for me |
| 09:13 | clgv | badlambda: post a gist on refheap.com and ask here for "live feedback" or on the mailing list |
| 09:14 | badlambda | thanks for the advice clgv |
| 09:14 | clgv | badlambda: try to make your gist readable and include comments so that people understand what you are trying to do |
| 09:15 | badlambda | good idea, sometimes I have problems following myself, since my Clojure tends to be a mess of repeated "map":s |
| 09:15 | badlambda | it's the spaghetti code equivalent in functional programming I guess |
| 09:18 | koalallama | can anybody reproduce this? running lein repl outside of a lein project causes java process to use 100% CPU, and continually grow in memory usage. running lein 2.3.4 on JRE 1.8.0_05 |
| 09:18 | koalallama | (on OS X) |
| 09:19 | clgv | koalallama: it's probably transmitting the contents of your hard drive to the NSA ;) |
| 09:20 | koalallama | NSA transfer only accounts for 0.1% due to their efficient syncing algorithm though |
| 09:20 | clgv | ah damn, well, .... no idea... |
| 09:21 | beamso | koalallama: not here. do you have a plugin configured that may be causing trouble? |
| 09:27 | koalallama | yes, lein-exec but tried with no profiles.clj and same thing |
| 09:27 | owl-v- | how do i create java class in clojure code? https://www.refheap.com/79100 |
| 09:29 | koalallama | I narrowed it down to when I run lein repl from my home diretory, which has about 100GB+ worth of files |
| 09:29 | koalallama | lein repl from an empty directory is perfectly fine. |
| 09:29 | beamso | weird |
| 09:30 | koalallama | I imagine lein is searching through all my files trying to gather project information |
| 09:30 | beamso | owl-v-: (mymethod (Myclass.)) |
| 09:34 | owl-v- | beamso: thanks. ;;(.mymethod (Myclass.)) |
| 09:34 | beamso | oops. yes, .mymethod. |
| 09:35 | pjstadig | ~source some-when |
| 09:37 | Bronsa | ~source when-some |
| 09:37 | Bronsa | well. pjstadig it's when-some anyway |
| 09:42 | hyPiRion | ~source when-first |
| 09:44 | owl-v- | o.O |
| 09:45 | owl-v- | java object is not copied. https://www.refheap.com/79106 |
| 09:46 | Bronsa | owl-v-: that's the same as in java |
| 09:46 | tbaldridge | owl-v-: why would it be copied? everything is passed via reference |
| 09:48 | beamso | i'm trying to think of a language where the object would be copied and i can't. |
| 09:48 | Bronsa | beamso: C++ |
| 09:49 | beamso | really? |
| 09:49 | teslanick | Only if you don't put the asterisk in front of everything. :) |
| 09:49 | Bronsa | if you don't explicitely references or pointers, sure |
| 09:49 | Bronsa | explicitely use* |
| 09:49 | teslanick | star-this equals star-that deref this. It's as if an entire programming language were written inside a clojure atom. :) |
| 09:50 | beamso | my c++ must be terrible because i can't think of a case when i wouldn't use references or pointers. |
| 09:50 | teslanick | It's syntax-compatible with C, where very often you *do* want to pass-by-value. |
| 09:53 | tbaldridge | beamso: yeah, proper C++ uses copy on argument passing with a bit of & (pass stack value by reference) to improve performance. |
| 09:54 | beamso | okay. i should probably jog my c++ memory one day. |
| 10:05 | owl-v- | does clojure pass reference when calling functions? ex) (function [:1 :2]) |
| 10:06 | owl-v- | does clojure pass reference when calling functions? ex) (function 1) |
| 10:07 | mercwithamouth | my newbie little brain just popped o_O; http://sritchie.github.io/2014/01/17/api-authentication-with-liberator-and-friend/ |
| 10:07 | mercwithamouth | seems like a very good tutorial though...i'm going to have to play with this a lot... |
| 10:14 | teslanick | Is there a version of update-in that "upserts" into a map? |
| 10:14 | teslanick | ,(update-in {} :foo "HELLO WORLD") |
| 10:14 | clojurebot | #<UnsupportedOperationException java.lang.UnsupportedOperationException: nth not supported on this type: Keyword> |
| 10:15 | teslanick | nvm, I think I'm being foolish |
| 10:17 | `szx | teslanick: assoc-in? |
| 10:19 | teslanick | I was getting strange behavior because I didn't realize that update-in wants a vector as its second arguemnt. |
| 10:20 | teslanick | ,(update-in {} [:foo] conj :upsert-key) |
| 10:20 | clojurebot | {:foo (:upsert-key)} |
| 10:20 | teslanick | ,(update-in {:foo [:existing-key]} [:foo] conj :upsert-key) |
| 10:20 | clojurebot | {:foo [:existing-key :upsert-key]} |
| 10:28 | stuartsierra | owl-v-_: Yes, Clojure always passes function arguments by reference, the same as Java. The only time you get pass-by-value is with primitive numbers, which are rarely used in Clojure. |
| 10:32 | Bronsa | stuartsierra: uhm, technically it's always pass by value, only that in case of Objects, the value is a pointer to the object |
| 10:33 | stuartsierra | Bronsa: yeah yeah :) |
| 10:35 | teslanick | http://i.qkme.me/3oc321.jpg |
| 10:41 | cbp | , |
| 10:41 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 10:46 | solussd | Bronsa: stuartsierra: technically, it’s “pass by sharing”. :D |
| 10:47 | solussd | …with immutuable data though, it’s semantically equivilent to pass by reference |
| 10:47 | solussd | *immutable, even |
| 10:47 | egghead | huh? |
| 10:48 | egghead | isn't it pass by ref anyhow given the jvm and js underneath :p |
| 10:48 | owl-v-_ | solussd: is number passed by reference? |
| 10:48 | egghead | I wouldn't imagine so owl-v-_ |
| 10:48 | solussd | for all intents and purposes… yes. |
| 10:49 | owl-v-_ | is list/vector passed by reference? |
| 10:49 | egghead | but like.. if you have a java obj and not a clojure datastruct... it matters |
| 10:49 | egghead | well a clojure datastruct is just a java obj but you know what I mean ;) |
| 10:49 | solussd | they’re boxed, so it’s pass by sharing (pass by value, but the value is a pointer) |
| 10:49 | egghead | if you have a reference to something that exposes a mutable api |
| 10:49 | solussd | right |
| 10:49 | egghead | then you'll have to worry about that even in clojure |
| 10:50 | jcromartie | pass by value is pretty unworkable with the amount of data most programs deal with anyway |
| 10:50 | egghead | hi everyone... i'm currently lamenting standalone jar startup times :( |
| 10:50 | egghead | 1: i want to use clojure for command line apps because I love clj so much |
| 10:50 | egghead | 2: clojure takes forever to start up |
| 10:51 | egghead | 3: i am crying |
| 10:51 | cbp | you could try clojurescript with node |
| 10:51 | hyPiRion | egghead: As a lein contributor, I've felt the same pain |
| 10:51 | solussd | real pass by reference with mutable data is madness |
| 10:52 | owl-v-_ | but, #clojure is faster to start up :) |
| 10:52 | egghead | ya solussd and yet is the default in langs like java ;) |
| 10:52 | llasram | jcromartie: There's optimizations. R is mostly past-by-value with copy-on-write and elided copying for single-reference values |
| 10:52 | hyPiRion | egghead: Currently, I just try to keep myself busy with other things until a solution pops up. |
| 10:52 | egghead | lol hyPiRion, ya |
| 10:52 | hyPiRion | Because it will happen at some point |
| 10:53 | solussd | no, pass by reference with mutable references means I can change the value referred to by the reference passed to the function, not just values inside, say, an object (that’s where the distinction between pass by reference and pass by sharing comes in) |
| 10:53 | solussd | but, mutability in OO langs is also madness. |
| 10:54 | egghead | ya, clojure doesn't have immutable refs does it? |
| 10:54 | egghead | defonce maybe? |
| 10:54 | owl-v-_ | atom |
| 10:54 | technomancy | egghead: have you looked at racket? |
| 10:54 | teslanick | solussd: That would be the equivalent of passing pointers-of-pointers, yes? |
| 10:54 | jcromartie | egghead: different kind of ref |
| 10:54 | egghead | owl-v-_: that's the other side of the thing, the thing that is referenced is immutable |
| 10:54 | technomancy | it's really good for small, fast-starting programs |
| 10:54 | jcromartie | all Java objects are references |
| 10:54 | egghead | but the reference itself can be changed to point to any other thing |
| 10:54 | jcromartie | or treated as such |
| 10:54 | solussd | well, in clojure a “pointer” to the value is passed, not the var itself |
| 10:55 | owl-v-_ | (fun 1) ?? |
| 10:55 | lazybot | owl-v-_: Definitely not. |
| 10:55 | owl-v-_ | lol lazybot~ |
| 10:55 | egghead | ,(type 1) |
| 10:55 | clojurebot | java.lang.Long |
| 10:55 | egghead | ^ wrapper type |
| 10:56 | egghead | so ya, a ref |
| 10:56 | egghead | hm |
| 10:57 | egghead | solussd: what are you getting at btw |
| 10:58 | egghead | i've wondered if it would be better if clojure def[n]s were final declarations but not sure if it matters |
| 10:58 | jcromartie | it doesn't particularly matter |
| 10:58 | solussd | absolutely nothing. I just saw Bronsa correct stuartsierra and I figured I might as well be more “technically correct”. :P |
| 10:58 | egghead | ah :p |
| 10:59 | jcromartie | the JVM deals primarily in objects and those are always essentially references |
| 11:00 | solussd | yup |
| 11:06 | jcromartie | hell is watching other people use a computer |
| 11:06 | llasram | Not a fan of pair programaming? |
| 11:20 | seangrove | http://www.w3.org/TR/css3-layout/ ASCII art to define layout grids |
| 11:22 | technomancy | watching people who don't know keyboard shortcuts is the worst |
| 11:23 | seangrove | technomancy: Breath. You're going to crush their sense of confidence. |
| 11:23 | seangrove | Ahem. |
| 11:23 | seangrove | Breathe* |
| 11:24 | hyPiRion | technomancy: I quite enjoy it even more when any non-xmonad person attempt to use my computer. |
| 11:24 | hyPiRion | esp. if they consider themselves techy |
| 11:25 | gfredericks | hyPiRion: my work machine is virtualbox + xmonad + dvorak; completely user-proof |
| 11:25 | hyPiRion | heh |
| 11:26 | technomancy | try an unlabeled dvorak 40% keyboard =) |
| 11:26 | gfredericks | 40%? |
| 11:26 | hyPiRion | gfredericks: 0.4 |
| 11:26 | gfredericks | having the qwerty labeling makes it deceptive |
| 11:26 | gfredericks | hyPiRion: that didn't clear anything up |
| 11:27 | technomancy | gfredericks: 40% means no number keys, arrow keys, or function keys |
| 11:27 | hyPiRion | gfredericks: that was my intent |
| 11:27 | technomancy | just ~40 keys |
| 11:27 | technomancy | given that 105 keys is "standard" and you can't have fractional keys |
| 11:28 | gfredericks | technomancy: a key that works some fraction of the time is like a fractional key |
| 11:28 | hyPiRion | gfredericks: none of my keys work when my computer is off |
| 11:29 | coventry | Wow. What do you do for numbers? http://geekhack.org/index.php?topic=47133 |
| 11:29 | Guest34699 | hi |
| 11:30 | hyPiRion | gfredericks: or perhaps they do. I'm not sure of the definition of "working" is. |
| 11:30 | coventry | Oh, they're a chord with the fn key. |
| 11:30 | gfredericks | oh man |
| 11:30 | gfredericks | I kind of want such a keyboard |
| 11:31 | coventry | I'm pretty skeptical about it improving my life. |
| 11:31 | Guest34699 | can i use maven in intellij ide? |
| 11:32 | sqldier | yes |
| 11:32 | sqldier | file>settings>maven |
| 11:37 | technomancy | coventry: fn for numbers means you can put a numpad under your hand even in the home row position |
| 11:38 | technomancy | I actually like it better than having them across the top |
| 11:49 | pjstadig | #1 |
| 11:49 | pjstadig | clojurebot: #1 |
| 11:49 | clojurebot | 1. One man's constant is another man's variable. -- Alan J. Perlis |
| 11:49 | pjstadig | hmm |
| 12:04 | rasmusto | how much of paredit.el do people actually use? |
| 12:05 | owl-v-_ | clojurebot: #2 |
| 12:05 | clojurebot | 2. Functions delay binding; data structures induce binding. Moral: Structure data late in the programming process. -- Alan J. Perlis |
| 12:05 | llasram | rasmusto: In what sense? How many of the commands it provides? |
| 12:06 | rasmusto | llasram: I guess it's a pretty vague question. Maybe this: /what/ in paredit.el can people not live without? |
| 12:07 | llasram | rasmusto: Mostly the fundamental idea of structural editing :-) |
| 12:07 | rasmusto | hah, okay :) |
| 12:07 | gfredericks | there's probably like 10 basics |
| 12:07 | gfredericks | moving the cursor around, adding, deleting |
| 12:08 | rasmusto | surround element, slurp, barf, etc.? |
| 12:08 | gfredericks | anything that is a composition of other commands is less fundamental |
| 12:08 | gfredericks | those are all compositions I think |
| 12:08 | rasmusto | ah, alright. |
| 12:08 | gfredericks | I can slurp by cut/paste |
| 12:08 | gfredericks | I don't want to, but I could |
| 12:08 | seangrove | bbloom: When you get a chance, would be nice to hear your thoughts on Famo.us' approach to layout https://famo.us/guides/dev/layout.html. I was a bit confused about their Panel-types initially, but seeing that everything is a composition of transforms makes sense, but it's very, very low-level |
| 12:09 | bbloom | seangrove: transforms != layout |
| 12:10 | seangrove | bbloom: In the famous world, it seems to ;) The grid layouts, etc. are a collection of transforms |
| 12:10 | seangrove | "In this section, we learned that all layout in Famo.us is directed by transforms." |
| 12:11 | bbloom | seangrove: transforms are clearly fundamental to positioning / rendering, but it's totally a lower level construct than layout management |
| 12:11 | seangrove | Anyway, that's just their lowest-level primitive that they build on to achieve actual layouts (grids, etc.), but they expose it as the way to approach layout |
| 12:11 | bbloom | seangrove: ok that makes more sense |
| 12:12 | bbloom | mainContext.add(sizeMod).add(originMod).add(rotateMod).add(test); |
| 12:12 | bbloom | *sigh* |
| 12:12 | bbloom | when will the rest of the planet earth catch on to this whole immutability thing? |
| 12:13 | bbloom | seangrove: there's not enough info about the grid stuff to say if it's any good |
| 12:14 | seangrove | bbloom: Or even declarative approach. No reason that's that's not {:name mainContext :expanders [{:sizeMod ...}]} |
| 12:14 | bbloom | nearly all layouts are axis aligned, so transforms as simple as offset & scale is totally fine. the full generality of affine matrices is a nice to have |
| 12:15 | bbloom | you can also have two transforms: one applied before layout and one after layout, but before rendering |
| 12:15 | coventry | technomancy: Huh, interesting. |
| 12:18 | seangrove | bbloom: If a child requests more width/height than a parent offers, is a general strategy to clamp the width/height at the offered values, or to allow the child to overgrow the parent's offered boundaries? |
| 12:20 | bbloom | seangrove: depends |
| 12:20 | bbloom | seangrove: CSS defaults overflow visible, right? |
| 12:21 | seangrove | bbloom: Yeah |
| 12:21 | bbloom | seangrove: i think i prefer overflow hidden by default |
| 12:21 | bbloom | seangrove: WPF's overflow: http://msdn.microsoft.com/en-us/library/system.windows.uielement.cliptobounds(v=vs.110).aspx |
| 12:22 | bbloom | note default: "metadata properties set to true" |
| 12:22 | bbloom | you can set that to false, then provide arbitrary geometry for a clip region: http://msdn.microsoft.com/en-us/library/system.windows.uielement.clip(v=vs.110).aspx |
| 12:22 | gfredericks | are there any libs of utilities for use with java.jdbc? |
| 12:22 | gfredericks | and if I make one would anybody hate me if I called it java.jdbc++? |
| 12:23 | bbloom | seangrove: actually, i may be reading that wrong |
| 12:23 | bbloom | seangrove: default might be overflow visible |
| 12:23 | hiredman | java.kecd |
| 12:23 | bbloom | *shrug* |
| 12:23 | gfredericks | hiredman: :) |
| 12:24 | gfredericks | java.jdbc++ would mean having "++" in the filename I think? |
| 12:24 | teslanick | bbloom: http://i.imgur.com/Be553NX.png |
| 12:24 | bbloom | teslanick: heh, indeed |
| 12:25 | llasram | gfredericks: I think it would mean having _PLUS__PLUS_ in the filename |
| 12:25 | hiredman | gfredericks: if I recall maven doesn't like + in the artifact name |
| 12:25 | llasram | ,(munge "++") |
| 12:25 | clojurebot | "_PLUS__PLUS_" |
| 12:25 | hiredman | I had a ring-jetty-adapter+ at one point |
| 12:25 | hiredman | oh, no, it was ring-jetty+-adapter |
| 12:26 | hiredman | maybe I am misremembering so other problem with it |
| 12:26 | seangrove | bbloom: Alright, probably have another question re: grid stuff in a bit, but good to go for now. |
| 12:26 | gfredericks | hiredman: fine I'll make the artifact name java.jdbc_PLUS__PLUS |
| 12:26 | gfredericks | just kidding I will not do that it was a joke. |
| 12:26 | gfredericks | alright I have been dissuaded |
| 12:26 | bbloom | seangrove: if you start selling any of that tooling of yours, i want royalties :-P |
| 12:26 | seangrove | bbloom: I will, however, let you know the good news that the universe has put together a conference perfectly fit for you http://2014.cssconf.com/ |
| 12:27 | bbloom | http://2014.cssconf.com/style.css |
| 12:28 | bbloom | man, i forgot what CSS looks like. i haven't written anything but sass in a while ;-) |
| 12:28 | rasmusto | cssaas |
| 12:39 | gfredericks | in core.async, are timeout channels impossible to GC until they're closed by the timeout mechanism? |
| 12:41 | hiredman | https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/timers.clj |
| 12:42 | BobSchack | Yep they are stored in a skiplist if memory serves me. You could close them manually |
| 12:42 | BobSchack | I think |
| 12:42 | gfredericks | so I probably don't want to create one for every row in my db query result |
| 12:43 | BobSchack | You can if they are created within about the same time ~ 10ms |
| 12:44 | BobSchack | if you make timeout channels within ~10ms they are actually the same channel |
| 12:44 | gfredericks | that will not generally be the case |
| 12:44 | llasram | Now that's an interesting optimization |
| 12:44 | danlamanna | it seems there are a ton of "ins and outs of clojure" series on the internet. do you guys have a default for recommending? |
| 12:45 | coventry | Does that mean timeout channels are only accurate to within 10ms? |
| 12:46 | technomancy | danlamanna: aphyr's is pretty good |
| 12:46 | hyPiRion | danlamanna: Is there anything in particular about Clojure's guts you're in learning? |
| 12:46 | hyPiRion | *interested in learning |
| 12:47 | danlamanna | uh, generally just trying to get better at functional programming. i would eventually want to get into multithreading though. |
| 12:47 | coventry | 4clojure.org |
| 12:47 | clojurebot | Titim gan éirí ort. |
| 12:47 | BobSchack | coventry should be look at core async tests for timeout channels |
| 12:50 | hyPiRion | danlamanna: 4clojure.org is good, and if you're good at math, you could try out project euler |
| 12:51 | hyPiRion | it's not reading/learning, more of a practice place though |
| 12:51 | coventry | Probably better to steer clear of project euler until you're reasonably fluent at functional programming. Trying to solve "how do I express this functionally" at the same time as "how do I do this calculation" tends to slow things down a fair bit. |
| 12:52 | danlamanna | yeah, not too worried, i did the first 50 or so problems in python before. |
| 12:52 | danlamanna | i think i'm gonna do a combination of aphyr + 4clojure |
| 12:53 | coventry | Oh, having the "how do I do this calculation" part solved ahead of the time would work, too. :-) |
| 12:53 | hyPiRion | coventry: when you pass the 100 mark, it's more about how you should represent the data, more than the calculations themselves |
| 12:54 | coventry | Oh, that sounds interesting. |
| 12:54 | hyPiRion | (Of course, you still have to do the calculation, but it's usually trivial to do, even in a new language) |
| 13:01 | syao | hello, I have a question, better explained in image http://www.gliffy.com/go/publish/image/5656201/L.png |
| 13:04 | syao | data structure, immutability question |
| 13:07 | eraserhd | Today, I work on extracting my new threading macro to a library. |
| 13:09 | eraserhd | I just need a decent name for it. Powerthread? Semantic threading? :/ |
| 13:09 | llasram | syao: It's really not clear (at least to me) what you're asking |
| 13:09 | llasram | syao: If you express your problem with Clojure's persistent data structures, the result is immutable and persistent |
| 13:11 | llasram | eraserhd: not already covered by 1.6 additions to clojure.core and/or https://github.com/rplevy/swiss-arrows ? |
| 13:11 | syao | llasram, ok, so lets say that the "Data 3" is a list. When I add items to a list, the whole "Virtual Group" should be created. |
| 13:11 | eraserhd | llasram: No. |
| 13:12 | coventry | syao: You don't add items to a persistent list, you create a brand new list. |
| 13:12 | coventry | syao: So you make a function which takes D4 and VG1, and returns a new VG1. |
| 13:13 | llasram | syao, coventry: Or maybe even just use `update-in` |
| 13:13 | eraserhd | llasram: It's a form of -> that threads through if/if-not/if-let/cond/case/etc. |
| 13:13 | coventry | llasram: Maybe, but I assume the edges in the graph represent some subcalculations based on new values for the vertices. |
| 13:14 | syao | coventry, by saying "add" I mean creating new list with all the old and new values. |
| 13:15 | coventry | syao: Then the way I suggested should get you what you want. |
| 13:16 | syao | coventry, wait, in your way the whole immutability I should create my self, it wont be seamless |
| 13:17 | syao | P.S. why D4 needs to be an argument for the funtion? |
| 13:17 | coventry | In clojure you leave the seams in. :-) |
| 13:18 | llasram | syao: A concrete example of exactly what you're trying to do might help |
| 13:20 | eraserhd | Ah, clojuredocs.org is on 1.3.0? |
| 13:20 | llasram | eraserhd: Yes. It's a crufty rails app no one wants to work on. There was/is a re-write in Clojure, but seems to have stalled |
| 13:21 | syao | llasram, I can not give you a concrete example as it is global universal (theoretical) problem. |
| 13:22 | llasram | Then I will propose that this is not a problem you need to solve :-) |
| 13:22 | llasram | Or even really a "problem" |
| 13:24 | eraserhd | It is called 'packthread'. |
| 13:24 | Glenjamin | hi guys, does anyone know of an FRP library that is about data/computation rather than UIs? |
| 13:24 | eraserhd | Yay, a name. Now I can code. |
| 13:25 | Glenjamin | I have a fairly large amount of data, and I want to encode relationships and dependencies so that an update propagates throughout the system in a performant way |
| 13:25 | Glenjamin | perhaps this isn't actually called FRP? |
| 13:25 | coventry | Glenjamin: There was one described at the clojure conj last year. |
| 13:26 | syao | llasram, in fact it is, with hierarchical virtual groups I can enforce constraints on data with immutability. |
| 13:27 | coventry | Glenjamin: https://github.com/tgk/propaganda. I think hoplon could also be used this way. |
| 13:28 | tpope | gtrak: first attempt: https://github.com/tpope/cider-nrepl/commit/84ad9fbe946b7245b38b40c1d82da294b8668524 |
| 13:28 | Glenjamin | coventry: propagator sounds like what i'm after |
| 13:28 | Glenjamin | thanks |
| 13:28 | gtrak | tpope: bbatsov will want a test-case.. though not sure how to generate one.. maybe a with-redefs hack? |
| 13:29 | Glenjamin | i'm hoping for performance gains over brute force re-calc, will be interesting to experiment |
| 13:29 | gtrak | otherwise looks good to me |
| 13:29 | owl-v-_ | ,(prn 04) |
| 13:29 | clojurebot | 4\n |
| 13:29 | tpope | gtrak: yeah everything I could come up with was super contrived because (map str (cp/classpath)) is the entire implementation |
| 13:30 | owl-v-_ | invalid number 09? |
| 13:30 | owl-v-_ | ,(println 09) |
| 13:30 | clojurebot | #<NumberFormatException java.lang.NumberFormatException: Invalid number: 09> |
| 13:30 | rasmusto | owl-v-_: octal |
| 13:30 | tpope | gtrak: thought I might take the currently unused https://github.com/clojure-emacs/cider-nrepl/blob/master/test/cider/nrepl/middleware/test_transport.clj for a spin |
| 13:30 | clojurebot | Cool story bro. |
| 13:30 | Glenjamin | assuming you didn't have this feature, what's the command you wanted to write but couldn't? |
| 13:31 | gtrak | tpope: ah, we might need that to test something else, actually. we need a better solution for exceptions. |
| 13:31 | gtrak | was just thinking about it |
| 13:31 | dbasch | ,(prn 632) |
| 13:31 | clojurebot | 632\n |
| 13:31 | dbasch | ,(prn 0632) |
| 13:32 | clojurebot | 410\n |
| 13:32 | tpope | gtrak: also I'm weirded out by the fact that cp/classpath includes system jars and stuff that don't show up in the regular classpath |
| 13:33 | tpope | I mean it's not a big deal, but feels weird that using a middleware returns a different result |
| 13:33 | technomancy | what's the regular classpath? |
| 13:33 | technomancy | system/getproperty? |
| 13:33 | tpope | yeah |
| 13:33 | tpope | or $(lein classpath) |
| 13:33 | tpope | every other way I've ever retrieved it |
| 13:33 | Glenjamin | is calling classpath an asserting that it contains some colons and ".jar" useful? |
| 13:34 | technomancy | I wouldn't treat the system/getproperty one as canonical |
| 13:34 | technomancy | since it leaves out the bootclasspath |
| 13:34 | gtrak | tpope: probably has to do with the recursive classloader traversal.. it doesn't stop until it hits the top |
| 13:34 | technomancy | but you should be able to trust lein classpath |
| 13:34 | tpope | yeah I know the problems with getproperty |
| 13:34 | tpope | part of why I want this middleware |
| 13:34 | technomancy | ...unless you're playing pomegranate/classloader games |
| 13:35 | tpope | but lein classpath and cp/classpath differing is weird |
| 13:35 | tpope | they're both right in their own way |
| 13:36 | ToxicFrog | Is there a convenient/idiomatic way to have multiple output programs in the same lein project? E.g., say I have a program with CLI, GUI, and web interfaces, and I want them in separate jars - is there a good way to do that in lein? |
| 13:36 | ToxicFrog | Or should I just be making it one project per UI + one shared library project? |
| 13:36 | technomancy | ToxicFrog: you want separate uberjars or separate libs deployed? |
| 13:36 | tpope | Glenjamin: I see that as a pretty silly test. plus colons aren't even portable |
| 13:37 | gtrak | tpope: lein-specific information might be interesting in itself, but its classpath is just what's used in the java invocation. |
| 13:37 | gtrak | whereas clojure.java.classpath gives you the reality |
| 13:38 | tpope | right. I think the reality is preferrable |
| 13:38 | tpope | what I'd really like is a way to get the boot classpath statically, I guess |
| 13:38 | Glenjamin | tpope: mm, was mainly thinking that faking it or spinning up a controlled JVM isn't worth it, so what's the smallest test that isn't completely useless |
| 13:38 | Glenjamin | i guess assert non-empty string is better than nothing |
| 13:39 | tpope | Glenjamin: I was actually thinking of just checking that it matched the current running classpath |
| 13:39 | ToxicFrog | technomancy: separate uberjars. Ideally I want to be able to say 'lein all-uberjars' or something and get foo.jar, foo-gui.jar, and foo-http.jar out. |
| 13:39 | Glenjamin | tpope: wouldn't that be your implementation in reverse? |
| 13:39 | technomancy | ToxicFrog: an alias to with-profile ... uberjar should do that |
| 13:39 | tpope | it'd be identical to my implementation afaik |
| 13:40 | tpope | (map str classpath) on both sides |
| 13:40 | Glenjamin | heh |
| 13:40 | tpope | which yeah, sigh |
| 13:40 | hyPiRion | ToxicFrog: yeah, use something like `:alias {"uberjar" [["with-profile" "+gui" "uberjar"] ...]}` |
| 13:40 | ToxicFrog | technomancy: so, I define multiple profiles with different :mains, and then lein with-profile foo uberjar? |
| 13:41 | technomancy | ToxicFrog: different :main and different :uberjar-name, yeah |
| 13:41 | technomancy | well |
| 13:42 | technomancy | with-profile profile1,profile2,profile3 uberjar |
| 13:42 | justin_smith | technomancy: responding to deep scrollback - here I thought fn for numbers would mean (2 :a) => [:a :a] |
| 13:42 | ToxicFrog | technomancy: awesomeness. |
| 13:42 | ToxicFrog | Thank you. |
| 13:42 | justin_smith | that would almost make sense in a math / number theory oriented clj fork |
| 13:43 | technomancy | np |
| 13:48 | ToxicFrog | technomancy: bug report: 'lein help' inside a project directory downloads all dependencies before giving you the help text. |
| 13:48 | Glenjamin | thats a feature! |
| 13:48 | ToxicFrog | technomancy: question: is there a way I can ask 'lein new' to generate the project.clj for a given template but do nothing else, if, say, I wanted to look at the :deps for it but not actually create such a project? |
| 13:48 | technomancy | ToxicFrog: you can't see the docstrings of the plugins if you don't fetch them first |
| 13:49 | ToxicFrog | technomancy: no, I mean, all dependencies for the project you're in |
| 13:49 | ToxicFrog | e.g. if I'm in a project that depends on ring, 'lein help new' will download ring first |
| 13:49 | Glenjamin | well, downloading plugins is required for lein help anyway |
| 13:49 | ToxicFrog | Or do you mean... |
| 13:49 | ToxicFrog | Oh, I see what happened. |
| 13:49 | ToxicFrog | No, that makes sense. |
| 13:49 | ToxicFrog | Never mind. |
| 13:50 | ToxicFrog | The question stands though :P |
| 13:51 | technomancy | ToxicFrog: unfortunately templates are imperative, not declarative |
| 13:51 | technomancy | so you pretty much have to run them |
| 13:51 | ToxicFrog | And then copy the bits I care about and throw away the rest. |
| 13:51 | ToxicFrog | Alright. |
| 14:06 | tpope | gtrak: with test: https://github.com/tpope/cider-nrepl/commit/59e6a64c2e5327b352dc255dc1a3b650d4a0d35d |
| 14:08 | justin_smith | it would be interesting if someone kept a static archive of the latest version of various lein templates |
| 14:08 | justin_smith | so you could browse what you would get if you created it locally |
| 14:08 | justin_smith | and point to them for reference, etc. |
| 14:21 | technomancy | well ... technically the halting problem. |
| 14:26 | llasram | Since templates can accept arbitrary arguments.... although do many? |
| 14:27 | technomancy | not just arbitrary args; they are fully turing-complete |
| 14:27 | justin_smith | yeah, a template could decide to output completely different files based on time of day... |
| 14:27 | technomancy | a template could wipe your home dir and send your private keys to the mafia or whatever |
| 14:27 | justin_smith | lein new jeckyll-hyde... |
| 14:28 | bbloom | technomancy: .... correct me if i'm wrong, but aren't templates just kinda automatically downloaded/installed upon use? |
| 14:28 | justin_smith | during the day it creates an unassuming REST API server, during the night it creates a proxy tunnel for blackhats |
| 14:29 | technomancy | bbloom: right; this is the one place where version ranges are arguably defensible |
| 14:29 | dbasch | lein new russianroulette app |
| 14:33 | koalallama | speaking of home directories. |
| 14:33 | amalloy | $mail irctc dude, please just ask your questions to #clojure. you won't get any responses if you just ask me via PM when i'm asleep |
| 14:33 | lazybot | Message saved. |
| 14:33 | gfredericks | I can only have cores+2 futures running at the same time amirite? |
| 14:33 | llasram | That should be enough for anyone |
| 14:34 | koalallama | technomancy: when I run lein repl from my home directory (about 100GB of files), java CPU usage climbs to 100, and memory usage grows constantly |
| 14:34 | amalloy | gfredericks: no, futures' pool is unbounded |
| 14:34 | koalallama | technomancy: lein 2.3.4 on 1.8.0_05 / os X.. should I just not do this? or is this a bug? |
| 14:34 | amalloy | pmap is the function that chooses to spin up only cores+2 futures |
| 14:34 | gfredericks | amalloy: ohhokayIsee |
| 14:35 | gfredericks | good to know |
| 14:36 | koalallama | technomancy: lein repl from an empty directory, or a "normal sized" project doesn't show same behavior |
| 14:36 | gtrak | tpope: cool! |
| 14:36 | gtrak | i haven't heard any feedback about the op itself, but I don't foresee any pushback |
| 14:37 | gtrak | here's where I opened it up: https://github.com/clojure-emacs/cider-nrepl/issues/36 |
| 14:37 | technomancy | koalallama: is there a src/ dir in your home or something? |
| 14:37 | tpope | gtrak: guess I'll request a pull |
| 14:38 | amalloy | technomancy: i have src/ in my home, and lein repl starts like a flash |
| 14:38 | koalallama | technomancy: there is no ~/src, but there are "src" directories deep inside |
| 14:39 | eraserhd | Does anyone have an example of using tools.analyzer within a macro? |
| 14:39 | koalallama | curious if lein repl tries to walk my directories looking for something |
| 14:39 | coventry | Sounds like a good application for strace, or whatever the equivalent is on OS X. |
| 14:40 | eraserhd | tbaldridge: IIRC, you were using it for the core.async `go` macro when you gave the tools.analyzer talk, but I don't see that as a dep now. |
| 14:40 | justin_smith | coventry: or whatever the jvm equivalent is |
| 14:40 | amalloy | koalallama: it should only walk upwards, looking for project.clj. maybe you have some kind of circular symlink? i can't think of a way that's possible on the path from /, but you never know |
| 14:40 | tbaldridge | eraserhd: it's in a branch called "analyzer" |
| 14:41 | eraserhd | tbaldridge: Oh, hello, there it is. Suhweet! |
| 14:43 | koalallama | ok, 2 minutes later CPU is back to 0.3% |
| 14:44 | technomancy | koalallama: definitely a bug, yeah |
| 14:45 | justin_smith | coventry: koalallama: the ibm jvm has a trace option (others may also have something, will keep checking it out) |
| 14:45 | technomancy | koalallama: does it happen with `lein run -m clojure.main -e nil` too? |
| 14:45 | justin_smith | also check out jstack - if you run it enough times you should get a good idea what it is grinding on |
| 14:46 | koalallama | technomancy: nope, that runs and ends in about 2 seconds |
| 14:47 | amalloy | yeah, jstack is what i'd try (if i didn't have yourkit already set up) |
| 14:47 | ghadishayban | gfredericks: beware of bounding blocked takes on a channel/timeout to < 1024 |
| 14:48 | coventry | justin_smith: Cool. |
| 14:48 | ghadishayban | s/beware/ensure bounding |
| 14:49 | technomancy | koalallama: how about `lein repl :start` and (in a different terminal) `lein repl :connect`? |
| 14:50 | gfredericks | ghadishayban: wat? you mean no more than 1024 consumers trying to read from a single channel? |
| 14:50 | koalallama | here's a jstack while it's spinning: https://gist.github.com/ctrlrsf/5f21ce7311158b58c1f9 |
| 14:51 | ghadishayban | gfredericks: Yes it's intentionally bounding. It's ok to have a channel with whatever size buffer, but not more than 1024 "pending" or blocked takes |
| 14:52 | koalallama | technomancy: yup, CPU burns with just lein repl :start, before even :connect is ran |
| 14:52 | justin_smith | https://gist.github.com/ctrlrsf/5f21ce7311158b58c1f9#file-jstack-lein-repl-1-L241 this thread is suspicious |
| 14:52 | ghadishayban | gfredericks: https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/channels.clj#L168-L171 |
| 14:52 | gfredericks | ghadishayban: cool; I don't think that's remotely an issue for me |
| 14:53 | ghadishayban | use a mult + taps if it is |
| 14:53 | koalallama | note, the repl is responsive, just notice the CPU usage of the process is high and laptop starts smoking ;) |
| 14:53 | justin_smith | koalallama: at that point there are a bunch of frames locked on the same shit, and doing something with the fs |
| 14:53 | gfredericks | ghadishayban: looks like it would bark loudly if I had a problem? |
| 14:54 | justin_smith | koalallama: all the frames are locking on the same lazyseq object, and the trace is suspiciously deep |
| 14:54 | hiredman | reply pulls in clojure-complete |
| 14:54 | justin_smith | could be a bad recursion |
| 14:54 | ghadishayban | gfredericks: yup. but possibly in some async context somewhere |
| 14:54 | hiredman | clojure-complete scans files looking for completions |
| 14:55 | wink | code golf time. can anyone shorten that? :) https://gist.github.com/anonymous/11227866 |
| 14:55 | justin_smith | oh yeah, there is a bunch of reply in that stack trace, good call |
| 14:56 | amalloy | (apply + (map read-string) (s/split x #",")) |
| 14:56 | technomancy | weird; it should just be scanning the classpath |
| 14:57 | amalloy | er, mis-parenthesized that, but you get the idea |
| 14:57 | AimHere | ,((apply + (map read-string) (s/split x #",")) "") |
| 14:57 | clojurebot | #<CompilerException java.lang.RuntimeException: No such namespace: s, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:57 | amalloy | ,(clojure.string/split "" #",") |
| 14:57 | clojurebot | [""] |
| 14:57 | AimHere | ,((apply + (map read-string) (string/split x #",")) "") |
| 14:57 | clojurebot | #<CompilerException java.lang.RuntimeException: No such namespace: string, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:57 | amalloy | booo |
| 14:57 | tpope | gtrak: submitted |
| 14:57 | AimHere | ,((apply + (map read-string) (clojure.string/split x #",")) "") |
| 14:57 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: x in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:57 | amalloy | (apply + (map read-string (filter seq (s/split x #",")))) |
| 14:57 | wink | hehe thanks |
| 14:57 | technomancy | koalallama: is it possible something got put on the classpath that shouldn't be there? |
| 14:58 | eraserhd | wink: (apply + (read-string x)) |
| 14:58 | technomancy | in any case clojure-complete should have a (take 1024 ...) on its file-seq just to avoid going completely insane |
| 14:58 | koalallama | btw, find ~/ -type f | wc -l = 271897 |
| 14:58 | AimHere | ,(#(read-string (str "(+" % ")")) "3,4,5,6") |
| 14:58 | clojurebot | (3 4 5 6) |
| 14:58 | justin_smith | ,(#(apply + (map read-string (filter seq (clojure.string/split % #",")))) "") |
| 14:58 | clojurebot | 0 |
| 14:59 | gtrak | tpope: tpope, cool! |
| 14:59 | eraserhd | ,(let [x "5,3"] (apply + (read-string (str "0," x)))) |
| 14:59 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 15:00 | eraserhd | ,(let [x "5,3"] (apply + (read-string (str \[ x \])))) |
| 15:00 | clojurebot | 8 |
| 15:00 | justin_smith | oh, tricky |
| 15:00 | koalallama | technomancy: bingo! here was my CLASSPATH env: ".:/usr/local/lib/antlr-4.1-complete.jar:" |
| 15:00 | technomancy | youch |
| 15:01 | eraserhd | ,(def c #(apply + (read-string (str \[ % \])))) |
| 15:01 | clojurebot | #'sandbox/c |
| 15:01 | koalallama | how long has that been there? |
| 15:01 | eraserhd | ,(c "") |
| 15:01 | clojurebot | 0 |
| 15:01 | llasram | Pulling ANTLR in will do it |
| 15:01 | eraserhd | ,(c "5,3") |
| 15:01 | clojurebot | 8 |
| 15:01 | wink | eraserhd: horrible, but brilliant :) |
| 15:01 | AimHere | ,(def c #(eval (read-string (str \( \+ % \))))) |
| 15:01 | clojurebot | #'sandbox/c |
| 15:01 | AimHere | (c "3,4,5,5") |
| 15:01 | justin_smith | llasram: I would have thought . was the problem |
| 15:02 | AimHere | ,(c "3,4,5,5") |
| 15:02 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn> |
| 15:02 | eraserhd | wink: I excel at "horrible". Brilliance is by accident.. |
| 15:02 | llasram | justin_smith: My humor-jokes may need some work |
| 15:02 | justin_smith | heh |
| 15:02 | koalallama | justin_smith: thanks for the help |
| 15:03 | justin_smith | ,(do (def c #(eval (read-string (str \( \+ % \))))) (c "3,4,5,5")) |
| 15:03 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn> |
| 15:03 | justin_smith | koalallama: np |
| 15:03 | wink | I think I am forever tainted too much from imperative languages though |
| 15:03 | koalallama | technomancy: thanks, sorry for wasting your time. I knew I liked you since I saw your name in my clojure book |
| 15:03 | wink | as I started with let [a (...) b (... a) c(... b)] c) |
| 15:03 | technomancy | heh; no worries |
| 15:03 | wink | and only then rearranged it to short form |
| 15:04 | technomancy | koalallama: I think it'd be reasonable to open an issue with clojure-complete fwiw |
| 15:04 | koalallama | btw, source of that classpath was: https://github.com/antlr/antlr4 step 3 has this: export CLASSPATH=".:/usr/local/lib/antlr-4.2.1-complete.jar:$CLASSPATH" |
| 15:06 | justin_smith | koalallama: I think that instead one could just put antlr-complete "4.2.1" in the dev profile in .lein/profiles.clj |
| 15:06 | justin_smith | for an even more thorough fix |
| 15:07 | llasram | justin_smith: Well, assuming you are only using leiningen. Well, and populating :dev in profiles.clj is probably bad |
| 15:07 | koalallama | yup, except I don't even need antlr anymore. this has been there from another project almost 1 year ago |
| 15:08 | eraserhd | tbaldridge: The :op :local is specific to the go macro, it's not what analyzer wants, right? |
| 15:08 | gtrak | technomancy: I yearn for the day when we can remove clojure-complete from leiningen. |
| 15:08 | justin_smith | llasram: if not using lein, then one could use a shell script or whatever your alternative tool uses to manage the path |
| 15:08 | llasram | justin_smith: totes |
| 15:08 | tbaldridge | eraserhd: no, in the form (let [x 42] x) the body of the let will be a :local node |
| 15:09 | tbaldridge | eraserhd: locals can either be arguments or bindings from lets/loops |
| 15:09 | technomancy | gtrak: you can omit it if it causes trouble |
| 15:09 | eraserhd | tbaldridge: Oh, OK. |
| 15:09 | technomancy | but I guess you don't always realize it |
| 15:09 | gtrak | technomancy: I just want everyone else to stop depending on it. |
| 15:10 | gtrak | implicit deps, bleh. |
| 15:11 | technomancy | at least there are no transitive implicit deps |
| 15:11 | technomancy | that's where I draw the line |
| 15:13 | koalallama | technomancy: re: issue with clojure-complete, is there really an issue if I just happened to add a super huge directory to my classpath by mistake? looks like the code that's running eventually completes after 2+ minutes |
| 15:15 | technomancy | koalallama: I think it would be better if clojure-complete only bothered checking the first thousand or so files |
| 15:16 | koalallama | sounds reasonable |
| 15:32 | gtrak | technomancy: err well, [any elisp completion frontend plus god knows what else] -> lein -> clojure-complete, transitive in some sense. |
| 15:34 | gtrak | come to think of it, I need an easy way to boot up cider-nrepl middlewares outside of lein |
| 15:38 | koalallama | I gotta get some rest, I will look into this further and open issue with clojure-complete |
| 15:39 | koalallama | thanks again, all |
| 15:41 | rasmusto | ,(some (rest "zzzz")) |
| 15:41 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/some> |
| 15:41 | justin_smith | ,(some rest (rest "zzzz")) |
| 15:41 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Character> |
| 15:42 | justin_smith | ,(some #(do %) (rest "zzzz")) |
| 15:42 | clojurebot | \z |
| 15:42 | rasmusto | the whole string -> charseq always felt a bit strange to me |
| 15:42 | rasmusto | s/bit/byte |
| 15:42 | justin_smith | I think a string should become chars when treated as a seq, and by extension a char should be treated as bits |
| 15:43 | jcromartie | wat |
| 15:43 | jcromartie | no way |
| 15:43 | jcromartie | then integers should be too |
| 15:43 | rasmusto | ,(seq 1) |
| 15:43 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 15:43 | justin_smith | /s |
| 15:43 | justin_smith | right :) |
| 15:43 | jcromartie | OK |
| 15:43 | justin_smith | sorry, was a very dry joke |
| 15:43 | rasmusto | turtles all the way down |
| 15:44 | justin_smith | but it is the same logic - just taken a couple steps too far |
| 15:44 | llasram | And also is what Ruby does |
| 15:44 | justin_smith | (dec ruby) |
| 15:44 | lazybot | ⇒ -1 |
| 15:44 | llasram | Sounds about right |
| 15:44 | jcromartie | llasram: how so? |
| 15:44 | rasmusto | (dec seq) |
| 15:44 | lazybot | ⇒ -1 |
| 15:45 | hfaafb | inc and dec are so stateful :3 |
| 15:45 | hyPiRion | $karma rubby |
| 15:45 | llasram | jcromartie: Try `2[0]`, `2[1]` some time |
| 15:45 | lazybot | rubby has karma -1. |
| 15:46 | jcromartie | no... |
| 15:46 | jcromartie | that's.. |
| 15:46 | jcromartie | well, OK then |
| 15:47 | jcromartie | if I can index it I should be able to get a sequence out of it |
| 15:47 | jcromartie | but I guess not necessarily… hashes, sets... |
| 15:47 | justin_smith | rubby is ruby's sketchy cousin who isn't allowed near schools or parks |
| 15:47 | TEttinger | with good reason. rubby on rails was a fiasco |
| 15:48 | justin_smith | lol |
| 15:48 | gfredericks | rubby in ruts |
| 15:49 | TEttinger | jcromartie, you want individual bytes out of the internal representation of objects, when you treat them as seqs, right? |
| 15:50 | gfredericks | I want a timeseries of voltage measurements from the wires |
| 15:51 | justin_smith | hah, try to loop on an array and get the sequence of bits in the pointer... |
| 15:51 | rasmusto | whoa, this right shift key is pretty efficient! |
| 15:52 | justin_smith | ,(bit-shift-right 42 1) |
| 15:52 | clojurebot | 21 |
| 15:52 | jcromartie | https://gist.github.com/jcromartie/11229825 |
| 15:53 | llasram | Perfect. Ruby takes PRs, right? |
| 15:54 | gfredericks | what's Integer in ruby? |
| 15:54 | gfredericks | I thought they had Fixnum and Bignum |
| 15:54 | jcromartie | Integer is the superclass of Fixnum |
| 15:54 | gfredericks | oh righto |
| 15:55 | devn | ,(doc add-watch) |
| 15:55 | clojurebot | "([reference key fn]); Adds a watch function to an agent/atom/var/ref reference. The watch fn must be a fn of 4 args: a key, the reference, its old-state, its new-state. Whenever the reference's state might have been changed, any registered watches will have their functions called. The watch fn will be called synchronously, on the agent's thread if an agent, before any pending sends if agent or re... |
| 15:55 | gfredericks | I am rubby rusty; rubsty |
| 16:03 | mdrogali` | Is there a way to pull up a repl from a jar that contains Clojure? |
| 16:03 | mdrogali` | It's a prebuilt uberjar that behaviors differently with production dependencies rather than dev deps. |
| 16:03 | mdrogali` | behaves, rather* |
| 16:04 | turbofail | java -cp <uberjar-name>.jar clojure.main |
| 16:04 | michaniskin | java -jar your-file.jar clojure.main |
| 16:04 | michaniskin | oh right |
| 16:04 | michaniskin | nevermind |
| 16:05 | mdrogali` | Thanks guys. I did that, but I wasn't able to require/use any of my namespaces. |
| 16:05 | turbofail | they must not be in your uberjar then |
| 16:05 | mdrogali` | Oh, hold up! Yeah, this was my mistake. |
| 16:05 | mdrogali` | Thanks guys & gals |
| 16:05 | justin_smith | try unzipping the jar (it is a zip file) and seeing what is in it |
| 16:06 | rasmusto | .jar.gz |
| 16:06 | dbasch | jar tvf |
| 16:06 | rasmusto | tvvvf |
| 16:07 | justin_smith | well since it is a zip file you can just use whatever tool you would usually use to explore a zip (I open it in emacs for example) |
| 16:09 | kenrestivo | my god, the test coverage on bitcoinj is... impressive |
| 16:09 | kenrestivo | compile takes 2 seconds, tests takes 2 minutes. |
| 16:09 | justin_smith | well consider that btc is meant to be computationally expensive |
| 16:09 | justin_smith | so I bet the tests spend a lot of time in CPU |
| 16:10 | kenrestivo | btw, https://www.refheap.com/79395 |
| 16:10 | kenrestivo | they also fail too :-( |
| 16:11 | guns | Is anyone aware of any popular Clojure libraries with underscores in the _namespace_ name? |
| 16:11 | kenrestivo | woops wrong chan |
| 16:11 | justin_smith | seems like a bad idea... but no I haven't seen it |
| 16:13 | dbasch | kenrestivo: are you doing something bitcoin-related? |
| 16:14 | kenrestivo | dbasch: i was. and might be again. always checking to see how things are progressing |
| 16:14 | dbasch | kenrestivo: I’m working on a cryptocurrency project in clojure |
| 16:15 | kenrestivo | dbasch: cool! an altcoin, or something totally different? |
| 16:15 | dbasch | kenrestivo: https://cointipping.com/ |
| 16:15 | rasmusto | dojecoin |
| 16:15 | guns | justin_smith: thanks. You're a pretty good data point |
| 16:16 | dbasch | kenrestivo: but it’s not really about dogecoin, there’s more beyond it |
| 16:16 | kenrestivo | dbasch: looks like react, will have to try it on a js enabled browser |
| 16:16 | dbasch | kenrestivo: yes, it’s Om |
| 16:16 | dbasch | kenrestivo: I optimized it for mobile |
| 16:17 | dbasch | well, “optimized” meaning that it sucks less on mobile |
| 16:17 | justin_smith | guns: aww, shucks |
| 16:18 | kenrestivo | dbasch: neat. what are you using for a back end as a bitcoin network client? |
| 16:18 | dbasch | kenrestivo: dogecoind |
| 16:18 | kenrestivo | with REST from clojure, i suppose? |
| 16:19 | dbasch | kenrestivo: yes, https://github.com/aviad/clj-btc |
| 16:19 | kenrestivo | well done, glad to see someone doing that |
| 16:23 | dbasch | kenrestivo: that’s not mine btw |
| 16:23 | justin_smith | oooh - lein search gives a stack trace when you do "lein search _" |
| 16:25 | justin_smith | technomancy: lucene barfs on "lein search _" https://www.refheap.com/79444 worth a bug report or just a pointless corner case? |
| 16:26 | technomancy | justin_smith: how about a patch? =) |
| 16:26 | justin_smith | hah |
| 16:26 | justin_smith | I'll consider it |
| 16:27 | technomancy | bug report would be fine |
| 16:27 | gfredericks | justin_smith: you should whole-heartedly commit to intending to do it |
| 16:27 | justin_smith | is lein search part of the main lein repo? |
| 16:28 | justin_smith | gfredericks: I am setting aside the procrastination time in my calendar as we speak |
| 16:28 | justin_smith | answering my own question: yes |
| 17:08 | dbasch | technomancy: lein search works fine in a random directory, but if I run it inside a project of mine this happens: https://www.refheap.com/79475 |
| 17:09 | technomancy | dbasch: do you have :repositories set in there? |
| 17:09 | dbasch | yes |
| 17:09 | technomancy | to a server that isn't returning proper response codes for not-found? |
| 17:09 | dbasch | technomancy: probably |
| 17:09 | dbasch | if I remove repositories it works fine |
| 17:10 | technomancy | still would be better to get an error message instead of a stack trace |
| 17:10 | technomancy | feel free to open an issue |
| 17:10 | dbasch | ok |
| 17:18 | eraserhd | tbaldridge: Is there something in tools.analyzer to pretty-print an AST (that terminates :). Also, is there a pre-existing function to reconstitute source forms from a modified AST? |
| 17:24 | tbaldridge | on the latter it something like emit-clj and it's in the analyzer codebase. |
| 17:24 | tbaldridge | on the first, it pretty-prints if you do a pre/post walk and rip out all the :env values |
| 17:25 | eraserhd | tbaldridge: Cool. Thanks again. |
| 17:29 | Bronsa | eraserhd: if you're using t.a.j/analyze, it already strips the :ns key in :env so there's no problem in prining that |
| 17:30 | Bronsa | eraserhd: also what tbaldridge was talking about is https://github.com/clojure/tools.analyzer.jvm/blob/master/src/main/clojure/clojure/tools/analyzer/passes/jvm/emit_form.clj |
| 17:30 | tbaldridge | ah there we go, it's in the jvm source |
| 17:30 | danlamanna | seems to be nothing out there with regards to comparing binary files in clojure |
| 17:30 | Bronsa | tbaldridge: it's in both, the jvm one simply adds support for the jvm specific ops |
| 17:31 | stompyj | kenrestivo: we never REST here in the clojure community! |
| 17:33 | dbasch | danlamanna: if they are not huge, you can just slurp them and compare them |
| 17:34 | Frozenlock | stompyj: That's why we are FIRST |
| 17:34 | dbasch | danlamanna: otherwise you’d have to read them lazily |
| 17:34 | stompyj | LOL |
| 17:34 | stompyj | i regret nothing! |
| 17:34 | danlamanna | dbasch: may or may not be, i think i'm going to follow http://www.jguru.com/faq/view.jsp?EID=66830 as a guideline. |
| 17:40 | eraserhd | Bronsa: I didn't think to use t.a.j analyze, I'm just using t.a analyze. Hrmm... should I be? |
| 17:40 | Bronsa | eraserhd: if you want to analyze clojure source, yes |
| 17:40 | eraserhd | I guess supporting clojurescript is a future concern to not worry about now. |
| 18:00 | dbasch | danlamanna: you can optimize this for performance, but it works https://www.refheap.com/79493 |
| 18:00 | rukor | hi please which unit testing framework would you recommend, ive seen clojure.test, midje and speclj and am leaning towards speclj |
| 18:02 | egghead | grr, fighting with jsch :( |
| 18:03 | technomancy | rukor: clojure.test would be my recommendation |
| 18:04 | rukor | technomancy: thanks, are you able to quickly indicate why |
| 18:06 | technomancy | rukor: midje is a lot more complicated and does fancy things that look neat but often cause difficult-to-debug error messages. I don't know much about speclj; it doesn't seem widely used. |
| 18:06 | rukor | technomancy: thanks, that makes a lot of sense based on what Ive seen so far. |
| 18:06 | technomancy | clojure.test is very obvious how it works |
| 18:08 | rukor | yes |
| 18:10 | seangrove | given {:x 10 :y {:z 20}}, how can I destructure x y and z in a single destructuring statement? |
| 18:13 | guns | seangrove: {x :x y :y {z :z} :y} |
| 18:13 | Bronsa | guns: does that really work? |
| 18:13 | Frozenlock | ,(let [a {:x 10 :y {:z 20}}] (let [{x :x y :y {z :z} :y} a] [x y z])) |
| 18:13 | amalloy | Bronsa: should, yeah |
| 18:13 | clojurebot | [10 {:z 20} 20] |
| 18:13 | justin_smith | guns - extraneous :y in there |
| 18:13 | amalloy | guns, well, {x :x {z :z :as y}} would be more normal though |
| 18:14 | Bronsa | uh. |
| 18:14 | amalloy | {x :x {z :z :as y} :y} |
| 18:14 | guns | TIL |
| 18:14 | seangrove | Ah, interesting, I always use {:keys [...]}, didn't know this syntax before |
| 18:14 | Frozenlock | seangrove: same here |
| 18:14 | amalloy | seangrove: :keys is shorthand for this |
| 18:14 | justin_smith | ,(let [{x :x y :y {z :z} :y} {:x 10 :y {:z 20}}] [x y z]) |
| 18:14 | clojurebot | [10 {:z 20} 20] |
| 18:14 | turbofail | hm. is requiring the same namespace from multiple threads a Bad Idea™? |
| 18:14 | seangrove | amalloy: Good to know |
| 18:14 | amalloy | see also :syms, :strs |
| 18:15 | justin_smith | I totally would not have intuited that the above would work |
| 18:15 | gtrak | turbofail: this is clojure. |
| 18:15 | Frozenlock | Must have missed it in the official Clojure manual™ |
| 18:15 | hiredman | turbofail: multithreaded code loading is a bad idea |
| 18:15 | justin_smith | given the usual map rules etc. |
| 18:15 | amalloy | justin_smith: actually, making this work is one of the reasons destructuring syntax looks the way it does |
| 18:15 | justin_smith | interesting |
| 18:15 | justin_smith | ahh the two :y instances are rhs, n/m |
| 18:15 | amalloy | {:y y, :y {:z z}} is the alternative syntax, right? but you can't write that because it has a duplicate key |
| 18:16 | turbofail | ok guess i'll stick a lock on it then |
| 18:16 | justin_smith | amalloy: oh yeah, makes much more sense now |
| 18:16 | amalloy | but you'll never want to give the same local name to two values, so the actual syntax has no such conflicts |
| 18:16 | gtrak | turbofail: transitive ns's won't get eval'd multiple times, if you're using require. probably best to keep it simple. |
| 18:16 | seangrove | amalloy: Can you then mix that and {:keys ..} ? |
| 18:16 | amalloy | naturally |
| 18:17 | amalloy | {:keys [x y] {:keys [z]} :y} is another way to write it |
| 18:17 | seangrove | (fn [idx {layout :layout {:keys [offer-width offer-height row col row-span col-span]} :layout :as child}]) |
| 18:17 | seangrove | I'm not sure if that's a good idea or not. I think probably not. |
| 18:18 | turbofail | gtrak: well the problem is that the same namespace is getting loaded from multiple threads at the same time |
| 18:18 | justin_smith | seangrove: with some well spaced line breaks it is slightly better, but probably simpler to read if broken up a bit into let clauses |
| 18:18 | gtrak | yea, that's a risk until it's fully loaded, seems like |
| 18:18 | seangrove | justin_smith: Yeah, splitting it up |
| 18:19 | turbofail | it actually works OK right up until i have a macro-defining macro, and then it starts throwing "can't take a value of a macro" things around |
| 18:19 | oinksoft | how do i make a clojure macro refer to itself? i'm having trouble getting a macro to work that should expand itself with default parameters |
| 18:20 | Bronsa | oinksoft: (defmacro x ([] `(x ..)) ..) |
| 18:20 | justin_smith | the easy way is probably to make a recursive function invoked by the macro |
| 18:20 | Bronsa | oinksoft: you really don't want to do things like (defmacro x ([] (x ..)) ..) |
| 18:21 | oinksoft | Bronsa: why is that? |
| 18:22 | justin_smith | extra effort and complexity, with no added functionality |
| 18:22 | Bronsa | oinksoft: because x is not already a macro inside the defmacro body |
| 18:22 | Bronsa | justin_smith: plus it doesn't work :P |
| 18:22 | justin_smith | ahh, fair enough :) I would know that if I had seen fit to try I guess :) |
| 18:23 | amalloy | Bronsa: eh? x is a macro inside its body. it's just not one you typically want to use |
| 18:23 | Bronsa | amalloy: nope, defmacro expands to (do (defn x ..) (.setMacro #'x true)) |
| 18:23 | oinksoft | yes, best practice. ok, so how *do* i do what i said i want to do? |
| 18:23 | Bronsa | it's still a function inside the body |
| 18:24 | justin_smith | oinksoft: macros are for special evaluation rules - do that and only that in the macro, and put all actual runtime logic in a function |
| 18:24 | Bronsa | oinksoft: I already told you how in my first reply |
| 18:24 | oinksoft | Bronsa: and said it was a bad idea? |
| 18:24 | amalloy | that's really interesting. i knew that, but i hadn't thought about what it meant for referring to x inside its own body |
| 18:24 | oinksoft | this is what i have now, it doesn't even run. http://www.bpaste.net/show/ykUCiove4b1TQNBDkSvx/ |
| 18:25 | Bronsa | oinksoft: no, that was about my second reply. `(x) vs (x) |
| 18:25 | oinksoft | oh, ok |
| 18:25 | oinksoft | well i guess i was doing the right thing, but this results in a very informative error about not being able to make ISeq from symbol |
| 18:26 | justin_smith | ~@ should be ~ |
| 18:26 | clojurebot | No entiendo |
| 18:26 | Bronsa | oinksoft: unless you actually want your macro to be invoked like (deflogger [something] ..), drop the @ |
| 18:26 | justin_smith | `(~@(:a :b) :c) |
| 18:26 | justin_smith | ,`(~@(:a :b) :c) |
| 18:26 | clojurebot | (:c) |
| 18:27 | justin_smith | ,'`(~@(:a :b) :c) |
| 18:27 | clojurebot | (clojure.core/seq (clojure.core/concat (:a :b) (clojure.core/list :c))) |
| 18:27 | hyPiRion | justin_smith: what are you trying to do? (:a :b) returns nil |
| 18:27 | justin_smith | ahh of course :P |
| 18:27 | justin_smith | ,`(~@[:a :b] :c) |
| 18:27 | clojurebot | (:a :b :c) |
| 18:27 | justin_smith | got my quoting mixed up |
| 18:28 | justin_smith | ,`(~@:a :b :c) ; this is your error oinksoft |
| 18:28 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Keyword> |
| 18:28 | oinksoft | Bronsa: which one? that's what i always ask clojure too. |
| 18:28 | Bronsa | oinksoft: read above what justin_smith told you |
| 18:28 | justin_smith | there shouldn't be any ~@ in that code, it should always be ~ |
| 18:30 | oinksoft | got it, thanks |
| 18:31 | oinksoft | i don't understand this. i thought ~@ is when you want to include an variable inline, in a list |
| 18:31 | justin_smith | (defmacro deflogger [name & args] `(def ~name (apply new-logger ~args))) |
| 18:31 | justin_smith | then define new-logger with multiple arities |
| 18:31 | justin_smith | much cleaner |
| 18:32 | oinksoft | i see, thanks |
| 18:33 | oinksoft | clojure.core/name is defined. shouldn't i not define variables called "name"? |
| 18:33 | justin_smith | it's fine unless the same function needs the name function |
| 18:33 | justin_smith | fair point though, if something is clear and isn't in clojure.core that is likely better |
| 18:34 | oinksoft | ok, thanks, just brought it up because i keep wanting to name vars `name' but my editor hihglights it to remind me it's in core |
| 18:34 | justin_smith | I just felt like the name of the macro on the preceding line already tells you about deflogger, so putting that in the name is just noise |
| 18:34 | oinksoft | i agree |
| 18:34 | oinksoft | why did removing the @ fix the macro? |
| 18:35 | justin_smith | did you see my demo above of what @ does? |
| 18:35 | Bronsa | i wish locals shadowing vars would emit a warning. I've wasted quite some time one day debugging a macro that I wrote that shadowed `name` and then I used it a good amount of numbers above. |
| 18:36 | oinksoft | hm clojure core code doesn't seem shy about using `name' |
| 18:36 | oinksoft | i was looking for example code, what poeple call variable names :) |
| 18:36 | oinksoft | interesting Bronsa |
| 18:36 | TimMc | Bronsa: I think using a linter would probably be a better choice. |
| 18:36 | justin_smith | I also blatantly call things "count" |
| 18:37 | TimMc | count, name, class, type... |
| 18:37 | lemonodor | i liked the CL earmuff thing for globals/specials, which prevented collisions with local vars. |
| 18:37 | TimMc | come at me bro |
| 18:37 | amalloy | i give all my global functions one-letter names, so they don't conflict with my descriptive local-variable names |
| 18:37 | lemonodor | but it seems that clojure convenion is earmuffs only for vars that you expect users to want to rebind? |
| 18:37 | hyPiRion | TimMc: klass plz. |
| 18:38 | TimMc | clazz |
| 18:38 | justin_smith | cnt is delightfully ambiguous |
| 18:38 | oinksoft | um justin_smith your last example seems to leave out defaulting the first arg to a default value |
| 18:38 | oinksoft | was that intentional? did i miss something? |
| 18:39 | hyPiRion | justin_smith: oh my, you just made me realise this. My master thesis uses `cnt` as the size variable. |
| 18:39 | justin_smith | ahh, the function can't do that based on arg count? |
| 18:39 | justin_smith | better lawyer up before HR gets on your case |
| 18:39 | justin_smith | (or the academic equiv.) |
| 18:40 | hyPiRion | justin_smith: it's of no worry. If they want to wade through 6k lines of C code with worse #ifdef usage than OpenSSL, they are free to do so. |
| 18:41 | justin_smith | oinksoft: if the fn is already multi-arity I would be inclined to make the fn take one arg or two, and with a collection as the second arg - then take out apply |
| 18:41 | justin_smith | but I am very eager about taking any complexity out of macros that I possibly can, ymmv |
| 18:42 | oinksoft | justin_smith: i have no idea what you meant by that |
| 18:42 | oinksoft | justin_smith: your comments about lawyers/HR/academia |
| 18:42 | l1x | hi |
| 18:42 | justin_smith | oinksoft: cnt as an abbreviation for count is ambigous and to some readers may be seen as offensive / sexist |
| 18:43 | justin_smith | it was a joke, probably too subtle |
| 18:43 | l1x | i have a list (1 2 3 4 5) I need to get pairs from the list like (1 2) (2 3) (3 4) (4 5) what is the best function to do that |
| 18:43 | oinksoft | yea, maybe w/ more time using clojure i'll get it :) |
| 18:44 | oinksoft | thanks again |
| 18:44 | justin_smith | ,(partition 2 1 [1 2 3 4 5]) |
| 18:44 | clojurebot | ((1 2) (2 3) (3 4) (4 5)) |
| 18:44 | hyPiRion | oinksoft: It's not Clojure-related: If you accidentally forget the o in count, you know.. |
| 18:44 | justin_smith | oinksoft: np |
| 18:44 | l1x | thanks justin |
| 18:45 | justin_smith | np |
| 18:45 | hyPiRion | I think rhickey seriously decided to name what now is named cond-> to cont->, but when someone in IRC read it out loud and his coworkers laughed, that name was quickly dismissed |
| 18:46 | hyPiRion | yeah, http://clojure-log.n01se.net/date/2012-10-12.html#16:08a |
| 18:46 | justin_smith | it may sound like a Japanese name out loud Kontaro |
| 18:53 | rasmusto | (inc partition) |
| 18:53 | lazybot | ⇒ 1 |
| 18:55 | rasmusto | (inc ergo->) |
| 18:55 | lazybot | ⇒ 1 |
| 18:56 | justin_smith | ergo->? |
| 18:56 | rasmusto | justin_smith: was one of the names pitched in those irc logs, made me chuckle |
| 18:56 | justin_smith | ,(resolve 'ergo->) |
| 18:56 | clojurebot | nil |
| 18:56 | justin_smith | ahh |
| 18:57 | justin_smith | assuming-> |
| 18:57 | rasmusto | hence-> |
| 19:40 | egghead | huh |
| 19:40 | egghead | I've got some code that works in a clj repl but not in my main method... what gives |
| 19:41 | justin_smith | does it involve a call to for, or map? |
| 19:42 | amalloy | egghead: i'm with justin_smith on this. you're doing something lazy, which gets forced when the repl tries to print the result |
| 19:43 | egghead | uggu, I wish this problem didn't rear it's head in such a gnarly way |
| 19:43 | egghead | i'm not using map or anything like that, but I am using futures |
| 19:44 | joegallo | how about you gist your code? |
| 19:45 | seangrove | dnolen_: Heh, I was just talking with the Meteor guys about Mori yesterday, they seemed pretty excited about it |
| 19:45 | dnolen_ | seangrove: yeah I got a pretty nice email from one of the devs, looks like they got a big performance boost out of it |
| 19:51 | gfredericks | streaming (jdbc) db query results from an http service takes a surprising amount of extra work |
| 19:52 | Frozenlock | eh.. I'm still in the 'anything' takes a surprising amount of extra work. :-p |
| 19:52 | pdurbin | dnolen_: you're the one who was on http://thinkrelevance.com/blog/2014/04/10/david-nolen-cognicast-episode-054 ? great episode |
| 19:52 | dnolen_ | pdurbin: yep, thanks |
| 19:53 | pdurbin | dnolen_: you prompted me to listen to this: ▶ Pete Hunt: React: Rethinking best practices -- JSConf EU 2013 - YouTube - https://www.youtube.com/watch?v=x7cQ3mrcKaY |
| 19:53 | hiredman | gfredericks: is it really that surprising? |
| 19:53 | gfredericks | hiredman: in as much as I am surprised, yes |
| 19:53 | hiredman | gfredericks: are you paginating? |
| 19:53 | dnolen_ | pdurbin: yep that's a pretty awesome talk |
| 19:54 | gfredericks | hiredman: no |
| 19:54 | egghead | derp |
| 19:54 | hiredman | gfredericks: using ring? |
| 19:54 | egghead | try finally, future value, close the connection the future is delivered on |
| 19:54 | gfredericks | hiredman: yep |
| 19:54 | egghead | WHOOPS |
| 19:54 | hiredman | gfredericks: ah, well, streaming with ring is tricky |
| 19:55 | gfredericks | ditto for java.jdbc/postgres |
| 19:55 | pdurbin | dnolen_: yeah. I enjoyed it. Next I'm thinking of checking out https://github.com/tastejs/todomvc/tree/gh-pages/architecture-examples/react |
| 20:00 | dnolen_ | pdurbin: it's good stuff, #reactjs is great many of the core React devs and many friendly users hang out there |
| 20:17 | pdurbin | dnolen_: ah. thanks |
| 20:19 | bbloom | Bronsa: are there clj-in-clj ports of the data structures anywhere besides cljs? |
| 20:19 | bbloom | Bronsa: and gvec |
| 20:20 | Bronsa | bbloom: uhm, not complete that I know of. There's https://github.com/mylesmegyesi/clojure.core/ but I don't think it's even remotely complete |
| 20:21 | TEttinger | clojurec |
| 20:22 | Bronsa | TEttinger that's really just cljs |
| 20:23 | bbloom | ok thanks guys, i'll just work off cljs |
| 20:23 | TEttinger | yeah, good point |
| 20:23 | TEttinger | https://github.com/schani/clojurec for reference |
| 20:23 | bbloom | it's really a shame we don't have a good cross-plat story that we need to repeat this work everywhere |
| 20:24 | bbloom | i'm going to attempt to make eclj work such that the standard if statement works w/ class-plat thanks to partial evaluation |
| 20:24 | bbloom | & abstract interpretation... ie don't barf if a symbol is undefined on a known not to run code path |
| 20:24 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: abstract in this context |
| 20:24 | bbloom | going to take a crack at trying to boot up core under my metacircular interpreter tomorrow :-) |
| 20:25 | bbloom | (after a weekish of no meaningful work done :-P) |
| 20:26 | TEttinger | bbloom: metacircular like maru? |
| 20:26 | TEttinger | there's a few small lisps I have seen that use metacircular runtimes. Maru and Tort are two of them, Maru does work on windows |
| 20:27 | bbloom | TEttinger: no compiler yet, but that's the goal |
| 20:28 | TEttinger | pretty sure bbloom is one of several people up to the task in here. myself not one of them |
| 20:28 | Bronsa | bbloom: good luck w/ loading core. IIRC if you don't get def metadata handling right it might choke when redefining `fn` |
| 20:29 | Bronsa | at least, that's what happened the first time I tried with t.e.j |
| 20:29 | bbloom | thanks guys :-) |
| 20:33 | gfredericks | clojurebot: t.e.j is tools.enterprise.java |
| 20:33 | oinksoft | OK, what does this combination of destructuring do? (defn f [& [a & {:keys [k]}] ...). I know what & and :keys mean in the basic case |
| 20:33 | clojurebot | In Ordnung |
| 20:34 | gfredericks | oinksoft: a is the first arg, the rest of them are collected into a map, and the :k key is destructured |
| 20:34 | oinksoft | gfredericks: what is the [& [a for? |
| 20:34 | oinksoft | gfredericks: rather than [a |
| 20:34 | amalloy | oinksoft: what gfredericks said, but i'd also add that that kind of & nonsense is pretty tacky imo |
| 20:34 | gfredericks | it allows calling with no args |
| 20:34 | gfredericks | ,(defn f [& [a & {:keys [k]}]] [a k]) |
| 20:34 | clojurebot | #'sandbox/f |
| 20:34 | gfredericks | ,(f) |
| 20:34 | clojurebot | [nil nil] |
| 20:35 | gfredericks | ,(f 1 :foo 12 :k 39) |
| 20:35 | clojurebot | [1 39] |
| 20:35 | gfredericks | ,(f 42) |
| 20:35 | clojurebot | [42 nil] |
| 20:35 | oinksoft | so people do [& [a & [b & [c]]] to get a function with 0-3 params? |
| 20:35 | gfredericks | [& [a b c]] does the same thing |
| 20:35 | oinksoft | it would seem that form can't accept 1 or 2 |
| 20:35 | gfredericks | ,(defn g [& [a b c]] [a b c]) |
| 20:35 | clojurebot | #'sandbox/g |
| 20:35 | gfredericks | ,(g :one-arg) |
| 20:35 | clojurebot | [:one-arg nil nil] |
| 20:35 | Bronsa | ,(let [[a b c] [1]] [a b c]) |
| 20:36 | clojurebot | [1 nil nil] |
| 20:36 | oinksoft | neat |
| 20:36 | Bronsa | ,(let [[a b c] [1 2 3 4]] [a b c]) |
| 20:36 | clojurebot | [1 2 3] |
| 20:36 | gfredericks | that's just how destructuring works, not a specific feature of functions |
| 20:36 | gfredericks | any function that starts with [& ...] can take any number of args |
| 20:37 | gfredericks | I will join amalloy in grumping at you if you write functions like that |
| 20:37 | amalloy | i always write (fn [& [& [& [& [x]]]]] x) to make sure x is really optional |
| 20:37 | oinksoft | back to the original function signature, in which ways could this be called? |
| 20:37 | gfredericks | (inc amalloy) |
| 20:37 | lazybot | ⇒ 103 |
| 20:37 | gfredericks | oinksoft: I gave a bunch of examples up there ^ |
| 20:39 | oinksoft | gfredericks: oh, it's in your first example :) |
| 20:41 | yedi | how would one do this sort of thing in clj (http://stackoverflow.com/questions/286921/efficiently-replace-all-accented-characters-in-a-string) |
| 20:45 | amalloy | yedi: why would you do that? instead, sort the strings according to the right locale |
| 20:45 | justin_smith | ,(apply str (replace {\a \z \b \y} "abba")) ; yedi: |
| 20:45 | clojurebot | "zyyz" |
| 20:46 | yedi | well i don't particularly care about the sorting, i just wanna convert strings into their closest ascii equivalent |
| 20:46 | yedi | since the app i'm building only makes sense for english words |
| 20:46 | justin_smith | there may be a way to do it with string ops only in one pass, which is better than the string / seq / string conversion sequence |
| 20:46 | amalloy | http://stackoverflow.com/a/12889868/625403 |
| 20:46 | yedi | but sometimes ill get strings like Jesús |
| 20:47 | amalloy | and you're really set on 7-bit ascii? i have to say, allowing people to use whatever characters they want seems like a much nicer solution |
| 20:47 | yedi | the app i'm using literally requires english words, since it's based on an english rhyming dictionary |
| 20:48 | seangrove | bbloom: Part of the gripe of absolute vs fixed vs relative in css yesterday http://stackoverflow.com/questions/6794000/fixed-position-but-relative-to-container |
| 20:49 | amalloy | how sure are you there are no "funny characters" in english text? eg, coop is pronounced as one syllable, like a chicken coop; coöp is two syllables, like coöperative |
| 20:50 | amalloy | plus english has incorpororated words like voilà |
| 20:50 | yedi | amalloy: you're definitely right, but it doesn't seem that this takes that into account: https://raw.githubusercontent.com/yedi/rhyme-finder/master/resources/cmudict.txt |
| 20:51 | yedi | i couldn't find a separate coöp |
| 20:51 | yedi | but that doesn't mean i shouldn't allow ppl to add their own pronunctiations to the dictionary that are missing |
| 20:51 | amalloy | so you have an input word that you want to look up in someone else's rudely-ascii rhyming dictionary |
| 20:52 | yedi | yea essentially (Carnegie Melon's Rhyming Dictionary, i think it's the most comprehensive one for the english language) |
| 20:52 | amalloy | i think the only realistic thing you can do is what justin_smith suggested: a manually-defined list of character substitutions you want to do |
| 20:52 | amalloy | unicode is wide and weird, and an automated solution will do really surprising things |
| 20:53 | yedi | i think i agree with you though, i can always add new entries to that dictionary so it should support other characters. So i'll find an alternate way to fix that issue |
| 20:54 | justin_smith | ,{\☃ "snowman"} |
| 20:54 | clojurebot | {\☃ "snowman"} |
| 20:54 | amalloy | like there are stupid characters such as http://www.fileformat.info/info/unicode/char/2075/index.htm: SUPERSCRIPT FIVE |
| 20:54 | amalloy | and java will tell you that's a digit whose value is 5 |
| 20:54 | justin_smith | that is useful⁵ |
| 20:55 | dbasch | one of the most abused features of unicode on twitter and facebook: uʍop-ǝpısdn |
| 20:55 | oinksoft | i am positively tickled that core has a function named lazy-cat. |
| 20:56 | justin_smith | sadly, stupid-hyper-dog was vetoed |
| 20:58 | justin_smith | stupid-hyper-dog was of course a pointless function that chased its own tailcall |
| 20:58 | yedi | amalloy justin_smith: it would be cool if there was a list of all those kinds of odd characters that are used in english words |
| 20:58 | yedi | then i could add them to my letter parsing regex |
| 20:59 | justin_smith | yedi: do you use emacs? |
| 20:59 | amalloy | i prefer to think of english as an infinite fractal of constantly fluctuating word-theft |
| 20:59 | amalloy | anytime you think you can apply logic to english, you start down the wrong path |
| 21:00 | justin_smith | yedi: if so M-x insert-char <tab><tab> then go to the prompt buffer and save it and... - actually there is probably a better way to that |
| 21:00 | justin_smith | *to do that |
| 21:01 | gfredericks | hey where was that regex that matched english words |
| 21:01 | yedi | (dced, did i miss something?) |
| 21:02 | justin_smith | gfredericks: it had false positives |
| 21:02 | gfredericks | justin_smith: :P I think it was just generated from a word list, so your claim is *LITERALLY IMPOSSIBLE* |
| 21:03 | justin_smith | false positive as in it matched words not in the list |
| 21:03 | justin_smith | or was it really that specific? |
| 21:03 | yedi | funnily enough i came across this earlier today: https://github.com/noprompt/frak |
| 21:03 | amalloy | gfredericks: in the "not at all news" category, i heard on npr yesterday that someone had written a chrome extension to replace all occurrences of "literally" with "figuratively" |
| 21:04 | justin_smith | not as good as the classic cloud-to-butt extension |
| 21:04 | amalloy | i have had that installed for a few months |
| 21:04 | dbasch | (def lazy-cat (repeat "😺")) |
| 21:04 | amalloy | the occasional giggles are totally worth the confusion |
| 21:05 | dbasch | ,(take 10 (repeat "😺”)) |
| 21:05 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading string> |
| 21:05 | justin_smith | amalloy: slightly less rofl, but still interesting, an old friend made a chrome extension that removes all numbers from the facebook UI |
| 21:05 | dbasch | ,(take 10 (repeat "😺")) |
| 21:05 | clojurebot | ("😺" "😺" "😺" "😺" "😺" ...) |
| 21:05 | amalloy | i don't use facebook, so the utility of this is not as obvious to me as it must have been to your friend |
| 21:06 | Platz | 1.5M regex, yep |
| 21:06 | gfredericks | somebody should make a generic chrome extension for word substitutions |
| 21:06 | gfredericks | would be great for pranks |
| 21:06 | justin_smith | facebook uses metrics to "gamify" the experience, so replacing numbers helps subvert that aspect |
| 21:06 | gfredericks | swap the names of the two major candidates during major election cycles, etc |
| 21:09 | seangrove | bbloom: Alright, grid, align, vertical/horizontal stack all ported over, and the debugger is laying itself out now http://dl.dropbox.com/u/412963/Screenshots/dx.png |
| 21:10 | yedi | woah what is that seangrove |
| 21:10 | amalloy | i don't understand that at all either, but it looks pretty cool |
| 21:10 | justin_smith | gfredericks: is this the one? https://gist.githubusercontent.com/noprompt/6106573/raw/fcb683834bb2e171618ca91bf0b234014b5b957d/word-re.clj |
| 21:11 | gfredericks | justin_smith: prollably |
| 21:11 | seangrove | yedi: It's our time-traveling debugger + layout manager + event simulator + state inspector |
| 21:11 | yedi | well them |
| 21:11 | yedi | then* |
| 21:11 | justin_smith | gfredericks: so far, slurping that file into clojure and making it an re, it matches cat but not cats |
| 21:11 | seangrove | yedi: To show an example https://dl.dropboxusercontent.com/u/412963/zensight/time_travel.mp4 /ht dnolen_ |
| 21:11 | justin_smith | checking for false positives |
| 21:12 | amalloy | cats might not be a word |
| 21:12 | justin_smith | haha, it matches cond |
| 21:12 | yedi | seangrove: that is going to be killlllller |
| 21:12 | justin_smith | maybe because it was written using clojure :) |
| 21:12 | seangrove | yedi: That video was pre-layout manager. Just finished up porting a proper recursively-pluggable layout manager system |
| 21:13 | justin_smith | matches consolidate but not consolidating |
| 21:13 | justin_smith | seems it doesn't attempt to cover conjugations, makes sense |
| 21:13 | gfredericks | justin_smith: that's false negatives no? |
| 21:13 | seangrove | That was the last *big* piece before things could be really cleaned up. Pretty excited to clean up and start optimizing for speed, I think we can edge out the default Om strategy if React opens up the right hooks, plus building reusable components this way is just a thing of beauty |
| 21:13 | justin_smith | gfredericks: yeah |
| 21:14 | amalloy | makes sense??????? it should just cover whatever's in /usr/dict/words, which should include most conjugations |
| 21:14 | seangrove | Serializable state and time-traveling is just icing on the cake :) |
| 21:14 | justin_smith | gfredericks: first false positive: catting |
| 21:14 | gfredericks | justin_smith: http://en.wiktionary.org/wiki/catting#English |
| 21:15 | gfredericks | this regex speaks english better than you do :P |
| 21:15 | justin_smith | I guess so |
| 21:15 | justin_smith | cond is still an issue though |
| 21:16 | gfredericks | amalloy: somehow my computers never have /usr/dict/words |
| 21:16 | justin_smith | unless it also includes abbrevs |
| 21:16 | amalloy | gfredericks: i forgot where it's stored. it's actually in /usr/share/dict/words for me |
| 21:16 | gfredericks | ah there it is |
| 21:16 | gfredericks | I copied mine into a git repo a while ago |
| 21:17 | amalloy | http://www.merriam-webster.com/dictionary/cond |
| 21:17 | gfredericks | would be fun to get a corpus from different languages and search for the smallest regex that matches one language but not the other >95% of the time |
| 21:17 | justin_smith | it is inconsistent with conjugations - either having catting or lacking dogging is an error |
| 21:18 | justin_smith | amalloy: I explicitly mentioned abbrevs |
| 21:18 | justin_smith | it is an abbrev |
| 21:18 | yedi | seangrove: oh man, i can't wait till i can play with it |
| 21:18 | gfredericks | clojurebot: either having catting or lacking dogging is an error |
| 21:18 | clojurebot | Roger. |
| 21:19 | justin_smith | I am glad I finally thought to try this re out |
| 21:19 | justin_smith | err rather, was inspired |
| 21:19 | seangrove | yedi: To be honest, bbloom has done ~90% of the work on the layout stuff, I just want it more than him right this moment |
| 21:19 | dbasch | it doesn’t match antidisestablishmentarianism |
| 21:19 | amalloy | that's just antidisestablishmentarianism refusing to match |
| 21:19 | justin_smith | also does not match caked |
| 21:20 | dbasch | disestablishmentarianism doesn’t match either, they can’t both agree |
| 21:20 | bbloom | seangrove: were you able to basically copy paste my code in to om land and get it to work? |
| 21:21 | bbloom | seangrove: or was there some mismatch you had to patch up? |
| 21:21 | dbasch | justin_smith: but it matches caker (?) |
| 21:21 | justin_smith | one of my favorite things is the unit test in gnu grep that tests an re that matches like 20 different spellings of muammar gaddafi's name |
| 21:22 | dbasch | caker is not a word |
| 21:22 | seangrove | bbloom: No major mismatches, just a few things to get it tied into our tree structure. Other than that, just grokking all the (admittedly simple) concepts was the major difficulty |
| 21:22 | justin_smith | (all of which used by some english language newspaper at some point) |
| 21:22 | bbloom | seangrove: took me months to make sense of it in my head :-) |
| 21:23 | justin_smith | dbasch: perhaps debatable https://www.google.com/search?q=regex+maumar+khadaffi&oq=regex+maumar+khadaffi&aqs=chrome..69i57.5680j0j4&sourceid=chrome&es_sm=93&ie=UTF-8#q=define:caker&safe=off |
| 21:23 | seangrove | bbloom: It's not too horrendous, even though I'm still shakey. And I'm sure that *using* it is much simpler than implementing it all, especially with the right tools for immediate feedback |
| 21:23 | bbloom | seangrove: pretty cool that it just mapped over considering i had written that back when i had only hypothesized the design of react.js! |
| 21:23 | amalloy | huh. your previous search for define:caker snuck into that url, justin_smith |
| 21:23 | dbasch | google will define anything |
| 21:23 | justin_smith | amalloy: no, that is what I meant to share |
| 21:24 | amalloy | or for khadaffi, whatever |
| 21:24 | dbasch | including proper names |
| 21:24 | justin_smith | oh, ok, weird |
| 21:24 | seangrove | bbloom: Impressive stuff ;) |
| 21:24 | justin_smith | hah |
| 21:24 | bbloom | seangrove: the trickest part of using it is when things don't have a "natural" size, so they wind up being (0,0) or (inf,inf) |
| 21:25 | bbloom | seangrove: but i think that the blend ppl ultimately addressed that with "design size" width/height properties on the standard controls |
| 21:25 | seangrove | bbloom: Virtualized scroll panels will be tricky, I expect. Some of the stuff winjs is doing is pretty fantastic in that regard |
| 21:26 | bbloom | seangrove: early versions of blend would default to align x/y both stretch |
| 21:26 | Frozenlock | seangrove: May I ask what you are talking about? It looks interesting |
| 21:27 | seangrove | Frozenlock: Layout managers for building apps in the browser (or anywhere, really) |
| 21:27 | justin_smith | my webapp library is not letting me return a synthesized document as application/rss+xml - it would be easier to take if I did not know I have commit access to whatever repo this bug is in |
| 21:27 | bbloom | seangrove: later versions defaulted to some fixed initial "design size" and then would force the margins to make that design size work... much nicer user experience b/c you'd get a fixed size thing and add layout behavior to it by other UI means, much better |
| 21:27 | Frozenlock | seangrove: Yes, but one bbloom did? |
| 21:27 | bbloom | Frozenlock: i shared it w/ him privately |
| 21:28 | Frozenlock | ah |
| 21:28 | bbloom | Frozenlock: it's part of a totally half baked UI framework i started on before react.js came out |
| 21:29 | seangrove | bbloom: I'll have to check out blend (or the old version at least). The grid layout was the last major piece before cleaning things up and pulling off some low-hanging optimizations, adding some linting tools, etc. After that, Going to be very interested in what Blend does :) |
| 21:29 | bbloom | seangrove: don't look at the old versions, they got lots of UX badly wrong |
| 21:30 | bbloom | new versions have design issues, but they are like photoshop-level "this shit is too complicated" rather than "this shit is just plain stupid" |
| 21:30 | seangrove | bbloom: Didn't the new version get integrated into VS? |
| 21:31 | bbloom | seangrove: oh yeah, i'm just saying don't look at version < 3 for any msft product ever :-P |
| 21:31 | bbloom | i think i have blend 3 on my windows vm |
| 21:31 | bbloom | dunno what the new VS version is like |
| 21:32 | yedi | hah amalloy |
| 21:32 | arrdem | ooh. nice catch! |
| 21:36 | arrdem | Bronsa: compared to LLVM t.a.jvm is a pleasure to read. thank you. |
| 21:37 | bbloom | arrdem: he's gone, but yes, yes it is a pleasure compared to basically anything else |
| 21:40 | kras | ,(reduce (partial merge-with vector) {} (#(for [x %2] {(% x) x}) #(> % 5) [1 3 6 8])) |
| 21:40 | clojurebot | {true [6 8], false [1 3]} |
| 21:41 | kras | ,(reduce (partial merge-with vector) {} (#(for [x %2] {(% x) x}) #(apply / %) [[1 2] [2 4] [4 6] [3 6]])) |
| 21:41 | clojurebot | {2/3 [4 6], 1/2 [[[1 2] [2 4]] [3 6]]} |
| 21:41 | amalloy | oh man. vector is not a good choice |
| 21:41 | kras | trying to solve a 4clojure problem |
| 21:41 | amalloy | yeah, for that reason |
| 21:41 | TEttinger | t.a.jvm ? |
| 21:41 | bbloom | TEttinger: clojure.tools.analyzer.jvm |
| 21:41 | TEttinger | ah thanks |
| 21:41 | arrdem | TEttinger: https://github.com/clojure/tools.analyzer.jvm/ |
| 21:42 | kras | amalloy: vector anyways seems not right |
| 21:42 | amalloy | kras: you want to convert everything to singleton vectors first, and then combine them in your merge-with. then you won't be changing the data type once per merge |
| 21:42 | kras | it breaks for the second case |
| 21:42 | amalloy | or anyway that's one reasonable and common solution |
| 21:43 | bbloom | arrdem: amusing to me is how much more code there is in jvm than in the main analyzer |
| 21:43 | bbloom | arrdem: most of the complexity in clojure comes from the JVM |
| 21:43 | bbloom | perhaps unsurprising, but amusing all the same |
| 21:43 | arrdem | bbloom: shrug. If we didn't need hardware software would be easy. |
| 21:43 | arrdem | bbloom: I happen to like that complexity, but that's my own crazy =D |
| 21:44 | bbloom | arrdem: hardware does not need to be as complex as it is either :-P |
| 21:45 | arrdem | bbloom: I'll be entertained to see how complex the final JS analyzer is in comparison. My $2 says they'll be close. |
| 21:45 | arrdem | bbloom: hey man... I like my prefetched hardware with multiple caches and out of order processors |
| 21:46 | bbloom | arrdem: assuming he still relies on Google Closure, i expect it to be dramatically simpler b/c we can rely on google for source level optimizations during code gen |
| 21:46 | arrdem | bbloom: fair point. |
| 21:47 | bbloom | much simpler "type system" too |
| 21:47 | TEttinger | if we didn't have hardware who'd make keyboard pants https://www.flickr.com/photos/technomancy/4397554484/in/photolist-7GABJU-kivjUp-kix7eb-kiuGX6-kiuDbi-kiuC5k-kga9Xn-aiZCQ |
| 21:47 | arrdem | (inc TEttinger) |
| 21:47 | lazybot | ⇒ 16 |
| 21:47 | TEttinger | I'm still amazed that people can make their own keyboards |
| 21:47 | jcromartie | nothing like tracking time to the 1/10 hours in three different places |
| 21:48 | arrdem | bbloom: type system. javascript. right. |
| 21:48 | jcromartie | and having to enter "reason codes" to adjust time on the same day |
| 21:48 | jcromartie | EXPLAIN YOURSELF, DRONE |
| 21:48 | bbloom | arrdem: it's got one, but it deserves "quotes" |
| 21:48 | jcromartie | I'm just bitching |
| 21:48 | arrdem | jcromartie: #clojure-social is that way sir |
| 21:49 | arrdem | jcromartie: it's almost as on topic as #emacs! |
| 21:57 | oinksoft | is there sometihng like erlnag's ETS in clojure? |
| 21:59 | arrdem | ,(true 1) |
| 21:59 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn> |
| 21:59 | arrdem | ,(true false) |
| 21:59 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn> |
| 22:00 | arrdem | ,(doc true) |
| 22:00 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.Symbol> |
| 22:05 | kras | amalloy: thanks for the clue |
| 22:05 | kras | ,(reduce (partial merge-with concat) {} (#(for [x %2] {(% x) [x]}) #(apply / %) [[1 2] [2 4] [4 6] [3 6]])) |
| 22:05 | clojurebot | {2/3 [[4 6]], 1/2 ([1 2] [2 4] [3 6])} |
| 22:06 | yedi | anything i should worry about / look out for when converting some of my maps to pmaps? |
| 22:07 | arrdem | yedi: benchmark everything and make sure it's actually a win |
| 22:22 | Frozenlock | yedi: There's a single case where I used pmap with a major win; when the function called was retrieving data from different endpoints over the network. |
| 22:23 | danneu | Frozenlock: did you use futures or something to hit the endpoints in parallel with pmap? |
| 22:23 | seangrove | Frozenlock: Wouldn't futures work better? |
| 22:23 | Frozenlock | danneu: no |
| 22:24 | Frozenlock | seangrove: perhaps |
| 22:25 | seangrove | Frozenlock: No worries, if pmap works for you :) |
| 22:25 | dbasch | seangrove: pmap is implemented with futures |
| 22:25 | danneu | sometimes i yearn for a 'pmap for io' like (pooled-map send-request! all-urls {:threads 4}) |
| 22:26 | seangrove | dbasch: But it's limited to cpu-cores + 2 or something, I believe |
| 22:26 | seangrove | If you're not CPU-bound, might be better off managing your pool |
| 22:26 | Frozenlock | Stop complicating my code! :-p |
| 22:30 | dbasch | danneu, seangrove: that would be pretty easy to implement |
| 22:31 | dbasch | all you have to do is take the pmap code and remove the restriction |
| 22:42 | amalloy | dbasch: don't forget to fix the OS scheduler so that spinning up a million threads isn't expensive |
| 22:47 | amalloy | also, an unbounded version of pmap can potentially hold the head of the entire sequence at once, which currently pmap doesn't do |
| 22:50 | amalloy | the point is that attempts to superficially fix pmap don't lead to a pmap that's more useful than the existing one, just to versions of pmap that are useless in novel ways |
| 22:54 | oinksoft | what is the idiom for some default reference? i see in korma the use of a @_default, which is being driven by the transaction macro. are macros the way to make this api? or bindings, or something else? |
| 22:54 | oinksoft | https://github.com/korma/Korma/blob/master/src/korma/db.clj#L7 |
| 22:57 | dbasch | amalloy: my point is that you could create a pmap that is optimized for I/O instead of cpu. Sure, it wouldn’t be trivial. |
| 23:01 | oinksoft | i could see this being done w/ binding, and precondition to ensure *default-whatever* is not nil? i dunno |
| 23:02 | akhudek | oinksoft: are you asking about general api advice? If so I would use java.jdbc as a reference rather than korma |
| 23:03 | oinksoft | akhudek: no, i want my api to look like (defwhatever bizbaz ...), which sets some global value to bizbaz for convenience |
| 23:04 | oinksoft | akhudek: korma does this using macros but i think maybe korma is overusing macros? but this seems like it is a common thing in clojure code, i see other code with global atom refs shared by some functions |
| 23:04 | oinksoft | akhudek: i figured people who write APIs using this would know very quickly what the cleanest solution is |
| 23:05 | akhudek | oinksoft: where bizbaz is a var? yeah, you should use a macro to do that. But it is probably worth making a normal function too and then have the macro use that. |
| 23:05 | oinksoft | akhudek: yea, absolutely |
| 23:06 | oinksoft | akhudek: hm ok, actually there is another level to korma because it is storing the connection in jdbc too |
| 23:06 | akhudek | oinksoft: regarding binding, it’s often preferable to just pass values around rather than rely on thread local bindings |
| 23:07 | akhudek | oinksoft: I haven’t looked at it in a while, but korma stored a fair number of global defaults in vars, such as the db connection map, and that pattern can often be annoying. |
| 23:08 | akhudek | oinksoft: in contrast, jdbc requres a db map in every function, which seems more complicated but can often be much simpler e.g. if you have multiple dbs, or your are passing things around to different threads |
| 23:10 | danneu | seangrove: maybe this would work as a fix-pool map - https://www.refheap.com/79544 |
| 23:11 | danneu | well it should be a lazy seq i guess |
| 23:11 | danneu | no it shouldnt |
| 23:21 | danlamanna | if anyone is interested, and wants to judge my first real attempt at functional programming (and clojure) - feel free https://gist.github.com/danlamanna/11240257 |
| 23:31 | amalloy | danlamanna: i'd write #(<= 0 % 2), since that's apparently what you want to validate |
| 23:31 | amalloy | the -1 and 3 are confusing |
| 23:32 | danlamanna | amalloy: yeah, they are, i knew that when i wrote it. not sure why i left it |
| 23:32 | amalloy | danlamanna: (let [x foo] (if (not x) nil y)) is (when-let [x foo] y) |
| 23:33 | amalloy | (> (count x) 0) is (seq x) |
| 23:33 | amalloy | also it's super-weird that you're putting whitespace on the inside of [] bindings |
| 23:33 | guns | danlamanna: And you are also using def for local bindings within functions |
| 23:33 | amalloy | (let [x foo]), not (let [ x foo ]) |
| 23:33 | guns | but +1 for using tools.cli correctly! |
| 23:34 | danlamanna | guns: mostly copy/paste from the example :P |
| 23:34 | danlamanna | amalloy: are you referring to regex-filter for when-let? |
| 23:34 | amalloy | i was looking at size-str-to-bytes, but it's a general point |
| 23:34 | danlamanna | amalloy: still trying to figure out the coding standards. still trying to process that the if and else sexps are indented at the same level. |
| 23:35 | amalloy | yeah, i think guns is right that the most important issue here is using def for locals |
| 23:35 | amalloy | i'm just pointing out minor stylistic issues, whereas his point is about functional programming, which you asked specifically about |
| 23:35 | danlamanna | amalloy guns - yeah i was unsure, not used to let blocks being immutable |
| 23:38 | guns | danlamanna: oh, the :default value in tools.cli is always nil, so you don't need to specify those |
| 23:38 | guns | WRT let blocks, you can bind values sequentially, if that helps |
| 23:39 | danlamanna | guns: for example, in -main - i have to keep a running list of mentioned-files, how would you suggest i keep track of that variable? |
| 23:40 | amalloy | reduce, or loop |
| 23:40 | guns | danlamanna: you don't seem to be using that outside of its lexical scope; use a set #{} and conj/disj |
| 23:40 | guns | or set/union or (into #{} …) |