#clojure log - Nov 04 2011

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

0:02 brehaut: "Hacks and glory await!" lol

0:11 aperiodic: technomancy: sending an EOF makes them both exit

0:12 unless C-d is not an EOF

0:23 amalloy: brehaut: i smell a new swank user?

0:23 brehaut: amalloy: relatively :)

0:24 since about the middle of october

0:25 amalloy: technomancy: you're telling leo2007 that slime should be able to jump to the definition of "def"? that would surprise me

0:26 napping: it would however be totally awesome

0:28 amalloy: especially since no definition exists :P

0:31 napping: it could open Compiler.java to the definition of class DefExpr

0:31 it looks like that's what backs DefExpr

0:32 backs "def", rather

0:32 amalloy: napping: sure, that would be possible (though probably not worth the effort). what part of DefExpr do you jump to, though?

0:32 napping: eval()?

0:33 amalloy: maybe. i was under the impression def's impl was tangled up in more than just DefExpr, but i guess it isn't

0:36 napping: and defn seems to be a plain macro

0:36 amalloy: naturally. slime can jump to the impl of that, no problem

0:37 napping: Yeah, I was just worried some of those might be handled in Compiler.java

0:42 aww, slime-disassemble-symbol doesn't seem to work - speaking of trying way too hard to present a "definition"

0:53 technomancy: If I wanted to support slime-disassemble-symbol, would your swank-clojure be the place to hack it in?

