#clojure log - Jun 26 2012

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:00 uvtc: Well I never! ... I just did a search at github, and had to choose the search language, and ... I couldn't believe my eyes, but Clojure was *not* listed at the top with the "Popular" languages. It was down in the "Everything Else" category of all places. Harrumph!

0:01 cgag_: i don't understand it either

0:02 * uvtc has grossly exceeded his comedy limit for the evening

0:03 cgag_: xeqi, looks like you were right, they're all clojure-agent-send-off-pool-0

0:03 brehaut: uvtc: but this is irc, you shouldnt let that stop you

0:03 michaelr525: good morning

0:05 brainproxy: anybody know of an attempt to implement the sockjs protocol with clojure / clojurescript

0:05 cgag_: i'm pretty new to anything concurrent, but it seems pretty weird that they'd all end up on the same thread

0:05 brainproxy: googling aruond but haven't found such a thing yet...

0:05 cgag_: is that like socket.io?

0:06 wingy: btw how is clojure handling concurrency? threading?

0:07 brainproxy: cgag_: yeah, sockjs is quite similar to socket.io

0:07 cgag_: as i asked that i realized i don't really know anything about socketio either

0:08 xeqi: cgag_: from what I can read, the send-off-pool is an expandable thread pool, but there must be a queue length before it will spawn a new thread

0:08 brainproxy: the idea is to provide a uniform interfaces on the client and server for sending and receiving messages over a stateful connection

0:09 if websockets is available, taht is used, but if not then ajax push, jsonp, forever iframe, or xhr is used to achieve the same effect

0:10 however, the api is transport agnostic, i.e. it works the same whatever transport is transparently and dynamically chosen when a client connects

0:12 cgag_: that does sound like it'd be nice to have

0:12 michaelr525: how should I go about finding what failed this compilation, leiningen doesn't print the end of it: https://www.refheap.com/paste/3319

0:13 from the stacktrace i understand that it failed loading one of the libraries, but when I try to manually compile the last printed library it compiles just fine..

0:13 cgag_: from what i've read about aleph, it tries to model everything using a single abstraction (channels)

0:14 normal requests

0:14 websockets

0:14 tcp

0:14 https://github.com/ztellman/lamina if you're interested

0:23 brainproxy: cgag_: i definitely intend to study aleph/lamina sometime soon... what I know so far suggests it could be a good basis for implementing a sockjs-work-a-like

0:25 wingy: is clojurescript a good web language .. it seems that clojure is not built with web development in mind?

0:26 (perhaps me only not used to seeing html + clojure syntax)

0:26 brehaut: wingy: ‽

0:26 Raynes: wat

0:26 talios: HTML isn't a good web language, so why should clojurescript not being so matter :)

0:26 brehaut: wingy: what do you mean by 'web language'

0:27 talios: lol

0:27 Raynes: Web development is probably what Clojure is used most for.

0:27 And Clojurescript compiles to Javascript.

0:27 talios: brehaut - I delurk for moments like these.

0:27 cgag_: xeqi, i just rewrote it using an agent and they still get sent to the same thread

0:28 wingy: can clojure handle as much users connected as node.js?

0:28 michaelr525: please help, how to find out the source of this compilation error: https://www.refheap.com/paste/3319

0:29 cgag_: https://www.refheap.com/paste/3320

0:29 wingy: is it spawning a new thread for each http connection?

0:29 brehaut: wingy: it depends

0:29 cgag_: i think that's how jetty handles it

0:30 brehaut: wingy: unlike node.js clojures webstack doesnt implement its own webserver

0:30 wingy: i see

0:31 michaelr525: wingy: you can'

0:31 can't compare node.js to clojure

0:31 Raynes: Sure you can. It's easy.

0:31 michaelr525: node.js is a framework written in javascript

0:32 clojure is a language

0:32 framework != language

0:32 Raynes: You should tell that to rails. :p

0:32 brainproxy: i don't really like thinking of nodejs as a framework

0:33 mboeh: People tend to use 'node.js' to refer both to the V8-based runtime and the libuv-based IO/web stack

0:33 brainproxy: it's basically a runtime built around v8, which brings to javascript many of the things the JS language just doesn't provide on its own

0:33 meaning facilities for working with the filesystem, network, etc.

0:35 mboeh: Raynes: We do everything we can to keep people from conflating ruby and rails. It's hard work :P

0:38 cgag_: i've seen quite a few people getting lectured on the difference

0:38 you guys do good work

0:39 mboeh: cgag_: Heh.

0:44 cgag_: i thinking of getting into the rails game, i want to start freelancing and unfortunately i don't think clojure has too much demand at the moment

0:45 mboeh: Funny, I'm just getting into clojure after doing ruby for ~10 years

0:46 michaelr525: please help, how to find out the source of this compilation error: https://www.refheap.com/paste/3319

0:48 cgag: i think we'd have to see some code, i can't get much out of that besides nullpointerexception

0:49 michaelr525: i cloned this: https://github.com/metadaddy-sfdc/facebook-template-clojure

0:49 cgag: 10 years of ruby, impressive

0:49 michaelr525: and then run: lein compile

0:49 https://github.com/metadaddy-sfdc/facebook-template-clojure.git

0:50 mboeh: It's taking some work to adapt my head to clojure, I feel like it's calcified a little

0:50 wingy: i feel that i rather look at clojure code than javascript

0:51 its an ugly mf .. inconsistent as hell and all that shit

0:51 somehow clojure attracts me .. i don't know quite what

0:51 michaelr525: cgag: i don't understand why lein cuts the stacktrace instead of printing the whole thing

0:51 cgag: mboeh, i think that's just how clojure is

0:52 xeqi: michaelr525: that is the whole stack trace

0:52 mboeh: wingy: It's a much more elegant way to get access to the JVM and the Java library ecosystem (than Java)

0:52 cgag: wingy, yeah, me too, it's always seemed weird to me how turned off everyone seems to be by lisp

0:53 mboeh: wingy: And nothing node has or will have for years rivals the Java ecosystem in maturity

0:53 wingy: cgag: perhaps the ()

0:53 can't whitespace indentation be used instead?

0:54 it seems that you intend for each ()

0:54 michaelr525: xeqi: thanks!

0:54 wingy: indent

0:54 michaelr525: xeqi: but why does it print ... 48 more at the bottom?

0:54 cgag: wingy, yeah that's what i mean though, i've always kind of liked the parens

0:55 mboeh: The C-expressions don't bug me in Clojure. I've come to the conclusion that they're the best approach for functional languages

0:55 xeqi: it refers to the 48 lines of stacktrace above

0:55 clojurebot: Excuse me?

0:55 xeqi: I don't konw why java does it that way

0:55 michaelr525: oh

0:55 interesting

0:56 mboeh: I like Lisp syntax a lot more than Haskell's, for example

0:56 michaelr525: so, how do i go about debugging this shit to find out why it fails? :)

0:57 mboeh: but I do like the few bits of syntax Clojure adds for sequence literals

0:57 amalloy: wingy: nobody wants to have to indent (+ 1 2) as + RET TAB 1 RET TAB 2

0:57 xeqi: thats a hard one

0:58 mboeh: not having a literal syntax for hashes/maps drives me bonkers

0:58 xeqi: does just running `lein run` work?

0:58 michaelr525: yeah

1:04 wingy: true

1:04 haha

1:05 michaelr525: xeqi: actually on lein 1.7 when I 'lein run' it prints the compilation stacktrace but then goes on and runs the app. but on lein 2.0 it stops after the compilation error

1:08 xeqi: did you write to the .env file?

1:10 JulioBarros: Foolishly :) tried to update my project, did a lein clean and now I get "Caused by: java.io.FileNotFoundException: Could not locate ring/middleware/head__init.class or ring/middleware/head.clj on classpath:"

1:10 Any ideas anyone?

1:10 xeqi: JulioBarros: what version of ring are you including?

1:11 JulioBarros: I'm trying to use noir and friend ... so am not sure.

1:11 Raynes: My bet is that he just updated to noir 1.3.0-beta10.

1:11 He is the second person to report that today. Damn it. Looking into it.

1:11 JulioBarros: Raynes: yes. yes. I did.

1:11 michaelr525: xeqi: nope.. didn't write to the env file

1:12 Raynes: I broke everything yesterday. Decided you all shouldn't use Noir.

1:12 ;)

1:12 michaelr525: but it's for heruko, as far as i understand

1:12 JulioBarros: Cool. Thanks. :)

1:12 Any workaround? Beta9?

1:12 xeqi: the .env is for running locally

1:13 Raynes: JulioBarros: You can hop back to beta9 or wait 5 minutes while I figure out what is wrong and push beta11.

1:13 JulioBarros: Raynes: Thanks.

1:13 xeqi: heroku uses the env vars from the config:add section

1:13 michaelr525: i changed the source and replace the env var references with strings

1:13 replaced

1:14 and it is actually working fine so far, just this compilation error pops up when i try to create a war file using 'lein ring'

1:16 uvtc: technomancy: nice followup on the ML re. docs! Thanks.

1:17 michaelr525: xeqi: from the stack trace i understand that it fails when it is trying to loading something referenced from clj_facebook_graph.auth$loading__4784__auto__.invoke(auth.clj:1)

1:18 which in turn loaded because it's refernced from facebook_template_clojure.core$loading__4784__auto__.invoke(core.clj:1)

1:18 so i checked out clj_facebook_graph and compiled it and it compiled just fine

1:20 Raynes: JulioBarros: Can you paste your project.clj on refheap for me?

1:20 clj_newb_209435: besides apple's 17" mbp, is there any decent 17" laptop?

1:22 JulioBarros: Raynes https://www.refheap.com/paste/3322

1:25 uvtc: clj_newb_209435, these folks have nice laptops http://laclinux.com/gnu/Laptop , though no 17-inch ones listed. Maybe they could get you one though?

1:25 Raynes: JulioBarros: Give me the output of `lein classpath`.

1:26 JulioBarros: Raynes https://www.refheap.com/paste/3323

1:27 Raynes: JulioBarros: What version of lein?

1:27 JulioBarros: 2

1:27 Raynes: Which preview?

1:28 JulioBarros: Leiningen 2.0.0-preview6 on Java 1.6.0_33 Java HotSpot(TM) 64-Bit Server VM

1:28 Raynes: Yeah, this isn't a noir problem.

1:28 xeqi: JulioBarros: `lein deps :tree` ?

1:28 Raynes: The problem is that some of your dependencies has a transitive dep on an old version of ring that didn't have that middleware and for some reason it is ending up on the classpath instead of the new verison.

1:28 xeqi: Already did it ^

1:28 xeqi: ah

1:29 Raynes: JulioBarros: Find which of your deps uses a ring-core version older than 1.1.0 and add an :exclusion to it.

1:29 JulioBarros: I had the same problem just now with refheap and amalloy's mongo-session and adding the exclusion fixed it. I'll talk to techomancy about it tomorrow.

1:29 AFAIK, the newer version should be preferred.

1:30 amalloy: Raynes: no, because maven is stupid

1:30 JulioBarros: Raynes: lein deps :tree -> https://www.refheap.com/paste/3324

1:30 Raynes: Thanks. I'll look for the dep.

1:30 Raynes: amalloy: I'm not sure why this would be happening all of a sudden right now with that version of leiningen though.

1:30 amalloy: there's no particular bias for newer versions, only for the one specified in your project.clj vs by some dependency

1:31 Raynes: JulioBarros: Looks like friend is the culprit.

1:31 JulioBarros: Your deps :tree output shows it.

1:31 amalloy: it could be because lein2 uses aether, but more likely the lein version doesn't make a difference

1:32 Raynes: amalloy: Okay, fair enough. Update your library.

1:32 This exclusion is an eyesore.

1:32 amalloy: Also, this doesn't happen with lein1. It fetches the right ring core. *shrug*

1:33 Or at least something closer. 1.1.0 vs 1.1.1, which is the newest.

1:33 I guess dependency resolution is random.

1:33 Which is excellent for a dependency manager, right? Right? RIGHT>

1:34 Anyways, I'm off.

1:37 JulioBarros: Raynes: Thank you. That did it.

1:50 gert: hi all - `range` has an (optional) "end" parameter, that is exclusive. So (range 1 5) returns (1 2 3 4). Could anyone tell me what the rationale is behind that? I would expect to see (range 1 5) to return (1 2 3 4 5)...

1:51 michaelr525: i think it's there to motivate people to ask this question :) I've seen it asked a few times before

1:52 though i don't remember the answer

1:52 hehe

1:52 maybe it has something to do with zero base/one based

1:52 wingy: light table looks so cool

1:53 oh no .. its using flash??

1:53 lazybot: wingy: What are you, crazy? Of course not!

1:53 gert: thanks michaelr525 :) I'm still puzzled :)

1:54 wingy: oh no its not

1:54 thank god

1:58 amalloy: gert: same reasons that substring, etc, have that sort of behavior - it's convenient to know that (range m n) has n-m items, for one thing

2:00 xak466: hi, i am a complete noob in clojure and I'm trying to do some macro stuff. could someone please look at this pastebin http://pastebin.com/brxfRZHS and let me know what I'm doing wrong?

2:04 gert: that's a good point amalloy

2:27 antares_: kab3wm: you at least need to force evaluation of query in get-results

2:27 oops

2:29 eck: this is actually a korma question, but does anyone know if there's a way to do a custom operator with korma?

2:29 i'm trying to get korma to generate postreges' @@ operator for full text search

2:30 i think i could simulate it with raw but then i need to figure out how to do my own escaping

2:39 michaelr525: err

2:40 i traced my compilation problem to this line: https://github.com/maxweber/clj-facebook-graph/blob/master/src/clj_facebook_graph/client.clj#L108

2:40 it makes the clojure compile to NPE with this stacktrace: https://www.refheap.com/paste/3325

2:41 can anyone please take a look at that code?

2:57 antares_: possibly #'clj-http.core/request is not defined because clj-http.core/request no longer exists or is not loaded

2:58 michaelr525: hmm

2:59 i removed (defn get..) and it compiles ok

3:02 antares_: that ns replaces clojure.core/get and does not use :refer-clojure

3:02 there should be at least warnings about that during compilation

3:02 michaelr525: there is a warning

3:03 antares_: they need to add (:refer-clojure :exclude [get])

3:03 so I guess this affects macro compilation

3:03 michaelr525: oh

3:03 to add it in the ns declaration?

3:05 antares_: yes

3:08 michaelr525: antares_: thanks!!!

3:08 note to self: next time pay more attention to compiler warnings :)

3:34 _ulises: I'm having trouble understanding the differences between midje's :facts and :contents in backgrounds

3:36 but perhaps this is to do with me using (facts ...) and not (fact ...)?

3:36 I mean, more specifically, I start my noir server before each test, and stop it after each test

3:37 however, if I start the server using :facts instead of :contents, then the server is started twice (I have 3 checks inside (facts...)) instead of once

3:37 Raynes: antares_: Hi

3:37 antares_: Raynes: hi

3:37 Raynes: antares_: I commend you for supporting mongo URI stuff.

3:38 * antares_ is in awe

3:38 Raynes: antares_: If you've ever got 30 minutes and are feeling bored, I'd love a patch to use monger in refheap.

3:38 My mongo usage is pretty simple, so such a patch shouldn't be difficult.

3:38 antares_: Raynes: haha, ok, maybe next weekend

3:39 Raynes: ;)

3:39 I do this sort of thing to technomancy all the time.

3:39 He never actually takes the bait.

3:39 antares_: I have some loose ends to tie before going on vacation on July 1st

3:39 Raynes: you don't know me :P

4:41 wingy: hey

4:42 is the best way to install clojure on mac using brew?

4:42 or download it from clojure.org?

4:42 talios: brew's probably the easiest way

4:42 also use brew to install lein

4:43 wingy: cool

5:02 anyone having brew install leiningen getting stuck?

5:02 seems to not installing

5:10 oh i run it as sudo which you cant

5:18 is it something wrong with running java 1.7 and lein?

5:18 it freezes all the tim

5:18 e

5:19 oh it works

5:19 had to press ENTER since i was running it as root

5:28 amalloy: brew is maybe an acceptable way to install lein, but i do not recommend running any of that as root. just follow the readme: https://github.com/technomancy/leiningen/blob/master/README.md

5:28 Raynes: Brew is a fine way of installing Leiningen, if a little pointless.

5:30 * ro_st has a look at shoreleave

5:33 michaelr525: i am hungry

5:33 maybe wrong channel

5:33 ;)

5:35 * talios sips Tom Yum soup

5:35 * talios doesn't share tho :)

5:41 wingy: amalloy_: i installed with no root

5:41 it says: Error: Failed executing: /usr/local/Cellar/leiningen/1.7.1/bin/lein self-install (leiningen.rb:12)

5:41 im on java 1.7

5:42 Raynes: why is it pointless

5:49 ro_st: wingy: have you tried Installation on https://github.com/technomancy/leiningen/wiki/Upgrading

5:53 antares_: Just pushed Monger 1.0.0 (final) to clojars: https://github.com/michaelklishin/monger/blob/master/ChangeLog.md, http://clojuremongodb.info

5:56 wingy: ro_st: its recommended to use 2 preview already?

5:57 ro_st: works fine for me

5:58 antares_: are you michaelklishin?

5:58 antares_: ro_st: I am

5:59 ro_st: awesome :-) i'm the guy who asked about DBRefs

5:59 thanks for monger. awesome bit of kit.

6:00 antares_: ro_st: ah, hi :)

6:00 ro_st: i bumped up against the _id for newly-inserted-document issue yesterday. i recommend putting a paragraph into your Inserting guide about it

6:01 know what i mean?

6:01 wingy: wii

6:01 its creating README.md file .. with extension now

6:02 but the startup time is slow as hell compared to node.js

6:04 antares_: ro_st: yes, I am watching google search queries and that one is one of the top

6:04 I will add a subsection in Getting Started and Inserting Documents guides

6:04 ro_st: awesome

6:10 wingy: clojure can do banking systems?

6:10 games like StarCraft 2?

6:11 curious about the power and security of it

6:15 antares_: wingy: there are at least two banks + some groups at amazon using clojure

6:15 security is, well, JVM security

6:16 _nmmn: yeah, imagine java capabilities + more

6:16 antares_: and I don't think security is defined by the language, although JVM and .NET security models help a lot in some cases

6:16 but security flaws are most commonly application problems

6:17 wingy: how about games

6:17 antares_: also, I believe a few trading companies were some of the earliest adopters

6:17 wingy: since native games and banking is something javascript can never do

6:17 coming from javascript

6:17 antares_: I am not aware of any use in gaming but you can use just about anything on good VMs for game servers

6:18 wingy: i mean i usually dont see a game written in java

6:18 antares_: I think Erlang has an edge for gaming on everything else but if you want JVM interop, Clojure is one of top 2-3 choices (given that your team is open to learning new things)

