2014-12-21
| 01:53 | kenrestivo | hmm, buffering in async channels is kind of ruining my day now too. seems it takes 3 or 4 repetitions of a message before it actually gets handled by any of the listening threads |
| 01:54 | raspasov | kenrestivo: what's the problem? |
| 01:55 | kenrestivo | i've got a message bus with pub/sub. several listeners. i send a message... takes 3 or 4 repetitions before any of the listeners seem to get it. and then there's like a 1-second delay after that last message before it goes through |
| 01:56 | raspasov | networked pub/sub or in-process only? |
| 01:56 | raspasov | i.e. pub/sub over core.async only (local, in process) or via some external queue ? |
| 01:58 | kenrestivo | in-process |
| 01:59 | kenrestivo | just core.async, no other queues. the message bus has a buffer though |
| 01:59 | kenrestivo | i'm wondering what the typical/expected latency would be for such a thing? |
| 02:00 | raspasov | not 100% sure but should be pretty fast - what do you mean by 3-4 repetitions ? |
| 02:00 | raspasov | 3-4 repetitions of what? |
| 02:00 | kenrestivo | i have to send the same message, repetitively, before it gets received |
| 02:01 | raspasov | that's definitely weird, it's either a bug, or you're using something wrong, how are you trying to take from the channel? |
| 02:01 | kenrestivo | and, interestingly, it only gets received fewer times than it was sent. it's as if the other sends are lost |
| 02:01 | kenrestivo | takes are in a loop in a future |
| 02:01 | raspasov | do you have gist? |
| 02:02 | kenrestivo | i could try to distill one down |
| 02:03 | raspasov | your take should look something like (go (loop [] (println "got val on a chan::" (<! my-chan)) (recur))) |
| 02:03 | raspasov | yea that would be helpful, hard to talk without code :) |
| 02:04 | kenrestivo | well there are a lot of moving parts. |
| 02:04 | kenrestivo | there are two pubs, off of one message bus, in several namespaces, etc |
| 02:04 | kenrestivo | but yeah, let me paste something |
| 02:05 | raspasov | are you using the core.async pub/sub stuff or building your own? last I remember the core.async pub/sub was experimental |
| 02:06 | kenrestivo | the core of it is just this https://www.refheap.com/95237 |
| 02:06 | kenrestivo | hmm, i didn't realize i was gonna get cut that badly, but i'm not surprised. |
| 02:06 | raspasov | first of all, use (thread) instead of (future) |
| 02:07 | raspasov | not sure what's the difference, but that's the recommended way to do it I beliee |
| 02:07 | raspasov | I think there is some |
| 02:08 | kenrestivo | the difference is that a channel is returned from thread. i don't care about the result, so i was usnig a future instead (also can future-cancel) |
| 02:08 | kenrestivo | i don't see any notes about pub/sub being experimental, but all of async is alpha, so i'm not too surprised |
| 02:09 | raspasov | yea I don't see it either |
| 02:09 | raspasov | in general it has been pretty solid for me, but I haven't used to pub/sub part of it |
| 02:10 | raspasov | is that drop happening under load or just when you put values one by one? |
| 02:10 | raspasov | I also see "Items received when there are no matching subs get dropped." |
| 02:10 | raspasov | http://clojure.github.io/core.async/#clojure.core.async/pub |
| 02:11 | raspasov | are your subs active when the first messages gets put on the pub channel? |
| 02:13 | kenrestivo | no load, just testing. |
| 02:13 | kenrestivo | the subs are active, yes. |
| 02:14 | kenrestivo | i'm starting to think i might be rearchitecting the whole app without async soon. |
| 02:15 | raspasov | I bet there's something weird with what you're doing, I highly doubt there's a glaring bug that no-one has noticed that's so elementary, but yes - async is a tool for special cases and you should make sure you need it before you use it, esp this pub/sub |
| 02:15 | raspasov | I've been using channels for a while and never felt the need to use pub/sub |
| 02:16 | kenrestivo | that'd be a less drastic step: i could blow off this message bus idea and just pass channels around instead |
| 02:18 | kenrestivo | the idea of decoupling everything was very attractive. but now i'm wondering if it just is making things more complex than necessary. |
| 02:22 | crispin | hey peeps! How do i eval an expression with a macro in it? |
| 02:22 | crispin | I can do this |
| 02:22 | crispin | ,(eval '(map inc [1 2 3])) |
| 02:22 | clojurebot | (2 3 4) |
| 02:23 | crispin | but I cant do this |
| 02:23 | crispin | ,(eval '(doseq [i [1 2 3]] (inc i))) |
| 02:23 | clojurebot | nil |
| 02:23 | crispin | doseq is a macro. Putting in macroexpand doesnt fix it |
| 02:24 | kenrestivo | doseq returns nil, it's side-effecting |
| 02:24 | crispin | ahahhhhhahah |
| 02:24 | crispin | ffs |
| 02:24 | kenrestivo | you meant "for" not "doseq"? |
| 02:24 | crispin | ,(eval '(doall (for [i [1 2 3]] (inc i)))) |
| 02:24 | clojurebot | (2 3 4) |
| 02:24 | crispin | haha yeah |
| 02:25 | crispin | thanks kenrestivo |
| 02:25 | kenrestivo | np |
| 02:25 | crispin | so eval lazyseq will expand the seq, not just return the lazyseq? |
| 02:25 | crispin | ,(eval '(for [i [1 2 3]] (inc i))) |
| 02:25 | clojurebot | (2 3 4) |
| 02:25 | crispin | right |
| 02:27 | raspasov | kenrestivo: check this out https://gist.github.com/raspasov/81c678961b6292eebe04 |
| 02:27 | raspasov | seemed to work for me |
| 02:28 | raspasov | I get the published message on both subscribers |
| 02:32 | kenrestivo | yeah, my test code works too, and did, before i weaved it into the app |
| 02:33 | kenrestivo | everything worked fine, which is why i felt safe goign with this approach. of course, now that it's into the app which is all built out, it's not working :-/ |
| 02:34 | kenrestivo | not too surprising. |
| 02:34 | raspasov | yea not sure then, it seems unlikely that the guarantees of core.async's pub/sub will change though - how big is your app in terms of lines of code? as you said, really think if you really need that pub/sub mechanism in there |
| 02:35 | kenrestivo | it's not that big. i was hoping to not have to pass a bunch of channels around, a single message bus seemed so much cleaner |
| 02:35 | kenrestivo | but if latency issues are cropping up, i've got to back out of that idea |
| 02:35 | kenrestivo | one of the great things about clojure is how easy it is to make rather large sweeping changes without too much work |
| 02:36 | raspasov | yes, that's true |
| 02:36 | raspasov | Lisp is just like a lego |
| 02:36 | kenrestivo | if i had to do a major rethink about stuff lke this in any other language, i think i'd be well and truly screwed |
| 02:36 | raspasov | how long have you been doing Clojure? |
| 02:36 | kenrestivo | almost 3 years, off and on |
| 02:37 | raspasov | cool |
| 02:37 | kenrestivo | and i keep cutting my fingers on new things (like async) so i never really feel that experienced |
| 02:38 | kenrestivo | you seem to be fairly comfortable with core.async. thanks for your help and perspective. |
| 02:39 | raspasov | no problem, hope I could help more, feels like something small is off somewhere, if you can share some more code, esp where the stuff is being put on the channel? but if you're going to re-architect out of pub/sub prob not worth it |
| 02:41 | kenrestivo | i'm going to try to simplify. the fewer moving parts the better. |
| 02:43 | raspasov | yea, agree |
| 04:28 | rivrkeepr | lookz2boring |
| 04:28 | rivrkeepr | 4actualInterchange |
| 04:32 | _steven_ | if i do (let [x <expression>]), is it true that everytime i use x, the code inside the expression will be run again? |
| 04:35 | expez | How can I find out if some macro is in use? To find out if a function is in use I've been expecting the AST, but macros are expanded prior to building said AST. |
| 04:35 | expez | s/expecting/inspecting/ |
| 04:35 | dysfun | you can read the file and not macroexpand it |
| 04:35 | adu | what's the difference between doto and -> |
| 04:36 | expez | dysfun: then what? string match the macro name? |
| 04:36 | dysfun | doto is for mutable things |
| 04:36 | dysfun | expez: yup |
| 04:36 | expez | this was my 'simplest thing that could possibly work' plan, but I was hoping for other options :p |
| 04:37 | dysfun | that would require knowledge of what you're trying to achieve |
| 04:37 | adu | dysfun: so x.f() x.g() instead of y = x.f(), y.g()? |
| 04:37 | expez | dysfun: I'm writing tooling to clean up the ns form. Part of that job is getting rid if stuff that is no longer in use. |
| 04:38 | dysfun | adu: if you replace that comma with a semicolon, yes |
| 04:38 | dysfun | expez: you're reimplementing slamhound? |
| 04:38 | adu | how do you pronounce -> and ->>? |
| 04:38 | dysfun | 'thread' and 'thrush' or 'thread-last' |
| 04:38 | expez | dysfun: yes |
| 04:39 | dysfun | is there a reason you're not just using slamhound? |
| 04:39 | expez | yes, it doesn't work :p |
| 04:39 | dysfun | perhaps we can help you with that rather than reinventing the wheel? :) |
| 04:40 | dysfun | (or perhaps you may be tempted to patch it?) |
| 04:41 | expez | dysfun: https://github.com/clojure-emacs/refactor-nrepl/pull/9 I think this op does a bit more than slamhound and it should work better |
| 04:42 | dysfun | oh that's pretty cool |
| 04:43 | dysfun | so doing this 'properly' is going to require stepping through macroexpansion and it'll get very tedious |
| 04:43 | dysfun | but 99% of cases will be caught by the 'simple' method |
| 04:44 | dysfun | thanks largely to syntax-quote |
| 04:44 | expez | so if I search for "(some-macro " what's going to get missed? |
| 04:45 | expez | maybe I should search for "some-macro", then and just leave an extra symbol in the ns every now and then |
| 04:45 | dysfun | i suspect there's scope for missing things when generating macros in macros |
| 04:45 | justin_smith | "( some-macro" is valid, though pathological |
| 04:45 | justin_smith | ,( + 1 1 ) |
| 04:45 | dysfun | and you would actually step through an edn tree, rather than string match |
| 04:45 | clojurebot | 2 |
| 04:47 | dysfun | justin_smith: this explains a lot about your code :) |
| 05:47 | expez | dysfun: I did find a use for, parts of slamhound, https://github.com/clojure-emacs/clj-refactor.el/pull/88 |
| 06:08 | dysfun | :) |
| 06:11 | dysfun | anyone using reloaded workflow with something that tries to invert control? in this case jmonkeyengine |
| 06:12 | dysfun | i'm pondering starting it on another thread and wanted to know things i'll have to watch out for since it's rather not in the spirit |
| 06:14 | dysfun | i'm also very much hoping i won't have to keep it on the main thread (as is the case with javafx), because my first thoughts on that are that it'll be messy as hell |
| 07:44 | triss | so chaps. what's the simplest way to extract values for two keys in a map in to a tuple? |
| 07:46 | andyf | triss: juxt, probably. |
| 07:46 | andyf | ,((juxt :c :d) {:a 1 :c 2 :d 7 :e -2}) |
| 07:46 | clojurebot | [2 7] |
| 07:46 | andyf | if by 'tuple' you mean vector. |
| 07:47 | triss | splendid thanks andyf! |
| 07:48 | andyf | juxt is useful for other similar things, too, when you want a vector of results |
| 08:08 | lodin | Is there any way to write a macro that would insert two elements into e.g. (let [(mymacro)] ...), without modifying let? |
| 08:08 | Bronsa | lodin: no that's not possible |
| 08:08 | lodin | That's what I figured. :-/ |
| 08:09 | lodin | The drawback of Clojure prefering flat structures and less brackets. |
| 08:09 | dysfun | ooh, i hadn't seen 'juxt' used like that before, that's pretty neat |
| 08:09 | Bronsa | lodin: that wouldn't be possible in cl either |
| 08:10 | lodin | Bronsa: Why not? (I don't know CL.) |
| 08:10 | Bronsa | dysfun: (let ((mymacro 1))) would bind mymacro to 1 rather than invoke mymacro and bind whatever first symbol it returned |
| 08:10 | dysfun | i think you mean 'lodin' |
| 08:10 | Bronsa | dysfun: yeah sorry |
| 08:10 | Bronsa | lodin: ^ that was meant for you |
| 08:11 | lodin | Bronsa: True. |
| 08:11 | lodin | So maybe let wasn't the best example. :-) |
| 08:11 | Bronsa | amalloy_: picasso is the daily spammer |
| 08:12 | triss | ok... laziness is confusing me re: writing performant code... |
| 08:12 | triss | anyone know of any good writings on the subject? |
| 08:12 | lodin | Bronsa: (let (((mymacro 1)))) then? Can't bind to (mymacro 1). ;-) |
| 08:13 | triss | or will this sort of understanding take a while to sink in? |
| 08:13 | Bronsa | lodin: I'll take that as a joke :) |
| 08:13 | dysfun | triss: don't worry about performance yet. worry about performance when you have a performance problem |
| 08:13 | dysfun | focus on algorithm order of complexity |
| 08:14 | triss | i got one.... I'm wondering wether clojurescript's a nicer language that js for writing low level web audio stuff. |
| 08:14 | dysfun | plus as you say, you'll develop an intuition in time |
| 08:14 | dysfun | how do you mean? run it on client side? |
| 08:15 | triss | "algorithm order or complexity"? |
| 08:15 | triss | yep. run on the client side.... |
| 08:15 | dysfun | https://en.wikipedia.org/wiki/Big_O_notation |
| 08:15 | dysfun | well if you're running on the client side, i don't see you have much choice than clojurescript |
| 08:15 | triss | cheers dysfun. I think I'm paying attention to all that stuff. |
| 08:16 | lodin | triss: Note that if if have ((juxt k1 k2) the-map)) you could run into problems. |
| 08:16 | lodin | ,(let [a 3 b 5 m {a :three b :five}] ((juxt a b) m)) |
| 08:16 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn> |
| 08:16 | lodin | Not fun to debug. |
| 08:16 | dysfun | in which case, i recommend not worrying about performance yet |
| 08:16 | triss | cheers dysfun. we'll see how it goes. |
| 08:17 | dysfun | i've yet to write any clojure which wasn't "fast enough" if that helps, and i've been doing it full time for a while now |
| 08:17 | triss | excellent news. cheers dysfun |
| 08:18 | dysfun | in general, most problems deal with a fairly small amount of data anyway and even order of complexity makes little difference |
| 08:18 | dysfun | not that i'd advocate not paying it attention |
| 08:19 | lodin | Bronsa: Yes, a joke. Partly. ;-) It's like of like when you do (-> a (#(... % ...))) to move the "insertion point". Really don't look good. (Yes, I know there are other macros too.) |
| 08:20 | triss | what's worrying me is that the callbacks required to do web-audio stuff pass you in an input array and expect you to populate an output array |
| 08:20 | triss | it feels most unnatural in clojure to be writing a function like this. |
| 08:21 | triss | most example code (in JS) doesn't the imperative thing of updating a slot at a time of the output array in a for loop |
| 08:22 | dysfun | you may even find that it's better to just write it in javascript for that bit |
| 08:22 | dysfun | one of the great things about clojurescript is that you get proper javascript interop |
| 08:23 | triss | hmmmm... I'm gonna push on with cljs for the time being and see if its sluggish or not. |
| 08:24 | triss | fast enough is fast enough i suppose. |
| 08:26 | dysfun | depends how much audio you're processing i guess |
| 08:27 | triss | 44100 samples of it per second. with only a smidgeon of latency |
| 08:42 | triss | so what's a nice ay of copying a lazy sequence in to a Java/JS array? |
| 08:42 | triss | ^nice way |
| 08:43 | triss | I guess doing this could be considered not nice at all..... |
| 08:51 | brucehauman | triss: clj->js |
| 10:15 | vmarcinko | hey everyone, i have a need to have huge number of processes within my app, each of them corresponding to single entity such as Order, so one can have few hundreds of thousands of orders... Each of this orders has its own, potentially complex, lifecycle, but although at first glance core.async would be good since it inverts the control, i cannot see that it is good fit for it, because I need individual go blocks for each entity, an |
| 10:15 | vmarcinko | d process can last even months/years.. |
| 10:16 | vmarcinko | so i just wanted to have some kind of conrimation that core.async is not made for this kind of "processes" |
| 10:18 | vmarcinko | these kind of processes are usually handled in java land by some SOA/BPM platforms such as BPEL/BPMN, but it seems to me these are a bit different then core.async processes - they can last for years, they are not kept in memory, they stroe their current state thus if one reobots the app, it cpontinues where it left off etc.. |
| 10:33 | triss | ah thanks brucehauman..... |
| 10:33 | triss | but doesn't that create a new array? I want to populate an existing one. |
| 11:07 | Bronsa | chouser: hi, mind banning picasso? the usual spam bot |
| 11:28 | luxbock | I have a deftype backed up by a vector of doubles, and I'll be serializing a lot of these inside a tree structure to disk. would it make sense to re-implement Serializable to use a double-array for writing and reading from disk instead to save up some disk space, or is this a bad idea? |
| 11:42 | mindbender1 | How do I remove hidden directories from a file-seq? |
| 12:15 | justin_smith | triss: for audio processing with low latency, everything should remain arrays, don't use vectors or lazy seqs for samples |
| 12:16 | triss | ahhhhhhh..... thought so justin_smith thanks..... |
| 12:17 | triss | that won't the last few hours of attempting to write a bitcrusher in a functional style go away though |
| 12:17 | triss | clojure really is ugly for that sort of thing though.... |
| 12:18 | justin_smith | triss: check out kunstkusic/pink to see low latency audio processing in clojure done decently |
| 12:20 | triss | cheers justin.... not seen those. I'll take a peek |
| 12:20 | justin_smith | *kunstmusic that is (irc from the phone) |
| 12:21 | justin_smith | it's just one project, kunstmusic is the org, pink the package |
| 12:22 | justin_smith | , |
| 12:22 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 12:23 | triss | thanks man. this stuff looks really cool |
| 12:25 | jonathanj | i'm getting the following error from this <https://pb.codehash.net/kitokegi.clj> yesql code and i have no idea what it's telling me: Exception in thread "main" clojure.lang.ArityException: Wrong number of args (1) passed to: generate/generate-query-fn/query-wrapper-fn--5115, compiling:(/private/var/folders/qj/lb3tbsp97gg74jpcxtcw30zm0000gn/T/form-init271047470154200468.clj:1:123) |
| 12:28 | jonathanj | oh... i guess there is no 1 arity version of the generated query functions, that's unfortunately rather cryptic |
| 12:31 | triss | is there a way to swap the order or a functions arguments? |
| 12:32 | TEttinger | justin_smith, kinda funny how the german word for art (kunst) is so un-beautiful |
| 12:32 | justin_smith | triss: s/or/of? |
| 12:32 | justin_smith | TEttinger: heh, indeed |
| 12:32 | triss | TEttinger. Art doesn't need to pretty chaps. (or that's the excuse I use for my work) |
| 12:33 | hellofunk | TEttinger or the dutch word |
| 12:33 | TEttinger | heh, indeed. |
| 12:33 | picasso | Bronsa, it was picassoo who was spamming, not picasso |
| 12:33 | picasso | no affiliation |
| 12:33 | TEttinger | lol |
| 12:33 | TEttinger | that's hilariously coincidental |
| 12:34 | TEttinger | maybe the spambots are starting to learn and pick modifications of names used in the channel to divert blame |
| 12:34 | picasso | indeed |
| 12:34 | TEttinger | TEttingerr is spamming now :P |
| 12:34 | picasso | i wouldnt put it past them |
| 12:34 | picasso | kids with too much time |
| 12:35 | TEttinger | there was an excellent thing I read about the spam pharmacy emails mostly distributing counterfeit drugs, and one woman in canada died after consuming too much uranium and lead from online-purchased meds |
| 12:35 | triss | sorry justin_smith: of |
| 12:36 | hellofunk | TEttinger wow that's awful |
| 12:38 | TEttinger | http://www.politico.com/magazine/story/2014/12/pharma-spam-113562.html |
| 12:39 | TEttinger | it makes you wonder, how hard can it possibly be to not but uranium in things? |
| 12:39 | TEttinger | *put |
| 12:40 | TEttinger | triss: to swap fn order in a 2-arg fn? |
| 12:41 | TEttinger | ,(#(map %2 %1) [1 2 3] inc) |
| 12:41 | clojurebot | (2 3 4) |
| 12:43 | TEttinger | for an arbitrary-number of-args order reversal, |
| 12:43 | TEttinger | ,(#(apply map `[~@(reverse %&)]) [10 20 30] [1 2 3] +) |
| 12:43 | clojurebot | (11 22 33) |
| 12:44 | TEttinger | ,(#(apply map `[~@(rseq %&)]) [10 20 30] [1 2 3] +) ; might work? |
| 12:44 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.ArraySeq cannot be cast to clojure.lang.Reversible> |
| 12:44 | TEttinger | assuming map is the fn you want |
| 12:45 | TEttinger | hm wait |
| 12:45 | TEttinger | that's unneeded |
| 12:45 | TEttinger | ,(#(apply map (reverse %&)) [10 20 30] [1 2 3] +) ; might work? |
| 12:45 | clojurebot | (11 22 33) |
| 12:45 | TEttinger | much easier :D |
| 12:45 | triss | cheers TEttinger - mulling this over. it's just a two arg function. |
| 12:46 | TEttinger | then %2 %1 may be easiest |
| 12:46 | TEttinger | there may be a built-in lib fn but I kinda doubt it |
| 12:50 | justin_smith | there is a flip in flatland/useful |
| 12:50 | triss | ah flip... that's what I'm looking for. cheers. |
| 12:51 | triss | what are the reasons for that useful stuff not makings it way in to .core |
| 12:51 | triss | ? |
| 12:52 | triss | hey really are useful... should I be looking to avoid using stuff like applied and flip? the little haskell I've done got me kinda used to it |
| 12:52 | justin_smith | core is pretty conservative about what it includes |
| 12:58 | mindbender1 | I need to get rid of hidden folders from a file-seq. What's an efficient way of doing that? |
| 12:59 | tcrayford___ | mindbender1: can't you just use `filter` and call whatever java api lets you get at hidden/not hidden on File? |
| 13:02 | justin_smith | tcrayford___: what about filtering files inside hidden directories? |
| 13:02 | tcrayford___ | oh, touché :/ |
| 13:03 | justin_smith | at that point you are better off rewriting file-seq |
| 13:03 | tomjack | reimplement file-seq? |
| 13:06 | borkdude | Is it possible to add a message to a :post condition in a function when the assertino fails? |
| 13:12 | bbloom | ,((fn [x] {:post [(and (odd? %) "a message")]} x) 6) ; borkdude: this work? :-) |
| 13:12 | clojurebot | #<AssertionError java.lang.AssertionError: Assert failed: (and (odd? %) "a message")> |
| 13:13 | borkdude | it's a hack ;) |
| 13:13 | bbloom | ,((fn [x] {:post [(do "must be odd" (odd? %)))]} x) 6) ; this feels marginally less hacky |
| 13:13 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )> |
| 13:13 | bbloom | eh, you get the idea |
| 13:24 | munderwo | Is there a way in a let block to have two statements assign to the same var? I basically have two ways of getting a value, if the first doesnt work I want to try the second. and then just deal with the same variable further down in the function. any ideas? |
| 13:25 | bbloom | munderwo: define "doesn't work" |
| 13:26 | munderwo | So in this case we are checking out a git repo. If it already exists on the filesystem then the first function will return a representation of it. If it doesnt find it then we need to check it out, and then the second function will do that and return the exact same representation of it. |
| 13:27 | bbloom | munderwo: (let [repo (or (open-or-nil ...) (clone ...))] .... |
| 13:27 | bbloom | or in two statements: |
| 13:27 | munderwo | in python I would just try the first, put some kind of if statement for None and the assign to the same variable, and then use the same variable further down. |
| 13:27 | bbloom | (let [repo (open-or-nil ...) repo (or repo (clone ... ... |
| 13:28 | bbloom | (let [[status repo] (open ...), repo (if (= status :not-found) (clone ...) repo) .... |
| 13:28 | bbloom | munderwo: one of those many variations should work for you |
| 13:29 | munderwo | ok thanks… i’ll give those a shot |
| 13:30 | bbloom | munderwo: in short, the common pattern is to shadow the variable with a variable of the same name. you just can't specify a 1-armed if, you need to use something like the `or macro, or repeat the variable name in the other arm of the if |
| 13:31 | munderwo | ok, I think that makes sense. Thanks for the help! |
| 13:31 | andyf | Bronsa: I'm getting some exceptions thrown with latest t.a(.j) that I wasn't with the version from about 4 weeks ago. Creating a brief ticket with repro steps -- I haven't figured out what is going on yet. |
| 13:32 | Bronsa | andyf: ok, I'm busy doing stuff right now so I likely won't be able to look at it until tomorrw |
| 13:32 | andyf | No problem. |
| 13:57 | dnolen_ | http://swannodette.github.io/2014/12/21/browserless-clojurescript/ |
| 14:25 | sveri | Hi, I became curious yesterday to try out boot and build my own build.boot file, now when I run boot dev I get this error: ←[1;31mclojure.lang.ExceptionInfo←[m: ←[31mNo implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil (whole stacktrace and the function in question can be found here: http://pastebin.com/fKn0QV8r) Any ideas what is wrong here? |
| 14:32 | michaniskin | sveri: can you paste your build.boot file please? |
| 14:35 | sveri | michaniskin: http://pastebin.com/0XRNzAb2 I thought I saw this error in a different kind of context once, but cannot remember the solution. However, the same code works with my leiningen project |
| 14:39 | michaniskin | sveri: what's on line 8 of sveri.clojure.commons.files.edn source file? |
| 14:39 | michaniskin | sveri: oh i see |
| 14:39 | michaniskin | fname is nil i think |
| 14:39 | michaniskin | trying to make a reader from nil throws |
| 14:40 | michaniskin | i mean there is no resource maybe |
| 14:40 | sveri | michaniskin: ah, resource paths -.- |
| 14:40 | michaniskin | sveri: debug print (io/resource fname) |
| 14:40 | michaniskin | it's probably nil |
| 14:41 | sveri | the boot file I copied from has only this resource path set: src/clj, this is not enough for me, I try it |
| 14:41 | michaniskin | sweet |
| 14:43 | sveri | michaniskin: ok, that error is gone, hopping to the next one :D Btw. are there options for dev-resource paths? I have an extra resource path set for the tests in leiningen |
| 14:44 | michaniskin | sveri: you can call set-env! anywhere |
| 14:44 | michaniskin | you can make a task that calls it |
| 14:44 | michaniskin | basically all the different things in lein can be done in boot with just deftask |
| 14:45 | Bronsa | amalloy: I won't talk about what I just saw. |
| 14:45 | @amalloy | Bronsa: i'm not sure what the deal is there. i didn't actually type that |
| 14:45 | sveri | michaniskin: ok, I think I get it |
| 14:45 | Bronsa | amalloy: <insert joke about your irc client here> |
| 14:45 | michaniskin | (deftask dev [] (set-env! :dependencies #(conj % '[...])) identity) |
| 14:45 | michaniskin | sveri: then you can use it like a lein profile: `boot dev run-tests` |
| 14:46 | michaniskin | or something, there are lots of options cause you're programming there |
| 14:46 | @amalloy | Bronsa: picasso's hostmask is different-looking from previous incarnations, and what i was doing to ban the others apparently results in a ban to *!*@* |
| 14:46 | @amalloy | i actually attempted to ban *!~mike@bb.pixor.net |
| 14:47 | amalloy | so i am gonna leave this for more a competetent op |
| 14:48 | Bronsa | amalloy: I'm pretty sure any client will do the right thing with /mode #clojure +b picasso |
| 14:48 | michaniskin | sveri: clojure.core/identity is actually the noop middleware, like if you have a task that you want to just pass through to the next task and not actually do anything (like the "profiles" pattern above) |
| 14:48 | amalloy | Bronsa: i don't think you want to ban nicks |
| 14:48 | hellofunk | Bronsa: please forgive my ignorance, i beg you most kindly please note the difference in the /mode you mentioned and /ignore |
| 14:49 | sveri | michaniskin: thanks, I just wrote this up |
| 14:49 | Bronsa | amalloy: meh, he's identified though |
| 14:49 | Bronsa | hellofunk: I have already /ignored it but banning it from the channel is the only way to prevent it won't spam other users |
| 14:50 | hellofunk | Bronsa: I care very much to provide to you this moment my thanks, given to you for your succinct reasoning that you have imminently shared |
| 14:50 | sveri | michaniskin: I now got problems with cljx I guess, so if you got some time, this is the stacktrace: http://pastebin.com/svnfVYgD "de/sveri/structconverter/routes/csv.clj" is clj code and de/sveri/structconverter/csv_common is cljx code, looks like it cannot find the compiled cljx classes |
| 14:51 | Bronsa | hellofunk: are you by any chance sdegutis? |
| 14:51 | hellofunk | Bronsa: while my medical history is not something wish to share, i all the same admit that i am unfamiliar with the condition you just mentioned. |
| 15:09 | hellofunk | Bronsa: lol just having a bit of fun, but no i am not that other user, if that's what you meant. |
| 15:10 | hellofunk | btw happy holidays gentlemen and ladies, this has been a good year for me and clojure and you guys are a big part of why |
| 15:15 | TEttinger | hellofunk, yep, clojure's a great language with a great community |
| 15:20 | Deraen | sveri: Interesting. The boot doesn't print anything before the exception? Is your build.boot file still similar to what you linked previously? |
| 15:21 | michaniskin | sveri: you can increase verbosity with the -v option, like `boot -vvvv dev` |
| 15:22 | sveri | Deraen: yea, but I just saw, I have to add a special boot.clj file like in the example, I totall ymissed this |
| 15:22 | Deraen | You were trying to require some code from build.boot which requires some ns which has to be compiled using cljx? |
| 15:24 | Pistahh | hi |
| 15:24 | Pistahh | <- relatively new to clojure |
| 15:25 | Pistahh | how to do ((mymap "foo") "bar") more clojure-ly? |
| 15:26 | michaniskin | Pistahh: (get-in mymap ["foo" "bar"]) |
| 15:27 | michaniskin | Pistahh: see also assoc-in, update-in |
| 15:27 | Pistahh | thy |
| 15:27 | michaniskin | np |
| 15:28 | sveri | Deraen: but yea, I am requiring cljx code in clj code, I guess thats what the error says+ |
| 15:31 | emaczen` | How can I debug in clojurescript repl? |
| 15:31 | emaczen` | I want to find the values of some web-forms. |
| 15:36 | michaniskin | sveri: you can make a task that is after cljx in the pipeline and that can require things |
| 15:37 | michaniskin | you would need to require/refer or require/eval in there, of course |
| 15:39 | sveri | michaniskin: for debugging purposes? |
| 15:39 | michaniskin | sveri: i mean if you're using things produced by cljx in your build.boot |
| 15:39 | michaniskin | you'd need to put that code in a task that comes after the cljx task |
| 15:50 | sveri | michaniskin: hm, I think I misexpressed myself. I have cljx code in my existing project and clj code that requires it, this does work in the liningen project, but not with boot |
| 16:05 | michaniskin | sveri: the clj code that requires the cljx should not itself be required until after the cljx task runs |
| 16:05 | michaniskin | you can do this from a task that runs after the cljx task |
| 16:07 | sveri | ah I see, that makes sense |
| 16:07 | sveri | michaniskin: thank you, I guess I have to refactor a bit then |
| 16:16 | Pistahh | I have a vector of some values, e.g. [1 2 3], and I want an assoc map with e.g. keys [:a :b :c] to have those values -> { :a 1 :b 2 :c 3 } - how to do that? :) |
| 16:18 | andyf | ,(zipmap [:a :b :c] [1 2 3]) |
| 16:18 | clojurebot | {:c 3, :b 2, :a 1} |
| 16:20 | havenwood | ,(interleave [:a :b :c] [1 2 3]) |
| 16:20 | clojurebot | (:a 1 :b 2 :c ...) |
| 16:20 | havenwood | ah right, assoc map |
| 16:33 | SagiCZ1 | top o' the mornin' to ya |
| 16:35 | kenrestivo | howdy |
| 16:36 | kenrestivo | hmm, ok, replacing a message bus with individual channels for each component presents a problem: the components can't be shutdown and restarted individually because there'll be other components taking or putting onto dead channels |
| 16:37 | kenrestivo | could also ref/atom the channels but that starts to smell funny to me (async/<!! @chan) |
| 16:38 | SagiCZ1 | maybe you could use poision pill approach |
| 16:38 | kenrestivo | how so? |
| 16:38 | SagiCZ1 | feed the channel something that the consumer recognizes and shutdowns... "-1" or nil or something |
| 16:39 | SagiCZ1 | this is what is commonly used in java when operating blocking queue |
| 16:39 | kenrestivo | oh, a kill message. but what if someone else shuts it down? the error handling becomes complex |
| 16:40 | SagiCZ1 | i guess.. it was just an idea, i dont understand your case well enough |
| 16:40 | kenrestivo | neither do i, apparently :-/ |
| 16:42 | SagiCZ1 | i read just one little tutorial on async.. seems nice but i need to learn how to apply it properly.. and also recognize a problem that benefits from it |
| 16:43 | kenrestivo | i'm learning it. it has a lot of potential but i'm still trying to figure out how to use it properly. |
| 16:44 | kenrestivo | i found it very useful in cljs in the context of om, for example. now i'm trying to use it to get components to communicate with one another in a jvm app, and it's been challenging |
| 16:46 | SagiCZ1 | so you would need the channel to recognize that one of its ends is dead and close itself? |
| 16:46 | kenrestivo | hmm, lemme see if i can refheap something up. might help me think about the problem better too |
| 16:47 | kenrestivo | see, in a lot of core.async examples, they just assume threads or go-loops just start and go on forever. trying to make things modular so that loops are treated as daemons, seems not as well documented |
| 16:47 | SagiCZ1 | yeah i see |
| 16:47 | kenrestivo | it's real easy to just close a channel adn stop a loop that way, but then restarting... that's the thing |
| 16:48 | kenrestivo | (loop [] (when-let [v (async/<!! chan)] (do-stuff v) (recur))) |
| 17:32 | numberten | is aset O(1) ? |
| 17:33 | SagiCZ1 | numberten: what do you mean? set? what operation? |
| 17:34 | numberten | ,(doc aset) |
| 17:34 | clojurebot | "([array idx val] [array idx idx2 & idxv]); Sets the value at the index/indices. Works on Java arrays of reference types. Returns val." |
| 17:35 | SagiCZ1 | numberten: oh sorry |
| 17:36 | SagiCZ1 | i think it should be definitely O(1) |
| 17:36 | kenrestivo | ok, just played around with it, i think it'll work the way i want it to. https://www.refheap.com/95273 |
| 17:51 | andyf | kenrestivo: Definitely O(1). However the constant differs dramatically and noticeably if it uses reflection. If it is used many times during run time in your code, you'll want to enable reflection warnings and eliminate them if you can. |
| 17:52 | kenrestivo | andyf: i think you meant SagiCZ1 |
| 17:52 | kenrestivo | or maybe numberten |
| 17:52 | andyf | sorry, yes. |
| 17:52 | andyf | numberten: ^^ |
| 17:53 | kenrestivo | (who is probably wonder why his computer is beeping so much now) |
| 17:54 | numberten | this is an array of bigints |
| 17:54 | numberten | so reflection could probably be a big constant cost I imagine :/ |
| 17:55 | kenrestivo | type hints |
| 17:55 | kenrestivo | kills reflection dead |
| 17:55 | numberten | cool |
| 17:55 | numberten | never actually used them before |
| 17:56 | jonathanj | is there a better way of writing: (into {} (map (juxt :id :name) modes)) |
| 17:57 | Bronsa | select-keys |
| 17:57 | Bronsa | ,(doc select-keys) |
| 17:57 | clojurebot | "([map keyseq]); Returns a map containing only those entries in map whose key is in keys" |
| 17:57 | kenrestivo | i like "lein update-in : assoc :pedantic? :warn -- check" to find all the reflection warnings, dependency mismatches, etc |
| 17:57 | Bronsa | no, that doesn't do what you want |
| 17:58 | jonathanj | that is turning [{:id "a" :name "Aye"} ...] into {"a" "Aye" ...} |
| 18:00 | Bronsa | jonathanj: yeah I can't think of a better solution than the one you wrote |
| 18:02 | numberten | kenrestivo: is it possible to type hint an array? |
| 18:02 | SagiCZ1 | yes |
| 18:03 | SagiCZ1 | ints, longs, floats, doubles .. |
| 18:04 | Pistahh | is there anything like "map" but without collecting the results? |
| 18:04 | justin_smith | in fact, arrays aren't just hinted - they are typed |
| 18:04 | justin_smith | Pistahh: doseq |
| 18:04 | numberten | bigints? |
| 18:04 | justin_smith | or (dorun (map ...)) if you really want the map syntax |
| 18:05 | justin_smith | numberten: "bigints" would not make sense, because bigint is not a primitive type |
| 18:05 | justin_smith | ,(into-array BigInt []) |
| 18:05 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: BigInt in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 18:06 | justin_smith | ,(into-array clojure.lang.BigInt []) |
| 18:06 | clojurebot | #<BigInt[] [Lclojure.lang.BigInt;@248d7e99> |
| 18:06 | numberten | ,(into-array clojure.lang.BigInt []) |
| 18:06 | clojurebot | #<BigInt[] [Lclojure.lang.BigInt;@33ba11b3> |
| 18:06 | justin_smith | but that's not the same sort of thing as longs, doubles, bytes etc. - each element must be boxed |
| 18:07 | numberten | i see |
| 18:09 | numberten | so then there's no way I could typehint away this warning: Reflection warning, solution.clj:35:54 - call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int) |
| 18:10 | justin_smith | ^"[Lclojure.lang.BigInt" may work as an annotation there actually |
| 18:10 | justin_smith | iirc the string will be interpreted properly |
| 18:10 | numberten | i didn't know you could wrap types in strings |
| 18:10 | justin_smith | it's needed for [L... |
| 18:11 | justin_smith | Bronsa knows more about this stuff though |
| 18:11 | kenrestivo | hahaha, the complexity in starting/stopping multiple threads/channels comes when i get into using alts!!... |
| 18:11 | kenrestivo | a simple when-let ain't gonna cut it |
| 18:12 | numberten | it worked |
| 18:12 | numberten | but it needed the ; |
| 18:12 | numberten | ^"[Lclojure.lang.BigInt;" |
| 18:12 | numberten | justin_smith: thanks |
| 18:12 | justin_smith | np - forgot the ; was part of the class name, yeah |
| 19:13 | dthurn | Can somebody help me understand why this doesn’t return 15: (let [[tween [:tween]] [15 [:tween]]] tween) ? |
| 19:14 | Bronsa | dthurn: destructuring is not pattern matching |
| 19:14 | Bronsa | ,(let [[tween [_]] [15 [:tween]]] tween) |
| 19:14 | clojurebot | 15 |
| 19:15 | seangrove | ,(let [[tween [:tween]] [15 [:tween]]] tween) |
| 19:15 | clojurebot | :tween |
| 19:15 | Bronsa | ,(let [[:a] [1]] a) ; :( |
| 19:15 | clojurebot | 1 |
| 19:15 | Bronsa | this works by accident since 1.6 |
| 19:16 | seangrove | Wow, didn't know that keywords would turn into bindings.. |
| 19:16 | dthurn | you can use keywords instead of symbols in bindings? |
| 19:16 | seangrove | Ah, ok |
| 19:16 | dthurn | didn’t know that |
| 19:16 | Bronsa | seangrove: only in destructuring |
| 19:16 | Bronsa | dthurn: don't do that. it's an implementation detail |
| 19:17 | dthurn | That’s too bad, I like the idea of using constants in binding expressions |
| 19:17 | Bronsa | seangrove: if you're interested, this works as a side-effect of the patch for destructuring namespaced keywords |
| 19:17 | dthurn | But it makes sense, I guess |
| 19:18 | seangrove | Bronsa: Ah, interesting actually |
| 19:59 | sova | :D Clojure! |
| 20:00 | xnil | Finally, some Clojure. |
| 20:01 | xnil | Clojure for Windows [close your four windows] |
| 20:08 | xnil | Clojure Mind, Clojure Buddha |
| 20:19 | sova | could someone kindly point me to an open source project which uses clojureScript? |
| 20:20 | rads | ztellman: I watched your "Always Be Composing" talk and really enjoyed it. I'm trying to learn the tradeoffs between data-oriented code and function-oriented code, but I basically have to write it both ways to see which works best right now |
| 20:20 | ztellman | rads: so do I, a lot of the time |
| 20:20 | rads | one insight I liked was that data is more general than code because it has no predefined semantics |
| 20:20 | rads | which makes the program more general |
| 20:20 | ztellman | in both the good and bad senses of the term |
| 20:20 | ztellman | anyway, glad you liked it |
| 20:21 | rads | I'm interested in doing a talk that goes into more detail about those tradeoffs, but I need more experience and research to be able to do that |
| 20:21 | rads | I find this concept of data-orientation hard to explain to people who only know OO |
| 20:22 | ztellman | I'd be interested in seeing that talk |
| 20:22 | rads | it seems like there's not much literature on this idea right now, but maybe that's because it's a relatively new concept? |
| 20:23 | ztellman | I'm sure there are multiple papers in the 70s that discuss it under a different name |
| 20:23 | rads | I don't have a lot of experience with other FP languages besides clojure, but in haskell for example it appears there's a lot of emphasis on higher-order funtions |
| 20:24 | rads | I haven't heard much about "data-first" programming in haskell |
| 20:24 | rads | yeah, that's the tricky part :) |
| 20:24 | rads | figuring out the different name |
| 20:25 | TEttinger | there's also this http://www.dataorienteddesign.com/dodmain/node3.html |
| 20:25 | TEttinger | data oriented design is a crazy concept |
| 20:26 | TEttinger | but rather different from the high-level approach to data in clojure |
| 20:26 | rads | cool, thanks for the link |
| 20:27 | rads | another way to put it is that we have this rule of thumb of "data > functions > macros" when designing a program. I'm wondering what are the principles that make that rule of thumb work |
| 20:28 | TEttinger | more data than fns than macros sounds like a good approach |
| 20:28 | rads | I've heard it around the community before, but I don't know where it originally came from |
| 20:30 | rads | TEttinger: it looks like "data-orientented design" and "data-driven design" are two separate things |
| 20:31 | TEttinger | rads, indeed! |
| 20:31 | TEttinger | $wiki data driven design |
| 20:31 | lazybot | [Data-driven programming - Wikipedia, the free encyclopedia] http://en.wikipedia.org/wiki/Data-driven_programming |
| 20:31 | TEttinger | who fixed lazybot, Raynes, justin_smith, rhg135? |
| 20:31 | Raynes | ? |
| 20:32 | TEttinger | google didn't work for a while because the API died |
| 20:32 | TEttinger | $google google search api deprecated |
| 20:32 | lazybot | [Google Web Search API (Deprecated) — Google Developers] https://developers.google.com/web-search/ |
| 20:33 | Raynes | Well, nobody fixed it. |
| 20:33 | rads | when I first heard about this idea of modeling a program as passing in a data structure to a domain-specific evaluator, I thought of grunt (the javascript build tool) and thought "yuck" |
| 20:33 | TEttinger | hm |
| 20:34 | TEttinger | For CSE users, the API provides 100 search queries per day for free. If you need more, you may sign up for billing in the Developers Console. Additional requests cost $5 per 1000 queries, up to 10k queries per day. |
| 20:34 | rads | after thinking about it some more, I think the problem with grunt I had is that I felt limited by what I could express in its data format |
| 20:34 | rads | perhaps it's not the weakness of the programming orientation, but the specific choices the grunt authors made |
| 20:34 | tadni_ | Is Luminus suggested for webdev? |
| 20:35 | sova | luminus is sweet, depending on the complexity of your app |
| 20:35 | TEttinger | I had an issue with my lazybot after restarting it, that any $google requests didn't print anything because there was no :body in the JSON, just a response like "this has been deprecated, use our paid thing instead" |
| 20:36 | tadni_ | sova: I mean, it'll mostly just be a document viewer -- but also have a system that will talk to my server and build a custom GNU+Linux distro on my end, probably though tome simplisiticish UI. |
| 20:36 | TEttinger | I ended up adding my own google plugin, that scrapes DDG's redirect page for a request like http://duckduckgo.com/q=\panda%20site:wikipedia.org |
| 20:37 | tadni_ | I really want to do it in as much Lispyness as possible, but I keep having people suggesting Angular to me. I know very, very little about webdev. And JS about at that same level. |
| 20:37 | TEttinger | make that https://duckduckgo.com/?q=\panda+site:wikipedia.org |
| 20:38 | rads | tadni_: might want to look into something based on React.JS for a functional-approach to front-end development |
| 20:38 | TEttinger | Om ? |
| 20:39 | tadni_ | rads: Thanks, I'll add it to my list of things to check. :^) |
| 20:39 | rads | om is one option, there's also reagent which is a more direct clojure wrapper for react.js |
| 20:40 | tadni_ | I mean, to a large degree -- I want to just clone getfedora.org with having most everything on the page ... but also, having a distro genrator seems like a relatively cool/easy thing to implement. |
| 20:42 | xnil | tadni_: clojurescript, m8 |
| 20:49 | tadni_ | But yeah, of the selections I've seen -- Luminus seems decent. |
| 20:54 | Raynes | http://www.tryclj.com/ has a new design |
| 20:54 | Raynes | Sure wish folks would contribute more cool stuff like this to tryclj ;) |
| 20:54 | Raynes | It hasn't seen love in a while. |
| 20:54 | Raynes | Sure would be neat if someone updated it for new Clojures and stuff ;) |
| 21:03 | xnil | Raynes: oh, that's nice. |
| 21:03 | kl | Hi, a question. Clojure uses the JVM to enable interoperability with Java stuff. But Clojure promotes immutability & referential transparency - why would anybody have an interest in linking up Clojure stuff to Java stuff to begin with? |
| 21:03 | xnil | kl: because instead of reinventing the wheel, we decided to use preexisting tools |
| 21:04 | kl | xnil: so the aim was to avoid creating a runtime, rather than Java interoperability? |
| 21:04 | xnil | it was both |
| 21:05 | xnil | i believe hickey's got an official explanation |
| 21:05 | xnil | let me find it |
| 21:05 | kl | xnil: that's pretty much my question: why would anybody want Clojure interop with a side-effectful & mutable language |
| 21:05 | kl | oh ok, thanks |
| 21:05 | xnil | http://clojure.org/rationale |
| 21:06 | xnil | kl: ^^ |
| 21:07 | xnil | so yeah, java interop is a huge incentive |
| 21:08 | xnil | if your question is the opposite, why would anyone want to use clojure where they can just use java instead, that page should explain the same thing |
| 21:08 | kl | xnil: lol, no. I'm not a Java proponent :) |
| 21:08 | kl | xnil: it was more "why infect clojure with java" |
| 21:09 | xnil | you don't necessarily have to, as it's also on the .NET platform and compiles down to javascript, but the JVM's just cool, man. |
| 21:16 | tadni_ | Okay, probable nap time. o/ |
| 21:19 | xnil | \o |
| 21:24 | kl | xnil: that, I didn't know. |
| 21:25 | kl | (Clojure on CLR) |
| 21:25 | xnil | :) |
| 21:25 | kl | I've been learning Scala for a while - I'm not convinced it's *the* language for me, but I like a lot of the stuff I've come across. Primarily because it's my first foray away from the "mutable" kind of languages |
| 21:26 | kl | I'm going to spend the evening looking at Clojure for comparison - the only thing that concerns me is its lack of static typing. I was never concerned about such things pre-Scala: but a rich type system seems to bring a lot. |
| 21:27 | xnil | between scala and clojure, i've got to say clojure rubs me the right way. and i'm a massive fan of static typing |
| 21:27 | xnil | just wait until you try haskell |
| 21:27 | xnil | kl: https://github.com/clojure/core.typed |
| 21:27 | kl | It's possible to know Scala without already knowing Haskell? :) |
| 21:28 | kl | (Scala seems a much more complicated, distorted, far removed version!) |
| 21:28 | xnil | barely |
| 21:28 | xnil | i'd say haskell is that to ocaml, and scala is that to ruby if i were the one concocting the rhetoric |
| 21:29 | kl | I'm not sure I felt any kind of relationship between Scala and Ruby |
| 21:29 | kl | (And Ruby is my day-job) |
| 21:29 | xnil | well, i like neither |
| 21:29 | godd2 | yea scala syntax reminds me more of ruby than most things |
| 21:29 | xnil | i'm more of a lispy person. python over ruby for me |
| 21:30 | kl | xnil: I just find when dealing with Python/Ruby... I have to rely much more upon grep than I'd like |
| 21:30 | kl | I mean, there's only so much following you can do when everything's so dynamic |
| 21:30 | xnil | as a result of dynamic typing? |
| 21:30 | kl | Maybe that. I'm not sure. |
| 21:30 | xnil | ah |
| 21:32 | kl | xnil: is that a sentiment you could at all agree with, from experience? |
| 21:33 | kl | I understand Clojure to be dynamic, too. But I'm not really sure what dynamic with lisp actually means. |
| 21:33 | xnil | clojure's dynamic typing is only a boon in my experience |
| 21:33 | xnil | well |
| 21:33 | xnil | scratch the only |
| 21:34 | xnil | there are some places i would like static typing but usually i can whip up something cool to compensate for the lack of mojosa-ness |
| 21:35 | kl | Would you say that Clojure's dynamic typing is more beneficial+less detrimental, say, than that existing in Ruby/Python? |
| 21:35 | xnil | yes, by far |
| 21:35 | kl | Or would you say it's pretty much of same consequence. |
| 21:35 | kl | Oh |
| 21:36 | xnil | i feel python and ruby achieve almost a comparatively toyish feel to them because they try to be something lisp yet traditional |
| 21:36 | xnil | it's a very usable awkward middleground |
| 21:36 | kl | I'm pretty sure I'm going to feel more rounded as a developer with Clojure in my arsenal |
| 21:36 | xnil | absolutely |
| 21:36 | xnil | but then again, surely i'm biased |
| 21:37 | kl | I used to think (and sound, to many) that I was a real polyglot. I've done so many languages. |
| 21:37 | kl | But none were in the functional sphere |
| 21:37 | kl | C/C++, Perl, PHP, Python, JS, Ruby |
| 21:37 | xnil | to be honest, japanese is harder than mandarin chinese |
| 21:37 | kl | I'm sure I've done others for extended periods that I couldn't even recall |
| 21:40 | kl | xnil: I wish my capacity for learning formally specified languages extended to the spoken ones |
| 21:40 | xnil | C, C++, PHP, Ocaml, Haskell, PHP, Python, JS, C#, Java, Clojure, Common Lisp (in various implementations), Racket, Rust, D, and of course the web stacks that every aspiring nerd learns as well as some other languages i didn't use for more than 4 or 5 projects |
| 21:41 | xnil | game maker language, anyone? |
| 21:41 | xnil | kl: esperanto's formally specified :^) |
| 21:41 | kl | xnil: hmm. In retrospect, I'm not sure the formal specification is really the qualifying criterion for me :) |
| 21:42 | xnil | you can build things with esperanto, like artism |
| 21:43 | xnil | i've got a cheesecake of 1 foot in diameter |
| 21:44 | kl | I really like the idea of esperanto. If it had higher adoption, I'm quite sure I'd learn it |
| 21:44 | xnil | built it with La Mastro de L'Ringoj |
| 21:44 | kl | I try using English as a language which can be logically built upon, except that just doesn't work |
| 21:44 | xnil | all natural languages are that way, sorry :P |
| 21:45 | kl | How did every single naturally emerging language screw it up?! |
| 21:45 | kl | It seems easier to just make a consistent one! |
| 21:45 | sova | until you see a tiger |
| 21:45 | xnil | it's the brain's fault |
| 21:45 | xnil | sova: or a leopard |
| 21:45 | xnil | i type better with leopards |
| 21:45 | sova | and have to shout "HOLY S*** A TIGER/LEOPARD" |
| 21:46 | sova | sorry to rudely throw in my two cents, i enjoy language discussions |
| 21:46 | sova | *lurks back to the shadows* |
| 21:50 | xnil | Did you mean "Holly, shoot a torque laser"? |
| 21:50 | xnil | anyone here from the greater Boston area? |
| 22:18 | xnil | sova: language discussions are fun. i say we implement a natural language with lisp |
| 22:18 | xnil | in fact, i think i have a conthept for it right now. |
| 22:19 | munderwo | this is probably a long shot, but has anybody used https://github.com/nodegit/promise from clojurescript? |
| 22:57 | kenrestivo | ugh, debugging locked-up async channels is no fun. |
| 22:58 | sdegutis | xnil_: I dunno, why s-expressions? |
| 22:58 | sdegutis | There doesn't seem anything inherently worthwhile in using s-expressions. It seems merely to be a matter of preference. |
| 22:58 | kenrestivo | how about t-expressions |
| 22:59 | kenrestivo | maybe it's time to move off of s |
| 22:59 | sdegutis | Then we should have S++-expressions. |
| 22:59 | kenrestivo | msft can have s# expressions |
| 22:59 | sdegutis | kick picasso it's a spambot |
| 22:59 | arrdem | the core value of sexprs is homoiconicity for generated programs. |
| 23:00 | sdegutis | arrdem: I think it's been done without s-expressions though. |
| 23:00 | arrdem | sdegutis: eh you need some equivalent representation of a "form" tho. |
| 23:00 | sdegutis | True. |
| 23:00 | sdegutis | I suppose code<->data is a legitimate benefit. |
| 23:01 | sdegutis | I guess its value is what's really arguable. |
| 23:01 | arrdem | code <-!-> data, we have read-eval |
| 23:01 | arrdem | :c |
| 23:01 | arrdem | @ops picasso indeed is a spammer. |
| 23:01 | arrdem | amalloy / oh shit where'd technomancy go |
| 23:02 | amalloy | arrdem: i tried to deal with that earlier but apparently don't know how |
| 23:02 | arrdem | amalloy: thanks |
| 23:09 | xnil_ | sdegutis: wrong |
| 23:09 | xnil_ | sdegutis: s-expressions achieve a particular simplicity and minimalism that nothing else i've seen does |
| 23:09 | xnil_ | and expressiveness! |
| 23:10 | sdegutis | xnil_: sure, but expressiveness is subjective |
| 23:10 | sdegutis | xnil_: and the value of simplicity and minimalism is also subjective |
| 23:10 | xnil_ | subjectivity is simply expressive |
| 23:10 | xnil_ | minimalism? i hardly knew 'er |
| 23:10 | sdegutis | xnil_: I have written many languages, some with s-expressions, some without, and enjoyed them all, but I would not say s-expressions are superior and it's not my favorite syntax |
| 23:11 | xnil_ | i've done the same and i have the opposite opinion |
| 23:11 | xnil_ | i respect yours though |
| 23:11 | xnil_ | i just think it's totally wrong |
| 23:15 | sdegutis | :) |
| 23:15 | sdegutis | I respect yours too. |
| 23:15 | sdegutis | And I don't think yours is wrong. |
| 23:15 | sdegutis | Because opinions can't be right or wrong ;) |
| 23:16 | sdegutis | (i.e. I don't hold it strongly enough to consider that mine is Right™.) |
| 23:29 | arrdem | Naming: a linked document / hypertext editor & stack based browser |
| 23:41 | xnil_ | it is my opinion that righteousness is a matter of subjectivity |
| 23:45 | kl | xnil_: your opinion is also a matter of subjectivity. :P |
| 23:46 | kl | (I completely agree ;) |
| 23:53 | arrdem | andyf: ping |