#clojure logs

2013-03-11

00:36hiredman/win 15
00:41akhudekis there a summary of the changes going from jdbc 0.2.x -> 0.3.0 somehwere?
00:45devntechnomancy: no, but im constantly growing :\
00:45devntechnomancy: 2013-03-11T04:47:00+00:00 heroku[web.1]: Process running mem=685M(133.9%)
00:46technomancydevn: is it ignoring JVM_OPTS?
00:46FrozenlockHrphm... Any records of GoogleBot not playing nice with ring(jetty)?
00:46devnJAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops -javaagent:newrelic/newrelic.jar
00:46devntechnomancy: no JVM_OPTS set
00:46FrozenlockIn the google webmaster tools, if I try 'fetch as google' it just fails miserably :(
00:46technomancydevn: that's weird; how did that happen?
00:47devntechnomancy: i added newrelic according to the instructions on the heroku guide
00:47technomancyJVM_OPTS get set automatically for all new clojure apps
00:48devntechnomancy: yeah, I unset it
00:48devn:X
00:48devntechnomancy: the newrelic article mixes those two: It says JVM_OPTS in one place, and then gives you a command to set JAVA_OTPS
00:48devnOPTS*
00:48creesewhat people using these days for db migrations?
00:49devncreese: people were talking about migratus earlier
00:49technomancycreese: defn =)
00:49technomancyhttps://github.com/technomancy/syme/blob/master/src/syme/db.clj#L50
00:49akhudekcreese: we use flyway
00:50technomancymigratus and ragtime are both decent. I don't like the approaches of lobos and drift.
00:50devnlobos is short for lobotomy
00:51devni keeed, it's fine, but i like migratus more personally
00:51devntechnomancy: im running like this "lein with-profile production ring server"
00:51devntechnomancy: Is there a way to trampoline that? Would that make anything better?
00:52creesecool
00:57devntechnomancy: nevermind, that did it :)
00:57creeseWhat is the status of korma now that CG has moved on? Is it still the preferred alternative to clojure.java.jdbc?
00:58akhudekI have come to appreciate java.jdbc more myself.
00:58akhudekThough the api for 0.3.0 is still a mystery to me.
00:59creeseI'm wondering if anyone has tried an interface like ring?
00:59akhudekI tried to write a simple aggregate in korma and after wrestling with it for 30min yet again, I just gave up and went to jdbc.
00:59akhudektoday
00:59akhudekI think korma was supposed to be a simple interface. :-/
01:07creesemigratus seems pretty good if you don't mind writing raw sql
01:11akhudekflywaydb also uses raw sql, it's pretty easy to use. Don't think migratus was around when I chose flyway.
01:11akhudekin any event, raw sql is quite flexible
01:16technomancycreese: honeysql is an attempt at making a compilation target-ish thing for sql
01:16technomancyI would recommend c.j.jdbc more except for the fact that putting SQL in strings where you don't get syntax highlighting makes it hard to catch certain types of mistakes
01:56holohi
01:59holodid anyone notice that when submiting a form with hiccup, keywords with dots get converted to strings? i'm not sure yet if hiccup is the one doing it though
02:08tomoj$latest com.datomic/datomic-free
02:08lazybot[com.datomic/datomic-free "0.8.3826"] -- https://clojars.org/com.datomic/datomic-free
02:08tomojtyler__: ^
02:08tyler__tomoj: woah cool feature, thnx
02:08tomoj(inc Raynes)
02:08lazybot⇒ 22
02:08tyler__$latest cheshire.core
02:08lazybotNo project by this name exists on clojars.
02:09tyler__derp
02:09tyler__$latest cheshire
02:09lazybot[cheshire "5.0.2"] -- https://clojars.org/cheshire
02:09tyler__:)
02:11holo(inc Raynes)
02:11lazybot⇒ 23
02:12tyler__(-> Raynes inc)
02:12tyler__meh
02:16holodid anyone also noticed that while destructuring maps, keywords with dots are not supported? i get java.lang.ClassFormatError: Illegal field name when trying that
02:17amalloyholo: nothing to do with destructuring, i suspect
02:17amalloy&(let [x.y 1] x.y)
02:17lazybotjava.lang.ClassFormatError: Illegal field name "x.y" in class sandbox50899$eval54439
02:18holoamalloy, yes, in let bindings
02:18holo&(def x.y "foo")
02:18lazybotjava.lang.SecurityException: You tripped the alarm! def is bad!
02:19holohun? def is bad?
02:20holo(def x.y "foo")
02:21n_b,(def x.y "foo") to activate the other bot
02:21clojurebot#<Exception java.lang.Exception: SANBOX DENIED>
02:21n_bAssumed that would happen
03:05clj_idiotAll clojure functions are Runnable. With ".start" on a function, Clojure will create a new thread to execute the function. Is the thread auto destroyed when the function terminates?
03:16alandipertclj_idiot: function invocation doesn't necessarily create a thread
03:16clj_idiot(.start (Thread. my-fun)) does
03:17clj_idiotI should have been clearer with what I meant.
03:17clj_idiotmy fault.
03:32alandipertclj_idiot: yeah i think in that case the thread dies when the function returns
05:10clj_idiotI know that Clojure has STM, Agents, and Atoms. Dumb question: is it possible to implement (non-infinite-looping) Semaphores interms of these 3?
05:57lispy_hey guys, I'm using clojure.string/replace to convert a linux path into a windows path, but its dying on the backslash, is there a tried and tested/recommended way to do this ? currently getting StringIndexOutOfBoundsException String index out of range: 1 when running (replace "/some/path/to/that" #"/" "\\") in repl
05:59vijaykiranlispy_: be lazy and use :http://commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/FilenameUtils.html :)
06:00lispy_thanks for the pointer
06:01Ember-I think that is a bug
06:01Ember-it sure as hell should be able to do that replacement
06:03Anderkentit probably tries to interpret the \\ as a pattern instead of string?
06:03Ember-nope, that same bug occurs with java string
06:03Ember-&(.replaceAll "/some/path/to/that" "/" "\\")
06:03lazybotjava.lang.StringIndexOutOfBoundsException: String index out of range: 1
06:03Ember-and
06:03Ember-&(.replaceAll "/some/path/to/that" "/" "\\\\")
06:03lazybot⇒ "\\some\\path\\to\\that"
06:03Ember-very interesting :)
06:04AnderkentNote that backslashes () and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string. Dollar signs may be treated as references to captured subsequences as described above, and backslashes are used to escape literal characters in the replacement string.
06:04Anderkentbut curiously \\\\ doesnt do the right thing either
06:05Anderkentoh nvm it does
06:05Ember-yes, it does
06:05clgvAnderkent: you can always check with `println`
06:05Anderkenti was just confused by it being prnd instead of printed
06:05Anderkentyeah yeah
06:05Ember-but imho the first version should work
06:05lispy_sorry, confused… does : (.replaceAll "/some/path/to/that" "/" "\\\\") work ?
06:06lispy_is the double char ok in the result ?
06:06Anderkentlispy_: yes
06:06lispy_oh cool
06:06Anderkentdo print
06:06lispy_thanks
06:06Anderkent,(println (.replaceAll "/some/path/to/that" "/" "\\\\")
06:06lispy_oh I see
06:06Anderkentoups
06:06clojurebot#<RuntimeException java.lang.RuntimeException: EOF while reading>
06:06lispy_cool
06:06Ember-&(.replaceAll "/some/path/to/that" "/" "\\\")
06:06lazybotjava.lang.RuntimeException: EOF while reading string
06:06Anderkent:D
06:06Ember-and that comes from clojure.lang.Util.runtimeException (Util.java:219)
06:06clgv,(println (.replaceAll "/some/path/to/that" "/" "\\\\"))
06:06clojurebot\some\path\to\that\n
06:06Anderkentember you had 3 backslashes instead of 4
06:07Ember-yeah I know
06:07Ember-was just trying
06:07Ember-what happens in that case :)
06:07clgvbut why would you do that anyway? java is totally fine with slashes in filenames afaik
06:07Ember-c:\\foo\\bar evaluates to c:\foo\bar
06:08Ember-not pretty but works
06:08Anderkentah, the backslash behaviour is so that you can do
06:09Anderkent,(println (.replaceAll "/a/s/d/f" "/" "\\$1"))
06:09clojurebot$1a$1s$1d$1f\n
06:09Anderkentwhich otherwise tries to grab the 1st match group
06:10efjbossstill, that behaviour is pretty damn terrible
06:12clgvAnderkent: that is not the entire explanation. another reason is the backslash is used for nonprintable characters like "\n" as well
06:13clgvor say "special characters"..
06:18Anderkentclgv: as in "\\n"? that seems to do the intuitive thing (i.e. print out \n literally). "\n" is of course the newline, no surprise there. Only reason you need to double escape the backslash is because the replacement string is not a literal string, but a pattern-like thing (i.e. it can reference groups)
06:18clojurebotIk begrijp
07:51clj_idiotin clojure, can https://github.com/swannodette/delimc be used to simulate lightweight co-routines ?
09:25nonubywhats the easiest way of ([:a 1][:b 2][:c 3]) into a map { :a 1 :b 2 :c 3}
09:25dan_thiffaultlein ?: If I'm reading eval-in-project correctly it spawns a separate process. Short of manually managing I/O (file, open net port, etc) is there way of returning state to the parent process?
09:26clgvnonuby: (into {} '([:a 1][:b 2][:c 3]))
09:26clgv,(into {} '([:a 1][:b 2][:c 3]))
09:26clojurebot{:a 1, :b 2, :c 3}
09:27bloopI'm a little confused about how to get around how symbols are qualified in macros. It seems like too much of a pain. What is the best way to write (defmacro mac [exp] `(let [f (fn [n] (max 1 (- n external)))] ~exp)) where "external" is a captured lexical variable in the context where the macro is called and of course f and n are lexical variables the I want to define in the macro, and f being one that I want access to in the code t
09:30clgvbloop: do not use namecapturing. let the user provide the names in the macrocall
09:31bloopclgv: even for the one that does not escape the macro ("n")?
09:31clgvbloop: can you provide a concrete complete example?
09:32bloopclgv: the one I provided is actually exactly what I'm trying to write with the names changed.
09:32bsteuberbloop: no, for ones that don't escape the macro, use n#
09:32bloopalso, I'm only using this in two places to save some typing for myself. It's not like, an interface.
09:32bsteuberfor those that need to escape in a controlled way, use arguments as clgv said
09:33clgvbloop: I didnt understand the idea of "external" in that code
09:33bsteuberbut if you really want to do ugly stuff
09:33bsteubertry ~'foo
09:33bloopexactly, I want ugly-ass CL-style macros :p
09:33bsteuberthis will generate the exact symbol foo with all the traps you loce from the c preprocessor :)
09:33bsteuberlove
09:33clgvbloop: e.g. (defmacro mac [external, f, exp] `(let [~f (fn [n#] (max 1 (- n# ~external)))] ~exp))
09:35bloophm i think the solution here is to not use a macro
09:35bloopliek in scheme, making it hygienic costs mroe typing than i save by using it
09:35clgvbloop: most of the time the solution is to not use a macro ;)
09:36bsteuberyeah that's usually best - but in case you ever feel the need to do dirty things, use ~'my-captured-symbol
09:36clgvI do not think about creating a macro unless I spotted a pattern that can not be implemented via functions for at least 3 times ;)
09:37xumingmingvDoes the lein plugin `native-deps` works with lein2?
09:38xumingmingvhttps://groups.google.com/forum/#!topic/leiningen/dbQBuXWmpko
09:38clgvxumingmingv: leiningen has a list on the wiki with plugins that were confirmed to work with leiningen 2
09:42clgv xumingmingv: I recall that you do not need a plugin for native deps with lein2 anymore. you can research how overtone does it...
09:43xumingmingvclgv: thanks, I am trying to use this: https://github.com/pkamenarsky/atea
09:43jcromartiestuartsierra: hey, a while back you mentioned keeping global state out of top-level vars?
09:43xumingmingvwhich tells me to run `lein native-deps`
09:43jcromartielike, if I wanted to have a simple in-memory data model
09:44jcromartiestuartsierra: would bindings be a suitable alternative when handing off the refs from a HTTP (compojure) handler?
09:44stuartsierraI prefer passing all state as explicit arguments.
09:44stuartsierraI will be talking about this at Clojure/West.
09:44jcromartiebut where do you get it from in the first place? i.e. where does the long-term state "live"?
09:45jcromartieI will definitely be folling the conf
09:45jcromartiefollowing*
09:45clgvjcromartie: I have it living in a deftype in one of my web applications
09:45jcromartiedeftype? interesting
09:46clgvjcromartie: could be an atom with regular clojure data structures as well
09:46jcromartiewell yeah, a ref/atom/agent/etc.
09:46jcromartiethat's the obvious part
09:46jtoywhat am I doing wrong with this regex? (re-find (re-pattern "\bcar\b" ) "car")
09:46clgvjcromartie: I pass it to the function when creating the routes for the webapp
09:47jtoyversus this: (re-find #"\bcar\b" "car")
09:47stuartsierraclgv, jcromartie: Yes, you can create an "instance" of your web app which closes over its state.
09:47jtoyshouldnt they be the samething?
09:47jcromartie:P
09:48jcromartiestuartsierra: that's what I was thinking… would it be easiest to achieve with bindings?
09:48jcromartieI think I get it
09:48stuartsierraI always recommend not to use bindings unless you really have thread-local semantics.
09:48clgvjtoy: (re-find (re-pattern "\\bcar\\b" ) "car")
09:49jtoyah
09:49jtoythx
09:50jcromartiehm… yeah, I am going to have some concurrency… I'd love to see an example of this
09:51jcromartieclgv: do you have any example code out there?
09:51jcromartieI guess you wouldn't have any top-level routes either
09:51clgvjcromartie: no.
09:52jcromartieso like, (defn make-routes [foo bar] (routes (GET "/whatever" [] (do-stuff-with foo bar))))
09:52clgvjcromartie: yes, I create the routes within a function that is called from my main-function which also starts jetty
09:52jcromartieah ha
09:52jcromartiethat makes lots of sense
09:53jcromartieand do you give yourself a way to access that running context?
09:53clgvmy deftype contains all the context I need
09:53jcromartiewell I mean once you pass it to Jetty, can you access your state via a REPL
09:54jcromartieor your startup routine returns a structure with the Jetty server and the deftype with your state
09:54jcromartie?
09:56clgvI just return the jetty instance but I could at the context data as well. I did not need it though
09:56clgv*add
09:59stuartsierraI usually have a top-level "system" object, def`d at the REPL, that contains anything I might need access to.
10:01ambrosebsstuartsierra: Any chance you could set up github+maven for tools.analyzer.jvm for me?
10:02ambrosebsIt's the last dep for core.typed.
10:02stuartsierraambrosebs: Working right now, but I'll take a look when I have time. Probably after Clojure/West.
10:02ambrosebsCool
10:02stuartsierraAnd I don't have access to GitHub … email clojure-dev for that.
10:02jcromartiestuartsierra: that makes sense
10:02jcromartiethanks for the tips guys
10:03ambrosebsSure, yep emailed on Friday. Cheers
10:04stuartsierraEveryone's really busy getting ready for Clojure/West, so I'm afraid you can't expect much movement before then.
10:05ambrosebsok
10:54tyler__woah in clojure docs it says "Tagged literals are Clojure's implementation of edn tagged elements."
10:54tyler__did edn come before clojure?
10:55hyPiRionno
10:55duck1123edn never had a name at first. It was all just the clojure syntax.
10:56tyler__ah gotcha
10:56tyler__how new is it? i just realized it was a thing last night when i was playing with datomic
10:57duck1123initial commit was 6 months ago
11:20esmohi all, anyone mind explaining this? (clojure.string/replace "BrEaKs?" #"(?i)break" "work") returns "works?" on clj, "BrEaKs?" on cljs
11:20esmobug in clojurescript's regex implementation, or me being dumb?
11:20ljosesmo: clj uses java regex, but cljs uses javascript regex.
11:21esmoi realize that, but i'd expect the results to be the same?
11:21esmothe cljs compiles to something like this: function Pg(){return clojure.sb.replace.c?clojure.sb.replace.c("BrEaKs?",/break/i,"work"):clojure.sb.replace.call(l,"BrEaKs?",/break/i,"work")}
11:23dnolenesmo: happy to take a patch that fixes the issue, I believe the problem is that it happens at the level of the reader.
11:26TimMcWow, I didn't realize CLJS did regex translation.
11:26leku&(- 4419 1037)
11:26lazybot⇒ 3382
11:27esmoyeah, looks a bit hairy, not sure if i want to start poking into it :) i'll just see if i can get it to work somehow first
11:36mrb_bkgood morning #clojure
11:37mrb_bkdnolen: cool details on the hangout! glad you could make it
11:39dnolenmrb_bk: was fun!
11:40mrb_bkdnolen: it's cool to see how much of a back and forth it is right now between mK and core.logic
11:42dnolenmrb_bk: yes! while the implementation details may be different - high level goals are more or less the same.
11:49jcromartiehey
11:50ambrosebsdnolen: I was thinking about the "forgot to wrap in an all block" minikanren issue. Perhaps a little static analysis could help pick up those bugs. I think a goal would very often only be one expression, so it might be useful to warn in other cases.
11:51ambrosebsSome macroexpansions might get in the way though.
11:51dnolenambrosebs: I'm assuming the analysis would need annotations about what functions are actually goals.
11:51ambrosebsProbably.
11:55dnolenambrosebs: sounds interesting! our discussion yesterday did make me curious whether it would be easy or hard to reuse some of the core.typed infrastructure to do miniKanren/core.logic specific analyses
11:55ambrosebsIt seems like core.typed is a good base to build on.
11:56mrb_bkthat would be awesome
11:56ambrosebsI'm looking closer into Mercury.
11:56mrb_bkambrosebs dnolen: the 'threading the failures through the macro' idea is also awesome
11:57dnolenambrosebs: it's pretty interesting. I wish it didn't take a 2.66ghz i7 8 hours to compile to damn thing.
11:57noidiambrosebs, is there a core.typed mailing list / google group?
11:57mrb_bkoh wow, mercury has a JVM backend? wild
11:58ambrosebsnoidi: nope, just the clojure ml for now.
11:59noidiambrosebs, I noticed that the type for clojure.core/seq is too restrictive. It doesn't allow Strings as input (they are not Seqable), although seq supports them.
11:59ambrosebsI've (kinda) fixed that in master.
12:00noidiok, cool! how did you type it?
12:01ambrosebsAdded an "unchecked-ancestors" field for Classes, and added (Seqable Character) as an ancestor for CharSequence and String :/
12:01ambrosebsA hack I've been procrastinating on for about a year
12:01ambrosebsFeels dirty.
12:01noidiyes, it does :)
12:02noidi,(instance? clojure.lang.Seqable "foo")
12:02clojurebotfalse
12:02ambrosebsYep it sucks.
12:03ambrosebsSeqable doesn't really mean too much in Clojure JVM. There's about 5 corner cases.
12:04TimMccemerick: Hey, did you decide to do something different with that timing-resistant string comparison in friend?
12:04cemerickTimMc: Refresh my memory :-)
12:05technomancyoh, is friend getting the codahale treatment? =)
12:05noidihttps://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L480
12:05noidithere are all sorts of special cases in seqFrom, which IMHO seq's type should reflect
12:06noidiit'll be an ugly union type, but that's what seq's expecting :)
12:06TimMccemerick: When Micha?el Stone did the walkthrough of friend at the Clojure meetup, he pointed out some code that was doing string comparison with data-independent timing. I can't find it now, so I'm wondering if you outsourced it.
12:06cemerickTimMc: oh, that; he was talking about ring in that case, not friend
12:06technomancyTimMc: related to http://codahale.com/a-lesson-in-timing-attacks/ ?
12:07TimMccemerick: Ah! Right.
12:07cemerickTimMc: https://github.com/mmcgrana/ring/blob/master/ring-core/src/ring/middleware/session/cookie.clj#L80
12:07TimMctechnomancy: Yeah, I am happen to be in the market for a string comparator like that.
12:07ambrosebsnoidi: yes, you're right.
12:07ambrosebsnoidi: but it still sucks :)
12:08cemerickTimMc: just make sure you don't use a fn that can return (reduced) ;-P
12:08TimMcI was thinking of just loop/recur over the strings and checking the XOR at the end, but maybe comparing hashes would be better.
12:09TimMcI guess there's not much I can do to avoid leaking string length.
12:09technomancycan't you pad/truncate the unknown string to match the one submitted?
12:09cemerickTimMc: pad
12:10TimMcAs long as the time to pad doesn't reveal too much. :-P
12:14yediis there a service similar to pastebin that deletes the contents of the paste after a period of time?
12:14TimMcyedi: Yeah, use Refheap and set a lazybot timer to tell Raynes to delete the paste. :-P
12:15noidiyedi, pastebin.com has an expiration setting :P
12:16yedioh derp
12:16TimMcnDuff will still yell at you, though
12:16technomancyhttp://paste.debian.net has an expiration setting and won't get nDuff yelling at you for ads
12:32tyler__do i have to worry about clojurewest selling out? i still haven't bought a ticket
12:32TimMcHmm, how do I make RET behave like C-j with paredit? It worked fine in my Emacs 23...
12:38ystaelTimMc: (add-hook 'clojure-mode-hook '(lambda () (local-set-key (kbd "RET") 'newline-and-indent)))
12:39TimMcystael: Oh man, that is much better! Thank you.
12:39chronnoTimMc,ystael: I have it bound to 'paredit-newline
12:40chronnochronno: seems to be a little different. From the docs:
12:40TimMcYeah, that's what I ended up using.
12:40chronnoInsert a newline and indent it.
12:40chronnoThis is like `newline-and-indent', but it not only indents the line
12:40chronno that the point is on but also the S-expression following the point,
12:40chronno if there is one.
12:40rasmustoI'm a paredit newbie (using paredit.vim) what's C-j do?
12:40ystaelchronno: I actually specifically don't want that because occasionally I prefer indents different from what Emacs wants to do.
12:40TimMcrasmusto: *Basically* newline.
12:41TimMcparedit switched how it handled RET vs. C-j in version 20.
12:41chronnoystael: oh, makes sense. I just use emacs indentation blindly :-)
12:41rasmustoTimMc: does it handle indenting differently or something?
12:42ystaelchronno: It would probably make more sense for me to fix Emacs's indenter so I can do the same, but, y'know, tuits.
12:42chronnoystael: he
12:42hiredmanTimMc: paredit did, or clojure-mode did?
12:42piranhaalandipert: hm, are you online already? :)
12:44hiredmanhttps://github.com/technomancy/clojure-mode/commit/c2077d48858a507d03cab4416038bd95b70e1464
12:44TimMchiredman: http://mumble.net/~campbell/emacs/paredit.release
12:44TimMcSearch for "exchanges".
12:44piranhaalandipert: just thought you might be interested what I did in the end with 'list of records': https://github.com/piranha/pairword/blob/master/src/pairwords/templates.cljs#L24 (here el is parent element and data is a cell)
12:45zackzackzackIs there a way to configure leiningen to run each file within test with it's own jvm?
12:46hiredmanzackzackzack: https://github.com/joegallo/lein-test-bang-bang but it needs updating to lein2
12:47technomancyshould be an easy fix
12:47zackzackzackYeah, it's not a super complicated project from the looks of it.
12:48zackzackzackWhat's the process for upgrading from lein1?
12:48technomancyzackzackzack: just shift over the refers that have moved. bultitude instead of leiningen.util.ns; leiningen.core.eval instead of leiningen.compile
12:49zackzackzackThanks I'll see what I can do
13:01mmitchellanyone know if there is a convenient way to close the nREPL error buffer in emacs and have emacs go back to the main buffer?
13:04mmitchellThe old swank error buffers would go away by pressing 0, I guess I'd like that back :)
13:04technomancymmitchell: maybe q?
13:05mmitchelltechnomancy: ahh nope, that'd be perfect though
13:05technomancyhm; at one point that worked
13:06mmitchelloh hmm, "nrepl-popup-buffer-quit-function" might do the trick
13:16`fogusdnolen: Any recommendations for good information on finite domains?
13:17dnolen`fogus: Mozart/OZ tutorial http://doc.rz.ifi.lmu.de/programming/mozart/print/tutorial/FiniteDomainProgramming.pdf
13:20dnolen`fogus: or Bratko 4th edition Prolog for AI
13:25`fogusdnolen: So is it safe to assume that fd is an official core.logic feature? Now and in the future?
13:26`fogusdnolen: Thanks for the refs BTW.
13:27dnolen`fogus: the functionality yes. Probably can't make any promises beyond that - we might get polymorphic constraints.
13:28`fogusdnolen: What about the API? If it grows then that's cool, but will what's there stay stable?
13:29`fogusdnolen: Do you know if earlier Bratko edition has DF?
13:29bhenryhow would i decode/encode html form params in an old clojure app? my whitespace is suddenly going to the database as plus signs and i don't know what changed in the app.
13:29dnolen`fogus: well if constraints become polymorphic I'll probably keep around the fd/foo for backwards compat.
13:30dnolen`fogus: I'm assuming it does since it's covered in 3rd ed, and 4th expands on the CLP stuff.
13:42`fogusdnolen: Thank you sir
13:49jamieisilly question: if a method destructures it's params like this (http://pastebin.com/2bA64Ycc), how can I pass in a hash of the params I want?
13:52ambrosebsjamiei: (apply make-conn (mapcat identity {...})) would probably work.
13:52ambrosebsI think people have made functions to handle this, not sure where they live.
13:54jamieiambrosebs: That's great, thank-you. I also thought there might be an existing method for this.
13:54ambrosebsnp
13:54zackzackzacktechnomancy: https://github.com/joegallo/lein-test-bang-bang/pull/1
13:55`fogusjamiei: I've used variants of https://gist.github.com/fogus/5136209
13:56technomancyzackzackzack: nice
13:56technomancyzackzackzack: you shouldn't include changing the group-id as part of the pull request though
13:56rasmustoI never know when to use [& {:keys [arg]}] or [{:keys [arg]}] when I'm only passing in keyworded stuff, any good arguments for either method?
13:56technomancyzackzackzack: also: mapcat instead of map+flatten
13:56zackzackzackI'll fix that right quite
13:59rasmustoah, I guess partial application of kwargs would be a good argument for the former
14:01zackzackzacktechnomancy: Thanks! Hope this actually does what I hope it will.
14:02jamiei`fogus: interesting
14:10TimMcLooks like ring's secure-compare will break when given two 0-length strings.
14:44jcromartieis there really any reason not to use a ref when it doesn't need to coordinate with anything else?
14:44jcromartieI know I could use an atom right
14:44RaynesAtoms are cooler.
14:45jcromartiehah
14:45jcromartiebut really
14:45jcromartieif my state doesn't need to coordinate with anything right now
14:45jcromartieit might as well be an atom right?
14:45jcromartiebut if it *might* need to coordinate with something
14:47jcromartieRaynes: are you being serious?
14:47Raynesjcromartie: Not at all. I don't know the answer since I'm not nearly as thoughtful as you and have never cared one way or the other.
14:47jcromartiehah
14:48jcromartiemaybe I should stop caring
14:48jcromartieit would save the channel a lot of overhead
14:49pjstadigjcromartie: less overhead. atoms use compare and swap, but refs use locks
14:55pjstadigjcromartie: https://gist.github.com/pjstadig/5136670
14:55pjstadig[standard microbenchmark disclaimer and such]
14:55jcromartiethanks, that's enlightening
14:56tomojtook me such a long time to notice :{min,max}-history
14:56tomojI never use refs :/
15:01jcromartietomoj: atoms do it for you huh?
15:01jcromartieI see the need for refs when you need to synchronize two separate references
15:09matthavenerseems to me that no refs indicates a really nice separation between parts in a design
15:09matthavenerso orthogonal there's nothing to synchronize between them
15:13jcromartieyes
15:18jcromartiewhy is compojure middleware flattening my JSON objects!?
15:19weavejesterjcromartie: Probably because you're returning a raw map rather than wrapping the JSON in a response.
15:19jcromartieweavejester: I should clarify, it's on the way in
15:19jcromartiejson params
15:19jcromartieer, a JSON POST body
15:20weavejesterjcromartie: What middleware are you using to parse it?
15:20weavejesterCompojure itself doesn't touch the parameters.
15:20jcromartieno, it's the handler/api that does it
15:22weavejesterjcromartie: Possibly wrap-nested-params is doing it then
15:22jcromartieyeah
15:22weavejesterjcromartie: But you don't need to use handler/api. Just apply the middleware you want manually.
15:22jcromartiebut it would be nice to figure out how to accept both :|
15:23jcromartiebut this whole API should be JSON anyway
15:23weavejesterjcromartie: You wanted nested parameters (e.g. foo[bar]=baz) and JSON?
15:23jcromartieI don't see why both shouldn't be able to play together
15:23weavejesterYou could also put your JSON middleware on the inside
15:23jcromartieno, since the request body stream is already read
15:23jcromartieby wrap-params
15:24weavejesterjcromartie: In which case, you have a bad content-type
15:24jtoycan someone recommend me a page to read about that discribes how to resolve issues created from macros that call macros, specifically I get an error: java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to java.lang.String
15:24weavejesterjcromartie: wrap-params will only read the request if the content-type header is set to: application/x-www-form-urlencoded
15:24jcromartiehm
15:24jcromartieI see
15:25weavejesterjcromartie: For a lot of applications, like curl, that tends to be the default content type unless you specify otherwise.
15:31gfredericksjtoy: could you share some code?
15:31gfredericksjtoy: macros don't normally "call" other macros; they emit code that contains macro calls
15:33bloopI'm using compojure for exlipse and trying to access the filesystem with clojure.java.io. I've set :resource-path "resources/" in project.clj and yet (io/resource "") returns the url for the "test" folder in the project rather than the "resources" folder. What gives?
15:36jcromartiehuzzah
15:38weavejesterbloop: The test folder is on the classpath as well. I'm surprised (io/resource "") returned anything, since that isn't really a resource.
15:41alandipertpiranha: very cool
15:41piranhaalandipert: it should track already created elements, of course, but that's a bit harder :))
15:45bloopweavejester: I'm still confused. I've got it now so that it can find files in test (is this desired just because it's in the classpath? I mean, it can't access files in src...) and also in /resources/, but the URL for files in /resources will say /bin/ instead...
15:46weavejesterbloop: A resource, as Java understands it, is any file on the classpath.
15:47weavejesterbloop: If you're running using Leiningen, that will include the files in all the jars, the resources directory, the test directory, and the source directory.
15:47jcromartiethis is feeling weird
15:47weavejesterProbably some system directories as well
15:48jcromartieI want to parse JSON or else fail with a message
15:48Raynestechnomancy: http://felixge.de/2013/03/11/the-pull-request-hack.html Someone discovered your project management style.
15:48jcromartieso I'm returning a vector of [succeess json-or-message]
15:48bloopweavejester: hm. ok. thanks
15:50gfredericksjcromartie: exceptions aren't appropriate?
15:51jcromartiegfredericks: that's the tricky part
15:52Cinesino89hello
15:52Cinesino89ciao
15:52weavejesterI'd have thought the JSON parser would except if it fails
15:52weavejesterHello
15:52jcromartieit does
15:52jcromartieI want to pass the JSON result to a handler
15:52jcromartiebut I don't want to mask any exceptions that happen in the handler
15:52weavejesterWhy would you need to mask exceptions
15:52jcromartiehold on
15:52weavejester?
15:52jcromartiehold on
15:52weavejesterI mean, they'd just bubble up.
15:53Cinesino89sorry guys
15:53Cinesino89mirc but do not discharge more files?
15:53jcromartiehere https://gist.github.com/jcromartie/8e68edf100684ddcadfd
15:54jcromartiethis borrows from the other wrap-json-params
15:54jcromartiebut uses clojure.data.json, and it provides a useful HTTP failure mode
15:55RaynesPeople who don't use cheshire are merely kidding themselves.
15:55RaynesCheshire is the One Right and True way.
15:56weavejesterHum, I don't like the way of catching the exception...
15:56weavejesterIt would be better to catch as part of the middleware
15:57weavejesterI don't understand why you catch it, then return a value, then use an if statement to test for success
15:57weavejesterYou're basically doing the same thing twice.
15:58weavejesterjcromartie: If the catch statement was in wrap-json-params instead, you'd have an easier time.
16:00trptcolinpretty sweet recruiter line: "[…] join an all-star Clojure team as they work solve the big-data problem."
16:01trptcolini'll work solve the hell out of the big-data problem
16:01bloopRaynes: what do you like about cheshire?
16:05bloopRaynes: I guess i could just read the github page :p.
16:05jcromartiethe big data problem is hard
16:07gfredericksso lein says that the :dev :provided :user and :base profiles are activated for each task. But presumably not for the build tasks like uberjar?
16:09gfredericksI'm trying to figure out the normalest way to have stuff on the classpath for dev that doesn't get deployed
16:11jcromartiehow about this for JSON parsing middleware https://gist.github.com/jcromartie/8e68edf100684ddcadfd
16:13jonasendnolen: ping
16:19technomancyRaynes: I stole it from Evan Phoenix (rubinius)
16:20jcromartieare any of the getprismatic.com guys here?
16:29technomancygfredericks: that's right; default profiles are explicitly stripped out by jar/uberjar
16:29gfredericksdefault profiles? like all 4 of them?
16:29gfredericksjust trying to make sure I know exactly what's going on
16:30technomancyyeah
16:31gfredericksWhat is :base intended to be used for?
16:32technomancygfredericks: stuff like putting :dev-resources on the classpath
16:32technomancybasically :dev but for stuff that ships with lein itself rather than being read out of project.clj
16:33gfredericksoh okay so it's defined in leiningen
16:33technomancyaye
16:33solussdcould someone tell me what is going on here? : https://www.refheap.com/paste/54065bed3548d9c12c463ff1c
16:33gfrederickssolussd: the whole outer form is compiled at ance
16:33gfredericksonce*
16:33gfredericksbefore line 11 is run
16:34technomancyclojurebot: what is the gilardi scenario?
16:34clojurebotThe Gilardi Scenario is where you can't compile a form because the form contains definitions needed to compile itself: http://technomancy.us/143
16:34technomancysolussd: ^
16:34gfredericksclojurebot: who is technomancy?
16:34clojurebottechnomancy is to blame for all failures
16:34solussdgfredericks: neat. that's the distillation of a problem i'm having in a macro... glad i'm not going crazy. thanks
16:35technomancyclojurebot: I'll take obscure compiler gotchas for 200, Alex.
16:35clojurebotthe scala compiler | is | <reply> see: http://harrah.github.com/browse/samples/compiler/scala/tools/nsc/typechecker/ConstantFolder.scala.html#65760
16:35gfrederickstechnomancy: so long story short, the :dev profile is appropriate for local dev classpath stuff
16:35technomancygfredericks: yeah, for stuff that you want everyone hacking on the project to have access to
16:50tgoossensI have some questions about clojure.org (the website). Who should I contact?
16:50brehauttgoossens: tried the mailing list?
16:50tgoossensmaybe not such a bad idea
16:50technomancyI think puredanger helps with it
16:52jweiss"Warning: protocol #'katello.rest/CRUD is overwriting function delete" not very helpful when it doesn't tell me which namespace this is happening in.
16:52jweissany way to find out?
16:52gfrederickskatello.rest is not the appropriate namespace?
16:52jweissgfredericks: i have (:refer-clojure :exclude (get read delete)) in that ns
16:53technomancyjweiss: did you add it recently?
16:53jweisstechnomancy: no, this is a fresh repl
16:53technomancyoh, ok
16:53gfredericks,clojure.core/delete
16:53clojurebot#<CompilerException java.lang.RuntimeException: No such var: clojure.core/delete, compiling:(NO_SOURCE_PATH:0:0)>
16:53jweissoh i see now
16:54jweisssilly me, i left a function in there called delete.
16:54jweissi assumed it was clojure.core that had the conflict
17:07bendlasalandipert: I'm playing with javelin and encountering some behavior where I'm not sure if it's bugs or I'm doing it wrong. Do you have a few minutes to look at it?
17:08alandipertbendlas: sure
17:10bendlascool, so I have this (defn fetch [path] ...), which returns a cell that will be reset with the content of path, as soon as xhr is finished
17:11bendlasfirst of all, it'd be great to be able to leave a cell uninitialized, until it's first reset!
17:11bendlassince I couldn't find that possibility, I tried (cell (init-dom (fetch "/path")))
17:12bendlashere init-dom is passed the cell itself
17:13bendlasnext try: (let [res (fetch "/path")] (cell (when res (init-dom res)))), here the when is ignored and init-dom is called with a nil
17:13bendlasalandipert: my question is, how should it behave in those cases and can I help to make it happen?
17:14alandipertbendlas: what kind of data does fetch return?
17:15bendlasfetch returns a cell, which will be reset to a string
17:16bendlasbut everything I described, happens in the first update, when it is updated from uninitialized to nil
17:17alandipertbendlas: the javelin-y way would be to have a named (cell "") that is reset! by the fetch fn
17:18alandipertbendlas: and on which formulas dealing in strings are built
17:19bendlasalandipert: ok, that answers the firsst question. What about (cell (when outer-cell (do-something outer-cell)))
17:20bendlasin my test case, the when is ignored, such that do-something is called, even when the current value of outer-cell is nil
17:20bendlasthat's not supposed to happen, right?
17:21alandipertbendlas: right, that could be a bug. would you mind pasting code somewhere?
17:23bendlasalandipert: sure, hold on a second
17:26bendlasalandipert: here is an excerpt from my actual code https://gist.github.com/bendlas/5137917
17:27myeIs there a clojureScript implementation of the 1.5 edn namespace or what is the equivalent?
17:28myeeg. if I send something with #inst or #uuid can cljs read it?
17:29technomancywait people actually use #uuid?
17:29bendlasmye: clojure.edn is a very recent addition, it hasn't been mirrored to cljs
17:30bendlasbut since cljs doesn't do read-eval, you should be able to safely use clojure.core/read
17:32alandipertbendlas: is the idea that when you call load-cache, you want overlay to automatically run?
17:33bendlasmye: sorry, its called cljs.reader/read in clojurescript
17:34bendlasalandipert: the idea is, that load-cached fetches its content only once
17:35bendlasthe cell is mainly used to handly asynchronicity
17:36bendlasalandipert: so the cell is used more like a promise in this case
17:37bendlas(which is also the reason I'd like to have a zero-arity for cell)
17:38bendlasmye: in case you missed it, due to your re-login: it's cljs.reader/{read,read-string} in clojurescript
17:39alandipertbendlas: i have to go, but i'll take another look at this later
17:40bendlasalandipert: OK, thanks! Take care!
17:54yedii'm getting a 404 error when i post to cart/purchase: https://gist.github.com/yedi/5138157
17:55yedican someone help me out with this? "making purchases' doesn't even get printed, so it doesn't seem it's even reaching (purchase)
17:56abpyedi: don't use vectors like that in the routes? only for binding parameters later on
17:57yediwhat would be a better way? (i assumed this was the only way to define routes)
18:01myebendlas, thanks! I'm trying to check if cljs support the tagged literals as well, eg. *data-readers* but emacs is misbehaving again :/
18:01myebtw, any emacs+clojurescript users here with tips/code how to manage two repls and selectively send clojure(script) to them?
18:01abpyedi: you have route like (GET "/" .. that's right
18:02iartarisimye: https://github.com/brentonashworth/one/wiki/Emacs
18:03myeiartarisi: I should've mentioned I'm trying to reuse nrepl.el for cljs with piggieback, got a bit of trouble still with setting the correct repl-buffer names
18:04iartarisioh, no idea then
18:04myeI had a manual solution like the "one" before but reusing nrepl makes sense
18:05yediabp: oh... thanks! i'll see if that helps me
18:07iartarisiCan someone have a look at this newb cljs code I'm writing? I feel like I'm doing something very bad with functions that all take the same 5 params. But I'd like to move the functions to a different file than the constants eventually. Should I use records or something else? https://github.com/mapleoin/goboard.js/blob/master/src/cljs/goboard.cljs
18:09dnoleniartarisi: for something like go which doesn't have demanding drawing you can probably go pretty high-level - use maps.
18:09dnoleninstead of 5 params
18:10yediabp: no luck unfortunately, i changed it to this: https://gist.github.com/yedi/5138157
18:12yediughhhhhhh
18:12yediwas missing a trailing slash
18:13yedithis is bullshit, i quit programming
18:13iartarisidnolen: I was asking about records after looking at http://clojure.org/data_structures#Data%20Structures-StructMaps . Do you think my use-case is not in the "Most uses ..." case?
18:15dnoleniartarisi: maps usually suffice, you can switch to records if you need the perf.
18:15iartarisidnolen: ok, thanks!
18:24yedii printed out a map and it looked like this: {:stripe-token tok_1RWsvwDFHog7kF, :state AL, :town , :zip-code , :saddy-line2 , :saddy-line1 , :last-name , :first-name }
18:25yedihow is that a valid map?
18:25amalloyyedi: don't use the print family of functions to inspect datastructures
18:25yedioh
18:25yediwhat's the conventional methodology
18:26amalloypr would have shown you that the values are nil
18:27gfredericks,(println {:foo nil, :bar nil})
18:27clojurebot{:foo nil, :bar nil}\n
18:28yediamalloy: pr?
18:28gfredericksyedi: pr is a function
18:28gfredericksas are prn pr-str and prn-str
18:28yedioh i see
18:28gfredericksall of them having the property he's referring to
18:28amalloyoh, maybe not nil, just the empty string. i forgot println shows nil as nil
18:29gfredericks,(println {:foo "", :bar " "})
18:29clojurebot{:foo , :bar }\n
18:29yediah, that's what was happening
18:30yedithanks for letting me know about prn
18:30devnroute generation done backwards with core.logic?
18:47yediis there a builtin fn for getting a subset of a map (based on it's keys)
18:48yedion the keys you give the fn*
18:48yedifound it, select-keys
18:51ivanshould the select-keys implementation be using transients?
18:52gfrederickscertainly could
18:52gfredericksI don't know what the eagerness threshold is
19:10ravsterhey all
19:28yedidoes anyone know who @abengoa (github) is, and if he frequents #clojure?
19:28RaynesNever heard of him.
19:28RaynesAnd I've heard of everyone.
19:33yediRaynes: good point... maybe i shouldn't trust clj-stripe
19:33technomancyyeah, I don't use software where the author doesn't hang out on IRC
19:33yedixD
19:33RaynesIt's probably better.
19:34RaynesLess time spent on IRC means more time spent at work which is probably why he wrote this which means he probably needs it at work and if he is getting paid to maintain it you've basically run out of reasons to not use it.
19:37zakwilsonYeah, I don't use software where the author always hangs out on IRC.
19:40sshackIs anyone here using lobos?
19:41sshackI'm getting a IllegalArgumentException with it and I'm wondering if it's a clojure 1.5 incompatibility, or what.
19:41clj_idiotso I have this really stupid idea, where in my gui system, I want evey gui element to be a _light weight thread_ rather than a state machine (i.e. think Rob Pike's NewSqueak system taken to the extreme). Is there anyway to get light weight threads in Clojure?
19:43arohner_yedi: FWIW, we wrote our own stripe wrappers
19:43arohner_it's trivial to do
19:44sshackahh. Found the problem getRoot disappeared from clojure 1.3
19:45yediarohner_: i'm still learning clojure, so what may seem trivial to every other person isn't to me =/
19:59Raynesselect * from testtb where x = now()::date;
19:59RaynesOh, turns out this isn't my psql window.
20:06zakwilson(0 rows)
20:07tyler__lawl
20:08Rayneszakwilson: 1 row, bro. Get shit right at least.
20:09technomancyRaynes: yeah but now() changed between when you typed it and when zakwilson received it
20:09abpRaynes: Still not your psql window. :P
20:09Raynestechnomancy: Yeah, but it's still today so it still matches that one row.
20:10abpCursing aided debugging would make sql kick datomic into garbage instantly. :)
20:10technomancyRaynes: not in UTC
20:10technomancy=P
20:11pjstadigthe hazard of using emacs for everything is after a while all the buffers look the same
20:15abp(map #(first (find-parents [] %)) (seq abblog))
20:15abpmhm sure..
20:17zakwilsonlib-noir docs mention the public folder, but do not mention that it is hardcoded to be a folder named "public" in the app's working directory.
20:21Rayneszakwilson: If it shouldn't be hardcoded please do open an issue.
20:32zakwilsonRaynes: I'm not sure it's unreasonable for it to be hardcoded, but the docs should probably say something about it.
20:49ravsterI'm getting --> :body #<HttpInput org.eclipse.jetty.server.HttpInput@14d139ee> <-- as part of my request in ring. How do I expand that?
20:52ravsterI'm sending information through a POST request
20:53brehautravster: its an java inputstream from memory; how you process that depends what it contains
20:54ravsterI have the route wrapped in a wrap-json-body
20:54brehautravster: have you sent the correct content type header on the request?
20:55brehautravster: https://github.com/ring-clojure/ring-json/blob/master/src/ring/middleware/json.clj#L5-L7
20:56ravsterbrehaut: oh, i didn't. :D thanks.
20:56brehautravster: no problem
21:16chessguytrying to get the clojure koans working, per http://clojurekoans.com/, but when i 'lein koan run', i get an error like this: ava.io.FileNotFoundException: Could not locate leiningen/core/main__init.class or leiningen/core/main.clj on classpath: (koan.clj:1)
21:17chessguyi can't even find a 'koan.clj' file in the project
21:18amalloydid you upgrade to lein 2, as the page you linked asks?
21:21chessguyoh, huh. i just installed lein the other day, so i assumed it was the latest
21:21chessguybut you're right, it's not
22:25clj_idiotin Java, is there a function to force a JFrame to full screen?
22:26clj_idiotokay, so I see setSize and setLocation
22:27clj_idiothowver, how do I get the max size of the screen?
22:32Raynesclj_idiot: Are you using seesaw?
22:32clj_idiotno
22:32clj_idiotI'm using raw Java APIs
22:32RaynesWhy so masochistic?
22:32clj_idiotit has a code hot reloading module I wrote a year ago
22:32clj_idiotmatches my mental work flow better
22:33RaynesAnyways, seesaw has a toggle-full-screen! function.
22:33RaynesYou can look at how he does that.
22:33RaynesSeesaw works with raw swing objects, so you should be able to mostly just copy the relevant pieces of code.
22:52JulioBarrosI need to use a clojure library that I updated but did not write. Is there a way to use my version from github until my pull request is accepted or the original is updated?
22:53jeremyheilerJulioBarros, You can release it under org.clojars.yourusername/clj-project
22:55jeremyheilerBasically you're just changing the group id.
22:56JulioBarrosjeremyheiler: Ok. Thanks.
22:56jeremyheilerAnd clojars kindly sets up the group org.clojars.yourusername for you
23:21nonubyis there a shortcut to (first (filter pred col))
23:22nonubyi guess 'some' fits the bill thinking about it, weird name though
23:33technomancynonuby: it is weird. filter first is fine though
23:33ohpauleezambrosebs: ping?
23:33ambrosebsohpauleez: hey
23:34ohpauleezhey man, Does AnyFunction do what I think it does
23:34ohpauleezsome combination/intersection of Function and IFn?
23:35ohpauleezI just switched to core.typed 0.1.7 and want to type the return as a Function (in this case, an anonymous function)
23:35ambrosebsis AnyFunction in 0.1.7?
23:35ohpauleezI don't think so
23:36ambrosebsBut there is some weirdness and crustiness here from Typed Racket.
23:36ohpauleezahhh
23:36ambrosebsBasically I don't even use IFn or any clojure.lang.Fn/Function/AFn
23:36ohpauleezYou just use Any
23:36ohpauleez(thats what I'm using now)
23:36ambrosebsI have a special type that internally is called FnIntersection
23:37ambrosebseg. [Any -> Any], (Fn [Any -> Any]) are FnIntersections
23:37ambrosebsWhat should really happen is (IFn (Fn [Any -> Any])
23:37ambrosebs)
23:38ambrosebsI can't decide what the default should be.
23:38ohpauleezahh, gotcha cool. You can ignore my tweet then
23:38ohpauleez:)
23:38ambrosebsShould [Any -> Any] be an IFn, Function, AFn?
23:38ambrosebsNot sure.
23:39ohpauleezWell I have a decorator (takes a function, returns a function), but I know nothing about the fn's args
23:39ohpauleezso right now I'm just saying Any -> Any
23:39ambrosebsAh, probably should be (All [a b ...] [b ... b -> a])
23:40ambrosebsThat doesn't lose any information on the function you're wrapping.
23:40ohpauleezahhhh
23:40ohpauleezthank you
23:40ohpauleezthat's what I'm looking for
23:40ohpauleezIt definitely explodes the typing rabbit hole
23:40ohpauleez"Ok, now I need to type this… whooops, ok now I need to type this..."
23:41ambrosebsYep, usually does :/
23:41ohpauleezis there a file in core.typed.typed with all the types in it?
23:41ambrosebsYou might want to work off the master branch, there's some improvements to dotted functions there.
23:41ohpauleezcool
23:41ambrosebsclojure/core/typed/ann.clj
23:42ambrosebs(I'll just change the version to be a snapshot)
23:42ohpauleezthanks a ton ambrosebs. I definitely appreciate all of this
23:42ambrosebssweet, np
23:42ohpauleezIt's been a part of my core.specs // sterling project since the short talk we had at Conj
23:43ohpauleezso it'll be all over my ClojureWest talk
23:43ohpauleezhaha
23:44ambrosebsoh great!
23:51brehautohpauleez: i hit that typing rabbit hole too. finding reasonable boundaries for typed and untyped code looks like its going to be somthing that takes some practise
23:51ohpauleezbrehaut: Are you going to ClojureWest
23:52brehautohpauleez: only if i win the lottery
23:52ohpauleez:(
23:52brehautohpauleez: wrong end of the earth
23:52ohpauleezWell, hopefully my talk will help out that rabbit hole a little bit
23:52brehautohpauleez: that'd be great
23:52brehauthopefully we'll see video and slides sooner rather than later
23:54bbloomohpauleez: looking forward to your talk. we need more things in the gradual typing category :-)
23:55bbloomohpauleez: sometimes, i wish i could specify my asserts in first-order logic w/ set theory :-P
23:56ohpauleezbbloom: Your wish should be granted…. sort of
23:56brehautohpauleez: the summary of your talk is exactly the stuff im interested in atm
23:56brehautohpauleez: tying together contracts, typed and generative testing seems super powerful
23:56ohpauleezbrehaut: I think a lot of people are. I see it as a natural progression for a lot of people building serious systems in Clojure
23:56technomancydon't forget inference =)
23:57ambrosebstechnomancy: would you be happy if you only had to annotate vars?
23:57brehauttechnomancy: ive already forgotten. what ?
23:57brehautambrosebs: did you get my lazybot mail?
23:57technomancyambrosebs: it would help, but it would still be a hard sell
23:58technomancyI found with mirah, having inference on locals only meant it discouraged breaking up functions when they got too big
23:58bbloomtechnomancy: hmm interesting point