6:18 llasram: wingy: Minecraft?

6:18 wingy: popular games like StarCraft

6:19 :)

6:19 antares_: wingy: game clients are not, they are usually C++ core + something like Python, Lua and now increasingly Ruby and JS for logic and DSLs

6:19 _nmmn: yes, dont really think clojure would be much usefull in gaming

6:19 antares_: but game servers these days are in just about everything

6:19 adben: wingy: not agree http://fivedots.coe.psu.ac.th/~ad/jg/

6:19 _nmmn: c++ is best choice

6:20 antares_: there are two reasons for C++: you want to take advantage of the edgiest hardware (this is really only possible with low-level APIs) and you also can't afford GC pauses in some areas

6:21 responsiveness is the key for players, at least in "hardcore" games

6:27 wingy: nice thing i dont wanna create games

6:27 more like high security systems

6:35 ro_st: antares_: doesn't simple.com use clojure?

6:36 antares_: ro_st: I heard that they do now for some things, but they are mostly Scala and Ruby?

6:36 not sure

6:37 ro_st: ah ok

6:37 man i wish we had something like simple.com here (in South Africa)

6:37 looks like a great service

6:39 dbushenko: hi all!

6:39 Raynes: Wish we had it in the US too. It has been invitation only since the beginning of time itself.

6:40 dbushenko: when I create a noir project with leiningen 2, then set the noir version to 1.3.0-beta10, it throws exception: Exception in thread "main" java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64, compiling:(codec.clj:1)

6:40 what's wrong with it? when I set the version to beta4, it runs ok

6:42 ro_st: does lein2 deps fix it?

6:43 dbushenko: no...

6:46 ro_st: quickest is probably to file a github issue

6:56 dbushenko: ro_st, do you able to create a noir-1.3.0-beta10 project?

6:56 ro_st: i haven't tried :-)

6:56 dbushenko: can you give it a try? it's easy: lein new noir myapp, then go into myapp and set the noir version to 1.3.0-beta10

6:57 then just 'lein run' in this directory

6:59 wingy: are there many clojure devs world wide?

6:59 ro_st: dbushenko: that's with lein 1

6:59 wingy: is it easy to hire people

6:59 ro_st: wingy: better to find polyglots and train em up

6:59 dbushenko: ro_st, no, I'm using lein2

7:00 wingy, yes, especially if telecomutting is an option for you

7:01 wingy, are you hiring?

7:03 wingy: nope

7:03 _nmmn: define many, wingy

7:03 antares_: wingy: at this point, it is not too hard. Last couple of clojure conferences in US and Europe had hundreds of attendies, I think

7:05 wingy: _nmmn: when i wanna hire, then i succeed

7:06 _nmmn: depends how much you can spend ;]

7:19 dbushenko: guys, does anyone have troubles compiling a noir application of noir-1.3.0-beta10 ?

7:19 clojurebot: Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..."

7:21 antares_: wingy: you won't get 50 applicants but those 5-10 that you will are likely to be pretty good.

7:23 _nmmn: agree, you dont look at big/cheap mass, but rather highly skilled people set

8:18 clojure-newcomer: hi guys, I am getting a load of failed requests load testing a composure restful web service with minimal concurrency and requests… its the simplest of hello world examples… any ideas ?

8:18 *compojure

8:20 I am using ab, and setting concurrency to 5, requests to 50

8:23 antares_: clojure-newcomer: are you on OS X?

8:23 clojure-newcomer: hi, yes I am

8:23 antares_: OS X has broken ab which drops connections with concurrency level > 5 or so

8:24 you have to build it from source

8:24 clojure-newcomer: nuts

8:24 thanks for the heads up

8:24 maybe I'll break out curl loader

8:24 mccraig: technomancy: i'm seeing '; Evaluation aborted.' in slime-repl for some exceptions with lein-2 & lein-swank-1.4.4… the exception is stored in *e, and is a java.lang.Exception according to (.getClass *e) : is this a known problem ? i couldn't find a current bug report...

8:25 antares_: clojure-newcomer: https://gist.github.com/2046014

8:25 clojure-newcomer: antares_: thanks!

9:12 tyre77: if I'm taking in three strings to a function and want to make them integers, how do I reassign them to those variables

9:12 I can do this to get ints: (map read-string (lat lng dist))

9:14 but now how can I get their values back into lat lng and dist?

9:15 duck11232: ,(Integer/parseInt "7")

9:15 clojurebot: 7

9:16 tyre77: will that reassign the var?

9:18 duck11232: in clojure, you don't really re-assign variable. You could let assign that to a different variable (passobly with the same name)

9:19 (fn [lat long] (let [lat (Integer/parseInt lat) long (Integer/parseInt long)] {:lat lat :long long}))

9:24 hyPiRion: duck11232: Or even better: (fn [lat long] {:lat (Integer. lat), :long (Integer. long)})

9:25 ro_st: midje-mode for emacs is awesome!!

9:26 maaruks: speclj ?

9:26 duck11232: ,(Integer. "4")

9:26 clojurebot: 4

9:26 duck11232: There was a problem with (Integer. ) but I can't remember what it was.

9:27 ro_st: a question about :use vs :require. it seems i have to alias ns's when using :require, where with :use i can just refer to it and have all that ns's symbols arrive. is there a way to use :require without aliasing?

9:27 mmajchrzak: Hi is there any mature web framework for clojure ?

9:27 ro_st: or perhaps i misunderstood cemerick's advice yesterday

9:28 define mature?

9:28 duck11232: ro_st: My problem with midje-mode is that it still can't pick out a single fact if it's not at the top level. All my tests are wrapped in a macro that sets my test environment. midje-mode still runs the entire namespace

9:28 ro_st: well tested and widely used? probably noir

9:28 maaruks: (:require clojure.set)

9:28 ro_st: yeah i noticed that. i had my fact forms grouped into (facts …)

9:29 mmajchrzak: noir is like sinatra for ruby right ?

9:29 ro_st: maaruks: thanks. i had the ns inside a vector before

9:29 mmajchrzak: kinda

9:29 duck11232: Compojure is like sinatra, I think. I don't know what noir is like

9:30 ro_st: true. and ring is like rack

9:30 duck11232: it's all layers

9:30 ro_st: yup. compositions of simple functions.

9:31 mmajchrzak: Do you know any real world web application written in noir ?

9:31 ro_st: mmajchrzak: http://dev.clojure.org/display/community/Clojure+Success+Stories

9:32 https://www.readyforzero.com/ is on Noir

9:32 as mentioned at the top of the readme here https://github.com/ibdknox/noir

9:32 maaruks: londonclojurians.org

9:33 ro_st: man i wish i could attend something like that

9:33 that's the price you pay for living in a flyspeck coastal town :-)

9:33 duck11232: don't you use (background) for configuring your test env?

9:34 duck11232: I used to use background, but it wasn't setting my environment appropriately

9:34 ro_st: eg, mine is (before :facts (do (set-test-db) (add-fixtures)) :after (clear-fixtures))

9:34 ah

9:34 in this case it's with Monger, which works a charm

9:35 duck11232: https://github.com/duck1123/jiksnu/blob/54b6f546a9640111967a209b0d4e6ee58521c461/test/jiksnu/test_helper.clj

9:37 ro_st: crikey duck1123. this is a LOT of code. how long you been at this?

9:37 duck1123: quite a while

9:37 I'm building a social networking application. I have one running at renfer.name

9:38 ro_st: cucumber-clojure as well. nice

9:38 maaruks: I want to connect from slime to my clojure program. I guess I need to include swank-clojure and start it somehow. Any idea how to start swank from clojure code ?

9:38 duck1123: I think this project will be 2 years in october. (or is it 3?)

9:38 ro_st: maaruks: lein swank

9:38 you need lein-swank deps'd in

9:39 duck1123: you must really be feeling the :require every-damn-thing pain!

9:39 duck1123: or call the start-server in your code, like so https://github.com/duck1123/ciste/blob/master/ciste-service-swank/src/ciste/service/swank.clj

9:39 maaruks: great, thanks

9:40 duck1123: I've developed patterns for what to require, buyt yeah, it can be a pain. I've been going through lately and trying to get rid of the last of my naked uses, but there is just so much code

9:42 ro_st: i wonder why clojure-mode doesn't have magic in it to clean imports up

9:42 wouldn't that be nice :-)

9:42 duck1123: there's slamhound

9:42 tyre77: @duck1123 okay I have this: (defn boundaries [lat lng dist] {:lat (Integer. lat), :lng (Integer. lng), :dist (Integer. dist)}), which returns {:lat 1, :lng 2, :dist 3}

9:42 duck1123: never had much luck with it though

9:43 tyre77: that's a hash, right?

9:43 duck1123: tyre77: yes

9:45 tyre77: if I use fn instead of defining it like you did, it will just pass them in once and be done?

9:46 duck1123: right, you don't really need to use let unless you need to store it (and use it multiple times) It's also clearer, but most uses of let can be avoided. In this case, you just want to incorporate it into the end result, so there's no need for let

9:48 I guess that's pretty much true for most languages. You don't really need to assign it to a variable if you're willing to work with one big long complecated statement

9:48 tyre77: ooooh okay

9:49 I'm sorry, this is completely different than anything I've ever seen, but super cool!

9:49 duck1123: It takes a bit to break yourself of the habit of "I'll just change this variable"

9:50 ro_st: i usually use let forms when i want to inspect values at a breakpoint

9:50 or when a value will be used more than once

9:50 tyre77: so basically my problem is that I'm gettting three strings but have a function that takes them and treats them as numbers

9:50 RickInGA: ro_st: breakpoint? how do I get breakpoints in clojure?

9:51 ro_st: i use emacs and clojure-mode

9:51 RickInGA: it has a debugger?

9:51 duck1123: it's built into the newer swanks

9:51 ro_st: when doing so, you can put (swank.core/break) anywhere

9:51 RickInGA: wow, I have some research to do!

9:52 ro_st: it'll act as though an exception was thrown at that point, but the locals are populated

9:52 duck1123: I've never had much luck with debugging clojure. I just stick with log/spy

9:52 ro_st: you can even use it in a let form

9:52 it is HUGELY useful

9:53 RickInGA: how do you read the values that are stored in the locals? Is there a locals window?

9:53 duck1123: the last time I tried, it was far less mature. perhaps I'll give it a try tonight

9:54 ro_st: RickInGA: http://rationalist.co.za/uploads/Screen%20Shot%202012-06-26%20at%203.53.43%20PM-PJGRrrPTE0.PNG

9:54 simple as that

9:54 RickInGA: ah, I get it... thanks!

9:54 ro_st: expand that element in the stack

9:55 i have (swank.core/break) set up as a snippet scb<TAB>

9:55 i use midje facts to get code written, and scb to figure out why i suck at clojure

9:55 and unsuck myself just a little bit :-)

9:56 RickInGA: midje facts = bdd?

9:56 ro_st: kinda

9:57 RickInGA: I have been using clojure.test, does midje add a lot?

9:57 duck1123: it adds enough that it's worth it to give it a try IMO

9:57 ro_st: it's a cleaner syntax

9:57 duck1123: I love the addition of every-checker

9:58 ro_st: (fact (code that does something) => predicate)

9:58 (fact (+ 1 2) => 3) ; yep (fact (+ 1 2) => 4) ; nope

10:02 what i love is that i'm testing my mongodb api for a collection. i'm generating fixtures, switching to and setting up and tearing down the test database, and testing the api 4 fns with 14 facts in under 100 lines

10:02 duck1123: midje also has built in support for mocking out other functions

10:16 tyre77: is there the equivalent of a splat function? I have a list of three things and want to pass the items into a function

10:17 foxdonut: tyre77: apply

10:17 scriptor: tyre77: apply

10:17 foxdonut: jinx!

10:17 you owe me a Coke.

10:18 scriptor: :)

10:21 antares_: ro_st: by the way, anything else you want to see in Monger 1.1?

10:21 borkdude: jinx or juxt?

10:24 ro_st: antares_: whoa. way to early to tell. i'm still brand new to clojure, mongo and monger :-)

10:24 as a total newbie, i was able to get started damn quickly. one or two sticky points which reading the docs cleared up

10:26 one thing that i had to experiment with to realise was that you can nest fieldnames in symbols

10:26 eg

10:27 (mc/find-maps { :metadata.status "active" }) instead of { :metadata { :status "active" }}

10:27 you might want to include a note about that in your query docs

10:28 tyre77: god damn it works, thanks everybody!

10:29 antares_: ro_st: well, the idea is that monger queries work like mongo shell

10:29 but ok, I will add a few examples

10:29 nesting is typically used with strings but it is fine to use symbols

10:29 duck1123: Monger has been a very nice library. I just recently finished making the switch after using Karras. Ended up breaking everything and made me realize I didn't have anywhere near enough tests

10:30 antares_: duck1123: hehe. Let me know if you have any ideas for 1.1, we released 1.0.0 earlier today

10:30 also, I encourage everyone to join the mailing list: http://groups.google.com/group/clojure-mongodb

10:31 ro_st: antares_: what do you have planned for 1.1 so far?

10:31 duck1123: Do I report things for validateur to you? I expected presence-of to not complain if my value was false, but it did

10:34 antares_: ro_st: hopefully I will find a way to make monger.factory (not documented because it is almost guaranteed to change) not suck

10:35 ro_st: what does that do, broadly speaking?

10:35 antares_: and then there are DBRefs support, better support for validations and probably various mongodb 2.2 features I am not aware of yet

10:35 it lets you define test data

10:35 and seed it

10:36 for tests

10:36 ro_st: yum. literally doing that right now

10:36 lemme throw a paste at you

10:36 you can probably poke several holes in it

10:36 antares_: but I am not too happy about what it ended up being in practice

10:37 duck1123: you guys might want to check out my clj-factory library

10:38 antares_: duck1123: I'm aware of it, it's nice

10:43 wingy: what is the relation between a form and a function?

10:43 ro_st: a form is the whole thing, a function is something that can appear in function position (position 0) in a list

10:43 antares_: wingy: form follows function? ;)

10:44 duck1123: a form is a series of statements. A function is an object that can be invoked with parameters and executes a form

10:44 TimMc: Series of statements? No.

10:44 ro_st: valid forms: true [1 2] {:a "thing"} 1 "five" '(3 4) (defn foo [] "bar")

10:45 antares_: wingy: forms are functions, expressions, special s-expressions (this :is "an" s-expression), basically

10:45 TimMc: A form is an expression. A (do ...) block can contain multiple forms.

10:45 scriptor: (if true a b) is also a form

10:45 duck1123: yeah, should be singular, technically

10:45 antares_: duck1123: expressions, not statements

10:45 wingy: ok form is the expression

10:45 scriptor: stay away from the word "statement" though

10:45 wingy: function is the function :)

10:45 TimMc: Forms may be composed of other forms.

10:46 scriptor: I usually refer to the "if form" in clojure, as opposed to "if statement"

10:46 wingy: so this is one form: (fn-a :value1) and this is another: (fn-a :value1 :value2)

10:46 TimMc: right

10:46 and :value is a form as well.

10:46 ro_st: as is fn-a

10:46 wingy: crazy that the book im reading isn't giving me the basics like this

10:46 TimMc: A read'able unit.

10:46 ro_st: which book, wingy?

10:46 wingy: Clojure in Action

10:46 ro_st: clojurebook.com++

10:46 antares_: wingy: think of forms as s-expressions for now. s-expressions is anything between parentheses. There are special forms (like do) that Clojure compiler handles, they are not implemented in Clojure. Then there are functions, macros and forms you build from those.

10:46 ro_st: and joyofclojure.com++

10:46 AWizzArd: The words "form" and "expression" are not the same.

10:47 TimMc: AWizzArd: True, they have different numbers of letters.

10:47 AWizzArd: And meaning.

10:47 antares_: wingy: that book is a bit outdated. Clojure Programming from O'Reilly is the best in explaining things like that, very high signal/noise ration and it is easy to follow.

10:47 TimMc: Example of disjunction?

10:47 ro_st: AWizzArd: the difference, then?

10:47 AWizzArd: A form is any object meant to be evaluated.

10:48 cshell_w: Yes, Clojure Programming is the best

10:48 wingy: ill read that one later or perhaps before

10:48 ro_st: wingy: or instead of. don't waste your time with old information

10:48 antares_: AWizzArd: I am not trying to give the most precise definition, just something for a newcomer to hold on to for now

10:48 wingy: "a form is something meant to be evaluated" is a good definition, by the way

10:48 function is just one case of that

10:49 wingy: but that one is from 2011

10:49 how can it be oudated

10:49 outdated

10:49 antares_: but you can also evaluate numbers, strings, regex patterns, etc

10:49 ro_st: that's 20% of clojure's lifetime

10:49 ago

10:49 antares_: wingy: it covers clojure 1.2

10:49 AWizzArd: In (let [a 10, b 20] (+ a b)) the parts "a 10" and "b 20" are not meant to be evaluated.

10:49 antares_: so most of the info is not outdated but enough is to not recommend it

10:49 ro_st: wingy: trust me. clojurebook.com. go. now.

10:49 AWizzArd: Those are expressions and subexpressions, but not all of them are forms or subforms.

10:49 Forms are expressions that you mean to run as code.

10:50 wingy: ro_st: ok!

10:50 fuck i hate ditching something .. but ok i trust you!

10:50 TimMc: AWizzArd: Ah, you are drawing a pre-/post-macroexpansion distinction.

10:50 I can see that.

10:50 antares_: tutorials and books on young technology often get a bit outdated in 2 years

10:50 fortunately, even 1.2 => 1.3 changes are not drastic

10:50 RickInGA: I read clojure in action, I liked it. I would reccomend clojure programming from oreilly though, hands down. clojurebook.com

10:50 antares_: and 1.3 => 1.4 upgrade went with only 1 change in 20+ libraries and apps for me

10:50 AWizzArd: I had an email conversation with Kent Pitman some years ago. He was in the committee that specified Lisp, and he explained me the difference between forms and expressions.

10:51 TimMc: AWizzArd: I would actually reverse those terms, though. :-)

10:51 ro_st: wingy: i've read all of clojurebook. it got me solidly into clojure

10:51 AWizzArd: Another example was: (defun foo (x) (declare (fixnum x)) (+ x 3)) Here the (fixnum x) is a hint for the compiler, but nothing to eval, so (fixnum x) is not a form.

10:51 wingy: antares_: how can i have that confirmed?

10:52 antares_: wingy: confirmed what?

10:52 wingy: that Clojure In Action 2011 covers the 1.2 only

10:52 antares_: wingy: I am telling you that

10:52 I've read all of the books on Clojure

10:52 wingy: how do you know?

10:52 ok

10:52 antares_: wingy: I read it and I've lived through 1.2 => 1.3 migration in 2011

10:52 that's how

10:53 wingy: ok .. 1.3 pretty new and now we are at 1.4 already

