2013-03-21
| 00:01 | technomancy | rplaca: not sure off the top of my head, but inspecting the implementation of the classpath task would make it pretty clear |
| 00:02 | technomancy | ugh; can you imagine the uproar if they charged for videos? |
| 00:06 | tieTYT2 | did lein USED TO put libraries in a lib folder? |
| 00:06 | TimMc | tieTYT2: Yeah, in version 1.x. |
| 00:06 | tieTYT2 | ah this explains a lot |
| 00:07 | tieTYT2 | i'm trying to figure out how to use La Clojure with lein together |
| 00:07 | tieTYT2 | people keep saying to include the lib folder and logically i know that wouldn't do anything |
| 00:09 | tieTYT2 | ah i think i figured it out |
| 00:10 | TimMc | tieTYT2: There's a huge amount of bad information on blogs, by the way. |
| 00:11 | TimMc | (Mostly just horribly outdated.) |
| 00:11 | tieTYT2 | i see |
| 00:11 | tieTYT2 | ugh intellij wants the .bat file, lame |
| 00:11 | tieTYT2 | i'll download that separately |
| 00:17 | tomoj | &(into [] (reify clojure.lang.ISeq (seq [this] this) (first [_] 42) (next [_]))) |
| 00:17 | lazybot | ⇒ [42] |
| 00:17 | tomoj | in 1.5, the reason this works is that CollReduce is extended to Object by a seq-reduce impl |
| 00:18 | tomoj | is there another sane way around that problem? |
| 00:20 | TimMc | What *is* the problem? |
| 00:20 | tomoj | making all ISeq implement CollReduce |
| 00:21 | tomoj | relying on the fact that ISeq is an interface and extending CollReduce to it is cheating |
| 00:22 | tyler | whats the best way to turn a NodeList into an ISeq? |
| 00:22 | tyler | i tried js->clj but it returned a NodeList again? |
| 00:24 | tyler | n/m ust found some code that extended NodeList |
| 00:24 | tyler | just* |
| 00:25 | tomoj | extending NodeList is weird |
| 00:25 | tomoj | and many other weirdnesses for cljs |
| 00:26 | tomoj | I mean, none of us own NodeList, so by the old rules only clojurescript core should extend core protocols to NodeList |
| 00:27 | tomoj | I guess it's like data_readers.clj, you can only extend in code you don't release as a library? |
| 00:28 | tomoj | you can't put the extends under the top level in cljs so.. :/ |
| 00:28 | tomoj | well you could put them in a macro |
| 00:29 | tyler | its like 8 lines and its soooo ugly *cringe* |
| 00:29 | tyler | the javascript that is |
| 00:30 | tyler | the clojs is decent i think its actually less than the javascript heh |
| 00:30 | tyler | cljs* |
| 00:30 | Raynes | muhoo: ping |
| 00:31 | muhoo | Raynes: yo |
| 00:31 | Raynes | muhoo: How are things in San Francisco? |
| 00:31 | muhoo | raining ATM. how's life in "the southland"? |
| 00:31 | Raynes | Not raining. |
| 00:32 | Raynes | muhoo: I've got a cover here that I don't completely hate. Wanna link? |
| 00:32 | tieTYT2 | anyone here use La Clojure? I can't figure out how to get a REPL to use the load the files in my project. It seems to startup in a blank state |
| 00:32 | muhoo | Raynes: sure, let's hear it! |
| 00:43 | clintm | What's the equivalent of (progn in clojure? I'm using hiccup, and trying to do something like (if x [:li] (progn [:li] [:li])). I searched, and most places said to use (do) but it only gives the last value. |
| 00:44 | tieTYT2 | this looks convenient: http://richhickey.github.com/clojure-contrib/duck-streams-api.html |
| 00:44 | lazybot | Nooooo, that's so out of date! Please see instead http://clojure.github.com/clojure-contrib/duck-streams-api.html and try to stop linking to rich's repo. |
| 00:44 | tieTYT2 | why can't i use this? |
| 00:44 | tieTYT2 | (require 'clojure.contrib.duck-streams) |
| 00:44 | tieTYT2 | FileNotFoundException Could not locate clojure/contrib/duck_streams__init.class or clojure/contrib/duck_streams.clj on classpath: clojure.lang.RT.load (RT.java:432) |
| 00:45 | tieTYT2 | oh, deprecated :( |
| 00:54 | tolstoy | clintm: I think you can do something like(if x [:li] (html [:li] [:li])). |
| 00:55 | tolstoy | clintm: I don't think using a "do" would work. |
| 00:57 | amalloy | clintm: do is exactly like progn, and thus won't do what you want in your if |
| 00:57 | amalloy | you just want (list [:li] [:li]) |
| 00:59 | clintm | (list) was it. Thanks, amalloy, and tolstoy! |
| 00:59 | tolstoy | Ah, good! |
| 01:14 | lovemuffin | hey, for the barrier of entry for clojure, do beginners usually say there's too many reader macros, and probably even macros ? |
| 01:16 | lovemuffin | #() #{} ~ ^ @ #"" ~@ #' ' ; |
| 01:16 | lovemuffin | heh |
| 01:16 | lovemuffin | its hard to remember what all that means , i guess i'll remember as i use them, but yea |
| 01:16 | clintm | I'm a beginner with clojure, but coming from cl, those all make a lot of sense. Would like to define my own, but I understand the logic behind not being able to. |
| 01:17 | lovemuffin | cl? |
| 01:17 | clojurebot | You just made an ad hoc, informally -specified, bug-ridden, slow implementation of half of that. |
| 01:17 | clintm | common lisp |
| 01:17 | lovemuffin | forgot 'x and `x on that list of macros |
| 01:20 | lovemuffin | when reading some doc,tutorials what does the '&' mean? (lazy-seq & boidy) |
| 01:22 | tomoj | &((fn [& body] body) 1 2 3) |
| 01:22 | lazybot | ⇒ (1 2 3) |
| 01:23 | lovemuffin | ah so just variable number? |
| 01:23 | lovemuffin | does it only ever apply to arguments ? |
| 01:23 | tomoj | well, it applies in many binding contexts |
| 01:23 | tomoj | arguments are one |
| 01:24 | tomoj | &(let [[foo & bar] [1 2 3]] [foo bar]) |
| 01:24 | lazybot | ⇒ [1 (2 3)] |
| 01:24 | tomoj | &(for [[foo & bar] ["foo" "bar" "baz"]] bar) |
| 01:24 | lazybot | ⇒ ((\o \o) (\a \r) (\a \z)) |
| 01:26 | tomoj | http://clojure.org/special_forms#Special%20Forms--Binding%20Forms%20(Destructuring) |
| 01:56 | tieTYT2 | check out the example of this library: https://github.com/nathell/clj-tagsoup Should I write my own function to extract the pieces I want to find, or if this library were better would it provide me with better functions to traverse the result? |
| 02:00 | xcv | Raynes: If you're here, I wanted to ask you which editor you're currently using (I read your blog posts earlier). |
| 02:01 | Raynes | xcv: Emacs with evil-mode. I like to think I have the best of both worlds. |
| 02:01 | Raynes | Been using it for quite a while. |
| 02:04 | yunfan | Raynes: tried that evil mode |
| 02:04 | yunfan | its cool but the way it implement it is not suit |
| 02:04 | Raynes | *shrug* works fine for me. |
| 02:05 | yunfan | it impl each :xyz by mapping xyz to a processing function, while in true vim, xyz might be a combination of three cmd |
| 02:05 | Raynes | I wasn't looking for an exact implementation of Vim in Emacs. |
| 02:05 | yunfan | so i think they need to provide a evil-cmd-eval instead |
| 02:06 | Raynes | I was more interested in functionality like text objects. |
| 02:06 | yunfan | ok just shout them from a vim user :] |
| 02:10 | noprompt | yunfan: Raynes: i gave emacs an fair shot but, yeah, the move from vim was too hard. |
| 02:10 | Raynes | I wasn't moving from Vim to Emacs. I went from Emacs to Vim for a few months then back to Emacs with evil-mode because I missed Emacs but also grew fond of various Vimisms. |
| 02:11 | noprompt | i've got a pretty good mash up of VimClojure, vim-clojure-static (for syntax and indention), and pairedit.vim |
| 02:11 | noprompt | but i'm terribly jealous of emacs in many ways |
| 02:11 | Raynes | Vim is a perfectly acceptable editor for Clojure. |
| 02:11 | Raynes | vim-foreplay makes it very nice I hear. |
| 02:11 | yunfan | noprompt: i want to move to that, since i started from vim not vi, in my opinion, vim is just a 3-mode emacs with specific keybinding, i like those keybindings and the 3-mode idea, i dont care the runtime |
| 02:13 | noprompt | you know, i tried fireplace, but ended up going back to VimClojure. |
| 02:13 | noprompt | hats of to tpope though. that guy is an inspiration. |
| 02:13 | yunfan | then how's the vimclojure runs? |
| 02:13 | noprompt | yunfan: vimclojure is fine, but you have to put in some effort to get it set up. |
| 02:14 | yunfan | noprompt: so you prefer vim-clojure-static? |
| 02:14 | noprompt | i checked all the necessary parts in to my dotfiles repo so i don't have to fiddle with setting it up on different stations. |
| 02:15 | yunfan | noprompt: maybe we could reverse the ideas, |
| 02:15 | noprompt | yunfan: i prefer vim-clojure-static's syntax and indention files. i've been contributing to it as well so i'm a little biased. |
| 02:15 | noprompt | that's all vim-clojure-static is btw. runtime files. |
| 02:15 | yunfan | noprompt: if the repl could support vi like keybinding just like the bash's vi mode, that would be nice too |
| 02:16 | noprompt | yunfan: then you want to use VimClojure. |
| 02:16 | yunfan | i am going to check if rlwrap has a vi mode |
| 02:16 | noprompt | but what i do is remote the indent, syntax, and ftdetect folders from the VimClojure dir and symlink the ones from vim-clojure-static |
| 02:17 | noprompt | s/remote/remove |
| 02:18 | yunfan | why no one talks lighttable? |
| 02:19 | johnmn3 | g'day |
| 02:20 | amalloy | yunfan: certainly rlwrap supports vim-ish keybindings |
| 02:20 | amalloy | there's some incantation you can put in your ~/.inputrc to make it happen |
| 02:20 | yunfan | amalloy: can it launch a vi instanse? |
| 02:21 | johnmn3 | I'm trying the new chat app for pedestal and I'm having some trouble getting it running on win 7, java 1.7.0_04 |
| 02:21 | johnmn3 | following the directions, after I run (watch :development) I get a constant flow of execptions |
| 02:22 | noprompt | light table is on the road to being awesome |
| 02:23 | noprompt | windows *yikes* |
| 02:23 | johnmn3 | its apparently in the split-path function of the build.clj file. there's a regex exception |
| 02:23 | noprompt | whats the regex? |
| 02:24 | johnmn3 | (defn- split-path [s] |
| 02:24 | johnmn3 | (string/split s (re-pattern File/separator))) |
| 02:24 | noprompt | you might want to update to the latest JDK |
| 02:24 | johnmn3 | yea yea, I know |
| 02:24 | noprompt | the regex support has changed |
| 02:24 | noprompt | i ran in to a similar issue not long ago |
| 02:24 | technomancy | the regex support changed in a minor java increment? |
| 02:24 | johnmn3 | not only that, but there's a laundry list of vulnerabilities on this crusty old jvm |
| 02:25 | technomancy | the vulnerabilities are all in the browser plugin IIRC (except one in JMX) |
| 02:25 | yunfan | i just tried using clojure's regex matching instead of my python with sed scripting days ago, and got some performance enhancement |
| 02:25 | yunfan | its good |
| 02:26 | johnmn3 | is there a pedestal specific irc room? |
| 02:26 | noprompt | technomancy: i'm certain that it did because a regex like #"\p{IsISOControl}" raised warnings in 1.7.0_12-ea |
| 02:26 | noprompt | but not in 1.7.0_17 |
| 02:27 | technomancy | ouch |
| 02:27 | noprompt | correction to that #"\p{IsjavaISOControl}" |
| 02:28 | noprompt | i spent the bulk of last week learning the dark depths of java's regex support. |
| 02:29 | johnmn3 | on win7: |
| 02:29 | johnmn3 | user=> (java.io.File/separator) |
| 02:29 | johnmn3 | "\\" |
| 02:29 | johnmn3 | user=> (re-pattern "\\") |
| 02:29 | johnmn3 | PatternSyntaxException Unexpected internal error near index 1 |
| 02:29 | johnmn3 | \ |
| 02:29 | johnmn3 | ^ java.util.regex.Pattern.error (:-1) |
| 02:29 | johnmn3 | guess I'll file a bug on github? |
| 02:30 | noprompt | yeah that makes sense. |
| 02:30 | noprompt | it should be "\\\\" |
| 02:30 | johnmn3 | oh, somebody already did. |
| 02:31 | noprompt | you have to escape the slash twice. once for the string and again for the pattern. |
| 02:32 | johnmn3 | and that results in #"\\"... which should end up just being one escaped slash at runtime? |
| 02:32 | noprompt | you got it. |
| 02:32 | johnmn3 | thank you noprompt |
| 02:34 | noprompt | i have an algorithmish question, if someone is open to it. |
| 02:35 | noprompt | suppose i wanted to construct a #"a(b|c|d|e)" type of pattern from a vector of strings. |
| 02:36 | noprompt | for example ["alpha" "alphonso" "albert"] should create #"al(ph(a|onso)|bert)" |
| 02:37 | noprompt | what kind of algorithm would you consider for grouping like that? |
| 02:37 | noprompt | any ideas? |
| 02:38 | amalloy | noprompt: i would generate #"alpha|alphonso|albert" and let the regex engine figure it out. it's smarter than either of us |
| 02:38 | noprompt | amalloy: not always, especially not for large expressions. you'll end up backtracking a lot. |
| 02:39 | noprompt | but i know you're partly right. |
| 02:40 | noprompt | even still the problem is interesting, no? |
| 02:40 | amalloy | sure |
| 02:40 | tyler | weird anyone notice funky thing with if statements in javelin? |
| 02:40 | tyler | (cell (if (= 4 facebook-status) (-> js/console (.log "wooo")))) |
| 02:40 | amalloy | i'd add each item to a prefix-trie and then walk over it to produce the expressions |
| 02:40 | tyler | i get console log woooo even though facebook-status is a cell with a string in it |
| 02:40 | amalloy | look up prefix trie algorithms/structures if you can't find one prebuilt that does what you need |
| 02:41 | noprompt | from what i understand about NFA engines, it that it would actually check alpha, then alphonso, and finally albert on the input string "albert" before finally succeeding. |
| 02:41 | amalloy | noprompt: for the bad algorithms used by modern engines, that is correct |
| 02:42 | amalloy | see http://swtch.com/~rsc/regexp/regexp1.html for an interesting article about how simple regexes like yours could be done much, much faster, and were done faster decades ago |
| 02:42 | noprompt | amalloy: i would imagine the engine would probably parse the expression first and attempt to optimize it before compiling it. |
| 02:43 | noprompt | look up the info. as always thanks. :) |
| 02:47 | johnmn3 | arg... I hardcoded it in there: |
| 02:48 | johnmn3 | (defn- split-path [s] |
| 02:48 | johnmn3 | (string/split s #"\\")) |
| 02:48 | johnmn3 | just to get it running... I deleted the old pedestal folders from my .m2 folder, did lein clean on both the pedestal folder and the chat-client folder... its still spitting the same error |
| 02:50 | noprompt | johnmn3: maybe just use Compojure :/ |
| 02:52 | noprompt | amalloy: the first few paragraphs of this article give me reason enough to explore this problem in greater depth. |
| 02:53 | noprompt | my goal is to generate more efficient expressions when the patterns are large. |
| 02:55 | johnmn3 | I figured it out... had to change my version number for app-tools in the project file |
| 03:17 | johnmn3 | okay, I got it running and the chat app looks pretty smooth |
| 03:20 | johnmn3 | I was actually in the midst of trying to create an instant messaging app for mobile devices using cljs. I might have to explore using pedestal |
| 03:26 | dspp | can anyone think of a good data structure to represent a family tree? |
| 03:26 | noprompt | amalloy: my C skills are way rusty but this article is awesome. where do you find this stuff? |
| 03:27 | amalloy | noprompt: i read it once several years ago, but more recently i remember someone linking to it in #clojure. i just keep my ears open |
| 03:27 | dspp | can someone repaste the link? |
| 03:27 | noprompt | amalloy: please tell me java uses the thompson nfa. |
| 03:28 | amalloy | nope. nothing modern/popular really does |
| 03:28 | amalloy | afaik |
| 03:28 | noprompt | *head explodes* |
| 03:28 | amalloy | they're all just wrappers over the same C library perl uses |
| 03:29 | noprompt | is this underground information or something? |
| 03:29 | noprompt | i mean, if the thompson nfa is superior why not use that? |
| 03:30 | noprompt | the guys behind the engines surely know about this, right? |
| 03:30 | noprompt | although it makes me happy to know awk and grep use it |
| 03:31 | amalloy | dspp: http://swtch.com/~rsc/regexp/regexp1.html |
| 03:32 | dspp | thanks |
| 03:37 | amalloy | i try to link to that article as often as i can, because now it's in the channel logs; i always forget what the "right" google search terms to find it are |
| 03:37 | amalloy | and apparently i'm too much of a luddite to just bookmark it |
| 03:40 | dspp | i just did a search for "regexp faster" and it came up top, is that because i've visited it already? |
| 03:41 | dspp | same when not logged into google |
| 03:41 | dspp | i dont like bookmarks either |
| 03:41 | dspp | clutter :D |
| 03:41 | tyler | woohoo i crashed the JVM with clojurescript |
| 03:41 | tyler | achievement unlocked |
| 03:42 | Ember- | amalloy: wow, that was interesting read |
| 03:42 | tyler | ah it was in a c-lib |
| 03:42 | tyler | not in the actual JVM |
| 03:43 | Ember- | did not know about the Thompson NFA or the differences between programming language regexp implentations and unix awk etc |
| 03:48 | navgeet | Is it impossible to use push-thread-bindings without a matching call to pop-thread-bindings? |
| 03:51 | amalloy | navgeet: if you succeed in doing that, your lungs will leak |
| 03:51 | amalloy | out your ears, and you will be able to smell colors |
| 03:52 | amalloy | (you can probably do it, but you won't like the results) |
| 03:53 | navgeet | If I push a binding and then don't pop it, wouldn't it give me a single dynamically bound var? |
| 03:56 | tomoj | &(((comp (partial partial map) (partial partial map)) +) [[1 2] [3 4 5]] [[6 7 8] [9 10]]) |
| 03:56 | lazybot | ⇒ ((7 9) (12 14)) |
| 03:56 | tomoj | hmm |
| 04:28 | yunfan | i am reading the book "programming clojure 2rd edition" in the chapter 1, 1.2.2 which says therr's a sample (str *1 " and " *2 ), which run on my repl output different text |
| 04:29 | yunfan | it seems *1 and *2 are empty, so what has changed ? my environment is clojure 1.4.0 laucnhed by lein repl |
| 04:29 | tomoj | &42 |
| 04:29 | lazybot | ⇒ 42 |
| 04:29 | tomoj | &*1 |
| 04:29 | lazybot | ⇒ #<Unbound Unbound: #'clojure.core/*1> |
| 04:29 | tomoj | should've known |
| 04:29 | tomoj | *1 points to the previous thing you evaluated in the repl |
| 04:30 | tomoj | *2 to the thing before *1 |
| 04:30 | yunfan | yes, but it's empty while i have output of the previous cmd |
| 04:31 | yunfan | oop, i got it, |
| 04:31 | yunfan | the sample which defined a function using println to output strings |
| 04:32 | yunfan | while the eval of that function's return value is nil, so althought it outputs somethings, but *1 is nil |
| 04:39 | yunfan | tomoj: do you have any earlier clojure version that (println "xxx") the expr itself's value is "xxx" |
| 04:40 | tomoj | I don't think that was ever the case. if it was, it was a long time ago |
| 04:45 | yunfan | then how the book use that sample |
| 05:08 | NeedMoreDesu | e |
| 06:09 | tsdh | technomancy: I've just added a pull request for clojure-mode that adds highlighting of grouping constructs in regular expressions similar to how it's done in elisp. |
| 06:26 | NeedMoreDesu | Hi. I've made some library, inspired by erlang's actor system. https://github.com/NeedMoreDesu/gen Need someone criticized me. |
| 06:41 | noprompt | tsdh: i recently did a lot of work on something similar for vim's handling of re in clojure. it was epic. |
| 06:44 | tsdh | noprompt: Oh, it was quite simple with emacs, especially as it was already implemented for elisp (but with a different regex syntax of course). ;-) |
| 06:44 | noprompt | tsdh: it looks far more pleasant that this monstrosity https://github.com/noprompt/vim-clojure-static/blob/71f1ae607223f91fbfe5c6617c59ffc581e5b195/syntax/clojure.vim#L77-L101 |
| 06:45 | noprompt | tsdh: so does the highlighting in emacs cover character classes, quantifiers, etc.? |
| 06:46 | noprompt | i've always found that stuff helpful when working with re. |
| 06:46 | noprompt | man elisp makes me so jealous. |
| 06:47 | tsdh | noprompt: Not yes, I just highlighted grouping constructs so far, e.g. in #"(?<aNamedGroup>foo|bar)" (?<aNamedGroup>, |, and ) are highlighted. |
| 06:47 | tsdh | s/yes/yet/ |
| 06:48 | tsdh | Ditto for normal (, (?:, (?<=, (?<!, ... |
| 06:49 | noprompt | tsdh: if you have the nerve to attempt to properly cover 99% of the allowable unicode character classes, hehe, ping me. |
| 06:50 | tsdh | noprompt: I'm not going to tackle that before I've won some millions in the lottery. ;-) |
| 06:51 | noprompt | looking back on it, i think just matching \p{[a-zA-Z_]+} might have been fine |
| 06:51 | noprompt | but i ended up generating it partly from the unicode spec https://github.com/noprompt/vim-clojure-static/blob/noprompt-regexp/clj/src/vim_clojure_static/generate.clj#L104-L122 |
| 06:51 | noprompt | constructing the patterns and checking if they were valid |
| 06:52 | noprompt | nasty stuff. |
| 06:52 | noprompt | we wanted to go for completeness and correctness though. |
| 06:53 | tsdh | Yep, most frequently the "only highlight 100% correct syntax" approach is doomed to be 100 times more effort than the simply approach that probably does the right thing in 99% of all cases. |
| 06:54 | noprompt | haha, indeed! and if the compiler/interpreter/reader throws and error the programmer can figure it out. |
| 06:54 | noprompt | s/and/an |
| 06:55 | noprompt | on the flip side though, i learned a lot of random stuff about unicode and regex in java. |
| 06:57 | noprompt | btw if you do decide to plugin the unicode support, don't forget about the shortcut versions: \p[CLMNPSZ] |
| 06:57 | tsdh | Indeed, but there are still more enjoyable ways to nirvana. |
| 06:58 | noprompt | the only thing i don't know if i can solve is matching comments in (?x..) patterns. |
| 06:58 | noprompt | that's a hard one. |
| 06:59 | tsdh | comments? |
| 06:59 | clojurebot | comments is http://www.cc.gatech.edu/computing/classes/cs2360/ghall/style/commenting.html |
| 06:59 | noprompt | well, there's an easy way, but it's probably not efficient. |
| 07:00 | tsdh | OMG, just seen it: (?#an-embedded-comment) |
| 07:00 | tsdh | Crazy |
| 07:03 | noprompt | they're nice for when you want to explain why you're crazy to someone. |
| 07:05 | noprompt | they'd be nicer if they only went to the next unescaped ) instead of the end of the line though. |
| 07:06 | noprompt | ruby did a good job with that. |
| 07:08 | noprompt | hmm, they seem to cause trouble with the clojure reader too. |
| 07:09 | pwned | what did ruby do? |
| 07:10 | noprompt | pwned: ruby has the ?# modifier which allows you to nest comments inside a regular expression. |
| 07:10 | noprompt | %r{[a-z](?# This is a comment)} |
| 07:11 | pwned | noprompt: cool I had no idea |
| 07:11 | noprompt | java has the ?x which both ignores white space AND allows comments marked by # and continuing to the end of the line. |
| 07:12 | noprompt | but going to EOL instead of just the next unescaped ) is a big downer. |
| 07:12 | pwned | http://rubular.com accepts it :D |
| 07:13 | noprompt | welp. i gotta get some sleep. |
| 07:16 | pepijndevos | does core.typed have type variables? |
| 07:21 | mpenet | pepijndevos: yes |
| 07:21 | mpenet | pepijndevos: it's done with "All" |
| 07:22 | mpenet | there are tons of good examples on this file: https://github.com/clojure/core.typed/blob/master/src/main/clojure/clojure/core/typed/ann.clj |
| 07:22 | pepijndevos | mpenet: I just started reading that |
| 07:23 | pepijndevos | What si going on in the :fitler and :object things here? https://github.com/clojure/core.typed/blob/master/src/main/clojure/clojure/core/typed/ann.clj#L34 |
| 07:24 | mpenet | I am not 100% familiar with objects yet, but there is some basic explaination in clojure-doc.org |
| 07:25 | mpenet | pepijndevos: http://clojure-doc.org/articles/ecosystem/core_typed/filters.html |
| 07:25 | mpenet | not :object I meant :filter |
| 07:28 | mpenet | in short :then tells it's always true when it returns "not nil or false" and :else it's always false when it returns nil or false |
| 07:28 | mpenet | :object {:id 0} I have no clue |
| 07:29 | pepijndevos | it's weird, I'd expect it to be just a -> a |
| 07:29 | mpenet | it's to allow better checking against filter for instance I would think |
| 07:30 | pepijndevos | ? |
| 07:30 | mpenet | falsy values |
| 07:30 | mpenet | (filter identity map) etc |
| 07:30 | pepijndevos | hm |
| 07:30 | mpenet | but as I said I am still not comfortable with that stuff |
| 07:32 | pepijndevos | I seem to have read something about HMaps, but I can;t find it anymore |
| 07:32 | mpenet | http://clojure-doc.org/articles/ecosystem/core_typed/types.html |
| 07:32 | mpenet | well it's very thin on explainations but at least it's mentioned there |
| 07:34 | pepijndevos | assoc doesn;t seem to be using the though... |
| 07:34 | pepijndevos | https://github.com/clojure/core.typed/blob/master/src/main/clojure/clojure/core/typed/ann.clj#L102 |
| 07:35 | mpenet | HMap is for heterogenous maps |
| 07:35 | mpenet | assoc can work on any map |
| 07:35 | mpenet | so it's more generic |
| 07:35 | pepijndevos | what maps are more generic that hetrogenous maps? |
| 07:36 | mpenet | assoc needs to work on maps with any mix of types in keys and vals |
| 07:36 | mpenet | ex {1 :b [1 2 3] "asdf} |
| 07:37 | mpenet | maybe generic was not the right term, it's confusing since it has a double meaning here |
| 07:38 | pepijndevos | In my dictionary, a map from a to b is homogeneous, all others are heterogeneous. |
| 07:39 | pepijndevos | assoc seems to be about homogeneous maps, or is that not what (IPersistentMap b c) means? |
| 07:40 | clgv | pepijndevos: depends on what the surrounding (All [b c d] ...) means |
| 07:40 | mpenet | Yeah you're actually right. I am getting confused here |
| 07:41 | pepijndevos | :( I was very curious what the type of assoc on hetrogeneous maps would be. |
| 07:42 | clgv | pepijndevos: I think the "All" might be a mathematical all quantor so that the assoc annotation is indeed for heterogeneous maps |
| 07:43 | mpenet | I read it as some kind of declaration of type variables to be used in the annotation. |
| 07:46 | pepijndevos | clgv: a what? |
| 07:47 | clgv | pepijndevos: I just tried to find a definition for "All" but failed... :/ |
| 07:49 | mpenet | but what I said earlier about assoc is still true, (HMap ...) will be mapped to one of the variables and it will just work with hetetogeneous maps too |
| 07:49 | clgv | pepijndevos: you could browse through ambrose's thesis to find the meaning of it |
| 07:49 | mpenet | heterogeneous* |
| 07:49 | pepijndevos | ok |
| 07:52 | mpenet | not "to one", to "the variables", but anyway |
| 08:39 | tgoossens | if you have a function valid-name? and a function set-name |
| 08:39 | tgoossens | if set-name uses internally the valid-name? function then it seems to me that you complect the setting of a name with the validation of a name |
| 08:39 | tgoossens | but |
| 08:40 | tgoossens | how can you prevent that you set an invalid name then? |
| 08:40 | tgoossens | one idea i have is |
| 08:40 | tgoossens | give validname function as a parameter |
| 08:40 | tgoossens | but then again, that isn't very robust? |
| 08:40 | tgoossens | but then again, how afraid are you of users? |
| 08:40 | tgoossens | (unnecessary paranoia) |
| 08:41 | clgv | tgoossens: you could use an approach similar to core.contracts I guess |
| 08:42 | tgoossens | hmm interesting |
| 08:42 | tgoossens | never heard of it |
| 08:42 | clgv | tgoossens: humm, the example on the readme does not look like, what fogus wrote in his blog a while ago... |
| 08:43 | tgoossens | clgv: at first sight it doesn't seem to solve what i'm trying to do |
| 08:45 | clgv | tgoossens: what I remembered is the following. you have your plain function and have a way to annotate that function with a pre and post validations. robert.hooke could be used to do that |
| 08:45 | tgoossens | hmm interesting |
| 08:45 | tgoossens | so you can do the following |
| 08:46 | tgoossens | you annotate a function and give that to a user |
| 08:46 | clgv | yeah. the function wrapped into a pre-post-valiadator... |
| 08:46 | tgoossens | is the original function modified? |
| 08:46 | tgoossens | or can i say |
| 08:47 | clgv | the variable of the original function gets modified if you implement it via robert.hooke |
| 08:48 | tgoossens | have you seen fogus' dire ? |
| 08:48 | clgv | tgoossens: "dire"? you got a link? |
| 08:51 | tgoossens | https://github.com/MichaelDrogalis/dire |
| 08:51 | tgoossens | sorry wrong name :) |
| 08:52 | tgoossens | i do not understand how that works |
| 08:52 | clgv | ah ok. thats the reason google found nothing meaningful ;) |
| 08:52 | clgv | he uses robert.hooke |
| 08:54 | tgoossens | hmmm |
| 08:54 | tgoossens | so what it does is |
| 08:54 | tgoossens | (defn functionX [a b ] ..... |
| 08:54 | tgoossens | and ten |
| 08:55 | tgoossens | *Then |
| 08:55 | tgoossens | using hooks |
| 08:55 | tgoossens | you say |
| 08:55 | tgoossens | (hookstuff functionX ....) |
| 08:55 | tgoossens | and it will redefine |
| 08:55 | tgoossens | what functionX (in the namespace) means |
| 08:55 | tgoossens | by wrapping it |
| 08:55 | jimkcar | I'm creating some functions to make creating a java object easier in clojure. The question I have is what function name is preferred in the clojure world: make-object or create-object? |
| 08:56 | tgoossens | clgv: and changing what belongs to "funcitonX" in the current namespace |
| 08:56 | tgoossens | ok i just repeated myself |
| 08:56 | Chousuke | jimkcar: I'd go with make simply because it's shorter |
| 08:57 | noidi | jimkcar, make- seems to be more common in lisps |
| 08:58 | tgoossens | clgv: is that the idea ? |
| 08:58 | jimkcar | Chousuke: and you can type it faster because it uses both hands. |
| 08:58 | clojurebot | No entiendo |
| 08:58 | tgoossens | (def a 2) |
| 08:58 | tgoossens | (-> 3 (def a) |
| 08:59 | tgoossens | * |
| 08:59 | tgoossens | nvm |
| 08:59 | jimkcar | noidi: thanks! helping to settle debate here. |
| 09:00 | jcromartie | why does Midje autotest not autotest!?!? |
| 09:01 | jcromartie | i.e. midje.repl/autotest only seems to automatically test when all the tests pass the first time |
| 09:03 | jcromartie | actually it seems that the "auto" part of midje.repl/autotest just doesn't work in nREPL |
| 09:03 | jcromartie | probably because the testing happens in the background? and nREPL quietly disguises all of that? |
| 09:04 | jcromartie | it works fine from lein repl |
| 09:04 | jcromartie | blerg… this makes me want to abandon nrepl |
| 09:16 | jcromartie | http://www.youtube.com/watch?v=q9r96cXx0OU |
| 09:39 | clgv | clgv: yeah, pretty much. but I did not read through the dire source |
| 09:39 | clgv | lol |
| 09:39 | clgv | tgoossens: ^^ |
| 09:40 | clgv | jcromartie: isnt the midje plugin responsible for autotesting? |
| 09:43 | jcromartie | clgv: there's midje.repl |
| 09:45 | tgoossens | :) |
| 09:46 | clgv | jcromartie: yeah read about it. I didnt know it replaces the lein plugin completely... gotta upgrade soon |
| 09:47 | clgv | tgoossens: I would just strip the variable syntax from dire |
| 09:48 | clgv | tgoossens: only symbol would suffice. the macro can do variable resolution |
| 09:55 | clgv | tgossens: now I did read it... this line is strange https://github.com/MichaelDrogalis/dire/blob/master/src/dire/core.clj#L98 the rest looks straight forward |
| 10:22 | ravster | hello all |
| 10:23 | Frozenlock | hello you |
| 10:23 | Frozenlock | |
| 10:47 | jcromartie | so, in a Compojure app, I think it could be said that the routes and controller are sort of merged |
| 10:48 | jcromartie | because you just define a controller as a handler |
| 10:48 | jcromartie | maybe? I dunno |
| 10:48 | weavejester | Well… It really depends on what you as a developer want to do. |
| 10:49 | weavejester | You could just pass the data directly through to another controller function. |
| 10:49 | weavejester | The idea of routes in Compojure is more to isolate your internal logic from the HTTP request |
| 10:49 | jcromartie | hm yeah |
| 10:50 | weavejester | So ideally your route will get all the information out of the request it needs, and then pass that data to a function. |
| 10:50 | jcromartie | so what I'm doing right now is that I have a web/core.clj which wraps up all of the controllers/routes in web/routes/foo.clj etc. |
| 10:50 | jcromartie | so web/routes/foo.clj has (make-foo-api foo-state) which takes a reference to the state it nees and returns a handler |
| 10:51 | jcromartie | and web/core.clj does (defn make-app [foo] (context "/api/foo" (foo/make-foo-api foo))) |
| 10:52 | jcromartie | web/routes/foo.clj just defines its handler in terms of "/" |
| 10:52 | jcromartie | so it can be located anywhere |
| 10:52 | jcromartie | you could make two handlers using different state under different parent routes |
| 11:27 | devinus | technomancy: why is lein so awesome? |
| 11:30 | devinus | i wish there was a good complex numbers lib for 1.5 :( |
| 11:30 | hyPiRion | devinus: because you don't set your hair on fire? :) |
| 11:31 | ambrosebs | pepijndevos: I'd also like to see the type for assoc :) I need a dotted type variable that works with "pairs" of types. |
| 11:32 | pepijndevos | ambrosebs: so what does assoc currently do? |
| 11:32 | ambrosebs | pepijndevos: hacky special cases. |
| 11:33 | ambrosebs | pepijndevos: It can assoc keywords to heterogeneous maps. |
| 11:33 | ambrosebs | pepijndevos: it can also assoc onto IPersistentMap things |
| 11:34 | ambrosebs | clgv: core.typed's "All" is just a bit of syntax around the internal Poly type. |
| 11:35 | pepijndevos | ambrosebs: hm. I think typed hetrogenous maps are/would be really powerful. I did some Haskell recently, and hte one thing I noticed is that everything is its own record, which is essentially a very inflexible and clunky heterogeneous map. |
| 11:36 | ambrosebs | yep, there's a good example in clojure.core.typed.test.compiler, there's a type for the CLJS AST nodes. |
| 11:38 | ambrosebs | pepijndevos: HMaps are half baked at the moment. I don't know how to represent functions like assoc and update-in, and there's no way to express keys that are known *missing*. |
| 11:39 | pepijndevos | ambrosebs: I assume it also only works if the key you pass to assoc is constant, i.e. not (assoc (somefn) blah) |
| 11:40 | ambrosebs | pepijndevos: You only keep a HMap if you assoc on more keyword keys, yes. |
| 11:41 | pepijndevos | what do you mean by keys that are missing? |
| 11:42 | ravster | how do I view the binary representation of a number? |
| 11:42 | pepijndevos | A key that's missing has the type (value nil) right? |
| 11:43 | pepijndevos | ravster: the Integer class has some method for this I believe |
| 11:43 | ambrosebs | pepijndevos: (HMap {:a Number}) guarantees that an :a is present, but makes no guarantees as to whether keys are absent. |
| 11:43 | ambrosebs | pepijndevos: See this thread: https://groups.google.com/forum/?fromgroups=#!topic/clojure-core-typed/1OATmVMAYYw |
| 11:44 | ambrosebs | pepijndevos: Currently the best we can do is Any, because we don't *know* if a key is absent. |
| 11:45 | ravster | thanks pepijndevos, will look into that. |
| 11:46 | pepijndevos | ambrosebs: why any? It's not suddenly going to return a string is it? It's either Number or nil. |
| 11:46 | ambrosebs | pepijndevos: Looking up :b in a (HMap {:a Number}) tells us nothing about :b's entry. |
| 11:47 | pepijndevos | uhm, right |
| 11:48 | pepijndevos | So what you want from :optional is to say that *if* a key is there, it's an int? |
| 11:50 | ambrosebs | pepijndevos: Yes. I've only recently realised it doesn't quite work that way. |
| 11:50 | pepijndevos | I''d say (HMap {} :optional {:a Number :b Long}) should equal (HMap {:a (U Number nil) :b (U Long nil}) |
| 11:51 | pepijndevos | that way {:a :kw :b 'a} is not of this type, but :a might not exist, which is to say it retuns nil when looked up. |
| 11:52 | ambrosebs | pepijndevos: I don't like it, since there's no way to distinguish between a non-existent key and a nil entry. This is important for eg. `find`. |
| 11:53 | pepijndevos | (doc find) |
| 11:53 | clojurebot | "([map key]); Returns the map entry for key, or nil if key not present." |
| 11:55 | ambrosebs | pepijndevos: we can also specify a different default value with `get`. |
| 11:56 | pepijndevos | ambrosebs: I know. It just seems to me that nil is exactly intended to signal the absence of a value. |
| 11:58 | ambrosebs | pepijndevos: Yes, many Clojure idioms embrace this. However, there could be a situation where there is an important semantic distinction between a nil-entry and an absent one. The current types handle all these cases. |
| 11:59 | tsdh | Wasn't there some function combining filter and remove, similar to how split-with combines take-while and drop-while? |
| 11:59 | ambrosebs | pepijndevos: I try to be as explicit with `nil` as possible, also favouring more accurate types in general. |
| 12:00 | ambrosebs | (doc group-by) |
| 12:00 | clojurebot | "([f coll]); Returns a map of the elements of coll keyed by the result of f on each element. The value at each key will be a vector of the corresponding elements, in the order they appeared in coll." |
| 12:00 | ambrosebs | tsdh: group-by seems close. |
| 12:00 | pepijndevos | ambrosebs: I understand. Maybe a special Absent type? Hmmmmmm... |
| 12:02 | pepijndevos | tsdh: if f is cheap (juxt filter remove) does the job. I seem to remember code-golfing this function with amalloy. |
| 12:02 | ambrosebs | pepijndevos: There's a quick-fix, and there's a more substantial one. |
| 12:02 | tsdh | ambrosebs: Hm, close. |
| 12:02 | pepijndevos | ambrosebs: the row polymorphism you mentioned? |
| 12:03 | ambrosebs | pepijndevos: that's the harder route, yes. |
| 12:04 | tsdh | pepijndevos: Yep, (let [[good bad] ((juxt filter remove) pred coll)] ...) will do. |
| 12:04 | ambrosebs | pepijndevos: if we have row polymorphism, we can say (All [r] (HMap {:a Number} :without [:b :c] :row [r])) for a map that has an :a, doesn't have a :b or :c, and can be extended with row r. |
| 12:04 | ambrosebs | pepijndevos: Although, just looking at it, the row seems redundant now.. |
| 12:05 | ambrosebs | I'm still new to row variables. |
| 12:05 | Frozenlock | If any of you want to help a poor soul in need (me) with its Google problems https://news.ycombinator.com/item?id=5415995 :) |
| 12:08 | ambrosebs | pepijndevos: perhaps it's worth implementing :without for now |
| 12:10 | pepijndevos | ambrosebs: btw, I just checked out the repo and got a dependency error for tools.analyze |
| 12:10 | ambrosebs | pepijndevos: using lein? |
| 12:10 | pepijndevos | yea |
| 12:11 | pepijndevos | oh, am I uspposed to use maven? That seems to be some sort of rule for contrib rpojects? |
| 12:11 | ambrosebs | no, maven doesn't work yet, I need some assistance to get it compiling. |
| 12:12 | ambrosebs | pepijndevos: just having a look around for the issue |
| 12:12 | pepijndevos | you just need more xml I think… |
| 12:13 | ambrosebs | pepijndevos: hehe no it seems like a bug in Clojure's compilation. |
| 12:14 | ambrosebs | pepijndevos: core.typed doesn't compile. |
| 12:14 | ambrosebs | pepijndevos: seemed to work for me :/ |
| 12:14 | ambrosebs | Retrieving org/clojure/jvm.tools.analyzer/0.3.2-SNAPSHOT/jvm.tools.analyzer-0.3.2-20130321.151954-5.pom from sonatype-oss-public |
| 12:14 | ambrosebs | Is that the version on the repo? |
| 12:14 | pepijndevos | let me try... |
| 12:15 | ambrosebs | pepijndevos: to be clear, use lein not maven. |
| 12:15 | pepijndevos | oh, works…. |
| 12:15 | ambrosebs | :) |
| 12:16 | pepijndevos | the maven gods must have been angry or something |
| 12:16 | ambrosebs | I had some trouble deploying to sonatype a few hours ago, got a 401 error. |
| 12:16 | ambrosebs | Perhaps it's just a bad day |
| 12:20 | ambrosebs | mpenet: pepijndevos: the :object in the type for `identity` just says that the argument's "path" is preserved in the return type. |
| 12:20 | ambrosebs | A path is an ordered sequence of operations from a starting point, say from a local binding. |
| 12:20 | ambrosebs | (let [a (..)] (-> a :a :b :c)) |
| 12:21 | ambrosebs | The path of that expression would be (:a :b :c) from local `a` |
| 12:21 | pepijndevos | oh, uhm… nice? |
| 12:22 | ambrosebs | pepijndevos: `identity` isn't all that interesting, but it's useful for recovering the types of HMaps |
| 12:22 | ambrosebs | We can do things like eg. (let [a (ann-form 1 Any) _ (assert (-> a :a :b :c))] ...) and infer that `a` is a 3 level deep hmap |
| 12:24 | pepijndevos | so wht would happen if identity did not have the extra stuff? |
| 12:25 | ambrosebs | pepijndevos: the :filters are the most useful part of identity's definition. |
| 12:26 | ambrosebs | pepijndevos: although.. there is weirdness there too. |
| 12:26 | ambrosebs | eg. (filter (fn [a] a) [...]) is more accurate than (filter identity [...]) |
| 12:27 | ambrosebs | I don't know how to solve that issue. |
| 12:27 | pepijndevos | O_o why is that? |
| 12:30 | TimMc | ambrosebs: wut |
| 12:30 | ambrosebs | pepijndevos: brief explanation here http://clojure-doc.org/articles/ecosystem/core_typed/limitations.html#using_filter |
| 12:31 | ambrosebs | unforunately it seems the Typed Racket guys have put some thought into this problem and don't have a solution :( |
| 12:32 | TimMc | Oh, so (fn [a] a) won't Just Work, you also have to annotate it. |
| 12:34 | ambrosebs | TimMc: ah, yes forgot to mention that. |
| 12:34 | ambrosebs | TimMc: It sucks, I'm working on an improved algorithm. |
| 12:34 | pepijndevos | But why is the type of the function important at all? The type of the output seq is always the same as the input seq, right? |
| 12:36 | pepijndevos | I would think it's just [(Any -> Any) (Sequable a) -> (Sequable a)] |
| 12:41 | mpenet | ambrosebs: about :object what does the :id and :path key refer to exactly? |
| 12:45 | clintm | Yay, I figured out my problem whilst composing a clear, succinct question for this channel. IRC is the new/old rubber duck. |
| 12:49 | ambrosebs | pepijndevos: The type you gave could never filter nils out of a (Seqable (U nil Number)) |
| 12:50 | pepijndevos | ambrosebs: oh, so a filter can actually change the type… hmmmm |
| 12:50 | ambrosebs | mpenet: yes, there's no equivalent in typed languages I think. |
| 12:51 | ambrosebs | mpenet: :id is a name of the local binding |
| 12:53 | ambrosebs | mpenet: the idea behind objects is to track a local binding and the "path" you have travelled down it. |
| 12:54 | ambrosebs | {:id 0} abstracts over the id of the first argument. In (let [a ..] (identity a)), {:id 0} would be instantiated to {:id 'a} |
| 12:55 | mpenet | ok, I suspected this was an arg index |
| 12:55 | ambrosebs | The simplest object is that of a local: (let [a ...] a) has an id 'a, and an empty path. |
| 12:55 | ambrosebs | (let [a ...] (-> a :a :b)) has an id 'a and a path ((KeyPE :a) (KeyPE :b)) |
| 12:55 | ambrosebs | KeyPE = Key Path Element |
| 12:56 | ambrosebs | There's also class path elements. (class a) has the object {:id 'a, :path [(ClassPE)]}. |
| 12:56 | ambrosebs | You can combine them freely. (-> a :a :b class) works as you'd expect. |
| 12:57 | ambrosebs | mpenet: To give some context, in Typed Racket they are most useful for tracks which car or cdr you are looking at of a pair. |
| 12:58 | ambrosebs | They have CarPE and CdrPE |
| 12:58 | mpenet | ok that makes a bit more sense. I think. I can find documentation on this on Typed Racket doc I hope |
| 13:00 | ambrosebs | mpenet: I'm not sure. You may need to open a dissertation or a paper :) |
| 13:04 | ambrosebs | mpenet: you'll probably almost never have to deal with objects directly. |
| 13:04 | mpenet | right :) well I think I will just avoid that for now, my plate of new things to learn is already quite full. This doesn't seem like something I will need for "everyday" typechecking though |
| 13:04 | mpenet | good! |
| 13:04 | ambrosebs | mpenet: Objects should be almost completely invisible in everyday use. |
| 13:13 | tieTYT | if I want to parse html and query the structure, do you guys recommend enlive? |
| 13:20 | rplaca | current status: http://www.youtube.com/watch?v=0I6xkVRWzCY :) |
| 13:32 | tyler | would angular be considered FRP? |
| 13:50 | Bronsa | k |
| 13:50 | nollidj | i'm interested in using core.logic to do validation of user input on a complex form. i can express constraints on the form's field values in clojure. these constraints can get rather complicated. can i use core.logic not to tell me all sets of assignments that satisfy those rules, but to validate a set of assignments and explicitly enumerate violations of them (e.g., "your entries are bad because variable X exceeds variable Y, and variable Z isn't in the se |
| 13:53 | RainbowDash_ | Hey guys |
| 13:53 | RainbowDash_ | Does anyone here program in Turing |
| 13:54 | nollidj | i suppose i can use core.logic to validate a specific set of assignments by adding constraints in the form of explicit variable settings, and the question that remains is how to handle program failure effectively |
| 13:54 | RainbowDash_ | Turing is the most up to date and best language you can program in do any of you noobs use it? |
| 13:55 | dxeh | no |
| 13:55 | dxeh | just no |
| 13:55 | RainbowDash_ | What's wrong with turing what are you some gay C++ user? |
| 13:55 | dxeh | well yes, i can program in c++, i used to program in turing when I was a youngster |
| 13:56 | tbaldridge | wait!....don't continue this debate until I pull out some popcorn... |
| 13:56 | dxeh | lololo |
| 14:05 | TimMc | technomancy: Do you know of a way I can specify additional clojure forms to indent like with-*? |
| 14:06 | TimMc | technomancy: In Emacs, that is. I'd like directory variables that I can check in to this project so that my collaborators can just use normal clojure-mode. |
| 14:08 | nDuff | (which operates on clojure-defun-indents) |
| 14:08 | nDuff | ...so I'd think you could add to the clojure-defun-indents list... |
| 14:09 | nDuff | TimMc: try M-x customize-variable clojure-defun-indents |
| 14:11 | TimMc | nDuff: So in a dir-locals file, I would put (clojure-defun-indents . (do-monad ...))? |
| 14:14 | TimMc | This is what I have so far, and it doesn't seem to have any effect: https://gist.github.com/timmc/5215321 |
| 14:14 | TimMc | (Emacs does pick it up.) |
| 14:15 | amalloy | TimMc: ((clojure-mode (clojure-defun-indents quote (at-revision)))) ;; this is in one of my .dir-locals.el files |
| 14:15 | Raynes | TimMc: Your Emacs is broken, effective immediately. |
| 14:15 | amalloy | it looks silly, of course, but that's equivalent to ((clojure-mode (clojure-defun-indents . '(at-revision)))) |
| 14:19 | TimMc | nop |
| 14:23 | TimMc | amalloy: customize-variable even shows the symbols, so I guess something else is wrong. |
| 14:23 | amalloy | TimMc: what happens if you add it yourself via the customize interface? |
| 14:24 | TimMc | It's already there. :-/ |
| 14:24 | amalloy | so go to a different file |
| 14:24 | amalloy | obviously that's not the final solution you want, but it will narrow down whether the problem is related to dir-locals at all |
| 14:25 | TimMc | OK, works now in that file. |
| 14:25 | TimMc | I can't seem to get any consistency as to whether that variable is already set properly. |
| 14:29 | TimMc | amalloy: All the examples I see for dir-locals use a pair for mode/varaibles |
| 14:33 | amalloy | okay? so does my example |
| 14:33 | TimMc | That's not what you pasted above. |
| 14:33 | TimMc | That is, there's no dot after clojure-mode. |
| 14:34 | amalloy | TimMc: like i told you, (clojure-defun-indents quote (at-revision)) is just how the printer interprets (clojure-defun-indents . '(at-revision)) |
| 14:34 | TimMc | Oh... you're also using one fewer set of parens. |
| 14:34 | TimMc | amalloy: Yeah, that's not actually what I'm talking about, though. |
| 14:36 | amalloy | well, it's certainly possible my .dir-locals file is wrong |
| 14:36 | TimMc | (I mean, I'm not talking about that *part* of the snippet.) |
| 14:36 | amalloy | i was going through the same kind of confusion when i wrote it as you are now, and i might have just given up |
| 14:37 | Bronsa | is github down only for me? |
| 14:38 | tieTYT | should clojure be added to this? http://en.wikipedia.org/wiki/Design_by_contract#Languages_with_native_support |
| 14:46 | S11001001 | Bronsa: http://downforeveryoneorjustme.com/github.com |
| 14:46 | hyPiRion | Bronsa: not here |
| 14:47 | Bronsa | sucks to be me then i guess. |
| 14:53 | solussd | Why do I get a compilation error if I have a macro that expands into a form including (nil <some args...>), if that code path is never actually called (e.g. (defmacro callme [f] `(if ~f (f))) ) ? |
| 14:54 | solussd | i mean, I know that is what happens, but why? nil isn't a symbol like any other symbol? |
| 14:55 | hyPiRion | ,(if false (nil 1 2)) |
| 14:55 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: Can't call nil, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:55 | hyPiRion | ,(if false (1 nil 2)) |
| 14:55 | clojurebot | nil |
| 14:55 | solussd | :) my point exactly. |
| 14:55 | hyPiRion | uh, well, I thought that last one should crash. |
| 14:56 | hyPiRion | ,(if false (unknown 1 2)) |
| 14:56 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: unknown in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 14:56 | hiredman | really the compiler should do a check for any kind of not IFn literal in the fun position and error on that instead of just special casing nil |
| 14:56 | solussd | this will work: (defmacro callme [f] `(let [f# ~f] (if f# (f#)))) |
| 14:57 | solussd | even if I feed it nil |
| 14:57 | hyPiRion | Okay, that's strange. It somehow checks if the nil is used as calling element compile-time |
| 14:57 | hyPiRion | ,(if false (true :?)) |
| 14:57 | clojurebot | nil |
| 14:57 | solussd | ,(let [blah nil] (if blah (blah))) |
| 14:57 | clojurebot | nil |
| 14:57 | solussd | it really is a special case for nil |
| 15:03 | xeqi | solussd, hyPiRion: should the body be `(if ~f (~f)) |
| 15:03 | xeqi | ? |
| 15:04 | xeqi | &user/nil |
| 15:04 | lazybot | java.lang.RuntimeException: No such var: user/nil |
| 15:04 | solussd | xeqi: hyPiRion: yes, but that still crashes |
| 15:05 | solussd | basically, if the compiler sees a form starting with nil, it throws an exception |
| 15:05 | solussd | any other symbol is fine-- I guess nil is a function literal? |
| 15:06 | solussd | ...or just a special case |
| 15:06 | hyPiRion | xeqi: I was merely curious why the behaviour solussd explained exists |
| 15:06 | hyPiRion | ,(if false '(nil 1 2)) |
| 15:06 | clojurebot | nil |
| 15:06 | hyPiRion | ,(if false (nil 1 2)) |
| 15:06 | clojurebot | #<CompilerException java.lang.IllegalArgumentException: Can't call nil, compiling:(NO_SOURCE_PATH:0:0)> |
| 15:06 | hyPiRion | ,(if false (1 :this :is :somehow :okay 2)) |
| 15:06 | clojurebot | nil |
| 15:06 | solussd | idk.. just annoying that I have to (defmacro callme [f] (let [f# ~f] (if f# (f#)))) |
| 15:07 | technomancy | TimMc: I recommend just renaming your macros that need that to with-[whatever] |
| 15:07 | xeqi | hmm, that is strange |
| 15:07 | hyPiRion | solussd: Well, that's safer though |
| 15:07 | Okasu | ,({} [] ()) |
| 15:07 | clojurebot | () |
| 15:07 | hyPiRion | always `let` the values you unquote. |
| 15:07 | Okasu | ,({} ,,,,,,[] ,,,,,()) |
| 15:07 | clojurebot | () |
| 15:08 | solussd | hyPiRion: safe from what? If I'm splicing in the actual value, that's safe. :) |
| 15:08 | Okasu | ,`({},,,,,,[],,,,,(),,),,,,, |
| 15:08 | clojurebot | ({} [] ()) |
| 15:09 | hyPiRion | ,(let [a (atom 1), f (swap! a inc)] `(if ~f (~f))) |
| 15:09 | clojurebot | (if 2 (2)) |
| 15:09 | hyPiRion | god dangit |
| 15:09 | amalloy | technomancy: just one macro will do, har har: (defmacro with-indentation [& body) body) (with-indentation (my-macro foo blah)) |
| 15:09 | hyPiRion | ,(let [a (atom 1), f '(swap! a inc)] `(if ~f (~f))) |
| 15:09 | clojurebot | (if (swap! a inc) ((swap! a inc))) |
| 15:09 | technomancy | amalloy: sweet |
| 15:10 | solussd | hyPiRion: ah, I see |
| 15:11 | solussd | what I'm splicing in is actually defined in a let (outside of a syntax quote) within my defmacro, so no worries in my case. :) |
| 15:12 | xeqi | solussd, hyPiRion: it appears to be a special case in the compiler https://github.com/clojure/clojure/blob/clojure-1.5.1/src/jvm/clojure/lang/Compiler.java#L6552 |
| 15:13 | solussd | xeqi: thanks. i hate impl details.. :) |
| 15:13 | solussd | still wondering my the namespace used by def is determined at read time. :/ |
| 15:14 | ohpauleez | lynaghk: ping |
| 15:14 | hyPiRion | solussd: for hygiene |
| 15:15 | solussd | but sometimes I have a macro that expands into a def form... and I want to control the namespace (not in "everyday" code, but in framework code) |
| 15:16 | hyPiRion | if I had (defmacro foo [a] `(last ~a)), and I used it somewhere where I exclude `last` and define my own `last`, then that is most likely not the intended behaviour |
| 15:16 | solussd | using intern is fine, but there are things built on top of def (defn, defrecord, etc) |
| 15:17 | Chousuke | you can temporarily switch namespaces perhaps |
| 15:17 | hyPiRion | use ~'foo instead |
| 15:17 | hyPiRion | ,`(~'into ~into) |
| 15:17 | clojurebot | eval service is offline |
| 15:17 | hyPiRion | dangit clojurebot, ##`(~'into ~into) |
| 15:17 | lazybot | ⇒ (into #<core$into clojure.core$into@13968ec>) |
| 15:18 | hyPiRion | &`(~'into into) ;; I mean |
| 15:18 | amalloy | better still, don't write frameworks that depend on defining global symbols in someone else's namespace |
| 15:18 | lazybot | ⇒ (into clojure.core/into) |
| 15:18 | solussd | amalloy: it's defining symbols in my namespaces (that may or may not yet exist when the macro is expanded / result executed) |
| 15:19 | amalloy | yeah, i realize that. i'm recommending you not do that |
| 15:19 | solussd | amalloy: also, not library code, but building up models in a webapp |
| 15:23 | ozzloy | does clojure have a thing where it runs a vm in the background so you don't have vm startup overhead for every script you run? |
| 15:23 | tieTYT | ozzloy: i'm a newb, but that might be what trampoline does |
| 15:24 | tieTYT | at least I think trampoline is for solving the startup sepeed problem |
| 15:24 | amalloy | solussd: try reading "Why not to use my library clj-record": reflections from someone who did just what you're doing now, years ago, and why he thinks it's a bad idea |
| 15:25 | solussd | amalloy: I'm not packaging my code up into a library for other people t consume- I'm just drying up some repetition in defining model entities, validators, authorization checks, etc. |
| 15:25 | xeqi | tieTYT: not quite, it ends lein's vm before starting the project vm. Its for memory or stdin issues |
| 15:25 | solussd | but I'll read it. :) |
| 15:26 | xeqi | ozzloy: what do you mean by "script"? |
| 15:26 | tieTYT | xeqi: oh |
| 15:28 | ozzloy | tieTYT, cool, i'll look into that |
| 15:28 | solussd | amalloy: ok, this is good stuff- thanks |
| 15:28 | tieTYT | ozzloy: apparently i'm wrong about that |
| 15:29 | ozzloy | xeqi, by "script" i mean a job i run by hand every so often, like finding possible duplicates in my music collection |
| 15:29 | ozzloy | tieTYT, bummer |
| 15:31 | tieTYT | what does the ^ mean when it's used before a parameter in a function? Eg: [^String ...] |
| 15:31 | xeqi | tieTYT: thats a type hint for the next symbol |
| 15:32 | tieTYT | makes sense |
| 15:33 | xeqi | ozzloy: if its run by hand you could keep a repl open. if it is run through lein you might be able to use https://github.com/flatland/drip |
| 15:33 | tieTYT | xeqi: why doesn't it need a .? |
| 15:34 | mattmoss | tieTYT: the type hint isn't a method call… it's meta info |
| 15:34 | xeqi | tieTYT: a . ? |
| 15:34 | xeqi | ah, interop call |
| 15:34 | tieTYT | yes |
| 15:34 | tieTYT | i thought . was for all interop, not just a call. That makes sense |
| 15:36 | tieTYT | seems to me that protocols are just like haskell's typeclasses |
| 15:42 | ozzloy | xeqi, i'll look into that |
| 15:44 | mikerod | Why am I getting this error: "CompilerException java.lang.RuntimeException: Unable to resolve symbol: defmacro- in this context, compiling:..."? This is in version 1.4. The Clojure docs has docs for defmacro- in version 1.2. Was it removed? |
| 15:48 | tieTYT | if a variable/function is wrapped in astericks, does that mean anything special? |
| 15:49 | joegallo | generally it means that you might consider rebinding that variable with a different value in order to get different behavior somewhere else in the system |
| 15:50 | tieTYT | is that simply a convention? |
| 15:51 | joegallo | yes, as i understand it, it's a very old lisp tradition |
| 15:52 | tieTYT | ok thanks |
| 15:53 | joegallo | you're welcome |
| 15:57 | xeqi | mikerod: it was part of a contrib library, which got split into seperate seperate smaller libraries that could get released on their own schedule |
| 15:57 | uvtc | I'm curious to hear how takeoutweight's talk about clojure-scheme turned out. What's the status of clojure-scheme? (Also curious about tbaldridge 's talk.) |
| 15:58 | xeqi | mikerod: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go says you might find it in https://github.com/clojure/core.incubator/ |
| 16:01 | mikerod | xeqi: Thank you for the information. I'll look at this. |
| 16:14 | TimMc | Sanity check, please: https://gist.github.com/timmc/5216308 |
| 16:14 | TimMc | This throws an assertion error when fed "http", instead of just returning nil. |
| 16:15 | nDuff | TimMc: because you're trying to cast the nil to a java.net.URL, yes. |
| 16:16 | nDuff | ...hrm. |
| 16:17 | amalloy | TimMc: cast isn't java cast; it's java instanceof |
| 16:17 | amalloy | &(instance? String nil) |
| 16:17 | lazybot | ⇒ false |
| 16:17 | nDuff | TimMc: Sure you don't mean (defn wtf [s] (try {:post [(java.net.URL. s)]} (catch java.net.MalformedURLException murle nil)))? |
| 16:17 | amalloy | &(cast String nil) |
| 16:17 | lazybot | ⇒ nil |
| 16:17 | amalloy | hm |
| 16:18 | amalloy | oh. TimMc: (cast String nil) returns nil, so the :post is falsey |
| 16:18 | trptcolin | cast returns nil in this case? so the assertion fails? |
| 16:18 | TimMc | oh hell |
| 16:19 | trptcolin | heh |
| 16:19 | TimMc | My thought process: "I should check for nil before I do the cast. No wait, nil can always cast. NIL CASE: ADDRESSED." |
| 16:22 | hiredman | cast is magic, it provides info for the compiler for method resolution |
| 16:22 | hiredman | similar to type hinting |
| 16:24 | TimMc | hiredman: The compiler must special-case cast calls with a class literal in the first arg position. |
| 16:25 | trptcolin | ,(source cast) |
| 16:25 | clojurebot | eval service is offline |
| 16:25 | TimMc | trptcolin: (. c (cast x)) |
| 16:25 | trptcolin | awww. it's just a fn, though, calls java's Class.cast, right? |
| 16:25 | trptcolin | zackly |
| 16:26 | ravster | I'm trying -->(GET "/" [] (resource :handle-ok "hellow from liberator."))<-- Trying to use liberator on my project, but this isn't working. I'm using ring.middleware.reload, and its keeping on giving back the original message that I was setting with a simple response-map. |
| 16:28 | amalloy | hiredman: you're saying that the compiler knows (cast c x) returns an instance of c? i don't see that anywhere obvious |
| 16:29 | hiredman | amalloy: yeah, I must be mistaken, but I could have sworn I used it to get the compiler to use the right method some place |
| 16:31 | ravster | I'm getting a response (upon restarting) getting "No acceptable resource available" HTTP code 406 |
| 16:32 | TimMc | hiredman: I know that int and friends do that... |
| 16:56 | amalloy | trptcolin: fwiw, the source of 'cast isn't necessarily enough to know that it just calls Class.cast |
| 16:57 | trptcolin | amalloy: outside of special-casing the analysis? |
| 16:57 | amalloy | for example, instance? is defined as (. c (isInstance x)), but when it's called with a literal class as its first argument, the compiler replaces that with the bytecode for instanceof |
| 16:57 | hiredman | and it does that without argument checks |
| 16:58 | hiredman | or did |
| 16:58 | hiredman | ,(instance? Class) |
| 16:58 | clojurebot | false |
| 16:58 | amalloy | hiredman: you mean, without checking the number of arguments? yeah |
| 16:58 | hiredman | that really needs to be rewritten as an intrinsic |
| 16:59 | trptcolin | sure, i mean for all user-land knows. but that's the case for pretty much every function, right? |
| 17:00 | trptcolin | there *could* be a special case in the compiler |
| 17:00 | hiredman | instance? is very *special* case |
| 17:00 | amalloy | could it, though, hiredman? it would add a function-call overhead at least, and i'm not sure it's even possible the way intrinsics and instanceof work at the moment |
| 17:02 | hiredman | amalloy: huh? the way intrinsics work is the function definlines at a static method call, and the compile has a list of method calls and bytecodes to replace them with |
| 17:02 | amalloy | hiredman: right, but it starts by pushing the relevant arguments onto the stack. afaict from reading jvm bytecode definitions, an instanceof call is not preceded by pushing a Class object onto the stack |
| 17:04 | amalloy | ie, the best an intrinsic could produce is something like "push String, push x, instanceof", but there's no such instanceof operator |
| 17:04 | hiredman | hmmmm |
| 17:05 | hiredman | ok then lets over haul the intrinsic system |
| 17:06 | hiredman | they obviously should be ifns that be passed the bytecode generator so they can do whatever they want |
| 17:06 | hiredman | (like sticking a class in to the constant pool, etc) |
| 17:11 | TimMc | Speaking of overhauling, has there been any progress on the digital CA thing? |
| 17:18 | jonas11235 | guys, I need to call with-query-results binding a list to the a variable parameter list (the query is created dynamically), how can I explode the my list to the sql-params in with-query-results? |
| 17:21 | amalloy | i just dove into the asm code because i was curious how instanceof manages to add something to the class's constant pool. what a mess of callbacks |
| 17:22 | abp | ,(into ["select * from x where id = ?"] '(1)) |
| 17:22 | clojurebot | ["select * from x where id = ?" 1] |
| 17:22 | abp | jonas11235 ^ |
| 17:25 | squidz | does anybody know of any closure(google closure) compatible charting libraries? |
| 17:27 | jonas11235 | abp: I will try it |
| 17:27 | jonas11235 | abp: sorry, but I did that :) |
| 17:28 | jonas11235 | abp: in my query I have a field with "IN (?, ?, ?, ?)" but the number of '?' is dynamic |
| 17:29 | TimMc | jonas11235: Should still work. |
| 17:29 | jonas11235 | abp: if I receive a list with 20 ids, I generate a query with 20 '?' in the list |
| 17:29 | TimMc | &(into ["(?, ?, ...)"] (range 5)) |
| 17:29 | lazybot | ⇒ ["(?, ?, ...)" 0 1 2 3 4] |
| 17:30 | jonas11235 | abp: TimMc: my problem is to do the bind |
| 17:30 | jonas11235 | abp: TimMc: let me try the &(into |
| 17:33 | muhoo | i vaguely remember a function that'll do something like (mystery-func inc :a [{:a 1 :b 2} {:a 7 :b 12}]) => [{:a 2, :b 2} {:a 8 :b 12}] , but i can't recall its name |
| 17:33 | jonas11235 | abp: TimMc: nope, it didn't worked :( |
| 17:34 | TimMc | jonas11235: That's not enough information to help you. |
| 17:34 | TimMc | muhoo: map + update-in ? |
| 17:34 | jonas11235 | TimMc: I already generated the query with join and repeat |
| 17:35 | TimMc | "It didn't work" doesn't contain much information. What happened? |
| 17:35 | jonas11235 | TimMc: the problem is that I need to pass 20 variables but if I pass the list it count as only one |
| 17:35 | amalloy | ~helpme |
| 17:35 | clojurebot | A bug report (or other request for help) has three parts: What you did; what you expected to happen; what happened instead. If any of those three are missing, it's awfully hard to help you. |
| 17:35 | jonas11235 | TimMc: "Unable to resolve symbol: & in this context" |
| 17:37 | abp | jonas11235: neither , nor & belong onto the start of what we posted. Those where only to trigger the bots in this channel. |
| 17:37 | TimMc | jonas11235: A compile error is very different from, say, a JDBC error. |
| 17:38 | abp | Hm, he's probably overwhelmed by inacurate error messages. |
| 17:38 | jonas11235 | TimMc: before that I was receiving: "The conversion from UNKNOWN to UNKNOWN is unsupported" |
| 17:38 | abp | :D |
| 17:38 | abp | really? |
| 17:38 | abp | how did you do that? |
| 17:38 | jonas11235 | TimMc: abp: what didn't helped me :( |
| 17:39 | abp | so, show us some examples of code and what it should result in and we give you hints. |
| 17:40 | TimMc | jonas11235: https://www.refheap.com/paste |
| 17:41 | abp | Actually it is shocking how much of pedestal *is* documented but not obviously. You get to know about testing your app using datalog queries on state in a new apps test/behaviour.clj |
| 17:42 | jonas11235 | abp: TimMc: https://www.refheap.com/paste/2c6dc53c5ea78a818d349b12a |
| 17:43 | jonas11235 | abp: TimMc: I have another query working but without the list-to-parameters problem |
| 17:44 | jonas11235 | TimMc: abp: I'm trying to bind a list of ids but I don't know the size of the list |
| 17:45 | TimMc | jonas11235: OK, so make a function that *just* builds the queries, and see if that works, and then see if the output makes sense. |
| 17:45 | TimMc | s/queries/query/ |
| 17:45 | muhoo | TimMc: thanks |
| 17:45 | TimMc | It sounds like you're having trouble telling where the errors are coming from, so splitting up the problem is very important. |
| 17:46 | jonas11235 | TimMc: are you saing to inject the ids when I generate the query? |
| 17:46 | TimMc | No, I'm telling you to break the function into smaller pieces. |
| 17:46 | jonas11235 | TimMc: instead of injecting placeholders? |
| 17:46 | jonas11235 | TimMc: ok, let me do it :) |
| 17:51 | jonas11235 | TimMc: https://www.refheap.com/paste/12799 same error but better code :) |
| 17:53 | TimMc | jonas11235: So this time, just call get-collaborators-query and print the result. Don't even try to talk to the database. |
| 17:55 | nDuff | It's really obvious in Light Table, too. |
| 17:56 | nDuff | jonas11235: (id-placeholders ["1" "2" "3"]) => " IN (???)" |
| 17:56 | squidz1 | Pedestal looks pretty interesting, but does it differe a lot from the usual compojure + libs? |
| 17:56 | nDuff | squidz1: Pretty considerably, yes. |
| 17:57 | squidz1 | nDuff: how? |
| 17:57 | nDuff | squidz1: ...particularly the client-side state model. |
| 17:57 | nDuff | squidz1: ...the interceptors are a departure, too, and a worthwhile one. |
| 17:57 | squidz1 | is it more akin to a functional philosohpy now? |
| 17:58 | bendlas | nDuff: interesting, have you looked into that model yet? |
| 17:58 | nDuff | squidz1: ...the state model enforces breaking your transitions down into small functions. |
| 17:58 | jonas11235 | nDuff: you're right :( fixing that |
| 17:58 | nDuff | squidz1: ...I'm not going to make pronouncements on philosophy, though. |
| 17:59 | squidz1 | okay, well it certainly looks really nice, I am just unsure if I should move my web project to it since I havent really gotten that far. I will definitely read through the docs and see if I think it's worth a move |
| 17:59 | nDuff | bendlas: A bit, but I won't say I really understand it until I've built an application on top of it. |
| 18:00 | nDuff | I'm in the unfortunate position of having a lot of Java-world framework forced on me for my production code, so it's not really an option for what would otherwise be the most interesting candidate. |
| 18:00 | bendlas | sounds like I got have a look at it ... |
| 18:05 | jonas11235 | TimMc: nDuff: now the query is right :) https://www.refheap.com/paste/e61b1af08103b3dd9861284d0 |
| 18:05 | jonas11235 | TimMc: nDuff: but I still have the same error: "The conversion from UNKNOWN to UNKNOWN is unsupported" when I try to execute it :( |
| 18:07 | nDuff | jonas11235: Have you ever pasted the exception, with its stack trace, ANYWHERE? |
| 18:08 | nDuff | jonas11235: ...or a complete reproducer (which necessarily includes database schema, any necessary sample data to reproduce, etc)? |
| 18:08 | nDuff | jonas11235: I don't think you've even given us the _class_ of the exception |
| 18:08 | jonas11235 | nDuff: TimMc: sorry: https://www.refheap.com/paste/2ff10df14aaa0de3e2eb9e302 |
| 18:08 | nDuff | Ahh -- it's an error from SQL Server |
| 18:09 | nDuff | Clearly, then, SQL Server's documentation is the place to start from in understanding it. |
| 18:09 | nDuff | ...though, hmm; looks like it's happening in setting prepared statement parameters... |
| 18:09 | jonas11235 | nDuff: TimMc: it is trying to set the list as an object instead of individual elements :( that is my question, how do I bind a list to a parameter list |
| 18:10 | nDuff | jonas11235: Depend on the Java type. If it's Object..., then you need to pass a Object[] |
| 18:10 | nDuff | jonas11235: and that's as easy as using (into-array Object your-vector) |
| 18:10 | jonas11235 | nDuff: it is a list of int |
| 18:10 | nDuff | a _list_, or a _vector_? |
| 18:11 | jonas11235 | nDuff: vector |
| 18:11 | mikerod | Is there a way to not get a notification for everyone who joins or leaves the channel? IRC-noob question, but I can't seem to find the answer online. |
| 18:11 | hiredman | depends on your client |
| 18:12 | mikerod | Ah, I've just been going through webchat.freenode.net for this. |
| 18:12 | nDuff | ...though if you're using clojure.java.jdbc (which we don't know, because you didn't show us your ns declaration), it's easier than that... |
| 18:12 | jonas11235 | nDuff: I tried to use setArray before (I did this query in java first) and it didn't worked |
| 18:13 | jonas11235 | nDuff: yeap, clojure.java.jdbc |
| 18:14 | tyler | ,(class (,,,,,,, + ,,,, 1 ,,,,,,,,,,, 4 ,,,,,,,,, ),,,,,) |
| 18:14 | clojurebot | java.lang.Long |
| 18:14 | tyler | heh |
| 18:14 | nDuff | jonas11235: Then you just need to generate a larger vector. concat will do that for you. |
| 18:15 | jonas11235 | nDuff: https://www.refheap.com/paste/717e7f8c0997577202892333e complete code |
| 18:15 | nDuff | jonas11235: ...as in: (sql/with-query-results rows (concat ["your query string"] your-arg-vector) |
| 18:16 | nDuff | jonas11235: right -- that's generating ["your query string" [arg1 arg2 arg3]], not ["your query string" arg1 arg2 arg3] |
| 18:16 | nDuff | ...so obviously it won't work. concat is your friend. |
| 18:16 | jonas11235 | nDuff: exactly :) |
| 18:16 | jonas11235 | nDuff: are you saying to put the values in the query? |
| 18:17 | nDuff | OF BLOODY COURSE NOT. |
| 18:17 | nDuff | (sql/with-query-results rs (concat [(get-collaborators-query)] item-ids) ...) |
| 18:18 | jonas11235 | nDuff: ok, let me try it |
| 18:19 | nDuff | ...now, how did this become a question about SQL, not a question about "how do I generate a vector of this form"? |
| 18:27 | jonas11235 | nDuff: https://www.refheap.com/paste/3a93dd19966ad7001275c34b7 |
| 18:29 | jonas11235 | nDuff: https://www.refheap.com/paste/0dfdf4f7461d1155609777f68 it generated a IllegalArgumentException |
| 18:29 | jonas11235 | nDuff: Exception in thread "main" java.lang.IllegalArgumentException: "sql-params" expected vector [sql param*], found clojure.lang.LazySeq |
| 18:31 | tyler | im having a hard time grokking how lists relate to evaluation. e.g. (+ 1 2) is just a list containing three "things", does the reader try to evaluate all lists? |
| 18:32 | jjido | jonas11235: ,(vec '(1 2 3)) |
| 18:32 | jjido | ,(vec '(1 2 3)) |
| 18:32 | clojurebot | [1 2 3] |
| 18:32 | jjido | tyler: yep |
| 18:33 | tyler | so lists serve "double duty" being a datastructure and an evaluation context |
| 18:33 | jjido | tyler: unless quoted (like I did just above) |
| 18:33 | jjido | tyler: don't know what you mean by evaluation context, but sounds right |
| 18:34 | jonas11235 | jjido: same problem :( |
| 18:35 | jonas11235 | jjido: I tried with and without using concat |
| 18:35 | jjido | jonas11235: show me your call to sql-params now? |
| 18:36 | jonas11235 | jjido: (defn get-collaborators [item-ids] |
| 18:36 | jonas11235 | (sql/with-connection @db |
| 18:36 | jonas11235 | (sql/with-query-results rs (concat [(get-collaborators-query item-ids)] ,item-ids) |
| 18:36 | jonas11235 | (first rs)))) |
| 18:37 | tyler | TIL empty lists aren't seqs |
| 18:37 | nDuff | jonas11235: Have you tried breaking this down into pieces? |
| 18:37 | nDuff | jonas11235: for instance, have you looked at (concat [(get-collaborators-query item-ids)] item-ids) |
| 18:37 | nDuff | jonas11235: ...I assume you're developing in a REPL, right? Use that. |
| 18:38 | hiredman | ,(contains? (ancestors (class ())) clojure.lang.ISeq) |
| 18:38 | clojurebot | true |
| 18:38 | hiredman | oh really |
| 18:38 | jonas11235 | nDuff: it generates a lazy-seq |
| 18:38 | jjido | hiredman: are you sure it doesn't return the same for any type? |
| 18:39 | jjido | jonas11235: you need a vector |
| 18:39 | nDuff | ,(concat ["hello"] [1 2 3]) |
| 18:39 | clojurebot | ("hello" 1 2 3) |
| 18:39 | nDuff | Ahh, so it does. |
| 18:39 | hiredman | ,(contains? (ancestors (class 1)) clojure.lang.ISeq) |
| 18:39 | clojurebot | false |
| 18:39 | nDuff | ,(vec (concat ["hello"] [1 2 3])) |
| 18:39 | clojurebot | ["hello" 1 2 3] |
| 18:39 | nDuff | jonas11235: ^^^ |
| 18:40 | jjido | ,(contains? (ancestors (class ())) clojure.lang.IMap) |
| 18:40 | clojurebot | #<CompilerException java.lang.ClassNotFoundException: clojure.lang.IMap, compiling:(NO_SOURCE_PATH:0:0)> |
| 18:44 | amalloy | tyler, jjido: the reader certainly doesn't evaluate lists |
| 18:45 | jjido | amalloy: tell me more? |
| 18:45 | jjido | ,("" 5 3.5) |
| 18:45 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn> |
| 18:46 | jjido | ^ did it not evaluate the list? |
| 18:47 | mattgordon | (defn db-do-prepared [db transaction? sql & param-groups] …) |
| 18:47 | mattgordon | ^ What is the simplest way to pass a seq of param-groups to that |
| 18:47 | jonas11235 | nDuff: Worked! Thank you! :) |
| 18:48 | mattgordon | ie. i need to inline the seq as each item in it represents a param-group |
| 18:48 | abp | mattgordon: apply |
| 18:48 | mattgordon | yeah i'm trying that. just need to futz more i guess |
| 18:48 | jonas11235 | nDuff: the final version: (vec (concat [(get-collaborators-query item-ids)] item-ids)) |
| 18:48 | mattgordon | oh woops |
| 18:48 | mattgordon | i *thought* i was trying that but dropped off my apply |
| 18:49 | mattgordon | *slaps head* |
| 18:52 | mattgordon | abp: thanks |
| 18:55 | muhoo | https://github.com/Mikkeren/FizzBuzzEnterpriseEdition |
| 18:56 | patchwork | Anyone tried to make a web debugging interface for clojure ala werkzeug for python? |
| 18:56 | patchwork | going through the cdt stuff it doesn't look like it would be too difficult |
| 18:57 | patchwork | basically just making a web frontend to cdt |
| 19:05 | TimMc | jonas11235: This would also work: `[~(get-collaborators-query item-ids) ~@item-ids] |
| 19:10 | nollidj | i'm interested in using core.logic to do validation of user input on a complex form. i can express constraints on the form's field values in clojure. these constraints can get rather complicated. can i use core.logic not to tell me all sets of assignments that satisfy those rules, but to validate a set of assignments and explicitly enumerate violations of them (e.g., "your entries are bad because variable X exceeds variable Y, and variable Z isn't in the se |
| 19:11 | hiredman | nollidj: I really hope you have that on a cron job and are not manually pasting it in every 4 hours |
| 19:11 | hiredman | because that would be a waste of time |
| 19:23 | jonas11235 | TimMc: ty |
| 19:24 | Glenjamin | hi guys, what's the runtime equivalent of ~@body? |
| 19:24 | Glenjamin | wait, never mind - that question doesn't make sense |
| 19:24 | amalloy | (inc Glenjamin) |
| 19:24 | lazybot | ⇒ 1 |
| 19:24 | Glenjamin | i was thinking i could just use a function, but i need a macro |
| 19:25 | amalloy | if only more people stopped to realize their question makes no sense |
| 19:26 | nollidj | hiredman: i promise i'm not |
| 19:27 | nollidj | hiredman: i figured i'd give it another go in the evening when more people might be around. i'll look for a more fruitful venue if no one bites |
| 19:27 | Glenjamin | currently trying to find a balance between testing my middleware, which has fairly complex behaviour, and testing all of its helper functions in isolation |
| 19:27 | Glenjamin | lots of thinking, not enough hacking |
| 19:31 | nollidj | hiredman: do you say that simply because i seemed spammy, or because you don't think it's a good question? |
| 19:33 | chessguy | good evening everyone |
| 19:33 | jimkcar | hey hey |
| 19:33 | hiredman | nollidj: spammy |
| 19:34 | chessguy | i'm excited. a friend of mine is about to help me get my clojure environment up to speed, and we're going to work through the koans together |
| 19:36 | Raynes | chessguy: Who is your friend? |
| 19:36 | Raynes | I'll tell you if he sucks or not. |
| 19:36 | chessguy | haha, i've worked with him for 3 years, i know he doesn't suck |
| 19:37 | chessguy | his name is Seth, also goes by foogoof |
| 19:37 | Raynes | I don't know him so he probably sucks. |
| 19:37 | Raynes | Tell him Raynes says "Good evening, sir." |
| 19:37 | Raynes | Have fun with the Clojuring. :) |
| 19:38 | chessguy | we will |
| 19:39 | DarkLinkXXXX | What's the solution to this? I read a little about lists, but it didn't help me. http://www.4clojure.com/problem/4 |
| 19:39 | Glenjamin | ,(macroexpand '(->> body (with abc) (with def))) |
| 19:39 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 19:40 | Glenjamin | bah |
| 19:40 | amalloy | really, Raynes? foogoof has at least been in here a few times |
| 19:40 | Glenjamin | can anyone tell me why that doesn't expand fully? |
| 19:40 | Raynes | amalloy: Perhaps I'm not as omnipresent as you, sir. |
| 19:40 | brehaut | DarkLinkXXXX: did you not try at all? |
| 19:40 | joegallo | DarkLinkXXXX: http://clojure.github.com/clojure/ the documentation is here |
| 19:40 | DarkLinkXXXX | brehaut, I tried a few things. |
| 19:40 | chessguy | he helps run the DC clojure meetup |
| 19:40 | joegallo | and the documentation for the list function is http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/list |
| 19:40 | joegallo | ,(list 1 2 3) |
| 19:41 | clojurebot | (1 2 3) |
| 19:41 | joegallo | makes a list containing 1 and 2 and 3 |
| 19:41 | joegallo | what things did you try? |
| 19:41 | DarkLinkXXXX | '(:a :b :c) |
| 19:41 | DarkLinkXXXX | "a" "b" "c" |
| 19:41 | DarkLinkXXXX | I forget the rest. |
| 19:41 | joegallo | that makes a list containing a list of :a and :b and :c |
| 19:41 | joegallo | "a" is not :a |
| 19:42 | joegallo | "a" is a string, :a is a keyword |
| 19:42 | DarkLinkXXXX | Yeah. I figured that out. |
| 19:42 | joegallo | it would like the difference between "1" and 1 ;) |
| 19:42 | DarkLinkXXXX | I'm not new to programming, btw. |
| 19:42 | Raynes | Nobody is trying to be mean to you. |
| 19:42 | joegallo | neither am i |
| 19:42 | chessguy | calling :a a keyword and a a symbol is going to freak me out for a while, coming from ruby |
| 19:43 | Glenjamin | i'm looking for a macro similar to ->, that'll let me combine multiple forms of the type (with-x context body), into something like (__ (with-x x-context) (with-y y-context) body) |
| 19:43 | Raynes | It's just that if you tried "a" "b" "c" but know that "a" is different than :a, I'm a bit baffled as to why you didn't try :a :b :c |
| 19:43 | Raynes | I think that's the connection he was trying to make. |
| 19:43 | joegallo | maybe now is a good time to try that |
| 19:44 | DarkLinkXXXX | Raynes, Ah crap. I don't know either. |
| 19:44 | Raynes | :p |
| 19:46 | amalloy | Glenjamin: sounds like ->> with its arguments reversed |
| 19:47 | amalloy | though i think it will come out more readable if you just wrap the (with-x (with-y ...)) forms like god intended |
| 19:48 | Glenjamin | it's for mocks in tests, doing a few puts me pretty far indented |
| 19:48 | chessguy | so, anybody working on anything interesting in clojure? |
| 19:49 | Glenjamin | i'm 'with-redef'-ing the same things in multiple tests, so the idea was to move the names of what to redef into the macro |
| 19:49 | Glenjamin | and then be able to compose them |
| 19:52 | Glenjamin | i'm still confused as to why macro expand only seems to expand ->> once |
| 19:55 | amalloy | Glenjamin: macroexpand only expands the "outermost" form you gave it; it doesn't walk into subforms and expand them too |
| 19:55 | Glenjamin | ah |
| 19:55 | Glenjamin | is there a variant that does that? |
| 19:55 | amalloy | the compiler :P |
| 19:55 | Glenjamin | heh |
| 19:56 | amalloy | clojure.tools.macro/mexpand-all does a reasonably good job, although it doesn't always produce exactly the same thing the compiler does |
| 20:01 | Glenjamin | right, trying to write it has convinced this macro is a terrible idea |
| 20:04 | amalloy | Glenjamin: (defmacro make-hard-to-read [& body] `(->> ~@(reverse body)))? |
| 20:04 | Glenjamin | that worked, but i'd only have one form for body |
| 20:04 | Glenjamin | then i started messing with butlast and gave up |
| 20:04 | TimMc | Glenjamin: Be aware that ->> currently has a bug in it. |
| 20:04 | Glenjamin | o.O |
| 20:05 | amalloy | that's fixed in 1.5, isn't it? |
| 20:05 | Glenjamin | got to this: "(defmacro <<- [& body] (let [wraps (butlast body) body (last body)] `(->> (do ~@body) ~@(reverse wraps))))" |
| 20:05 | TimMc | One would hope so. |
| 20:05 | Glenjamin | which doesn't work |
| 20:05 | Glenjamin | speaking of versions |
| 20:06 | Glenjamin | when a dependency depends on an older version of clojure, what happens |
| 20:06 | amalloy | well, of course you can only have one form for body, if you want to make all but one into wrappers |
| 20:06 | Glenjamin | yeah, didn't think it through |
| 20:06 | Glenjamin | do they get compiled into byte code separately and interact only via the jvm? |
| 20:07 | TimMc | &(macroexpand `(->> a b (->> c d))) ;; Glenjamin |
| 20:07 | lazybot | java.lang.StackOverflowError |
| 20:07 | TimMc | amalloy: Patch, test, and apathy: http://dev.clojure.org/jira/browse/CLJ-1121 |
| 20:08 | amalloy | Glenjamin: you get one version of clojure to share, selected more or less arbitrarily |
| 20:08 | Glenjamin | oh, i noticed leiningen downloading the old one and got suspicious |
| 20:11 | eignerchris | I'm new to clojure. I'm attempting to use resolve with http-kit to build the string necessary to execute an http GET or POST and then later execute that method |
| 20:12 | eignerchris | in my repl i can do this: (def http-request-method (resolve (symbol "http/get"))) |
| 20:12 | eignerchris | (http-request-method "http://www.google.com") |
| 20:12 | eignerchris | and it works great |
| 20:12 | eignerchris | however when running my app, i get a java.lang.NullPointerException error |
| 20:12 | eignerchris | can anyone shed any light? i'm stumped |
| 20:13 | Glenjamin | amalloy: this is the code i'm trying to simplify https://gist.github.com/glenjamin/75f8d17abef4db9ca9c7 |
| 20:14 | Glenjamin | can't decide if it feels ugly to me because i'm not used to it, or i'm just doing too much stuff |
| 20:14 | amalloy | Glenjamin: you're literally just trying to move parens around, not even change the textual order of the code. the way it is now is fine |
| 20:15 | Glenjamin | cheers, still not used to lisps |
| 20:15 | Glenjamin | i found myself thinking about a haskell-style "where" clause the other day |
| 20:15 | Glenjamin | like let, but with bindings at the end |
| 20:15 | Glenjamin | need to give in to the parens i think |
| 20:16 | amalloy | well, implementing where would not be the worst thing ever, but it'd need just as many parens as let |
| 20:22 | Glenjamin | i also figure, without the full laziness it's less useful |
| 20:23 | Glenjamin | in haskell-land you can declare a bunch of expressions that only apply to some paths of the body, so it makes more sense to leave them at the bottom out of the way |
| 20:23 | tyler | what is a function like conj but instead of adding to front of list it replaces first element? |
| 20:23 | Glenjamin | (comp tail conj) ? |
| 20:24 | Glenjamin | no, that doesn't work |
| 20:24 | tyler | tail isn't a function |
| 20:24 | Glenjamin | `(#(conj %1 (rest %2)) 1 [2 3 4]) |
| 20:25 | Glenjamin | &(#(conj %1 (rest %2)) 1 [2 3 4]) |
| 20:25 | lazybot | java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IPersistentCollection |
| 20:26 | Glenjamin | oh right |
| 20:26 | Glenjamin | &(#(conj (rest %1) %2) [2 3 4] 1) |
| 20:26 | lazybot | ⇒ (1 3 4) |
| 20:26 | Glenjamin | there |
| 20:29 | amalloy | yeah, i suppose the haskell version would be like... (flip (:)) . tail? |
| 20:29 | amalloy | since we're mentioning tail |
| 20:34 | tieTYT | amalloy: to add to the end? |
| 20:34 | tieTYT | [1..3] ++ [x] |
| 20:34 | tieTYT | that'll add x to the end |
| 20:35 | amalloy | tieTYT: have you followed the discussion, or tried to run the haskell or clojure versions of the function being discussed? it is not the thing you just offered |
| 20:35 | arrdem | do we really not have a math library newer than contrib? |
| 20:35 | Raynes | java.math |
| 20:35 | arrdem | meh. |
| 20:35 | arrdem | mmkay |
| 20:35 | Raynes | java.lang.Math, even. |
| 20:36 | tieTYT | tyler kind of interrupted the flow, sorry |
| 20:37 | muhoo | hmm, lein outdated gives me a weird error |
| 20:37 | muhoo | org.apache.lucene.store.LockReleaseFailedException: Cannot forcefully unlock a NativeFSLock which is held by another indexer component: /home/localkens/clojure/lein-resources/indices/http___repo1.maven.org_maven2_/write.lo |
| 20:37 | muhoo | um, huh? |
| 20:37 | Glenjamin | sounds like it's outdated :D |
| 20:38 | tyler | wat is my fault? |
| 20:38 | tyler | muhoo: i saw you pop up in a google search in logs when i was searching for a fix the other day heh |
| 20:39 | tieTYT | nothing, i'm just making excuses |
| 20:39 | tieTYT | speaking of haskell |
| 20:40 | tieTYT | protocols are just haskell class types, right? |
| 20:40 | Raynes | 'just' is a very strong word. |
| 20:40 | tieTYT | what's the difference? |
| 20:40 | Raynes | What you want to ask is "kinda sorta somewhat a little like" |
| 20:41 | amalloy | tieTYT: they're close enough. some things just don't translate well, eg due to lack of static typing |
| 20:41 | tieTYT | ok |
| 20:41 | amalloy | like, you can't define something like mempty as a protocol, because it has no object to do type-dispatch on, and no return-type information |
| 20:42 | tieTYT | to me protocols feel like a convenience. Without them you could use a map with a type as a key and a function as a value, no? |
| 20:42 | Raynes | Well, there are multimethods. |
| 20:42 | tieTYT | are you talking about haskell's mempty? Isn't that a function of Monoid? |
| 20:42 | amalloy | indeed |
| 20:43 | Glenjamin | can you put multi methods into a protocol? |
| 20:43 | tieTYT | amalloy: hmm, trying to think about your sentence. I'm not that familiar with haskell |
| 20:44 | kmicu | @unpl flip |
| 20:44 | tieTYT | Raynes: ah yeah, those to me seem similar to protocols too. Like more convenience |
| 20:45 | tieTYT | i've never learned either. This is like my 3rd day learning clojure |
| 20:45 | tieTYT | amalloy: ok I think I get what you're saying |
| 20:49 | ironm | hello kmicu ;) |
| 20:50 | kmicu | , :hi |
| 20:50 | clojurebot | :hi |
| 20:51 | ironm | @google tutorial |
| 20:55 | tieTYT | amalloy: another diff between protocols and type classes is that protocols can't have an implementation |
| 20:56 | muhoo | tyler: yeah, i'm deeply regretting living in an era of public irc logging :-/ |
| 20:58 | muhoo | TimMc: is there some way i could convince you to publish a maven/clojars jar of handy with the org.timmc.handy.repl namespace in it, and bump the version past 1.2.0? |
| 20:58 | muhoo | there's a lot of stuff in git for handy that is past the 1.2.0 release, which i use all the time, and i'm kind of getting tired of keeping private jars around |
| 21:53 | nightfly | Does ClojureScript host it's own macros yet? |
| 22:05 | bloop | right now I'm dealing with a large nested hashmap tree structure where I'm simulating laziness by making the vals in the hashmaps all wraped by calls to 'delay. I was wondering if there is another more idiomatic way to do this. It's working OK but is a bit ugly. Any suggestions? |
| 22:07 | bloop | (basically there's a huge nested tree of options which are identified by string, and the user is likely to only explore one path of the tree, so I'm optimizing it (because it was a problem) by making it so that calculations don't go deeper than they have to.) |
| 22:44 | anthonyu | how does one clear or reset an (atom ()) back to empty? |
| 22:47 | tieTYT2 | i barely know clojure. I'm trying to figure out how to pass enlive raw html instead of a URL object like this: (html/html-resource (java.net.URL. url)) |
| 22:47 | tieTYT2 | does anyone knwo what method to call? |
| 23:10 | xeqi | anthonyu: (reset! atom-name '()) |
| 23:32 | benkay | hi team. opsbro here. devbro tells me i need to support clojure in production. can i get a ticket to the best practices train? |
| 23:35 | Raynes | That was colorful. |
| 23:36 | Raynes | benkay: What does 'support Clojure in production' mean? You need to make sure your production machines can run Clojure programs and such? |
| 23:40 | benkay | more or less. I have no experience with anything beyond Python web applications and really elementary devops, so I was hoping for some sort of "these are the paradigms for software development and deployment in Clojure". |
| 23:40 | benkay | I suppose working through a Clojure web framework deployment would be a step in the right direction. |
| 23:41 | trptcolin | benkay: you'd probably be interested in http://palletops.com/ |
| 23:42 | talios | I think palletops would be overkill here, depending on how you're deploying your app, its more a question of "do you support java" |
| 23:42 | brehaut | afternoon talios |
| 23:42 | talios | 'lo brehaut |
| 23:43 | talios | brehaut - you may enjoy our latest podcast episode - all on typed clojure |
| 23:43 | benkay | hm. always interested in new ops tools, talios. thanks. |
| 23:43 | brehaut | yeah, ive got it queued up |
| 23:43 | amalloy | benkay: all you really need is to make sure there's an up-to-date jre installed. if he's interested in running a servlet container, you probably have to do some stuff installing jetty or tomcat or one of those things |
| 23:43 | brehaut | if i can stomach an hour of aussie and auckland accents. ouch |
| 23:43 | benkay | thanks amalloy. |
| 23:43 | talios | brehaut - harsh man harsh |
| 23:45 | brehaut | talios: theres a reason i dont do a podcast: i find the NZ and aussie accents super grating ;) |
| 23:45 | Raynes | benkay: Second amalloy. You mostly just need a JRE >= 1.6. Having an up-to-date (2.0.0 or higher) leiningen would also be nice. |
| 23:46 | amalloy | yeah, but devbro can install leiningen anywhere he has write permission to |
| 23:46 | Raynes | Sure, but devbro asked opsbro to set it all up for him. |
| 23:46 | talios | devbro sounds lazy |
| 23:46 | Raynes | So opsbro could go ahead and do that while he is installing the jre, perhaps. |
| 23:46 | talios | lein uberjar should give you all you need to deploy. |
| 23:47 | talios | depending on the "app" |
| 23:47 | Raynes | If we keep using the word 'bro' in this context we're going to end up with a CljCon incident. |
| 23:47 | talios | I hope opsbro or devpro sets this up in demo/staging first tho :) |
| 23:48 | benkay | opsbro lives to make infrastructure get out of devbro's way |
| 23:48 | benkay | it's a good relationship |
| 23:48 | talios | Raynes - the closest "incident" I think we'll get at a conj is a derogitory inference that someones a mathematician - we all know programming isn't math. |
| 23:49 | talios | i like opsbro, he sounds much nicer than the opsmonkey we have |
| 23:49 | benkay | *bow* |
| 23:49 | trptcolin | talios: whoa. whoa. whoa. you are antagonizing the scala fans. |
| 23:49 | trptcolin | ;) |
| 23:50 | ambroseb_ | Any tips for lazily loading sections of Clojure projects? |
| 23:50 | talios | trptcolin - thats ok, this is IRC not twitter ;) |
| 23:50 | trptcolin | hehe |
| 23:50 | brehaut | talios: how can you like static types and functional programming and not want programming to be math |
| 23:50 | talios | ambroseb_ - er, eval? ;p |
| 23:50 | trptcolin | ambroseb_: we do some wacky stuff with REPLy to help startup time out |
| 23:51 | trptcolin | ambroseb_: e.g. https://github.com/trptcolin/reply/blob/master/src/clj/reply/initialization.clj#L80 |
| 23:52 | trptcolin | that file is... not simple :) |
| 23:52 | brehaut | trptcolin: ◎_◎ |
| 23:52 | ambroseb_ | trptcolin: ok this looks about what I expected. |
| 23:53 | talios | brehaut - exactly. I believe it all started with Twitter releasing an open source Bijection library for scala, only nothing they did matched the definition of bijections. |
| 23:53 | brehaut | lols |
| 23:53 | talios | that got certain folk…. annoyed |
| 23:53 | brehaut | talios: by 'certain folk' you mean scala guys eh |
| 23:53 | talios | well, Tony Morris ;p |
| 23:54 | brehaut | lol |
| 23:54 | talios | brehaut - for the lolz: https://github.com/twitter/bijection/issues/41 |
| 23:55 | brehaut | why am i clicking this link :/ |
| 23:55 | talios | for the lolz |
| 23:55 | brehaut | this reminds me of the why jquery deferreds are not Promise/A implementations (but backwards) |
| 23:57 | brehaut | talios: i reconfnise most of these words, but im pretty sure its in a foreign language |
| 23:57 | talios | brehaut: that language would be "math", obviously you're not the programmer I thought you were. Mind you - I don't think I ever leart the terms injective/subjective in school Maths either and I didn't know what they meant |
| 23:58 | brehaut | talios: i am totally pants at math |
| 23:58 | talios | brehaut: my teacher didn't appreciate me giving imaginary answers to questions involving imaginary numbers. |
| 23:59 | brehaut | ha |
| 23:59 | brehaut | talios: its 5pm on friday. this is not time for computers. ttyl |
| 23:59 | talios | seeya |