0:00 phil: dnolen: yea i might try to do it when i get bitten by perf problems in vecs and maps :)
0:00 TimMc: alex_baranosky: WORKS_FOR_ME
0:00 * alex_baranosky is trying again
0:00 TimMc: (:private (meta (var foo))) was my test
0:01 alex_baranosky: I'm getting an exception that the var wasn't private
0:01 let me check the repl
0:01 technomancy_: llasram: definitely give me a heads-up if you have issues with the .deb
0:01 I haven't heard of any trouble with ant
0:03 alex_baranosky: TiMc: wth, (:private (meta #'as-validation-error)) => nil
0:03 however:
0:03 TimMc, however: (:tag (meta #'as-validation-error)) => :private
0:04 what version are you using TimMc
0:05 TimMc: pretty weird, there. 1.3.0
0:05 alex_baranosky: do you know what :tag is?
0:05 TimMc: Yeah, it's a return type hint.
0:06 If you do ^Integer instead of :private, it should give you a :tag Integer
0:06 alex_baranosky: ahhhh... my repl is in 1.2.0
0:06 TimMc: s/:private/^:private/
0:06 alex_baranosky: how do I get lein repl to run 1.3.0?
0:07 TimMc: Oh, does ^:keyword not work there? :-/
0:07 alex_baranosky: Create a tmp project.
0:07 alex_baranosky: I think it used to be #^:private
0:07 TimMc: Ouch. Have to use the old syntax for compatibility, I guess.
0:07 alex_baranosky: hmm wonder if this will mess up backwards compatibility for midje?
0:08 we recently discovered a bug when using Midje with 1.2.0 I wonder if this is the source of it
0:08 phil: is there a way to change some element in a deeply nested (immutable) data structure without having to have a reference to the root?
0:09 alex_baranosky: as I somewhat recently started using the ^:private form
0:09 phil: for example if every element stored its parent?
0:09 then went up the parent chain, assocd-in
0:09 ?
0:10 TimMc: If I read you right... no.
0:10 phil: but then when an element changes all children have to update their parent references :/
0:11 i guess thats the problem
0:11 hm... cant this be done with zippers?
0:11 Raynes: Sigh. My biggest problem in live is choosing color schemes for my editor.
0:12 life*
0:12 alex_baranosky: Raynes, you're doing ok then -- I make up much bigger problems for myself
0:12 Raynes: alex_baranosky: Like whether or not to use defn-?
0:12 phil: :D
0:13 is defn- or defn ^:private better now?
0:13 TimMc: alex_baranosky: Eh, it's just one more char.
0:13 phil: Oh, I did misread you -- yes, zippers are great for that.
0:14 and good night.
0:14 phil: TimMc: thx & n8
0:14 Raynes: Solarized is supposed to be the best thing ever, but it colors parentheses red and makes me want to gouge my eyes out. Tomorrow Night, my go-to favorite has a few issues and an active yet entirely unresponsive author.
0:14 My life is so hard.
0:14 alex_baranosky: Raynes, I don't enjoy solarized
0:15 duck1123: if we're talking emacs color schemes. I'm a fan of hober
0:15 alex_baranosky: supposedly it has some kind of color science behind it but...
0:15 phil: Raynes: if youre using vim, try slate... but i guess most people here use emacs
0:15 alex_baranosky: I like tango
0:15 Raynes: phil: I'm using Vim.
0:16 phil: Raynes: oh then slate is a default theme
0:16 alex_baranosky: in Vim I use desert
0:16 Raynes: phil: Mostly, I like solarized and tomorrow night because they're everywhere and thus can go with me. I like jellybeans, but it's just for Vim (so if I used Emacs again, I'd need to write one myself).
0:16 phil: though i dunno how it looks on other systems than mac
0:16 Raynes: Also on a mac.
0:17 phil: macvim?
0:17 Raynes: Of course.
0:17 All else is blasphemy.
0:17 Arafangion: I like the 'billw' scheme in emacs.
0:17 chewbranca: I'm partial to sunburst, I definitely prefer it to solarized
0:17 phil: yep :) try slate, its build it
0:17 its reallt calming imo
0:17 built in*
0:17 Raynes: If by calming you mean eyeball exploding.
0:18 phil: haha :D
0:18 Raynes: It highlights 'with-open' with a white background and red foreground!
0:18 phil: 'doto' too
0:18 alex_baranosky: Raynes, what do you think of desert?
0:19 Raynes: Hideous.
0:19 phil: what do you propose for a dark theme then?
0:19 Raynes: I'm pretty picky.
0:19 phil: solarized? is it dark?
0:19 Raynes: Kind of dark.
0:19 Dark or light though.
0:20 phil: ah i wanted to try out that one
0:20 why dont you like it?
0:21 Raynes: It colors parentheses red and is too low contrast even on the highest contrast setting.
0:21 phil: doesnt vimclojure override paren coloring?
0:22 Raynes: Does it? It certainly doesn't paint them red outside of solarized.
0:22 phil: hm i guess not by default, but theres a rainbow paren mode
0:22 which i wanted to try out but forgot
0:23 Raynes: http://
0:24 phil: doesnt look bad tbh... while we're talking editors, is there any good paredit-like plugin for vim?
0:25 Raynes: paredit.vim
0:25 phil: :D
0:25 Raynes: https://
0:25 Our good friend emezeske ripped it out of slimv for us.
0:25 He is actually a regular here.
0:25 phil: this is awesome
0:25 thx
0:30 IceD^: hye
0:30 is this code https://
0:30 Raynes: phil: Try out jellybeans https://
0:31 phil: yea, definately better than slate
0:31 will have to play with color themes tomorrow :)
0:32 Raynes: phil: Ping me when you do. We can talk about them like teenage girls about boys.
0:33 phil: ahaha yea its so exciting :D
0:34 IceD^: im a pretty big noob myself, but maybe take a look at merge-with
0:35 IceD^: I have good lisp background, but never used clojure much
0:35 now clients asked for clojure client lib ;]
0:35 phil: ive started out recently and i like it a lot
0:36 only thing i miss is pattern matchins as in haskell
0:36 matching*
0:37 so i have to resort to if?s etc when a simple pattern would show my intent much better
0:38 IceD^: phil, thnx - merge will be good for me
0:38 phil: np :)
0:38 IceD^: (let [defaults (hash-map ...)] (merge defaults hoptions))
0:40 Raynes: IceD^: Sec. I'm working up an example.
0:41 IceD^: https://
0:41 This is what I'd do.
0:41 IceD^: Raynes, already there ;]
0:41 Raynes: Well I'm slow.
0:41 Sue me. ;)
0:41 IceD^: ahh yes, {} is syn to (hash-map)
0:42 note to self - at least read intros to new langs
0:42 Raynes: Haha
0:43 phil: isnt #{} hash-map?
0:43 Raynes: No.
0:43 That's a set.
0:43 &(type #{})
0:43 lazybot: ⇒ clojure.lang.PersistentHashSet
0:43 phil: aah
0:43 yes
0:45 IceD^: is it bad if I'll ignore clj-http and will use java api instead?
0:52 Raynes: IceD^: You can if you want to, but it's akin to masochism.
0:53 IceD^: Raynes, I'd like to keep it small and deps-less
0:53 two questions (nab and not-so-nab)
0:53 1. nab - how to I load code into lein repl?
0:54 2. not so nab - how do I support both clojure 1.2 and 1.3
0:54 technomancy_: what's "nab" mean?
0:54 phil: noob
0:55 IceD^: noobish
0:55 technomancy_: huh; never heard that
0:55 IceD^: you should try the lein-multi plugin; it lets you run tests against arbitrary dependency sets
0:55 Raynes: If having a dependency on clj-http is a problem, then sure, you can use the Java APIs. If you don't know Java, you could be in for a hell ride though.
0:56 IceD^: I used to develop in java like 10 years ago
0:56 but that doesn't matter - I have java client lib here and will just copypaste most of the code ;]
0:57 Raynes: There was a guy who wrote a pure-clojure http client. Asshole abandoned it for clj-http. I forget his name…
0:57 *cough*technomancy*cough*
0:57 technomancy_: no such thing as a pure-clojure http client. =P
0:57 Raynes: Close enough.
0:58 technomancy_: it was kinda crap
0:58 Raynes: It worked for me.
0:58 :'(
0:58 technomancy_: but if you absolutely can't pull in apache http-client, you could give it a look
0:58 IceD^: looked of course
0:58 technomancy_: the only reason we wrote it was that leiningen didn't exist yet at that time, so you really wanted to avoid external deps
0:58 IceD^: but all I need is to push request and get response
0:59 https://
1:00 Raynes: IceD^: You can just call that code from Clojure. Don't even have to rewrite it.
1:00 IceD^: ofc, it's possible to use it within clojure, but I don't want to force our customers, which using clojure, to face java calls ;]
1:00 Raynes: I mean you can call it from your Clojure code.
1:01 Your Clojure code can basically become a wrapper.
1:01 You can provide a nice little Clojure client that just uses your Java client under the hood preventing a lot of duplication.
1:01 IceD^: I know ;)
1:02 estimated that - there will be more code to wrap than to write from scratch ]:)
1:08 so - I have lein project and lein repl open - how do I (re)load my sources there?
1:20 tavis`: IceD^: haven't read all of this thread but you can't use clj-http for some reason there's always the clj-apache-http wrappers. The project seems abandoned though. Here's an update of it to clj 1.3: https://
1:20 er, 'but *if* you can't'
1:21 clj-http is a lot nicer to use
1:21 IceD^: tavis`, well - main reason why I'd like to avoid any clojure libs - possibility to build for both clojure 1.2 and 1.3
1:22 which is kinda hard with current libs
1:22 technomancy_: nah, it's easy as long as you don't AOT
1:22 IceD^: well
1:22 tavis`: they should work fine with both version
1:22 s
1:22 IceD^: say, clj-http requires clojure 1.3
1:22 bam, I'm doomed
1:23 Raynes: clj-http doesn't require clojure 1.3
1:23 And doesn't intend to anytime soon.
1:23 dakrone would be staked.
1:23 IceD^: well - it requires clojure-1.2
1:23 Raynes: No it doesn't.
1:23 It works fine in both versions.
1:23 IceD^: https://
1:24 Raynes: That's the wrong repo.
1:24 https://
1:24 IceD^: :dependencies [[org.clojure/clojure "1.3.0"]
1:24 tavis`: note it use multi-deps
1:24 Raynes: And the version in the project.clj file isn't really relevant -- if it depends on 1.2 and your project depends on 1.3, your version of Clojure will be used.
1:24 IceD^: aha
1:25 (my head hurts ;])
1:25 Raynes: Dependency management is hard.
1:25 tavis`: that really confused me as well at first
1:25 especially when I didn't understand how lein worked
1:26 IceD^: anyway, I completed my network interaction code already using java calls
1:26 how to test it now
1:26 don't suggest to copypaste to repl please
1:26 technomancy_: best to use your editor integration
1:26 IceD^: technomancy_, it's emacs and we had that discussion already
1:26 CL support is more important for me than clj
1:28 technomancy_: hm; you can use C-u M-x inferior-lisp RET lein repl RET
1:28 tavis`: missed that convo but you could always to what technomancy_ does and run multiple instances of emacs
1:28 Raynes: Or just require the namespace from the repl and test away.
1:28 tavis`: CL support in one and clj in the other
1:28 Raynes: But being cocky doesn't help anything.
1:28 IceD^: tavis`, it was like 6 months ago
1:33 tavis`: btw, technomancy_ if the Clojure and CL versions of slime are divergent now would there be anything wrong with extending slime.el with Clojure specific goodies? Or is the plan to not diverge too far?
1:34 IceD^: tavis`, as I'm aware, clojure's swank's using very ancient version of slime (probably patched)
1:34 technomancy_: no, it's not patched; it's verbatim
1:34 tavis`: I don't have much of a plan. I've been preferring defadvice so far since it's easy enough.
1:34 if there were compelling reasons to fork I'd entertain them
1:35 tavis`: upstream was just too hard to track right? CL assumptions breaking things.
1:35 IceD^: anyway, it was pain to support both slime for my pretty CL and clojure's slime for one emacs
1:35 technomancy_: not just CL assumptions; general cowboy coding
1:35 no attempt at stability
1:35 IceD^: but yes, technomancy_ had his point why things are this way
1:35 Raynes: They are allergic to releases.
1:36 tavis`: got to run
1:46 IceD^: java -cp `lein classpath` clojure.main test.clj --- any shortcut for this?
1:47 technomancy_: sorta; try "lein help run"
1:47 tl;dr: you need a -main function
1:47 IceD^: gotcha
1:47 thnx
1:48 technomancy_: np
2:10 IceD^: another nab question (can't google it) - got java InputStream - want to read all data from it
2:20 slurp!
3:03 what's actual json lib?
3:04 contrib-1.2?
3:31 https://
3:31 it works, but I don't like one thing in particular - thrown exceptions
3:32 suggest me better way for this usercase (client will call queues etc, not request directly). I do not want to just return empty array, but notify him about problem somehow
4:01 manuel__: hi
4:09 booksearch.ly
4:09 wrong chan sorry
4:18 foobar27: join emacs
5:57 clj_newb: StreamPrintServices supports printing to postscript, but not pdf ... is this right, or am I missing something?
6:13 How do I convert a java [] to a Clojure Vector ?
6:13 I want to convert a Java _array_ to a Clojure _vector_. How do I do this?
6:15 manuel__: i think you can just seq them
6:15 i'm a noob, but let me try
6:16 clj_newb: you're right
6:16 (apply vector ... ) works
6:16 thanks :-)
6:17 manuel__: (seq (make-array Integer/TYPE 4))
6:17 that works
7:11 LauJensen: Fogus made a tool which produced good looking source documentation via some leon plugin, anyone remember the name? Did it reach 1.0 ?
7:17 arbscht: LauJensen: marginalia?
7:17 LauJensen: Thats the one, thanks
8:10 zilti: I persisted a list of byte values using spit and pr-str. Now when re-reading it and do a (byte-array (read-string (slurp filename))) it gives me an error that the data could not be cast...
8:13 manuel__: which version of clojure is 4clojure running?
8:15 Licenser: manuel__ try running (*clojure-version*) ?
8:16 the-kenny: Licenser: clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap ;)
8:16 raek: zilti: you might need to do (byte-array (map byte (read-string ....)))
8:16 since the numbers are boxed as longs when you read them
8:17 the-kenny: manuel__: The REPL linked at 4clojure runs 1.3.0 (evaluate *clojure-version*), don't know if the repl is associated with 4clojure, though.
8:18 manuel__: yeah
8:19 i have this: http://
8:19 it works fine in my REPL though
8:19 i have a bit of a hard time parsing clojure error messages
8:19 raek: sounds like a bug
8:20 &(conj {:a 1} [:b 2])
8:20 lazybot: ⇒ {:b 2, :a 1}
8:20 raek: manuel__: does (conj {:a 1} [:b 2]) work at 4clojure?
8:22 Licenser: the-kenny then just *clojure-version* ?
8:22 manuel__: it's the case
8:22 hmm let me see
8:22 Licenser: ah I see you got it already ^^
8:23 manuel__: it does
8:23 it's (case (foo) [:x] :x) that's making trouble
8:23 the [:x] part
8:23 btw raek, care to explain your thinking? :}
8:24 raek: afaik, maps use clojure.lang.MapEntrys as its entries
8:24 and clojure.lang.PersistentVector implements that
8:24 manuel__: yeah i was wondering where that map entry was coming from
8:24 raek: ,(class (first {:a 1}))
8:24 clojurebot: clojure.lang.MapEntry
8:24 manuel__: so it's from the [:x]
8:25 raek: but it doens't seem like you are using maps anywhere
8:26 manuel__: this breaks in 4clojure; (case 1 [1] 2)
8:26 am i not getting something?
8:26 raek: could be a bug in the sandbox code
8:27 especially if the problem only shows up at 4clojure
8:27 have you tried that in both 1.2 and 1.3?
8:27 manuel__: yah prolly
8:27 nope will do
8:28 raek: I don't get that exception in neither 1.2 or 1.3
8:59 b6n: ,(every? true? [])
8:59 clojurebot: true
8:59 b6n: is that intended behaviour?
8:59 pandeiro: b6n: i think only nil and false are false in clojure
9:00 raek: b6n: sure, true is the unit element of the and operator
9:01 b6n: ,(every? #(= 10 (count %1)) [])
9:01 clojurebot: true
9:01 raek: you might want to use 'identity' or 'boolean' instead of 'true?', though
9:02 another way of saying p(x) is true for every x is to say there isn't any x such that p(x) is false
9:02 b6n: ok, but that (count ... ) thing really astonishes me
9:03 raek: why? the predicate is never called.
9:03 ,(every? #(= 10 (count %1)) [(range 10) (range 1 11)])
9:03 clojurebot: true
9:04 b6n: because I'm asking 'has every element in the collection the length 10
9:05 raek: the answer is yes, all elements trivially have the length 10 since there are no elements
9:07 this is similar to the problem "what is the sum of all numbers in a collection"
9:07 &(apply + [1 2 3])
9:07 lazybot: ⇒ 6
9:07 raek: &(apply + [1])
9:07 lazybot: ⇒ 1
9:07 raek: &(apply + [])
9:07 lazybot: ⇒ 0
9:07 raek: 'true' is for 'and' what 0 is for +
9:09 b6n: you're right, it's a bit like multiplying with 0
9:09 raek: with 1? :-)
9:10 b6n: at least it was astonishing to see a unit test succeed with no implementation written :-)
9:11 thanks for clarifying this
9:42 augustl: are there any purely functional web frameworks for clojure? Not sure if I like noirs thread local state etc..
9:42 where a page gets a request object passed to it and you return a response object
9:46 pandeiro: augustl: don't have an answer for you but do you know of any such frameworks in other languages? i'd like to see
9:47 raek: augustl: http://
9:47 augustl: pandeiro: Rack for ruby works that way, for example
9:47 but rack is a bit lower level than what you want your web framework to be ;)
9:48 raek: ring (a library which noir is built on top of) lets you define your web app as a function from a request map to a response map
9:48 pandeiro: ah i was thrown off by the word 'framework'
9:48 raek: or maybe that was what you didn't like...
9:48 augustl: ring is similar to rack, it seems
9:48 raek: the flow of ring, but more utilities, basically :)
9:48 I like defpage etc in noir
9:49 not that hard to write that myself I guess
9:55 frankvilhelmsen: a natural choice on top of ring is fx compojure,
9:55 which has a greater degree of abstraction ontop of http
9:55 I use compojure into production successfully.
9:59 augustl: seems what I want is compojure + hiccup + defpage from noir
10:06 frankvilhelmsen: this is verly similar to sinatra plus haml in the ruby world
10:06 phil__: while talking about backends, is there any erlang-like distributed library, ideally running ontop of native clojure actors?
10:10 jondot: hi all, anyone done interop to WEKA or LingPipe for the purpose of deduping with clj?
10:18 the-kenny: phil__: Maybe die-roboter is something for you
10:20 phil__: the-kenny: thx, ill check it out
10:39 goodieboy: i'm playing with destructuring and wondering if there is a way to specify that I want ALL :keys to be let, like (let [{:keys :all} {:id 1}] (class id))
10:39 and if not... could a macro do something like this?
10:40 msappler: why do you want to do this?
10:41 goodieboy: well, really what I'm after is a way to create bindings from a hash-map. I'd like to create a function/macro that takes a string template, and then a hash map for the variable bindings. Just like clojures string interpolation library, but use hash-maps instead
10:41 (interpoloate "this ~{n}
10:41 oops
10:42 jeremyheiler: use the keys function? &(keys {:foo 1 :bar 2})
10:42 ,(let [k (keys {:id 1})] k)
10:42 clojurebot: (:id)
10:43 goodieboy: jeremyheiler: yeah I tried that, but my macro foo just isn't able to make it work
10:43 jeremyheiler: goodieboy: maybe post your macro then?
10:52 goodieboy: jeremyheiler: Here's a simplified version of what I have that should describe what I'm trying to do: https://
10:54 jeremyheiler: not sure if you got that last message (gist link) -- bad connection here :(
10:56 jeremyheiler: goodieboy: i got, am looking at it now.
11:12 goodieboy: ok wow, i think i actually got it! https://
11:17 jeremyheiler: goodieboy: nice!
11:19 goodieboy: jeremyheiler: that only took like, an hour + to do :) hopefully i learned something from that.
11:24 jeremyheiler: goodieboy: that's always good. you got me thinking about a few things, so it was helpful for me too.
11:28 goodieboy: jeremyheiler: great! Yeah I think using macroexpand was the key to see what was actually happening.
11:29 pdk: so
11:29 jeremyheiler: goodieboy: yeah definitely
11:29 pdk: found this old macro
11:29 and looking at it i got no damn clue what it's for
11:29 ;(defmacro dostatic [cls & ms] (cons `do (map #(list* `. cls %) ms)))
11:29 and i probably wrote that :\
11:32 jeremyheiler: pdk: looks like it creats forms like (. foo bar)
11:32 pdk: looking at it now in that case i dunno why i made it so roundabout
11:34 jeremyheiler: well, a sequence of those forms, passing each item in ms into whatever strin cls was.
11:36 Narvius: Hello, I have a question. I use leiningen (1.6.1) for my project, and I have a resource folder called assets (:resources-path "assets" in projec.clj), which in turn contains an images directory. After some searching around I concluded that the easiest way to obtain a list of files within that folder at runtime in an uberjar is to generate a "manifest" file containing a list of all files within that images directory. Is there a way to automat
11:37 So that it generates that manifest file before uberjar is ran.
11:57 TimMc: Narvius: You can add an arbitrary map of strings->strings to the manifest using leiningen's :manifest attribute.
11:59 Narvius: FYI, loading the correct manifest at runtime is tricky. This is how I did it: https://
12:00 Narvius: TimMc: Alright, I will look into it. Thanks.
12:05 Okay. Now why does (resource "images") return nil when ran from the uberjar but the correct file URL when ran with lein run? The images folder is in the .jar, I checked.
12:05 clojure.java.io/resource, of curse.
12:05 course*
12:06 TimMc: Narvius: Resource loading is hard. I spent a day or two just making those two little files in that repo I linked.
12:08 Narvius: And there really is no simple way to load something I absolutely for 100% know is in the .jar?
12:09 TimMc: Well, look at the sample i sent.
12:09 You can load anything on the classpath, the trouble is knowing whether it's from *your* jar.
12:10 I may be minsunderstanding your problem.
12:12 Narvius: Hm... I'm starting to wonder whether I'd be better off to load the files from outside the .jar. >.>
12:17 IceD^: https://
12:17 want it to be idiomatic, but not sure if doing it right
12:26 TimMc: Narvius: Once you get the classpath stuff sorted out, it shouldn't be too bad.
12:30 ericshull: q
12:32 jsnikeris: technomancy: Are *swank-source-path* and *swank-compile-path* intended to be dynamically rebindable?
12:41 alex_baranosky: can one not use a fn defined in a let within a deftype declaration?
12:41 because of the macro expansion I suppose
12:42 Chousuke: I don't see why not :/
12:44 alex_baranosky: Chousuke, only saying it because I'm getting an error here when I try to put 'normalized-metaconstant' into a letfn -- https://
12:44 java.lang.Exception: Unable to resolve symbol: normalized-metaconstant in this context
12:47 Chousuke: hmm :/
12:51 alex_baranosky: Chousuke, I guess I'll lose this battle today.
13:24 kcinvres: g'day
13:31 dnolen: you know Clojure isn't such a bad language for writing mutable code :D
13:31 this is epic gross but https://
14:32 trptcolin_: is there something in core already to intern a var with all the necessary metadata attached? this little `intern-with-meta` function seems pretty generic (in my case, for bringing a macro in)... https://
14:33 and/or am i missing a simpler way?
14:42 tufflax: Luyt no, i don't think so. Clojure functions can only return one thing.
14:42 ops, i had scrolled up and didn't check the time stamp. I'm very late :p
14:56 kcinvres: I'm new to git (among other things) and I'm trying to figure out how to upload my stuff to github
14:58 I made a website based on noir-blog and now I'm trying to clean it up and put it on github... but I'm not sure if I should just upload the code... or fork the original noir-blog project and then push to that...
14:58 Raynes: kcinvres: I think either way is fine in this case. Forking it might be better for historical sake.
15:02 kcinvres: Raynes: Okay, well I've done a fork. but the code is somewhat different now. I renamed the project, renamed some directories... Every file has changed between 5% and 30%.
15:03 Raynes: kcinvres: That's fine. You can still push it to Github. You can also rename your project to something else (and keep it a fork) in the admin panel.
15:05 kcinvres: Raynes: Okay. If I push on top of the current fork, will the renamed folder replace the old one? or will then both be there?
15:05 Raynes: What you push will replace what is there entirely.
15:05 kcinvres: I obviously want the former.. okay
15:06 Raynes: It will be a clone of what you have.
15:06 In a distributed version control system like git, everybody has a complete copy of the repository.
15:07 kcinvres: okay.. and people don't worry about it because they have all the previous commits
15:08 Raynes: Right.
15:08 You can always hop back to some other point in history.
15:08 Git is like a time machine.
15:15 raek: ...with a non-linear time axis!
15:15 (namely a DAG-shaped)
15:30 gfredericks: Are there any clojurescript libraries for canvas stuff yet?
15:31 brehaut: gfredericks: for some reason i think pinot provides some?
15:31 (not that ive actually used it at all)
15:34 gfredericks: huh; so it does
15:34 brehaut: gfredericks: karma to mostly lazy then :)
15:35 gfredericks: $inc mostly-lazy
15:35 lazybot: ⇒ 1
15:37 gfredericks: huh...looks like it doesn't use the goog libs though. I figured that would be the simplest approach.
15:50 brehaut: huh, F#'s WebSharper (Web dev stuff with F# -> JavaScript compilation) is now free http://
15:51 dnolen: gfredericks: goog canvas implementation is way broken.
15:56 gfredericks: dnolen: really? That's disappointing. I haven't yet used a library that abstracted over the various browser differences well. I haven't used much though.
16:02 technomancy: jsnikeris: I couldn't say; those were from before I started working with swank.
16:04 jsnikeris: technomancy: gotcha. They don't jive w/ the convention that vars whose names start and end with '*' should be declared ^:dynamic
16:05 technomancy: jsnikeris: yeah, swank code is paleolithic. there are places where it uses refs instead of atoms just because atoms hadn't been implemented yet
16:05 dnolen: gfredericks: the canvas implementation is ok for simple drawing - for more complex procedural drawing / animation I would not use it.
16:06 kcinvres: Okay, so I'm about to push. But my local repository has its own history and the one on github has a few of its own commits. When I push, which will be the canonical history?
16:06 the-kenny: I tried using the canvas stuff from goog once. Horrible, horrible experience.
16:08 gfredericks: Well I didn't expect it would be pleasant to use directly, but at least reliable and functional; i.e., would be good once wrapped in cljs.
16:09 I guess the google docs drawing code must use something else?
16:16 ordnungswidrig: kcinvres: you can only push if your local branch appends to the current head of the remote branch
16:17 koeien: ebian
16:18 whoops
16:18 kcinvres: ordnungswidrig: How would I know if that is the case?
16:19 ordnungswidrig: kcinvres: git log −1 shows the head of the branch you're on
16:20 * gfredericks is a fan of git log --graph
16:21 kcinvres: git log -1 commit cdb2ec347436ab9fd2f5640af34c67e348f58f4e Author: John Newman <johnmn3@gmail.com> Date: Sun Jan 22 16:07:47 2012 -0500 moving to github
16:22 doesn't say master
16:22 though doing a "git branch" says master
16:25 gfredericks: kcinvres: my favorite is git log --graph --all --format=\"%h[%t] %d %an--%s\"
16:26 kcinvres: ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@github.com:johnmn3/qftk-site.git' To prevent you from losing history, non-fast-forward ...
16:26 so that's what you're talking about
16:30 google is telling me to do a pull and then another push
16:30 won't that wipe out my current changes?
16:31 jeremyheiler: kcinvres: no, it will merge what it can. then ask you to merge anything that conflicts with you changes.
16:31 gfredericks: kcinvres: not to mention the commit you're currently on will be part of the history, so you can always go back and see what happened when you merged
16:31 kcinvres: most recent file wins?
16:32 gfredericks: e.g., after the merge you could diff your current commit with the new commit and see exactly what the merge changed
16:33 jeremyheiler: kcinvres: git will automatically merge any line of code that it knows you didn't change. then it asks you to manually merge anything that you did change.
16:35 kcinvres: just did a pull and I'm seeing git comments in the code!?
16:35 jeremyheiler: kcinvres: that's the code you need to manually merge yourself.
16:40 kcinvres: thats a lot of code to edit
16:43 ok, so I think I get it : <<< HEAD local stuff ===== remote stuff >>>> 345345345
16:43 So I can just go through and delete all but the local stuff
16:44 jeremyheiler: kcinvres: assuming that you don't want any of the new stuff.
16:45 kcinvres: I don't
16:46 ordnungswidrig: kcinvres: http://
16:48 kcinvres: in this case git pull -Xours will force your local changes. But use with care
16:48 kcinvres: ordnungswidrig: Okay. Thanks!
16:49 clj_newb: so I'm writing a WYSIWYG editor in clojure; and I'm getting to the point that lag is a bit intolerant for an interative application. What should I read up on for profiling? (I know nothing abot profiling Clojure or Java code; I only know how to use gprof for C++ code.)
16:49 kcinvres: just did it by hand this time. running again to see if it still works
16:50 ordnungswidrig: clj_newb: yourkit.com is a very good profiler.
16:50 kcinvres: no, I broke something
16:50 how do I roll back one?
16:50 clj_newb: ordnungswidrig: there's nothign like clojure_prof ?
16:51 dnolen: clj_newb: VisualVM works, YourKit is nicer. Look at test.benchmark for ideas on speeding up the slow spots.
16:51 ordnungswidrig: kcinvres: git checkout
16:51 clj_newb: let me rephrase my question: is the optimal clojure profiler just to use the best java profiler?
16:51 ordnungswidrig: http://
16:51 lazybot: Nooooo, that's so out of date! Please see instead http://
16:51 ordnungswidrig: grr
16:52 jeremyheiler: owned by lazybot lol
16:52 clj_newb: lol; lazybot is almost cute
16:52 dnolen: clj_newb: the JVM profilers are quite nice IME.
16:53 kcinvres: error: you need to resolve your current index first
16:53 ordnungswidrig: clj_newb: it depends. standard java hprof might be sufficient for profiling
16:53 clj_newb: s/java/jvm/
16:59 kcinvres: http://
17:00 kcinvres: k, I fixed the code. Now when I do a "git add ." it says "fatal: unable to stat 'folder/file' : No such file or directory
17:01 Because I deleted the directory that got pulled from github
17:02 ordnungswidrig: I think that works, thanks!
17:03 ordnungswidrig: where did io/delete-file-recursively go in 1.3?
17:03 i mean contrib.io/...
17:04 alex_baranosky: ordnungswidrig, perhaps fs may contain what you need? https://
17:08 clj_newb: ordnungswidrig: purely out of courisity; what does your nick stand for? phonetically it sounds like some word in a langauge I do not understand
17:08 ordnungswidrig: alex_baranosky: oh thanks.
17:09 the-kenny: clj_newb: It's German :)
17:09 ordnungswidrig: clj_newb: it means "contraty to regulations" in german.
17:09 clj_newb: law / administration term
17:09 clj_newb: an "ordnungswidrigkeit" is a "minor breach against the law"
17:10 tavis`: is there a way to force a non-dynamic var to be dynamic in 1.3 - specifically #'clojure.core/read-line?
17:10 clj_newb: ordnungswidrig: ah; german does make sense, it sounds angry
17:11 the-kenny: :D
17:11 hiredman: tavis`: it's a compile setting, so if you alter-meta! and set :dynamic to true before the code that calls read-line is compiled it will be compiled as a dynamic var
17:13 tavis`: so alter-meta! before pulling in the ns that needs to do that
17:13 thanks
17:13 hiredman: well, it will only be accessed dynamically by code that is compiled after you change the metadata
17:13 tavis`: right
17:14 kcinvres: uuugh.. still non-fast-forward errors :(
17:14 hiredman: ok
17:15 tavis`: hiredman: an if I have a macro that does a binding of read-line it's the ns that uses the macro rather than the ns that defines the macro that I need to worry about, right?
17:16 hiredman: I don't follow
17:17 if namespace A calls read-line, if you change the metdata on #'read-line before A gets compiled you will be able to effect the function that gets called using binding, if not, you won't
17:17 tavis`: I've got a macro swank.core/with-readline-support: (w-r-s [& body])
17:18 it's the ns that uses that macro that I have to compile after alter-meta! rather than swank.core, I assume
17:18 hiredman: it is the namespace you want the dynamic binding to effect
17:19 tavis`: ok, thanks.
17:26 kcinvres: OMG, I'm so confused
17:26 no git won't commit
17:28 *now
17:28 tavis`: hiredman: no luck
17:32 kcinvres: I do a git reset --hard, then delete the files I don't want, then git add ., then git commit -m "update"
17:32 clj_newb: in Java, am I allowed to assume that \a \b ... \z forms an consecutive increasing sequence; and \A ... \Z forms another consecutive increasing sequence?
17:32 kcinvres: and then it says "no changes to commit
17:32 clj_newb: i.e. I want to see if a char is one of \a ... \z or \A .. \Z
17:33 jeremyheiler: clj_newb: yes
17:33 kcinvres: ugh
17:33 Your branch is ahead of 'origin/master' by 1 commit.
17:33 clj_newb: jeremyheiler: what standard that Java conform to that allows me to make this assumption?
17:34 jeremyheiler: ,(< (int \a) (int \b))
17:34 clojurebot: true
17:34 jeremyheiler: ,(< (int \e) (int \d))
17:34 clojurebot: false
17:34 jeremyheiler: convert the char to an int
17:35 clj_newb: in java, you can do comparasons on char primitives like: if('a' < 'b')
17:35 but converting to ints work as well.
17:36 dnolen: ,(compare \a \b)
17:36 clojurebot: -1
17:36 clj_newb: ,(< \a \b)
17:36 clojurebot: #<ClassCastException java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.Number>
17:36 clj_newb: ahh, compare
17:40 Found my bug: file had unicode characters; font only supposed ascii characters; weird out of bound cases now resolved. :-)
17:43 kcinvres: ugh, finally
17:43 https://
17:43 looks like .gitignore got ignored though, cause I had to do a git push github master --force
17:49 clj_newb: clojure.org/libraries has a link to a "parsec like" library for cojure. The link is broken.
17:50 lazybot: please fix it
17:56 romain_p: Hi everyone, I have a question about the thread macro (->): given that "gather-words" returns a list of words, what is wrong with this: (-> "http://
17:57 (the error I get is java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to clojure.lang.IPersistentVector (NO_SOURCE_FILE:17))
17:58 dnolen: romain_p: -> is pure syntax transformation, it will screw up on the fn literal.
17:58 clojurebot: 'Sea, mhuise.
17:58 romain_p: and the original, working code was (sort-by second (frequencies (gather-words (slurp "http://
17:58 dnolen: (macroexpand '(-> a #())))
17:58 ,(macroexpand '(-> a #())))
17:58 romain_p: dnolen: I am a beginner, and this is chinese for me, could you explain ?
17:58 clojurebot: (fn* a [] ())
17:58 dnolen: romain_p: ^ notice that looks weird
17:58 romain_p: yup :)
17:59 dnolen: #(sort-by second %) is just not going to work inside ->
17:59 romain_p: OK, so should I declare it outside or is there an idiom I could use?
17:59 trptcolin_: if you wrap another set of parens it might :) kind of yucky though...
18:00 (-> "http://
18:00 threading is all fun and games until you want to switch from -> to ->>
18:00 romain_p: trptcolin_: it does work, but I agree with the yuckiness part too :)
18:07 brehaut: trptcolin_: its easy to switch from -> to ->>; its the other way thats dumb
18:08 trptcolin_: i guess i haven't ever had multiple ->>'s chained together, come to think of it...
18:09 brehaut: ,(-> 1 (+ 1) (->> (* 3)))
18:09 clojurebot: 6
18:11 brehaut: (numbers are a terrible example of that)
18:15 trptcolin_: :) well, + and * anyway, since argument order doesn't matter. for some reason i didn't think of nesting - that's a good idea.
18:15 TimMc: brehaut: I think there might be a few implementations of -%> floating around, e.g. (-%> 5 (+ 5 %) (nth % (range)))...
18:16 brehaut: TimMc: huh thats cool
18:16 trptcolin_: :) that's kind of sweet
18:16 TimMc: Some people add ,,, where the arg would go anyway; might as well make it real.
18:16 dgrnbrg: has anyone ever used fleet? Can you explain what it means when I use the fleet-ns macro that "foo.bar.fleet" produces 3 functions: foo, foo-bar, and foo-bar-fleet? What is the purpose of each function?
18:21 TimMc: dgrnbrg: What is fleet?
18:23 brehaut: TimMc: its a templating engine i believe
18:23 Somelauw: I prefer letting over ->
18:24 brehaut: TimMc: sort of a rails templating thing for clojure?
18:24 TimMc: dgrnbrg: You may wish to macroexpand the call to see what it produces, if the docstring is mysterious.
18:27 dgrnbrg: TimMc, it is indeed a templating engine
18:27 I have read the docs, and the source, but I'm having trouble following along with the call chain
18:27 and seeing where exactly they actually def the new functions
18:28 the fleet-ns macro takes a directory as an input, inteprets the files as templates, and then defines the templates in a new namespace
18:29 brehaut: dgrnbrg: im curious; why did you choose fleet over enlive or hiccup?
18:29 dgrnbrg: I want to template verilog code
18:30 Fleet seemed to be pretty removed from html-ville
18:30 brehaut: right
18:30 dgrnbrg: I also want to template vhdl
18:30 they all have really different syntaxes
18:30 I want something like gsp/jsp or StringTemplate in groovy
18:31 the fact that fleet lets me write templates as resource files is just gravy, and i apparently may be reimplementing that part myself
18:32 brehaut: cl-format to the rescue ;)
18:33 dgrnbrg: wat's that?
18:33 brehaut: magic
18:33 clojure.pprint/cl-format
18:33 its common lisps format ported to clojure
18:33 with all the crazy that entails
18:34 (it wasnt a serious suggestion)
18:34 dgrnbrg: what makes it crazy?
18:35 brehaut: its quite an involved, yet terse, formatting language
18:35 dgrnbrg: if all i need is string interpolation
18:36 brehaut: then plain old format is probably a better choice
18:36 dgrnbrg: I just want more convenience when templating
18:36 i may need loops or other, more complicated constructs
18:38 dnolen: dgrnbrg: if you like StringTemplate you can use that from Clojure no?
18:41 dgrnbrg: dnolen, I could, but it seems cleaner to use the clojure lib
18:41 especially for parameterizing templates with maps whose strings are clojure keywords
18:47 trptcolin_: didn't the stock clojure repl used to dump stacktraces? i can only seem to get it to print a 1-line exception summary. (i know i can (pst) to get it to print if i really want to)
18:53 dnolen: trptcolin_: pretty sure it never did.
18:53 TimMc: amalloy_: Do you happen to know of an implementation of -%>, that threading macro that allows you to explicitly select where the threaded arg goes?
18:55 trptcolin_: dnolen: yeah, that's what i'm seeing. even going back to 1.1.0 jar... trying to remember why i think stacktraces are so annoying to read when they don't come up by default in-repl.
18:58 clj_newb: are map/reduce, loop/recur the main constructors for replacing for loops; is there anything else I should be aware of?
18:59 dgrnbrg: clj_newb, the for macro is really useful
19:00 clj_newb: dgrnbrg: it does look interesting
19:01 * clj_newb peeks at (source for) .... crap
19:05 dgrnbrg: clj_newb, it is a little DSL that's like python's syntax
19:06 so (for [a [1 2 3] b [:a :b :c]] [a b]) gives [1 :a] [1 :b] [1 :c] [2 :a] ...
19:06 brehaut: clj_newb: lazy seqs and loop/recur are the primary _low level_ building blocks of loop replacement.
19:07 dgrnbrg: clj_newb, you give it some seqs, the names of the given element of that seq, and some filters, and then you get to write the expression that yields the value for the result seq
19:08 brehaut: clj_newb: you infrequently operate with either directly. map, reduce, filter, keep, take etc (ie, the seq functions) are the primary 'loop replacement'
19:09 clj_newb: http://
19:26 trptcolin_: so i have this workaround for http://
19:27 ... and the instanceof checks break line-numbering for stack traces. anyone have ideas for further hackery short of getting that patch in?
19:30 i should've said, those instanceof checks break line-numbering for traces *when you replace LineNumberingPushbackReader with something else*
19:38 wjlroe: Can the order of the keys in a PersistentHashMap be relied upon?
19:39 brehaut: no
19:39 although joy of clojure claims that array-map does have that property though you have to be careful that the array map stays an array map
19:43 given PersistentArrayMap.cons will return a PersistentHashMap when it reaches a certain size, i dont believe its easy to keep with an array-map
19:45 wjlroe: I have been getting weird behaviour where the order of the keys in a map is as I wanted (comes from a sql query), but when it gets to a certain number of keys - the order changes, to a different, consistent ordering)
19:45 brehaut: wjlroe: thats the difference between array-map and hash-map
19:46 they both implement the IPersistentMap interface, and the back type for clojures maps
19:46 array maps are used for small maps, and hash maps when they grow too large
19:46 wjlroe: for a given set of keys and insertion order hash map is consistent but its not goign to maintain insertion order
19:47 wjlroe: what I found is when these maps have over 10 keys - the order is strange
19:47 brehaut: i think the order should be 16
19:47 https://
19:48 wjlroe: like i said, hash map _does not maintain insertion order_
19:48 wjlroe: well it's defo smaller than that
19:48 yeah
19:48 not very useful when that's what you get from a sql query (Korma) - a vector of hash maps
19:50 brehaut: ,(for [n (range 20)] [n (class (reduce conj (array-map) (map (juxt identity identity) (range n))))])
19:50 clojurebot: ([0 clojure.lang.PersistentArrayMap] [1 clojure.lang.PersistentArrayMap] [2 clojure.lang.PersistentArrayMap] [3 clojure.lang.PersistentArrayMap] [4 clojure.lang.PersistentArrayMap] ...)
19:50 brehaut: rats
19:50 (for [n (range 14 18)] [n (class (reduce conj (array-map) (map (juxt identity identity) (range n))))])
19:50 jeremyheiler: wjlroe: do your hash maps represent rows in the database? if so, why does order matter?
19:50 brehaut: ,(for [n (range 14 18)] [n (class (reduce conj (array-map) (map (juxt identity identity) (range n))))])
19:50 clojurebot: ([14 clojure.lang.PersistentHashMap] [15 clojure.lang.PersistentHashMap] [16 clojure.lang.PersistentHashMap] [17 clojure.lang.PersistentHashMap])
19:51 wjlroe: jeremyheiler: yup - order matters because the keys in the map relate to the columns in the select query - those fields are ordered in the query and should be in that order in the data that results
19:53 brehaut: wjlroe: why a map and not an ordered collection?
19:53 (eg a vector)
19:53 jeremyheiler: wjlore: it's easy enough to get around that by maintingin a vector or list of your keys, and iterate over them when you need to pull the values out of the map.
19:53 wjlroe: jeremyheiler: define the same info twice. not very dry
19:54 brehaut: so yeah that would work - vectors of vectors, which I would have to transform from the results of a query and reorder the keys on the way
19:56 jeremyheiler: wjlore: don't you have to define the keys (selected columns) in order for a select query to work anyway?
19:57 why not just use same vector/list of keys?
19:57 wjlroe: the problem is, because the SQL library - Korma - returns PersistentHashMaps - I'm gong to have to mess around with that to make it useful, I shouldn't have to do that - it should come out in a sane format that doesn't require re-ordering
19:58 jeremyheiler: the list of columns relates to the tables/subqueries - the list of keys relates to the data returned, they aren't quite the same so would have to define this twice
19:58 brehaut: huh? i was sure korma returned a vector (or some seq) of maps
19:58 wjlroe: so the select has a field - :table.column - and then I'd need to fix the returned map by ordering the columsn again [:column :another]
19:59 it does - exactly
19:59 maps are the problem
19:59 * brehaut boggles
19:59 wjlroe: it returns a vector of maps - which turn out to be PersistentHashMaps - which doesn't preserve the order of the fields requested in the query
20:00 which is borken
20:01 brehaut: fields arent inheriently ordered
20:02 wjlroe: I don't know what you mean by that - they are in every other language and library I've used sql with.
20:02 brehaut: ,(map {:a 1 :b 2 :c 3 :d 4} [:b :c :d]) ; anyway, trivial to select an ordered subset of the row
20:02 clojurebot: (2 3 4)
20:03 wjlroe: if I just wanted the values - yes
20:04 brehaut: well then, select-keys is also not hard to use
20:05 wjlroe: doesn't work
20:06 returns the out-of-order map
20:06 very bizare
20:06 brehaut: maps have no order
20:06 wjlroe: unless they are array maps
20:06 brehaut: which you cant rely on
20:07 the interface is what you should be programming to
20:07 and the interface has no garuntees on order
20:07 wjlroe: back to python then
20:07 brehaut: anyway, it sounds like you are doing something pretty bizarre
20:09 wjlroe: this just means I'm going to have to write a separate function per table/query instead of using the one and being able to rely on a sane data structure
20:10 I realise hash maps aren't ordered, but it would be nice if there was something reliable which was a map with ordered keys that was sane
20:10 brehaut: lets assume thats true. Why‽
20:11 wjlroe: why what?
20:11 amro: it's a nice plus, but I wouldn't call unordered maps insane
20:11 wjlroe: unordered maps aren't insane. not having ordered maps is not very useful
20:11 brehaut: why do you want the keys and values of the records in a query result to be ordered
20:11 let me rephrase my question
20:12 what is the problem you are trying to solve
20:13 i agree that ordered maps are useful, but i cant see why they would be in the particular case of SQL query results
20:13 amro: I'll second that
20:13 wjlroe: I have defined a query - get me these fields from this database - then I wanna display that. Fine. Problem is what I asked for from the database is mangled by the data structure. So I have to monkey with the data to re-order things to match the query I wrote. Perhaps this is a part of SQL that just doesn't match concepts in Clojure - but most times when you write a query in a DSL - the fields come
20:13 back ordered as you would want
20:14 really all I need is to tell Korma to return results in a different way
20:15 brehaut: ,((fn repr-record [{:keys [a b]}] (prn-str "a record:" a b)) {:c "abc" :b 23 :a "hello, world"})
20:15 clojurebot: "\"a record:\" \"hello, world\" 23\n"
20:16 brehaut: or you could (and i dont think this is a particular controversial idea) refer to named values by name
20:17 wjlroe: sure
20:17 I have a function that prints results - regardless of what fields etc are there - I will have to complicate that rather to take this into account
20:28 Does anyone know, when you've run clojure-jack-in from Emacs - how, in your code, you can print to the repl?
20:29 although it was better to call (swank.core/break) to find out what was going on
20:29 so never mind
20:33 benares_98: ,(doc dosync)
20:33 clojurebot: "([& exprs]); Runs the exprs (in an implicit do) in a transaction that encompasses exprs and any nested calls. Starts a transaction if none is already running on this thread. Any uncaught exception will abort the transaction and flow out of dosync. The exprs may be run more than once, but any effects on Refs will be atomic."
20:33 benares_98: can anyone tell me what the & means?
20:35 gfredericks: it means that the function/macro takes varargs
20:35 jimduey: It means that the dosync form takes a variable number of expressions. The value 'exprs' is a list of those expressions.
20:35 benares_98: thansk
20:35 *thanks
20:35 gfredericks: it parallels the syntax for actually implementing a vararg function
20:35 and destructuring more generally
20:40 _carlos_: hi!
20:48 dnolen: wjlroe: clojure has sorted-maps, sounds like sqlkorma is missing a feature you like.
20:48 wjlroe: dnolen: if that's the case, then yeah
20:50 _carlos_: in clojure in action book: in concurrency chapter, page 157, just above commute explanation, I cite: "it doesn’t matter in what order you add users. If two threads were both trying to add a user to our system, you wouldn’t care in what order they’re added. Such an operation is said to be commutative". I don't understand why it is commutative, because at the time commute would be called for that example, (inc current-number)
20:50 outdated version of the id
20:50 sorry for the long paste
20:51 brehaut: dnolen: sorted-map isnt an ordered-map though
20:51 _carlos_: btw, the page number printed in the pdf itself is 133
20:52 dnolen: brehaut: by that do you mean preserving insertion order?
20:52 brehaut: dnolen: yes exactly
20:54 wjlroe: I've solved my problem now, just would have been nice if Korma could just output data in vectors maybe so the order can be assumed. I'll ask about it
20:54 (vectors of vectors - or first elem is field names)
20:54 dnolen: brehaut: ah ok. though I think in wjlroe's case he doesn't really care how it's done, as long as he can iterate over the fields in the same order he specified in the query ;)
20:54 wjlroe: YES
20:54 :)
20:54 brehaut: dnolen: yeah, i understand that requirement. i just think its wrong ;)
20:55 wjlroe: I'll just have to stick a sticky note to my screen that says "Don't assume the order of anything. Write more code to be sure"
20:57 jimduey: wjlroe: you might use juxt to accomplish what you want easily.
20:58 brehaut: jimduey: huh. thats a cunning alternative to map
20:58 jimduey: ((juxt :a :d :c) {:a 3 :b 5 :c 8 :d 1})
20:59 wjlroe: That is clever
20:59 brehaut: jimduey, (map {:a 3 :b 5 :c 8 :d 1} [:a :d :c])
21:00 cemerick: is https://
21:00 jimduey: yep. I get to use juxt so rarely that I like to use it when I can to keep in practice
21:00 brehaut: lol :)
21:01 dnolen: brehaut: but juxt is so much cooler man.
21:01 brehaut: dnolen: no argument there :)
21:01 wjlroe: (if (resolve 'swank.core.connection/*current-connection*)) <- for some reason that is true, even when swank.core.connection is not defined - i.e. in production - what mistake did I make?
21:02 clj_newb: is there a way to generate the charsacters from \a to \z
21:02 something like say \a .. \z, except in clojure
21:02 dnolen: ,(int \a)
21:03 clojurebot: 97
21:03 dnolen: ,(int \z))
21:03 clojurebot: 122
21:03 dnolen: ,(map char (range (int \a) (int \z)))
21:03 clojurebot: (\a \b \c \d \e ...)
21:03 clj_newb: dnolen: thanks
21:04 brehaut: i think raynes has a generic range lib somewhere too
21:04 dnolen: ,(map (juxt identity char) (range (int \a) (int \z)))
21:04 clojurebot: ([97 \a] [98 \b] [99 \c] [100 \d] [101 \e] ...)
21:04 clj_newb: ,(println (int \1) (int \9) (int \0))
21:04 wjlroe: I was going to ask - can you define multimethods for different sorts of ranges - so one acts on characters
21:04 clojurebot: 49 57 48
21:05 Raynes: https://
21:05 wjlroe: nice
21:06 chewbranca: range is exlusive though, you'll have to do something like (inc (int \z)) if you want z as well. Is there a better way to do that?
21:06 clj_newb: without the use of flatten, is there a way to change ( [k1 v1] [k2 v2] ... [k_n v_n]) into { k1 v1, k2 v2, ... , k_n v_n } ?
21:06 Raynes: &(into {} '([:a 1] [:b 2]))
21:06 lazybot: ⇒ {:a 1, :b 2}
21:06 wjlroe: (into {} [[k v]])
21:06 too slow :(
21:07 clj_newb: wjlroe , Raynes : thanks
21:08 wjlroe: I used to be so confused by the Ruby way to do that.
21:12 clj_newb: clojure is so awesome it enlightens its users about other langauges
21:14 wjlroe: well - except Java - there is no enlightenment there
21:15 clj_newb: I used to believe Java was utter crap. Now, I know that Java is a great VM + set of libraries, and all it has ever lacked was a decent programming language.
21:15 dnolen: wjlroe: heh not true, Java Concurrency In Practice is a pretty sweet book.
21:16 wjlroe: dnolen: oh well there is that
21:44 jeremyheiler: yeah, the stuff doug lea (et al) has done with the concurrent lib is pretty awesome
22:00 brehaut: ive managed to forget (again) where the clj-http repo is hosted
22:01 jeremyheiler: here? https://
22:01 scottj: brehaut: g site:github.com clj-http
22:02 brehaut: looks like the right lib. not the repo i previously used
22:02 johnmn3: .
22:02 duck1123: https://
22:02 scottj: https://
22:02 jeremyheiler: brehaut: yea, it's got almost 5x as many forks as watchers
22:02 lol
22:02 brehaut: duck1123, scottj: thanks!
22:02 johnmn3: g'day
22:18 looking for a fun clojure project to hack on... any ideas?
22:20 Raynes: Anything by that Raynes fellow. I hear he's pretty awesome.
22:22 dnolen: johnmn3: the core projects here - https://
22:24 johnmn3: mmm. I'm a novice... Any low hanging fruit?
22:24 brehaut: johnmn3: a number of the contrib core projects probably have them yeah
22:27 johnmn3: you could contribute questions to 4clojure
22:27 johnmn3: this is the canonical contrib list: http://
22:27 4clojure.. I should try using that too
22:28 dnolen: johnmn3: what type of thing would you like to work on?
22:28 johnmn3: I just did the QFTK/noir heroku thing... had a blog article on it recently
22:29 based on the noir-blog example
22:29 Though I've dabbled more in desktop apps in the past
22:32 dnolen: johnmn3: too many interesting web related stuff going on these days, noir, korma, ring, compojure, aleph, clojurescript
22:32 johnmn3: the desktop stuff that I'm aware of is mostly around tooling
22:33 brehaut: dnolen: a core.match based webforms library could be a great little project
22:34 dnolen: brehaut: that would be neat! there's a fairly gnarly fundamental issue I'm contemplating - so I'm not encourage people yet.
22:34 brehaut: dnolen: oh yeah?
22:34 dnolen: when core.match hits beta I'll push it more
22:34 brehaut: that'd be great!
22:35 dnolen: brehaut: pattern matching w/o type constriants is pretty tricky.
22:35 brehaut: core.match works in clojurescript too right?
22:35 dnolen: brehaut: yes
22:35 brehaut: ah true
22:35 dnolen: staticly typed FP languages have it easy, they constrain the types in "column"
22:35 core.match imposes no such restrictions
22:35 brehaut: so it should be possible (once aforementioned gnarl is sorted) to have a great form processing library that works on client and server trivially
22:36 dnolen: brehaut: yep
22:36 brehaut: what do you mean by 'column' ?
22:36 dnolen: brehaut: in FP langs patterns form a pattern matrix
22:37 johnmn3: are we talking about form validation?
22:37 brehaut: johnmn3: yes
22:37 johnmn3: mm
22:37 big push for non-turing protocols recently
22:38 I'd imagine match/logic can go a ways in constraining that..?
22:38 dnolen: brehaut: somef 1, somef "foo", not allowed in static typed langs as a valid pattern
22:39 brehaut: dnolen: are right. i understand you now. youd have to have something like data Foo = SomeI Int | SomeS String, and pattern matching is trivial then
22:39 dnolen: brehaut: precisely, you need to define the sum type ahead of time
22:39 brehaut: dnolen: whereas you need to infer it based on the provide rules ?
22:41 dnolen: brehaut: the problem actually arises out of how aggressively we try to optimization pattern matching
22:41 brehaut: i guess you also can never tell if you have a partial pattern too
22:41 dnolen: brehaut: we prefer that we never a run a test again.
22:42 brehaut: huh thats going to be complicated
22:43 dnolen: brehaut: sort of ... the designer of the pattern extension has to specify if their pattern can be compared w other patterns.
22:43 brehaut: interesting
22:43 dnolen: if it can't core.match creates a backtrack point
22:43 but we'd rather not do that, cuz then we're not better than case by case
22:43 johnmn3: hmm, never saw this pass my reader: https://
22:43 "A Seesaw style Clojure API for JavaFX"
22:44 dnolen: brehaut: it is pretty interesting. I'm considering disallowing arbitrary guards for example.
22:45 brehaut: arbitrary fn expressions for guards I mean. since fn comparison is undecideable.
22:45 brehaut: that makes sense
22:46 thats an interesting tradeoff there
22:46 dnolen: brehaut: it's a classic tension between, easy to use / optimizeable
22:46 brehaut: you'd have to create a backtracking point for every fn guard right?
22:46 dnolen: brehaut: yep
22:47 so I'm taking my time, I don't want to go beta without these things sorted out
22:47 brehaut: yeah fair enough
22:47 dnolen: and anything we decide needs to flow smoothly into predicate dispatch
22:48 brehaut: predicate dispatch if theres no backtracking becomes an extremely quick alternative to multimethods right?
22:49 dnolen: brehaut: yes
22:52 brehaut: dnolan: thanks for explaining this stuff.
23:10 clj_newb: I'm not sure how to expression this in words, but I will my best. Whoever decided to add Keywords to Clojure is a frickin genius. I find myself using them all over the place.
23:11 I wonder how one manages to invent stuff that previously never existed? (For example, if all humans had only one eye, how would one realize "hmm, having depth info would be imporatnt")
23:11 jeremyheiler: clj_newb: ruby has symbols, which is equivalent to clojure keywords.
23:12 clj_newb: ah; great artists steal
23:13 jeremyheiler: clj_newb: but yes, i've wished for a similar concept in java proper.
23:13 johnmn3: ibdknox: thanks for noir-blog! I used it here: http://
23:13 clj_newb: jeremyheiler: what is this Java you speak of?
23:13 jeremyheiler: *shurgs*
23:13 *shrugs**
23:13 ibdknox: johnmn3: you're welcome :)
23:13 clj_newb: I've found that due to proxy and defrecord, I have not writen a _single_ line of Java code
23:14 whenever the interop between Java/Clojure needs to change; I just kill more of the existing Java libraries and write more clojure code
23:14 Clojure is like a virus eating through the Java sources.
23:14 jeremyheiler: haha
23:15 im currently thinking about how to kill javamail
23:15 (at least the smtp part of it)
23:15 TimMc: clj_newb: In many Scheme languages, symbols do the same task as Clojure's symbols + keywords.
23:15 Xorlev: noir + GSP would be wonderful.
23:15 TimMc: It's nice to have the uses separated.
23:16 ibdknox: GSP?
23:17 Xorlev: what's GSP? :)
23:17 I assume not an international airport
23:19 Noir + the German Space Program
23:19 Xorlev: Like JSP, but with Groovy instead :)
23:19 ibdknox: ah
23:19 Xorlev: I love Clojure and Noir, but composing pages with functions bothers me (exception: HAML)
23:20 ibdknox: Xorlev: there are alternatives to hiccup
23:20 mustache, enlive, stringtemplate
23:20 metajack: autodoc and marginalia do a good job for API reference type docs, but what are people using for overview and tutorial type docs?
23:21 Xorlev: Ooh
23:21 ibdknox: metajack: github wiki's are the only standard I've seen. For a branded site you'd end up writing your own stuff though
23:21 metajack: I used markdown for noir's docs and a little DSL I wrote for Korma's
23:22 metajack: ibdknox: I was specifically thinking about Noirs docs actually :)
23:22 ibdknox: Xorlev: so you don't just have to stick with that if you prefer something else :) There are definitely cases where that's necessary
23:22 metajack: the source is on my github :)
23:22 metajack: in the noir repo?
23:22 Xorlev: Maybe I'll write a few more Noir webservices then
23:22 ibdknox: metajack: https://
23:23 metajack: and korma's docs are here: https://
23:23 Xorlev: All the cool kids are ;)
23:23 metajack: Ah, i was looking for the special github web branch in the noir repo.
23:23 ibdknox: Korma's docs are way cooler than Noir's
23:23 https://
23:24 Xorlev: ibdknox: We have one internally, but we're somewhat hesitant to start writing production webservices in Clojure given about half of our team knows FP and half doesn't.
23:25 ibdknox: Xorlev: yeah not an uncommon problem
23:25 my goal is to keep making stuff until it's a detriment not to switch ;)
23:25 johnmn3: I think I hung tryclj
23:25 ibdknox: johnmn3: loads for me
23:26 johnmn3: ah, we're back
23:26 the evaluation was hanging
23:26 Xorlev: ibdknox: I like that approach. Someone else in my office tries to push it too but I think he's also realized that writing more stuff in Clojure will eventually just force us to move there.
23:27 In general, our goal is to improve cross compilation and polyglot systems so that using the right JVM language for the right task is a no-brainer.
23:27 ibdknox: haha I meant making stuff for others, but yes, it's a good guerrilla tactic
23:27 johnmn3: send it a bad (iterate ... form and it seems to hang up for a while
23:27 ibdknox: johnmn3: it waits for a timeout
23:27 can't remember what he set it to
23:28 I have some exciting CLJS stuff that I should be showing soon
23:28 metajack: ibdknox: I like that you separated the code from the docs. Very nice. Perhaps I will try and use orgmode to do something similar.
23:29 ibdknox: metajack: it was very useful doing it that way
23:29 made it much easier
23:31 johnmn3: ibdknox: care to indulge?
23:32 ibdknox: johnmn3: I've been working on some projects that have complex interactions between visual elements and have many states
23:33 johnmn3: I've been working on a solution for that and I think I might've gotten there last night :)
23:33 johnmn3: hmm. using goog libs?
23:33 ibdknox: interestingly it's pretty much framework agnostic
23:34 it will work with whatever
23:34 though I also got fed up with the goog libs
23:34 and have a nice jQuery lib I'll release soonish too
23:35 johnmn3: nice
23:35 ibdknox: it's much easier to work with
23:35 and provides a nicer base
23:35 though I'm sure someone will disagree with me :)
23:38 johnmn3: will it work with pinot?
23:38 ibdknox: johnmn3: it will be the new pinot :) What's there now was just random throwing together of things that I wanted to explore or needed. This will be much more thought out and present a more full solution
23:39 johnmn3: nice
23:40 I wanted to try converting the navigation bar on my qftk site to cljs
23:40 that's probably trivial though
23:41 ibdknox: I will say that as I've pieced things together, I've started to like CLJS a lot more
23:42 it's definitely not for everything though
23:43 johnmn3: I still think it'd be rad to be able to do compilation in the browser
23:43 lifting the whole language into the browser
23:43 just for dev purposes
23:44 Then I could develop on the website with just my browser. Though I know I could just point a webified repl to a clojure process on the server
23:45 ibdknox: doing the latter isn't difficult :)
23:45 johnmn3: still, with an in-browser compiler, we could do things like inspect/manipulate live javascript on random pages, right?
23:46 And perhaps do interesting distributed computing things
23:48 ibdknox: you don't need it for the latter :) Check this out: http://
23:51 johnmn3: rad
23:52 * johnmn3 is also watching web-rtc (http://
23:53 johnmn3: or app-data... forgot what it was called. Not implemented yet, but provides for p2p in the browser
23:54 the audio/video part is implemented in the chrome canary build
23:55 dnolen: ibdknox: this sounds like exciting stuff!
23:56 ibdknox: dnolen: statemachines and some neat helpers around them ftw :)
23:59 I've been a bit quiet lately and will be so for the next month I suspect, but I'll have lots of stuff to debut and talk about at ClojureWest :)