10:53 antares_: the last chapter in Clojure in Action is genius

10:53 wingy: oh

10:53 antares_: but it is not really for newcomers :)

10:53 wingy: should i read it?

10:53 ok

10:53 antares_: Clojure Programming is a much better choice for newcomers if you ask me

10:53 wingy: + its outdated .. ill stick with Clojure Programming then

10:53 antares_: wingy: once you get comfortable enough to write first simple macros, absolutely

10:54 wingy: so i should never read this book again since its oudated?

10:54 antares_: today, it probably will have the opposite effect of confusing you

10:54 wingy: no, I am not saying it is not worth reading

10:54 it just should not be your first book on Clojure

10:55 the Joy of Clojure is another book that is remarkably good but definitely not for newcomers

10:55 RickInGA: It is nice having access to different books, each explains things a bit differently

10:55 ro_st: your first book should be one that is true for today

10:55 wingy: ok .. im on it

10:55 antares_: what ro_st said, plus, if you start with 1.3, you won't have any problem upgrading to 1.4 and probably 1.5

10:55 wingy: thx for the book recommendation

10:55 ro_st: CiA and Joy are full of great stuff, but require discernment from the reader to realise when things might not be true any more, or to know how to verify things for yourself

10:56 gtrak: JoC takes a long time to actually read and understand, I had to backtrack a lot, but it was fulfilling

10:57 wingy: wow it was newly written? 2012

10:58 mhanson: So what is the best Clojure book for newcomers?

10:58 wingy: http://www.clojurebook.com/

10:58 RickInGA: clojure programming

10:58 cshell_w: Clojure Programming

10:58 mhanson: I'm reading JoC right now and I'm not finding it too confusing.

10:59 ro_st: wingy: that one was released 6-8 weeks ago. i started with clojure because i saw it on HN

10:59 mhanson: clojurebook.com, definitely

10:59 wingy: pretty cheap

10:59 35 dollars

11:03 mhanson: Sweet. Thanks.

11:03 ro_st: i also highly recommend watching rhickey's simple-vs-easy and are-we-there-yet talks

11:05 RickInGA: what libraries do you use to create clojure web services? compojure?

11:05 ro_st: yes

11:06 foxdonut: antares_: even Practical Clojure? that one was awful.

11:06 ro_st: ring and compojure

11:06 RickInGA: does noir add anything for web services/rest?

11:07 borkdude: http://stackoverflow.com/questions/2578837/comparing-clojure-books

11:07 ro_st: and i'm using ring.middleware.format to json-ify incoming and outgoing data at the ring handler

11:07 so that all my handlers use clojure data structures internally

11:07 * nDuff actually didn't like Clojure in Action at all

11:07 ro_st: RickInGA: you don't need noir

11:07 RickInGA: ro_st: thanks.

11:08 at atlanta clojure group last night, folks were suggesting we play with webservices next month, and I thought it was a great idea, but I have no idea where to start.

11:08 nDuff: ...fully agree with the recommendations for Joy of Clojure and Programming Clojure (the O'Reilley book, not the pragprog one)

11:09 RickInGA: clojure programming = oreilly, programming clojure = pragmatic programers.

11:09 ro_st: having features you want to implement is a great help to focus you, RickInGA

11:09 borkdude: each books has pros and cons.. for example, I like some diagrams from Practical Clojure very much ;)

11:09 RickInGA: ro_st: no doubt

11:10 antares_: foxdonut: I don't think it was awful, it explained some things pretty well, like some concurrency topics

11:10 ro_st: RickInGA: feel free to msg with questions if you like. all this stuff is in ram at the moment :-)

11:10 borkdude: I find the maze example in clojurebook hard to read, code is really dense, want to split it out into some functions to see what they are doing, but the book could have done that for me

11:10 etc

11:10 treehug: RickInGA: web services as in soap or as in rest?

11:10 ro_st: soap yuck

11:11 antares_: RickInGA: compojure or noir

11:11 RickInGA: noir does add nice things and has low overhead. I'd probably start with noir even if I had to build a :JSON in, JSON out: kind of service without any Web UI

11:11 RickInGA: treehug: Rest, I would think. We are want people to enjoy the meeting

11:11 foxdonut: nDuff: the pragprog one does have a second edition

11:12 borkdude: writing books is very time consuming, I'm happy that people are doing this for us… pick the good parts from all of them

11:13 duck1123: While it's not as used as much, I'd love if people tried out Ciste for their web apps and gave feedback

11:13 RickInGA: borkdude: /agree

11:13 foxdonut: borkdude: +1

11:13 (inc borkdude)

11:13 lazybot: ⇒ 3

11:13 foxdonut: *g*

11:13 RickInGA: duck1123: what is ciste?

11:14 duck1123: RickInGA: The framework I wrote for my needs https://github.com/duck1123/ciste

11:14 treehug: duck1123: looks interesting

11:14 foxdonut: writing a *good* computer book is *very* hard.. and when it's well done, reading it makes it look like it was easy to write!

11:15 duck1123: It lets you create views for different formats, but it does assume most of your data is in records

11:15 wmealing: duck1123, see private message

11:15 wingy: wii now i can read it on my ipad

11:16 duck1123: I'm working on the next major push and I need to fix the travis build

11:17 treehug: duck1123: are you pretty happy with jayq versus goog.dom.query? (just looking at the cljs parts atm)

11:18 wingy: wow feels great to have a book that is uptodate .. it even mentions clojurescript

11:18 wmealing: wingy, which book ?

11:18 duck1123: you know, I've only done a tiny bit with cljs, jayq was fine for what I needed and at the time, there were issues with query

11:18 wingy: Clojre Programming

11:18 by Oreilly

11:18 foxdonut: wingy: you got the ebook just now?

11:19 wingy: yeah

11:19 foxdonut: cool

11:19 wingy: 35$

11:19 cheap cheap

11:19 foxdonut: gah, I got it for 1/2 price ;)

11:19 wingy: how?

11:19 clojurebot: with style and grace

11:20 ro_st: orielly drm-free day wasn't it?

11:20 foxdonut: I attended O'Reilly's webinar by one of the authors (cemerick)

11:20 they gave a coupon at the end

11:21 strangely the coupon was good for print or ebook, but not the combo (??)

11:21 treehug: duck1123: yeah i struggled a bit yesterday with goog.dom.query

11:22 borkdude: http://shop.oreilly.com/product/0636920025139.do

11:23 How is Raynes his book coming along (or should I better not ask?)

11:23 foxdonut: good question

11:24 hope he's not yet another victim of the "sure I can write a book!" syndrome

11:24 duck1123: I keep telling myself I'm going to go back and write some more cljs, but then I tell myself I also want all my cucmber tests passing first.

11:24 antares_: borkdude: Raynes is an old busy southerner, you better not ask :)

11:24 scratch the "old" part

11:24 borkdude: antares_ ok, enough to read, so nothing to complain anyway ;)

11:25 wingy: do you think there will ever be a clojure framework for the frontend?

11:25 seems pretty far from now

11:25 RickInGA: wingy: front end of what?

11:25 wingy: like ExtJS/Dojo etc

11:25 antares_: wingy: for Web apps? Noir is that framework

11:25 wingy: antares_: its a backend framework

11:25 antares_: wingy: there are various libraries like domina or jayq and binding for ClojureScript

11:25 RickInGA: clojurescript for ajax, noir for web, seesaw for swing

11:25 antares_: wingy: Clojure community is not big on building frameworks

11:26 peopel build libraries that do not dictate you that much

11:26 ro_st: ohpauleez also made shoreleave available recently

11:26 antares_: and clojurescript is < 1 year old or so :)

11:26 ro_st: which looks hot

11:26 ohpauleez: thank you ro_st

11:26 :)

11:26 let me catch up

11:27 antares_: so I don't know, I used CLJS very little so far and the toolchain is only starting to be useful for mere mortals

11:27 ro_st: ohpauleez: how'd your reveal go?

11:27 duck1123: Whenever a clojure author builds a big framework, they split it up into a bunch of tiny pieces. buecause each piece is useful on it's own

11:27 wingy: yeah

11:27 ro_st: that's the thing you need to realise. you can use just the bits you like

11:27 borkdude: spinoff libs

11:27 wingy: i personally think ExtJS is too bloated

11:27 also they have bad programming designs

11:28 but their view layer is superb

11:28 ohpauleez: ro_st - awesome. I showed off the demo's I'm working on, which people really enjoyed. Slides are on my blog http://www.pauldee.org/blob

11:28 pauldee.org/blog

11:28 ro_st: blob haha

11:28 ohpauleez: hahah too much HTML5

11:28 ro_st: hi. i'm a celleb blobber

11:28 celeb*

11:28 ohpauleez: :)

11:29 wingy: There are a few attempts at creating the compelling story

11:29 most people choose to focus on smaller libraries you can stitch together

11:29 which makes sense, because that's very natural for Clojure

11:30 ro_st: ohpauleez: i enjoyed your talk that's up on infoq

11:30 ohpauleez: Because of JavaScripts limitations, raw JS libraries have to come up with a set of standards, then code from the ground up using those standards, which results in a sort of bloated feel. This just doesn't happen in CLJS

11:30 uvtc: ohpauleez, pretty slides!

11:30 ro_st: i'd love to see shoreleave in action

11:30 duck1123: does anyone have much experience with using waltz? How do you like it? (and do you have public code to share?)

11:31 wingy: ohpauleez: yeah ExtJS has its own classes

11:31 constructors etc

11:31 ohpauleez: ro_st, uvtc : If you want, I've been emailing some people the early demo code (that are looking to adopt Shoreleave), PM or send me a message to the email in the slides, and I'll send you the URL

11:32 ro_st: for sure!

11:32 ohpauleez: wingy: Exactly - so in CLJS we don't need that, we get all of that from Clojure. So there are just one off libraries

11:32 ro_st: thanks

11:32 wingy: ohpauleez: we still need an easy way to create powerful UI though

11:32 ohpauleez: wingy: C2, Enfocus

11:32 wingy: not having to start over with HTML and have it work on all browsers etc

11:32 c2?

11:33 ohpauleez: Declarative library for creating graphics/UIs etc

11:33 Enfocus is a CLJS port of Enlive

11:33 and Shoreleave promotes the concept of partial renders via Enfocus

11:33 treehug: wingy: ClojureScript One is frameworky

11:34 ro_st: wingy, your brain is going to explode soon. just so you know

11:34 uvtc: hahaha

11:34 ro_st: but nice explode. not meltdown explode.

11:34 ohpauleez: treehug, wingy: Right, so if you want it all bundled up. You can use something like CLJS:One or Shoreleave as the foundation, and then put these graphical libraries on top

11:34 RickInGA: ohpauleez is shoreleave cljs or clj?

11:34 ro_st: clojure is the most fun i've had programming in 15 years of coding

11:34 ohpauleez: the best of both worlds

11:35 ro_st: RickInGA: it's both

11:35 ohpauleez: RickInGA: Shoreleave is mostly CLJS, but it lets you do client-server interop

11:35 so that you can fall back to compute something on the server if you need to

11:35 which is the best crutch in the world

11:38 foxdonut: ro_st: +1

11:38 ro_st: foxdonut: this week's mad-science is midje-mode and ace-jump-mode :-)

11:39 foxdonut: heh

11:40 ohpauleez: So just a heads up - I've been working on WebCL wrappers for CLJS

11:40 cgag: what's ace-jump?

11:41 ro_st: cgag: http://dl.dropbox.com/u/3254819/AceJumpModeDemo/AceJumpDemo.htm

11:41 cgag: oh, easy motion for emacs

11:41 RickInGA: ohpauleez: I had to look up what webcl was.... Wow, nice!

11:41 ro_st: -ing rocks once you get used to it

11:42 cgag: i use vim but i'm always being tempted by emacs modes

11:42 otfrom: does anyone know where name-with-attributes from the old clojure.contrib.def lives nowadays? It didn't seem to make it into clojure.core.incubator. Googling hasn't helped much.

11:43 foxdonut: <-- staying with vim

11:43 ohpauleez: foxdonut: YESSSSSSSSSSSSS

11:43 ro_st: never learned vim. lucky me

11:43 ohpauleez: Clojure: The first Lisp you can do in Vim and not cry

11:44 That said, because of my scheme and CL habits, I'm comfortable in emacs too, but clojure and vim play together so nicely

11:45 wingy: im coming from node.js, is there any async programming?

11:45 foxdonut: ohpauleez: http://files.myopera.com/bashvi/albums/642917/vi-emacs-final.png

11:45 dnolen: wingy: there's aleph, you might also be able to easily integrate with vert.x

11:46 cgag: when i say i'm tempted by emacs, i mean i'd be tempted to use evil mode

11:46 ro_st: wingy yup. see clojure actors

11:46 dnolen: wingy: but in general the fascination with async programming in Node.js world is unnecessary. You have real threads, real multicore.

11:46 Wild_Cat: I still can't get used to emacs. I'm always unsure why, but something always feels wrong about it.

11:46 wingy: dnolen: but lets say i use netty which is a one thread server

11:46 dnolen: wingy: it is not.

11:46 Wild_Cat: which is a shame because I know it's the most powerful editor in the world, but... It just rubs me the wrong way.

11:46 wingy: how do i prohibit thread blocking?

11:47 dnolen: wingy: you have lots of threads, it probably won't matter.

11:47 Wild_Cat: ...and of course, now that I've seen the lighttable demos, I feel like I can't be bothered to learn emacs anymore. Just coasting by on Eclipse and SublimeText until LT is released :p

11:47 dnolen: wingy: if you're building a chat server or a game, then yes netty can handle that too.

11:48 Wild_Cat: unrelated question: is there an official coding style guide for Clojure?

11:48 (e.g. how/where to indent, naming conventions and the such... basically, a Clojure PEP-8?)

11:48 nDuff: wingy: ...the async approach taken by node and friends only gives you value if you're going to be running on fairly limited hardware. On a 24-core machine, using Clojure's native concurrency abstractions with real threads will result in much better results.

11:48 dnolen: wingy: basically leave Node.js brainwashing at the door ;)

11:49 uvtc: Wild_Cat, if you're using the GUI version of Emacs, it acts a lot like a regular GUI editor: it's got a scroll bar, uses arrow keys, Ctrl-arrow-keys, etc. But with extra magick, like indenting things nicely.

11:49 cgag: what if i want to run clojure on fairly limited hardware?

11:50 nDuff: Wild_Cat: I don't know of anything focused _only_ on code style. Joy of Clojure and Clojure Programming both have a fair bit to say on the topic, and emacs paredit-mode (as uvtc) is nicely opinionated.

11:50 cgag: the indentation is one of the only complaints i have with vim/vimclojure

11:50 nDuff: cgag: If you want to run Clojure on limited hardware, you probably won't be using the Java-backed version anyhow

11:50 cgag: ...and so you might well end up using, say, ClojureScript on node.js.

11:51 uvtc: Wild_Cat, no official style guide I know of. Mostly just align function args vertically, and that's the style. :) Emacs + clojure-mode does this automatically, for the most part.

11:52 scriptor: cgag: agreed, I sometimes get annoyed at how much I have to un-indent sometimes

11:52 cgag: i just mean something with like 4 cores and not 24

11:52 RickInGA: Wild_Cat: there is this http://dev.clojure.org/display/design/Library+Coding+Standards

11:52 Wild_Cat: uvtc: I am using the GUI version (with the Emacs Live bundle, which does make it nicer). it's just the general feel of the thing that's off. Most shortcuts are chord sequences, the menu bar is mostly useless and I have to edit mostly-undocumented lisp files to change my defaults. All small things, I know, but combined together they just make the thing unpleasant to use.

11:52 duck1123: There's a scheme style guide that has most of the rules. Although some don't quite match up

11:53 Wild_Cat: (I gotta say rainbow parens are awesome, though)

11:53 duck1123: My rule for indentation is "wherever emacs want's to put it is where it goes"

11:53 ro_st: M-q in emacs: paredit re-indents the top level form at point

11:54 TimMc: Wild_Cat: Yep, turn off the menu bar.

11:54 Wild_Cat: still, while I'm trying Emacs -- how do I get a left margin with line numbers?

11:54 ro_st: Wild_Cat: linum.el

11:54 uvtc: Wild_Cat, not sure how much experience you have, but perhaps this tiny guide I wrote might be of use: http://www.unexpected-vortices.com/clojure/10-minute-emacs-for-clojure.html

11:54 scriptor: the starter kit has line numbers enabled, right?

11:54 Wild_Cat: uvtc: will take a look, cheers.

11:54 nDuff: cgag: Ahh. *shrug*; depends on what you're doing -- it's certainly possible to abuse the STM system in such a way as to sink a lot of CPU time (mixing long and short transactions, doing IO within a transaction, ...), and thus lose much of the advantage of your extra cores, but it's also very much possible to _not_ do that.

11:55 uvtc: TimMc, though, the menu bar might be useful to new users while they're still learning the keyboard shortcuts. Wild_Cat : you can interactively shut it off by doing "M-x menu-bar-mode".

11:56 ro_st: Wild_Cat: github.com/overtone/emacs-live

11:56 Wild_Cat: ro_st: already using that ;)

11:56 uvtc: ohpauleez, Oh, you wrote a previous version of etsy. I remember hearing that they currently use a pretty wide variety of languages. Any idea if they use Clojure there?

11:56 ro_st: i grabbed that, used M-x list-packages to add magit

11:57 ohpauleez: uvtc: They were at one point, but it was taken out of the stack as they started to standardized

11:57 ro_st: and linum, and maxframe, and then i added a hook to automatically compile (C-c C-k) and .clj file on save

11:57 oh and i added midje-mode today

11:57 cgag: they should have just taken everything else out of the stack

11:57 ohpauleez: (they mostly use PHP for everything in the app layer now. Few exceptions are made)

11:57 uvtc: ohpauleez, Do you happen to know what they're standardizing on?

11:57 ohpauleez, (typed at the same time). Ah, thanks.

11:58 ro_st: Pretty Horrible Programming

11:58 ohpauleez: that's because they're leadership is VP on innovation from Yahoo (Chad, was CTO, now CEO) and the Flickr guys

11:58 so they're coming from a history of PHP, and it's easy to find cheap, mediocre PHP programmings (warm bodies) to fill the chairs

11:59 uvtc: ohpauleez, they're job listings mention a lot of diff languages, but don't mention a focus. Thanks for the info.

11:59 ohpauleez: they're over 250 employees now

11:59 uvtc: wow.

11:59 ohpauleez: You're allowed to explore concepts in any language you want. Final consumer facing stuff has to be in PHP

11:59 if you own a whole subsystem you can use whatever you want, but you're encouraged to use PHP

11:59 foxdonut: "over here we have the riff, and over there we have the raff."

11:59 ohpauleez: if more than one person has to touch it, PHP