1:08 leo2007: (macroexpand '(let [x 1] (+ x x))) => (let* [x 1] (+ x x))

1:08 is that odd?

1:09 brehaut: no

1:09 * leo2007 is confused.

1:09 brehaut: leo2007: why?

1:10 leo2007: let -> let*

1:10 let* is not defined.

1:10 brehaut: let* is a special form

1:10 let merely adds destructuring sugar and some compile time checks to the form

1:11 leo2007: ok, how to know that let* is a special form?

1:13 brehaut: leo2007: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L43 ?

1:14 napping: leo2007: the docs seem to lie, and claim let is a special form

1:14 hiredman: the idea is let is a special form, which happens to be implemented as a macro that expands to let*

1:15 so use let

1:15 at one point if was a macro that expanded to if*

1:15 no it doesn't

1:15 now

1:16 brehaut: hiredman: am i right in thinking that previously the destructuring wasnt handle by destructure either (thats a 1.0 change?)

1:17 amalloy: oh, i misread that. thought you said "it" (ie, let) was a macro expanding to if*. i was really interested to hear an explanation of that until a reread disillusioned me

1:17 napping: hiredman: it's nice to be able to see how the destructuring works by macroexpanding let

1:17 leo2007: hiredman: Thanks.

1:18 hiredman: brehaut: not sure, as far as I know destructuring was always handled by destructure

1:18 leo2007: but when I input let* in the repl I get ; Evaluation aborted on java.lang.Exception: Unable to resolve symbol: let* in this context.

1:18 napping: I don't think the current documentation is precise enough to explain a few things like the difference between {:map-pattern goes-here} and [&{:map-pattern goes-here}]

1:18 hiredman: leo2007: don't worry about it

1:18 napping: it's not a pattern

1:19 leo2007: hiredman: you mean don't worry about the fact that let* isn't resolvable?

1:19 hiredman: yes

1:20 let* only has meaning at the start of a list, like (let* ...)

1:20 leo2007: hiredman: thanks.

1:20 napping: "binding form", if you insist

1:20 hiredman: and it doesn't not go through the normal resolution process

1:20 napping: it's not pattern matching

1:21 leo2007: BTW, do you get any doc by from `C-c C-d C-d def RET'

1:21 hiredman: swank-clojure pulls docs from the meta data of vars, but special forms don't have vars to hang doc metadata on

1:21 brehaut: napping: pattern matching performs conditional logic, where destructuring just tries to upack data

1:22 leo2007: hiredman: thanks for the explanation.

1:22 hiredman: so "special forms" are really macros, like let, so it does have a var to hang documentation on

1:22 some

1:23 it's a little inconsistency in the compiler, most likely it will change when every people get tired enough with the current compiler to rewrite it

1:24 napping: brehaut: I was confused by the behavior of maps - I thought the destructuring was supplying nils for missing things, but it seems that's just the map lookup

1:28 Vectors are in between - the nils for excess members in the binder are filled in because it's calling the 3-argument nth

1:28 hiredman: ,(get [] 1)

1:28 clojurebot: nil

1:31 napping: ,(macroexpand-1 '(let [[x] []] x))

1:31 clojurebot: (let* [vec__181 [] x (clojure.core/nth vec__181 0 nil)] x)

1:32 napping: There's also the conditional behavior of throwing an exception if things don't match

1:33 brehaut: ,(destructure '[[x] []])

1:33 clojurebot: [vec__208 [] x (clojure.core/nth vec__208 0 nil)]

1:33 brehaut: you dont need to hide it away in a let to expand it

1:49 leo2007: Is ` the same as backquote in other lisps?

1:54 napping: maybe?

1:54 It's the quasiquote, but it's a bit different from other lisps I've seen

2:01 callen: just got home from the bay area clojure meetup

2:02 had a good time, helped people get their environments setup, swank/lein working, etc.

3:16 leo2007: where is doall-seq?

3:16 hiredman: what do you mean?

3:16 leo2007: I cannot find its doc?

3:17 hiredman: what makes you think it exists?

3:17 leo2007: hiredman: no worries. I am reading its source.

3:17 hiredman: (I doubt that)

3:17 leo2007: hiredman: it was not part of clojure. My bad.

3:17 hiredman: sure

3:31 amalloy: i was surprised to learn recently that doall and dorun take an optional "how many" argument

3:35 ibdknox: hah

3:35 ,(doc dorun)

3:35 clojurebot: "([coll] [n coll]); When lazy sequences are produced via functions that have side effects, any effects other than those needed to produce the first element in the seq do not occur until the seq is consumed. dorun can be used to force any effects. Walks through the successive nexts of the seq, does not retain the head and returns nil."

3:35 ibdknox: it's like magic

4:28 licenser: morning

4:43 ejackson: morning folks

4:45 Blkt: good morning everyoen

4:46 everyone*

5:20 licenser: ,(clojure.contrib.str-utils2/replace "\\" #"[\"\\]" (fn [x] (println x)))

5:20 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.contrib.str-utils2>

5:20 licenser: (clojure.contrib.str-utils2/replace "\\" #"[\"\\]" (fn [x] (str x)))

5:20 ,(clojure.contrib.str-utils2/replace "\\" #"[\"\\]" (fn [x] (str x)))

5:20 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.contrib.str-utils2>

5:20 licenser: any idea why that happens? It looks like a bug or I just don't see what I do wrong here

5:21 hiredman: use clojure.string

5:21 and you need to load namespaces before you can use the functions in them

5:22 licenser: ,(clojure.string/replace "\\" #"[\"\\]" (fn [x] (str x)))

5:22 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.string>

5:22 hiredman: and you need to load namespaces before you can use the functions in them

5:22 licenser: oh that is a different error, for me it gives "String index out of range: 1"

5:23 hiredman: ,(require 'clojure.string)

5:23 clojurebot: nil

5:23 hiredman: ,(doc clojure.string/replace)

5:23 clojurebot: "([s match replacement]); Replaces all instance of match with replacement in s. match/replacement can be: string / string char / char pattern / (string or function of match). See also replace-first."

5:24 hiredman: I would try out that regex and see if it matches anything

5:24 licenser: it works great if you don't pass "\\" as string

5:24 it does just fine

5:25 hiredman: ,(re-find #"[\"\\] "\\")

5:25 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading string>

5:25 hiredman: ,(re-find #"[\"\\] "\\\\")

5:25 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading string>

5:25 hiredman: ,(re-find #"[\"\\]" "\\")

5:25 clojurebot: "\\"

5:25 hiredman: ,(clojure.string/replace "\\" #"[\"\\]" (fn [x] x))

5:25 clojurebot: #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1>

5:25 hiredman: ,(clojure.string/replace "\\" #"([\"\\])" (fn [x] x))

5:26 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.String>

5:26 licenser: http://pastebin.com/9VfyembL <- is what he gets

5:26 works perfectly with "\""

5:26 just not with "\\"

5:27 hiredman: ,(clojure.string/replace "\\" #"([\"\\\\])" (fn [x] x))

5:27 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.String>

5:27 hiredman: ,(clojure.string/replace "\\" #"[\"\\\\]" (fn [x] x))

5:27 clojurebot: #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1>

5:27 licenser: ,(clojure.string/replace "\"" #"[\"\\]" (fn [x] (str (type x))))

5:27 clojurebot: "class java.lang.String"

5:27 licenser: it returns a string just fine but it seems odd

5:27 hiredman: dunno, check the source of replace

5:28 ,(clojure.string/replace "\\\\" #"[\"\\]" (fn [x] x))

5:28 clojurebot: #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1>

5:36 clgv: Given I have (defn+opts f [x | [opt-param1 [opt-param2 10]] ] ...) to define a function with optional parameters (and some more magic related to this) - where would you put the doc string for the parameters? I think it would become unreadable to put it directly to the parameter. I can only think of putting it into the meta map that 'defn supports anyway.

5:38 * licenser condensed the problem down (clojure.string/replace "\\" #"\\" "\\")

5:50 licenser: hiredman: actually it isn't a clojure thing, it is java that crashes with the regexp

5:50 ]

5:52 clgv: licenser: try (clojure.string/replace "\\\\" #"\\\\" "\\\\")

5:52 &(clojure.string/replace "\\\\" #"\\\\" "\\\\")

5:52 lazybot: ⇒ "\\"

5:52 clgv: you have to string-escape and regexp-escape as well

5:53 licenser: yap it is a trickery with the replace

5:53 the string ins't really a string

5:53 it is interpreted by java

5:53 ejackson: eeep, meta-regexps, that's all we need on a Friday morning :)

5:53 licenser: yap


5:53 hussa for java

5:54 can't have \ or $ in the return string

5:54 (clojure.string/replace "\\" #"\\" "$") same here

5:55 oh heck the last argument gets really evaluated and every \\ changed :(

6:35 there we go http://dev.clojure.org/jira/browse/CLJ-870 :) the replace thing described and reprted

8:30 raph_amiard: Hi there

8:30 I just had an idea this morning, and was pondering how doable it would be

8:30 here it is: How difficult do you think it would be to do a Lua version of clojurescript ?

8:31 i've been browsing the code for a few hours, and the main difficulty i see at the moment is regarding the dependency to google's closure compiler

8:31 since no equivalent exists for Lua

8:31 tell me what you think

8:31 cark: wasn't the google closure compiler there only for optimisation, dead code analysis ?

8:33 i think it's very doable. But be carefull when basing your implementation on clojurescript

8:33 i believe the persitent datastructures thing isn't completely done yet (no structure sharing) ... tho i might be mistaken

8:34 leo2007: is clojure-project-root-file useless?

8:35 raph_amiard: cark: Ok thank you

8:35 it would be nice if there was a way to decouple the code generation part from the global compiler logic

8:36 but i'm not familiar enough with cljs code yet to see how easily it can be done

8:36 from what i see closure is also there for a few other facilities like requiring libraries and namespaces, but this can clearly be done another way for lua

8:37 cark: and minification

8:37 raph_amiard: OTOH i wonder how much performance do you loose when the result is not optimized by closure

8:42 clgv: leo2007: what do you mean?

8:48 chouser: raph_amiard: analysis and code generation are already separated in the ClojureScript compiler

8:48 one is analyze, the other emit

8:50 clgv: I just noticed that it would be really handy to have a shortcut to create a runtime symbol when writing macros, i.e. what the following helper function does: (defn runtime-symbol [compiletime-symbol] (list 'symbol (str compiletime-symbol)))

8:50 or is there something like that?

8:51 chouser: clgv `(blah blah '~compiletime-symbol)

8:51 clgv: chouser: it's a bit more complicated since I have the symbols in a map that I create at macro expansion time

8:52 chouser: clgv: the normal way to get a symbol from compile time through to runtime is by quoting it

8:52 clgv: like: (let [m (create-map ...)] '(bla ~m ...))

8:52 leo2007: clgv: it is not used.

8:53 clgv: leo2007: what excatly is not used?

8:53 project.clj?

8:53 leo2007: clojure-project-root-file

8:54 clgv: leo2007: if you do not mean project.clj - I dont know what file you are talking of

8:59 chouser: ok, I looked it up in core, the arglist in defn used (list 'quote (sigs fdecl))

9:02 leo2007: clgv: I mean the variable clojure-project-root-file is not used.

9:02 not its value

9:03 clgv: leo2007: oh ok nvm. I didn't know there is such a variable

9:11 cmaya0: neewbie

9:12 #beginner

9:12 _ulises: what's the testing framework of choice in general?

9:12 Iceland_jack: ghgj

9:12 `.

9:13 _ulises: I'm currently using clojure.test and have used stuart sierra's lazytest in the past though

9:13 any recommendations?

9:14 cmaya0: exit

9:15 stuartsierra: _ulises: Check out clojure.test.generative as well.

9:15 clgv: _ulises: personally I also used clojure.test. I read some things about midje which sounded intersting but didnt have the time to try it yet

9:15 _ulises: never heard of clojure.test.generative, will check it out, thanks

9:15 chouser: _ulises: lazytest is my current favorite

9:16 _ulises: I quite liked lazytest too

9:16 maybe I should just use that

9:16 chouser: I haven't looked at test.generative yet either.

9:16 * _ulises wonders whether there'd be any blockers for using lazytest with heroku

9:18 _ulises: hum, if I want to use lazytest I have to use clojure-1.3.x?

9:19 chouser: but you already wanted to use clojure-1.3.x, so that's ok! :-)

9:19 _ulises: did I? :-o

9:19 chouser: you must know something I don't...

9:19 chouser: _ulises: you thought you wanted to use a previous version of Clojure?

9:20 _ulises: well, I am using 1.2.0 ... but that's probably due to historical reasons

9:20 now I need to check whether the other libs I'm using are 1.3.x ready...

9:36 right, I'm on 1.3.0 + lazytest and the world is a safe place again

9:36 thanks for the help

9:43 lnostdal: "...checking for updates from central-proxy" .. waiting waiting .. it's stuck .. how do i get lein to not check for updates; at least the remote ones, as i already have this package locally

9:52 gfredericks: lnostdal: I think it does that for snapshots?

9:54 $google maven don't update snapshots

9:54 lazybot: [java - How can I get Maven to stop attempting to check for updates ...] http://stackoverflow.com/questions/1348603/how-can-i-get-maven-to-stop-attempting-to-check-for-updates-for-artifacts-from-a

10:00 raph_amiard: [5~[6~[6~[B

10:01 chouser: Ok thanks, i'm gonna read quite a bit more code to understand the structure of the compiler better

10:02 chouser: raph_amiard: I'll be talking about it some next week

10:02 raph_amiard: chouser: Do you think the performance will take a big hit if there isn't a similar optimizing pass like google closure does ?

10:03 chouser: cool ! you mean at conj ?

10:03 chouser: raph_amiard: gclosure does more code size reduction (and specifically dead code removal) than any other runtime performance improvements

10:03 yes, at the conj

10:04 raph_amiard: chouser: ok thank you very much, i'll look forward to that :)

10:04 chouser: gclosure does do some inlining, but usually just when it thinks it will result in less code, having little or nothing to do with how fast it will run.

10:05 raph_amiard: out of curiosity, why do you want lua?

10:05 raph_amiard: ok that's good news for me

10:05 well a few reasons :

10:06 1. Lua as an amazing jit that is very small at the same time, that could unlock possibility to have a quite fast clojure runtime in some reduced ressources situations

10:06 2. Lua semantics are quite close to those of javascript

10:07 3. i'm very interrested in compilers so i thought it would be a cool project to work on :)

10:07 very interested but not very experimented so i thought working on a partially existing project would be a good way to learn

10:09 chouser: fair enough

10:09 I've thought python, ruby (for their libs), or C (for native compiled code) would be interesting targets.

10:10 raph_amiard: it's true that lua hasn't the most thriving ecosystem library wise

10:11 I would be interrested in compilation to C, the runtime would probably be an interresting thing to work on

10:11 * lucian has been pondering a PyPy interpreter for clojure

10:12 cemerick: chouser: straight to C, or -> scheme -> C?

10:12 raph_amiard: i wondered also, what is there left to work on on clojurescript itself ?

10:13 lucian: raph_amiard: full compat with clojure proper? :)

10:13 TimMc: raph_amiard: But I can run Lua on my camera... so there's that.

10:14 I would love to script my camera in Clojure.

10:14 raph_amiard: lucian: is that even possible ? given the semantics of javascript (notably regarding numerics) it would imply a tremendous performance impact

10:14 TimMc: Yeah i like the idea because lua runs everywhere too

10:14 lucian: raph_amiard: likely. i was mostly joking

10:15 raph_amiard: if js ever gets sane numbers (which it looks like it might), maybe

10:17 lnostdal: gfredericks, yeah, but my snapshots are stored locally; i work on git checkouts .. it tries to check for snapshots on remote servers (which is pointless to begin with in this case), and sometimes these servers are down and the timeout takes forever apparently

10:17 Lrcrafter21

10:18 ok, that was one of my passwords .....

10:19 clgv: lnostdal: not anymore, but seems not really secure anyway ;)

10:21 TimMc: lnostdal: "Uh, I mean... stupid cat!"

10:21 clgv: I use (resolve 'f) to get a var - how do I get the fulqualified symbol from it?

10:21 lnostdal: x)

10:21 TimMc: "Always stepping on my keyboard and sending [A-Z][a-z]{5,}[0-9]{2} to IRC!"

10:22 clgv: `

10:22 Or wait, what are you asking?

10:22 toma: hello

10:23 TimMc: ,(name (resolve `+))

10:23 toma: is there a way to get same Lisp-like backtraces in Clojure?

10:23 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to clojure.lang.Named>

10:23 clgv: TimMc: nope. I have the symbol in a binding ;)

10:23 TimMc: toma: What is a Lisp-like backtrace?

10:23 clgv: &(resolve 'inc)

10:23 lazybot: java.lang.SecurityException: You tripped the alarm! resolve is bad!

10:23 clgv: ,(resolve 'inc)

10:23 clojurebot: #'clojure.core/inc

10:24 clgv: there is the var that has a field sym. but is there a function?

10:24 $findfn 'inc 'clojure.core/inc

10:24 lazybot: []

10:26 TimMc: clgv: I suppose a var doesn't know its name.

10:26 Wait, that's wrong too.

10:26 clgv: ,(.sym (resolve 'inc))

10:26 clojurebot: inc

10:27 clgv: I could get it indirectly via the mappings

10:28 TimMc: ,(.ns (resolve 'inc))

10:28 clojurebot: #<Namespace clojure.core>

10:28 clgv: lol k.

10:29 TimMc: ,(-> 'inc resolve .ns .name)

10:29 clojurebot: clojure.core

10:29 clgv: but I just came to the conclusion that I can also only use 'str on it.

10:29 if the var prefix is annoying I can remove it ;)

10:31 chouser: cemerick: either way

10:32 cemerick: Having a portable host is nice.

10:35 chouser: That's what C is, right?

10:37 cemerick: not once you start touching libraries

10:37 raph_amiard: chouser: is there a place where i can find areas that still need work in clojurescript ?

10:37 I have the release plans page on the wiki

10:37 toma: @TimMc, something that is not as criptic as the Java Backtrace

10:38 devn: raph_amiard: i would take a peek at jira

10:38 toma: something like the stack of clojure invocations, and not the java stuff

10:38 TimMc: raph_amiard: shuffle would be nice

10:40 clgv: toma: you can filter the stacktrace elements that contain clojure files

10:40 toma: clgv: the thing is that my stacktrace contains no clojure files

10:41 gfredericks: hmmm...clj-http considers a 304 response to be exceptional. Is that good behavior?

10:41 clgv: toma: how did that happen?

10:41 toma: no matter if I use load, compile or type in the repl directly, there's nothing showing up

10:41 there's just something that looks like a terribly ugly java backtrace

10:42 clgv: toma: try that in the REPL (filter #(-?>> % .getFileName (re-matches #".*\.clj")) (.getStackTrace *e))

10:42 TimMc: toma: That's different.

10:42 You've got a broken development environment, and you need to fix it. gist the error message

10:42 ~paste

10:42 clojurebot: paste is http://gist.github.com/

10:42 clgv: toma: for a better print you can combine println and clojure.string/join

10:43 jweiss: if you accidentally pass with-redefs a macro, it permanently disables that macro, even after with-redefs is done

10:44 ,(with-redefs [cond identity] (cond 1))

10:44 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: cond requires an even number of forms>

10:44 clgv: ,(version)

10:44 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: version in this context, compiling:(NO_SOURCE_PATH:0)>

10:45 clgv: ,(clojure-version)

10:45 clojurebot: "1.3.0"

10:45 jweiss: ok that's weird, it seems to overwrite my macros, maybe not ones in core

10:45 _ulises: any reason why (doc...) in a swank session would fail with "Unable to resolve symbol: doc in this context" using clojure 1.3.0?

10:45 chouser: raph_amiard: not sure. There are tickets for some things.

10:45 _ulises: ,(doc alter-var-root)

10:45 clojurebot: "([v f & args]); Atomically alters the root binding of var v by applying f to its current value plus any args"

10:45 _ulises: gack

10:45 jweiss: _ulises: try (require 'clojure.repl)

10:46 it's no longer there by default

10:46 er sorry (use 'clojure.repl)

10:46 _ulises: ah, that did it

10:46 so ... ok, things have changed ...

10:47 toma: clgv: user=> (load "cookies") java.lang.RuntimeException: java.lang.ClassCastException: Cannot cast clojure.lang.Agent to java.lang.Number (cookies.clj:1) user=> (filter #(-?>> % .getFileName (re-matches #".*\.clj")) (.getStackTrace *e)) user=> java.lang.Exception: Unable to resolve symbol: -?>> in this context (NO_SOURCE_FILE:2)

10:47 This is a joke...

10:47 jweiss: can anyone else reproduce my with-redefs issue? i don't think i can do it with the bots

10:48 what i see is after with-redefs the macro is no longer a macro

10:49 clgv: toma: oh sorry. put (:use [clojure.contrib.core :only (-?>>)]) in your ns statement or with (use ' [clojure.contrib.core :only (-?>>)]) in repl

10:49 toma: it's not from clojure.core and I didnt spot it when copying ;)

10:50 leo2007: there seems to be a bug somewhere in swank-clojure see this: http://paste.pound-python.org/show/14715

10:50 ideas?

10:53 jweiss: ,(fn? (deref #'cond))

10:53 clojurebot: true

10:53 jweiss: obviously i am not using the right test to see if something is really a fn

10:53 i want to use something that gives false for macros

10:54 cemerick: ,(:macro (meta #'cond))

10:54 clojurebot: true

10:56 chouser: jweiss: I reproduced your with-redefs on macros

10:56 jweiss: ,(map (fn [v] (and (fn? v) (not (:macro (meta v))))) [#'cond #'apply])

10:56 clojurebot: (false false)

10:56 jweiss: chouser: is that a bug?

10:57 ,(map (fn [v] (and (fn? v) (not (:macro (meta v))))) [#'cond #'apply #'juxt])

10:57 clojurebot: (false false false)

10:58 jweiss: ,(:macro (meta #'apply))

10:58 clojurebot: nil

10:59 chouser: jweiss: it would be better if it didn't do that.

10:59 jweiss: ,(map (fn [v] (and (fn? (deref v)) (not (:macro (meta v))))) [#'cond #'apply #'juxt])

10:59 clojurebot: (false true true)

11:00 chouser: huh. .bindRoot explicitly clears the macro flag

11:01 seems complected to me. :-)

11:01 with-redefs-fn could use alter-var-root instead to avoid the problem.

11:02 jweiss: chouser: i'm curious why my example with cond didn't do the same thing

11:03 chouser: sorry, which example?

11:03 jweiss: ,(with-redefs [cond identity] (cond 1))

11:03 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: cond requires an even number of forms>

11:04 chouser: ,(:macro (meta #'cond))

11:04 clojurebot: true

11:04 chouser: ,(clojure-version)

11:04 clojurebot: "1.3.0"

11:05 chouser: jweiss: that exception is being thrown at macroexpand time

11:06 before the code generated by with-redefs has a chance to do anything to the var at all

11:06 jweiss: chouser: ok, i don't want to break the bot here, probably good thing i didn't

11:07 i think (with-redefs [cond identity] (cond 1 2)) would have done it

11:07 chouser: ,(alter-meta! #'cond assoc :macro true)

11:07 clojurebot: {:macro true, :ns #<Namespace clojure.core>, :name cond, :arglists ([& clauses]), :added "1.0", ...}

11:07 chouser: ,(with-redefs [cond identity] (cond 1 2))

11:07 clojurebot: 2

11:07 chouser: ,(:macro (meta #'cond))

11:07 clojurebot: nil

11:07 chouser: ,(cond 1 2)

11:07 clojurebot: nil

11:07 chouser: broken

11:07 ,(alter-meta! #'cond assoc :macro true)

11:08 clojurebot: {:macro true, :ns #<Namespace clojure.core>, :name cond, :arglists ([& clauses]), :added "1.0", ...}

11:08 chouser: (cond 1 2)

11:08 ,(cond 1 2)

11:08 clojurebot: 2

11:08 chouser: fixed. :-)

11:08 jweiss: ok at least just replacing the meta fixes it :)

11:08 chouser: ,(alter-meta! #'cond assoc :added "2.0")

11:08 clojurebot: {:macro true, :ns #<Namespace clojure.core>, :name cond, :arglists ([& clauses]), :added "2.0", ...}

11:08 chouser: confused.

11:21 ThreeCups: I've got a (lazy) sequence of values. I want to iterate through the values passing each one to a predicate. As soon as the predicate returns true, I'd like my fn to return true. I know there's an awesome way to do this in clojure, I just can't seem to figure it out. The fn would be something like this

11:21 (defn contains-any [xs f] "Returns true as soon as f(x) is true" ...)

11:23 Umm... I think I'm looking for (some)

11:23 ,(some #(= 4 %) [1 2 3 4])

11:23 clojurebot: true

11:24 ThreeCups: ,(some #(= 4 %) [1 2 3])

11:24 clojurebot: nil

11:24 ThreeCups: It's amazing how after asking a question, the answer becomes apparent :)

11:25 babilen: Yeah, everybody should have a rubber duck on the desk

11:28 jcromartie: I just switched Emacs to use Myriad

11:28 proportional font FT_?

11:28 W or L to be determined

11:34 TimMc: ThreeCups: ##(some #{4} [1 2 3 4])

11:34 lazybot: java.lang.RuntimeException: Can't take value of a macro: #'sandbox6471/dot

11:34 TimMc: wut

11:34 ,(some #{4} [1 2 3 4])

11:34 clojurebot: 4

11:35 Borkdude: I am trying to get a clojure dev environment on a fresh Cocoa Emacs 24

11:36 I used marmalade to get clojure-mode, slime etc

11:36 When I do: slime-connect, it says: Symbol's value as variable is void: slime-clj

11:36 Any help?

11:37 clgv: &(alter-meta! #'cond assoc :added "2.0")

11:37 lazybot: java.lang.RuntimeException: Can't take value of a macro: #'sandbox6471/dot

11:43 TimMc: clgv: lazybot wouldn't allow that anyway, pretty sure

11:44 clgv: TimMc: yep that was my guess. but that exception is a bit strange ;)

11:44 Borkdude: Guess I shouldn't have installed slime-clj or slime-fuzzy

11:45 clgv: I wonder if you can make a clojure sandbox were everything is allowed based on sessions with timeout

11:55 where has -?> from clojure.contrib.core gone in clojure 1.3?

11:58 ah clojure.core.incubator

12:01 * ejackson dreads to think what -?> hatches as.

12:02 ohpauleez: Is there a shorter hand for something like this: (dissoc (assoc m new-key (m old-key)) old-key)

12:02 I want to swap the key in a map

12:03 Also, hi everyone, I know I haven't been in here for awhile… heads down at a new startup writing clojure (I'm excited to share details at conj)

12:04 ejackson: exciting !

12:05 ohpauleez: yes, I'm having a blast! (VP of Engineering) and we're hiring!

12:05 ibdknox: ohpauleez: threading will make it clearer, but that's about it

12:05 ohpauleez: what company?

12:06 ohpauleez: ibdknox: Yeah, I was going to switch it over to thread but the repetition seemed a little weird to me

12:06 Tutorspree

12:06 hiredman: http://clojure.github.com/clojure/clojure.set-api.html#clojure.set/rename-keys

12:07 ohpauleez: (the actually technology behind the scenes is intense- way fun and pretty ambitious)

12:07 ibdknox: Tutorspree uses clojure?

12:07 interesting

12:08 ohpauleez: Yes, Clojure is used for all of machine learning/collective intelligence, emailing, messaging, and search services

12:08 Python is used in some services

12:08 (image resizing, CDN)

12:08 ibdknox: I'll be interested to hear what you're doing with machine learning

12:09 ohpauleez: hiredman: thanks!

12:09 TimMc: ohpauleez: Wow, cool company!

12:10 ohpauleez: ibdknox: Given the 333 people in this channel, who's the best person to teach you Clojure? How about Physics? Who's the best person to ask for advice about starting a data company? … and how do your learning styles differ in all of those situations?

12:10 TimMc: I like that your jobs page talks about your technology stack and employee compensation.

12:10 ohpauleez: TimMc: Thanks!

12:11 TimMc: Very up-front.

12:11 ohpauleez: That's the old stack (we need to update it)

12:12 TimMc: I don't see CLojure on that page!

12:12 ah

12:12 ohpauleez: the new stack is Python, Clojure, Php, Mongo, Redis, RabbitMQ

12:12 TimMc: I assume that telecommuting is not an option...

12:12 ohpauleez: it totally is

12:13 given the candidate (we have one employee in Virginia)

12:13 TimMc: nice

12:13 chewbranca: ohpauleez: out of curiousity, whta are you guys using for machine learning in clojure? custom libs or existing tools?

12:13 lucian: ohpauleez: i guess not non-US though?

12:14 ohpauleez: chewbranca: Some hand rolled, a lot of mahout

12:14 chewbranca: ohpauleez: ahhh cool

12:14 ohpauleez: lucian: I'd have to talk to people in charge of hiring, no idea

12:15 lucian: ohpauleez: ok. it does sound interesting (i'm a python dev learning clojure)

12:16 ibdknox: I'm a Clojure dev forgetting python :D

12:16 ohpauleez: lucian: Awesome, welcome! I made the transition a few years ago. I couldn't be happier

12:16 lucian: ibdknox: i'd have a hard time forgetting python, in some ways it still is superior

12:16 ibdknox: lucian: oh?

12:16 drewr: I still use python a lot for quick execution time

12:17 ohpauleez: and the war begins… gentleman, here are your flamethrowers

12:17 :)

12:17 ibdknox: haha, no I'm mostly just curious

12:17 theignorati: is (with-out-str (print-dup data *out*)) a good way of transforming data into a string for a cache like memcached or is there a more efficient way?

12:17 lucian: ibdknox: ignoring all matters of homoiconicity, i still find python's syntax nicer

12:17 ohpauleez: i like both anyway

12:17 hiredman: ~python

12:17 clojurebot: python is ugly

12:18 ibdknox: lucian: ah, that is purely personal preference and what you "grew up" with. I can buy that.

12:18 theignorati: ~perl

12:18 clojurebot: excusez-moi

12:18 theignorati: o

12:18 tnks: python's syntax is fine. . . but their lambda-support is pretty replete.

12:18 lucian: ibdknox: or rather, i'm not yet convinced that indentation-sensitive syntax is incompatible with homoiconicity

12:18 dnolen: ohpauleez: clojure.set/rename-keys if someone didn't already mention that.

12:18 TimMc: tnks: replete with what?

12:18 lucian: tnks: yeah, i like CoffeeScript's take on uit

12:19 ibdknox: haha

12:19 ohpauleez: dnolen: yeah, hiredman linked me to it. Thanks man.

12:19 ibdknox: $dict replete

12:19 lazybot: ibdknox: adjective: Abundantly supplied; abounding: a stream replete with trout; an apartment replete with Empire furniture.

12:20 ibdknox: :)

12:20 tnks: TimMc: I agree with Python's restriction that lambdas should only be expressions, but if I recall (it's been a while), they syntactic constraints were too strong.

12:20 ibdknox: So as TimMc said, replete with what?

12:20 tnks: TimMc: no variable setting in a Python lambda, right?

12:20 TimMc: No idea.

12:20 tnks: Guido's response was to just use named functions all the time.

12:21 so his anonymous functions are way basic.

12:21 lucian: tnks: to be fair, in python the need is less strong than in JS or lisps

12:21 but i would much prefer def to be an expression as well

12:21 tnks: lucian: that's not a good argument.

12:21 Python is a dynamically type-checked language, just like them all.

12:22 lucian: tnks: sure. i'd like f = def(a, b): ...

12:22 tnks: Python's strengths are it's library support. . . SciPy and NumPy are strong.

12:22 juhu_chapa: Hi guys! What do you think about the inclusion of lambda expressions on java 8?

12:23 lucian: juhu_chapa: i think it's unlikely to affect clojure much, if at all

12:23 chouser: theignorati: no, that's not good. Not even correct, I'm afraid.

12:23 tnks: juhu_chapa: what kind of reaction were you expecting?

12:23 chouser: theignorati: use this instead: (binding [*print-dup* true] (pr-str data))

12:24 tnks: the only hope I'd have would be for cross-JVM-language lambda support, if that's possible.

12:24 chouser: not sure how efficient that is, but it should be correct, anyway.

12:24 tnks: but I'm not holding out for that.

12:24 hiredman: I would see if you can get bye with just pr-str

12:25 *print-dup* is verbose and isn't actually always correct

12:25 chouser: hiredman: oh really?

12:25 hiredman: I know I've seen it generate calls to 'create' static methods for classes that didn't have it in 1.2

12:26 maybe for map entries

12:26 chouser: ew

12:28 juhu_chapa: tnks: I like clojure, I am just curious if clojure will take the new native support on jvm to improve itself.

12:28 chouser: hiredman: those would be worth ticketing, I would think.

12:28 hiredman: ,(binding [*print-dup* true] (pr-str (first {:a 1})))

12:28 clojurebot: "#=(clojure.lang.MapEntry/create [:a 1])"

12:28 hiredman: yeah, well, I was busy

12:29 chouser: heh

12:29 hiredman: ,(clojure.lang.MapEntry/create [:a 1])

12:29 clojurebot: #<CompilerException java.lang.IllegalArgumentException: No matching method: create, compiling:(NO_SOURCE_PATH:0)>

12:29 tnks: juhu_chapa: yeah, but isn't Clojure even slow to care about invokedynamic?

12:29 hiredman: actually, I almost feel like I've seen a ticket for this

12:29 tnks: I wonder if there will be the same attitude about other new JVM features.

12:30 theignorati: hiredman how would I use pr-str only if I need to send the data to a cache though

12:31 hiredman: http://dev.clojure.org/jira/browse/CLJ-761

12:31 theignorati: it depends on how much information you want to keep about the original structure

12:32 *print-dup* tries to preserve as much as possible

12:32 stuarthalloway: tnks: features have costs and benefits, and are incorporated when somebody establishes the benefits win, and is willing to do the work

12:34 chouser: hiredman: thanks.

12:35 theignorati: ok I don't need things like metadata

12:37 TimMc: stuarthalloway: When Clojure code is distributed as source, I suppose the compiler can choose (based on current JVM) what features to avail itself of?

12:38 stuarthalloway: TimMc: in principle, for the parts writtein in Clojure

12:38 I am working on something like that right now, to detect and use Joda

12:38 which isn't even a Java feature, but the idea is the same

12:42 TimMc: nice

12:42 I like the idea of distributing programs as source anyway.

12:42 ...but this just puts the icing on it.

12:45 tnks: stuarthalloway: I agree. . . just commenting on the state of the my perception of the community's perception of return on investment.

12:46 stuarthalloway: tnks: don't think we have any good measure on what the community thinks

12:47 TimMc: So AOT has to rely on the least common denominator of JVM features.

12:47 stuarthalloway: TimMc: no

12:47 TimMc: Really?

12:47 stuarthalloway: just the work to conditionalize it is different

12:47 TimMc: ew

12:47 stuarthalloway: I am AOTing the Joda stuff

12:47 TimMc: Didn't know that was even possible.

12:47 stuarthalloway: if you don't have it, and don't ask for it, you will be fine

12:48 dynamic linking is powerful

12:49 TimMc: Fancy.

12:52 tnks: stuarthalloway: are you talking about a Joda.org project?

12:52 stuarthalloway: http://joda-time.sourceforge.net/quickstart.html

12:52 tnks: okay, I'm coming into this conversation half-way, catching up.

12:55 yeah, scrolled up a little, but didn't figure it out; something about AOTing code distributed as source and Joda Time.

12:56 I missed the connection of the Joda project to AOTing.

12:56 (unless that's the project that's being compiled)

12:57 stuarthalloway: tnks: code that uses Joda

12:57 tnks: since all of Clojure's clj currently is AOT compiled, I am allowing it for consistency

12:57 and for anyone who relies on it

13:00 tnks: stuarthalloway: got it, thanks.

14:16 arohner: ibdknox: if I have a pre-route of "/user/*", is there a way to parse the * out of that?

14:16 or some other way to make a pre-route match "/user/:username"?

14:17 ibdknox: arohner, the latter should work

14:17 arohner, I think you can get the * too, but can't remember what compojure does with that off the top of my head

14:17 arohner: I'm getting nil for :username when I try that

14:18 ibdknox: yeah, you're given the whole req in pre-routes

14:18 need to get params then :username

14:20 arohner: ibdknox: that works, thanks

14:21 ibdknox: arohner, np, btw there's a #noir channel now too if you ever want to chat more about it :)

14:23 seancorfield: i'm hoping to have FW/1 up and running (on Clojure) soon

14:23 then we can have a battle of the web frameworks :)

14:24 Raynes: seancorfield: He will win. He has me.

14:24 seancorfield: lol

14:24 it'll take me a good long while to get all of FW/1's functionality ported from CFML to Clojure

14:24 and I don't have a fancy website for it - just a github wiki :(

14:25 but last night i got the template view stuff working to my satisfaction

14:26 ibdknox: oo what's FW/1?

14:26 seancorfield: Framework One - a lightweight convention-based MVC framework i wrote for CFML over the last two years

14:27 i started a port to Clojure back in June but got bogged down with Enlive

14:27 ibdknox: cool

14:27 seancorfield: after chatting to cemerick at strange loop, i figured out how to move forward

14:29 ibdknox: I look forward to seeing it! :)

14:30 ejackson: any chance of taking a look at the conj ?

14:30 seancorfield: the cfml version is documented here https://github.com/seancorfield/fw1/wiki

14:31 the difference in the clojure version will be that views (and layouts) will be plain html and it'll rely on enlive to inject dynamic data via a controller method

14:32 but otherwise i think i can make all of it work nearly identically

14:32 and i have a strong community of CFers using FW/1 so I'll be able to drag some of them over to Clojure on the strength of a FW/1 port i think...

14:33 technomancy: (defn map-map [m k-fn v-fn] (zipmap (map k-fn (keys m)) (map v-fn (vals m)))) ; <- someone's already implemented that, right?

14:33 I mean like it's in contrib or something but for some reason hasn't been promoted?

14:33 seancorfield: ~8,000 downloads and ~450 users on the mailing list... lots of potential new clojure users! :)

14:33 clojurebot: That is the one thing Clojure can not do.

14:34 ibdknox: lol

14:34 technomancy: I wonder if it should go in incubator

14:35 there's not really much in incubator

14:35 seancorfield: there's a bunch of useful still in old contrib that should go in core.incubator imo

14:35 but my opinion's not worth much :)

14:35 amalloy: technomancy: no offense but i hope it doesn't. mapping over maps is something that should usually be discouraged, and isn't hard to hand-roll when you need it anyway

14:36 technomancy: amalloy: happens a lot when you are accepting command-line args

14:36 you want to keywordize your {:as opts} map

14:36 amalloy: technomancy: clojure.walk/keywordize-keys?

14:37 technomancy: o rly?

14:37 ibdknox: ,(doc clojure.walk/keywordize-keys)

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

14:37 seancorfield: heh, wish i'd known about that...

14:37 amalloy: ,(require 'clojure.walk)

14:37 clojurebot: nil

14:37 ibdknox: ,(doc clojure.walk/keywordize-keys)

14:37 clojurebot: "([m]); Recursively transforms all map keys from strings to keywords."

14:37 technomancy: mostly I just feel like zipmap is too low-level; every single time I use it I really am just reimplementing map-map

14:37 amalloy: incidentally i think i just added something to useful that gets you halfway there, technomancy

14:38 seancorfield: mind you, i need keywordize-keys with lowercasing and i also need stringize-keys with uppercasing

14:38 amalloy: (into {} (map (collude kfn vfn) m))

14:38 technomancy: I heard we weren't supposed to use clojure.walk anyway =)

14:38 seancorfield: collude?

14:39 amalloy: seancorfield: <amalloy> incidentally i think i just added something to useful that gets you halfway there ;; it was collude, though name and API haven't settled yet

14:39 i think we decided to call it knit instead? it's a sibling to juxt

14:40 seancorfield: will it work on arbitrary vector elements or just pairs?

14:40 amalloy: any size

14:41 seancorfield: nice

14:41 for one of the standard contribs?

14:41 amalloy: seancorfield: https://github.com/flatland/useful

14:41 i'm not really interested in being bogged down by jira and all the other process surrounding contrib

14:42 stuartsierra: technomancy: I harped on that a little too strongly.

14:42 seancorfield: ah yes, the useful library...

14:42 it's... useful :)

14:42 hiredman: needs unrolling to a million arities

14:43 stuartsierra: amalloy: Other than JIRA, what are the blockers for you?

14:44 amalloy: stuartsierra: not allowed to take pull requests, required CA. have to use maven instead of cake/lein (i think?)

14:44 Raynes: All of those things plus another one on top. Don't know what it is yet, but I'll think of it.

14:44 stuartsierra: Well, we're not going to be able to change the CA any time soon. That's kind of the defining feature of contrib.

14:45 amalloy: yep. i realize those are useful requirements for contrib

14:45 but i don't have any compelling reason to put my own libraries in contrib, so...

14:45 ibdknox: having to use maven is a bit annoying

14:45 Raynes: We don't really think less of contrib for it -- we just don't really want that process for our libraries.

14:45 stuartsierra: Maven isn't forever, just happened to be the best choice at the time.

14:46 Lein has been improving in the area of deployment, so it might be an adequate replacement before long.

14:46 ibdknox: that being said, I think a lot of libs *shouldn't* be contrib libs

14:46 stuartsierra: That's cool too.

14:46 Raynes: stuartsierra: Can I use a picture of you in my talk?

14:47 stuartsierra: yes

14:47 Raynes: Excellent.

14:47 stuartsierra: Fair is fair.

14:47 ibdknox: though I think we should be better about informing the community of libs that exist, whether they be contrib or otherwise

14:48 stuartsierra: That's a big messy problem that will take time to solv.

14:48 ibdknox: stuartsierra, absolutely

14:48 it's worth solving though, I think

14:48 stuartsierra: totally

14:49 technomancy: integrating clojuresphere features into clojars would be a big leap in that direction

14:49 Raynes: technomancy: +1

14:49 ibdknox: yeah

14:49 who maintains clojars? is it you technomancy?

14:49 technomancy: ibdknox: close enough

14:50 ibdknox: technically it's _ato, but he's not around much

14:50 * ibdknox goes to look at the code

14:50 technomancy: I have a branch that makes it a lot easier to hack on that I need to merge in

14:50 right now it's pretty rube-goldberg

14:51 amalloy: technomancy: there. https://github.com/flatland/useful/commit/4d74158#L1R50 now behaves the way i claimed it would :P

14:52 technomancy: huh; cool

14:52 ibdknox: technomancy, yeah, it's a little haphazard looking

14:52 technomancy: ibdknox: maybe by the conj I can get it tidied up

14:54 ibdknox: technomancy, cool. Maybe this can be a project I tackle in the near future

14:54 I should make my todo-list public

14:54 haha

14:54 and then let people vote on them :D

14:55 amalloy: ibdknox: r--rw-rw- plz

14:55 gfredericks: ibdknox: should we vote on the "make my todo-list public" item first?

14:55 ibdknox: haha

14:55 gfredericks, yes

14:55 amalloy: i guess r-xrw-rw- is more appropriate

14:55 ibdknox: amalloy, darn, I thought I was going to get away with doing no work ;)

14:55 amalloy: *chuckle*

14:56 ibdknox: you know, it's kind of a neat idea

14:56 I may actually do that

14:56 it'd be a good way to see what people care about

14:58 gfredericks: I'm going to just demand that the todo-list be integrated with every social site I can find

14:59 ibdknox: lol

14:59 gfredericks: I should be able to log in with my arbitrary combinations of identities

14:59 s/my //

15:01 technomancy: there aren't any clojure-aware loc-count programs that don't penalize you for docstrings, are there?

15:02 ibdknox: are there even any clojure-aware loc-count programs?

15:03 technomancy: sorta

15:03 cemerick: who counts loc?

15:03 technomancy: at least, you can trick sloccount into doing it, but I think it treats it as CL

15:03 cemerick: for, uh... bragging rights?

15:03 cemerick: heh

15:03 ibdknox: duh

15:03 cemerick: yeah, shoulda thought of that

15:03 I want to get paid by the loc, too.

15:04 ibdknox: I wrote 100,000 lines. (each char on a different line)

15:04 TimMc: Is there any mechanism for manipulating surface syntax? e.g. leaving #() intact, etc.

15:04 technomancy: the other problem is that even if you don't get penalized for docstrings themselves, adding docstrings forces you to put your arglist on a new line

15:04 that always bothered me

15:04 TimMc: cemerick: You will be paid for every line you can delete (and still have tests pass.)

15:04 cemerick: TimMc: not if you're using the reader

15:04 technomancy: TimMc: that's what I'm talking about

15:05 on the other hand, deleting code is so much fun that you don't really need extra incentive

15:05 TimMc: technomancy: Right. It just occurred to me that in Clojure you don't work directly with the AST -- you're just closer than in braces languages.

15:05 cemerick: TimMc: not sure what you're up to, but parsely might help you (ccw uses it)

15:06 TimMc: cemerick: Oh, just thinking about measuring number of forms, things like that -- alternatives to line count.

15:06 cemerick: ah

15:06 TimMc: Code golf.

15:06 cemerick: seems like you should get tagged for reader sugar in such cases

15:07 technomancy: TimMc: https://github.com/pjstadig/procrustes exists but is pretty rudimentary

15:07 cemerick: still the same number of "function points" to use another mostly-silly term

15:07 TimMc: Something that turned #(a b c) into (# a b c) would be fine for that purpose.

15:07 good name

15:13 abrooks: ~ seen rhickey

15:13 clojurebot: No entiendo

15:13 abrooks: ~seen rhickey

15:13 clojurebot: It's greek to me.

15:13 abrooks: Clearly I'm doing it wrong...

15:15 Raynes: $seen rhicky

15:15 lazybot: I have never seen rhicky.

15:15 Raynes: I'm not sure that plugin still works.

15:15 ibdknox: $seen ibdknox

15:15 lazybot: ibdknox was last seen talking on #clojure 27 milliseconds ago.

15:16 Raynes: Huh. I guess it does work.

15:16 Nifty.

15:16 seancorfield: $seen rhickey

15:16 lazybot: rhickey was last seen quitting 3 weeks ago.

15:16 clojurebot: Cool story bro.

15:16 seancorfield: say it's not true - rich never quits! :)

15:17 Raynes: Oh. I guess it works better if I spell his name right.

15:17 * Raynes is ashamed.

15:19 TimMc: ~guards

15:19 clojurebot: SEIZE HIM!

15:19 amalloy: TimMc: you do work with the AST. you just don't work with the lexer

15:20 sorta. maybe that's not true. but having (fn* [] (gensym)) be the AST for #(gensym) seems reasonable to me

15:21 gfredericks: yeah it's not going to distort counts too much

15:21 amalloy: gfredericks: it only distorts counts at all if you define your counts in such a way that you think that's a distortion...?

15:22 TimMc: bingo

15:22 gfredericks: amalloy: yeps

15:22 TimMc: It doesn't count form.

15:22 *forms

15:23 ,#(#(#(#(#()))))

15:23 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Nested #()s are not allowed>

15:23 TimMc: Oh, right.

15:23 gfredericks: ,(count (read-string "`````e"))

15:23 clojurebot: 2

15:23 gfredericks: ,(count (flatten (read-string "`````e")))

15:23 clojurebot: 1202

15:23 TimMc: augh

15:24 gfredericks: thats probably the only weird case

15:24 amalloy: heh, that one i can sympathize with

15:24 gfredericks: but `````e in your code is not recommended in most cases

15:24 TimMc: ,`````e

15:24 clojurebot: (clojure.core/seq (clojure.core/concat (clojure.core/list (quote clojure.core/seq)) (clojure.core/list (clojure.core/seq (clojure.core/concat (clojure.core/list (quote clojure.core/concat)) (clojure.core/list (clojure.core/seq (clojure.core/concat (clojure.core/list (quote clojure.core/list)) (clojure.core/list (clojure.core/seq #))))) (clojure.core/list (clojure.core/seq (clojure.core/concat (clo...

15:24 stuartsierra: ,(let [a (atom 0)] (clojure.walk/postwalk (fn [x] (swap! a inc) x) '(dotimes [i 5] (println "Hello"))) @a)

15:24 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.walk>

15:24 Raynes: &``````e

15:24 lazybot: ⇒ (clojure.core/seq (clojure.core/concat (clojure.core/list (quote clojure.core/seq)) (clojure.core/list (clojure.core/seq (clojure.core/concat (clojure.core/list (quote clojure.core/concat)) (clojure.core/list (clojure.core/seq (clojure.core/concat (clojure.core/li... failed to gist: Connection reset

15:25 Raynes: Hah. Huge.

15:25 stuartsierra: ,(require 'clojure.walk)

15:25 clojurebot: nil

15:25 stuartsierra: ,(let [a (atom 0)] (clojure.walk/postwalk (fn [x] (swap! a inc) x) '(dotimes [i 5] (println "Hello"))) @a)

15:25 clojurebot: 8

15:25 gfredericks: Raynes: if you use seven backticks the reader will blow the stack

15:25 TimMc: ,```````e

15:25 clojurebot: #<CompilerException java.lang.StackOverflowError, compiling:(NO_SOURCE_PATH:0)>

15:26 ibdknox: woah

15:26 what's this that I'm seeing about a time literal?

15:26 stuartsierra: Stu & Rich have been discussing it.

15:26 TimMc: "If you do X, bad thing Y will happen!" "Oh, let me try that..."

15:26 stuartsierra: (Stu Halloway that is.)

15:26 gfredericks: stuartsierra: are there any other languages with such a thing?

15:27 stuartsierra: dunno

15:27 ibdknox: not any common ones

15:27 gfredericks: I think it sounds cool

15:27 amalloy: C++11x, i think?

15:27 ibdknox: sounds like s slope to me

15:27 a*

15:27 amalloy: er, C++11 and/or C++0x. probably not both :P

15:27 cemerick: ibdknox: slope to doom?

15:27 :-P

15:27 ibdknox: cemerick, yes.

15:27 cemerick: Yeah, I think I agree.

15:28 ibdknox: why is ms not good enough?

15:28 if we're going to talk about a portable time format

15:28 we should be talking a number

15:28 stuartsierra: portable, but not human-readable

15:28 amalloy: i'd rather open up the reader so that i can add my own time literal

15:29 or, anyway, so that other people can. i don't especially want one

15:29 ibdknox: stuartsierra, sure, but the argument seems to be aimed at being able to serialize?

15:29 TimMc: Proposal: Measure everything in beats: http://www.timeanddate.com/time/internettime.html

15:31 * amalloy measures time in the passing of memes

15:31 stuartsierra: Measure in flamewars.

15:32 TimMc: Also, I'll open a JIRA to discuss the implications of Time Cube: Cubic Creation of 4 corner

15:32 separate simultaneous 24

15:32 hour Days within 1 Earth

15:32 rotation

15:32 ugh, why did he have line breaks in there

15:34 technomancy: URL literals; hm. I could warm up to the idea.

15:35 wastrel: time cube

15:35 Raynes: We totally need Swing literals. A literal for every class.

15:36 ibdknox: :(

15:36 TimMc: emoticon literals

15:37 Raynes: Oh, yes.

15:37 amalloy: &:P

15:37 lazybot: ⇒ :P

15:37 amalloy: i think we already have those

15:37 * |8] wants to be a literal, too.

15:37 * Raynes gives algernon flowers.

15:38 TimMc: &;-) ; :-(

15:38 lazybot: java.lang.RuntimeException: EOF while reading

15:38 stuartsierra: Programmers are literal enough, they don't need to be made more literal.

15:48 gfredericks: |8] is almost a literal :/

15:49 Raynes: &[8]

15:49 lazybot: ⇒ [8]

15:49 Raynes: Close enough.

15:50 stuartsierra: I wonder why people who want reader macros don't just write ordinary macros?

15:51 Or even #=()

15:51 gfredericks: stuartsierra: reader macros stick out more?

15:51 stuartsierra: I guess

15:51 amalloy: stuartsierra: i agree that's often sufficient. but the same argument applies to #(foo %)

15:51 stuartsierra: yeah

15:51 save 2 characters, save the world

15:52 amalloy: stuartsierra: and especially, reader macros don't have to be otherwise-valid sexps

15:52 stuartsierra: yeah

15:53 amalloy: eg, i couldn't write a (date 11/4/11) macro

15:53 Raynes: You save characters proportional to the number of arguments your fn takes. :D

15:53 stuartsierra: But you could write (date "11/4/11")

15:53 amalloy: *wince*

15:53 gfredericks: #{4 5 6} is nicer than (hash-map 4 5 6) partly because it looks like a data structure rather than a function call

15:53 stuartsierra: actually, I'm not sure if the compiler allows that

15:53 amalloy: stuartsierra: it does

15:53 stuartsierra: ok

15:55 cemerick: man, we're gonna be in line-noise territory shortly

15:56 stuartsierra: cemerick: You're talking to the guy who embedded Perl in Common Lisp.

15:56 Raynes: cemerick: Perljure.

15:56 stuartsierra: The Common Lisp crowd still hasn't forgiven me.

15:56 cemerick: stuartsierra: Sounds ghastly.

15:57 amalloy: it's pretty cool that CL has a package with reader macros for regexes that parse/read as functions

15:57 cemerick: Actually, CL is already sorta line noise if you're looking at a lib with comprehensive conditional evaluation macro usage.

15:57 stuartsierra: cemerick: absolutely

15:57 duck1123: perl in lisp, for code that's so unreadable, it collapses in on itself

15:57 stuartsierra: +this -that +(something else)

15:57 As bad as #ifdef in C

15:58 amalloy: ugh yes

15:58 cemerick: 2014 Clojure: #@2010-12-18 #&http://apple.com #~

15:58 stuartsierra: #+CLR #-JVM #+JS

15:58 cemerick: cemerick, spreader of fud

15:58 amalloy: cemerick: don't forget @#&http://google.com to slurp

15:59 cemerick: stuartsierra: disaster

15:59 stuartsierra: I really want something better than read-time conditionals. But I don't know what it is.

16:00 cemerick: Sometimes doing nothing is the better thing.

16:02 seancorfield: i'm not entirely sure how the proposal for read-time conditionals would help the jvm/clr ports...?

16:03 how would you ensure implementations defined the right features anyway?

16:03 stuartsierra: I think it would have to be coarser than features: just one conditional symbol per platform.

16:03 seancorfield: (cond #+:jvm (do-java-stuff) #+:clr (do-clr-stuff)) ???

16:03 lazybot: seancorfield: Yes, 100% for sure.

16:04 stuartsierra: seancorfield: yes, but without the cond

16:04 do-java-stuff would only be read on JVM platforms, do-clr-stuff would only be read on CLR platfroms.

16:04 seancorfield: oh... so #+:something foo would yield foo if :something was defined?

16:04 stuartsierra: yes

16:04 and be ignored otherwise

16:05 seancorfield: and what would those "features" actually be represented by in the code?

16:05 stuartsierra: dunon

16:05 dunon

16:05 erg

16:05 don't know

16:05 seancorfield: the link to the CL stuff indicates keywords

16:05 stuartsierra: that's a likely candidate

16:05 seancorfield: so some magic keywords would exist on each platform?

16:06 stuartsierra: yep

16:06 Actually, each platform would have a reader that recognizes certain magic keywords.

16:06 hiredman: if the reader could just do clojure datatypes, then you wouldn't need readtime conditionals

16:06 seancorfield: and ignores ones it doesn't recognize...

16:07 still makes me shudder... memories of C / C++...

16:07 stuartsierra: hiredman: You mean deftypes?

16:07 hiredman: I mean clojure datatypes, symbols, maps, vectors, lists, sets, keywords, etc

16:08 parts of the reader do stuff like resolve classes, etc, instead of passing through symbols

16:08 stuartsierra: oh I see

16:08 hiredman: but, I dunno, that ship has sailed

16:08 stuartsierra: no, the reader does not do name resolution

16:08 hiredman: it does some

16:08 stuartsierra: ,(read-string "java.lang.doesNotExist")

16:08 clojurebot: java.lang.doesNotExist

16:09 stuartsierra: ,(read-string "this-namespace/does-not-exist")

16:09 clojurebot: this-namespace/does-not-exist

16:10 stuartsierra: The only time I can think of where the reader does name resolution is syntax-quote and #+()

16:10 ,(read-string "`foo")

16:10 clojurebot: (quote sandbox/foo)

16:10 hiredman: right

16:10 #+() ?

16:10 stuartsierra: I meant #=() not #+()

16:10 hiredman: right

16:10 * gfredericks imagines what #+() would do

16:11 hiredman: syntax quote could be rewritten as a macro to get it out of the reader

16:11 stuartsierra: yeah, that might be a good idea in general

16:11 I've always thought it was a bit odd.

16:11 hiredman: yes

16:12 well, the reader code for it is very gnarly

16:22 Raynes: mefesto: I need your real name. I want to credit you for awesome JS in tryclj.com in my talk at the conj, but I don't know your name. :<

16:25 * mlimotte Hi. I'm having trouble getting clojure to use my URLClassLoader instance. I'm trying to do something like this in Clojure: (.setContextClassLoader (Thread/currentThread) loader). I believe the loader is created ok; but I'm getting ClassNotFoundException from subsequent Clojure code.

16:27 TimMc: ,(class (read-string "java.lang.Foo"))

16:27 clojurebot: clojure.lang.Symbol

16:28 TimMc: mlimotte: What are you up to with classloaders?

16:30 mlimotte: @TimMc I need to add a JAR, but it's running in a context in which I can't change the original class-path. The job is started by a separate mechanism.

16:30 mefesto: Raynes: that JS isn't too awesome but thanks! :)

16:30 Raynes: Allen Johnson

16:38 technomancy: so scala's literal XML support is widely regarded as a mistake

16:38 cemerick: yes. Of catastrophic proportions.

16:38 technomancy: does anyone know the reasoning behind that and whether the same logic would apply to literal instants or URLs?

16:38 TimMc: Why, did they make the mistake of actually making people use brackets?

16:39 xexprs

16:39 cemerick: technomancy: fogus would know, he was apparently deep in scala when that went in

16:39 ibdknox: I just fundamentally don't understand this

16:39 why?

16:39 clojurebot: ibdknox: because you can't handle the truth!

16:39 ibdknox: why do this at all?

16:40 cemerick: instants and URLs are likely more…durable concepts than XML though.

16:40 ibdknox: I'm also not sure why Rich continually says "this is not a place for opinion"

16:40 technomancy: it would make a _lot_ more sense to wait till the fate of JSR 310 is decided.

16:40 TimMc: <(><juxt><identity/><inc/></juxt><lit>5</lit></(>

16:40 ibdknox: then why have the fucking list?

16:40 cemerick: ibdknox: certainly seems like a ton of trouble for not much in return

16:41 technomancy: ibdknox: the list is for ex cathedra pronouncements, obvs: http://p.hagelb.org/pharaoh.jpg =)

16:41 ibdknox: technomancy, lol

16:42 the fact that most of the opinions voiced by those not in core are against it should be a sign

16:42 cemerick: ibdknox: huh, hadn't seen that msg yet :-(

16:46 TimMc: link?

16:46 clojurebot: your link is dead

16:46 ibdknox: I wish it was understood that the point at which you have ambitions for a wide audience, the thing you build is no longer yours.. it's the audience's.

16:46 hiredman: ~botsnack

16:46 clojurebot: Thanks! Can I have chocolate next time

16:46 amalloy: TimMc: http://groups.google.com/group/clojure-dev/browse_thread/thread/940c4225b439367e/caeaa290d4991515?show_docid=caeaa290d4991515

16:46 hiredman: ~botsmack

16:46 clojurebot: Owww!

16:46 technomancy: hiredman: ok, now I believe you

16:46 hiredman: :)

16:47 technomancy: if I want to embed exceptions in a pr-str'd Clojure code... is my best bet really to base64-encode from java.io.Serializable serialization?

16:48 clj-stacktrace can turn them into maps but not back

16:48 Raynes: mefesto: Cool.

16:49 hiredman: or consider switching whole hog to java serialization

16:49 technomancy: =\

16:50 or add reconstructing Exceptions to clj-stacktrace I guess

16:55 hiredman: rich should really just throw open the door to reader macros, and then clojure/core can publish a blessed set of the same

16:58 technomancy: uuuuuuuuuuuugh data.codec sets warn-on-reflection

16:58 wtf

16:58 cemerick: technomancy: A quick pull request'll fix that.

16:58 technomancy: will it?

16:58 cemerick: goodness, no.

16:58 technomancy: it's a contrib

16:58 cemerick: Sorry for getting your hopes up. :-P

16:58 * cemerick was trying to be dry

16:58 amalloy: cemerick: ended up all wet?

16:58 cemerick: apparently

16:58 ibdknox: lol

16:58 technomancy: yeah I don't know why I believed that for half a second.

16:58 Apache Software Foundation to the rescue!

16:58 never thought I'd be saying _that_ un-ironically =)

16:58 ibdknox: lol

16:58 amalloy: technomancy: good news though, the last w-o-r jira issue was released in just a month or two

16:58 technomancy: amalloy: was that tools.namespace?

16:58 amalloy: yeah

16:58 stuartsierra: mea culpa

16:58 amalloy: that's the one i'm referring to, anyway. don't know if it was actually the most recent one

16:59 cemerick: hiredman: I had the same thought, but oh well.

16:59 amalloy: hiredman: i think i'd like that, but i'm willing to believe that open reader macros would decrease general readability

17:00 it just seems silly to not open reader macros *and* add a reader macro for instants

17:00 cemerick: I don't think 5 people writing reader macros would make things any better/worse than N people writing reader macros.

17:01 hiredman: "feedback wanted" "..." "denied!"

17:01 danlarkin: I hereby come out against instant literals

17:01 note the time and date!

17:01 hiredman: "Let's avoid another opinion-fest."

17:01 ugh, come on rich

17:01 fliebel: Meh, I think we're nearing the end. Unless we're going APL, we are pushing the limits of ASCII, this one is already codenamed curse-whatever.

17:03 technomancy: danlarkin: UTC or EDT?

17:03 danlarkin: seconds, milliseconds, or nanoseconds?

17:03 danlarkin: technomancy: UTC-8

17:03 pitcairn islands

17:03 :p

17:03 technomancy: YESSSS

17:03 best timezone evar

17:04 fliebel: w-wait, what if we designate #@ as user-reader-macro prefix :(

17:05 technomancy: anyone care to golf this further? http://p.hagelb.org/serializable-throw.html

17:06 amalloy: technomancy: don't need the let

17:07 technomancy: amalloy: also it doesn't even work. I'm dumb

17:07 amalloy: nice

17:08 fliebel: technomancy: What does it do? return a throw statement for byte arrays?

17:09 technomancy: fliebel: return a throw call that can be serialized with pr-str

17:10 should work if you refresh

17:11 pretty gnarly, but as long as you never manually inspect the pr-str output it's not bad

17:11 goodieboy: I'm experimenting with clojure.walk, and I can't seem to figure out how to make this work: https://gist.github.com/1340490

17:11 I don't want that double wrapped list (2nd item in the root)

17:12 how can I "apply" the map to the parent list instead of returning a list of lists?

17:14 amalloy: (-> (ByteArrayOutputStream.) (doto (-> (ObjectOutputStream.) (.writeObject x))) (->> (.toByteArray) (.encode (Base64.)) (String.))) ; technomancy: lol?

17:14 technomancy: amalloy: dang

17:14 I guess I didn't mean actual golf, but that's not bad =)

17:14 amalloy: technomancy: it's probably longer than the version with a let

17:14 Raynes: Pet peeve: when people do things like (-> (ByteArrayOutputStream.))

17:15 technomancy: people do that?

17:15 Raynes: Sometimes.

17:15 I think you've done that. I seem to recall it in sherlock. I might be wrong.

17:15 danlarkin: no one good does that

17:15 ibdknox: lol

17:15 danlarkin: bad coders write bad code

17:15 * ibdknox hides all of his code

17:15 TimMc: That does not support your point.

17:16 danlarkin: that is my tautology of the day

17:16 TimMc: haha true

17:17 goodieboy: maybe it's not possible to unwrap the list into the parent using walk? hmm.

17:18 amalloy: but i do enjoy the mental exercise of converting lets into horrible mazes of doto/->/->>

17:18 stuartsierra: goodieboy: clojure.walk cannot splice

17:19 technomancy: amalloy: clojure-refactoring can automate that IIRC

17:19 stuartsierra: unless you modify the other list

17:19 technomancy: but where's the fun?

17:19 amalloy: technomancy: even doto?

17:19 technomancy: probably not doto

17:19 goodieboy: stuartsierra: you mean afterward?

17:19 stuartsierra: yes

17:19 amalloy: that's the fun part

17:21 technomancy: stuartsierra: is there any particular reason thrown? is part of the clojure.test/is macro rather than being its own defmacro?

17:21 goodieboy: stuartsierra: ok i see. So if i have cases like this, but nested even deeper, would this be a totally separate second pass using walk to remove the wrapping list?

17:21 stuartsierra: technomancy: I thought it was a good idea at the time.

17:22 technomancy: fair 'nuff

17:22 stuartsierra: goodieboy: I'd suggest using something other than clojure.walk.

17:22 maybe zippers

17:24 goodieboy: stuartsierra: ok i'll check zippers out

17:24 ibdknox: wow

17:24 stuartsierra: technomancy: I was young and foolish then.

17:25 ibdknox: Rich has just pretty much guaranteed I never contribute to Clojure proper.

17:25 technomancy: drunk on the power of macros, I'll warrant

17:25 stuartsierra: you said ti

17:25 *it

17:28 hiredman: clojurebot: irc?

17:28 clojurebot: Titim gan éirí ort.

17:28 hiredman: clojurebot: #clojure

17:28 clojurebot: this is not IRC, this is #clojure. We aspire to better than that.

17:32 TimMc: Hence no ops?

17:33 amalloy: TimMc: chouser isn't afraid to smack down anyone who dissents

17:34 hm. that sorta sounds like i mean chouser actually doesn't like people disagreeing with him. just intended a whimsical way to mention he has ops

17:34 Raynes: "Why don't you consider the problem a bit more before wasting our time with these knee-jerk questions and bike-shedding? This is not the IRC."

17:34 Heh.

17:35 I guess we know why he hasn't been in here in 3 weeks.

17:35 cemerick: jesus christ

17:35 ibdknox: yeah

17:36 like I said

17:36 technomancy: ...

17:36 ibdknox: I'm done.

17:36 brehaut: what in the hells have i missed

17:36 ibdknox: I will not be a part of something lead by that.

17:36 amalloy: brehaut: rich still disapproves of opinions

17:36 Raynes: https://groups.google.com/forum/#!topic/clojure-dev/lAxCJbQ5Nn4

17:36 That whole thread makes me think a bit differently of ol' RIch.

17:39 danlarkin: cemerick: I don't know what you secretly did to rich... stole his car, something like that... to justify those replies

17:40 Raynes: I heard he killed his kittens.

17:40 danlarkin: cemerick just left :/ oh well

17:41 jcromartie: draaaaama

17:41 TimMc: "What is the point of this question? Are you asking someone else to do the research, or volunteering?"

17:41 Friggin' belligerant.

17:42 fliebel: are we still talking about the reader macro?

17:42 Raynes: Pretty much everything he said there is mean and uncalled for. It all boils down to him quite literally saying that the community's opinions do not matter here.

17:42 gfredericks: fliebel: more about the thread about the reader macro

17:42 technomancy: so... how bout OCaml? I hear it's nice this time of year.

17:42 Maybe Factor? it's pretty, uh... dynamic.

17:42 dakrone: Haskell!

17:42 amalloy: fliebel: probably will be until #@2014-12-13T21:39:45.618-08:00

17:42 brehaut: Cat!

17:43 fliebel: technomancy: Forht!

17:43 Thinking Forth says pretty much the same thing Rich said about simplicity :)

17:43 cees_: Forth is a step back in time :-)

17:43 gfredericks: Java is a new enterprise-friendly language that runs on the same virtual machine as clojure!

17:43 brehaut: http://www.haskell.org/haskellwiki/Wadlers_Law

17:44 jcromartie: Every language has these moments...

17:44 technomancy: gfredericks: you mean I can leverage all my valuable JVM expertise?

17:44 gfredericks: technomancy: exactly. And with a little RT.var, you can even use your favorite clojure libraries!

17:45 technomancy: gfredericks: SIGN ME UP

17:45 brehaut: technomancy: even better, you can hire clojure programmers and slowly transition them to writing java code

17:45 srid: so I was asked to rewrite my clojure project (using aleph/lamina) in something with low-memory footprint (because we'll be shipping the product in a VM). what is a good language for writing concurrent applications with low footprint?

17:46 brehaut: srid: haskell if you can avoid the space leaks?

17:46 srid: space leaks?

17:46 Raynes: The Doctor can take care of those.

17:46 brehaut: memory leaks that occur in the presence of pervasive non-strict evaluation

17:47 amalloy: srid: how small a footprint?

17:47 jcromartie: srid: how low?

17:47 er, yup

17:47 gfredericks: is it really this hard to log request headers for debugging in tomcat?

17:48 brehaut: gfredericks: isnt tomcat the web server that makes eveything really hard?

17:48 srid: amalloy: the clojure app consumed 240M (with 1.8G virtual) on the VM with 1G memory. it was the largest memory consumption compared to other processes!

17:48 amalloy: srid: you need to tell it how much memory to use so it knows to gc

17:48 * srid is reading about the concurrency feature of http://golang.org/

17:48 amalloy: eg, 4clojure has been happily running for weeks with <256MB of virtual and 150MB of resident

17:48 jcromartie: srid: Erlang uses a fraction of the memory of Java/Clojure

17:48 srid: amalloy: oh? how do I do that?

17:48 jcromartie: depends on the case, of course

17:48 sometimes it might use more

17:49 but most of the time, it's much less

17:49 amalloy: java -Xmx80m ...other-args...

17:49 limits the java object heap to 80MB, and then the jvm uses several dozen megs for its own internal purposes

17:50 otherwise the heap tends to grow bigger and bigger because the jvm doesn't know you need the space for anything else

17:50 (as opposed to because it actually needs the space - it just doesn't bother to gc)

17:50 srid: amalloy: thanks, i'll give this a try now and see if others come to accept the new memory usage.

17:51 leo2007: Is there offline reference documentation?

17:51 amalloy: (doc doc)

17:51 clojurebot: "([name]); Prints documentation for a var or special form given its name"

17:51 brehaut: (doc apropos)

17:51 clojurebot: "([str-or-pattern]); Given a regular expression or stringable thing, return a seq of all definitions in all currently-loaded namespaces that match the str-or-pattern."

17:51 brehaut: (doc find-doc)

17:51 clojurebot: "([re-string-or-pattern]); Prints documentation for any var whose documentation or name contains a match for re-string-or-pattern"

17:51 jcromartie: srid: what does your app do?

17:52 ibdknox: is there a version of doc that gives data back as opposed to printing?

17:52 jcromartie: srid: it would be interesting to see how little memory you can get away with... you might be surprised

17:52 technomancy: ibdknox: (comp :doc meta)?

17:52 amalloy: &(-> first var meta :doc)

17:52 lazybot: ⇒ "Returns the first item in the collection. Calls seq on its\n argument. If coll is nil, returns nil."

17:52 srid: jcromartie: its similar to heroku pulse https://github.com/heroku/pulse plus other things (reading form database)

17:52 ibdknox: sorry

17:52 I guess find-doc is more interesting

17:52 jcromartie: srid: you probably don't keep much in memory at all, then

17:53 ibdknox: (thinking about tools)

17:53 amalloy: i'm kinda annoyed that clojure 1.3 seems to make it harder to get docs without printing them, not easier

17:53 fliebel: amalloy: harder? how?

17:53 hiredman: fiddled with how the whole thing works

17:54 raek: leo2007: yes: git clone https://github.com/clojure/clojure.git && cd clojure && git checkout gh-pages

17:55 hrm, you can also do "git clone -b gh-pages https://github.com/clojure/clojure.git"

17:56 amalloy: fliebel: https://github.com/clojure/clojure/blob/master/src/clj/clojure/repl.clj has cool stuff like documentation on special forms

17:56 and you can only get at it with a macro, even though it could easily be a function; and it prints instead of returning something

17:58 ibdknox: wow, how did I never know about pst

17:58 hiredman: the file format from outlook?

17:58 amalloy: ibdknox: it's been getting gradually promoted i think

17:59 ibdknox: haha no, ##(doc pst)

17:59 lazybot: java.lang.RuntimeException: Unable to resolve var: pst in this context

17:59 ibdknox: (require 'clojure.repl)

17:59 ,(require 'clojure.repl)

17:59 clojurebot: nil

17:59 ibdknox: ,(doc clojure.repl/pst)

17:59 clojurebot: "([] [e-or-depth] [e depth]); Prints a stack trace of the exception, to the depth requested. If none supplied, uses the root cause of the most recent repl exception (*e), and a depth of 12."

18:00 technomancy: ibdknox: check out clj-stacktrace's pst dude

18:00 http://technomancy.us/i/clj-stacktrace.png

18:01 ibdknox: technomancy, yeah, but I'm not cool enough to have clj-stacktrace autoloaded into all my repls

18:01 technomancy: ibdknox: plugin installerate and it's everywhere

18:02 ibdknox: hah

18:02 TimMc: jcromartie: Thanks for the reminder that this shitfit too, shall pass.

18:02 ibdknox: technomancy, there's some magic I can do to automatically require it too right?

18:02 technomancy: indeed: http://technomancy.us/154

18:03 stuartsierra: g'night folks

18:05 ibdknox: technomancy, awesome. thanks.

18:05 technomancy: enjoy

18:23 flognikr: hi -- I am running emacs 23.3.1 on OS X. I was able to install swank-clojure (which installed clojure-mode and slime), I also ran "lein plugin install swank-clojure 1.3.3", but when I try "M-x clojure-jack-in" the "jack-in" is nowhere to be found. I must be missing something very obvious…

18:24 technomancy: flognikr: do you mean Emacs doesn't know about the command M-x clojure-jack-in?

18:24 flognikr: technomancy: correct.

18:24 technomancy: that must mean that your clojure-mode is an old version

18:25 flognikr: aha. it came via the package.el install -- so I'll try downloading it directly… thanks!

18:26 technomancy: yeah, probably package.el is configured to use the old elpa repo rather than marmalade; manual install would fix that

18:35 TimMc: "This week in "Them's Forkin' Words!"..."

18:35 ibdknox: lol

18:35 :/

18:36 TimMc: If you want to see a main dev *really* behaving badly, check this out: https://bugs.launchpad.net/calibre/+bug/885027

18:36 Puts this in perspective.

18:36 ibdknox: I guess it's a matter of consequences

18:36 losing support over time is not a good trend

18:43 technomancy: http://mako.cc/copyrighteous/images/trophy.png

18:43 TimMc: The actual danger is of alienating your core contributors.

18:44 ibdknox: TimMc, yeah that's what I meant. The support of the people who really want to push the language forward and into more hands

18:45 technomancy, I had to look up who that was :p

18:45 brehaut: who is Jörg Shilling?

18:45 ibdknox: http://en.wikipedia.org/wiki/J%C3%B6rg_Schilling

18:48 mjwhitt: mm, bug tracker flame wars... so toasty

18:54 TimMc: mjwhitt: Really needs a reddit-style interface.

18:54 Of course, that would have the downside of hiding all the "I didn't read any of the other comments but here is my opinion" comments.

19:02 ibdknox: haha

19:02 one of my friends just saw that thread

19:02 response:

19:02 "sad little king of a sad little hill"

19:05 TimMc: ahaha

19:06 Unfortunately it's a damn useful hill to many people.

19:06 ibdknox: definitely is for me. :)

19:08 brehaut: i imagine thats the case for a good proportion of the #clojure loiterers :P

19:08 TimMc: Wait, are we calling Calibre or Clojure a hill?

19:09 * brehaut is confused

19:10 hiredman: given the number of times people have felt like I was being harsh or a jerk on the list, and I didn't really think I was, I dunno

19:10 ibdknox: Clojure

19:10 dnolen: well fwiw, I don't think cemerick really read the design page on the instant literal very closely.

19:11 and rhickey is not patient w/ folks that don't do their homework. probably a holdover from teaching C++ at NYU

19:11 ibdknox: dnolen, it doesn't matter

19:11 dnolen, you don't treat people that way

19:11 period.

19:11 Raynes: I don't think the "angry genius" argument applies here.

19:12 brehaut: ibdknox: but this is LISP!

19:12 dnolen: ibdknox: eh, I'm not sure if it matters, rhickey is not the "community" guy.

19:12 hiredman: clojurebot: irc is only for opionfests

19:12 clojurebot: You don't have to tell me twice.

19:12 srid: amalloy: i let the new process run with 80m resident limit for next 2 days, but how would "-Xmx80m" help given that that "mx" takes 64M as default? http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html

19:12 TimMc: haha

19:13 ibdknox: dnolen, he is the "Clojure" guy it absolutely matters

19:13 TimMc: hiredman: You can be quite abrasive, but it's different. Here, Rich is not just being rude, but also attacking people's value as contributors.

19:13 hiredman: srid: those docs are way old

19:13 amalloy: srid: its default is closer to something like infinity

19:13 ibdknox: if every single time someone asks for feedback about DESIGN and he comes in and says it's not about opinion

19:13 dnolen: ibdknox: he's the designer, he's like the Steve Jobs of Clojure. it doesn't matter.

19:13 TimMc: It's all in the public view.

19:13 ibdknox: then let's get rid of clojure-dev

19:13 and call this what it is

19:14 Raynes: rhicky-dev

19:14 rhickey-dev ; damn.

19:14 Why do I keep spelling his name wrong?

19:14 srid: hiredman: right you are. amalloy seems to be more like 1/4th of total memory (capped by 1g) http://stackoverflow.com/questions/1030256/java-app-that-uses-a-lot-of-memory-use-xmx/1030353#1030353

19:15 ibdknox: dnolen, he needs help, he needs the community, you only get to be steve when you need nothing

19:16 TimMc: clojurebot: rhicky is |reply| Raynes, you did it again...

19:16 clojurebot: In Ordnung

19:16 ibdknox: lol

19:17 dnolen: ibdknox: people throwing around unresearched opinions on a dev list helps no one. I suppose rhickey could have said "read the design page again please", but I'm not sure that would have come across any better.

19:17 ibdknox: dnolen, I read the page. I think it's a bad idea.

19:18 dnolen: ibdknox: it seems fine to me, I don't need it and it doesn't affect me. clearly other people do.

19:19 but then again perhaps I will need it later - then great.

19:19 ibdknox: Regardless, the exchange has real consequences

19:19 maybe they don't matter

19:19 enough of these and they will

19:19 hiredman: the only people on the thread that spoke it favor were rich and stu

19:19 in

19:20 ibdknox: and that should've been a clue

19:21 dnolen: nah alex miller is not again, not sean devlin, nor sean corfield - once they understood what was being discussed.

19:21 reading and printing.

19:24 JSON is a weak exchange format, and ClojureScript <-> Clojure reveals we can have something way more expressive.

19:24 hiredman: dnolen: thats not true, devlin said "do you also want some code that does x?" and "java.util.Date has problems"

19:24 neither of which is a ringing endorsement

19:24 dnolen: hiredman: the discussion is not about java.util.Date

19:25 hiredman: dnolen: why not? that is a proposed part the instant interval reader

19:25 dnolen: it's about data exchange - making that easier for common types. moving date strings from server side to client side sucks.

19:25 hiredman: it will by default result in java.util.Date

19:26 why are some parts of the proposal off limits?

19:26 dnolen: hiredman: seems to me the discussion was exactly about hashing out what to use JVM side.

19:27 hiredman: there are a number of different parts: what to use for parsing, what in memory presentation to use, how would this be used?

19:27 etc

19:27 moogatronic: dnolen: omg.. i spent the 2 years prior to now implementing a time keeping system in java… joda was the only thing that made it not absolute catastropic torture/failure

19:28 dnolen: hiredman: all valid points of discussion, none of that was being ignored as far as I could tell.

19:28 hiredman: 58.875 dnolen hiredman: the discussion is not about java.util.Date

19:29 dnolen: hiredman: what I meant was the discussion was to hash out such details that is all. start the discussion about a particular type and possibly extending it to other common exchange types.

19:30 anyways, again seems to me perfectly legitimate given ClojureScript.

19:30 ibdknox: dnolen, so the discussion should never be about the validity of an idea?

19:30 we should always assume that's a given?

19:30 moogatronic: maybe i'm blind, but that thread seems perfectly normal and civil to me.

19:30 dnolen: ibdknox: I just don't see what's contentious. Yes I want it to be easier move data between server and client. That's a common source of pain.

19:31 ibdknox: dnolen, I mean in a general sense. That seems to be the implication with all the threads lately

19:32 rather, the threads Rich has come into

19:32 hiredman: dnolen: *shrug*, we actually json encode a lot of stuff and just turn dates into milliseconds, hasn't really been a pain

19:32 ibdknox: same here

19:32 the only safe way to pass dates around has always been millis

19:32 hiredman: dnolen: I don't understand why you keep saying we should be discussing the types?

19:33 I agree that in some sense it is not important, because it is pluggable to a degree, but the default does matter

19:33 TimMc: moogatronic: Rich's responses to Chas were pretty ugly at several points.

19:33 brehaut: why does the wire format have to be the same thing as the reader syntax?

19:34 hiredman: well, json types are not particularly rich

19:34 dnolen: ibdknox: it's the only safe way because you don't have common reader support at both ends.

19:34 hiredman: no sets

19:34 dnolen: hiredman: and only strings for keys. argh.

19:34 moogatronic: TImMc: I just read it as 'straight-shooting'. It's tricky to read into intent and emotion when you're doing it from text and not face to face.

19:34 I tend toward the 'cylon' cide of things emotionally though, and lots of people think I'm an asshole when I mean no harm.. =)

19:35 brehaut: hiredman, dnolen: definitely no argument that json / js arent ideal

19:35 moogatronic: TimMc: but i see your point.

19:36 dnolen: TimMc: I don't disagree but cemerick loves rhetoric. rhickey tolerance for that is famously low has been since day one.

19:36 TimMc: dnolen: So there's some backstory here?

19:36 moogatronic: My benchmark for asshole is the old Hibernate forums.

19:36 and the creator's postings… =)

19:37 dnolen: TimMc: ML and IRC are full of such examples.

19:37 scottj: moogatronic: doesn't seem to have hurt hibernate's adoption :)

19:37 brehaut: meh, everyone is an arsehole somewhere on the internet

19:37 scottj: (ok true hibernate could potentially be more popular if the forums were nice)

19:39 dnolen: time instants for maps keys, sounds useful to me.

19:39 hiredman: java.util.Dates (a mutable object) as a key

19:39 great

19:40 set! as a way to swap around reader macros isn't really composable either

19:42 really just seems halfbaked, a lot of thought into what the language implementer wants to implement and provide, little thought into how it would be used

19:42 mdeboard: Anyone have a link handy to the "Where did all my favorite libraries go?" link?

19:42 ibdknox: $google where did contrib go?

19:42 lazybot: [Where Did Clojure.Contrib Go - Clojure Design - Clojure Development] http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go

19:43 mdeboard: Thanks

19:43 Guess the Compojure "hello world" tut needs updating

19:44 dnolen: hiredman: I guess don't see how that's any different from set! for unchecked math or removing asserts

19:44 seancorfield: i was a bit surprised at rich's tone but i think he's gotten a bit tired of some of the recent discussion threads getting non-technical

19:44 ibdknox: if you ask a question about design

19:45 it cannot be purely technical

19:45 TimMc: I can't get a good sense of what he wants.

19:45 ibdknox: in any case

19:45 hiredman: dnolen: it's not purely a compile time setting

19:45 ibdknox: it sounds like he just shouldn't be a part of the community

19:45 TimMc: I don't know where to look to find out.

19:45 ibdknox: if he can't handle this

19:45 moogatronic: ibdknox: I'm not sure your assertion is true. Design does not imply non-technicality necessarily.

19:46 ibdknox: moogatronic, yes it does.

19:46 moogatronic: how so?

19:46 ibdknox: moogatronic, design has "feel"

19:46 feel is inherently non-technical

19:46 moogatronic: IF you design an algorithm, are you using "feel"? or Technical metrics?

19:46 ibdknox: I say this having been a part of the language designs for C# and VB

19:46 mdeboard: Rich doesn't seem like a very feely guy

19:47 moogatronic: (i'm not arguing for the superiority of Feel vs not Feel Btw….)

19:47 ibdknox: this isn't an algorithm this is an interface

19:47 and interfaces are feel-oriented

19:47 hiredman: seancorfield: you go to chime in about the various bodies and committees you've been part of?

19:47 are you going

19:47 moogatronic: Well, i was speaking purely to your assertion of Design implying "feel" necessarily.

19:48 ibdknox: but I understand your poitn here… I live in a house with an HCI PhD student. =)

19:48 ibdknox: moogatronic, :)

19:48 moogatronic: (my wife)

19:48 mdeboard: nil

19:50 moogatronic: You could theoretically design an "interface generator", based on some sort of generative algorithm, use a subjective fitness function initially to discover common "feel", and then implement a purely technical "design" that executes your "feel" approximation….? =)

19:50 ibdknox: lol

19:50 :p

19:51 seancorfield: hiredman: why would i? :)

19:51 hiredman: I dunno, you usually do, and ibdknox did, so I figured you might feel the need

19:51 wanted to leave you an opening just in case

19:51 amalloy: moogatronic: that's how ibdknox composes each message he sends to #clojure! how did you guess?

19:52 ibdknox: damnit! my secret is out

19:52 moogatronic: source or it didn't happen. (isn't happening). =)

19:52 seancorfield: i don't feel strongly enough about time literals - and with a pluggable reader i'm happy (or happy enough)

19:52 i expect i'll feel more strongly about subsequent literals...

19:53 hiredman: but the plugin mechanism proposed isn't particularly nice

19:53 mdeboard: ibdknox: Does your "feeling" module have a pluggable backend?

19:53 Wait.

19:53 Forget I said that.

19:53 seancorfield: no, but i made that point about tools.logging too and got shouted down :(

19:54 ibdknox: my issue is primarily the way that exchange went down. I think adding a time literal is dangerous from a precedent standpoint and I feel like it hasn't been well thought through

19:54 mdeboard, hahaha

19:54 mdeboard, way to raise the level of discourse ;)

19:54 hiredman: like, if I set! *instant-reader* to something returns joda dates instead of java datas, I suddenly lose round tripping unless I also define a print method that generates the proscribed format

19:54 mdeboard: Yeah, I'll just be over here.

19:54 jcromartie: there are just too many things that we *could* have literals for

19:55 but are we talking about reader macros here, or what?

19:55 hiredman: and while I can using binding to limite the scope of changes to *instant-reader* changes to printing for objects is global

19:55 etc, etc, etc

19:55 dnolen: hiredman: but that's the case anyway w/ all Clojure types.

19:56 hiredman: dnolen: there is nothing I can bind that will change the type of a something that would be read in as a symbol

19:56 dnolen: hiredman: it also seemed to me that support for Joda was on the table, if it's there, no?

19:57 hiredman: dnolen: for parsing

19:57 the default in memory representation has been declared to be j.u.Date

19:57 moogatronic: i'm not clear on how you could support or not support joda, it seems you'd have to go all or none. j.u.D doesn't have partials and instants.

19:57 hiredman: right

19:57 dnolen: ibdknox: I think with rhickey, case is, it's been thought through.

19:57 hiredman: this "instant" literal is just date times

19:58 technomancy: I wonder if they realize that JSR 310 is backwards-compatible

19:58 hiredman: so you don't have all the other rich time constructs from joda

19:58 ibdknox: dnolen, I appreciate his intelligence, but his creation is no longer his. His actions now affect everyone. It shouldn't just be him thinking through it.

19:59 hiredman: and stuartsierra is making bad suggestions like it should allow any timezone when printed, but always UTC in memory

19:59 which is a. dumb and b. impossible

19:59 technomancy: haha, seriously?

19:59 hiredman: because the representation in memory is dictated by *instant-reader*

20:00 for reals man

20:00 http://dev.clojure.org/pages/viewpage.action?pageId=950382&focusedCommentId=4063247#comment-4063247

20:00 ugh

20:00 UGH

20:00 dnolen: ibdknox: hmm … my feeling is that the creator usually has a much more complete picture of what's at stake.

20:01 moogatronic: hiredman: I had to implement anytime zone when printed and UTC in memory/persisted. That seems like a pretty common requirement.

20:01 ibdknox: dnolen, than any one person? sure. Than all the people close to the core of the language? certainly not.

20:01 dnolen, why do presidents always have some form of cabinet?

20:01 dnolen: ibdknox: Clojure's been around for 3 years, I still think only rhickey really understands the internals that well.

20:02 moogatronic: ibdknox: difusion of responsibility when something goes wrong.

20:02 ibdknox: haha

20:02 that too

20:02 hiredman: moogatronic: sure, you really want UTC everywhere if you can manage it, but rich is, as far as I can tell trying to avoid mandating the in memory representation here

20:02 so, if you allow people to change the in memory representation you cannot mandate the timezone

20:03 ibdknox: dnolen, I don't disagree, but that doesn't conflict with my point

20:03 hiredman: and mandating UTC for the serialized representation (which is largely what is at stake here) makes it at least kind of sane

20:03 seancorfield: i was much mollified when rich said this is really only to support data transport - in clojure - rather than become the entry point to a whole date/time library

20:04 ibdknox: dnolen, that being said, correctness has little to do with perception. I was put off by that thread, which means I suspect others were too... and that makes me sad.

20:04 hiredman: seancorfield: the datetime library you choose to use could set! *instant-reader* to return a type it likes, and suddenly instants are a different type everywhere

20:04 seancorfield: i, personally, would like the default to be Joda Time but with the reader hook i can live with that (and it sounds like if you have Joda Time on your classpath, this feature will switch to it automatically which will suit me fine)

20:05 technomancy: seancorfield: why not wait for JSR 310?

20:05 amalloy: $google JSR 310

20:05 lazybot: [JSR-310 — Java.net] http://jsr-310.java.net/

20:05 hiredman: seancorfield: no no that is not the switch, joda time will only be used for parsing, unless you or a library you uses changes *instant-reader*

20:06 the switch with joda time is only for parsing

20:06 either use joda time or use some stupid java xml date thing

20:06 seancorfield: hiredman: yes, and if it sets it to joda time, i'm happy - if it does something else, i won't use the library... printing will need to be compatible with parsing so i assume the smart folks on clojure/core will handle that :)

20:07 technomancy: sounds like jsr 310 could also be used as a reader hook (and printer), yes?

20:08 technomancy: seancorfield: it's the successor to joda

20:08 seancorfield: since the actual in-memory data type is irrelevant, the issue is really the #@iso-string literal, yes?

20:09 hiredman: the in memory data type is relevant, but to a lesser degree

20:09 ibdknox: rereading the thread I find myself less shocked at rich's response, and acutally I still haven't read anything chas wrote, his emails are always tld;

20:10 dnolen: hiredman: I agree. the info bandwidth of the internet is classic source of fail.

20:12 seancorfield: (use 'clj-time.coerce) (let [jdate (from-date #@2011-11-04T23:07:53Z)] (do-joda-stuff jdate)) ;; happy with j.u.Date as default representation :)

20:12 hiredman: but you load some other code, and suddenly you get back a map of {:day … :year …}

20:13 cause some idiot thought that would be a good idea

20:13 seancorfield: huh? where would the map come from?

20:13 hugod: I was just about to ask if it broke composability of libraries

20:13 hiredman: my point is, this opens the door to all the problems of reader macros, while still limiting us to the reade macros core adds

20:14 seancorfield: someone did a set! on *instant-reader* to replace it with something that returns a map representation of datas

20:14 dates

20:14 seancorfield: like i said, if a library does something dumb like that, just don't use that library - this sort of extension point requires sane collaboration and i think the community will self-police that

20:14 hiredman: hugod: it will if people are dumb about it

20:14 dnolen: hiredman: same if someone left a set! unchecked-math flag in there code and broke all your big int math right?

20:14 seancorfield: exactly dnolen

20:15 hiredman: dnolen: sure, and just because have one distasteful thing doesn't mean we want two

20:15 * technomancy mutters something untoward regarding clojure.data.codec

20:16 dnolen: hiredman: my assumption is any library worth using will set and restore, just like you do w/ unchecked math. seems like a non-issue in real life.

20:16 hiredman: dnolen: but to round trip you can't do that

20:17 dnolen: hiredman: sorry, I'm slow, why not?

20:18 hiredman: the simplest way to ensure scoping like that for reading is with (binding [*instant-reader* ...] (read ...)) but there is nothing similar for scoping changes to printing of dates

20:19 dnolen: hiredman: but doesn't everything prints the same dictated by the reader support, what's the issue?

20:20 hiredman: hmmm

20:21 thats true

20:22 but if they don't setup a print method for the in memory representation they use

20:25 dnolen: hiredman: my feeling is that everyone sane will just use Joda for in memory rep, and there will be a common print method for that. ClojureScript side, everything is mutable anyway, ClojureScript is just running on convention.

20:26 hiredman: so why not just use joda time or JSR 310? if that is what everyone should be doing?

20:26 technomancy: the answer is probably android, even though it shouldn't be.

20:27 hiredman: pffft

20:27 technomancy: yeah =\

20:37 dnolen: http://www.eclipse.org/Xtext/xtend/#multipledispatch same example as Clojure, coincidence?

20:37 hiredman: what the hell

20:37 we really needed another one of those

20:39 dnolen: "Switch expression 'cause pattern matching is complicated"

20:39 they meant "complected", get it right.

20:41 amalloy: i glanced at the intro movie with "package my.company", 'public class Greeter", "public void greetABunchOfPeople(List<String> people)" and so forth. was thinking: okay, here's the gross java, show me the two lines of code you use to generate this

20:42 wait...this is the awesome low-boilerplate language they're advertising?

20:42 dnolen: haha

20:43 gfredericks: amalloy: ditto.

20:47 mdeboard: Man I really wish they didn't call the Clojure conference "Clojure conj"

20:48 makes it really hard to google `conj` :\

20:57 seancorfield: and the unconference is the Clojure Disj (according to some wag on the ML)

20:57 Clojure/West is easier to google for :)

21:11 TimMc: amalloy: haha

21:11 that's pretty amazingly... non-novel

21:33 djanatyn: hmm, trying to get my slime working with clojure

21:46 seancorfield: where did the name "slime" come from? and "swank"?

21:46 TimMc: slime is an acronym

21:46 swank... dunno

21:47 ___ LISP Inferior Mode for Emacs, I think

21:47 cemerick: Superior, IIRC

21:47 mdeboard: "SLIME: LISP Inferior Mode for Emacs"

21:47 That's what it should be, anyway.

21:50 TimMc: mdeboard: I think you're right...

21:50 LIME would just be too silly and unprofessional a name

21:51 mdeboard: Tell that to an 18th-century sailor, body racked by scurvy

21:51 wracked*

21:51 or someone taking shots of tequila

21:54 djanatyn: okay, getting clojure working with slime is more difficult than I thought >_>

21:54 mdeboard: God I am so unbelievably tempted to rewrite my employer's web back end in Clojure via Noir (vice Python via Django)

21:54 djanatyn: Via emacs or what

21:54 djanatyn: That is, is the problem with emacs or what

21:54 amalloy: Superior Lisp Interaction Mode for Emacs

21:54 mdeboard: amalloy: I like mine better.

21:54 leo2007: good morning.

21:54 djanatyn: mdeboard: I think the problem is just with me, and my low level of experience with slime

21:55 I've been using lispbox because my attempts to set up slime with my regular emacs were unsuccessful

21:56 mdeboard: djanatyn: It sounds like you're making the same mistakes I did when I was first getting going with Clojure

21:56 djanatyn: If you're installing Slime or invoking slime manually in any way you're doing it wrong

21:57 djanatyn: You don't need to install anything on your system but leiningen, nor anything in emacs except clojure-mode

21:58 (Well, you need jdk for leiningen, but yeah.)

21:58 djanatyn: oh, okay.

21:58 so, I shouldn't be using slime with clojure? :\

21:58 mdeboard: djanatyn: I wasted two days and a lot of energy before I realized that.

21:58 djanatyn: or, does leiningen do something cool

21:59 mdeboard: djanatyn: You will be using slime, but you do not need to install or invoke it manually

21:59 djanatyn: Leiningen abstracts all that away.

21:59 djanatyn: oh, okay

21:59 sweet!

21:59 thank you for your advice.

21:59 mdeboard: djanatyn: np, it is confusing when starting out

21:59 djanatyn: okay, cloning leiningen

21:59 mdeboard: nope

22:00 don't do that

22:00 djanatyn: :)

22:00 how should i install leiningen?

22:00 mdeboard: https://github.com/technomancy/leiningen follow the instructions

22:00 under "Installation"

22:00 djanatyn: aaaah

22:00 * djanatyn stops making assumptions

22:00 * mdeboard did the same crap

22:02 amalloy: mdeboard: leiningen requires the jdk? really?

22:02 ibdknox: LIES

22:02 mdeboard: lol :(

22:02 amalloy: i'm still not sure whether you mean the jre or there's some actual jdk dependency i don't know about

22:04 djanatyn: sweet!

22:04 so, now that I have lein installed, what do I do now?

22:05 mdeboard: amalloy: Well, I had to install the jdk when insalling to this computer. Said it needed javac :-\

22:05 djanatyn: Do you have clojure-mode installed in emacs

22:06 Damn hiccup is sweet.

22:06 djanatyn: mdeboard: yep!

22:06 mdeboard: djanatyn: Ok, well just keep following the instructions at the github repo :P

22:06 ibdknox: mdeboard: yes it is

22:07 mdeboard: `lein new <proj name>`

22:07 ibdknox: I scoffed at Hiccup when I first heard about it

22:07 ibdknox: how foolish! lol

22:07 mdeboard: Yeah.

22:07 srs

22:09 djanatyn: hmm, I'm *almost* connecting, but getting some errors for some reason

22:10 woah, lein is pretty awesome

22:10 mdeboard: djanatyn: Don't let technomancy hear you say that

22:10 ibdknox: djanatyn: very awesome

22:11 technomancy never comes around these parts ;)

22:11 djanatyn: ah, I thought making an application with clojure would be harder than this ^_^;

22:11 mdeboard: djanatyn: You probably didn't do `lein deps` in your new project directory

22:11 ibdknox: djanatyn: that's what we're here for :)

22:11 and much needed comic relief.

22:12 mdeboard: unless dnolen is here, I don't talk when he's here. damn, he scary

22:12 djanatyn: ooh, a fatal error, fun

22:12 dnolen: mdeboard: what?

22:12 mdeboard: dnolen: I didn't know you were actually here.

22:13 djanatyn: Fatal error where, when running lein deps?

22:13 djanatyn: yeah

22:13 ibdknox: dnolen: I'm excited to hear about predicate dispatch soon :)

22:13 dnolen: :O

22:13 djanatyn: # Problematic frame:

22:13 # J clojure.asm.ClassWriter.toByteArray()[B

22:14 * dnolen hides

22:14 ibdknox: haah

22:14 moogatronic: dnolen: I saw you tweet that D. Friedman was coming to the conj, is he presenting?

22:15 * mdeboard needs to double-check irc logs before sticking his foot in his mouth

22:17 mdeboard: djanatyn: I've never encountered that particular error. Total flail here, but maybe `lein upgrade`... also, it's been awhile but I think you may need to `lein plugin install swank-clojure "1.3.0"`

22:18 djanatyn: thank you for your help

22:18 zerokarmaleft: mdeboard: 1.3.3 is the latest

22:18 mdeboard: zerokarmaleft: oic, thanks

22:18 zerokarmaleft: at least last time i checked :x

22:18 amalloy: mdeboard: dno<TAB> is an easier way to find out :P

22:18 djanatyn: hmm, still getting errors

22:19 mdeboard: amalloy: Right? I'm an idiot.

22:19 djanatyn: ah, but now lein deps will run

22:19 :\

22:20 mdeboard: djanatyn: Yeah so from my rudimentary understanding never having touched the JVM before Clojure, `lein deps` sets the runtime conditions of the JVM that will be used for your project as dictated in `project.clj`. When you use clojure-jack-in, you need to do it from a buffer containing the file from that project.

22:21 djanatyn: I have minimal experience with the JVM

22:21 most of my time with programming has been with perl and python, and I'm taking a java class at my high school which I don't like very much

22:21 I do, however, like the JVM a lot

22:21 I've been reading practical common lisp and playing with common lisp for a while, and started reading SICP too

22:21 mdeboard: djanatyn: Yeah so open up like `/<your project>/src/<your project>/core.clj` then do clojure-jack-in

22:22 djanatyn: so I decided that tonight I should finally try clojure, which I've been wanting to try for a long time

22:22 Ah, okay!

22:22 I was trying to use M-x slime-connect, maybe that was a bad idea :)

22:22 mdeboard: Yeah you should really never have to even type "slime" unless you're trying like C-x b slime-repl

22:23 well, not never, but as a beginner

22:23 amalloy: mdeboard: C-c C-z

22:23 mdeboard: amalloy: orite

22:23 amalloy: and also, M-x ido-mode

22:23 mdeboard: I don't know wat that is, but I already have it enabled

22:25 amalloy: mdeboard: makes the buffer/filename prompts better, so you can type in like "repl"

22:25 djanatyn: :\

22:25 mdeboard: Oh, is that what that is?

22:25 Is that what does that*

22:26 djanatyn: No luck"

22:26 s/"/?

22:26 clojurebot: amespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it

22:26 mdeboard: what

22:26 s/"/?

22:26 clojurebot: amespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it

22:26 djanatyn: okay, I ran `lein repl` in the directory of the project which ran successfully

22:26 and I opened up and saved core.clj, which worked fine with syntax highlighting and everything

22:26 mdeboard: cool

22:27 then..

22:27 seancorf`: if i have a macro in one namespace and want to make an alias for it in another namespace?

22:27 djanatyn: M-x clojure-jack-in ran, but then it said it exited abnormaly with code 1

22:28 and the buffe3r said "that's not a task. use "lein help" to list all tasks"

22:28 that's weird

22:28 it tried to run lein jack-in, I think

22:28 mdeboard: oh right, uhm

22:28 djanatyn: should lein jack-in be a task?

22:28 mdeboard: djanatyn: I had this exact issue the other day

22:29 when reinstalling on a fresh machine

22:29 djanatyn: well, I sure am lucky today :D

22:29 * mdeboard thinks

22:29 moogatronic: was core.clj still open when you ran M-X clojure-jack-in ?

22:29 mdeboard: djanatyn: This is going to sound hacky but restart emacs

22:29 moogatronic: or whatever source from the lein project ...

22:29 djanatyn: moogatronic: yes, I ran it from inside the core.clj buffer

22:30 I just defined a simple function, (defn square [x] (* x x))

22:30 mdeboard: moogatronic: That's not it, it has something to do with the emacs shell session not having access to the lein binary or something

22:30 djanatyn: Did you try restarting emacs

22:30 djanatyn: should I be running `lein repl` in another terminal?

22:30 mdeboard: doing that now

22:30 mdeboard: no

22:31 djanatyn: okay,

22:31 moogatronic: lein is in your shell search path?

22:31 … i would assume.

22:31 =)

22:31 djanatyn: yeah, I got the same error

22:31 it's in /usr/bin

22:32 zerokarmaleft: djanatyn: lein repl is basic readline-enabled repl, lein swank starts a swank server which slime connects to, but M-x clojure-jack-in calls lein swank for you

22:32 djanatyn: okay, I think I found what might be the problem

22:32 moogatronic: i was about to suggest- -

22:32 does lein swank work

22:33 djanatyn: yes, `lein swank` works

22:34 oh, sweet!

22:34 well

22:34 If I run `lein swank` in a terminal I Can connect with M-x slime-connect

22:34 moogatronic: if that work,s you can just M-x slime-connect

22:34 djanatyn: kinda hacky but it works

22:34 mdeboard: meh

22:34 djanatyn: oh, wow :D

22:34 moogatronic: to get going anyway

22:34 djanatyn: yeah, that's awesome

22:35 moogatronic: ac-slime and autocomplete are pretty nice too

22:35 mdeboard: djanatyn: what happens when you do M-x shell-command lein jack-in

22:35 moogatronic: for learning

22:35 djanatyn: worst-case-scenario, I could define an elisp function in my .emacs to do it for me

22:35 this is much better than clooj :D

22:36 airolson: djanatyn: one thing that confused me was having to "jack in" from a file in your project

22:36 seancorf`: figured it out: (def ^:macro alias @#'names/macr)

22:36 airolson: djanatyn: i.e. you had to have a file from your project open in the currently-focused buffer

22:37 djanatyn: I usually opened my project's project.clj and then did M-x clojure-jack-in

22:37 amalloy: seancorf`: that doesn't copy as much as you'd like. eg, the eldoc arglists will be wrong

22:37 (well. won't exist at all)

22:37 seancorf`: don't need the docs, just the functionality (i think)

22:38 mdeboard: djanatyn: I still personally prefer C-x C-e to evaluate in the clojure buffer vice the repl

22:38 amalloy: https://github.com/amalloy/useful/blob/f/core/src/useful/core.clj#L5 - might as well copy all the meta

22:39 djanatyn: I like defining functions in a buffer, and then compiling with C-c C-k

22:39 mdeboard: You'll do it my way and like it

22:39 djanatyn: and then I play around with them in the REPL

22:39 mdeboard: Just kidding, I have a headache

22:39 God I really, really love Noir & Hiccup

22:39 * gfredericks goes to bed

22:45 mdeboard: Pleasantly surprised at arbitrary tags with Hiccup, e.g. (html [:banana "PB&J Time"]) == <banana>PB&J Time</banana>

22:45 that's hot

22:46 tensorpudding: trying to get in with clojure again

22:46 i installed lein from debian's package

22:46 but it can't find clojure, it seems

22:46 mdeboard: tensorpudding: `lein new <new project>`, `cd <new project>`, `lein deps` ?

22:47 tensorpudding: i have a working project

22:47 lein deps fails

22:47 mdeboard: with what error

22:47 tensorpudding: <huge backtrace> Could not find the main class: clojure.main. Program will exit.

22:48 mdeboard: and you're doing lein deps in the project dir I assume

22:48 tensorpudding: yes

22:48 this error is the same for every lein command i use though

22:48 mdeboard: tensorpudding: Yeah using apt for leiningen seems sketchy to me

22:49 what's `which lein` say?

22:49 tensorpudding: i'd rather dispose of the munging with source packages and that stuff

22:49 it's /usr/bin/lein

22:49 it's a sh script

22:49 that's been modified by someone

22:49 mdeboard: tensorpudding: lein upgrade doesn't work does it

22:49 duck1123: what version is it, isn't the apt lein old?

22:50 tensorpudding: self-upgrades are removed, says the comments

22:50 mdeboard: oy

22:50 djanatyn: so, is there a good tutorial for getting started with clojure?

22:50 tensorpudding: it fails with the same problem, in any case

22:50 duck1123: I'd just install it the right way

22:50 mdeboard: tensorpudding: I would remove that apt package and do it the proper way

22:50 spoon16: djanatyn: watch the videos on clojure.org

22:51 tensorpudding: someone has surely posted a bug to b.d.o by now

22:51 if it's actually broken

22:52 duck1123: tensorpudding: chances are, something in your dev dependencies is screwing things up

22:52 do you get this in all projects?

22:52 tensorpudding: yes

22:52 i get it with lein new too

22:53 mdeboard: tensorpudding: Why not just remove the apt package and install according to instructions at the Leiningen github page

22:53 djanatyn: hmm, since I'm connected now, how do I pull up a repl?

22:53 tensorpudding: because it's messy

22:53 duck1123: well, I'd start by getting an up to date lein.

22:53 mdeboard: djanatyn: C-c C-z

22:53 tensorpudding: It's not messy at all

22:53 seancorf`: amalloy: you're right that i don't have enough metadata :)

22:53 mdeboard: tensorpudding: How is it messy?

22:53 tensorpudding: and because i don't like installing packages that don't work, without figuring out why, and filing a bug

22:53 djanatyn: -_-

22:53 it opened up sbcl

22:53 mdeboard: djanatyn: Do that sequence from a Clojure buffer

22:54 Or hell it may not work because you didn't use clojure-jack-in

22:54 tensorpudding: installing source to /usr/local is always messy

22:54 you can't remove it easily

22:54 it can conflict with installed packages

22:54 djanatyn: ah, I've got (setq inferior-lisp-program "/usr/bin/sbcl") in my .emacs

22:54 I've been thinking of installing debian and working with a fresh install recently

22:55 maybe clojure will motivate me to do it this weekend

22:55 duck1123: just put it in ~/bin/lein then add ~/bin to your path

22:55 * djanatyn is on fedora now

22:55 mdeboard: tensorpudding: Have you actually read the installation instructions?

22:55 tensorpudding: that is a local install

22:55 mdeboard: Anyway, not my thing to defend, hope it works out for you :)

22:55 duck1123: djanatyn: I'm a big fan of just running lein swank and then M-x slime-connect

22:56 tensorpudding: i also have to upgrade it by hand

22:57 oh hmm

22:57 djanatyn: ...y'know what

22:57 maybe I'll just use clooj for a little bit

22:59 tensorpudding: fine, i'll install lein by hand

23:00 it better not complain about my clojure install though

23:00 i don't want to install that by hand

23:00 mdeboard: There's really nothing "manual" about leiningen

23:00 at all

23:00 scottj: kids have it so easy these days

23:01 duck1123: tensorpudding: if you're installing clojure, you're probably doing it wrong as well

23:01 djanatyn: \o/

23:01 seancorf`: hmm, i must be doing something wrong with that alias-ns code...

23:01 tensorpudding: installing from source is doing it wrong

23:02 djanatyn: so, since I'm using clojure, I don't have to deal with nasty java stuff - I can just use java libraries for fun?

23:02 tensorpudding: last i used clojure you couldn't get by without java

23:02 mdeboard: djanatyn: Or when needed

23:02 duck1123: clojure gets pulled in as a dependency of your project. You shouldn't need to install it

23:02 mdeboard: djanatyn: If programming is fun, you are doing it wrong. It should be painful and ceremonial like god intended

23:03 tensorpudding: well, whatever

23:03 djanatyn: xD

23:03 tensorpudding: i don't mind if it gets pulled in separately

23:03 djanatyn: you sound like my java teacher

23:03 mdeboard: lol

23:03 djanatyn: she's been learning python recently

23:03 her code is fun to look at

23:03 she tries to write java in her python

23:04 so, if I wanted to get user input in clojure, what would I do?

23:04 duck1123: I just got back form a talk by the 7 languages in 7 weeks guy. He saved the best for last

23:04 djanatyn: make a new Scanner object like in java?

23:04 mdeboard: djanatyn: No

23:04 djanatyn: or use cool clojure streams or something?

23:04 like in common lisp

23:05 mdeboard: http://stackoverflow.com/questions/1114690/how-to-get-user-input-in-clojure

23:05 djanatyn: Caution, this will not work in slime-repl

23:05 but will in lein-repl

23:05 er, lein repl

23:05 tensorpudding: project management in clojure is weird

23:06 mdeboard: I agree with that

23:06 scottj: if not having your hair set on fire is weird

23:07 duck1123: the other languages I use are Java (Maven) and Ruby (RVM + Bundler) which are pretty similar

23:07 tensorpudding: i do most of my coding as late in python

23:07 though more recently i've been using google go

23:08 mdeboard: tensorpudding: Ditto. pip + virtualenv is a different animal.

23:08 tensorpudding: i didn't use pip

23:08 my packages had used distutils

23:10 how new does my clojure-mode have to be so that i can use jack-in

23:10 wait, my old packages have a swank-clojure dep that's too old

23:11 * mdeboard wonders how intense tensorpudding's beard is

23:11 tensorpudding: i have no beard

23:11 duck1123: try ignoring that warning

23:11 * duck1123 lost all respect for tensorpudding

23:12 tensorpudding: ugh, what do i have to do for M-x clojure-jack-in

23:12 right, my clojure-mode is 4 major releases behind

23:12 mdeboard: tensorpudding: Have you recompiled your kernel yet

23:12 Sorry

23:12 tensorpudding: i don't recompile my kernel

23:13 duck1123: are you using elpa?

23:13 tensorpudding: sorry, do you have the idea that i'm a greybeard because i use emacs?

23:13 i thought most clojure people used it

23:13 or at least, technomancy does

23:13 duck1123, i have marmalade configured

23:13 jli: I'm trying to understand when it's safe to use atoms. in the memoize example (http://clojure.org/atoms), isn't it possible to do some work multiple times?

23:13 mdeboard: But seriously, bring all your packages up-to-date, `lein plugin install swank-clojure "1.3.3"`, `lein deps` then try `clojure-jack-in`

23:14 tensorpudding: i brought swank-clojure up to date

23:14 but doing that doesn't change the behavior of emacs's clojure mode

23:14 jli: between the @mem and the (apply f args), couldn't another call to memoize have already added the result of (apply f args) to mem?

23:14 in this case it's safe, but work is still duplicated

23:14 mdeboard: tensorpudding: Right, you'll still need to update clojure-mode

23:14 tensorpudding: yes

23:15 i need to remember how to upgrade in elpa

23:15 duck1123: i on the line then x

23:15 tensorpudding: ah, right, mark with U

23:16 then hit x

23:16 amalloy: jli: correct

23:16 i sketched out a version of memoize that doesn't have this problem, somewhere

23:17 ibdknox: amalloy: did it use transactions or something?

23:17 amalloy: ibdknox: no, just less-dumb atoms

23:17 iirc

23:17 mdeboard: Ooh wow Noir prints exceptions really nicely

23:18 * mdeboard is easily impressed

23:18 tensorpudding: hooray

23:18 ibdknox: that's worth being impressed about ;)

23:18 amalloy: ibdknox, jli: https://gist.github.com/1252810

23:18 tensorpudding: oh man, new clojure-mode is weird-looking

23:19 amalloy: though that version has its own problems: it fails for false/nil values. not sure what i was thinking there

23:19 ibdknox: haha

23:19 amalloy: oh, no, i see

23:20 i'm putting the delay into the atom, so that's never false. then i force it

23:20 ibdknox: yeah that makes sense

23:20 tensorpudding: the functions in my project don't seem to be available

23:20 from slime

23:21 duck1123: try requiring them

23:21 tensorpudding: i forgot how require works

23:21 duck1123: (require 'my.namespace.core) or C-c C-k in the file

23:21 amalloy: ibdknox: a neat gist of mine i stumbled upon while looking for that one: https://gist.github.com/1288628 is a handy trick

23:22 tensorpudding: right, gotta quote the thing

23:22 i hoped that starting a repl on the project meant that their namespace would be included already

23:22 ibdknox: amalloy: I feel like I don't use delays enough

23:22 amalloy: ~delay

23:22 clojurebot: Huh?

23:22 ibdknox: not that they should be used all the time

23:23 amalloy: aw. i was hoping he'd know some clever quip

23:23 ibdknox: lol

23:23 duck1123: ibdknox: now I'm thinking the same thing

23:23 amalloy: wait for it

23:23 amalloy: ibdknox: yeah same here. i think i've only found three good uses for delays, and i just showed you two of them

23:23 ibdknox: haha

23:24 amalloy: the other one is https://github.com/flatland/useful/blob/develop/src/useful/seq.clj#L175

23:25 useful for something like (some even? (lazy (compute-thing) (compute-other-thing)))

23:32 jli: so, I have a work queue. I want to take an item off and do some side-effecty thing, but never do work twice. I was thinking of wrapping everything in swap!, but apparently side-effects shouldn't go in swap! ?

23:32 duck1123: jli: if you send to an agent, that agent is run only at the end

23:35 amalloy: not true

23:35 duck1123: no?

23:35 amalloy: only for refs

23:35 duck1123: ahh

23:36 spoon16: I'm reading some CLJ and I see an instance where the author is doing (ns (:gen-class)) and then all the methods are defined as (defn -methodName)

23:36 does the "-" in the defn mean something in this case?

23:37 s/methods/functions

23:37 amalloy: spoon16: see the docs for gen-class

23:37 mdeboard: Wow, Noir is amazing. I'm really thunderstruck.

23:37 What's the word the British use

23:37 gobsmacked

23:37 amalloy: mdeboard: he's in california, not england. you can just say "whoa...dude..."

23:38 ibdknox: whoever wrote it must be awesome...

23:38 amalloy: you say he lives in CA?

23:38 mdeboard: oh, holy shit.

23:38 lol.

23:38 * mdeboard just looked at the repo

23:38 amalloy: ibdknox: i've never managed to run into him. he must be some kind of recluse

23:38 mdeboard: I've been looking at webnoir

23:39 Noir isn't bad, if you like that sort of thing.

23:39 ibdknox: amalloy: srsly, I hear he's never actually seen the day star.

23:39 duck1123: amalloy: I hear he's in #clojure from time to time

23:39 mdeboard: -_-

23:39 amalloy: he'll probably wear a bag over his head at the conj to protect his identity

23:39 mdeboard: Ok, ok

23:40 ibdknox: I like. Really a sea change from Django. Though the stuff I'm most floored by is really Hiccup-related

23:40 Django/Flask/every Python framework ever

23:40 ibdknox: I can't take credit for hiccup :)

23:40 scottj: ibdknox: noir is awesome, especially hiccup and compojure :)

23:41 and ring too! that's genius

23:41 ibdknox: lol

23:41 scottj: it's true

23:41 mdeboard: The best part about Noir is leiningen

23:41 scottj: and the stacktraces too! (I haven't looked to see if you use the lib for that)

23:42 ibdknox: scottj: I use a parser, but I do work on them past that to make them nicer

23:42 scottj: I wish everyone would just stop praising ibdknox's work on noir and korma so he'd get back to pinot :)

23:43 ibdknox: scottj: soon, soon. I'll get to it after the conj

23:43 scottj: ibdknox: what security concerns should I have about remotes?

23:43 mdeboard: I thought someone else wrote Korma

23:43 ibdknox: scottj: I have no idea, I haven't tried to do anything evil with them yet

23:44 scottj: mdeboard: it's true, ibdknox used up all his color scheme sense on noir

23:44 mdeboard: Is this still idiomatic for db connections http://en.wikibooks.org/wiki/Clojure_Programming/Examples/JDBC_Examples#MySQL

23:44 ibdknox: scottj: :p

23:44 mdeboard: There's a color version of Scheme?

23:44 what

23:44 oh

23:44 derp

23:44 wow

23:44 * mdeboard didn't think the plum-on-gold was that bad. Very royal.

23:45 amalloy: at least it's not yellow on orange

23:45 ibdknox: ~rimshot

23:45 clojurebot: Badum, *ching*

23:45 mdeboard: Perfect color scheme for autumn

23:46 ibdknox: Do you come from Ruby land or something

23:46 ibdknox: depends on which part of my life you're talking about :)

23:47 most recently I was the program manager for VB and C# in Visual Studio

23:47 mdeboard: yikes

23:47 ibdknox: previous to that I built websites in PHP/Python/Ruby

23:47 mdeboard: Are there any plans to handle db connections with Korma?

23:47 ibdknox: it already does?

23:47 mdeboard: Oh.

23:48 scottj: ibdknox: you know what would be awesome is if korma did sql

23:48 mdeboard: lol.

23:48 ibdknox: hahaha

23:48 mdeboard: Wow shut up

23:48 I couldn't see the docs button :|

23:48 ibdknox: lol

23:48 amalloy: not your favorite color scheme NOW, eh?

23:48 mdeboard: hahaha

23:49 I'm going back to #Python, at least I'm smarter than everyone there

23:49 ibdknox: Must be running on a CRT monitor

23:49 amalloy: ibdknox: next time: "yeah, hang on, one sec...okay, implemented that for you"

23:49 mdeboard: ibdknox: Yeah, hold on let me degauss

23:49 ibdknox: amalloy: damnit, another wasted opportunity

23:51 mdeboard: for what, just out of curiosity? impress a newb?

23:51 I'm pretty impressed by all the Clojure luminaries that hang out in here, so it won't take much

23:51 ibdknox: for being sarcastic and funny :)

23:52 mdeboard: "Hey Matt I got dressed by myself this morning!" "Wowwwwwww that's AWESOME!!!"

23:52 ibdknox: mdeboard: just wait til you get to CLJS and pinot

23:52 then you can have hiccup... on the client side

23:53 mdeboard: asynchronous server-side cloud nosql?

23:53 ibdknox: + photo sharing

23:53 mdeboard: I don't know what hiccup on the client side would do for me

23:53 ibdknox: instead of generating html with strings if you want to add new stuff to the DOM

23:54 you can create DOM objects with my implementation of hiccup

23:54 and then bind events and such to them

23:54 mdeboard: Wowwww that's AWESOME!!! But seriously, neat. I don't do much with/have much interest in DOM manip./front-end stuff

23:55 ibdknox: a lucky one

23:56 mdeboard: Stuff like uh... Cascalog interests me more but I don't have a use case. Noir is a great fulcrum for learning more Clojure in general though.

23:56 ibdknox: that was the thought

23:56 it seems to have worked out pretty well

23:56 tensorpudding: why does clojure-mode indent lines beginning with ; so insanely

23:57 mdeboard: tensorpudding: use ;;

23:57 tensorpudding: I didn't answer your question, I know, but that's the solution

23:57 tensorpudding: is ; not valid for comments anymore?

23:57 mdeboard: tensorpudding: I think ; is for in-line comments

23:58 tensorpudding: this tutorial i'm reading suggest otherwise, but whatevs

23:58 mdeboard: `(do-stuff '(1 2 3)) ; this does stuff`

23:58 scottj: tensorpudding: I think other lisp modes, at least with paredit, do the same thing with ;

23:58 tensorpudding: oh

23:58 right

23:58 esk is using paredit now

23:58 it must be responsible

23:59 goodieboy: I have an sexp like '(prn "TEST") -- is "eval" to only way to execute this?

Logging service provided by n01se.net