2016-04-01
| 08:57 | j-pb | Hey does anybody know why transit-clj has the api choice of creating a writer object from a output stream? After browsing though the code it seems that it resets everything (caches) with every write anyways. So why not simply have a write method take an object and a stream? :/ |
| 09:39 | sdegutis | Hmm, I did not anticipate this. |
| 09:40 | sdegutis | Good morning, you /people/. |
| 09:42 | prohobo | dont "you people" me |
| 09:42 | prohobo | you racist |
| 09:43 | sdegutis | Well if you weren't sitting there, acting all human and everything... |
| 09:43 | sdegutis | So this is the thing. |
| 09:44 | sdegutis | I came up with (defprotocol WebFeature (routes[this]) (css[this]) (schema[this])) which is cool cuz that's all my app is made of. |
| 09:44 | sdegutis | But I didn't anticipate that the Cart web-feature's (css) method is like 91 lines long. |
| 09:44 | sdegutis | And the (routes) is around like 350 lines long. |
| 09:45 | sdegutis | So that got pretty ugly pretty quick. |
| 09:45 | sdegutis | Most of it is the single Hiccup-returning function though, which is like 200 lines by itself. |
| 09:49 | prohobo | are you asking for help restructuring your code? |
| 09:50 | sdegutis | I'm just pondering out loud. |
| 09:51 | sdegutis | I guess, all in all, having a fully-featured website Cart in only 550 lines of code is pretty reasonable. |
| 09:51 | sdegutis | It just gives me pause that it's all in one giant-seeming file. |
| 09:51 | sdegutis | And most of it is inside a single defrecord. |
| 09:52 | ToxicFrog | Yank the hiccup into its own file? That's what I've been doing -- one-liners end up routes, then they turn into five-liners and end up as separate functions, then they get longer than that and get their own modules. |
| 09:53 | sdegutis | ToxicFrog: Oh, you just reminded me of Modules! Such a better name than Feature. Thanks, I'll use that. |
| 09:53 | sdegutis | I never liked the name of (defprotocol Feature (routes[this]) (css[this]) (schema[this])) in the web namespace. |
| 09:54 | sdegutis | Feature always seemed too, um, weird. |
| 09:54 | sdegutis | Module makes much more sense here. |
| 09:55 | sdegutis | ToxicFrog: But more to your point, we've had view functions in their own file, e.g. (ns myapp.web.view.cart), for the past 3 years. |
| 09:55 | ToxicFrog | What's the 200 lines of hiccup doing in the routes, then? |
| 09:55 | sdegutis | ToxicFrog: I felt that this separation was a bit excessive and cumbersome, and too often inconvenient. |
| 09:56 | sdegutis | ToxicFrog: So I've been "inlining" the view functions lately. In most cases, the views are much smaller, and are made up of Hiccup components created via function calls, so it's not so bad. |
| 09:56 | sdegutis | ToxicFrog: But in this case, the Cart really has almost no reusable pieces, so it's this giant lump of Hiccup, kind of an outlier in this codebase. |
| 09:57 | ToxicFrog | sdegutis: yeah, at least in my case I'd definitely pull that into a separate function and almost certainly into its own file even if that's not the norm. |
| 09:57 | ToxicFrog | Something that large in the middle of routes is going to require a context switch to read it anyways. |
| 09:57 | sdegutis | Although, I could probably make the Cart and Order model data structures match, and then combine their view-component functions. |
| 09:58 | mgaare | schema is, what, db schema? |
| 09:58 | sdegutis | ToxicFrog: there's very little context switch in Clojure, that's the beauty |
| 09:58 | sdegutis | mgaare: a custom data-based layer describing Datomic install-attribute transactions |
| 09:58 | ToxicFrog | sdegutis: regardless of the syntax used to present it, for me that's a context switch from "reading routing information" to "reading HTML" |
| 09:58 | sdegutis | mgaare: e.g. [[:one :instant :user/last-login-date], [:many :ref :cart/items]] |
| 09:59 | mgaare | ok |
| 09:59 | sdegutis | (that's fake data of course) |
| 09:59 | sdegutis | ToxicFrog: then yeah I agree somewhat |
| 10:00 | sdegutis | ToxicFrog: but in places where the Hiccup is like 5 lines, it makes sense to keep them in the route function itself, because they're so closely related -- when they were separate functions in the past, it just felt unnecessarily decoupled, kind of like separating the yolk from the eggwhite |
| 10:00 | ToxicFrog | sdegutis: yeah, that's fair |
| 10:00 | sdegutis | Meaning, sure, they're different things, but they go together so perfectly |
| 10:00 | sdegutis | But yeah, 200 lines is a bit much. |
| 10:01 | sdegutis | I'm more likely though to just extract the things that make up the cart Hiccup into their own functions, and have it be smaller that way. |
| 10:01 | sdegutis | It's much nicer to have a single line saying (item-list) than a [:table ...] that's 100 lines in itself. |
| 10:05 | sdegutis | amalloy_, justin_smith: are your intermediate namespace names singular or plural when given the choice? |
| 10:06 | sdegutis | Like, in "src/myapp/x/cart.clj", would x be 'modules' or 'module'? |
| 10:19 | justin_smith | sdegutis: only rarely plural, exceptions being things like my.lib.protocols (it defines all the protocols) |
| 10:19 | sdegutis | Ah, hmm. |
| 10:19 | justin_smith | or my.app.routers (defines all the routing data) |
| 10:20 | justin_smith | but if it is named after what it does and not the things it defines, then I avoid plurals |
| 10:23 | sdegutis | justin_smith: hmm, weird |
| 10:23 | sdegutis | justin_smith: not your comment, just, this whole situation |
| 10:37 | sdegutis | Hi. |
| 10:39 | visof | hi guys |
| 10:39 | visof | i have some image with some specific color region, can i filter the image which has this region? |
| 10:39 | visof | is there a good way to do this in clojure? |
| 10:42 | ridcully | isn't opencv the goto lib for stuff like this? |
| 10:44 | visof | ridcully, maybe i can do something simpler imagez can help in this? |
| 10:44 | visof | i'm going to not do complex image processing |
| 10:44 | justin_smith | visof: depends is "color of pixel" good enough, or does it have to have any corellation to what a real human would say is a color? |
| 10:45 | justin_smith | because color perception (the real kind) is complex and hard |
| 10:45 | justin_smith | visof: for example humans always infer shading, refraction, color of light source, and still know the "real" color of the thing |
| 10:48 | sdegutis | Is there a way to tell Cider not to ever eval a certain namespace on cider-refresh? |
| 10:49 | justin_smith | sdegutis: if it uses tools.namespace/refresh, that has whitelist/blacklist options iirc |
| 10:55 | sdegutis | Nice. I'll do that then. |
| 11:02 | sdegutis | justin_smith: actually some-> solved it instead |
| 11:02 | sdegutis | (some-> conn d/db) |
| 11:02 | sdegutis | yay |
| 11:02 | justin_smith | interesting |
| 11:21 | sdegutis | ,(. (java.util.Date.) after (java.util.Date.)) |
| 11:21 | clojurebot | false |
| 11:21 | sdegutis | I like this syntax a lot for Java comparison methods. |
| 11:21 | sdegutis | It's much more natural than this: |
| 11:21 | sdegutis | ,(.after (java.util.Date.) (java.util.Date.)) |
| 11:21 | clojurebot | false |
| 11:21 | sdegutis | I wish > and < had a similar thing. |
| 11:22 | sdegutis | justin_smith: for .after it makes way more logical sense |
| 11:22 | justin_smith | SDEGUTIS: YOU KNOW THIS WILL JUST LEAD TO PRECEDENCE RULES THE PAIN WILL NEVER END |
| 11:23 | sdegutis | justin_smith: your lack of faith is disturbing |
| 11:23 | sdegutis | justin_smith: you underestimate the power of the infix-side |
| 11:34 | hamid | do NOT underestimate the power of the dark side of the force! |
| 11:36 | hamid | anyway :D assuming i have a (def myset (set (range 1000000))) ... does a (set myset) have performance bottleneck since "myset" is already a set? |
| 11:36 | justin_smith | sdegutis: rule of least power, prefix is therefore suprior to infix because it is less powerful https://www.w3.org/2001/tag/doc/leastPower.html |
| 11:36 | justin_smith | hamid: no, it's basically a no-op |
| 11:37 | hamid | justin_smith, awesomeness there it is! |
| 11:37 | hamid | thank you |
| 11:37 | justin_smith | hamid: you can run (source set) in the repl and see for yourself |
| 11:37 | justin_smith | (assuming clojure.repl is in scope, which is the default) |
| 11:37 | hamid | ow |
| 11:38 | hamid | ,(set? #{}) |
| 11:38 | clojurebot | true |
| 11:38 | hamid | i see |
| 11:38 | hamid | +1 |
| 11:38 | sdegutis | justin_smith: clarity trumps power every time |
| 11:38 | justin_smith | sdegutis: then we agree! |
| 11:38 | sdegutis | justin_smith: that's why they banned call/cc |
| 11:39 | justin_smith | and it's also why you need a prescription to use macros, and you can only get them in restricted quantity |
| 11:40 | armlesshobo | justin_smith: sounds better than my insurance company's policies on prescriptions lol |
| 11:53 | sdegutis | :) |
| 11:53 | sdegutis | So many new regular faces here lately. |
| 11:59 | armlesshobo | :) |
| 12:05 | sdegutis | ...which means a lot of you have been breaking the first two rules of fight club. |
| 12:07 | bendavisnc | hey should i be using function? to test if something is a function? i'm a bit confused because it seems likei it's meant just for unit testing |
| 12:07 | bendavisnc | is reflecting if something is a function just a no no in standard clojure code? |
| 12:07 | bendavisnc | i feel like i'm definitely missing something |
| 12:08 | justin_smith | bendavisnc: most clojure code is not coded defensively - if someone does something dumb we just let them deal with the consequences |
| 12:08 | justin_smith | bendavisnc: and deciding what to do based on type of an arg is better done with multimethods or protocols rather than boolean checks |
| 12:09 | hiredman | ,(doc function?) |
| 12:09 | clojurebot | Pardon? |
| 12:09 | bendavisnc | ok so what i'm trying to do is use the match macro to have a condition based on if it's matching a thing with a function |
| 12:09 | hiredman | why do you think function? exists? |
| 12:09 | justin_smith | personally I do like to code defensively at system boundaries - where parts of an app interact - and there I use prismatic schema to describe the expectations |
| 12:10 | hiredman | there is fn? and ifn? depending on what you are doing |
| 12:10 | bendavisnc | https://clojuredocs.org/clojure.test/function_q |
| 12:11 | bendavisnc | hmmm i think fn? is what i'm looking for. thanks! |
| 12:11 | hiredman | yeah, definitely don't use that |
| 12:11 | hiredman | (ever, for anything) |
| 12:11 | bendavisnc | the test/function? you mean @hiredman ? |
| 12:12 | hiredman | yes |
| 12:12 | bendavisnc | yeah, it's not clear to me why that exists and fn? but i'm not sure how much i care if i'm being perfectly honest |
| 12:13 | justin_smith | bendavisnc: if you look at the source for test/function? you'll see that it's just fn? with an added special case for symbols that resolve to a function, and I doubt you want or need the latter |
| 12:13 | bendavisnc | ah, okay. thanks for that |
| 12:14 | hiredman | it is not the same as fn?, it is built on fn?, it is used by clojure.test to try and do better reporting of errors for certain kinds of (is ...) assertions |
| 12:18 | hiredman | I would hesitate before using fn?, or ifn?, or doing any kind of function sniffing, because the line between data and functions in clojure can be blury |
| 12:19 | hiredman | fn? basically returns true for anything created using (fn ...), and ifn? for anything else that can be invoked like a function |
| 12:20 | hiredman | if you test with fn? you can't use keywords with functions, if you test with ifn? lots of data also is seen as a function (keywords, maps, sets, symbols) |
| 12:21 | hiredman | fn? may actually return false for multimethods too, I forget |
| 12:21 | hiredman | ,(fn? print-method) |
| 12:21 | clojurebot | false |
| 12:22 | bendavisnc | yeah i think as long as i'm using fn i'm good |
| 12:23 | bendavisnc | (fn? "howthisfalse") |
| 12:23 | bendavisnc | ,(fn? "howthisfalse") |
| 12:23 | clojurebot | false |
| 12:24 | hiredman | it is highly context dependent |
| 12:24 | hiredman | (if it will be ok or not) |
| 12:25 | hiredman | if you are writting a function that takes a bunch of arguments and using fn? the essential parser apart the different possible options, and the function is some kind of accessor for a value from a datastructure, that means you can't just pass in a keyword |
| 12:26 | sdegutis | Good evening. |
| 12:26 | sdegutis | How is your current state? |
| 12:33 | tolstoy | Unsynchronized and racey. |
| 12:33 | justin_smith | failover |
| 12:41 | hamid | in (source swap!), what is this "^clojure.lang.IAtom" all about? "([^clojure.lang.IAtom atom f] (.swap atom f))" |
| 12:41 | hamid | type checking?! |
| 12:41 | hiredman | type hint |
| 12:41 | hamid | hiredman, compile time? |
| 12:41 | hiredman | it isn't checked, but it is a directive to the compiler so it can generate optimal code |
| 12:42 | hiredman | http://clojure.org/reference/java_interop#typehints |
| 12:42 | hamid | thank you ^ |
| 12:43 | hamid | nice! |
| 12:44 | hamid | i wish it could type check! except core.typed... is there any form of lisp that type checks? |
| 12:45 | tolstoy | hamid: Maybe this? http://shenlanguage.org |
| 12:45 | sg2002 | Hello. I've been playing around with gnu global. There's pygments plugin for it that allows it so parse clojure. Anyone tried this? |
| 12:54 | hamid | tolstoy, hmm weird it is! it has even pattern matching. |
| 12:55 | tolstoy | hamid: Seems to be something you use on another platform base. Scheme, Ruby, Common Lisp certified, JavaScript and Clojure "awaiting". |
| 13:38 | sg2002 | Ok, so it seems that pygments is not worth it, but the universal-ctags works pretty fine. |
| 14:01 | sdegutis | Hiccup is really well designed, all except the very strange decision to differentiate between vectors and every other kind of data type. |
| 14:02 | sdegutis | If it's a vector, then it's an element, otherwise if it's sequential?, then it's a collection of things to be examined individually. |
| 14:02 | sdegutis | Why not rather if it's sequential? then check the first element, and if it's a keyword then the coll is an element, otherwise it's a collection of elements? |
| 14:14 | hamid | I'm trying to learn macros. Would anyone confirm this? https://www.refheap.com/116692 ? |
| 14:15 | hamid | in repl this happens: (macroexpand-1 '(update-state state $ (assoc $ :x 1))) |
| 14:15 | hamid | (clojure.core/swap! user/_state (clojure.core/fn [user/__state] (clojure.core/as-> user/__state user/state (assoc $ :x 1)))) |
| 14:16 | hamid | im not sure why the namespace (user/*) is there! in the arugments that i passed |
| 14:17 | luma | because you have the symbol '__state inside a syntax-quote, so it is expanded into its fully qualified name user/__state |
| 14:17 | luma | (since your macro is in the user namespace) |
| 14:17 | hamid | luma, would you fix it for me so i can see how it's done? |
| 14:20 | luma | hamid, this is probably what you're trying to do: https://www.refheap.com/116694 |
| 14:21 | luma | first of all, exprs should be a vararg (variable argument) so that you can pass any number of those |
| 14:22 | luma | then, syntax-quote (backtick) is used when you return code from a macro. inside the syntax-quote, you can use ~ to unquote parameters, and ~@ to unquote and splice a list from the parameters |
| 14:23 | luma | and when you want to generate a symbol inside a syntax-quote, put # in the end of it so that a new symbol is generated instead |
| 14:24 | hamid | luma, aawww niceee... thank youuuu :) it's awesome that you folks are here. that # thing is awesome. |
| 14:24 | hamid | now it's exactly what i intended to generate: |
| 14:24 | hamid | (clojure.core/swap! state (clojure.core/fn [state__8210__auto__] (clojure.core/as-> state__8210__auto__ $ (assoc $ :x 1)))) |
| 14:57 | Boris | hi. stuck in a little java interop (which I seldomly do). Can anyone help me with translating this one line to clojure? |
| 14:57 | Boris | java: GPlot plot = new GPlot(this); |
| 14:58 | Boris | I would normally do something like (def plot (new GPlot)), but don't know how to deal with the "this" |
| 14:58 | Boris | context is here: https://forum.processing.org/two/discussion/136/grafica-library , trying to use the grafica extension of processing in quil. |
| 15:05 | justin_smith | Boris: a function can use it's own name to refer to itself |
| 15:05 | justin_smith | ,(defn me [] me) |
| 15:05 | clojurebot | #'sandbox/me |
| 15:05 | justin_smith | ,(= me (me)) |
| 15:05 | clojurebot | true |
| 15:06 | boris133 | so I would do (def plot (new Gplot plot)) |
| 15:06 | justin_smith | boris133: no, more lik (defn setup [] (Gplot. setup)) - that would be a closer analog (this refers to the function owning the setup method) |
| 15:07 | justin_smith | err, object owning it, of course |
| 15:07 | boris133 | ah, ok. I'll play with it. |
| 15:07 | justin_smith | boris133: but I'm not certain this would work - processing is weird and magic, and so is quil |
| 15:08 | justin_smith | maybe you would actually want to provide the name of the sketch (first arg to defsketch) instead? I really don't know |
| 15:08 | boris133 | ugh. will see. I was just charmed by the plots from grafica - http://jagracar.com/grafica.php |
| 15:08 | justin_smith | hopefully someone else knows quil better than I |
| 15:08 | boris133 | wanted to see if I could get that through quil. |
| 15:08 | boris133 | *nod* |
| 15:18 | sdegutis | im back |
| 15:18 | sdegutis | ,((fn x [] (x))) |
| 15:18 | clojurebot | #error {\n :cause nil\n :via\n [{:type java.lang.StackOverflowError\n :message nil\n :at [sandbox$eval25$x__26 invoke "NO_SOURCE_FILE" -1]}]\n :trace\n [[sandbox$eval25$x__26 invoke "NO_SOURCE_FILE" -1]\n [sandbox$eval25$x__26 invoke "NO_SOURCE_FILE" 0]\n [sandbox$eval25$x__26 invoke "NO_SOURCE_FILE" 0]\n [sandbox$eval25$x__26 invoke "NO_SOURCE_FILE" 0]\n [sandbox$eval25$x__26 invoke "NO_S... |
| 15:18 | sdegutis | hahaha stupid clojure, cant even handle infinite recursion |
| 15:24 | lokien | stupid clojure indeed |
| 15:26 | lokien | even nobody's advocating it |
| 15:31 | dysfun | mwahahaha, thwarted by the halting problem again |
| 15:46 | sdegutis | ,(:i :i) |
| 15:46 | clojurebot | nil |
| 15:46 | sdegutis | ,(:i :i :i) |
| 15:46 | clojurebot | :i |
| 15:46 | sdegutis | hahahah clojue is funny guy |
| 15:47 | sdegutis | I think clojure is a pretty cool guy. Eh accepts any input and doesn't afraid of anything. |
| 15:50 | luma | ,((get get get (get get get get)) {:a 42} :a) |
| 15:50 | clojurebot | 42 |
| 15:51 | sdegutis | luma: you win |
| 15:51 | sdegutis | /this/ round |
| 15:51 | sdegutis | but you ahvent won |
| 15:51 | sdegutis | the .war |
| 15:51 | luma | (i think justin_smith is the one who likes to (get get get get) here) |
| 15:51 | sdegutis | ,(get get get get) |
| 15:51 | clojurebot | #object[clojure.core$get 0x1a3f6a10 "clojure.core$get@1a3f6a10"] |
| 15:55 | justin_smith | ,(= get (get get get get) ((get get get get) (get get get get) (get get get get) (get get get get))) |
| 15:55 | clojurebot | true |
| 15:55 | justin_smith | etc. |
| 16:06 | dysfun | you'd love perl, you know, justin_smith |
| 16:10 | Punic | Hey everyone. |
| 16:10 | lokien | hello Punic |
| 16:10 | justin_smith | dysfun: it appeals to my enjoyment of absurdity, but that isn't actually what I want in a programming language |
| 16:11 | Punic | How is it going guys? |
| 16:12 | justin_smith | pretty good! I just figured out an elegant way to claim ownership of tasks for a distributed pool using zookeeper |
| 16:12 | justin_smith | *from a distributed pool |
| 16:12 | lokien | justin_smith: absurdity is the best part of programming languages |
| 16:12 | Punic | Well that sounds cool. Altough I didn't understand shit from what you said |
| 16:13 | lokien | Punic: I wanted to do a project, but then I realised plenty of people have done that already |
| 16:14 | Punic | Don't tell me you were after "the next facebook"? |
| 16:15 | lokien | no, I just wanted to scrape some websites to my Kindle :< |
| 16:16 | lokien | (which I don't even own yet) |
| 16:17 | lokien | can you guys give me some good clojure code to read? |
| 16:17 | lokien | like, the most beautiful clojure code in your opinion |
| 16:24 | kenrestivo | the clojure source itself, or the cljs source, written by rich? |
| 16:25 | kenrestivo | also, anything rich has written, like his example code for codeq and datomic |
| 16:27 | sdegutis | I look around, I look around.. I see a lot of new faces. |
| 16:28 | justin_smith | ring, and other stuff by weavejester. amalloy writes good code (in particular flatland/useful, a util lib, has some ideas worth emulating) |
| 16:28 | lokien | I'm an old face, come on |
| 16:29 | sdegutis | I've also seen an awful lot of unnecessarily convoluted code by respectable people though. |
| 16:29 | sdegutis | So that's not always a safe bet. |
| 16:29 | lokien | kenrestivo: clojure source frightened me last time I looked at it, I don't want to do it again |
| 16:29 | sdegutis | All I can recommend personally is just to write a lot of code and read a lot of code from as many sources as you can, and just compare things based on your own reasoning and experiments and experience. |
| 16:29 | lokien | justin_smith: thanks, will check |
| 16:30 | justin_smith | sdegutis: (let [years-here (number of years justin_smith has hung out in #clojure) beard-length (length of justin_smith's beard in inches)] (assert (= (/ beard-length years-here) 2))) |
| 16:30 | lokien | sdegutis: I don't have any ideas now, so no code is being written by me. downside of not having a job :( |
| 16:31 | sdegutis | lokien: meh, there's nothing wrong with not doing something you have no reason to do; just like how I don't go digging ditches all over my front yard |
| 16:31 | sdegutis | lokien: that said, if you want to get a Clojure job, start writing tons and tons and tons of Clojure |
| 16:32 | justin_smith | sdegutis: it works in the other direction too |
| 16:32 | sdegutis | justin_smith: how so |
| 16:32 | justin_smith | if you want to write tons and tons of Clojure, get a Clojure job |
| 16:32 | sdegutis | justin_smith: sure, but it doesn't hurt to have some experience |
| 16:33 | justin_smith | lokien: lol |
| 16:33 | sdegutis | lokien: actually why not just this? |
| 16:33 | sdegutis | ,(take 3 (iterate #(get get %))) |
| 16:33 | clojurebot | #error {\n :cause "Wrong number of args (1) passed to: core/iterate"\n :via\n [{:type clojure.lang.ArityException\n :message "Wrong number of args (1) passed to: core/iterate"\n :at [clojure.lang.AFn throwArity "AFn.java" 429]}]\n :trace\n [[clojure.lang.AFn throwArity "AFn.java" 429]\n [clojure.lang.AFn invoke "AFn.java" 32]\n [sandbox$eval26 invokeStatic "NO_SOURCE_FILE" 0]\n [sandbox$eva... |
| 16:34 | sdegutis | ,(take 3 (iterate #(get get %) get)) |
| 16:34 | clojurebot | (#object[clojure.core$get 0x5351c06e "clojure.core$get@5351c06e"] nil nil) |
| 16:34 | justin_smith | lokien: I only share stupid things like that so you'll be pleasantly surprised when I say something that isn't stupid |
| 16:34 | sdegutis | ,(take 5 (iterate #(get get %) get)) |
| 16:34 | clojurebot | (#object[clojure.core$get 0x5351c06e "clojure.core$get@5351c06e"] nil nil nil nil) |
| 16:34 | lokien | justin_smith: "How I Became A Professional Developer In Three Weeks Using This One Weird Trick" |
| 16:34 | sdegutis | ,(nth (iterate #(get get get %) get) 100) |
| 16:34 | clojurebot | #object[clojure.core$get 0x5351c06e "clojure.core$get@5351c06e"] |
| 16:34 | sdegutis | hahaha |
| 16:34 | justin_smith | lokien: programmers hate him! |
| 16:34 | sdegutis | ,(= get (nth (iterate #(get get get %) get) 10000000)) |
| 16:34 | clojurebot | true |
| 16:34 | sdegutis | stupid clojure hahaha |
| 16:35 | sdegutis | lokien: use iterate, that's an easier way to recurse (get (get (get (get (get ... without doing it manually |
| 16:35 | hiredman | I think I am pretty happy with https://github.com/hiredman/kvgc/blob/master/src/com/manigfeald/kvgc.clj if I do say so myself |
| 16:35 | luma | ,(take 3 (iterate #(% % % %) get)) |
| 16:35 | clojurebot | (#object[clojure.core$get 0x5351c06e "clojure.core$get@5351c06e"] #object[clojure.core$get 0x5351c06e "clojure.core$get@5351c06e"] #object[clojure.core$get 0x5351c06e "clojure.core$get@5351c06e"]) |
| 16:35 | sdegutis | WAIT I GOT IT!!! |
| 16:37 | lokien | hiredman: tell me your secret of hiredness |
| 16:37 | hiredman | actually I am looking for work :P |
| 16:37 | lokien | :D |
| 16:37 | lokien | change your nick then, you mischief |
| 16:38 | TEttinger | it's hire d-man |
| 16:38 | sdegutis | hold on |
| 16:38 | sdegutis | its not working |
| 16:39 | sdegutis | why not? |
| 16:39 | sdegutis | (apply apply (repeat 4 get)) |
| 16:39 | hiredman | I was hired once, I think they were impressed with my knowledge of clojure internals, which got my foot in the door (this was a few years ago), and then once my foot was in the door, I was willing to tackle anything, so they hung on to me for a while |
| 16:41 | sobel | i hate when that happens |
| 16:41 | sobel | er.. :) |
| 16:42 | sdegutis | i cant figure this out |
| 16:42 | hiredman | https://github.com/liebke/analemma is a neat project, I think it may even has started as a teaching aid |
| 16:42 | sdegutis | justin_smith: help what am i doing wrong |
| 16:42 | sdegutis | i mean for sure this works (apply get [get get get]) |
| 16:42 | sdegutis | but i cant get it to take [get get get get] and turn it into (get get get get) anyhow |
| 16:42 | lokien | hiredman: that terrifies me a little, I'd like to get a job writing clojure, but it seems so unlikely |
| 16:42 | sdegutis | what am i doing wrong #:'( |
| 16:43 | sdegutis | oops that waffle doesnt belong on my head |
| 16:43 | sobel | lokien: easiest way to get a job writing clojure is to get a job writing java where they won't complain if you write some in clojure |
| 16:43 | sobel | lokien: then you're the local expert, too. that doesn't hurt. |
| 16:43 | lokien | sdegutis: don't try to fool us, we saw everything |
| 16:43 | hiredman | if you live or are willing to live near one of the tech centers in the us (sf, seattle, chicago, ny) it should be no problem |
| 16:43 | sdegutis | also why doesnt ((fn [x & y] (apply x y)) (repeat 4 get)) work when it should definitely? |
| 16:44 | lokien | sobel: working with java people? I'm getting goosebumps already |
| 16:44 | justin_smith | ,(apply apply ((juxt first rest) (repeat 4 get))) ; sdegutis |
| 16:44 | lokien | hiredman: Poland >:c |
| 16:44 | clojurebot | #object[clojure.core$get 0x32badd00 "clojure.core$get@32badd00"] |
| 16:44 | hiredman | my last job was a remote position, and I cannot go back to having a commute |
| 16:44 | sdegutis | YESSSSS |
| 16:44 | sdegutis | justin_smith: you win |
| 16:44 | sdegutis | my brain is defeated on a friday afternoooooooon |
| 16:45 | sobel | lokien: <shrug> i am a data nerd, but i like using clojure when i have to program. i work at a java shop, so clojure is easy to integrate. |
| 16:46 | sdegutis | ahhhh i found out why |
| 16:46 | lokien | sobel: I'm an expressive languages nerd, it won't be as easy for me |
| 16:46 | sdegutis | ,((fn [[x & y]] (apply x y)) (repeat 4 get)) |
| 16:46 | clojurebot | #object[clojure.core$get 0x32badd00 "clojure.core$get@32badd00"] |
| 16:46 | sdegutis | haha |
| 16:47 | justin_smith | sdegutis: but no juxt |
| 16:47 | sdegutis | aww |
| 16:47 | hiredman | it seems like there is more interest in ClojureScript developers, sort of front end ui focused stuff |
| 16:48 | hiredman | I see positions where they have a go/python backend and clojurescript frontends |
| 16:48 | Kirchgehammer | Say I'm in Java and I have a string with a Clojure form like "(def a 42)", how would I evaluate this by Clojure? Are there static methods I can call for reading and evaluating? |
| 16:48 | Kirchgehammer | Surely this must be documented somewhere? |
| 16:48 | hiredman | Kirchgehammer: yes |
| 16:48 | Kirchgehammer | Do you know the names of these functions? |
| 16:48 | hiredman | Kirchgehammer: https://clojure.github.io/clojure/javadoc/ |
| 16:48 | justin_smith | Kirchgehammer: yes, you would want read followed by eval, there's methods in clojure.lang.RT |
| 16:48 | sdegutis | hiredman: thats because people suck |
| 16:49 | lokien | hiredman: yups, for someone that loves js ecosystem, but doesn't like its syntax, cjls is a blessing |
| 16:50 | Kirchgehammer | Object form = RT.readString("(def a 42)"); |
| 16:50 | Kirchgehammer | justin_smith Can't find the eval function :( |
| 16:51 | Kirchgehammer | Oh wait, Clojure has an eval function, I just need to grab that via var? |
| 16:52 | justin_smith | Kirchgehammer: yeah, I forgot the steps, but yeah, first you need read-string, then eval |
| 16:52 | Kirchgehammer | IFn eval = Clojure.var("clojure.core", "eval"); |
| 16:52 | Kirchgehammer | Something like that? |
| 16:52 | justin_smith | and the var lookup / invoke might be the trick |
| 16:52 | justin_smith | I think so |
| 16:52 | justin_smith | should be quick to test out |
| 16:53 | kenrestivo | hmm. cider-doc is giving me fits. http://pastebin.com/wk6EpeGp |
| 16:53 | kenrestivo | any ideas? |
| 16:53 | kennytilton | Does clojure have a type t like Common Lisp? I want to defmethod on a multi-fn and specialize on only some of the parameters. |
| 16:53 | kenrestivo | all i did is cider-doc at a particular point |
| 16:53 | justin_smith | kenrestivo: you just made me read code in comic sans :( |
| 16:54 | Kirchgehammer | Object form = RT.readString("(def a 42)"); |
| 16:54 | Kirchgehammer | IFn eval = Clojure.var("clojure.core", "eval"); |
| 16:54 | Kirchgehammer | Object result = eval.invoke(form); |
| 16:54 | Kirchgehammer | System.out.println(result); |
| 16:54 | Kirchgehammer | #'clojure.core/a |
| 16:54 | Kirchgehammer | OMG it works!!! |
| 16:54 | justin_smith | Kirchgehammer: awesome |
| 16:54 | kenrestivo | i didn't write that in comic sans |
| 16:55 | kenrestivo | it's a pastebin. isn't refheap closed to new pastes? |
| 16:55 | justin_smith | kenrestivo: just teasing, it's clearly an april fools thing |
| 16:55 | kenrestivo | ah! it isn't |
| 16:55 | kenrestivo | https://www.refheap.com/116704 |
| 16:56 | justin_smith | kenrestivo: that looks like buggy elisp to me |
| 16:56 | kenrestivo | it sure is. but... why? where? i'm using the cider from packages |
| 16:57 | kenrestivo | 20160401.1308 |
| 16:57 | kennytilton | Oh. Object. Duh. |
| 16:58 | kenrestivo | this is actually why i stayed away from cider and used nrepl.el for years. it worked. :/ |
| 16:59 | justin_smith | yes, nrepl.el was much more stable |
| 16:59 | kenrestivo | *sigh* |
| 17:01 | justin_smith | kenrestivo: it's like the opposite of the unix tool building philosophy: try to do everything you possibly can in one tool |
| 17:03 | kwladyka | if i added as dependency in project.clj package X and use from there only X.namespace-1 after compile it will include all other namespaces or only which i am using in code? |
| 17:04 | justin_smith | kwladyka: it will load that namespace, and whichever other namespaces that namespace loads |
| 17:04 | justin_smith | kwladyka: require is transitive (otherwise it would be a pain in the ass to use libs) |
| 17:04 | kenrestivo | justin_smith: ok dude, yeah, it's trying to be an ide. and it's broken. but... any idea how to get cider-doc to work? |
| 17:04 | kenrestivo | this is like one of the most basic features |
| 17:05 | justin_smith | kenrestivo: I wish I could be more helpful, I don't even use emacs any more myself |
| 17:05 | kenrestivo | (cider-doc-lookup (make-symbol "while")) gives a stringp error |
| 17:05 | kwladyka | justin_smith sounds good :) |
| 17:05 | kenrestivo | even though that's not a stringp |
| 17:06 | justin_smith | kenrestivo: you could try the step debugger - elisp is actually really great for interactive debugging |
| 17:07 | kenrestivo | yep, i'm in the debugger. thanks |
| 17:08 | sdegutis | this sucks |
| 17:08 | sdegutis | my old code sucks |
| 17:09 | kenrestivo | oh well, i can just (doc foo) for now |
| 17:09 | sdegutis | im sorry, me, im sorry for putting you in this position |
| 17:10 | kenrestivo | everyone's old code sucks. that's what old code is. |
| 17:11 | justin_smith | kenrestivo: the sad thing is my good code is the code I never have to look at again |
| 17:11 | justin_smith | kenrestivo: I've written a handful of good namespaces, those are the ones I haven't had to load into an editor in ages... |
| 17:11 | justin_smith | haha |
| 17:12 | kenrestivo | true, but i bet if you did, you'd be gripped with an urgent need to refactor it |
| 17:13 | justin_smith | kenrestivo: no, I go back and look at old code just for the sake of looking at it sometimes, and there are a few that are just gems. Or, more likely, I am not wise enough yet to know why they are terrible. But no urge to refactor (unlike most of the code I read, no matter who wrote it) |
| 17:20 | sdegutis | justin_smith: haha so wise |
| 17:21 | justin_smith | sdegutis: I assure you, I'm a fool |
| 17:21 | sdegutis | haha so modest |
| 17:21 | dysfun | justin_smith: we all feel that way when we look at our old code |
| 17:22 | justin_smith | sdegutis: there's things off the topic of this room that I'll totally brag about - like I lost 34 pounds in the last 7 weeks |
| 17:22 | justin_smith | sdegutis: but I'm bad at code |
| 17:22 | dysfun | justin_smith: you should probably stop keeping english money in your pockets then |
| 17:22 | justin_smith | ba-dum-tish |
| 17:22 | sdegutis | justin_smith: that sounds unhealthy |
| 17:22 | sdegutis | justin_smith: i lost like.. hold on lemme check |
| 17:23 | justin_smith | sdegutis: I looked for professional advice - taking a suppliment every day, keeping to a specific calorie count every day, making sure not to exceed 5 pounds lost a week |
| 17:23 | sdegutis | justin_smith: like 6-8 lbs in the past few weeks |
| 17:23 | sdegutis | assuming our crappy scale can be trusted, which it cant |
| 17:23 | justin_smith | heh |
| 17:24 | sdegutis | the trick is to cut down on red bull to only 2-3 per day |
| 17:24 | lokien | justin_smith: what editor do you use now? I fired up emacs five minutes ago and it was broken, again. I don't want to deal with that anymore |
| 17:24 | sdegutis | lokien: justin_smith <3 vim |
| 17:24 | sdegutis | lokien: i <3 emacs |
| 17:24 | sdegutis | lokien: YOU decide. |
| 17:24 | justin_smith | lokien: I don't know if you'd want to develop like I do, but I use vim and a regular repl in a terminal (I don't use fireplace) |
| 17:25 | sdegutis | justin_smith: my doc told me i have to start cutting out carbs and sugars and check back in 6 months and i might have to go on a fricken pill to prevent a heart attack if i dont |
| 17:25 | lokien | justin_smith: any plugins? |
| 17:25 | justin_smith | so I use require :reload for in project stuff, load-file for files in a lib in anotehr project that I have in disk, etc. |
| 17:25 | sdegutis | justin_smith: so i eat like eggs and mixed veggies and chicken and stuff, and we bought an ellipsis to run on in the living room |
| 17:25 | justin_smith | lokien: just the basic vim-clojure |
| 17:26 | dysfun | you run on an ellipsis? |
| 17:26 | justin_smith | sdegutis: now I'm imagining you riding a ... |
| 17:26 | justin_smith | very abstract, but funny |
| 17:26 | sdegutis | dysfun: yeah its easier on my knees |
| 17:26 | sdegutis | justin_smith: you mean … |
| 17:26 | dysfun | i used to have a manual treadmill which had rollers in the middle, so it was a bit like an ellipsis |
| 17:26 | sdegutis | weird |
| 17:27 | lokien | justin_smith: o-kay, time to make my 4th vimrc |
| 17:27 | justin_smith | lokien: you don't have to do it my way! there's also monroe in emacs |
| 17:27 | lokien | sdegutis: how's your pinky? mine hurt after few hours, I had to switch to vim bindings |
| 17:28 | sdegutis | lokien: its fine as long as i dont wrest my rist on the wdesk |
| 17:28 | sdegutis | haha i jest, no lest |
| 17:28 | lokien | justin_smith: I just don't want to experience headaches ever again |
| 17:29 | sdegutis | dysfun: we used to have a treadmill desk for coding at at my old job |
| 17:29 | sdegutis | i think thye still have it |
| 17:29 | sdegutis | it was 2hard4me |
| 17:29 | sdegutis | i mean 2hard5me dangit i messed it up |
| 17:29 | justin_smith | lokien: well, if you are ok with :reload and load-file, my experience doing things without editor integration has been decent, but I think I also code slower than other people, so I am OK with going and looking up doc strings instead of seeing them automatically, etc. |
| 17:30 | dysfun | yeah i should make a standing desk arrangement now i work from home all the time |
| 17:30 | dysfun | i've stopped taking public transport in favour of cycling |
| 17:30 | justin_smith | dysfun: same but walking - 4.5 mile walk (though I do occasionally bus too) |
| 17:30 | justin_smith | (9 miles round trip) |
| 17:31 | justin_smith | 1.5 hours of understimulation is a nice thing! |
| 17:31 | dysfun | too much time out of the day to walk |
| 17:31 | lokien | justin_smith: my programming is 80% looking at the code, 20% writing it |
| 17:31 | dysfun | i love cycling even though my legs are hurting because i took 18 months off |
| 17:31 | justin_smith | dysfun: that's just because you have a life, and probably loved ones, if you were a loser like me you'd have all the time in the world to go walking |
| 17:31 | lokien | justin_smith: or even less. |
| 17:31 | lokien | like 90-10 |
| 17:32 | dysfun | justin_smith: i really don't have a life and i pity anyone daft enough to love me. but between all my code and the shopping and the housework, i still don't have time to walk |
| 17:32 | sdegutis | dysfun: oh man i got one of those |
| 17:33 | lokien | dysfun: I love you! |
| 17:33 | TEttinger | my programming is about 70% writing the code, 25% pacing inefficiently, and 5% going to the bathroom and almost always getting a useful idea in the process |
| 17:33 | dysfun | haha |
| 17:33 | TEttinger | it's like I'm incapable of passing a block in my code without passing a stool |
| 17:33 | lokien | TEttinger: my idea for a startup - coding toilet desks |
| 17:34 | tolstoy | lokien: Hopefully not open plan. |
| 17:34 | TEttinger | hahaha |
| 17:34 | sdegutis | hahahaha |
| 17:34 | justin_smith | TEttinger: lokien: 90% confustion, 5% contemplation, 2% writing code, and 25% underestimating the time needed for the task |
| 17:34 | dysfun | justin_smith: it's actually 460% underestimating the time needed for the task |
| 17:34 | TEttinger | confustius say... |
| 17:34 | lokien | justin_smith: 120% configuring my text editor |
| 17:35 | justin_smith | dysfun: oh man... |
| 17:35 | sdegutis | https://www.dropbox.com/s/h6kol44npg7n51d/workspace.JPG?dl=0 |
| 17:35 | sdegutis | dysfun: its that |
| 17:35 | dysfun | i've taken to just letting my mind wander in useful directions and not worrying too hard about when it actually solidifies into code |
| 17:35 | sdegutis | im standing in that very spot as we speak |
| 17:36 | dysfun | nice desk |
| 17:36 | sdegutis | my dad made the middle shelf and put it on here |
| 17:36 | sdegutis | thanks |
| 17:36 | dysfun | the only redeeming thing about my desk is the aeron in front ofi t |
| 17:36 | lokien | sdegutis: nice drawings |
| 17:36 | TEttinger | indeed |
| 17:36 | sdegutis | haha that was my wife |
| 17:37 | sdegutis | one of them is sign language |
| 17:37 | sdegutis | the other is a <3 |
| 17:37 | dysfun | i thought she was just sticking two fingers up at the person holding a shield? |
| 17:37 | sdegutis | haha no thats sign language |
| 17:37 | scottj | sdegutis: I think either your keyboard is too high or your monitor is too low |
| 17:37 | TEttinger | 3 |
| 17:37 | scottj | or your legs are too long |
| 17:37 | lokien | sdegutis: "Children don't obey" |
| 17:37 | sdegutis | scottj: my monitor may be too low acrually |
| 17:38 | dysfun | your eyes should be level with the top of your monitor |
| 17:38 | lokien | sdegutis: sadly I can't read anything else |
| 17:38 | sdegutis | and you assume you got that one correct |
| 17:42 | sdegutis | scottj: now that i look at it, when i stand up str8, my eyes go directly above the top of the monitor |
| 17:42 | sdegutis | like evenly flat |
| 17:42 | sdegutis | im sasying it all wrong, but i hope i make sense |
| 17:43 | tolstoy | Yeah. Where should your eyes fall when you slouch? |
| 17:43 | Kirchgehammer | justin_smith: http://i.imgur.com/qh4dTrZ.png |
| 17:43 | justin_smith | speaking of legs being too long, I totally want to make a data coersion library called Procrustes https://en.wikipedia.org/wiki/Procrustes |
| 17:43 | Kirchgehammer | Just finished the first working prototype ;) |
| 17:44 | justin_smith | Kirchgehammer: nice! |
| 17:45 | justin_smith | first task, coerce the string "coersion" to become "coercion" |
| 17:45 | sdegutis | lol clopad |
| 17:45 | sdegutis | hard to believe thats a monospace font too |
| 17:45 | justin_smith | sdegutis: I think we should be nice here - he just went and made a thing over the course of an hour or two |
| 17:46 | sdegutis | justin_smith: he made that? then whats the one im thinking of? |
| 17:46 | justin_smith | sdegutis: no idea! he was asking how to call clojure to evaluate strings, and came back with that java app |
| 17:46 | sdegutis | Kirchgehammer: nice app. what do you think of changing the font to menlo? |
| 17:47 | Kirchgehammer | Is that the official Clojure font or something? |
| 17:47 | Kirchgehammer | My editor uses a bitmap font :) |
| 17:47 | sdegutis | justin_smith: im definitely thinnking of a different one |
| 17:47 | sdegutis | Kirchgehammer: no i just like menlo |
| 17:47 | Kirchgehammer | never heard of menlo |
| 17:47 | sdegutis | you may like it who knows |
| 17:48 | Kirchgehammer | maybe |
| 17:48 | sdegutis | Oh! |
| 17:48 | sdegutis | Clooj |
| 17:48 | sdegutis | i was thinking of Clooj |
| 17:48 | tolstoy | There's also night-something. |
| 17:48 | sdegutis | yeah nightcode but thats active |
| 17:48 | sdegutis | clooj was last touched late 2013 early 2014 |
| 17:49 | tolstoy | nightcode.info: nothing! Hm. |
| 17:49 | sdegutis | i like the idea of a clojure ide written in clojure |
| 17:49 | sdegutis | a lot. |
| 17:49 | sdegutis | i just dont like the idea of it using a java ide |
| 17:49 | sdegutis | or clojurescript + web |
| 17:49 | justin_smith | sdegutis: Procrustes was "a rogue smith and bandit from Attica who physically attacked people by stretching them or cutting off their legs" |
| 17:50 | sdegutis | justin_smith: let me guess 'justin' is an alias |
| 17:50 | sdegutis | justin_smith: or should i say PROCRUSTES |
| 17:50 | sdegutis | justin_smith: but srsly im way too unconcentratd to know why you brought that up |
| 17:50 | justin_smith | sdegutis: you're just jealous because there's never been a rogue degutis |
| 17:50 | sdegutis | hahahaha |
| 17:50 | sdegutis | actually we looked it up |
| 17:51 | sdegutis | degutis is based on the lithuanian name for tar worker |
| 17:51 | sdegutis | so my ancestors basically made pitch for boats or something |
| 17:51 | justin_smith | sdegutis: the above conversation, someone said "or your legs are too long", which reminded me someone needs to make a coercion library named Procrustes |
| 17:51 | sdegutis | :'( |
| 17:51 | sdegutis | oh right |
| 17:52 | lokien | my last name is a vim plugin manager /: |
| 17:52 | sdegutis | it would go along with the technomancy-esque naming scheme thats all the rage these days |
| 17:54 | TEttinger | sdegutis: and a degu is a cute little squirrel type thing |
| 17:54 | TEttinger | http://homeanimals.co.uk/images/degu.jpg |
| 17:55 | justin_smith | TEttinger: that's what I assume sdegutis looks like, tbh |
| 17:55 | lokien_ | That squinting one? |
| 17:57 | sdegutis | correct. |
| 17:57 | TEttinger | tommy ettinger is an anagram for gritty teen mom |
| 17:58 | TEttinger | justin smith is not very anagrammy |
| 17:58 | justin_smith | no, not really |
| 17:59 | sdegutis | Okay so my wife called and asked what I want for dinner, with the stipulation that she's not gonna make anything, but she's at the store and can buy whatever. |
| 17:59 | TEttinger | steven degutis is an anagram for Nudest Vestige |
| 17:59 | sdegutis | But I can't think of what would be a great dinner tonight. |
| 17:59 | Glenjamin | thin jit sums |
| 17:59 | sdegutis | Something that's easy to buy and not hard to make. |
| 17:59 | justin_smith | Glenjamin: nice |
| 17:59 | tolstoy | Mexican food! |
| 17:59 | sdegutis | yeah but what kind? |
| 18:00 | sdegutis | i mean, i was gonna say nachos |
| 18:00 | Glenjamin | artithmetic in a hot loop :D |
| 18:00 | TEttinger | also, devise gun test |
| 18:00 | sdegutis | hmm |
| 18:00 | sdegutis | wtf TEttinger lol |
| 18:00 | sdegutis | so many inappropriate anagrams of my name |
| 18:00 | TEttinger | http://wordsmith.org/anagram/anagram.cgi?anagram=steven+degutis&language=english&t=1000&d=&include=&exclude=&n=&m=&source=adv&a=n&l=n&q=n&k=1 |
| 18:00 | sdegutis | i half expect the next one to include like murder or something |
| 18:00 | tolstoy | Ground beef, spices, green onions, tomato, hot sauce, tortilla, done. |
| 18:00 | sdegutis | tolstoy: but thats a lot of work to chop up the things |
| 18:01 | srruby | yum |
| 18:01 | sdegutis | hmm |
| 18:01 | justin_smith | has anyone made a statistical model based taco bell food generator yet? |
| 18:01 | tolstoy | Not longer than it takes the meat to cook. And if you want cheese, you can get that pre-grated. ;) |
| 18:01 | justin_smith | you probably wouldn't even need a markov model, I but just a random percentage of including each ingredient on the list would suffice |
| 18:02 | tolstoy | Yeah, seems to me that the difference between one dish and another is the style of the tortilla. |
| 18:02 | sdegutis | tolstoy: then its settled |
| 18:03 | srruby | Question about unit testing. When I do lein new app foo, I get a test file in test/foo/core_test.clj Should I follow this approach in unit testing other clj files ? |
| 18:03 | tolstoy | Heh. Add some re-fried beans, if that's your thing, too. I like black-bean best. |
| 18:04 | TEttinger | justin_smith: have you had a quesalupa, or whatever the chalupa with a quesadilla shell is? |
| 18:04 | srruby | cook the beef separately and drain off the fat unless you like the fat.... |
| 18:04 | sdegutis | aw heck yeah, shes gonna make sweet & spicy chicken wraps |
| 18:04 | tolstoy | Strainer! |
| 18:05 | sdegutis | turns out jewel sells precooked and precut up chicken |
| 18:05 | sdegutis | yay |
| 18:05 | sdegutis | so btw, guys, this is slightly more on topic: |
| 18:05 | sdegutis | turns out, music with no lyrics or singing in it, just instruments, is really good to listen to while programming |
| 18:06 | tolstoy | Classical all the way. |
| 18:06 | sdegutis | such as https://www.amazon.com/gp/product/B00P1AYVBS (preview the things) |
| 18:06 | lokien_ | I can't focus listening to piano, I just keep listening to the piano for ten minutes instead of coding and get distracted |
| 18:06 | tolstoy | I had to grow into listening to stuff while working due to Open Plan / Cubicle life. |
| 18:06 | justin_smith | ,(defn taco-bell-recipe [] (concat (take (rand-int 4) (shuffle ["flour tortilla" "corn tortilla" "chips" "gordita" "rice"])) (take (rand-int 10) (shuffle ["onions" "beans" "cheese" "beef" "chicken" "lettuce" "tomatoes" "enchilada sauce" "sour cream" "guacamole" "nacho cheese"])))) |
| 18:06 | clojurebot | #'sandbox/taco-bell-recipe |
| 18:06 | sdegutis | ok so thats the setup (its also true btw). |
| 18:06 | justin_smith | ,(taco-bell-recipe) |
| 18:06 | clojurebot | ("corn tortilla" "rice" "sour cream" "guacamole" "cheese" ...) |
| 18:06 | sdegutis | now heres the joke |
| 18:07 | justin_smith | sdegutis: your dinner^ |
| 18:07 | sdegutis | such as Bon Iver also |
| 18:07 | tolstoy | Separate the data (ingredients) from the functions (particular dish)? |
| 18:07 | sdegutis | i mean, |
| 18:07 | sdegutis | "also, anything by Bon Iver" |
| 18:07 | sdegutis | haha! |
| 18:07 | tolstoy | Sigur Ros is nice. |
| 18:08 | sdegutis | justin_smith: hmm could use more thread-last |
| 18:08 | justin_smith | ,defn taco-bell-recipe [] (clojure.string/join ", " (concat (take (rand-int 4) (shuffle ["flour tortilla" "corn tortilla" "chips" "gordita" "rice"])) (take (rand-int 10) (shuffle ["onions" "beans" "cheese" "beef" "chicken" "lettuce" "tomatoes" "enchilada sauce" "sour cream" "guacamole" "nacho cheese"]))))) |
| 18:08 | clojurebot | #error {\n :cause "Can't take value of a macro: #'clojure.core/defn"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/defn, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6688]}\n {:type java.lang.RuntimeException\n :message "Can't take value of a macro: #'clojur... |
| 18:08 | justin_smith | ,(defn taco-bell-recipe [] (clojure.string/join ", " (concat (take (rand-int 4) (shuffle ["flour tortilla" "corn tortilla" "chips" "gordita" "rice"])) (take (rand-int 10) (shuffle ["onions" "beans" "cheese" "beef" "chicken" "lettuce" "tomatoes" "enchilada sauce" "sour cream" "guacamole" "nacho cheese"]))))) |
| 18:08 | clojurebot | #'sandbox/taco-bell-recipe |
| 18:09 | justin_smith | ,(taco-bell-recipe) |
| 18:09 | clojurebot | "rice, sour cream, guacamole, tomatoes, lettuce, enchilada sauce" |
| 18:09 | justin_smith | sdegutis: yeah, thread-last would make that more readable |
| 18:09 | scottj | "Mexican Rice Bowls" |
| 18:09 | scottj | ,(taco-bell-recipe) |
| 18:09 | clojurebot | "corn tortilla, tomatoes, beef, sour cream, cheese" |
| 18:10 | scottj | "Beef Taco" |
| 18:10 | sdegutis | anyway so mainly i just wanted to make that joke about how Bon Iver sounds like theres no lyrics |
| 18:10 | Glenjamin | please turn that into a 4clojure question somehow |
| 18:10 | justin_smith | Glenjamin: oh man |
| 18:10 | sdegutis | but also you should check out that FFVII Melancholy Tribute album its actually great for programmin to |
| 18:10 | TEttinger | I haven't found the no-lyrics music to be always a better option. last night I programmed a pretty sizable chunk of complex permutation-based java code while listening to https://www.youtube.com/watch?v=635qfYt8eyg |
| 18:11 | tolstoy | sdegutis I'm one of those people that almost never hears the lyrics as language. |
| 18:11 | sdegutis | tolstoy: you are so lucky |
| 18:12 | tolstoy | Yeah. People say they love this or that song, and I can't figure it. Turns out, they're talking about lyrics, and I'm talking about the music itself. |
| 18:12 | sdegutis | TEttinger: hmm, [retracted inappropriate joke] |
| 18:12 | sdegutis | tolstoy: oh yeah for sure, i half know what u mean |
| 18:13 | tolstoy | Thus, hip-hop is kinda just a bunch of men yelling at me. |
| 18:13 | lokien_ | tolstoy: even in your native language? |
| 18:14 | tolstoy | lokien_ Yep. It's not that I don't understand the words, it's that I don't put them together in a meaninful way, unless I really try. |
| 18:15 | sdegutis | tolstoy: i dunno this is pretty good https://www.youtube.com/watch?v=6mTtAh-KYW0 |
| 18:15 | sdegutis | got kind of an epic feel, which is appropriate give nthe story it tells |
| 18:15 | tolstoy | I like, say, Cocteau Twins or Sigur Ros just fine, even though there's basically just voice-as-instrument. |
| 18:15 | lokien_ | tolstoy: teach me your ways, sensei |
| 18:15 | tolstoy | Heh. ;) It's just genetic, or something. |
| 18:16 | justin_smith | ,(defn taco-bell-recipe [] (->> (concat (->> ["flour tortilla" "corn tortilla" "chips" "gordita" "rice"] shuffle (take (rand-int 4))) (->> ["onions" "beans" "cheese" "beef" "chicken" "lettuce" "tomatoes" "enchilada sauce" "sour cream" "guacamole" "nacho cheese"] shuffle (take (rand-int 10)))) (clojure.string/join ", "))) |
| 18:16 | clojurebot | #'sandbox/taco-bell-recipe |
| 18:16 | sdegutis | "when he hit the scene, he commanded respect; he'd needed something done, and every hand hit the deck; took the first shot, and nobody fired back" |
| 18:16 | justin_smith | sdegutis: ^ fixed for you |
| 18:16 | tolstoy | Too distracted by the actual music? Grew up (to 13) in a house with only Classical? |
| 18:16 | justin_smith | ,(taco-bell-recipe) |
| 18:16 | clojurebot | "corn tortilla, flour tortilla, rice, chicken, enchilada sauce, beans" |
| 18:16 | sdegutis | justin_smith: whoa too much thread-z now |
| 18:16 | sdegutis | justin_smith: that code brings tears to my eyes |
| 18:17 | justin_smith | ,(taco-bell-recipe) |
| 18:17 | clojurebot | #error {\n :cause "Unable to resolve symbol: taco-bell-recipe in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: taco-bell-recipe in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6688]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve... |
| 18:17 | sdegutis | HAHHAHA |
| 18:17 | justin_smith | ,(defn taco-bell-recipe [] (->> (concat (->> ["flour tortilla" "corn tortilla" "chips" "gordita" "rice"] shuffle (take (rand-int 4))) (->> ["onions" "beans" "cheese" "beef" "chicken" "lettuce" "tomatoes" "enchilada sauce" "sour cream" "guacamole" "nacho cheese"] shuffle (take (rand-int 10)))) (clojure.string/join ", "))) |
| 18:17 | clojurebot | #'sandbox/taco-bell-recipe |
| 18:17 | justin_smith | ,(taco-bell-recipe) |
| 18:17 | clojurebot | "gordita, corn tortilla, chips, guacamole, enchilada sauce, sour cream, lettuce, beans, beef, chicken, cheese, tomatoes" |
| 18:17 | lokien_ | tolstoy: I need to buy a piano |
| 18:18 | tolstoy | justin_smith: I think you're on to something. Start a .io domain and call y-combinator. |
| 18:18 | sdegutis | lokien_: also oxygen, dont forget oxygen |
| 18:18 | sdegutis | tolstoy: LOL man you guys are on a roll |
| 18:19 | justin_smith | tolstoy: for our C round funding we will expand to also cover Italian and Chinese foods |
| 18:19 | lokien_ | sdegutis: I'm a lucky man, oxygen is free in my country |
| 18:20 | sdegutis | :D |
| 18:20 | tolstoy | mexican.menu.io |
| 18:20 | tolstoy | chinese.menu.io |
| 18:20 | justin_smith | tolstoy: and the best one, stoner.menu.io - which randomly pulls ingredients from all the others |
| 18:20 | tolstoy | By these 5 basic ingredients, never worry again. |
| 18:20 | tolstoy | Heh. |
| 18:21 | lokien_ | justin_smith: don't forget 30$/mo pro subscription |
| 18:21 | tolstoy | Click this button, it creates the meal, messages the store, queries your inventory, phones your partner. |
| 18:21 | sdegutis | justin_smith: stoner is basically just clojure.core/random-sample |
| 18:22 | tolstoy | In fact, here's a little device with just a button on it. Pair it via bluetooth, then just push the button and wait. |
| 18:22 | sdegutis | ,(random-sample 0.5 (range 10)) |
| 18:22 | clojurebot | (2 3 4 8 9) |
| 18:22 | sdegutis | hahah nice |
| 18:22 | sdegutis | i never knew about this fn til 2day |
| 18:22 | tolstoy | stoner.menu.io: Blends whatever's left over, cooks, desiccates: cheesy puffs. |
| 18:24 | justin_smith | ,(apply str (random-sample 0.1 (slurp "http://history.eserver.org/gettysburg-address.txt"))) |
| 18:24 | clojurebot | #error {\n :cause "denied"\n :via\n [{:type java.lang.SecurityException\n :message "denied"\n :at [clojurebot.sandbox$enable_security_manager$fn__887 invoke "sandbox.clj" 69]}]\n :trace\n [[clojurebot.sandbox$enable_security_manager$fn__887 invoke "sandbox.clj" 69]\n [clojurebot.sandbox.proxy$java.lang.SecurityManager$Door$f500ea40 checkRead nil -1]\n [java.io.FileInputStream <init> "FileInp... |
| 18:24 | justin_smith | :P |
| 18:25 | justin_smith | anyway, that returned "T\rooa ileta \ree nacntdddcretoa toaet o\raills-afreeti.tt\rhlcn nrio lhgr te\r d Torwtl efereihted oc. tbdcaetarmh drntsers d-t sao l ronpeeopolrrhe--ableee- iter NPo)ryd,e svpr itig e nuto" |
| 18:25 | amalloy | oh, random-sample is a new one |
| 18:25 | sdegutis | amalloy: for sure, looks way handy |
| 18:27 | justin_smith | ,(:added (meta #'random-sample)) |
| 18:28 | clojurebot | "1.7" |
| 18:28 | sdegutis | yeah for sure, 1.7 |
| 18:29 | sdegutis | justin_smith, amalloy: the implementation is amazing too |
| 18:29 | sdegutis | dont look at it, take a guess how it works |
| 18:29 | justin_smith | haha, too late |
| 18:30 | sdegutis | sorry |
| 18:32 | hiredman | I know |
| 18:33 | hiredman | random-sample is such an exciting addition |
| 18:33 | TEttinger | ,(random-sample 1/7 (range 10)) |
| 18:33 | clojurebot | (2 7) |
| 18:35 | sdegutis | haha so close |
| 18:36 | TEttinger | ,(random-sample Math/PI (range 10)) |
| 18:36 | clojurebot | (0 1 2 3 4 ...) |
| 18:36 | TEttinger | ,(random-sample (/ 1 Math/PI) (range 10)) |
| 18:36 | clojurebot | (0 6 7 9) |
| 18:36 | TEttinger | it's hilarious that we have random-sample but not any way to seed the RNG |
| 18:36 | TEttinger | seems kinda handy for tests! |
| 18:39 | sdegutis | I HAVE AN IDEA |
| 18:39 | justin_smith | sdegutis: did you just invent test.generative? |
| 18:42 | srruby | I'm porting some code that doesn't loop through a sequence. I'm looking at using take-while and iterate or using for :while |
| 18:43 | srruby | Does it makes sense to use (for if you aren't going through a collection ? |
| 18:43 | justin_smith | srruby: well, it has to be a seq of some sort before for can use it |
| 18:43 | justin_smith | what is the source of data |
| 18:44 | amalloy | what a philosophical question |
| 18:45 | srruby | I'm doing some number crunching and repeatedly . Source is a single number that I'm factoring |
| 18:45 | sdegutis | ,(let [n 1/7] (->> #(random-sample n (range 10)) (repeatedly) (map-indexed list) (filter (fn [[index item]] (and (> (count item) 1) (not (zero? (last item))) (= n (apply / item))))) (ffirst))) |
| 18:45 | clojurebot | 4 |
| 18:45 | sdegutis | pretty printed version https://gist.github.com/sdegutis/8b7e1c066645b288781d1921cce5a3e6 |
| 18:45 | sdegutis | ,(let [n 1/7] (->> #(random-sample n (range 10)) (repeatedly) (map-indexed list) (filter (fn [[index item]] (and (> (count item) 1) (not (zero? (last item))) (= n (apply / item))))) (ffirst))) |
| 18:45 | clojurebot | 23 |
| 18:45 | sdegutis | ,(let [n 5/7] (->> #(random-sample n (range 10)) (repeatedly) (map-indexed list) (filter (fn [[index item]] (and (> (count item) 1) (not (zero? (last item))) (= n (apply / item))))) (ffirst))) |
| 18:45 | amalloy | what makes you think the result of repeatedly is not a sequence, srruby? |
| 18:45 | clojurebot | 30859 |
| 18:45 | sdegutis | WHOA |
| 18:46 | TEttinger | srruby: do you mean something like iterate ? |
| 18:46 | srruby | amalloy: Sorry for being unclear. I'm not using repeatedly. |
| 18:47 | srruby | amalloy: Thanks everyone, I guess I'll either use iterate or for. I'm porting a while loop. |
| 18:48 | justin_smith | srruby: are you trying to generate a collection or are you doing this for side effects? |
| 18:48 | justin_smith | if you aren't doing this in order to generate a collection, don't use for, if you don't need the return value, use doseq, if you need some other kind of result use reduce |
| 18:48 | srruby | justin_smith: Thanks everyone! |
| 18:48 | sdegutis | so, to be clear: |
| 18:48 | kwladyka | https://github.com/pelle/clauth or https://github.com/ddellacosta/friend-oauth2 or something else? |
| 18:49 | sdegutis | it took 30860 tries before (random-sample 5/7 [0 1 2 3 4 5 6 7 8 9]) returned [5 7] |
| 18:51 | sdegutis | ,(defn times-to-get-to-fraction [n x] (->> #(random-sample n (range x)) (repeatedly) (map-indexed list) (filter (fn [[index item]] (and (> (count item) 1) (not (zero? (last item))) (= n (apply / item))))) (ffirst))) |
| 18:51 | clojurebot | #'sandbox/times-to-get-to-fraction |
| 18:51 | sdegutis | ,(times-to-get-to-fraction 1/7 10) |
| 18:51 | clojurebot | 111 |
| 18:51 | sdegutis | ,(times-to-get-to-fraction 1/7 100) |
| 18:52 | sdegutis | too mcuh broke bot |
| 18:52 | amalloy | .(apply * 5/7 5/7 (repeat 8 2/7) 1.0) |
| 18:52 | clojurebot | Execution Timed Out |
| 18:52 | amalloy | ,(apply * 5/7 5/7 (repeat 8 2/7) 1.0) |
| 18:52 | clojurebot | #error {\n :cause "Don't know how to create ISeq from: java.lang.Double"\n :via\n [{:type java.lang.IllegalArgumentException\n :message "Don't know how to create ISeq from: java.lang.Double"\n :at [clojure.lang.RT seqFrom "RT.java" 542]}]\n :trace\n [[clojure.lang.RT seqFrom "RT.java" 542]\n [clojure.lang.RT seq "RT.java" 523]\n [clojure.lang.RT cons "RT.java" 662]\n [clojure.core$cons__433... |
| 18:52 | sdegutis | amalloy: lol ur drunk thats a period |
| 18:52 | amalloy | ,(apply * 1.0 5/7 5/7 (repeat 8 2/7)) |
| 18:52 | clojurebot | 2.2656852317705177E-5 |
| 18:52 | amalloy | 1/50000 |
| 18:52 | amalloy | ish |
| 18:54 | sdegutis | amalloy: you work for cognitect right? |
| 18:56 | sdegutis | bbl she made delicious taco wrap things with chicken meat |
| 18:56 | sdegutis | i dunno or care what its called its good |
| 18:59 | TEttinger | mmm factoradic numbering is my favorite |
| 19:05 | tolstoy | Can you get openjdk 8 on the Mac these days? |
| 19:10 | TEttinger | tolstoy: yeah, Zulu |
| 19:10 | TEttinger | it's actually a really nice build |
| 19:10 | tolstoy | What's that? |
| 19:11 | tolstoy | H. This? https://hub.docker.com/r/azul/zulu-openjdk/ |
| 19:12 | tolstoy | Ah: http://www.azul.com/downloads/zulu/zulu-mac/ |
| 19:13 | sdegutis | tolstoy: did you get your openjdk8 q answered |
| 19:13 | sdegutis | i have oracle java sdk 8 installed and its such a pita |
| 19:13 | tolstoy | I think so. |
| 19:13 | sdegutis | it pops up every few days telilng me to upgrade my java and im like shut up |
| 19:13 | tolstoy | Ah, the java browser plugin thing. |
| 19:13 | sdegutis | similar to https://img.buzzfeed.com/buzzfeed-static/static/2016-01/20/11/enhanced/webdr15/enhanced-14111-1453306596-2.png but not 100% |
| 19:16 | tolstoy | sdegutis Every use /usr/libexec/java_home? |
| 19:17 | tolstoy | With -V? |
| 19:17 | tolstoy | Hm. If you add -v 1.8, it'll find the most recent (this zulu thing for me). |
| 19:18 | tolstoy | AND, it has startcom certs. ;) |
| 19:18 | sdegutis | tolstoy: i never touch java via cmdline |
| 19:18 | sdegutis | tolstoy: my only interaction with java is either via clojure or via some .pkg file |
| 19:19 | sdegutis | that said, i enjoy using java 1.8 apis like LocalDateTime (sooo nice) |
| 19:19 | tolstoy | sdegutis It's possible to have multiple versions on OSX, so that util can be used to set JAVA_HOME to the right one. |
| 19:19 | sdegutis | cool |
| 19:20 | tolstoy | It never comes up if you just use the latest oracle one. |
| 19:24 | noethics | are there any decent libraries for bytecode engineering |
| 19:24 | noethics | specifically for clojure |
| 19:25 | tolstoy | noethics: Probably not what you were thinking of, but https://github.com/clojure/tools.emitter.jvm. ;) |
| 19:26 | TEttinger | doesn't one of ztellman's libs do that? gloss? |
| 19:26 | sdegutis | yeah i was gonna say, if anyone did it its ztellman |
| 19:26 | tolstoy | That's for working with bytes, but noethics said bytecode. |
| 19:26 | noethics | jvm bytecode |
| 19:26 | hiredman | I've only ever used asm (the library the clojure compiler uses) to generate bytecode |
| 19:26 | noethics | this is interesting but not useful to me :P |
| 19:27 | noethics | yeah i would prefer some clojure wrapper for asm |
| 19:27 | tolstoy | Yeah. |
| 19:28 | hiredman | https://github.com/hiredman/bc/blob/master/src/bc/core.clj is a badly written classfile parser written in clojure |
| 19:28 | noethics | lol |
| 19:28 | hiredman | along with some completely nonsensical ruby code generting stuff |
| 19:29 | hiredman | (I think I wanted to translate some bytecode into ruby for reasons) |
| 19:29 | noethics | i feel liek there could be some really nice wrapper for asm in clojure |
| 19:29 | hiredman | I dunno, I have't found asm to be very terrible to use directly |
| 19:29 | noethics | it's pretty terrible to use by itself ime :P |
| 19:32 | kwladyka | I am looking the best OAuth 2 solution for Clojure. I found some solutions, but i am not sure about functionality. I need connect as a client to authorisation-app, and later with the same client to another app with token to get some resources. |
| 19:32 | kwladyka | Can you share some experience about OAuth 2 in Clojure? |
| 19:34 | kwladyka | (i need to client both sided, client and server authorisation, also app to get resources) |
| 19:39 | kwladyka | mmm time to sleep, i will think about that tomorrow :) |
| 19:40 | sdegutis | bbl |
| 19:48 | hiredman | I seem to recall someone doing their own port of the clojure compiler a few years back, and they wrote their own assembler for it |
| 19:53 | hiredman | someone already mentioned tools.emitter.jvm, which a data based syntax like https://github.com/clojure/tools.emitter.jvm/blob/master/src/main/clojure/clojure/tools/emitter/jvm/emit.clj#L400-L426 and then has code to use that to drive asm |
| 20:00 | noethics | i need to do some analysis too |
| 20:01 | noethics | not just write instructions :P |
| 20:03 | noethics | but i think there could be some nice clojure way of making my own ast with just asm |
| 20:04 | noethics | i can only thing of doing that with lists of classnodes though. visitor pattern would be best i assume? |
| 22:01 | sdegutis | I think a function like if-let with multiple sequentially bound bindings like let would be useful. |
| 22:02 | sdegutis | It would be kind of like some-> |
| 22:02 | sdegutis | In the sense that it would continue as long as none of the bindings were nil, but short-circuiting. |
| 22:02 | sdegutis | some-let |
| 22:03 | sdegutis | This may be the first and only general-purpose macro that I'm actually considering implementing for myself if clojure.core doesn't end up with it. |
| 22:06 | sdegutis | I'm going to assume that justin_smith's going to say that amalloy_ has already implemented this in flatland/useful. |
| 22:13 | Lewis | what makes code data? this concept is still abstract to me |
| 22:15 | sdegutis | Lewis: watch |
| 22:16 | hiredman | ,(type (read-string "(def x 1)")) |
| 22:16 | sdegutis | ,'(+ 1 2) |
| 22:16 | clojurebot | clojure.lang.PersistentList |
| 22:16 | clojurebot | (+ 1 2) |
| 22:16 | sdegutis | ,(first '(+ 1 2)) |
| 22:16 | clojurebot | + |
| 22:16 | sdegutis | ,(second '(+ 1 2)) |
| 22:16 | clojurebot | 1 |
| 22:16 | sdegutis | ,(type (first '(+ 1 2))) |
| 22:16 | clojurebot | clojure.lang.Symbol |
| 22:16 | sdegutis | ,((juxt identity type) (first '(+ 1 2))) |
| 22:16 | clojurebot | [+ clojure.lang.Symbol] |
| 22:16 | Lewis | so what makes it data? |
| 22:16 | sdegutis | Anyway, it's done. Here: |
| 22:16 | Lewis | as opposed to what |
| 22:17 | sdegutis | Lewis: try representing Ruby code as Ruby data |
| 22:17 | sdegutis | ,(defmacro some-let [bindings body] (let [[x y & rest] bindings] `(if-let [~x ~y] ~(if (empty? rest) body `(some-let ~(vec rest) ~body))))) |
| 22:17 | clojurebot | #'sandbox/some-let |
| 22:17 | sdegutis | ,(some-let [a 1, b (do (prn :a a) (inc a)), c (do (prn :b b) (inc b))] :bla) |
| 22:17 | clojurebot | :a 1\n:b 2\n:bla |
| 22:17 | Lewis | sdegutis: simple example please. I'm picked up clojure today again after a long hiatus |
| 22:18 | sdegutis | ,(some-let [a 1, b (do (prn :a a) nil), c (do (prn :b b) (inc b))] :bla) |
| 22:18 | clojurebot | :a 1\n |
| 22:18 | Lewis | s/example/examples* |
| 22:18 | sdegutis | Sweet, it works!!! |
| 22:18 | Lewis | can you just say in words what make it data |
| 22:18 | sdegutis | Lewis: Sorry, my some-let macro wasn't an example intended for you. This is though: |
| 22:19 | sdegutis | Lewis: watch how reverse works: |
| 22:19 | sdegutis | ,(reverse [1 2 3]) |
| 22:19 | clojurebot | (3 2 1) |
| 22:19 | sdegutis | Lewis: With me so far? |
| 22:19 | Lewis | ok? |
| 22:19 | Lewis | i am |
| 22:19 | sdegutis | Lewis: now is it clear to you how this function call works? |
| 22:19 | Lewis | you reversed a vector |
| 22:19 | sdegutis | ,(+ 1 2 3) |
| 22:19 | clojurebot | 6 |
| 22:20 | Lewis | you summed up a list |
| 22:20 | sdegutis | Lewis: so what happens if I do this? |
| 22:20 | sdegutis | (3 2 1 +) |
| 22:20 | Lewis | error |
| 22:20 | sdegutis | Lewis: what will that last form evaluate to? |
| 22:20 | sdegutis | And why? |
| 22:20 | Lewis | because the first operator should be a function |
| 22:20 | sdegutis | Right. But if it were reversed, it would be fine, right? |
| 22:20 | Lewis | first argument* |
| 22:21 | Lewis | yes |
| 22:21 | sdegutis | Lewis: Now what do you think this is? |
| 22:21 | sdegutis | ,(quote (+ 1 2 3)) |
| 22:21 | clojurebot | (+ 1 2 3) |
| 22:21 | hiredman | the clojure code (let [x 1] 1) is a list first the symbol let as its first element, say in javascript the code might be var x = 1; return 1, what data structure is that code? it isn't one |
| 22:21 | sdegutis | hiredman: shut up im having fun here |
| 22:21 | sdegutis | Lewis: no need to guess, watch: |
| 22:21 | sdegutis | ,(type (quote (+ 1 2 3))) |
| 22:21 | clojurebot | clojure.lang.PersistentList |
| 22:21 | sdegutis | ,(map type (quote (+ 1 2 3))) |
| 22:21 | clojurebot | (clojure.lang.Symbol java.lang.Long java.lang.Long java.lang.Long) |
| 22:22 | hiredman | ocaml let x = 1 in 1, what data structure is that code? |
| 22:22 | sdegutis | It's a List of a Symbol followed by 3 Longs. |
| 22:22 | sdegutis | Lewis: with me so far? |
| 22:22 | hiredman | clojure code is made up of datastructure literals, and only datastructure literals |
| 22:22 | sdegutis | Lewis: now watch this |
| 22:22 | sdegutis | ,(defmacro postfox [form] (reverse form)) |
| 22:22 | clojurebot | #'sandbox/postfox |
| 22:22 | sdegutis | ,(postfox (3 2 1 +)) |
| 22:22 | clojurebot | 6 |
| 22:23 | sdegutis | Lewis: see? |
| 22:23 | Lewis | tchip |
| 22:23 | Lewis | dude |
| 22:23 | sdegutis | Hm? |
| 22:23 | Lewis | just tell me with words |
| 22:23 | hiredman | the syntax of clojure is the syntax of a datastructure notation, like json (but richer) |
| 22:23 | sdegutis | Lewis: I just told you in a way more clear way than words. |
| 22:23 | sdegutis | Lewis: Just like drawing a circle is a way better way of demonstrating what a circle is than trying to explain it. |
| 22:23 | Lewis | i clearly dont see the point , i realized that my issue might be with the definition of data |
| 22:24 | sdegutis | Lewis: did you see how that macro just now worked? |
| 22:24 | Lewis | why code is data? can't you put it in words ? |
| 22:24 | Lewis | I dont understand macro yet |
| 22:24 | sdegutis | Lewis: Because Clojure expressions are homoiconic. |
| 22:24 | hiredman | code is data because the code is written in datastructure literals (list literals, vector literals, symbols, etc) |
| 22:25 | Lewis | hiredman: ok, let me ask it another way, why is that a language like ruby code is not data |
| 22:25 | Lewis | or javascript |
| 22:25 | sdegutis | Lewis: the fact that code is data is only applicable in macros |
| 22:25 | sdegutis | hiredman: I give up, have fun with this. |
| 22:25 | hiredman | lewis: they have syntax that is not a datastructure |
| 22:26 | sdegutis | ,(some-let [a 1 b nil c 2] a) |
| 22:26 | clojurebot | nil |
| 22:26 | sdegutis | ,(some-let [a 1 b 3 c 2] a) |
| 22:26 | clojurebot | 1 |
| 22:26 | sdegutis | Woo!! |
| 22:26 | sdegutis | ,(some-let [a 1, b nil, c (prn :c)] a) |
| 22:26 | clojurebot | #error {\n :cause "Unable to resolve symbol: some-let in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: some-let in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6688]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: some-le... |
| 22:26 | sdegutis | Aww. |
| 22:26 | sdegutis | ,(defmacro some-let [bindings body] (let [[x y & rest] bindings] `(if-let [~x ~y] ~(if (empty? rest) body `(some-let ~(vec rest) ~body))))) |
| 22:26 | clojurebot | #'sandbox/some-let |
| 22:26 | hiredman | for example, what datastructure is var x = 1? the equivilant clojure expression is represented as a list and a vector and a symbol and a number (let [x 1]) |
| 22:26 | sdegutis | ,(some-let [a 1, b nil, c (prn :c)] a) |
| 22:26 | clojurebot | nil |
| 22:26 | sdegutis | WOO!! |
| 22:26 | sdegutis | ,(some-let [a 1, b 2, c (prn :c)] a) |
| 22:26 | clojurebot | :c\n |
| 22:27 | sdegutis | Exciting times. |
| 22:27 | sdegutis | hiredman: what do you think of this macro? |
| 22:27 | sdegutis | some-let |
| 22:27 | hiredman | for javascript to have code as data, you would have to get rid of all the javascript syntax that is not json, and figure out how to represent that syntax in json |
| 22:28 | Lewis | hiredman: thank you i got it |
| 22:29 | Lewis | so the fact that code is data just mean that the source code is data structure on top of data structures. list of lists of symbols |
| 22:30 | hiredman | you can say just, but it makes different kinds of meta programming much nicer |
| 22:31 | hiredman | because the same tools you use to manipulate data (maps, sets, vectors, lists) can be used to manipulate code |
| 22:31 | Lewis | right |
| 22:31 | Lewis | which make sense |
| 22:31 | Lewis | thanks i got it. i personally think that a word explanation speak louder than code in this instance (nto always the case) |
| 22:31 | Lewis | not* |
| 22:44 | sdegutis | I just aid that. |
| 22:44 | sdegutis | *said |
| 22:44 | sdegutis | Man never mind, that's the last time I try to help. |
| 23:13 | sdegutis | Hi. |
| 23:27 | troydm | is it possible to traverse transient sequence? and destructure it? |
| 23:34 | troydm | or rather is there any efficient way going over sequence and modifiying elements of it recursively but with a way to stop at any given point with all previous modifications intact |
| 23:34 | troydm | something like a map but with a way to bailout |
| 23:35 | troydm | or actually not map since I want to process atleast 6 elements per each iteration |
| 23:35 | troydm | I'm thinking of doing destructuring and then doing into |
| 23:36 | troydm | (into [a b c d e] rst) or something like that |
| 23:36 | troydm | but I don't know if it's effiecient or not |