12:02 uvtc: It's interesting. If you aren't crazy about Java, but are stuck with the JVM, you can escape via Clojure. If JS isn't your cup of tea but you're stuck on the browser, you can escape via Clojurescript. If you're stuck with PHP, ...

12:03 ohpauleez: If you're stuck with PHP, you spend half your day looking at docs to figure out why the hell the core functions contain bugs, and the other half looking for another job

12:03 or personal projects

12:03 :)

12:04 uvtc: (I just mean "stuck with the JVM" only in the sense that it's what you're required to work with.)

12:05 Makes me wonder if the future holds a Clojurescript variant that will compile Clojure to PHP.

12:05 dnolen: uvtc: I doubt it.

12:05 ohpauleez: uvtc: With the lua backend being worked on, no need for it

12:06 uvtc: Sorry --- I don't see the connection. What would a lua backend have to do with PHP?

12:07 ohpauleez: you use PHP for lightweight server-side systems. Assuming you don't NEED the PHP platform, it's just "easy" - well then Lua makes a great alternative

12:08 wingy: reading my first book about clojure they mentioned that clj is using bottom up approach .. which to me seems pretty right .. unlike CoffeeScript and LiveScript which is top down clj/lisp just dont have to change over time in its syntax..since it has no

12:08 one

12:08 CoffeeScript comes out, then Coco, then LiveScript .. just like following trends .. what is hot this month

12:09 but they all change all the time since they are based on what is hot .. lisps remain the same throughout years

12:09 since they got the basic building blocks right

12:09 dnolen: wingy: syntax-y language seem to inspire to people to focus on syntax over semantics.

12:09 wingy: Lisp semantics have changed quite a bit over the years.

12:10 otfrom: found it: [org.clojure/tools.macro "0.1.1"]

12:10 wingy: but not that much as the other syntax langs right?

12:11 could one say clojure is a far more safe bet than lets say CoffeeScript that changes this and that in syntax all the time

12:13 dnolen: wingy: new constructs tend to require new syntax. So where Clojure needs something new, syntax is created for that. But not, old stuff doesn't get changed willy-nilly.

12:15 TEttinger: wingy: there's sibilant if you just want coffeescript that looks like lisp

12:15 http://sibilantjs.info/#welcome

12:16 (it also IS lisp, with what I believe are "proper" macros, though I am not sure)

12:16 wingy: dnolen: but there is no syntax in clojure?

12:17 you add macros, functions but the syntax stays the same?

12:17 dnolen: wingy: macros create new syntax. you have write the forms in a specific way - braces no braces, this first, that first etc.

12:17 S11001001: @google ISLISP

12:18 eh.

12:18 wingy: TEttinger: cool you are here too

12:18 TEttinger: wingy: heh, I am still in #livescript !

12:19 I love clojure for desktop stuff

12:19 TimMc: wingy: Clojure's compiler provides a base syntax, but macros (and in a more abstract way, functions) allow you to expand the language.

12:19 TEttinger: seesaw rules

12:19 wingy: TEttinger: im having a hard to deciding .. will make up my mind this week

12:19 TEttinger: LiveScript got me realizing how much I love FP

12:20 TEttinger: btw..check out Light Table .. so awesome

12:20 TEttinger: it is a very different kind of FP than Clojure IMO

12:20 wingy, last I checked it was just a REPL

12:20 wingy: TEttinger: yeah

12:20 cgag: i haven't gotten around to testing out the playground yet

12:20 TEttinger: also, no Leiningen support yet

12:20 so no projects

12:21 wingy: its not finished editor yet

12:21 just something you play with .. they will get it final in some months

12:21 i hope

12:21 TEttinger: heck i don't think it can open multiple files yet -- as a tech demo it is nice

12:21 wingy: it gave me A LOT of new ideas for the app im developing

12:21 TEttinger: heh good

12:21 wingy: how the future looks like

12:21 where we are heading

12:22 TEttinger: the future probably uses Twitter Bootstrap haha

12:22 the_ignorati: does anyone know if Korma can do SQL IN?

12:22 wingy: also the clojure lang .. i thought if i cant use clojurescript in frontend ill use livescript there

12:22 TEttinger: good point

12:23 a difference between CLJS and LS is that LS is a lot closer to JS (did that make any sense?)

12:23 dnolen: TEttinger: wingy: from what I can tell LiveScript doesn't emphasize immutability, so missing out big on what's good about FP.

12:23 TEttinger: yep

12:23 wingy: TEttinger: of course

12:24 dnolen: i have to enforce that myself :)

12:24 TEttinger: but CLJS doesn't have any way to benefit from Clojure's concurrency primitives, does it? performace-wise

12:24 wingy: wait a min .. it does?

12:24 you have to use := to change a var outside the scope

12:25 TEttinger: in LS? yes

12:25 wingy: yeah

12:25 dnolen: wingy: you can enforce it but you can't make it efficient.

12:25 TEttinger: but that isn't immutable

12:25 dnolen: TEttinger: not yet.

12:25 TEttinger: yeah, I just got the feeling that Clojure is a mature language, ClojureScript not so much

12:25 wingy: i just thought clojure is a good lang for making security heavy apps

12:25 dnolen: wingy: CLJS ships with all of the standard persistent data structures. So there's no extra work to do.

12:26 cgag: clojurescript is really young

12:26 wingy: future proof .. i dont think javascript can ever do that on server side

12:26 dnolen: wingy: don't think Clojure brings anything to the table security wise.

12:26 TEttinger: yes

12:26 wingy: dnolen: why

12:26 i mean isnt java more fitable than javascript on that matter

12:26 dnolen: wingy: it just doesn't IMO.

12:26 TEttinger: node.js is kinda a hack, and unless V8 gets faster frequently, it is going to languish in server-side performance

12:27 wingy: it can do correct calculations

12:27 maaruks: I need to do setMessageSupplier(this); in default class constructor. How can I get reference to *this* ?

12:27 dnolen: wingy: I just mean it's not something it innovates.

12:27 wingy: i can have type checks .. lets say someone does banking .. you dont want to accidently pass in a string when it should be a nr

12:27 foxdonut: dnolen: I know it's not *required*, but would you say it's valuable to learn how closure works to make better use of clojurescript?

12:28 wingy: dnolen: yeah but by using java its more secure in that matter

12:28 than js

12:28 just a thought i had

12:28 dnolen: foxdonut: the basic facilities seem useful, tho it's a large library - so mixed bag.

12:30 TEttinger: wingy: clojure isn't statically typed either. it just has the seq abstraction and things like it that let you pass, say, a vector to a function that normally takes sets, and IIRC as long as that function takes a seq... it will not throw an error, though it may misbehave

12:30 foxdonut: dnolen: I see. At the very least, I figure it's good to have a basic understanding of using the compiler, since that's an attractive feature of clojurescript-- compile in advanced mode and get a minimal .js file out for production use.

12:30 wingy: TEttinger: for how long have you been using Clj?

12:31 didn't know you were a clj guy

12:31 now we can talk in both channels!

12:31 TEttinger: off and on? since 1.1 I think

12:31 so 2010

12:34 pendlepants: what are people doing for env-specific project config? e.g. database config.

12:34 uvtc: Wow, having a Lua backend (via the GSOC pluggable backend that's being worked on) sounds quite exciting. Seems to me that it would allow you to pre-compile your Clojure code, and after that start-up time would be tiny --- and the resulting code would probably run quite fast.

12:35 ystael: pendlepants: we have looked at, but not used, drakerlabs/milieu ; it's not difficult to roll your own

12:36 dnolen: uvtc: well we get a lot of those benefits from V8/Node already. But perhaps LuaJIT will be faster. Easy access to C libs also a plus.

12:37 TEttinger: yeah LuaJIT is amazing

12:37 pendlepants: thanks ystael.

12:37 TEttinger: speed on par with C# on Mono

12:37 on one test I found it outperformed GCC

12:37 uvtc: dnolen, does cljs + V8 allow easy ffi? It appears that cljs+lua would.

12:38 zakwilson: A Lua backend for Clojure? Because it would be easy to make cljs output Lua?

12:38 TEttinger: http://attractivechaos.github.com/plb/

12:38 uvtc: For some value of "easy"? :)

12:38 TEttinger: uvtc, yes

12:38 cljs+lua would be easy

12:38 no idea about V8

12:39 dnolen: uvtc: yes I said that :)

12:39 uvtc: dnolen, thanks for the clarification.

12:39 cgag: does using cljs and node force you to write things in in that callback style if you want to do something like read from a file?

12:40 dnolen: cgag: yep, though that could maybe change in the future.

12:42 technomancy: would people be interested in being able to specify environment variables in project.clj?

12:42 uvtc: Will have to look into how one would install a standalone V8, write and run cljs code on it.

12:43 TEttinger: technomancy: like system env variables?

12:43 technomancy: TEttinger: System/getenv, sure

12:43 environment variables

12:43 TEttinger: "PATH": ""

12:44 S11001001: "PATH": "i/got/your/bin"

12:44 right/here

12:44 technomancy: I've thought it might come in useful a few times but don't know if it's worth pushing to get into preview7

12:45 ibdknox: all I can say is wow: http://www.chris-granger.com/

12:45 TimMc: technomancy: That would include JVM modifiers too, right?

12:45 technomancy: TimMc: you mean system properties?

12:45 TimMc: technomancy: That -D stuff

12:45 technomancy: TimMc: that stuff's already plumbed through

12:45 TimMc: Ah, never mind. Was confused.

12:47 uvtc: dnolen, sorry for the confusion --- I missed that you wrote "easy access to C libs is also a plus". So, I'm guessing that means cljs+lua means easy access to C libs. And from your more recent reply, it sounds like that's also the case with cljs+V8?

12:47 foxdonut: ibdknox: !!

12:47 ibdknox: more than a month's worth of time

12:47 that's the thing I can't get over

12:48 technomancy: env vars for config on the JVM are pretty awkward given you can't change them at runtime

12:48 foxdonut: \o/

12:48 cgag: those are some insane stats ibdknox

12:48 technomancy: so I'm thinking it's probably best to not bother

12:48 cgag: congrats :D

12:50 zerokarmaleft: ibdknox: ST2 called and said stop stealing their thunder

12:50 ibdknox: lol

12:50 RickInGA: ibdknox: watching your presentation at bay area ug now. amused that you are wearing a visual studio tshirt

12:51 ibdknox: RickInGA: lol unintentionally, just didn't think about it

12:53 dnolen: uvtc: not the case for cljs+v8

12:55 ibdknox: great stuff. From Twitter seemed like it was the first time many people tried Clojure.

12:55 ibdknox: dnolen: yeah, I got that impression as well

12:56 uvtc: Thanks for the info, dnolen.

13:02 RickInGA: technomancy: we had our first swarm coding meetup in Atlanta, thanks so much for developing and sharing that script!

13:06 technomancy: RickInGA: cool; glad that worked for you

13:07 RickInGA: there was a lot of noise where we were, but because we were all looking at the same thing, we were still able to talk about what we were working on. Think it would have been a terrible meeting without swarming

13:10 technomancy: RickInGA: heh; yeah part of why we ended up doing it that way at Seajure is because the location doesn't allow for lecture-type meetings

13:14 sandbags: hello, anyone help me with a 4clojure problem?

13:15 http://www.4clojure.com/problem/6#prob-title <-- my answer is '(:a :b :c) which my repl is telling me is true

13:15 alternatively [:a :b :c] my repl says is okay

13:15 and, again, the site rejects

13:15 ah, damn

13:16 i missed that the [] aren't part of the answer

13:36 dbushenko: getting Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64 while using noir 1.3.0-beta10

13:36 how to fix that?

13:36 uvtc: Why are there sometimes so many different groups for a given project at clojars? For example, https://clojars.org/search?q=clutch has com.ashafa/clutch, org.clojars.toxi/clutch, org.clojars.rje/clutch, etc. My understanding is that they are forks of the canonical clutch project, but what is the typical reason for pushing them to clojars?

13:39 I'd expect that if the forks have improvements, such improvements would end up folded into the canonical project, rather than end up as separate clojars archives...

13:40 madsy: uvtc: Anyone can push to clojars. Since people can publish any project, the repo falls under your own account/name if you don't cooperate with anybody else

13:40 That's how I understand it anyway

13:41 So yes, you might end with a dozen different forks/ports and versions from equally many people

13:41 uvtc: madsy, Right. But I'm just curious if I'm missing some reason why folks are pushing those forks to clojars.

13:42 madsy: The alternative would be to have some kind of control and moderation in effect, but that falls flat on its own premise

13:43 uvtc: Pushing them to clojars as opposed to where? :)

13:43 nDuff: uvtc: Could be some of these folks don't have their own local Maven repos.

13:43 uvtc: If I made some changes to a project that I was using and not asking to be merged with the canonical project, my guess is that I'd just keep my modified project in a local repo, rather than clojars.

13:43 madsy: Yeah, what nDuff said

13:43 uvtc: Mmm.

13:44 technomancy: uvtc: usually because either the upstream maintainer is unresponsive or they're too lazy to collaborate with the maintainer

13:44 either way it's caused by a breakdown in the contribution process

13:44 nDuff: uvtc: Also could be some of them aren't sure how long it'll take to get things upstream -- certainly when I started working with clojure.osgi, I didn't expect responsiveness from aav (who'd been idle 6 months prior)

13:44 (as it happens, aav *has* been responsive, but that was a surprise)

13:44 uvtc: nDuff, have not yet looked into what's involved in creating a local repo ... unless that simply means installing the project into my own ~/.m2

13:45 nDuff: uvtc: If you're in a typical corporate environment there are more developers, and a central build machine. Installing something in your ~/.m2 doesn't help any of them but you.

13:45 uvtc: nDuff, of course, right right. Thanks.

13:46 technomancy, "breakdown in contribution process". I see. Thanks.

13:47 I see --- there's a section in lein's DEPLOY doc ("Private Repositories") that touches on this.

13:55 JulioBarros: Picking up where I left off with my noir/friend project. I got the login/logout workflows to work but I don't think *identity* is being set so the helper functions (anonymous? authorize, etc) don't work. Does anyone have this working? What am I missing?

13:55 acheng: yay: got the go-ahead to setup clojure for co-workers

13:55 ... but i have a setup issue that i haven't seen before

13:56 ... lein version works... but if i go to my project (which was created with an older version of lein) and run lein deps, it doesn't work

13:56 ... java.io.filenotfoundexception could not locate leiningen/hooks/classpath__init.class or leiningen/hooks/classpath.clj on classpath

13:57 technomancy: acheng: remove the :hooks entry from project.clj

13:57 acheng: ... and after this, lein version doesn't work either! so lein version goes from working to not.... ok technomancy will try

13:58 technomancy: victory! thanks

13:59 (sorry, didn't mean to bury the question from JulioBarros above)

14:01 hmm. failed to collect dependencies for clojure.lang.LazySeq@b1cac087

14:02 borkdude: that's a really lame error message, who made that up?

14:02 :P

14:02 uvtc: technomancy, it sounds to me like, if a given project at clojars is the canonical one, and it's group-id is not the same as its artifact-id, then that's a bug.

14:03 acheng: pastebin.com/3PjMLEce

14:04 uvtc: (Er, sorry if I'm restating the obvious.)

14:04 technomancy: uvtc: it's a workaround to a problem

14:05 sometimes a better solution is genuinely unfeasible

14:05 in the case of MIA maintainers

14:06 uvtc: also it used to be hard to publish to S3

14:06 so that's certainly part of it

14:06 uvtc: In the case of MIA maintainers, I'm guessing there's a process by which a new maintainer would be added to the group...

14:07 hiredman: "it used to be hard to publish to S3" whaaaa?

14:07 acheng: added my dependencies to pastebin.com/BPbfbkWh

14:07 uvtc: I was about to ask the same thing, hiredman.

14:07 technomancy: hiredman: s/hard/undocumented/ I guess?

14:08 nDuff: acheng: Would you mind using a pastebin with fewer ads? They're particularly obnoxious there.

14:08 acheng: sure. where?

14:08 uvtc: ~refhead

14:08 clojurebot: I don't understand.

14:08 technomancy: uvtc: there's no outside takeover mechanism for clojars groups

14:09 if a maintainer is truly MIA, then a formal fork should happen

14:09 but you don't want to do that hastily, and sometimes people need changes on a faster timetable

14:09 nDuff: acheng: personally, I'm a fan of gist.github.com; there's also a Clojure-specific one which intends to eventually reach feature-parity with gist (which is *very* featureful), though I don't recall its name offhand.

14:09 uvtc: ~refheap

14:09 clojurebot: Pardon?

14:10 uvtc: (misspelt it the first time)

14:11 ~pastebin

14:11 clojurebot: Titim gan éirí ort.

14:13 acheng: refheap.com/paste/3329

14:14 uvtc: technomancy: Hm. For cases where a maintainer is truly MIA though, if you simply removed the older unmaintained artifacts it would burn folks who depend upon on (as you noted yesterday, "releases are forever").

14:16 nDuff: acheng: Looks like it's seesaw introducing that issue.

14:17 technomancy: uvtc: of course; no one would ever remove old releases

14:18 nDuff: ...err, strike that, off-by-one

14:18 clj-webdriver, rather.

14:19 technomancy: uvtc: by a formal fork I mean renaming a la clj-json -> cheshire

14:19 uvtc: technomancy, Oh! Thanks for clarifying. :)

14:20 nDuff: acheng: Moving to clj-webdriver 0.6.0-alpha7 appears to fix things.

14:20 acheng: nDuff: ok will try. how did you go from bouncycastle to clj-webdriver?

14:21 technomancy: uvtc: I think so far the only time we've needed manual intervention on the clojars DB is for deleting artifacts that were pushed by mistake

14:21 nDuff: acheng: I'm sure there's something far better that could have been done instead, but this was just process of elimination.

14:22 uvtc: Was it previously the style to name projects with a "clj-" prefix? Or is that still common?

14:23 nDuff: uvtc: To distinguish clojure wrappers for upstream projects from the original thing? Seems pretty clear even now.

14:23 acheng: hm. alpha8 supports clojure 1.4 and alpha9 supports Firefox 13.

14:23 i guess i'll ask semperos (the author)

14:23 thanks nDuff!

14:23 uvtc: nDuff, Ack, of course. Thanks.

14:24 sendai: I'm wondering how best to write code equivalent to this in clojure: https://gist.github.com/2997724 i could use nested if-let's but that's going to get ugly fast. suggestions?

14:25 cgag: condp maybe?

14:26 mebaran151: hey #clojure, I'm working on a noir app and have multiple items with the same param name (i.e. multiple inputs with the same name), I would like to get these in my map as a hashmap of input names to vectors, but Noir seems to coalesce them into one. Anyway to get the underlying ring request parsing?

14:27 sendai: thought about condp, but i need the re matches to compute what i return. condp doesn't help me there, does it?

14:27 i'd have to do run the regexp twice in that case,i think

14:27 uvtc: sendai, right, you want those $1 and $2 values.

14:28 ystael: the last example under clojuredocs.org/clojure_core/clojure.core/condp looks promising?

14:28 sendai: let me look

14:28 mebaran151: sendai, you can pass the result of condp's test to the next expression via :>>

14:30 sendai: yes, that will work. thanks, i hadn't noticed that about condp before

14:30 cgag: me neither to be honest, i suggested it before i realized you needed the result of the match

14:30 that's good to know

14:32 xeqi: mebaran151: I think you can get the :query-string or :body (url-encoded form) if you wanted to parse them differently

14:32 though I don't htink I understand how you wanted it to end up

14:32 mebaran151: xeqi: actually found it, form-params from ring-request

14:41 xeqi: essentially, if I had two input fields with the name "dob" I wanted to get back a params map with {:dob [dob1 dob2]}...

14:44 samrat: i've installed lein-tarsier and slimv. do i still need nailgun installed?

14:46 cgag: yeah

14:47 shawnlewis: What is "#^<type>" as in https://github.com/richhickey/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/datalog/database.clj line 34? How does it differ from "^<type>"?

14:47 cgag: i just followed this for setting up vimclojure/tariser: https://github.com/daveray/vimclojure-easy

14:47 Chiron: Hi, how to write this in idiomatic way? https://github.com/zznate/cassandra-tutorial/blob/master/src/main/java/com/datastax/tutorial/composite/CompositeDataLoader.java#L133

14:48 I let the composite and then called addComponent, then I found I need to let HColumn later

14:49 HColumn needs Composite that defined earlier

14:50 nickmbailey: hey Chiron

14:50 #4377

14:50 Chiron: what is this? :)

