2011-11-04
| 00:02 | brehaut | "Hacks and glory await!" lol |
| 00:11 | aperiodic | technomancy: sending an EOF makes them both exit |
| 00:12 | aperiodic | unless C-d is not an EOF |
| 00:23 | amalloy | brehaut: i smell a new swank user? |
| 00:23 | brehaut | amalloy: relatively :) |
| 00:24 | brehaut | since about the middle of october |
| 00:25 | amalloy | technomancy: you're telling leo2007 that slime should be able to jump to the definition of "def"? that would surprise me |
| 00:26 | napping | it would however be totally awesome |
| 00:28 | amalloy | especially since no definition exists :P |
| 00:31 | napping | it could open Compiler.java to the definition of class DefExpr |
| 00:31 | napping | it looks like that's what backs DefExpr |
| 00:32 | napping | backs "def", rather |
| 00:32 | amalloy | napping: sure, that would be possible (though probably not worth the effort). what part of DefExpr do you jump to, though? |
| 00:32 | napping | eval()? |
| 00: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 |
| 00:36 | napping | and defn seems to be a plain macro |
| 00:36 | amalloy | naturally. slime can jump to the impl of that, no problem |
| 00:37 | napping | Yeah, I was just worried some of those might be handled in Compiler.java |
| 00:42 | napping | aww, slime-disassemble-symbol doesn't seem to work - speaking of trying way too hard to present a "definition" |
| 00:53 | napping | technomancy: If I wanted to support slime-disassemble-symbol, would your swank-clojure be the place to hack it in? |
| 01:08 | leo2007 | (macroexpand '(let [x 1] (+ x x))) => (let* [x 1] (+ x x)) |
| 01:08 | leo2007 | is that odd? |
| 01:09 | brehaut | no |
| 01:09 | brehaut | leo2007: why? |
| 01:10 | leo2007 | let -> let* |
| 01:10 | leo2007 | let* is not defined. |
| 01:10 | brehaut | let* is a special form |
| 01:10 | brehaut | let merely adds destructuring sugar and some compile time checks to the form |
| 01:11 | leo2007 | ok, how to know that let* is a special form? |
| 01:13 | brehaut | leo2007: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L43 ? |
| 01:14 | napping | leo2007: the docs seem to lie, and claim let is a special form |
| 01:14 | hiredman | the idea is let is a special form, which happens to be implemented as a macro that expands to let* |
| 01:15 | hiredman | so use let |
| 01:15 | hiredman | at one point if was a macro that expanded to if* |
| 01:15 | hiredman | no it doesn't |
| 01:15 | hiredman | now |
| 01:16 | brehaut | hiredman: am i right in thinking that previously the destructuring wasnt handle by destructure either (thats a 1.0 change?) |
| 01: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 |
| 01:17 | napping | hiredman: it's nice to be able to see how the destructuring works by macroexpanding let |
| 01:17 | leo2007 | hiredman: Thanks. |
| 01:18 | hiredman | brehaut: not sure, as far as I know destructuring was always handled by destructure |
| 01: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. |
| 01: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}] |
| 01:18 | hiredman | leo2007: don't worry about it |
| 01:18 | hiredman | napping: it's not a pattern |
| 01:19 | leo2007 | hiredman: you mean don't worry about the fact that let* isn't resolvable? |
| 01:19 | hiredman | yes |
| 01:20 | hiredman | let* only has meaning at the start of a list, like (let* ...) |
| 01:20 | leo2007 | hiredman: thanks. |
| 01:20 | napping | "binding form", if you insist |
| 01:20 | hiredman | and it doesn't not go through the normal resolution process |
| 01:20 | hiredman | napping: it's not pattern matching |
| 01:21 | leo2007 | BTW, do you get any doc by from `C-c C-d C-d def RET' |
| 01:21 | hiredman | swank-clojure pulls docs from the meta data of vars, but special forms don't have vars to hang doc metadata on |
| 01:21 | brehaut | napping: pattern matching performs conditional logic, where destructuring just tries to upack data |
| 01:22 | leo2007 | hiredman: thanks for the explanation. |
| 01:22 | hiredman | so "special forms" are really macros, like let, so it does have a var to hang documentation on |
| 01:22 | hiredman | some |
| 01:23 | hiredman | 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 |
| 01: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 |
| 01:28 | napping | Vectors are in between - the nils for excess members in the binder are filled in because it's calling the 3-argument nth |
| 01:28 | hiredman | ,(get [] 1) |
| 01:28 | clojurebot | nil |
| 01:31 | napping | ,(macroexpand-1 '(let [[x] []] x)) |
| 01:31 | clojurebot | (let* [vec__181 [] x (clojure.core/nth vec__181 0 nil)] x) |
| 01:32 | napping | There's also the conditional behavior of throwing an exception if things don't match |
| 01:33 | brehaut | ,(destructure '[[x] []]) |
| 01:33 | clojurebot | [vec__208 [] x (clojure.core/nth vec__208 0 nil)] |
| 01:33 | brehaut | you dont need to hide it away in a let to expand it |
| 01:49 | leo2007 | Is ` the same as backquote in other lisps? |
| 01:54 | napping | maybe? |
| 01:54 | napping | It's the quasiquote, but it's a bit different from other lisps I've seen |
| 02:01 | callen | just got home from the bay area clojure meetup |
| 02:02 | callen | had a good time, helped people get their environments setup, swank/lein working, etc. |
| 03:16 | leo2007 | where is doall-seq? |
| 03:16 | hiredman | what do you mean? |
| 03:16 | leo2007 | I cannot find its doc? |
| 03:17 | hiredman | what makes you think it exists? |
| 03:17 | leo2007 | hiredman: no worries. I am reading its source. |
| 03:17 | hiredman | (I doubt that) |
| 03:17 | leo2007 | hiredman: it was not part of clojure. My bad. |
| 03:17 | hiredman | sure |
| 03:31 | amalloy | i was surprised to learn recently that doall and dorun take an optional "how many" argument |
| 03:35 | ibdknox | hah |
| 03:35 | ibdknox | ,(doc dorun) |
| 03: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." |
| 03:35 | ibdknox | it's like magic |
| 04:28 | licenser | morning |
| 04:43 | ejackson | morning folks |
| 04:45 | Blkt | good morning everyoen |
| 04:46 | Blkt | everyone* |
| 05:20 | licenser | ,(clojure.contrib.str-utils2/replace "\\" #"[\"\\]" (fn [x] (println x))) |
| 05:20 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.contrib.str-utils2> |
| 05:20 | licenser | (clojure.contrib.str-utils2/replace "\\" #"[\"\\]" (fn [x] (str x))) |
| 05:20 | licenser | ,(clojure.contrib.str-utils2/replace "\\" #"[\"\\]" (fn [x] (str x))) |
| 05:20 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.contrib.str-utils2> |
| 05:20 | licenser | any idea why that happens? It looks like a bug or I just don't see what I do wrong here |
| 05:21 | hiredman | use clojure.string |
| 05:21 | hiredman | and you need to load namespaces before you can use the functions in them |
| 05:22 | licenser | ,(clojure.string/replace "\\" #"[\"\\]" (fn [x] (str x))) |
| 05:22 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.string> |
| 05:22 | hiredman | and you need to load namespaces before you can use the functions in them |
| 05:22 | licenser | oh that is a different error, for me it gives "String index out of range: 1" |
| 05:23 | hiredman | ,(require 'clojure.string) |
| 05:23 | clojurebot | nil |
| 05:23 | hiredman | ,(doc clojure.string/replace) |
| 05: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." |
| 05:24 | hiredman | I would try out that regex and see if it matches anything |
| 05:24 | licenser | it works great if you don't pass "\\" as string |
| 05:24 | licenser | it does just fine |
| 05:25 | hiredman | ,(re-find #"[\"\\] "\\") |
| 05:25 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading string> |
| 05:25 | hiredman | ,(re-find #"[\"\\] "\\\\") |
| 05:25 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading string> |
| 05:25 | hiredman | ,(re-find #"[\"\\]" "\\") |
| 05:25 | clojurebot | "\\" |
| 05:25 | hiredman | ,(clojure.string/replace "\\" #"[\"\\]" (fn [x] x)) |
| 05:25 | clojurebot | #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1> |
| 05:25 | hiredman | ,(clojure.string/replace "\\" #"([\"\\])" (fn [x] x)) |
| 05:26 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.String> |
| 05:26 | licenser | http://pastebin.com/9VfyembL <- is what he gets |
| 05:26 | licenser | works perfectly with "\"" |
| 05:26 | licenser | just not with "\\" |
| 05:27 | hiredman | ,(clojure.string/replace "\\" #"([\"\\\\])" (fn [x] x)) |
| 05:27 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.String> |
| 05:27 | hiredman | ,(clojure.string/replace "\\" #"[\"\\\\]" (fn [x] x)) |
| 05:27 | clojurebot | #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1> |
| 05:27 | licenser | ,(clojure.string/replace "\"" #"[\"\\]" (fn [x] (str (type x)))) |
| 05:27 | clojurebot | "class java.lang.String" |
| 05:27 | licenser | it returns a string just fine but it seems odd |
| 05:27 | hiredman | dunno, check the source of replace |
| 05:28 | hiredman | ,(clojure.string/replace "\\\\" #"[\"\\]" (fn [x] x)) |
| 05:28 | clojurebot | #<StringIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException: String index out of range: 1> |
| 05: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. |
| 05:50 | licenser | hiredman: actually it isn't a clojure thing, it is java that crashes with the regexp |
| 05:50 | licenser | ] |
| 05:52 | clgv | licenser: try (clojure.string/replace "\\\\" #"\\\\" "\\\\") |
| 05:52 | clgv | &(clojure.string/replace "\\\\" #"\\\\" "\\\\") |
| 05:52 | lazybot | ⇒ "\\" |
| 05:52 | clgv | you have to string-escape and regexp-escape as well |
| 05:53 | licenser | yap it is a trickery with the replace |
| 05:53 | licenser | the string ins't really a string |
| 05:53 | licenser | it is interpreted by java |
| 05:53 | ejackson | eeep, meta-regexps, that's all we need on a Friday morning :) |
| 05:53 | licenser | yap |
| 05:53 | licenser | |
| 05:53 | licenser | hussa for java |
| 05:54 | licenser | can't have \ or $ in the return string |
| 05:54 | licenser | (clojure.string/replace "\\" #"\\" "$") same here |
| 05:55 | licenser | oh heck the last argument gets really evaluated and every \\ changed :( |
| 06:35 | licenser | there we go http://dev.clojure.org/jira/browse/CLJ-870 :) the replace thing described and reprted |
| 08:30 | raph_amiard | Hi there |
| 08:30 | raph_amiard | I just had an idea this morning, and was pondering how doable it would be |
| 08:30 | raph_amiard | here it is: How difficult do you think it would be to do a Lua version of clojurescript ? |
| 08:31 | raph_amiard | 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 |
| 08:31 | raph_amiard | since no equivalent exists for Lua |
| 08:31 | raph_amiard | tell me what you think |
| 08:31 | cark | wasn't the google closure compiler there only for optimisation, dead code analysis ? |
| 08:33 | cark | i think it's very doable. But be carefull when basing your implementation on clojurescript |
| 08:33 | cark | i believe the persitent datastructures thing isn't completely done yet (no structure sharing) ... tho i might be mistaken |
| 08:34 | leo2007 | is clojure-project-root-file useless? |
| 08:35 | raph_amiard | cark: Ok thank you |
| 08:35 | raph_amiard | it would be nice if there was a way to decouple the code generation part from the global compiler logic |
| 08:36 | raph_amiard | but i'm not familiar enough with cljs code yet to see how easily it can be done |
| 08:36 | raph_amiard | 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 |
| 08:37 | cark | and minification |
| 08:37 | raph_amiard | OTOH i wonder how much performance do you loose when the result is not optimized by closure |
| 08:42 | clgv | leo2007: what do you mean? |
| 08:48 | chouser | raph_amiard: analysis and code generation are already separated in the ClojureScript compiler |
| 08:48 | chouser | one is analyze, the other emit |
| 08: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))) |
| 08:50 | clgv | or is there something like that? |
| 08:51 | chouser | clgv `(blah blah '~compiletime-symbol) |
| 08:51 | clgv | chouser: it's a bit more complicated since I have the symbols in a map that I create at macro expansion time |
| 08:52 | chouser | clgv: the normal way to get a symbol from compile time through to runtime is by quoting it |
| 08:52 | clgv | like: (let [m (create-map ...)] '(bla ~m ...)) |
| 08:52 | leo2007 | clgv: it is not used. |
| 08:53 | clgv | leo2007: what excatly is not used? |
| 08:53 | clgv | project.clj? |
| 08:53 | leo2007 | clojure-project-root-file |
| 08:54 | clgv | leo2007: if you do not mean project.clj - I dont know what file you are talking of |
| 08:59 | clgv | chouser: ok, I looked it up in core, the arglist in defn used (list 'quote (sigs fdecl)) |
| 09:02 | leo2007 | clgv: I mean the variable clojure-project-root-file is not used. |
| 09:02 | leo2007 | not its value |
| 09:03 | clgv | leo2007: oh ok nvm. I didn't know there is such a variable |
| 09:11 | cmaya0 | neewbie |
| 09:12 | cmaya0 | #beginner |
| 09:12 | _ulises | what's the testing framework of choice in general? |
| 09:12 | Iceland_jack | ghgj |
| 09:12 | Iceland_jack | `. |
| 09:13 | _ulises | I'm currently using clojure.test and have used stuart sierra's lazytest in the past though |
| 09:13 | _ulises | any recommendations? |
| 09:14 | cmaya0 | exit |
| 09:15 | stuartsierra | _ulises: Check out clojure.test.generative as well. |
| 09: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 |
| 09:15 | _ulises | never heard of clojure.test.generative, will check it out, thanks |
| 09:15 | chouser | _ulises: lazytest is my current favorite |
| 09:16 | _ulises | I quite liked lazytest too |
| 09:16 | _ulises | maybe I should just use that |
| 09:16 | chouser | I haven't looked at test.generative yet either. |
| 09:18 | _ulises | hum, if I want to use lazytest I have to use clojure-1.3.x? |
| 09:19 | chouser | but you already wanted to use clojure-1.3.x, so that's ok! :-) |
| 09:19 | _ulises | did I? :-o |
| 09:19 | _ulises | chouser: you must know something I don't... |
| 09:19 | chouser | _ulises: you thought you wanted to use a previous version of Clojure? |
| 09:20 | _ulises | well, I am using 1.2.0 ... but that's probably due to historical reasons |
| 09:20 | _ulises | now I need to check whether the other libs I'm using are 1.3.x ready... |
| 09:36 | _ulises | right, I'm on 1.3.0 + lazytest and the world is a safe place again |
| 09:36 | _ulises | thanks for the help |
| 09: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 |
| 09:52 | gfredericks | lnostdal: I think it does that for snapshots? |
| 09:54 | gfredericks | $google maven don't update snapshots |
| 09: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 | raph_amiard | 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 | raph_amiard | 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 | chouser | 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 | chouser | raph_amiard: out of curiosity, why do you want lua? |
| 10:05 | raph_amiard | ok that's good news for me |
| 10:05 | raph_amiard | well a few reasons : |
| 10:06 | raph_amiard | 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 | raph_amiard | 2. Lua semantics are quite close to those of javascript |
| 10:07 | raph_amiard | 3. i'm very interrested in compilers so i thought it would be a cool project to work on :) |
| 10:07 | raph_amiard | 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 | chouser | 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 | raph_amiard | I would be interrested in compilation to C, the runtime would probably be an interresting thing to work on |
| 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 | TimMc | 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 | raph_amiard | TimMc: Yeah i like the idea because lua runs everywhere too |
| 10:14 | lucian | raph_amiard: likely. i was mostly joking |
| 10:15 | lucian | 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 | lnostdal | Lrcrafter21 |
| 10:18 | lnostdal | 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 | TimMc | clgv: ` |
| 10:22 | TimMc | 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 | clgv | $findfn 'inc 'clojure.core/inc |
| 10:24 | lazybot | [] |
| 10:26 | TimMc | clgv: I suppose a var doesn't know its name. |
| 10:26 | TimMc | 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 | clgv | 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 | raph_amiard | 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 | toma | 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 | TimMc | You've got a broken development environment, and you need to fix it. gist the error message |
| 10:42 | TimMc | ~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 | jweiss | ,(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 | jweiss | it's no longer there by default |
| 10:46 | jweiss | er sorry (use 'clojure.repl) |
| 10:46 | _ulises | ah, that did it |
| 10:46 | _ulises | 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 | toma | 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 | jweiss | 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 | clgv | 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 | leo2007 | 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 | jweiss | 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 | jweiss | ,(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 | chouser | seems complected to me. :-) |
| 11:01 | chouser | 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 | chouser | 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 | jweiss | 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 | chouser | ,(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 | chouser | ,(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 | ThreeCups | (defn contains-any [xs f] "Returns true as soon as f(x) is true" ...) |
| 11:23 | ThreeCups | Umm... I think I'm looking for (some) |
| 11:23 | ThreeCups | ,(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 | jcromartie | proportional font FT_? |
| 11:28 | jcromartie | 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 | TimMc | ,(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 | Borkdude | I used marmalade to get clojure-mode, slime etc |
| 11:36 | Borkdude | When I do: slime-connect, it says: Symbol's value as variable is void: slime-clj |
| 11:36 | Borkdude | 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 | clgv | where has -?> from clojure.contrib.core gone in clojure 1.3? |
| 11:58 | clgv | ah clojure.core.incubator |
| 12:02 | ohpauleez | Is there a shorter hand for something like this: (dissoc (assoc m new-key (m old-key)) old-key) |
| 12:02 | ohpauleez | I want to swap the key in a map |
| 12:03 | ohpauleez | 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 | ibdknox | 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 | ohpauleez | 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 | ibdknox | interesting |
| 12:08 | ohpauleez | Yes, Clojure is used for all of machine learning/collective intelligence, emailing, messaging, and search services |
| 12:08 | ohpauleez | Python is used in some services |
| 12:08 | ohpauleez | (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 | TimMc | 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 | ohpauleez | 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 | ohpauleez | :) |
| 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 | lucian | 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 | tnks | 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 | lucian | but i would much prefer def to be an expression as well |
| 12:21 | tnks | lucian: that's not a good argument. |
| 12:21 | tnks | 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 | hiredman | *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 | hiredman | 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 | hiredman | theignorati: it depends on how much information you want to keep about the original structure |
| 12:32 | hiredman | *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 | stuarthalloway | I am working on something like that right now, to detect and use Joda |
| 12:38 | stuarthalloway | which isn't even a Java feature, but the idea is the same |
| 12:42 | TimMc | nice |
| 12:42 | TimMc | I like the idea of distributing programs as source anyway. |
| 12:42 | TimMc | ...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 | stuarthalloway | 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 | tnks | yeah, scrolled up a little, but didn't figure it out; something about AOTing code distributed as source and Joda Time. |
| 12:56 | tnks | I missed the connection of the Joda project to AOTing. |
| 12:56 | tnks | (unless that's the project that's being compiled) |
| 12:57 | stuarthalloway | tnks: code that uses Joda |
| 12:57 | stuarthalloway | tnks: since all of Clojure's clj currently is AOT compiled, I am allowing it for consistency |
| 12:57 | stuarthalloway | 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 | arohner | or some other way to make a pre-route match "/user/:username"? |
| 14:17 | ibdknox | arohner, the latter should work |
| 14:17 | ibdknox | 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 | ibdknox | 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 | seancorfield | 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 | seancorfield | it'll take me a good long while to get all of FW/1's functionality ported from CFML to Clojure |
| 14:24 | seancorfield | and I don't have a fancy website for it - just a github wiki :( |
| 14:25 | seancorfield | 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 | seancorfield | 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 | seancorfield | 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 | seancorfield | but otherwise i think i can make all of it work nearly identically |
| 14:32 | seancorfield | 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 | technomancy | 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 | technomancy | 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 | seancorfield | 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 | technomancy | 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 | amalloy | 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 | seancorfield | for one of the standard contribs? |
| 14:41 | amalloy | seancorfield: https://github.com/flatland/useful |
| 14:41 | amalloy | 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 | seancorfield | 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 | amalloy | 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 | stuartsierra | 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 | ibdknox | 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 | ibdknox | who maintains clojars? is it you technomancy? |
| 14:49 | technomancy | ibdknox: close enough |
| 14:50 | technomancy | ibdknox: technically it's _ato, but he's not around much |
| 14:50 | technomancy | I have a branch that makes it a lot easier to hack on that I need to merge in |
| 14:50 | technomancy | 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 | ibdknox | I should make my todo-list public |
| 14:54 | ibdknox | haha |
| 14:54 | ibdknox | 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 | ibdknox | 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 | ibdknox | I may actually do that |
| 14:56 | ibdknox | 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 | gfredericks | 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 | technomancy | cemerick: for, uh... bragging rights? |
| 15:03 | cemerick | heh |
| 15:03 | ibdknox | duh |
| 15:03 | cemerick | yeah, shoulda thought of that |
| 15:03 | cemerick | 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 | technomancy | 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 | technomancy | 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 | TimMc | 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 | Raynes | 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: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 | amalloy | 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 | TimMc | *forms |
| 15:23 | TimMc | ,#(#(#(#(#())))) |
| 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 | ibdknox | 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 | ibdknox | a* |
| 15:27 | amalloy | er, C++11 and/or C++0x. probably not both :P |
| 15:27 | cemerick | ibdknox: slope to doom? |
| 15:27 | cemerick | :-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 | ibdknox | if we're going to talk about a portable time format |
| 15:28 | ibdknox | 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 | amalloy | 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 | 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 | TimMc | separate simultaneous 24 |
| 15:32 | TimMc | hour Days within 1 Earth |
| 15:32 | TimMc | rotation |
| 15:32 | TimMc | 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: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 | stuartsierra | 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 | stuartsierra | 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 | stuartsierra | As bad as #ifdef in C |
| 15:58 | amalloy | ugh yes |
| 15:58 | cemerick | 2014 Clojure: #@2010-12-18 #&http://apple.com #~127.0.0.1 |
| 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 | seancorfield | 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 | stuartsierra | 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 | stuartsierra | 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 | stuartsierra | dunon |
| 16:05 | stuartsierra | erg |
| 16:05 | stuartsierra | 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 | stuartsierra | 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 | seancorfield | 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 | hiredman | 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 | stuartsierra | ,(read-string "`foo") |
| 16:10 | clojurebot | (quote sandbox/foo) |
| 16:10 | hiredman | right |
| 16:10 | hiredman | #+() ? |
| 16:10 | stuartsierra | I meant #=() not #+() |
| 16:10 | hiredman | right |
| 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 | stuartsierra | I've always thought it was a bit odd. |
| 16:11 | hiredman | yes |
| 16:12 | hiredman | 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: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 | mefesto | 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 | TimMc | 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 | ibdknox | 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 | ibdknox | 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 | technomancy | 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 | technomancy | 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 | technomancy | 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 | 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 | technomancy | Apache Software Foundation to the rescue! |
| 16:58 | technomancy | 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 | amalloy | 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 | danlarkin | note the time and date! |
| 17:01 | hiredman | "Let's avoid another opinion-fest." |
| 17:01 | hiredman | 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 | technomancy | danlarkin: seconds, milliseconds, or nanoseconds? |
| 17:03 | danlarkin | technomancy: UTC-8 |
| 17:03 | danlarkin | pitcairn islands |
| 17:03 | danlarkin | :p |
| 17:03 | technomancy | YESSSS |
| 17:03 | technomancy | 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 | technomancy | should work if you refresh |
| 17:11 | technomancy | 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 | goodieboy | I don't want that double wrapped list (2nd item in the root) |
| 17:12 | goodieboy | 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 | technomancy | 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 | Raynes | 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 | TimMc | That does not support your point. |
| 17:16 | danlarkin | that is my tautology of the day |
| 17:16 | danlarkin | 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 | stuartsierra | 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 | stuartsierra | *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 | amalloy | 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 | Raynes | Heh. |
| 17:35 | Raynes | 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 | ibdknox | 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 | Raynes | 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 | TimMc | 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 | technomancy | 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 | fliebel | 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 | jcromartie | 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 | 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 | jcromartie | sometimes it might use more |
| 17:49 | jcromartie | but most of the time, it's much less |
| 17:49 | amalloy | java -Xmx80m ...other-args... |
| 17:49 | amalloy | limits the java object heap to 80MB, and then the jvm uses several dozen megs for its own internal purposes |
| 17:50 | amalloy | otherwise the heap tends to grow bigger and bigger because the jvm doesn't know you need the space for anything else |
| 17:50 | amalloy | (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 | ibdknox | 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 | raek | 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 | amalloy | 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 | ibdknox | ,(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 | technomancy | 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 | ibdknox | :/ |
| 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 | TimMc | Puts this in perspective. |
| 18:36 | ibdknox | I guess it's a matter of consequences |
| 18:36 | ibdknox | 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 | ibdknox | 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 | TimMc | 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 | ibdknox | one of my friends just saw that thread |
| 19:02 | ibdknox | response: |
| 19:02 | ibdknox | "sad little king of a sad little hill" |
| 19:05 | TimMc | ahaha |
| 19:06 | TimMc | 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: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 | dnolen | 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 | ibdknox | dnolen, you don't treat people that way |
| 19:11 | ibdknox | 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 | ibdknox | and call this what it is |
| 19:14 | Raynes | rhicky-dev |
| 19:14 | Raynes | rhickey-dev ; damn. |
| 19:14 | Raynes | 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 | dnolen | but then again perhaps I will need it later - then great. |
| 19:19 | ibdknox | Regardless, the exchange has real consequences |
| 19:19 | ibdknox | maybe they don't matter |
| 19:19 | ibdknox | 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 | hiredman | 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 | dnolen | reading and printing. |
| 19:24 | dnolen | 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 | hiredman | 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 | hiredman | 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 | hiredman | 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 | dnolen | 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 | ibdknox | 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 | ibdknox | 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 | ibdknox | 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 | hiredman | 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 | moogatronic | 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 | moogatronic | 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 | hiredman | great |
| 19:40 | hiredman | set! as a way to swap around reader macros isn't really composable either |
| 19:42 | hiredman | 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 | mdeboard | 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 | ibdknox | 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 | ibdknox | 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 | ibdknox | 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 | hiredman | are you going |
| 19:47 | moogatronic | Well, i was speaking purely to your assertion of Design implying "feel" necessarily. |
| 19:48 | moogatronic | 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 | ibdknox | :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 | hiredman | 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 | seancorfield | 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 | mdeboard | Wait. |
| 19:53 | mdeboard | 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 | ibdknox | mdeboard, hahaha |
| 19:54 | ibdknox | 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 | jcromartie | 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 | hiredman | 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 | hiredman | 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 | hiredman | 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 | hiredman | for reals man |
| 20:00 | hiredman | http://dev.clojure.org/pages/viewpage.action?pageId=950382&focusedCommentId=4063247#comment-4063247 |
| 20:00 | hiredman | ugh |
| 20:00 | hiredman | 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 | ibdknox | 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 | ibdknox | 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 | hiredman | 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 | hiredman | the switch with joda time is only for parsing |
| 20:06 | hiredman | 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 | seancorfield | 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 | hiredman | 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 | hiredman | 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 | hiredman | seancorfield: someone did a set! on *instant-reader* to replace it with something that returns a map representation of datas |
| 20:14 | hiredman | 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: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 | hiredman | thats true |
| 20:22 | hiredman | 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 | hiredman | we really needed another one of those |
| 20:39 | dnolen | "Switch expression 'cause pattern matching is complicated" |
| 20:39 | dnolen | 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 | amalloy | 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 | mdeboard | 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 | seancorfield | Clojure/West is easier to google for :) |
| 21:11 | TimMc | amalloy: haha |
| 21:11 | TimMc | 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 | TimMc | swank... dunno |
| 21:47 | TimMc | ___ LISP Inferior Mode for Emacs, I think |
| 21:47 | cemerick | Superior, IIRC |
| 21:47 | mdeboard | "SLIME: LISP Inferior Mode for Emacs" |
| 21:47 | mdeboard | That's what it should be, anyway. |
| 21:50 | TimMc | mdeboard: I think you're right... |
| 21:50 | TimMc | 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 | mdeboard | wracked* |
| 21:51 | mdeboard | 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 | mdeboard | djanatyn: Via emacs or what |
| 21:54 | mdeboard | 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 | djanatyn | 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 | mdeboard | djanatyn: If you're installing Slime or invoking slime manually in any way you're doing it wrong |
| 21:57 | mdeboard | djanatyn: You don't need to install anything on your system but leiningen, nor anything in emacs except clojure-mode |
| 21:58 | mdeboard | (Well, you need jdk for leiningen, but yeah.) |
| 21:58 | djanatyn | oh, okay. |
| 21:58 | djanatyn | 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 | mdeboard | djanatyn: Leiningen abstracts all that away. |
| 21:59 | djanatyn | oh, okay |
| 21:59 | djanatyn | sweet! |
| 21:59 | djanatyn | 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 | mdeboard | don't do that |
| 22:00 | djanatyn | :) |
| 22:00 | djanatyn | how should i install leiningen? |
| 22:00 | mdeboard | https://github.com/technomancy/leiningen follow the instructions |
| 22:00 | mdeboard | under "Installation" |
| 22:00 | djanatyn | aaaah |
| 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 | djanatyn | 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 | mdeboard | djanatyn: Do you have clojure-mode installed in emacs |
| 22:06 | mdeboard | 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 | mdeboard | ibdknox: I scoffed at Hiccup when I first heard about it |
| 22:07 | ibdknox | how foolish! lol |
| 22:07 | mdeboard | Yeah. |
| 22:07 | mdeboard | srs |
| 22:09 | djanatyn | hmm, I'm *almost* connecting, but getting some errors for some reason |
| 22:10 | djanatyn | 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 | ibdknox | 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 | ibdknox | 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 | mdeboard | 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 | djanatyn | # J clojure.asm.ClassWriter.toByteArray()[B |
| 22:14 | ibdknox | haah |
| 22:14 | moogatronic | dnolen: I saw you tweet that D. Friedman was coming to the conj, is he presenting? |
| 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 | djanatyn | :\ |
| 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 | djanatyn | 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 | djanatyn | I do, however, like the JVM a lot |
| 22:21 | djanatyn | 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 | djanatyn | Ah, okay! |
| 22:22 | djanatyn | 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 | mdeboard | 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 | mdeboard | Is that what does that* |
| 22:26 | mdeboard | djanatyn: No luck" |
| 22:26 | mdeboard | 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 | mdeboard | 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 | djanatyn | and I opened up and saved core.clj, which worked fine with syntax highlighting and everything |
| 22:26 | mdeboard | cool |
| 22:27 | mdeboard | 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 | djanatyn | and the buffe3r said "that's not a task. use "lein help" to list all tasks" |
| 22:28 | djanatyn | that's weird |
| 22:28 | djanatyn | 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 | mdeboard | when reinstalling on a fresh machine |
| 22:29 | djanatyn | well, I sure am lucky today :D |
| 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 | djanatyn | 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 | mdeboard | djanatyn: Did you try restarting emacs |
| 22:30 | djanatyn | should I be running `lein repl` in another terminal? |
| 22:30 | djanatyn | mdeboard: doing that now |
| 22:30 | mdeboard | no |
| 22:31 | djanatyn | okay, |
| 22:31 | moogatronic | lein is in your shell search path? |
| 22:31 | moogatronic | … i would assume. |
| 22:31 | moogatronic | =) |
| 22:31 | djanatyn | yeah, I got the same error |
| 22:31 | djanatyn | 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 | moogatronic | does lein swank work |
| 22:33 | djanatyn | yes, `lein swank` works |
| 22:34 | djanatyn | oh, sweet! |
| 22:34 | djanatyn | well |
| 22:34 | djanatyn | 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 | djanatyn | 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 | airolson | 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 | amalloy | (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 | mdeboard | God I really, really love Noir & Hiccup |
| 22:45 | mdeboard | Pleasantly surprised at arbitrary tags with Hiccup, e.g. (html [:banana "PB&J Time"]) == <banana>PB&J Time</banana> |
| 22:45 | mdeboard | that's hot |
| 22:46 | tensorpudding | trying to get in with clojure again |
| 22:46 | tensorpudding | i installed lein from debian's package |
| 22:46 | tensorpudding | 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 | tensorpudding | 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 | tensorpudding | 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 | mdeboard | what's `which lein` say? |
| 22:49 | tensorpudding | i'd rather dispose of the munging with source packages and that stuff |
| 22:49 | tensorpudding | it's /usr/bin/lein |
| 22:49 | tensorpudding | it's a sh script |
| 22:49 | tensorpudding | 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 | tensorpudding | if it's actually broken |
| 22:52 | duck1123 | tensorpudding: chances are, something in your dev dependencies is screwing things up |
| 22:52 | duck1123 | do you get this in all projects? |
| 22:52 | tensorpudding | yes |
| 22:52 | tensorpudding | 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 | mdeboard | 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 | djanatyn | it opened up sbcl |
| 22:53 | mdeboard | djanatyn: Do that sequence from a Clojure buffer |
| 22:54 | mdeboard | 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 | tensorpudding | you can't remove it easily |
| 22:54 | tensorpudding | 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 | djanatyn | I've been thinking of installing debian and working with a fresh install recently |
| 22:55 | djanatyn | 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 | 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 | tensorpudding | oh hmm |
| 22:57 | djanatyn | ...y'know what |
| 22:57 | djanatyn | maybe I'll just use clooj for a little bit |
| 22:59 | tensorpudding | fine, i'll install lein by hand |
| 23:00 | tensorpudding | it better not complain about my clojure install though |
| 23:00 | tensorpudding | i don't want to install that by hand |
| 23:00 | mdeboard | There's really nothing "manual" about leiningen |
| 23:00 | mdeboard | 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 | djanatyn | her code is fun to look at |
| 23:03 | djanatyn | she tries to write java in her python |
| 23:04 | djanatyn | 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 | djanatyn | like in common lisp |
| 23:05 | mdeboard | http://stackoverflow.com/questions/1114690/how-to-get-user-input-in-clojure |
| 23:05 | mdeboard | djanatyn: Caution, this will not work in slime-repl |
| 23:05 | mdeboard | but will in lein-repl |
| 23:05 | mdeboard | 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 | tensorpudding | 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 | tensorpudding | my packages had used distutils |
| 23:10 | tensorpudding | how new does my clojure-mode have to be so that i can use jack-in |
| 23:10 | tensorpudding | wait, my old packages have a swank-clojure dep that's too old |
| 23:11 | tensorpudding | i have no beard |
| 23:11 | duck1123 | try ignoring that warning |
| 23:12 | tensorpudding | ugh, what do i have to do for M-x clojure-jack-in |
| 23:12 | tensorpudding | right, my clojure-mode is 4 major releases behind |
| 23:12 | mdeboard | tensorpudding: Have you recompiled your kernel yet |
| 23:12 | mdeboard | 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 | tensorpudding | i thought most clojure people used it |
| 23:13 | tensorpudding | or at least, technomancy does |
| 23:13 | tensorpudding | 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 | tensorpudding | 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 | jli | 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 | tensorpudding | 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 | tensorpudding | then hit x |
| 23:16 | amalloy | jli: correct |
| 23:16 | amalloy | 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 | amalloy | iirc |
| 23:17 | mdeboard | Ooh wow Noir prints exceptions really nicely |
| 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 | amalloy | 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 | tensorpudding | 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 | tensorpudding | 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 | duck1123 | 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 | amalloy | 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 | spoon16 | does the "-" in the defn mean something in this case? |
| 23:37 | spoon16 | 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 | mdeboard | What's the word the British use |
| 23:37 | mdeboard | 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 | ibdknox | amalloy: you say he lives in CA? |
| 23:38 | mdeboard | oh, holy shit. |
| 23:38 | mdeboard | lol. |
| 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 | mdeboard | 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 | mdeboard | ibdknox: I like. Really a sea change from Django. Though the stuff I'm most floored by is really Hiccup-related |
| 23:40 | mdeboard | 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 | scottj | and ring too! that's genius |
| 23:41 | ibdknox | lol |
| 23:41 | ibdknox | 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 | mdeboard | what |
| 23:44 | mdeboard | oh |
| 23:44 | mdeboard | derp |
| 23:44 | mdeboard | wow |
| 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 | mdeboard | 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 | ibdknox | 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 | mdeboard | 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 | mdeboard | 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 | mdeboard | 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 | ibdknox | 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 | ibdknox | you can create DOM objects with my implementation of hiccup |
| 23:54 | ibdknox | 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 | ibdknox | 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 | mdeboard | 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 | tensorpudding | right |
| 23:58 | tensorpudding | esk is using paredit now |
| 23:58 | tensorpudding | it must be responsible |
| 23:59 | goodieboy | I have an sexp like '(prn "TEST") -- is "eval" to only way to execute this? |