14:50 hey!!

14:50 nickmbailey: oh wrong room

14:50 i'll msg you in #cassandra :)

14:50 Chiron: okidokie :D

14:52 antares_: Chiron: dear god, wrapping hector is a nightmare

14:52 aperiodi1: samrat: slimv does not require nailgun, or tarsier

14:52 antares_: Chiron: this is a *very* young project but I'd recommend trying it instead of attempting to mess with hector: https://github.com/clojurewerkz/cassaforte

14:52 Chiron: antares_: tell me about it

14:52 antares_: hector is just WTFs all the way down

14:53 Cassaforte is/will be built around CQL

14:53 samrat: aperiodic: but i couldn't get slimv working....could you help?

14:53 xeqi: mebaran151: ah, like wrap-nested params and fields named dob[]

14:53 antares_: so it will be similar to clojure.java.jdbc + helper functions built on top of CQL (3.0)

14:53 samrat: aperiodic: i don't see a slimv menu as mentioned in its tutorial

14:53 Chiron: antares_: it is wrap any other lib?

14:54 aperiodic: samrat: i can try. what happens when you try to connect to a swank server?

14:54 mebaran151: xeqi: yep exactly, turns out (ring-request :form-params) was exactly what I needed

14:54 samrat: aperiodic: well lein swank seems to work fine

14:56 raek: shawnlewis: that is the pre-1.2 syntax for ^

14:56 antares_: Chiron: just bare Cassadra Thrift

14:56 *cassandra

14:56 shawnlewis: raek: thanks

14:56 aperiodic: samrat: ok, have you tried connecting to the swank server using slimv? by default it's ',c'

14:56 ivan`: I thought Clojure Programming was lying when it said that I must use the return value of the transient ! functions

14:56 now I feel like scanning everything in clojars for bugs

14:56 antares_: Chiron: it will be pretty useful for expressions with ? and :params early next week

14:57 Chiron: I love CloujureWerks, I found about them three days ago

14:57 samrat: aperiodic: ',c' doesnt seem to be doing anything

14:57 xeqi: JulioBarros: what does you're credential-fn return?

14:58 antares_: Chiron: thank you. We just shipped Monger 1.0 and will focus on making Cassaforte useful now.

14:58 aperiodic: samrat: how are you installing slimv? dropping it into your runtime path (~/.vim/*), or using pathogen?

14:58 samrat: aperiodic: pathogen

14:58 JulioBarros: xeqi a user map from my db.

14:59 Chiron: antares_: Oh, you work for ClojureWerks?

14:59 aperiodic: samrat: yeah, i couldn't get slimv to work under pathogen. try dropping it into the runtime path.

14:59 antares_: Chiron: clojurewerkz is an open source effort. I do not work for it but I started it.

15:00 Chiron: antares_: I have to thank you :)

15:00 antares_: I authored almost all of the libraries and written all the guides

15:00 lowerkey: Greetings

15:00 xeqi: JulioBarros: using workflows/interactive-from ?

15:00 lowerkey: I came here hoping someone could explain lazy sequences to me

15:00 I have the following function: http://pastebin.com/NVfU837f

15:01 JulioBarros: xeqi: yes, a lot like in your clojars project.

15:01 Chiron: antares_: it looks we both like methodology :)

15:01 lowerkey: and would like it to generate a lazy sequence

15:01 Chousuke: lowerkey: it does?

15:02 for is lazy.

15:02 JulioBarros: xeqi: the session gets the identity but not the *identity* ref (as far as can tell)

15:02 antares_: Chiron: do you need a Cassandra client urgently or can wait till next week?

15:02 raek: shawnlewis: btw, are you aware that the clojure stuff moved from github.com/richhickey to github.com/clojure years ago?

15:02 lowerkey: cool. then i guess i didn't need to come here at all. thanks!

15:02 antares_: Chiron: by next week Cassaforte will be pretty useful, probably even with a short getting started guide

15:02 Chousuke: heh

15:02 lowerkey: :)

15:03 Chiron: antares_: will try working on other parts of the project

15:03 technomancy: antares_: are you trying to beat the record for most databases used in a single codebase? =)

15:03 Chiron: Cassandra bugs and undocumented libs already consumed my previous week

15:03 raek: ...and that "monolithic contrib" has been abandoned for almost as long?

15:03 shawnlewis: raek: yeah, I was interested in reading the datalog source though

15:03 raek: which didn't migrate

15:03 clojurebot: Pardon?

15:03 raek: ok, good!

15:04 Chiron: clojurebot: Titim gan éirí ort

15:04 clojurebot: Titim gan éirí ort is irish for "may your recursive calls always be in the tail position"

15:04 technomancy: clojurebot: botsnack

15:04 clojurebot: Thanks! Can I have chocolate next time

15:04 Chiron: haha wicked smart

15:04 mebaran151: hey xeqi how does nested params work? It might be a less fragile version of what I'm trying to put together

15:04 antares_: technomancy: haha, actually, Cassaforte is for one of my possible next gigs. We don't use Cassandra for anything currently.

15:04 lowerkey: Chousuke: So when I call (first (divisors 100)) it will only evaluate until it got two?

15:05 Chousuke: it should only evaluate one

15:05 antares_: technomancy: but we do use 4 other data stores. Spyglass was a 2 evenings hack.

15:05 Chousuke: so.. yes?

15:05 turbofail: hm... what maven artifact to i need to get ahold of clojure.core.strint?

15:05 antares_: technomancy: the idea is that because Clojure's sweet spot is data processing, having awesome DB clients is a must for its adoption. the same with docs.

15:05 Chousuke: lowerkey: though chunking may affect things

15:05 antares_: technomancy: there are no other great ideas behind clojurewerkz, just lots of practical libs and docs

15:05 technomancy: antares_: gotta catch 'em all!

15:06 antares_: technomancy: and you can be sure one day there will be an hbase client :P

15:06 Chousuke: lowerkey: lazy seqs produced by clojure functions aren't guaranteed to be completely lazy :P

15:07 technomancy: antares_: oh, are you doing consulting work?

15:07 nickmbailey: antares_: interested in the progress of that cass lib

15:07 xeqi: mebaran151: umm, does http://mmcgrana.github.com/ring/ring.middleware.nested-params.html help?

15:07 nickmbailey: i've worked some on clj-hector

15:07 antares_: technomancy: no but I am leaving my current place in 2 days

15:07 nickmbailey: but hector is ….. so java-y

15:08 lowerkey: Chousuke: Would it be possible to iterate over the divisors function, something like (first (divisors)), (next (divisors)) or should i use (take-nth (divisors 100))

15:08 antares_: nickmbailey: right, that's why we are taking the CQL (3.0) route

15:08 technomancy: then entire July is for OSS hacking, then we will see what I choose to do next

15:08 nickmbailey: ah, well watch out for bugs in cql3, which is what Chiron has been hitting

15:08 but it is still beta

15:09 antares_: nickmbailey: well, basic CQL in 3.0 should work just like 2.0

15:09 the idea is to just use CQL for everything (possibly under the hood), it can be 2.0 for a while

15:09 and target Cassandra 1.0 or even 1.1

15:09 technomancy: antares_: cool; good luck

15:09 nickmbailey: antares_: cool stuff

15:10 watching the project :)

15:10 Chiron: I'm loving the project :)

15:11 believe me, it was a crazy week with CQL3

15:13 lowerkey: how would i create a backwards range?

15:14 metellus: ,(range 10 1 -1)

15:14 clojurebot: (10 9 8 7 6 ...)

15:14 lowerkey: metellus: thanks!

15:21 wingy: is there only one AST form?

15:21 or does every lang has it's own AST?

15:22 antares_: wingy: yes, every language has its own AST. Lisps are pretty unique in that it is accessible to you for modifications from the language itself.

15:23 wingy: other languages, say, Java, get AST as a data structure from a parser but they cannot really transform or generate themselves as data structures (only as text, which is a lot harder)

15:23 nDuff: ...there _are_ some exceptions -- Boo, for instance, has an accessible AST such that one can write macros for it, but it's far from homoiconic.

15:24 wink: afaik the python ast thingy is also usable

15:24 dnolen: wingy: what do you mean? Lisp s-exprs are not really much of an AST, which why they are so useful.

15:24 wink: on some languages people rely on reflection and dirty hacks to get to it

15:25 nDuff: wink: Does the Python one allow one to hook in and run transforms during evaluation or module load? My impression was distinctly contrary.

15:25 lowerkey: so when working with a lazy sequence, it's better to check if a list is nil, than it is to look if count is zero

15:25 antares_: wink: you can get AST in most languages but you cannot modify it

15:25 wink: at best (in Ruby, for example), you can generate strings and eval them one way or the other

15:26 in Clojure you generate data structures

15:26 which is radically easier

15:26 wink: nDuff: sorry, never used it. but at least it exists

15:26 antares_: even getting it can be non-trivial, or at least not as a core language package

15:27 dnolen: lowerkey: or empty?. rarely a good idea to call count on something unless you know it's counted.

15:28 antares_: wink: right. But this distinction between "generating text" vs "producing data structures" is exactly what "code is data" is about

15:28 wink: that's what I was getting at

15:28 ohpauleez: dnolen: ping

15:28 wink: antares_: oh yes, you're totally right :)

15:28 dnolen: ohpauleez: pong

15:28 wink: I just think AST work is underrated by too many language creators

15:29 wingy: antares_: you mean wingy

15:29 or perhaps you meant wink :)

15:29 ohpauleez: dnolen: I was going through some of Liskov's Clu stuff - some ideas in there we could steal (the cluster as a protocol) for the CLJS idea we were talking about

15:29 still digging up papers though

15:30 antares_: errr

15:30 lowerkey: dnolen: thanks, I'm entirely new to clojure and functional programming

15:30 dnolen: ohpauleez: interesting got links?

15:30 antares_: wink: sorry, I totally meant wingy :)

15:30 stupid tab completion

15:30 wink: it still was a meaningful answer :D

15:33 ohpauleez: dnolen: got the original idea from this talk: http://www.infoq.com/presentations/liskov-power-of-abstraction. In CLU, you define all the inputs and outputs of a cluster (a type) - you then use that Cluster to query on the objects themselves

15:34 wingy: the more i read about clojure the more i love the simplicity

15:34 how the heck can lisp be the lang from 1958 who gets it right

15:34 like more than 50 years ago

15:34 ohpauleez: Using some mix of protocols and metadata, we could easily put the idea together

15:36 semperos: acheng: online if you want to discuss here

15:37 ystael: wingy: it might be more accurate to say that alonzo church got it right in the 1930s

15:37 ldopa: wingy: because it's grounded in mathematics

15:38 wingy: :)

15:38 dnolen: ystael: not really

15:38 Raynes: And mathematicses are the baseses of alls the univoyses.

15:40 wingy: so you can say clojure is more near the way nature works?

15:40 not focusing on the human style of thinking

15:40 but the nature's way?

15:40 with some help to ease things out

15:41 dnolen: ohpauleez: does she say anything specific about the querying bit?

15:41 ohpauleez: no, most of the talk is about exceptions and and signaling. I've been looking for the querying in papers

15:42 dnolen: ^

15:42 dnolen: ohpauleez: well I d/led the user manual will give that and the video a looksee later.

15:43 ohpauleez: cool

15:50 gtrak: wingy: I'm convinced there are still tradeoffs in the flexibility

15:50 aperiodic: samrat: ... any luck?

15:52 gtrak: wingy: for instance, I think it's faster to make a mess with lisp, too

15:54 uvtc: How can I directly download a jar file from clojars? (Say, using wget.)

15:57 xeqi: uvtc: look for it in clojars.org/repo

15:58 Raynes: http://clojars.org/repo

15:58 xeqi: Get out of my internets.

15:58 dnolen: gtrak: given the kind of code that's out there in JS, Perl, PHP, Python, Ruby, C, C++, Obj-C & Java etc - that's a bold claim.

15:59 uvtc: Thanks, xeqi!

16:00 gtrak: hm... dnolen maybe I just feel it's easier for me to make a mess in clojure than java, and I'm thinking kind of a reverse-blub argument. I've seen me some php :-)

16:01 sort of a terrifying liberty is what I feel

16:01 uvtc: and Raynes :)

16:01 ldopa: wingy: if you consider the 'human' style to be piling on language features to make certain common cases easier without thinking too deeply about how those features interact, yeah

16:07 dnolen: gtrak: probably your familiarity with Java talking. It's easy to be scared with something that's not familiar.

16:08 gtrak: I think there's a lot of subtlety to it, for instance, the distance between abstraction levels is much closer together, the tools you defined at the bottom can be used at the top.

16:10 I think in general languages define a core abstraction that programmers float slightly above and don't stray too far from. I guess that's what I mean.

16:10 lisp is not that

16:10 dnolen: gtrak: so does that prevent or enable messes. I've heard horror stories about Israeli military Java code where they had voodoo scripts, code generation, etc, because no sensible meta system.

16:11 gtrak: ah yea, that's definitely one extreme, when meta is necessary

16:12 dnolen: gtrak: it's always necessary unless you're writing toys.

16:12 gtrak: just saying there are tradeoffs, there must be some good papers about that somewhere but I'm just talking out of my rear right now

16:13 dnolen: if you don't have meta - you have "a language designed for large teams" - meaning only large teams can possibly work with something so tedious.

16:13 gtrak: I've looked, only anecdotes no facts.

16:13 gtrak: ah ok

16:13 self-induced FUD perhaps :-)

16:14 dnolen: gtrak: in fact, Art of the MetaObject Protocol is the only evidence I've ever seen that only meta systems can actually solve nearly impossible problems and deep backwards compatiblity issues.

16:14 gtrak: I really like clojure though, it's a good kind of terrifying :-)

16:14 dnolen: I've never read anything about system without good meta capabilties solving maintenance significant problems.

16:14 significant maintenance.

16:18 wingy: why is clojure using weird names

16:18 Raynes: seancorfield: Is there a list of contributors to congomongo somewhere?

16:18 wingy: pr-str but read-string

16:20 scriptor:  /join ##nobullshit

16:20 er, nvm

16:21 ohpauleez: wingy: You can think of (pr-str ..) as behaving like (str ..) so putting the names close helps puts the concepts close

16:22 wingy: are you guys using a framework like GWT to make frontend apps?

16:22 amalloy: print is a human-friendly name that creates human-readable output; pr is an abbreviated name that makes machine-readable output

16:22 wingy: yeah

16:23 S11001001: ugh, I want try to be renamed call-with-delimited-linear-continuation

16:23 amalloy: ohpauleez: it doesn't, though. str behaves like print-string

16:23 wingy: and can one say that lisp wasn't designed for UI interactions

16:23 seems to be designed for AI programming

16:23 S11001001: no

16:24 wingy: while OOP is a better fit for frontend UI?

16:24 tbaldridge: wingy: not exactly

16:24 wingy: Windows.create()

16:24 new Window({title: "bla", size: 100})

16:24 dnolen: wingy: Interface Builder was originally written in Lisp.

16:25 xeqi: Raynes: https://github.com/seancorfield/congomongo/graphs/contributors ?

16:25 ohpauleez: &(str 5)

16:25 lazybot: ⇒ "5"

16:25 Wild_Cat: object-oriented languages are easy on the brain as far as UIs are concerned. But then again, Clojure supports OO, so...

16:25 ohpauleez: &(pr-str 5)

16:25 lazybot: ⇒ "5"

16:25 ohpauleez: it *feels* the same

16:25 dnolen: wingy: that said how to write UIs functionally is not exactly common knowledge.

16:25 Wild_Cat: btw, which is considered the cleaner, (.method object) or (. object method)?

16:25 amalloy: &(str "a")

16:25 lazybot: ⇒ "a"

16:25 amalloy: &(pr-str "a")

16:25 lazybot: ⇒ "\"a\""

16:26 Wild_Cat: dnolen: I tried writing a GUI in Haskell, and it was a nightmare.

16:26 nDuff: wingy: (create-window :title "bla" :size 100) seems just as reasonable, though -- yes -- having a clean functional toolkit for GUIs is tricky (it's been done -- there've been some downright excellent ones for Common LISP).

16:26 ohpauleez: amalloy: I would argue that feels the same too

16:26 amalloy: Wild_Cat: the former, in most cases

16:26 Wild_Cat: amalloy: OK, thanks.

16:26 I'm guessing it avoids reflection too, right?

16:26 tbaldridge: wingy: it's possible to do functional-like programming with UIs. You can kindof do this with XAML and WPF on windows.

16:27 oskarth: how can I easily save things things I've evaluated and the results I got with a repl (terminal)?

16:27 amalloy: Wild_Cat: no

16:27 the two forms are identical

16:28 tbaldridge: wingy: the idea is that you setup reactions between the UI elements. So instead of saying "when slider 1 changes, set the size of this circle to slider.value * 2". You simply say "circle.value = slider.value * 2" and from then on that constraint is automatically recalculated as needed

16:29 wingy: tbaldridge: would be cool with such framework

16:29 impossible for me to know how to do

16:31 tbaldridge: Agreed. FRP (functional reactive programming) toolkits exist in other LISPs (racket for instance), but I haven't seen a good one in Clojure yet.

16:36 dnolen: wingy: you actually end up doing it by hand with events. FRP and things like is about finding a less manual abstraction.

16:39 wingy: damn i love Light Table. much better than using a typical REPL

16:39 Wild_Cat: wingy: it does look like it's gonna be awesome, yeah.

16:40 wingy: cool that its in Clojure

16:40 Wild_Cat: especially once it supports Python in addition to Clojure

16:40 wingy: you are a pytonist?

16:40 ibdknox: I dunno, I think the guy building it is gonna run off with the money.

16:41 Wild_Cat: wingy: yeah. It's been my day job for the past5 years or so

16:41 ohpauleez: ibdknox: I heard that. That's what I've been telling everyone at least

16:41 ibdknox: ohpauleez: I met him once, he was a total ass to me.

16:41 ohpauleez: haha

16:42 nDuff: ibdknox: Is nREPL support for Light Table on the roadmap? Most of my use cases for Clojure involve embedding the runtime inside a larger environment / container.

16:42 Wild_Cat: so under the hood, LightTable is a webkit frame with Noir running underneath?

16:42 ohpauleez: Wild_Cat: Noir and CLJS

16:42 Wild_Cat: or did I completely misunderstand the info?

16:43 ibdknox: nDuff: yeah, you'll be able to do that stuff

16:43 Wild_Cat: CLJS? where does it fit in?

16:43 ibdknox: Wild_Cat: it is technically noir

16:43 though it's talking over websockets

16:43 mattmoss: It seems to me that emacs, with some modes and such, could do exactly what Light Table does.

16:43 ibdknox: so it's not *really* using noir

16:43 mattmoss: I don't understand the big deal about Light Table, except that it's "pretty" I guess, and brings up docs in context.

16:43 ibdknox: mattmoss: what I released yesterday? sure.

16:44 mattmoss: let me know when you can do everything else I've shown :)

16:44 Wild_Cat: oh, I didn't see that something had been released. Awesome!

16:44 mattmoss: ibdknox: Will do.

16:44 ibdknox: Wild_Cat: CLJS is used for all of the front-end

16:45 technomancy: mattmoss: the main problem with implementing live-tracing is that you either have to do it on top of slime, which is a big legacy codebase controlled by CLers, or implement full nrepl support from the ground up

16:45 ibdknox: also, fwiw, never underestimate the value of pretty

16:45 samaaron: ibdknox: let me know when LT has a paredit mode - that would be a killer feature for me

16:45 dnolen: mattmoss: fat chance re: Emacs (which I love)

16:45 ibdknox: samaaron: It should materialize not too far down the road I suspect

16:45 mattmoss: I admit not knowing the issues involved. And perhaps I don't understand all that Light Table does (or hopes to) accomplish.

16:46 But it would be hard to leave behind emacs for something that is not emacs. Ne?

16:46 ibdknox: eh, the greater majority of the programming world doesn't use emacs, so *shrug*

16:46 Raynes: Emacs users will probably keep using Emacs.

16:47 I'm not particularly attached to any given editor, so I'd happily give light table a shot. I definitely want it to have paredit, but beyond that...

16:47 (or something similar to paredit)

16:47 wingy: just as long as i dont need to jump between multiple pages for documentation

16:47 everything right THERE

16:47 technomancy: mattmoss: if someone finished nrepl.el I would probably take a shot at implementing live-tracing, hint hint. =)

16:47 AWizzArd: wingy: there is only so much space…

16:48 dnolen: mattmoss: depends on what you're doing.

16:48 mattmoss: C-x M-c M-butterfly...

16:48 AWizzArd: Every tool will have to make compromises.

16:48 cgag: Iid definitely give it a shot, but i can see it being hard to give up vim bindings

16:48 dnolen: mattmoss: I could imagine using Emacs for backend code, but something like LightTable for intensive UI / game programming could be pretty sweet.

16:48 Raynes: cgag: Perhaps we can have Vim bindings in light table?

16:48 ibdknox: cgag: I'm a vimmer :)

16:48 S11001001: where is butterfly on keyboard

16:48 wingy: ibdknox: why do you think he is going to run out of money? isn't he having investors by now?

16:48 * ibdknox chuckles

16:48 Raynes: I was a vimmer for a while. I use evil-mode in Emacs just because I think the keys are somewhat saner in some cases.

16:48 cgag: ha

16:49 wingy: AWizzArd: and i aint gonna read everything at once .. show what i wanna see at any point of time

16:49 mattmoss: I could do with vim as well... that's been my main mode for years now.

16:49 cgag: wingy: he said run off

16:49 ibdknox: wingy: I was joking. :) He = me

16:49 cgag: but also

16:50 that

16:50 samaaron: I guess given that everyone's spouting about editors, I should throw in a plug for Emacs Live: http://github.com/overtone/emacs-live

16:50 wingy: ibdknox: are you that guy building it?

16:50 Raynes: wingy: ibdknox *is* the light table guy.

16:50 ibdknox: wingy: I am indeed

16:50 wingy: oh .. didnt know

16:50 technomancy: samaaron: dude... you need to get on the package.el train

16:50 Raynes: And I'm the light table guy by association, because I'm friends with the real light table guy.

16:50 Wild_Cat: samaaron: I did take a look at Emacs Live, and it makes Emacs much more usable than the stock version. I can't figure out how to make it run a custom script with additional settings on startup, though

16:50 wingy: lucky me i wasn't talking shit about you :)

16:50 samaaron: technomancy: bah, i prefer git submodules

16:50 technomancy: =(

16:51 Raynes: samaaron: Get out of my channel.

16:51 amalloy: i can't think of anything i prefer git submodules to

16:51 technomancy: I went down that road in 2008, it doesn't end well

16:51 Wild_Cat: (I want global-linum-mode and start-server in addition to the rest)

16:51 samaaron: amalloy: a pint of bacon?

16:51 amalloy: even just an empty pint glass is better than git submodules

16:51 samaaron: technomancy: where does it lead? I'm a happy camper so far

16:52 Raynes: samaaron: We should make Leiningen use git submodules for dependency management instead of leiningen.

16:52 maven*

16:52 samaaron: Wild_Cat: send me an email - I'll walk you through the process - I'm still working on documentation

16:52 Wild_Cat: samaaron: oh, and I want something to auto-strip trailing whitespace on save, but I don't even know whether Emacs can do that in the first place.

16:53 samaaron: sure, will do that now. Thanks.

16:53 technomancy: samaaron: packages compose, submodules lead to blob-o-code

16:53 S11001001: Wild_Cat: it can

16:53 Raynes: Wild_Cat: Pretty sure amalloy has code to do that.

16:53 samaaron: Wild_Cat: Emacs Live is set up to do the whitespace autostripping for you

16:53 amalloy: (add-hook 'before-save-hook 'whitespace-cleanup)

16:53 Wild_Cat: samaaron: oh, you're right, it does. My bad.

16:53 samaaron: Wild_Cat: https://github.com/overtone/emacs-live/blob/master/packs/live/foundation-pack/config/built-in.el#L65

16:54 wingy: ibdknox: you didnt wanna use Ace since you see them as competitor? :)

16:54 and what do you think about cloud9ide

16:54 ibdknox: wingy: no, they're not really a competitor

16:55 and I didn't use ACE because it's a disaster :p

16:55 wingy: how so

16:55 whats bad

16:55 ibdknox: setup, customization

16:55 samaaron: technomancy: blob-o-code? You mean transitive deps?

16:55 ibdknox: the code base is a mess

16:55 I dropped codemirror in and it worked

16:56 I then needed to customize it and it was easy

16:56 most new things these days are using CodeMirror

16:56 wingy: i c

16:56 not github!

16:57 technomancy: samaaron: packages make it much easier to focus on each tool providing independent functionality that can be used in any context

16:58 samaaron: I pushed as much of the starter kit as possible out into independent packages and now I get a lot more feedback/contributions from the wider community

16:58 since it's easy for anyone to just pull in the bits they want

16:58 samaaron: that's nice

16:58 so do packages allow for transitive deps?

16:58 technomancy: yeah

16:59 cgag: Raynes: did you use nerdtree when you used vim?

16:59 technomancy: but the main thing is orthogonality

16:59 samaaron: technomancy: and what about transitive deps collisions?

16:59 cgag: if so, what do you use with emacs/evil?

17:00 technomancy: samaaron: right now the mechanism is pretty primitive; it's a "this version or newer"

17:00 Raynes: cgag: Not really, no.

17:01 technomancy: since there's no way to isolate or sandbox except for per user I'm not sure if you could come up with anything much better than that

17:01 Raynes: technomancy: Maven's apparently isn't much better.

17:01 technomancy: I've got issues where it pulls in ancient versions of ring when I wish it would prefer the newest version in the transitive deps.

17:01 samaaron: technomancy: yeah, so basically for now Emacs Live punts on the deps problem as I wasn't (and probably still not) interested in making a super general, expandable, fits-all-usecases config

17:02 TimMc: 17:01 < Raynes> I've got issues

17:02 samaaron: I just wanted to release my .emacs.d in a way other people could explore and use

17:02 Raynes: Heh

17:02 wingy: ibdknox: when do you think we will see complete version which can be used to open/save files?

17:02 technomancy: samaaron: in elisp super general doesn't mean abstract and extensible a la architecture astronauts, it typically just means doing one thing and doing it well

17:03 Raynes: all you gotta do to fix that is find which joker introduced version ranges and yell at them till they stop; easy peasy

17:03 samaaron: sure, but i'm not interested in supporting such a wide range of users

17:03 TimMc: wingy: I would imagine it will be awhile -- I think he's still studying how people interact with a live-eval editor.

17:03 Raynes: technomancy: I don't see any verison ranges anywhere.

17:04 samaaron: with git submodules I have very tight control of what I'm pulling in

17:04 TimMc: wingy: There's also #lighttable

17:04 wingy: cool

17:04 samaaron: and also, most users won't need to know about the submodules, as i only use them for dev work

17:05 but i will find some time to look into packages.

17:05 technomancy: Raynes: oh, you mean you're getting an old version just because you didn't declare a top-level dep?

17:08 Raynes: technomancy: Yes. Look at refheap's current project.clj. noir 1.3.0-beta10 depends on ring 1.1.1 which depends on ring-core 1.1.1. However, I also depend on mongo-session which depends on ring 1.0.someotheroldcrap, and it gets pulled in instead of the newer version that noir depends on. Because of that, I have to add an exclusion to the mongo-session dep until amalloy stops being lazy and updates his dependencies.

17:09 technomancy: Raynes: why not add a top-level dependency instead of an exclusion?

17:09 Raynes: Because my code isn't the code that depends on it. *shrug*.

17:09 It feels wrong

17:10 amalloy: i'm not going to create a new release of all my projects every time any dependency creates a release, and neither are you, Raynes :P

17:10 dnolen: bbloom: http://www.50ply.com/cljs-bench/, nice looking CLJS graphs for #{}

17:11 bbloom: dnolen: hah. nice. that's what i expected :-)

17:11 Raynes: amalloy: Sure I will!

17:11 bbloom: dnolen: i didn't realize the graphs backfilled new benchmarks

17:12 technomancy: Raynes: dunno; a top-level dep seems simpler than an :exclusion

17:12 dnolen: bbloom: he moves over the benchmarks by hand, he doesn't use exactly what we have in the repo.

17:12 duck1123: Raynes: you're the one that cares what version you get

17:13 Raynes: Well, I don't really care about any solution. I'm more bothered by the fact that 15 people have reported a noir bug that doesn't exist because of maven's crappy dependency resolution. :p

17:14 bbloom: dnolen: ah oh. anyway, i'm trying to find a decent chunk of time to put some more elbow grease into reified keywords and symbols. i need to really untangle declaration order to get rid of a bunch of warnings. it's tricky to decide which functions to define in terms of which other functions while bootstrapping core.cljs, especially when you can't use :else in a cond for fear of instantiating a keyword object! :-)

17:15 dnolen: i was also trying to see how painfully slow it would be to make a Character class. similar identical? vs eqiv problem pops up

17:16 dnolen: may be able to utilize a similar whole-program optimization of memoizing Character objects from literals

17:16 dnolen: bbloom: could be interesting but way lower priority in my opinion.

17:17 bbloom: w/o the keyword patch much more common ops are slow.

17:18 bbloom: dnolen: yup, i'm aware of where it falls on the priority list. I'm trying to balance the priority list with my own "heh, this sounds fun" approach. it's a nice reprieve from "real" work

17:19 dnolen: bbloom: :)

17:20 bbloom: dnolen: regarding common ops that are slow sans keyword patch. you seem to know which those are in your head. can you do me a favor and add benchmarks for them and send them my way? i'll make sure i keep an eye on those when working on it

17:21 dnolen: bbloom: anything where keywords are used as functions that's not in the (:foo ...) form. because that will go through String.prototype.call

17:21 bbloom: bbloom: ah, so higher order use? like map, comp, etc?

17:22 dnolen: (map :foo ...) (filter :foo ...) (#(% ...) :foo) etc

17:23 bbloom: dnolen: gotcha.

17:26 cljnewb_029582: (cc/POST "/hset-notes" {params :params} ) <-- this can read the params of a POST request.

17:26 Is there a way to retrieve a GET request params like this as well?

17:28 wingy: does FP mean that there should be no classes/objects?

17:28 or are the functions still objects

17:28 having a class

17:28 i know that clojure is like that but is that just because it's based on Java?

17:29 Luyt_: Clojure isn's based on Java... It just runs on the JVM (Java Virtual Machine)

17:29 gtrak: lexical closures live on the heap in other langs too

17:29 maybe a C struct instead of an object

17:30 same difference

17:30 dnolen: wingy: there are other lisps that have object like things at the bottom. T, OakLisp. Lots of benefts derived from this design.

17:30 wingy: in fact IMO, a massive improvement to Lisp.

17:31 brehaut: wingy: footnote of http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

17:31 s/footnote/appendix?/

17:31 gfredericks: (defmacro if [c t f] `(({true (fn [] ~t) false (fn [] ~f)} (boolean ~c))))

17:33 wingy: so he is combining functions with objects

17:33 just to satisfy both worlds

17:33 brehaut: ‽ no they are isomorphic

17:34 wingy: damn i learn new stuff here all the time

17:34 never a sec of resting

17:34 * gfredericks imagines rest day in #clojure

17:34 brehaut: gfredericks: its when all of you americans are flying to the conj

17:35 nothing but tumbleweeds and antipodeans here

17:35 dnolen: wingy: part of of the problem with Lisp isn't there anyway to tweak stuff like cons, car, cdr. Those meanings are traditionally hardcoded. By putting object like things at the lowest level and exposing protocols - those things become configurable.

17:37 * tmciver had to look up antipodeans

17:38 aperiodic: brehaut: what is NZ the antipode of?

17:38 brehaut: tmciver: i believe that in top hemisphere, you look down antipoedeans, and we look up

17:38 aperiodic: common usage?

17:38 gtrak: dnolen: I think that kinda relates to the abstraction delineation argument... we basically had to say... 'stop! this is your foundation now'

17:39 brehaut: although i think spain actually

17:40 gfredericks: surely most land is across from water

17:40 if you are across from land you are one of the fortunate few

17:40 gtrak: theoretically closures at the bottom is good enough but we have to draw the line somewhere

17:40 brehaut: gtrak: turtles

17:41 gtrak: well no, social concerns are the drivers

17:44 in lisp infinity is more accessible :-)

17:44 dnolen: gtrak: I don't follow.

17:44 gtrak: delineation bit

17:45 gtrak: ah, well you said the objects exist since we couldn't parameterize the cons's, we can't parameterize them because they're accessible to the programmer

17:46 maybe they were the wrong abstraction for the bottom, but the ramifications propagate up the levels

17:47 someone has to come along and create a new thing, then convince everyone else to use it

17:48 another example... some optimizations might be more suitable for bytecode than lisp forms

17:48 because there are more invariants

17:49 dnolen: gtrak: if you mean it wasn't obvious that cons should be polymorphic in the early days ... sure.

17:49 gtrak: given the existence of machine oriented lisps, not sure I even agree w/ that. Have you seen Maru?

17:49 or GOOL

17:49 & GOAL

17:49 lazybot: java.lang.RuntimeException: Unable to resolve symbol: GOAL in this context

17:50 gtrak: hmm, that looks cool

18:14 SrPx: Hey guys... maybe it's asking too much but would any of you be kind enough to write the Clojure's equivalent of this very small code? That would be unlightening. I've read all manual and it's still not clear.

18:15 http://paste.pound-python.org/show/23488/

18:15 englightening *

18:18 gtrak: ,(assoc {:hp 0 :pos [0 0 0] :items []} :hp 10)

18:18 clojurebot: {:hp 10, :pos [0 0 0], :items []}

18:18 cgag: (def player {:hp 10 :pos [0 0 0] :items [])

18:18 amalloy: SrPx: there's no single equivalent, because the design decisions made in python won't be made in clojure

18:18 qbert_: hi all, new to clojure, does the repl have any sort of history ?

18:19 SrPx: cgag: gtrak ty, now how do I update it's position, pos and items values?

18:19 gtrak: SrPx: make functions, like C or something

18:19 except immutable

18:19 brehaut: (defn damage [char dmg] (update-in char [:hp] #(- % dmg)))

18:19 SrPx: (defn damage [player,amount] ...

18:20 brehaut: yay

18:20 update-in is an existing function?

18:20 brehaut: yes

18:20 gtrak: SrPx: it's not in-place, it'll return a new map

18:21 brehaut: SrPx: the block of mutating an existing player is quite difficult to give you a direct translation though as amalloy pointed out

18:22 amalloy: brehaut: (update-in char [:hp] - dmg)

18:22 brehaut: amalloy: oh yeah, duh. thanks

18:23 amalloy: this message brought to you by the Lambda Preservation Society

18:24 brehaut: lol

18:24 technomancy: clojurebot: recite the litany against cons

18:24 clojurebot: eventual consistency is for losers

18:24 technomancy: what?

18:24 clojurebot: what is exceptions

18:24 technomancy: clojurebot: litany against cons

18:24 clojurebot: litany against cons is "I must not cons. Cons is the perf-killer. Cons is the little death that brings total obliteration. I will face my cons and permit it to pass over me and through me, and when it has gone past I will turn my GC to see its path. And where it has gone there will be nothing; only I will remain."

18:24 SrPx: brehaut: but it's okay, I just have to change the char variable to the updated hash, right?

18:25 brehaut: can I do it (that is, is this often done in clojure?)

18:25 or there are other ways to deal with this problem

18:25 brehaut: SrPx: thats exactly the problem. 'changing variables' is antithical in clojure (and 'pure' FP)

18:26 SrPx: antithical?

18:26 amalloy: antithetical

18:26 brehaut: thanks

18:27 amalloy: btw brehaut, your blog looks nice now

18:28 brehaut: amalloy: thanks :)

18:28 SrPx: in clojure, data is immutable and you cant reassign a variable. you structure your program different as a result. your example is small enough that there is not enough context to suggest what the idiomatic alternative might be

18:28 scriptor: so, someone mentioned before that there're a bunch of experiments being done with how to architect cljs apps

18:28 brehaut: amalloy: by nice you mean you can read it without sunglasses?

18:28 scriptor: anyone have any links? The more I try backbone the more jaded I get

18:30 SrPx: brehaut: you can't reassign a variable??

18:30 lazybot: SrPx: What are you, crazy? Of course not!

18:31 amalloy: (inc lazybot)

18:31 lazybot: ⇒ 6

18:31 brehaut: SrPx: nope. you can redefine a 'def'd var, but that is really only for dev time stuff, rather than in a real program (plus they are global)

18:31 SrPx: brehaut: that was what I meant. Just keep redefining with def. Is this wrong?

18:31 brehaut: (and you shouldnt (re)def something outside of the top level

18:31 yes thats extremely wrong

18:32 amalloy: SrPx: yes, very

18:33 brehaut: SrPx: functional programming is about programming without mutation or side effects. You write functions that take some arguments and return a new thing based solely on those arguments. ie if you run the same function a thousand times with the same arguments the return should be the same value

18:33 amalloy: SrPx: a very simple skeleton for a game loop without reassigning anything might look like (reduce (fn [world action] (create-new-world world action)) (initial-world) (lazy-seq-of-input-actions))

18:33 SrPx: hmm. So an example, a game where I have many players with lots of attributes such as hp, atk, def, inventory. They can each other, gain exp, track what player each other player have killed, login data and so on...

18:34 cgag: that's the most relevant bot response i've seen

18:34 SrPx: amalloy: hmm ? wait

18:34 cgag: ?

18:35 cgag: lazybot: SrPx: What are you, crazy? Of course not!

18:35 scriptor: SrPx: in essence, you're creating a new world every time a "change" happens

18:35 in an imperative language, it might be something like:

18:35 SrPx: cgag: I didn't get it...

18:35 scriptor: new_world = world; new_world.foo = world.foo+5

18:36 dabd: I'd like to redefine a function that is in the ns incanter.charts. If I try to redefine it in my ns using (defn incater.charts/heat-map* ...) I get an error saying I can't redefine a function from a different ns. How can I do this?

18:36 SrPx: scriptor: sure, I think I got this concept, but people just said it is wrong to update the value every 'tick'

18:36 the variable that points to the value

18:36 I'm confusde

18:36 nDuff: SrPx: If you want to modify state, that's what all of Clojure's state-management primitives are for -- atoms, refs, agents, etc.

18:37 SrPx: You shouldn't be re-deffing the value; you should be using whichever of those primitives best fits your problem

18:37 SrPx: (if what you really want is to just do an atomic change with no locking or synchronization, well, that's what an atom is for)

18:38 SrPx: ...so, if you're redefining the whole world, an atom might fit; if you have a number of different, associated things that change in ways related to each others, refs might make more sense.

18:39 wingy: when should i use #_ and when should i use comment

18:40 nDuff: SrPx: ...even if what you want really _is_ to modify the root value of a var (ie. what def creates), that's what set! is for.

18:41 Raynes: wingy: (comment ..) only works for code that actually compiles.

18:41 brehaut: nDuff, SrPx: i think perhaps going down the mutable state escape valves as a clj beginner (especially anything to do with vars) might be a rabbit hole you might do better to avoid till you understand the functional approach better.

18:42 cgag: #_? Do you mean ;? or is there a block comment literal?

18:42 nDuff: cgag: #_ is a reader macro for (comment ...), IIRC

18:43 cgag: ...if memory serves, (comment ...), just like #_(...), doesn't make it out of the reader into the compiler.

18:43 brehaut: cgag: #_ is a reader macro to skip the next form

18:44 cgag: while we're on comments, is there any kind of convetion around using ;; vs ; or is that just a style choice?

18:44 from what Raynes said it sounds like comment does make it to the compiler?

18:44 hiredman: ;; is for block comments

18:44 amalloy: nDuff: no, comment is strictly less powerful

18:44 nDuff: Ahh.

18:44 hiredman: ; is for comments after corms

18:45 amalloy: &[(comment foo) 1]

18:45 lazybot: ⇒ [nil 1]

18:45 amalloy: &[#_(foo) 1]

18:45 nDuff: Heh.

18:45 lazybot: ⇒ [1]

18:45 * nDuff just learned something.

18:45 cgag: ah interesting

18:45 amalloy: and Raynes's statement wasn't really accurate either. both comment and #_ work only on code that can be read successfully; it doesn't have to compile, though

18:45 hiredman: http://mumble.net/~campbell/scheme/style.txt

18:46 SrPx: nDuff: I have to take a look on those yet, I didn't understand well on the first reading.

18:46 amalloy: hiredman: i prefer http://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html for cgag's particular question

18:47 SrPx: brehaut: I didn't understand what you said, sorry (I've read it some times and translated on google but it didn't work for the words I don't know)

18:48 dabd: I am using with-redefs to temporarily redefine a function from another namespace. Is this the correct way?

18:48 SrPx: Do you guys know Tibia? http://3.bp.blogspot.com/_LpPTq_PHIWI/SxFoQbN63PI/AAAAAAAAAFk/NkqJEjb1Y30/s1600/tibia.jpg Like I said, every player has a pos, inventory, there's a map with the items that are on each position

18:48 shawnlewis: srpx: This is a great example of the functional-style as related to games: http://java.ociweb.com/mark/programming/ClojureSnake.html

18:49 SrPx: My question is pretty much, first, if that kind of game is possible to be done in Clojure, and second, if it's natural to it (that is, would it be harder to program it than in a traditional language like Python - for one that knows clojure well)?

18:49 shawnlewis: let me see

18:50 shawnlewis: srpx: and here's a version that works with clojure 1.3: https://github.com/shawnlewis/clojure-snake-game

18:50 Iceland_jack: SrPx: It's possible to do it in Clojure. But the solution will be different from a Python one

18:50 SrPx: shawnlewis: this is beautiful

18:51 shawnlewis: I like how the code has a minimal syntax, yet you can read any part of the source and it perfectly says what it is doing.

18:52 shawnlewis: it is very different from reading a Java / C++ game

18:52 Iceland_jack: Different in "someone who mastered both would do better/faster in python" or "just different".

18:53 Iceland_jack: That's a pretty tough call to make

18:54 cgag: i think it'd be easier for someone who hasn't mastered both to do it in python, if just from a lot of other people having made games in python

18:54 frozenlock: A little question for mongoDB users: Is there a way to make the equivalent of (merge {:a 100 :b 2} {:a 1000} {:a 10}) => {:a 10 :b 2} but on the server side? (perhaps with a js function?)

18:55 shawnlewis: How can I use a macro like (defrecord) at runtime? (If I want be able to generate record types on the fly)

18:57 qbert_: do ya'll use commas in clojure ? just looking for best practices

18:57 frozenlock: qbert_: too long to type :)

18:58 But it's handy to have them in the REPL

18:58 cgag: i never really use them, it's always weird going back to ruby and being forced to use them everywhere

18:58 Iceland_jack: qbert_: I sometimes use them when I'm writing argument vectors or maps that contain many mappings but not many enough to write one-per-line

18:59 qbert_: ok good to know :)

18:59 frozenlock, I don't know what merge does, it takes the least value of any named variable and merges them into one map ? I use a lot of m ongo

19:00 Iceland_jack: qbert_: Basically if the same key appears twice

19:00 qbert_: wait it takes the last named variable or the lowest ?

19:01 sorry, the last key found*

19:01 Iceland_jack: http://clojuredocs.org/clojure_core/clojure.core/merge#example_81

19:01 (you might want to check out merge-with)

19:03 frozenlock: Interesting, never used merge-with. Seems useful.

19:04 * frozenlock takes a mental note

19:04 qbert_: Ahh, frozenlock this should work then , http://pastebin.com/NGibFv9M , and if you haven't stored functions in mongo before, http://pastebin.com/hkwLLB7c

19:04 amalloy: qbert_: rarely. i sometimes use them as "abbreviations" for a newline: sorta like "the standard way to format this would be a newline, but the code is short and i don't think a newline is needed"

19:04 cgag: definitely a good one to have a mental note about

19:05 Raynes: qbert!

19:05 That's like my favorite game ever.

19:05 Iceland_jack: It's very handy for merging e.g. recordos of scores ##(merge-with + {"sally" 10} {"sally" 58, "john" 41})

19:05 lazybot: ⇒ {"john" 41, "sally" 68}

19:05 Iceland_jack: s/os/s/

19:06 frozenlock: qbert_: thanks! Is there a big benefit in saving directly in the db, rather than sending the function each time?

19:06 nDuff: qbert_: Could I ask that you avoid pastebin.com (being full of ads)? Both http://refheap.com/ (maintained by Raynes) and gist.github.com are both more featureful and ad-free.

19:06 qbert_: frozenlock, not performance wise just for code clarity

19:07 Raynes: I'm fueled by fundraisers, baby.

19:07 qbert_: nDuff, sure, I only use pastebin because I never took the time to look for a new one

19:07 technomancy: nDuff: you should see if you could get lazybot to auto-nag for pastebin too along with riddell.us and friends

19:07 lazybot: The riddell.us tutorials are much more highly-ranked on Google than they deserve to be. They're old and way too complicated. If you're trying to install Clojure...don't! Instead, install Leiningen (https://github.com/technomancy/leiningen/tree/stable) and let it manage Clojure for you.friends

19:07 frozenlock: qbert_: ok thanks! Using congomongo, I'll probably send the function each time. This way everything is in the same .clj file

19:07 technomancy: Raynes: probably safe to drop that one now, eh? ^

19:08 qbert_: Raynes, looks slick man

19:08 Raynes: I'd hate to discriminate against pastebins.

19:08 amalloy: technomancy: is it? did the google rankings change?

19:08 * frozenlock loves gist

19:08 technomancy: amalloy: he finally took it down

19:08 amalloy: !!!

19:09 technomancy: yeah, we should get lazybot to do a little dance too

20:05 weavejester: hey, I've been circling back to ragtime, have a few thoughts

20:06 weavejester: technomancy: Go ahead, but I'm a little sleepy, so I can't guarentee any insightful feedback :)

20:07 technomancy: I was just thinking about stripping things down to two things: sql files in a dir and clj files

20:08 weavejester: technomancy: Wouldn't those be libraries that depend on ragtime?

20:08 technomancy: I was looking at integrating ragtime into a project I'm working on and felt a bit of abstraction overload; it seems like most projects are going to get by fine with just that

20:08 weavejester: technomancy: I was kinda taking the "ring" approach, in that you probably don't want to use ragtime directly, but want to wrap it in something

20:09 But that something is likely going to be opinionated

20:09 Some people might want files

20:09 technomancy: I realized I just want two things: 0) functions to give me {:id/:up/:down} maps given a directory and 1) a function to filter out a seq of migration maps to just the ones that need to be run to reach a target migration level

20:09 weavejester: Others might want to declare it in a clj file

20:10 1 seems generic enough to include in ragtime

20:10 I'm not 100% sure about 0… perhaps as a separate package...

20:11 technomancy: here's what I want to be able to write in my app:

20:11 (doseq [m (r/migrations-for (r/merge (r/sql-from-dir dir) (r/clj-from-dir dir)) target)] (m))

20:13 merge composes migration sets in a way that wraps complementary .clj/.sql migrations in a transaction

20:16 anyway... I knocked out a prototype in ~70 loc: http://p.hagelb.org/ragtime.lite.html

20:18 so the disadvantage here is it assumes sql for both transactions and storing the list of applied migrations. but the simplicity is nice.

20:18 weavejester: technomancy: Sorry, got called away for a moment

20:19 I wonder whether sql-from-dir and clj-from-dir are the right solution...

20:19 They seem similar...

20:20 Like if you had a "from-dir" function

20:20 technomancy: yeah, I'd be more inclined to factor that out if it were more than 10 LOC =)

20:20 weavejester: I'm wary of putting too many specifics into ragtime itself, or at least the core library

20:21 Some people would want to split their migrations up into files in a directory

20:21 But others wouldn't

20:21 I don't think the core should prefer one way over another, in the same way that Ring doesn't have anything to say about routing per se

20:21 technomancy: well the thing is this kind of stands on its own without the existing ragtime.core

20:22 weavejester: technomancy: Wouldn't it require ragtime.core and ragtime.sql?

20:22 Build on top of it?

20:22 technomancy: well, what I've got here is standalone

20:23 weavejester: Don't you need… for instance… a migrations SQL table to keep track?

20:23 hiredman: given that sql migrations are a subset of clojure migrations (because clojure canexecute arbitrary mysql) is there a reason not to make migrations a set of namespaces full of clojure functions?

20:23 technomancy: it's there at the top

20:24 hiredman: I realized the reason I like separate .sql files is for syntax highlighting

20:24 weavejester: hiredman: ragtime kinda does that. Each migration is a map consisting of :id, :up and :down. The :id uniquely identifies the migration (so we don't run it twice), the :up and :down are functions

20:24 ragtime.core is independent of SQL or databases

20:25 hiredman: technomancy: you can put you sql in another file and slurp it in your migration function

20:25 technomancy: weavejester: anyway, I guess you could say this prototype is an experiment to see whether writing other functions like sql-from-dir and clj-from-dir is good enough as an extension point

20:25 hiredman: your

20:25 weavejester: ragtime.sql adds functionality to maintain a list of applied migrations in a table

20:25 steveo_: do any of the prismatic guys hang out here? And if so are they going to open source the flop, store and graph libraries anytime soon?

20:25 technomancy: rather than extending the ragtime.core protocols

20:26 weavejester: technomancy: I'm all for experiments :)

20:26 SrPx: So I noticed calling a function with a wrong number of arguments is a error. Can I change this behavior so that instead it calls (partial func my_args) ?

20:26 dnolen: SrPx: nope

20:26 SrPx: )'=

20:26 *okay

20:27 technomancy: pros: bringing your own map-producing function is much simpler; cons: it locks you into ragtime.lite's way of storing the applied migration list

20:27 steveo_: going my their history I wouldn't hold your breath

20:29 weavejester: technomancy: What do you mean? The applied migration list is a protocol function in core.

20:29 steveo_: damn, they look so cool

20:29 weavejester: technomancy: In ragtime.sql the protocol is implemented to store it in a table, but that's not mandatory...

20:30 technomancy: weavejester: right, but my hack I pasted doesn't use that part; it all lives in ragtime.lite

20:31 weavejester: technomancy: Oh right!

20:31 technomancy: Sorry, I misunderstood.

20:33 technomancy: I'll give it a spin with this small app I'm putting together

20:33 probably shouldn't call it ragtime.*, but I started there and got carried away =)

20:33 weavejester: technomancy: Let me know how it works out

20:33 gfredericks: if you want a namespace called ragtime.*, do you have to put it in src/ragtime/_STAR_.clj?

20:35 technomancy: src/rock/_STAR_.clj

20:35 gfredericks: :)

20:37 brehaut: ,(use 'rock.*)

20:37 clojurebot: #<RuntimeException java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate rock/*__init.class or rock/*.clj on classpath: >

20:37 gfredericks: woah

20:37 ,(use 'rock.-*)

20:37 clojurebot: #<RuntimeException java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate rock/_*__init.class or rock/_*.clj on classpath: >

20:37 gfredericks: weeerd

20:37 - must be special case

20:37 brehaut: apparently * isnt name munged?

20:38 gfredericks: ,(use 'rock.-*_$#)

20:38 clojurebot: #<RuntimeException java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate rock/_*_$#__init.class or rock/_*_$#.clj on classpath: >

20:40 xeqi: I can't imagine it being legal

20:40 wouldn't it mess with java's import statements

20:51 wingy: clojure might have the best doc of all langs

20:55 technomancy: that's probably the first time anyone has ever said that

20:56 wingy: how can it not have .. everything is just there

20:56 i remember 2 years ago on Ruby .. it was so bad documented

20:56 kinda like a toy

20:56 hiredman: technomancy: hey man, I think clojure.org is pretty good

20:57 technomancy: whoa; when did the special forms get their :doc metadata added?

20:57 hiredman: doc special cases special forms

20:57 wingy: who is rich hickey in here?

20:58 hiredman: has forever, which is why it doesn't work in clojurebot (I am too lazy to special case them)

20:58 gfredericks: $seen rhickey

20:58 lazybot: rhickey was last seen quitting 3 weeks and 5 days ago.

20:58 wingy: thx

20:58 gfredericks: ,'(ns %!:>-+#:<$&=*:.core)

20:58 clojurebot: (ns %!:>-+#:<$&=*:.core)

20:58 hiredman: wingy: he is rarely in #clojure these days

20:58 technomancy: hiredman: yeah, but didn't it used to just say "see http://clojure.org/special_forms" or something?

20:58 wingy: hiredman: we know why?

20:59 hiredman: you'd have to ask him

20:59 I think he has refered to irc as an "opinionfest"

20:59 gfredericks: it is not an opinionfest imho

21:00 technomancy: he's probably still here under a pseudonym

21:00 gfredericks: $seen notrhickey

21:00 lazybot: I have never seen notrhickey.

21:00 wingy: perhaps he is watching how you are behaving in this channel against newcomers

21:00 technomancy: $seen such-an-opinionfest-as-this-channel

21:00 lazybot: I have never seen such-an-opinionfest-as-this-channel.

21:01 gfredericks: (inc tecnhohamncy)

21:01 lazybot: ⇒ 1

21:01 hiredman: wingy: that would be hard to observe because after enough stupid questions I just put people on /ignore

21:02 septomin: where are they holding opinionfest this year? probably somewhere i hate

21:02 technomancy: gfredericks: I took Stupid Bot Tricks 101 from jlf.

21:02 wingy: hiredman: oh .. now I know

21:02 im rich hickey!

21:02 gfredericks: the power of rhickey was inside you all along

21:03 wingy: you never stop to learn

21:08 why is google clojure a part of clojurescript

21:08 that forces everyone to load something they don't into the browser?

21:09 dnolen: wingy: advanced compilation eliminates unused code.

21:10 wingy: but is google clojure sent to my browser .. isnt compilation done in server side only

21:10 dnolen: wingy: which part are you confused about?

21:13 wingy: if google clojure library will be loaded into my web site or is the compiler only used server side to compile it

21:13 since people are comparing it to jQuery I kept thinking I have to load closure into my website

21:15 dnolen: wingy: CLJS has a dependency mechanism. but even if you include some Closure Library dep (or CLJS dep), unused functions will get eliminated by GClosure Compiler.

21:19 wingy: dnolen: i see that you are one of the commiters .. would you sincerely recommend using cljs if i start a project from 2 weeks for production usage? are most of the bugs cleared out etc?

21:20 dnolen: wingy: it's alpha software. but people are using it in production. try it out and make your own judgement call.

21:30 frozenlock: Is there a function to dissoc a key from a map inside a map (with any depth)?

21:31 gfredericks: frozenlock: I think update-in can do it

21:31 ,(update-in {:foo {:bar {:baz {:bang 12 :booze 13}}}} [:foo :bar :baz] dissoc :booze)

21:31 clojurebot: {:foo {:bar {:baz {:bang 12}}}}

21:32 frozenlock: Perfect! Thank you very much! :)

21:33 gfredericks: persistent immutable data structures are the knees of bees.

21:34 wingy: can't get why the index nr is after a vector (nth [13 87 56 75] 2) .. compare to (filter even? [1 2 3 45 6 32 3])

21:34 why isnt it: (nth 2 [13 87 56 75])

21:34 seems more natural and consistent

21:35 dnolen: wingy: collection fns take collection as second param - helps with threading.

21:35 wingy: sequence fns take sequence as last params - helps with threading.

21:36 ,(-> ["foo" "bar"] (nth 1) first)

21:36 clojurebot: \b

21:37 wingy: right

21:37 you have it all figured out havent you

21:44 dnolen: wingy: heh well using a PL for a few years helps.

21:45 gfredericks: pommon lisp?

21:45 oh "a PL"

21:45 I missed the "a"

21:47 wingy: whats that?

21:48 gfredericks: programming language

21:48 wingy: :)

21:48 dnolen: what languages have you used?

21:49 dnolen: wingy: dabbled list is long. I've written non-trival programs in Java, C, C++, Obj-C, Python, Ruby, & JS.

21:50 wingy: strongest language is JS.

21:50 * talios twinges at the mention of JS

21:50 dnolen: wingy: and Clojure, but I've only done OSS work w/ it.

21:50 wingy: seems like you are a perfect candidate for coding cljs :)

21:54 (pretty simple to get clojure when you have worked with ruby, coffeescript, livescript)

21:55 Clojure programming was indeed a very very good book for beginners

21:56 dnolen: wingy: Clojure (Lisp really) is a pretty deep well. 50 years of Lisp and still changing ...

21:59 wingy: i totally love it

21:59 no more JS

21:59 i really thought that node.js was going to be my last stop

21:59 you never know when life suprises you

22:00 dnolen: plan on more stops ;)

22:00 wingy: i can't figure out whats next

22:01 i mean how can i ever choose another lang than clojure

22:01 impossible!

22:02 cemerick: heh, that's what I thought when I found python :-P

22:02 wingy: but that's python

22:02 this is clojure!

22:02 gfredericks: oh now that you put it that way

22:02 brehaut: everything is blub to something

22:03 cemerick: (inc brehaut)

22:03 lazybot: ⇒ 7

22:03 * brehaut fears what makes haskell blub

22:03 xeqi: brehaut: omega, coq ?

22:04 brehaut: xeqi: entirely possible :) agda too

22:04 gfredericks: brehaut: there are a finite number of programming languages. Given any partial ordering there must be some undominated language.

22:04 brehaut: gfredericks: take your scary math reasoning somewhere else

22:04 gfredericks: our job is to find it and convince management to adopt it.

22:04 using charts.

22:04 frio: lol wingy

22:04 erlang's next for me

22:05 wingy: gfredericks: haha

22:05 cemerick: brehaut: APL!

22:05 brehaut: cemerick: ahaha :) i fear that, but for different reasons :P

22:05 frio: if clojure ran well on osgi id get to use it for my next pet project

22:07 wingy: "As you can see here .. with this new technology productivity is increased ... and thus sales!"

22:07 cemerick: frio: It does. Counterclockwise is largely written in Clojure.

22:07 wingy: .. they are convinced

22:08 frio: ... interesting cemerick

22:08 i need to run away for a meeting

22:08 but ill look into that :)

22:08 wingy: frio: erlang .. they don't have erlangjs!

22:10 technomancy: gfredericks: the problem is that suck is a unit vector

22:10 there's always some suck, it just often happens to be in a direction a given hacker finds more or less disagreeable

22:12 gfredericks: technomancy: so blub is not a partial order you claim?

22:13 technomancy: maybe a 3D chart where the dimensions are quickness of development, practicality, and compile-time correctness?

22:14 gfredericks: so a developer's preference is some linear combination of those three, producing a subjective total order

22:14 also combined with "what do I already know"

22:16 wingy: sometimes the book refer () to a list and sometimes a sequence .. what is the diff?

22:16 talios: frio - theres work on clojure-osgi underway, and it looks pretty good so far

22:16 gfredericks: list is a data structure, seq is a sequential abstraction

22:17 wingy: gfredericks: that doesnt make me much smarter

22:17 whats the latter

22:17 gfredericks: an interface

22:17 wingy: so list is a sequence

22:17 talios: frio - checkout https://github.com/pmoriarty/clojure-osgi-maven-plugin

22:17 wingy: are there other sequences?

22:17 gfredericks: yes it is

22:18 vectors, maps, sets...

22:18 strings?

22:18 ,(seq "foo")

22:18 clojurebot: (\f \o \o)

22:18 gfredericks: lazy-seqs are certainly seqs

22:18 xeqi: ,(seq? "foo")

22:18 clojurebot: false

22:19 gfredericks: xeqi: yeah I was trying not to get too much into that :/

22:20 wingy: gfredericks: seems that the book have it wrong then: Notice that the value of

22:20 rest here is a sequence, and not a vector, even though we provided a vector to the

22:20 destructuring form

22:20 gfredericks: wingy: what's wrong about that?

22:20 ,(seq? (rest [1 2 3]))

22:20 clojurebot: true

22:22 wingy: ah i get it :)

22:24 gfredericks: but (seq? [1 2]) is false .. why is that if vector is a sequence

22:25 brehaut: ,(instance? clojure.lang.Sequential [])

22:25 clojurebot: true

22:26 brehaut: some things are sequential without being 'sequences'

22:26 sequential things can trivially be converted to a sequence though

22:26 gfredericks: wingy: ##(sequential? [1 2]) might be a more useful test

22:26 lazybot: ⇒ true

22:26 gfredericks: well

22:26 nevermind

22:26 I find all this very complicated.

22:26 also it is the hallmark of clojure's simplicity, I think

22:27 * gfredericks gives up

22:28 cemerick: what's the question?

22:28 gfredericks: why is the question "is X a seq?" so complicated to answer?

22:29 frio: talios: thanks for those links :)

22:30 wingy: where can i find clojure.lang in http://clojuredocs.org

22:30 i just see clojure.core

22:30 wanna find clojure.lang.PersistentVector

22:31 cemerick: gfredericks: (instance? clojure.lang.ISeq x) will evaluate to true only for seqs

22:31 wingy: thats the class for an [] .. so i can see it inherit Sequential to get the pic

22:31 gfredericks: wingy: that's in the java code, which might not be documented anywhere

22:31 cemerick: why shouldn't a vector implement it?

22:32 wingy: but you can certainly find it in the clojure repository

22:33 wingy: hm

22:33 why dont they generate doc for it

22:34 gfredericks: hasn't seemed to be too much of a pain point

22:34 jeremyheiler: gfredericks: because a vector is not a sequence, but something that can become a sequence. It implements clojure.lang.Seqable

22:34 gfredericks: jeremyheiler: what makes a vector not a sequence? it's just a first/rest interface, right?

22:34 wingy: https://github.com/clojure/clojure/tree/master/src/jvm/clojure/lang

22:35 cemerick: gfredericks: Well, I didn't write PersistentVector et al.; but, I wouldn't doubt it if it is as it is because you can (and want to) have all sorts of different seqs over vectors efficiently.

22:36 gfredericks: you could return a different kind of thing for [1,2].next()

22:36 jeremyheiler: gfredericks: calling (seq []) will call the seq() method on the vector, which returns an object that is a sequence over the given vector.

22:37 xeqi: oh, ISeq requires cons

22:37 gfredericks: jeremyheiler: I understand that; it still doesn't tell me why you can't implement seq directly and return this from (seq [])

22:37 (seq? []) => false just seems confusing

22:38 not to mention why should (first [1 2 3]) require an extra object allocation?

22:43 wingy: gfredericks: seems that maps are not sequences

22:43 (sequential? {:a 2 :b 1})

22:43 false

22:43 gfredericks: right

22:43 but they're sequable

22:43 seqable

22:43 wingy: jezz

22:44 gfredericks: I can repeat my vector question for maps, though with somewhat less of a WAT value

22:44 tmciver: wingy: for the most part you don't have to worry about that; hof's like map, reduce, etc "just work"

22:45 wingy: i.e. you can map over a vector or a map without first having to call seq

22:48 jeremyheiler: gfredericks: I suppose it's the same reason ArrayList doesn't implement Iterator. But I understand what you're getting at.

22:49 gfredericks: iterators are stateful aren't they?

22:49 technomancy: you can't cheaply get the rest of a vector without constructing a seq to walk it

22:49 gfredericks: technomancy: sure, but you don't have to create a seq for the whole vector

22:49 technomancy: you certainly don't; it's lazy

22:49 gfredericks: so Vector#seq could return `this` while Vector#next returns a specialized seq impl

22:50 technomancy: ... or seq could just return a seq =)

22:51 gfredericks: ^that's what I meant; wasn't referring to eagerness

22:51 technomancy: if vector implemented seq then that's what it would do

22:51 why do we need to create a new object?

22:51 technomancy: you're going to need one anyway

22:51 why wait for next?

22:51 gfredericks: for what?

22:52 technomancy: if you're calling seq the implication is you're going to want a head and a tail

22:52 gfredericks: or maybe just the head

22:52 and even if you want the tail, that's still one extra object

22:52 technomancy: but it's uniform

22:52 gfredericks: why is that important?

22:52 I'm trying to figure out if this was an intentional decision or just a "meh doesn't matter all that much whatever"

22:53 so the next time somebody asks why isn't (seq? []) I can say something less made up

22:54 technomancy: "prefer has-a to is-a" maybe?

22:54 brehaut: i think that its to do with the access mechanism; you can access any index in O(1*) time?

22:54 (in a vector)

22:55 so its not inherently a sequence, even though it can be treated sequentially?

22:55 gfredericks: so if the caller is expecting a crippled data structure we need to go out of our way to cripple it for them?

22:55 technomancy: I mean the uniformity makes sense to me; walking a vector should start a lazy walk-the-vector operation

22:56 gfredericks: returning this is pretty lazy

22:56 technomancy: teaching vector how to rest itself rather than delegating that to seq feels like shoehorning

22:56 because what the vector is going to do is just construct a seq with the pointer offset by 1

22:56 wingy: clj is it! i found her!!!!!!

22:57 gfredericks: it either has to seq itself or rest itself; seems about the same amount of work

22:57 wingy: time to sleep though .. c u tomorrow and thx for all the lessons

22:57 technomancy: which is basically the exact same thing as calling seq first and then calling rest on that

22:57 brehaut: wingy: i think you should get your keyboard checked, i just got a big pile of exclaimation marks

22:57 technomancy: gfredericks: it sounds like you're arguing for a break in uniformity to avoid a single cons call

22:57 gfredericks: technomancy: I'm more bothered by the seq? function than the extra cons call

22:57 maybe we just shouldn't pay as much attention to (seq?)?

22:58 does it have external utility?

22:58 technomancy: yeah, I don't think that's a useful predicate at all

22:58 wingy: brehaut: each one for my love to clj

22:58 gfredericks: technomancy: okay, if we admit that then I think I'm fine with everything

22:58 technomancy: other than to answer "does this object print with parens?"

22:58 because c.c/list? is a nest of vipers

22:59 gfredericks: alright newbs, you heard him. Stop asking about c.c/seq?

22:59 amalloy: technomancy: well, macroexpansion needs seq?

22:59 because seqs are function calls, and vectors aren't

23:00 technomancy: amalloy: right; because list? is useless

23:00 amalloy: for sure

23:00 gfredericks: I was just thinking it's useful for code-data

23:00 brehaut: technomancy: whoa, its true! i did (source list?) and its (defn list? [x] (instance? 🐍 x))!

23:00 technomancy: brehaut: ಠ_ಠ

23:00 gfredericks: technomancy: let's rename it parens?

23:01 technomancy: gfredericks: (def parens? (comp (partial = \() first str)))

23:01 gfredericks: open a jira

23:01 gfredericks: lol

23:01 man \() is hard to mentally parse

23:01 technomancy: brehaut: it's dumb. clojure.contrib.condition got bit by that

23:01 bitten

23:02 brehaut: technomancy: it does look more than a bit vague

23:07 amalloy: technomancy: pr-str, not str, right? because of ##(str (range))

23:07 lazybot: Execution Timed Out!

23:07 technomancy: yow

23:07 amalloy: wait, i thought that was "clojure.lang.LazySeq@xdfsdf"

23:07 &(str (range 1))

23:07 lazybot: ⇒ "clojure.lang.LazySeq@1f"

23:07 gfredericks: wat

23:07 amalloy: oh, it's computing the hash

23:07 technomancy: does pr-str honor *print-limit* or whatever it's called?

23:08 amalloy: technomancy: it should

23:08 gfredericks: amalloy: it hashes the whole seq to print the useless lazyseq string?

23:08 amalloy: gfredericks: yes, sorry

23:09 gfredericks: ....that's not very lazy

23:10 ,(time (str (range 100000000)))

23:10 xeqi: haha

23:13 TimMc: *cough*

23:13 * TimMc pokes lazybot

23:13 gfredericks: lazybot: is clojurebot okay??

23:13 lazybot: gfredericks: Definitely not.

23:13 * gfredericks calls the botbulance

23:13 TimMc: Oops, right. clojurebot's trigger is ,

23:14 gfredericks: TimMc: I wonder how many neurons I waste keeping track of that fact.

23:14 TimMc: ,(+ 2 5)

23:14 clojurebot: 7

23:14 gfredericks: ,(time (str (range 100000)))

23:14 clojurebot: "Elapsed time: 146.032819 msecs"

23:14 "clojure.lang.LazySeq@49160f51"

23:14 gfredericks: ,(time (str (range 100)))

23:14 clojurebot: "Elapsed time: 0.237375 msecs"

23:14 "clojure.lang.LazySeq@5c8e6fb3"

23:15 gfredericks: well I would have bet probably $100 on that not being the case

23:15 I figured the hex was just the object address

23:15 amalloy: gfredericks: it's the hash code

23:16 gfredericks: ,(= (str (range 100)) (str (range 100)))

23:16 clojurebot: true

23:16 amalloy: which is the object address if you don't override hashCode

23:16 cmajor7: reading more about datomic.. if a peer A reads from its cache, and a transactor is writing into a storage service, would that be true to say that the second peer B, that has its own cache, can read a different datom than A at the same point in time? Or a transactor does not commit until all peers' caches are invalidated?

23:16 TimMc: Oops.

23:16 calvados1: i am using lein to make standalone jar , i got a jdbcappender.jar and i want to include it to uberjar, is there a way to do it ?

23:17 TimMc: I may have killed clojurebot.

23:17 talios: resurrection!

23:17 gfredericks: ,'[has he?]

23:17 TimMc: you did it with your mind?

23:17 clojurebot: [has he?]

23:17 TimMc: slobot

23:18 Yup, that time-str-range thing does it.

23:23 technomancy: wait... are the messages you pass to clojure.test/is supposed to be failure messages or success messages?

23:24 xeqi: would you want it printing out success messages?

23:25 gfredericks: xeqi: you could imagine (it "should be good" (= 1 1 ))

23:25 if string-as-first-arg were allowed :/

23:25 technomancy: xeqi: the pom tests in lein have stuff like "version is correct"

23:25 I would have put "version mismatch" or something

23:25 but I realized the docstring doesn't really say which way is right

23:26 xeqi: bah, use something I wrote against me

23:26 gfredericks: technomancy: I would think it's easier in principle to describe how something works correctly than how it breaks

23:26 (is (= 5 (+ 2 3)) "one prime can't be the sum of two others")

23:27 technomancy: gfredericks: I think I do it that way because the only time you see the message is when it fails

23:27 gfredericks: technomancy: let's just agree to have both said different things

23:28 technomancy: gfredericks: deal

23:29 whoa: http://nikebetterworld.com/404

23:30 brehaut: technomancy: wahoa indeed

23:30 gfredericks: what? that the site uses clojure?

23:30 technomancy: not just that, also the favicon is the triforce!

23:31 and it's misconfigured, I guess

23:33 brehaut: gfredericks: yeah you get to work at a cool palce that uses clojure. dont rub it in :P

23:33 xeqi: technomancy: hmm, looking at my other projects I seem to write success messages

23:33 it must be my rspec background

23:33 and that I need to use (testing ...) more

23:34 gfredericks: brehaut: just a little bit

23:35 technomancy: xeqi: it's just funny because it made me realize I don't have a good reason for thinking the way I've been doing it is right

23:35 I don't use those messages very often though

23:36 man... I wish thrown? were a macro though; the special-case in c.t/is sucks a lot

23:36 postmodern testing; you have to deconstruct the intention of the author of your testing lib to find the truth

23:38 amalloy: technomancy: it's not so much a special case as a well-hidden compile-time multimethod, right?

23:39 technomancy: amalloy: I wouldn't say that means it's not a special case

23:40 man, why would you ever want to extend c.t/is? just write a macro that throws failure. ಠ_ಠ

23:40 xeqi: technomancy: or write one that hits clojure.test/do-report directly

23:40 * xeqi whistles

23:40 brehaut: technomancy: do you have a keybinding or substitution for the face?

23:41 technomancy: xeqi: yeah, actually that makes more sense

23:41 it's a good thing clojure.test is so small, or I'm sure I would find more things to be grumpy about

23:41 brehaut: https://github.com/technomancy/dotfiles/blob/master/.emacs.d/phil/cosmetics.el#L47

23:41 xeqi: I ended up doing that in kerodon

23:41 technomancy: oh no, you found my secrets! (╯°□°)╯︵ ┻━┻

23:41 brehaut: technomancy: haha amazing :)

23:42 i dont understand that one at all

23:42 xeqi: the guy flipping the table?

23:42 brehaut: oooh is that what it is

23:42 but no interrobang‽

23:43 technomancy: brehaut: for a single character might as well use C-x 8 INTERROBANG

23:43 brehaut: fair enough

23:49 technomancy: if you're running lein from git it would be great if you could update to the latest and put it through the paces

23:49 hoping to cut another preview release in a day or two

23:58 nuclearsandwich: ping

23:59 amalloy: technomancy: C-x 8 I and C-x 8 i both claim to be unbound, for me. what do i have to do to make this magic happen?

23:59 technomancy: amalloy: my bad; C-x 8 RET

23:59 aka M-x ucs-insert

Logging service provided by n01se.net