#clojure log - Oct 16 2012

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

0:17 amalloy: doomlord_: i'm inclined to say, if you want erlang-style actors, use erlang

0:18 doomlord_: i'll take it that means clojures' concurrency is optimized for a different granularity

0:21 amalloy: uhhh, i guess that's true, although i'm not sure you can derive it from my statement

0:22 doomlord_: if clojures concurrency was optimized for a granularity suitable for implementing fine grain actors, you'd have replied "yes there's an actor library for clojure", or "in theory you can implement actors like this.."

0:22 _tca: granularity is not the only issue

0:23 amalloy: it's more about the style of programming. actors don't lend themselves to immutability as i understand them, but i'm not an expert in that

0:23 doomlord_: i understood actors communicated with messages : thats immutable data being passed between processes

0:25 _tca: if you want actors you can do actors several ways fine in clojure

0:25 doomlord_: well if it can handle a concurrent process per core i guess you could do the sorts of things you'd do with actors another way

0:25 _tca: erlang style implies low level implementation details which you cannot replicate

0:26 Sgeo: http://clojuredocs.org/clojure_core/clojure.core/into

0:26 Does test-key-inclusion-cols break on nils in column 2?

0:33 brainproxy: dnolen: thanks for your on the datomic/core.logic integration; was just lookint at your example, and was wondering where `q2` comes into play?

0:33 your *work

0:34 doomlord_: is there something like 'get-in' to return multiple elements from an object e.g. (?? pos [:x :z]) == [ (pos :x)(pos :z)]

0:35 shame it doesn't appear to make object-element access n-ary by default : ) would be nice if (obj :x :z) did either that or 'get-in'

0:35 still can't have everything i guess

0:35 _tca: map...

0:37 dnolen: ,((juxt :x :y) {:x 0 :y 1 :z 2})

0:37 clojurebot: [0 1]

0:37 doomlord_: ah... didn't realize you can do element access with prefix aswell

0:37 ,(map {:x 1 :y 2 :z 3} [:x :z])

0:38 clojurebot: (1 3)

0:38 doomlord_: ,(:x { :x 1 :y 2 :z 3})

0:38 clojurebot: 1

0:38 dnolen: doomlord_: you could make you own types that implement IFn that act like that, but I think most people would find that behavior suprising.

0:38 doomlord_: ,([:x :z] { :x 1 :y 2 :z 3})

0:38 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: Key must be integer>

0:39 doomlord_: IMO it would be leveraging the n-ary nature of s-expression syntax; making a virtue of it

0:42 dnolen: brainproxy: q2 doesn't come into play, thanks for pointing that out, removed.

0:42 brainproxy: I'm not sure exactly what a core.logic interface to datomic should look like, hopefully rhickey will chime in w/ more comments.

0:43 brainproxy: that said, Datomic does provide a pretty slick API if you want to build an alternate query syntax to datomic.

0:52 brainproxy: dnolen: I'll be playing with it in the next day or so... my team's app is dealing with two quite distinct datasources

0:52 one we're creating/managing ourselves w/ datomic

0:52 the other is a mess of stuff

0:52 and our idea is to try and wrangle the latter with core.logic

0:53 in order to drive unifification with respect to data we're getting from datomic

0:53 dnolen: brainproxy: very cool! :) let me know how that goes

0:53 brainproxy: we'll see, I may misunderstand what core.logic can do for us, but I'm still noodling it all

0:53 and we'll at least be making an attempt to leverage core.logic, but in the end may have to use other techniques

0:55 dnolen: brainproxy: it's a fun tool - always good to hear stories about what did or didn't work for you.

0:56 brainproxy: if it works out, I'll try to gist up something that looks similar to the problems we're working on

0:56 I can't point you to a repo in this case, as this project isn't open source

0:56 dnolen: brainproxy: haha, I'm used to hearing that of course :)

0:57 brainproxy: hehe, well I'd like to carve pieces out of it and make them open source, but we're not in a position to do that quite yet

2:31 doomlord_: is there an existing macro (??? a b c d e) => ((((a)b)c)d)e)

2:36 tomoj: doomlord_: I don't think so, that seems pretty strange

2:37 do you have a real use case?

2:37 doomlord_: sucessive element access including mixture of maps and vectors

2:37 ((((mesh) :vertex) index) component)

2:37 (??? mesh :vertex index component)

2:38 (-> ...) doesn't seem to work because whilst you *can* call (:elem obj) , you *can't* call (index array)

2:39 tomoj: right, unless it's a keyword or symbol

2:40 maybe (-> (mesh) (get :vertex) (get index) (get component)) ? :(

2:40 oh

2:40 doomlord_: aref or something like that is it

2:40 tomoj: (get-in (mesh) [:vertex index component]) ?

2:41 doomlord_: oh of course get-in does it; would be nice to eliminate the extra bracket depth, although i'm sure people would argue that makes it more readable by seperating path & origin

2:42 tomoj: it also separates the not-found arg

2:42 doomlord_: i suppose i can wrap get-in in another macro ..

2:43 amalloy: there's no reason to get macros involved

2:43 (defn my-crazy-nonbracketed-get-in [coll & path] (get-in coll path))

2:44 doomlord_: more faith that it will inline if its a macro :)

2:44 amalloy: it's way too early to worry about inlining

2:45 and if not-inlining here is your bottleneck, your app is fast enough, eh?

2:45 doomlord_: its a syntactic helper really; one defaults to macros for that

2:46 i mean its a habit that if something is merely a syntactic helper, its a macro; and one needs a reason to do otherwise. macros are the great appeal of a lisp for me

3:29 kral: namaste

3:38 * josteink has a revalation

3:38 josteink: not only can you do destructuring in a function parameter list

3:38 the default clojure parameter-list IS a desctructuring

3:38 omg

3:39 rt

3:39 with clojure it IS turtles all the way down :)

3:50 werg: josteink: what does this mean, so would it be possible to implement functions that directly destructure to maps instead?

3:52 callen: is anyone here interested in programming languages? I was looking for some feedback on a post and I thought this might be a good place to check.

3:53 lpvb: well, this is a programming channel

3:53 josteink: werg: I mean say the function

3:53 (defn doer [f & args]

3:53 werg: ah ok

3:53 josteink: that -is- destructuring a list into parts

3:54 werg: yupp

3:54 * josteink plays around with fetch

3:54 callen: lpvb: I realize it may seem obvious to you, but some people are really here just to make things in the specific language

3:54 josteink: Im not surprised, but still a little bit disappointed I cant send function-variables across the line ;)

3:54 callen: not because they care about programming languages in general or the advancement thereof.

3:55 josteink: callen: Im not a regular or a op or anything in here, but your question smells of meta-question

3:56 anything in specific you're wondering about?

3:56 ;)

3:56 lpvb: but wouldn't they just do that in Java then?

3:56 callen: but I'd like to see the post

4:09 callen: josteink: suit yourself: http://news.ycombinator.com/item?id=4657713

4:10 josteink: long post, even by HN standards :)

4:11 I got time. I can take a look

4:11 clojurebot: execution timeout is 10 seconds

4:12 josteink: anyone here have any "deep" insight into how "fetch" works?

4:12 specifically with regard to symbols

4:13 is there any way to do a (fm/remote (someOp + mydata) [result] (js/alert result)

4:13 where the + is the clojure symbol plus

4:13 or any other symbol for that matter

4:13 Ive tried quoting, unquoting etc

4:21 callen: josteink: sorry for the length :(

4:22 josteink: callen: no worries. your loss though. most people gets scared by walls of text ;)

4:23 callen: josteink: considering it a highly effective filtering mechanism.

4:45 alex_baranosky: I thought I recall mention of supporting JodaTime with the 1.4 instant literals, but I guess that didn't find its way into Clojure?

4:47 is it possible to implement my own JodaTime instant reader?

4:48 mindbender1: alex_baranosky: I guess that should be possible

4:49 though I have not investigated that but from what I read the inst literal should allow you to say time in the way you like

4:49 clgv: alex_baranosky: I think there is clj-time that use JodaTime so you have to search for instant literals over there.

4:51 alex_baranosky: clgv: that's a library though… does it also provide a instant reader to use?

4:52 clgv: alex_baranosky: ah right there is #inst but that one is tied to java.util.Date by default

4:53 alex_baranosky: clgv: yeah, see: https://github.com/clojure/clojure/blob/master/src/clj/clojure/instant.clj#L271

4:53 clgv: alex_baranosky: https://github.com/clojure/clojure/blob/master/changes.md#211-instant-literals

4:55 alex_baranosky: looks like I should be able to implement something like what is done in clojure.instant for joda's DateTime -- I feel like someone else must have done that already

4:55 clgv: alex_baranosky: do you use pure JodaTime? otherwise adding a function/macro to clj-time for parsing instants as JodaTime would be a good idea

4:56 alex_baranosky: I don't mind using the JodaTIme library directly… however if I write a instant reader for it I'll submit a pull request to clj-time regardless

5:20 Lzskiss: o/

6:11 Kototama: hi, is there a macro in ClojureScript to chain property accesses (.-) ?

6:18 alex_baranosky: Kototama: I know little about CLJS, but… can you just use the -> macro like you could in JVM Clojure?

6:20 tacky proof-of-concept Jodatime instant reader: https://gist.github.com/3898489

6:20 hacky* :D

6:22 Lzskiss: anybody using here vimclojure on linux?

6:23 clgv: Kototama: in clojure there is (.. )

7:02 N8Dawg: hi all

7:03 i'm a little stuck, i've tried googling around but not found the answer. I'm using lein2 and nrepl-jack-in, question is how do I shutdown the repl? I've added a dependency in project.clj and need to update

7:07 antares_: N8Dawg: M-x nrepl-quit or M-x nrepl-restart

7:12 N8Dawg: is there a way to reload dependencies in project.clj without a restart, or pull in a new library without a repl restart?

7:14 hmmm I don't have nrepl-quit or nrepl-restart as defined functions

7:15 i have the nrepl package via marmalade

8:42 `fogus: lynaghk: How can I exclude an entire namespace with cljx?

8:57 cemerick: `fogus: can't, AFAIK; its rules apply only to the decorated forms. Sounds like you just want separate clj and cljs files for the same namespace?

8:58 `fogus: cemerick: I guess so yes

9:01 cemerick: Any pointers on the nicest example of a shared CLJS/CLJ codebase?

9:02 I really really really want to use the existing tools, but they get me to a 90% solution

9:03 cemerick: I can't say I've done much browsing of different mixed-source codebases. There's lynaghk's c2, there's the fork I did of valip.

9:04 `fogus: Oh, I've not looked at the valip source yet!

9:04 cemerick: I've found cljsbuild + piggieback + cljx + an nREPL middleware for cljx to apply its rules to files loaded through the REPL to be a suitable toolchain

9:04 `fogus: what do you feel is missing from your current env?

9:04 `fogus: oh my

9:05 cemerick: heh, yeah, cljs dev is not for the faint of heart at the moment :-)

9:05 `fogus: understood. Once I finally got comfortable with the CLJS-only path I started to stray into the mixed path. bugbears!!!!!

9:07 cemerick: it's actually less complicated than it sounds. cljsbuild's only job for me right now is mv-ing foo.clj to foo.cljs; piggieback is 100% copy/paste into project.clj and then you can forget about it.

9:08 cljx and its REPL middleware is more of a wildcard, insofar as writing/debugging rules for it/kibit is…interesting at times :-)

9:10 `fogus: I'll try to piece this together. Thanks for the pointers

9:11 I have an added complication of needing to tap into the CLJS compilation pipeline. :-(

9:12 cemerick: `fogus: This might be nonsensical to you, but here's my default lein repl invocation at the moment: https://gist.github.com/3839780

9:12 That doesn't include the cljx middleware (which I haven't released yet), but sets the stage.

9:12 `fogus: definitely sounds like a personal problem ;-)

9:13 `fogus: story of my life

9:13 cemerick: as my father likes to say, "c'est la f'n vie"

9:14 danlarkin: or was it "c'est la fn vie"

9:14 because... get it?

9:14 ugh

9:15 I take it all back

9:15 cemerick: GONG

9:15 :-P

9:15 * danlarkin twirls his cigar

9:18 cemerick: That mustache looks itchy.

9:18 * cemerick is probably confusing his last-century pop culture references

9:19 danlarkin: I mustache you a question...

9:19 * danlarkin cackles

9:39 cemerick: hum, I thought readable deftype printing went in ~1.3…

9:41 ah, right, nm

9:42 clgv: cemerick: there seems not to be such a behavior in 1.4 neither

9:42 cemerick: clgv: it was in, then was taken out before 1.3.0 went final (http://dev.clojure.org/jira/browse/CLJ-812).

9:43 clgv: defrecord has readable printing though

9:43 cemerick: sure

10:08 pyrhho: hi. I'm having a bit of an issue with 'lein trampoline run' sometimes failing to start my app. it says: Caused by: java.lang.ClassNotFoundException: clojure.tools.logging.impl.LoggerFactory

10:09 I'm using the clojure logging library (https://github.com/clojure/tools.logging)

10:09 but I'm just not sure why it would only fail sometimes

10:09 and haven't been able to figure out the cause

10:10 'lein run' does the same thing

10:10 have done 'lein clean', and removed ~/.m2 and ~/.lein

10:11 clgv: pyrhho: tools.logging works like a charm here

10:11 pyrhho: clgv: it normally works great, just sometimes my app can't start

10:12 then did 'lein deps' and 'lein run'. and got the error.

10:16 clgv: what version of clojure and logging are you using?

10:16 clgv: pyrhho: clojure 1.4 and tools.logging 0.2.4

10:17 pyrhho: ok. I was using 0.2.3 of logging so I'll try 0.2.4

10:18 darn.

10:18 same thing

10:18 clgv: and I mentioned [org.slf4j/slf4j-api "1.6.1"] [org.slf4j/slf4j-log4j12 "1.6.1"] in my project.clj

10:21 pyrhho: no change.. though it installed those first

10:22 clgv: hmm the class that is not found is a defprotocol

10:23 pyrhho: yeah, which is why I don't understand why it's not found...

10:23 clgv: pyrhho: do you :use tools.logging properly?

10:24 pyrhho: I'm assuming

10:24 I do (:require [clojure.tools.logging :as log]) in my namespace declaration

10:24 clgv: looks fine

10:24 pyrhho: then (log/info "foo")

10:25 i have a src/log4j.xml file specifying some appenders

10:26 though I don't explicitly require log4j in my project.clj. maybe I should add that

10:27 added [log4j "1.2.16"] to my project.clj but no change...

10:32 ok so here's something weird when I run 'lein repl' as it is starting it complains about LoggerFactory not being found, but if I type 'clojure.tools.logging.impl.LoggerFactory at the prompt it finds it fine

10:32 bhenry1: if you use an atom in a noir request, is it going to be specific to that request or will another request change the same atom?

10:35 clgv: pyrhho: sounds like there is something weird. is there anything unusal/special in your project setup?

10:35 pyrhho: not that I know of… standard ring app. It has some java source to be compiled with it...

10:39 clgv: pyrhho: if you have no other idea, setup a vanilla project and add the dependencies and test. when that works build it up incrementally to your current project to see where it stops working

10:39 pyrhho: if you have older working versions in a git repo you can use "git bisect"

10:40 pyrhho: clgv: true will try bisecting

10:45 clgv: hmmm. I checked out an old revision, did 'lein run' that started fine. went back to my head, and now I can't get that to fail either.

10:47 clgv: I feel like it is maven (or lein) hiding something from me…

10:48 clgv: I've removed ~/.m2 and ~/.lein and those didn't seem to make a difference.

10:48 clgv: pyrhho: did you check the project-clj for differences?

10:50 pyrhho: clgv: true. there are a few new deps so I will try adding those in until it fails

10:54 clgv: pyrhho: to detect dependency problems you could quick check both revisions with "lein deps :tree" to see what changed there

10:57 pyrhho: clgv: I had added some dependencies to my project.clj

11:01 clgv: there are a few differences in the dep :tree, but nothing to do with logging...

11:02 clgv: I had to resolve a conflicting transitive dependency issue a few commits ago, which is the differences

11:46 bhenry1: if you use an atom in a noir request, is it going to be specific to that request or will another request change the same atom?

11:47 ghadishayban: bhenry1: it will be specific to that request

11:47 bhenry1: ghadishayban: thanks

11:49 mpenet: amalloy_: Would ordered work on CLJS?

11:49 pyrhho: clgv: still around?

11:50 clgv: pyrhho: yes

11:50 `fogus: Decided to clean up the Minderbinder library that I covered in my Macronomicon talk for general use. Contributions welcomed. http://blog.fogus.me/2012/10/16/announcing-minderbinder-v0-2-0/

11:50 pyrhho: clgv: I an reproduce it reliably now.

11:50 it is if I try to start the app a second time (i.e. if everything is compiled)

11:50 clgv: if it is already compiled, the app fails with the error. but if I do a lein clean I can start it once more

11:51 clgv: but especially then it should be able find the interface to that protocol

11:51 pyrhho: clgv: yeah, right?

11:52 clgv: pyrhho: I dont know if that might be a symptom for using (require ..) instead of (:require ..) in an ns-form

11:52 pyrhho: clgv: what is the difference, anyway?

11:53 clgv: you have to use (:require ..) in an ns-statement

11:54 pyrhho: clgv: I've only used (:require ..) in the entire project

11:54 clgv: kk

11:54 pyrhho: did a quick grep for "(require"

11:55 clgv: pretty weird

11:55 pyrhho: yeah

11:55 I can fix it for now by just doing 'lein clean' every time before starting the app

11:56 that just feels really… dirty

11:56 clgv: your project is not opensource, is it?

11:56 pyrhho: no, unfortunately

11:57 clgv: ok. then you need to find a coworker to have a look at your project

11:57 pyrhho: alright. thanks for all your help

12:04 ghadishayban: I'm really late to the party, as the new macros just went in…were the drawbacks to let-> discussed?

12:05 mpenet: What is more appropriate for data_readers.clj location, src or resources ?

12:06 ghadishayban: i'm digging through clojure-log and didn't see anything recent…but this from two years ago: https://groups.google.com/d/msg/clojure/6Cb8MD5EC3w/SYAko4_PtR4J

12:11 i'll chew on it for lunch… maybe it's just the example usage in the gist that looks off, a little imperative

12:11 https://gist.github.com/3885504

12:12 will be useful while birthing a transient

12:12 TimMc: ghadishayban: Haha, nice find!

12:15 ebaxt: Can somebody explain the difference between file-response and resource-response in ring? https://github.com/mmcgrana/ring/wiki/Creating-response When should file be used instead of resource?

12:15 gtrak: ghadishayban: different from swiss-arrows?

12:17 nz-: ebaxt: file-response reads from the disk, resource-response via classpath?

12:18 http://mmcgrana.github.com/ring/ring.util.response.html

12:18 ebaxt: Ah, that makes sense :) Thx

12:19 bhenry1: ibdknox: are there plans to support TOP in korma? is there already a way to do this i missed?

12:44 djanatyn: :)

12:44 I got to use clojure to do something my teacher couldn't do in java

12:45 we're using some weird Turtle-like drawing library, and I tried using it in clojure, which went great

12:45 instead of having to compile and run each time, I could move the DrawingTool around on the canvas through my REPL

12:45 it's crazy how java applications suddenly become interactive with clojure :)

12:45 s/applications/libraries

12:45 SegFaultAX|work: djanatyn: Hopefully you didn't get marked down for not doing the assignment as the professor instructed. ;)

12:46 technomancy: noninteractive development is the worst thing you could wish on someone

12:46 djanatyn: well, I did the assignment in java first

12:46 I didn't really think to try it out in clojure

12:53 thmzlt: is there a way to go into the REPL and look at its current state (e.g. defined vars, etc.)?

12:53 technomancy: thmzlt: sure; all-ns and ns-map

12:57 thmzlt: cool, I really appreaciate working in the repl, but it feels like a one-way road. it would be nice to be able to fetch code defined in the repl back to text files

12:58 frawr: Hello

12:58 I'm having some trouble with apply in clojurescript.

12:58 technomancy: thmzlt: unfortunately that's still a bit of a hack. you can get file/line metadata from vars, but you have to use https://github.com/technomancy/serializable-fn for it to really work across the board

12:58 SegFaultAX|work: thmzlt: Go the other way around. Use an editor that has REPL integration so you can write your code in the editor, then send it to and interact with it in an embedded REPL.

12:58 thorbjornDX: thmzlt: I compromise and write stuff in vim that I send to a repl with vimclojure

12:59 thmzlt: interesting, thanks everyone for the feedback

12:59 I actually use emacs/nrepl

12:59 SegFaultAX|work: thmzlt: vim+vimclojure is a great option, as is emacs+nrepl.

12:59 thmzlt: Then what's the problem? :D

13:00 thmzlt: but I still want to see what is going on inside the repl some times

13:00 N8Dawg: thmzlt: how do you get the repo to exit/restart?

13:00 dnolen: frawr: what's your problem

13:00 SegFaultAX|work: N8Dawg: Huh?

13:00 frawr: I want to execute a callback with a parameter, I try using apply for this.

13:00 thmzlt: it occurs when a test passes in the repl but doesn't when I run "lein test"

13:00 N8Dawg: I'm afraid I didn't understand your question

13:01 N8Dawg: In emacs I start the nrepl

13:01 frawr: #(apply callback (list param))

13:01 thmzlt: technomancy: nice hack (serializable-fn), will look into that later

13:01 dnolen: frawr: what's the error that your getting? Can you put your actual source in a gist?

13:01 N8Dawg: using nrepl-jack-in, and it starts/connects fine, but lets say I update project.clj and want to run lein reps and restart the repl

13:02 thmzlt: N8Dawg: I see, I just quit/start a new repl and reconnect to it (might not be the best way)

13:02 frawr: 1 sec. I'll do that

13:03 technomancy: N8Dawg: you should never have to run lein deps

13:03 N8Dawg: but how do you quit? restart the computer?

13:03 technomancy: restarting the repl is enough

13:03 thmzlt: I've been told it mostly works =)

13:04 N8Dawg: technomancy: just the person I wanted to talk to :) I'm having fun with leiningen 2 and proxies

13:04 thmzlt: N8Dawg: you might want to start a repl in a terminal and connect to it using "nrepl" instead of "nrepl-jack-in"

13:04 or you can just C-x C-b and kill the nrepl process

13:05 N8Dawg: thmzlt: Ah thanks!

13:05 technomancy: uh oh

13:05 SegFaultAX|work: N8Dawg: Restarting the computer is never the answer [to editor problems].

13:06 frawr: https://gist.github.com/3900572

13:06 There you go, the source + error

13:06 N8Dawg: SegFaultAX|work: I know, but I'm sure theres a better way of killing the repo than killing the java process from Process monitor

13:06 frawr: callback is js/alert in this case

13:07 technomancy: N8Dawg: just kill the nrepl-server buffer

13:07 N8Dawg: technomancy: I have a local mirror and a proxy

13:07 dnolen: frawr: yeah in order to provide a uniform calling convention we assume that the object implements call, not all native JS methods do.

13:08 N8Dawg: technomancy: some artefacts come from the local mirror, others from say clojars through the proxy

13:08 technomancy: I have set up the mirror section in project.clj and thats working fine, how should I set up the proxy and the non-proxy hosts?

13:09 frawr: dnolen: So i could wrap js/alert in a cljs function to circumvent ths problem?

13:10 technomancy: N8Dawg: sorry, I have no idea. we just hand off those settings to the underlying libraries

13:11 dnolen: frawr: yes that's one way. it's annoying but I think this may be because alert is a method of window. real JS fns don't have this problem.

13:12 frawr: dnolen: thank you, I'll let the calling fn wrap the callback.

13:12 SegFaultAX|work: dnolen: It's probably just generally useful to wrap those functions in cljs anyway.

13:13 N8Dawg: technomancy: whats the underlying libraries now? it must have changed since leiningen v1 and v2, leiningen 1x was correctly picking pun the settings from settings.xml

13:13 dnolen: SegFaultAX|work: well in this case we can't really, there are no globals like there are in JS in Clojure.

13:14 technomancy: N8Dawg: lein 1.x accidentally picked up the settings.xml stuff because it used maven. lein 2.x uses aether.

13:14 SegFaultAX|work: dnolen: Sure, but couldn't we have a module that wraps all of the window methods? Anywhere you need them you can just include them in your namespace.

13:20 frawr: dnolen: Seems to work now. Now need to put it through some real test. Thank you!

13:22 dnolen: SegFaultAX|work: hmm maybe ...

13:22 frawr: np

13:23 SegFaultAX|work: dnolen: Is that something you think could be generally useful? There are only a dozen or so methods commonly supported across all browsers.

13:24 tvachon: hey folks, I've noticed using symbols rather than keywords for, eg, require in the ns statement works fine: (ns foo.bar (require [ham.socks :as socks] [bacon.tomato :refer [fish]]))

13:24 is there a reason not to do that? I'm kind of into the lack of colon

13:25 technomancy: it looks like a function call that way

13:25 seems misleading

13:26 emezeske: tvachon: I think the best reason not to do it is that it's totally undocumented, and thus could change in any Clojure release thereby breaking your code.

13:27 tvachon: I'm guessing that works on accident because ##(= (name :walrus) (name 'walrus))

13:27 lazybot: ⇒ true

13:27 tvachon: yea, both good points. the fact that it's in the ns statement, which already feels like a special place in a clojure file, seems like it makes up for it looking like a function call, but the lack of documentation's definitely not great

13:27 anyway, mostly curious

13:27 wasn't sure if it was an intentional evolution of that statement or just accidental, and sounds accidental :]

13:28 technomancy: you'd also get into scenarios where the codebase would be inconsistent if you have more than one developer hacking on it

13:29 tvachon: oh yea, I was mainly trying to decide whether I should refactor all the ns statements in an internal project

13:29 technomancy: then you get into style guide issues

13:29 tvachon: I think I will not

13:29 technomancy: we've mercifully been able to avoid C-land indentation style wars; seems like that would be opening up that door

13:32 djanatyn: emacs/nrepl users - how do you quickly throw up a new REPL to test things out?

13:32 a lot of times I'll have emacs open but no nrepl buffer and I want to test something out

13:33 ChongLi: M-x nrepl-jack-in

13:33 technomancy: djanatyn: M-x nrepl-jack-in when run outside a project will give you a repl that runs in the context of leiningen itself

13:33 so you get no deps other than what lein needs, but it boots a bit more quickly

13:33 frawr: dnolen: it works, thank you ever so much and have a good day.

13:44 SegFaultAX|work: dnolen: Sorry, lost internet. I didn't see your response (if you responded) to my question about wrapping all the window functions for cljs.

13:47 dnolen: SegFaultAX|work: it's worth thinking about tho annoying that's it not covered by goog Closure.

13:49 callen: what do clojurescript users do for DOM interaction?

13:49 Does one just use jQuery or is there some other idiom or standard?

13:51 lispnik: callen: i've been using goog.dom

13:51 * callen cringes

13:51 * callen tries to find an equivalent to Sizzle

13:52 lispnik: callen: there's jayq - haven't tried it though

13:53 callen: it's going to be a really hard sell to get my frontend guy to give up jQuery.

13:53 cemerick: callen: jayq works fine

13:53 lispnik: jayq is a clojurescript wrapper for jquery

13:53 cemerick: Being tied to jquery is…unfortunate, of course.

13:54 callen: arbitrarily complex CSS selectors and .on({}) go a long way.

13:54 dnolen: callen: also domina if you want a good selector lib.

13:55 callen: domina can be optimized, jayq can't - if that's important

13:56 cemerick: If someone's happy with CSS selectors, then xpath isn't ever gonna cut it. :-)

13:56 dnolen: cemerick: domina isn't xpath

13:57 cemerick: dnolen: wha, since when?

13:57 callen: yeah uh...domina isn't going to work.

13:57 xpath'ish selectors would make him (and I) go berserk.

13:57 dnolen: cemerick: a long time as far as I know

13:58 callen: cemerick: css selectors are fully supported

13:58 look at the repo

13:58 that functionality is months old as far as I know

13:58 callen: I will, but I was slapped in the face with predominantly XPath in the readme. Just because a library is capable of something doesn't mean it's well supported.

13:58 cemerick: huh, so it is

13:58 callen: dnolen: hello from HN btw!

13:59 cemerick: the xpath examples should be buried in the README in that case

13:59 callen: I agree with cemerick.

13:59 buried somewhere like, in the ocean, off a seaside cliff, about a mile down...

13:59 dnolen: callen: CSS query comes directly from Google Closure, so I expect it's pretty good.

13:59 clojurebot: Gabh mo leithscéal?

14:00 dnolen: callen: hullo :)

14:00 callen: dnolen: Hi! I'm codewright.

14:00 dnolen: callen: cool! nice rant ;)

14:01 callen: dnolen: it was meant to be a lot of things to many people. Like C++. So it goes.

14:01 cemerick: I've been doing all my dom manipulations via goog.dom with a super-thin wrapper. It's mostly sane.

14:01 SegFaultAX|work: Mostly.

14:02 callen: dnolen: fwiw, I've been "sold" on clojure just by dint of the community for awhile. I'm just trying to come up with ways to find more refugees.

14:02 ChongLi: callen: haha, I read your rant as well

14:03 SegFaultAX|work: callen: Can I get a link to your rant?

14:03 ChongLi: http://news.ycombinator.com/item?id=4657713

14:03 callen: ChongLi: beat me to the punch.

14:03 SegFaultAX|work: Cool, thanks.

14:03 `fogus: callen: It was unclear if you liked Clojure or not. :-o

14:04 callen: `fogus: it doesn't matter if I like it or not. I want to steal the collective brainpower of the CL community and its presently hard for me to convince the crazy people to give up their toys.

14:04 `fogus: callen: why should you convince them of anything?

14:04 technomancy: just send them the egal paper

14:05 callen: `fogus: "I want to steal the collective brainpower of the CL community"

14:05 `fogus: callen: I don't understand what that means.

14:05 ChongLi: I don't see the clojure community as lacking in brainpower

14:05 callen: it's not, but let me try to explain.

14:05 ChongLi: seems like some pretty awesome stuff done by just a few people!

14:06 callen: I'm not an excellent programmer. I'm an okay programmer. My productivity has as much to do with the library ecosystem as it does the language semantics.

14:06 As a result, I used Python for several years after having grown up with CL.

14:06 ChongLi: well I think clojure is pretty amazing in that regard

14:06 callen: for someone like `fogus, that's irrelevant. He can make anything he wants.

14:06 I cannot.

14:06 ChongLi: thanks to the huge array of java libraries

14:06 SegFaultAX|work: callen: Haskell hasn't really brought anything new to type systems (other than perhaps typeclasses which are pretty awesome) that wasn't already well explored by ML.

14:07 callen: ChongLi: I don't want Java libraries, I want Clojure libraries.

14:07 SegFaultAX|work: it's more about integration and power than new-ness.

14:07 SegFaultAX|work: callen: Are you saying that ML type system is not well integrated?

14:07 callen: SegFaultAX|work: Haskell has expanded the idioms of expression for the community further than had previously been addressed outside of white papers.

14:08 I'm not trying to address ML at all.

14:08 `fogus: callen: I must say that I'm more confused than ever.

14:08 ChongLi: what specifically are you missing from clojure's set of libraries for which a java alternative is unsuitable?

14:08 SegFaultAX|work: ChongLi:

14:09 callen: ChongLi: it's not one simple thing. There's a general unease I haven't really gotten into. One is separation of concerns.

14:09 ChongLi: it's hard for me to advocate or push for the usage of Clojure at my workplaces or on my side projects if the frontend people don't know Clojure or how templates baked into defpartials work.

14:10 The reason this happened was because separate concerns (backend, frontend) were munged into one thing.

14:10 For better or worse, this seems to be how a lot of people do web apps on Clojure, and I can't follow those idioms.

14:10 so I'm on my own.

14:10 ChongLi: oh, ok

14:10 callen: ChongLi: try not to take the specific example too far, there are a lot of things like this that concern me.

14:11 emezeske: callen: BTW, good library support is not "irrelevant" for excellent programmers. If anything, one would think that an excellent programmer would care _more_ about having good libraries at their disposal.

14:11 callen: emezeske: maybe, but excellent programmers are better positioned to solve their own complaints.

14:11 `fogus: callen: I think I follow this line of thinking, but it's unclear how Common Lisp devs factor in

14:11 callen: emezeske: I'm talking about the scope of what's reasonable possible, not engineering standards.

14:12 ChongLi: `fogus: he wants those CL devs to come over and write all his clojure libs for him

14:12 SegFaultAX|work: callen: It's almost like you're saying "Clojure is less awesome than Common Lisp because it isn't Common Lisp"

14:12 ChongLi: :)

14:12 callen: `fogus: we've departed from that boat. We're on to other more pragmatic concerns.

14:12 SegFaultAX|work: superset/subset of capabilities.

14:13 `fogus: alright, I'll be quiet now

14:13 callen: SegFaultAX|work: I told you, *I'm* sold, stop pretending the CL thing is about me. It's not. I said that in the rant too.

14:13 `fogus: I didn't mean to be dismissive if you took it that way. It's just that the CL thing is a community scope issue, we moved on to my own concerns which have more to do with getting other people to work on projects with me.

14:13 SegFaultAX|work: callen: So you're making an argument from the perspective of an unsubstantiated group of people?

14:13 technomancy: CL people often think ecosystem doesn't matter because a single motivated dev can hack together whatever they need using the Power of Macros

14:14 callen: SegFaultAX|work: ^^ what technomancy said is apt.

14:14 `fogus: callen: I didn't take it that way. I'm just being patient and trying to understand

14:14 technomancy: which kind of sort of works on a small scale but leads to a group of insulated solo antisocial hackers

14:14 ChongLi: it's the ol' bi-polar hermit thing again

14:15 callen: `fogus: the CL issue is that their common-case is the cowboy coder. Individual productivity, limitless freedom. The superset/subset problem means it's hard to convince them to give up their toys. It's like trying to convince a C++ person to leave C++. Why would that? They'd just be giving up "features" and knowledge that were hard-won.

14:15 ChongLi: right, like I said in the rant.

14:15 technomancy seems to understand where I was coming from perfectly.

14:15 emezeske: callen: Uhh, C++ is easy to leave. Been there, done that.

14:15 ChongLi: the community (and specifically all the talks I watched) are what drew me to clojure

14:15 technomancy: with clojure you can't pretend you're not standing on the shoulders of giants because it's clear a big part of what makes it awesome is the hotspot's GC, JIt, etc.

14:16 callen: emezeske: you know that's not what this conversation is about, come on :)

14:16 SegFaultAX|work: technomancy: And that will somehow force people to be less hermit-y about their lisp?

14:16 dnolen: callen: I still don't follow your line of thinking ...

14:16 emezeske: callen: You're right, just say whatever you want, regardless of whether it's generally true

14:16 callen: SegFaultAX|work: nope, they resent it. That's why they hate Clojure.

14:17 emezeske: callen: I will refrain from pointing out errors in your reasoning.

14:17 technomancy: SegFaultAX|work: no, I have no idea how to address the CL crowd

14:17 SegFaultAX|work: callen: You're making some pretty broad generalizations about a rather large number of people.

14:17 callen: dnolen: I'm dabbing paint at a canvas. Not thrusting towards something in particular. If you want me to address something specific, ask me something specific and I'll try to articulate.

14:17 technomancy: other than the egal paper, which is a long, detailed "I really want to love CL, but I can't because it fails at equality in ways that can't be addressed by glomming more stuff on"

14:17 ChongLi: I see no reason to try to shove something down people's throats; I'm happy with anybody using whatever language they like

14:18 as long as they share some of their ideas

14:18 hiredman: technomancy: look, equality is complicated

14:18 technomancy: part of the CL mindset is that there's no problem that can't be addressed by glomming more things on

14:19 callen: technomancy: you talking about the Baker paper?

14:19 hiredman: are you making a joke?

14:19 technomancy: which is silly since lisp pioneered GC, which is something you can't get without giving up malloc/free

14:19 callen: yeah

14:19 callen: technomancy: yeah, haha. That one. Whew.

14:20 technomancy: callen: it's brutal

14:20 `fogus: technomancy: I would be interested to see if the Egal paper could convince a single CL programmer to leave CL

14:20 SegFaultAX|work: technomancy: Link?

14:20 callen: I don't think they care about soundness.

14:21 if I had to guess.

14:21 if the tower is about to topple, build a bigger more advanced tower.

14:21 technomancy: `fogus: depends on how refined their putting-fingers-in-ears skills are?

14:22 grettke: callen: Where is this rant posted?

14:22 `fogus: technomancy: Not specific to CL devs mind you, but people in general are highly skilled at that

14:22 SegFaultAX|work: grettke: http://news.ycombinator.com/item?id=4657713

14:22 technomancy: SegFaultAX|work: http://home.pipeline.com/~hbaker1/ObjectIdentity.html

14:22 SegFaultAX|work: technomancy: Thanks, found it :)

14:22 callen: everybody but me is linking my own rant, haha.

14:22 technomancy: `fogus: it's an important life skill

14:23 `fogus: callen: People love rants!

14:23 almost as must as lists of stuff

14:23 callen: `fogus: :(

14:23 technomancy: callen: also: dammit you made me break my month-long "not logging into HN" streak

14:23 I was on a roll there

14:23 callen: I'm not the HN version of Gawkermedia.

14:24 technomancy: I am sincerely sorry. I myself just returned to HN from a sabbatical of not-logging-in.

14:24 hence the fresh account.

14:24 technomancy: heh

14:25 ChongLi: why has HN still not fixed the Unknown or expired link nonsense btw?

14:25 aaelony: anyone willing to save costs & share a room at the conj? the group rate no longer applies

14:25 ping me offline irc

14:25 technomancy: ChongLi: because the creators of arc think that continuations are actually a reasonable way to build web apps

14:26 ChongLi: pretty silly

14:26 callen: pretty hilarious.

14:26 ChongLi: what as unknown/expired?

14:26 ChongLi: it's amazing what people put up with

14:26 ?

14:26 `fogus: technomancy: What causes that? The continuation gc'd?

14:27 callen: Pretty sure he has an explicit expiration/cache-refill mechanism.

14:27 dnolen: callen: I was just trying to understand what the rant was actually about. I was only able to answer specific points not the overall message which wasn't clear to me.

14:27 ChongLi: the "More" link at the bottom of the page expires constantly

14:27 callen: Such that whenever the rankings/pages are refreshed, the old links go dead.

14:27 dnolen: the message was that we hadn't conquered new ground. We built a nicer place on what we had.

14:28 SegFaultAX|work: callen: I didn't get that at all.

14:28 grettke: callen: Nice post. Did you come to a conclusion on the questions you posed?

14:28 `fogus: callen: I didn't get that message, but thank you for saying it outright

14:28 dnolen: callen: yes I'm not sure what you mean by "new" ground or what that might consist of.

14:28 callen: `fogus: it's a component of the overall "sidegrade" commentary.

14:28 `fogus: It's hard to break new ground

14:28 callen: Don't gotta tell me. I'm the mediocre programmer, not you. Remember?

14:29 `fogus: I think a project like Datomic is pretty ground-breaky

14:29 callen: `fogus: sure, but it didn't *need* Clojure to exist.

14:29 `fogus: it's just built on the same concepts, priorities, culture, and idioms.

14:30 ChongLi: I'd like to know what kind of magical language could be dramatically more expressive than what we have right now

14:30 grettke: fogus: don't see many people taking research ideas "to the masses", Hickey seems to have done it and continues to do it

14:30 callen: `fogus: that's the problem with communicating with a CL'er. They don't care about culture or idioms.

14:30 ChongLi: and what that would even look like

14:30 callen: `fogus: they care about what's possible or reasonably expressible.

14:30 SegFaultAX|work: ChongLi: That's a pretty subjective question I think.

14:30 ChongLi: it seems kind of silly

14:31 grettke: callen: I have heard idomatic more in the last month looking at Clojure than ever before. I have never learned a language where the focus on idomatic usage is so huge. In IRC, books, blog posts.

14:31 callen: ChongLi: you're getting closer to the root question, the more interesting question.

14:31 ChongLi: what are the limits of expression? What is the most expressive means we have available to us? Is it mathematics?

14:31 grettke: which is good, and important. To me. To you. Not to Common Lispers.

14:32 technomancy: ChongLi: coming at it from the angle of correctness rather than expressiveness, it probably involves type inference

14:32 `fogus: callen: To my mind it seems that you're right, Datomic could have been created without Clojure, but I'm of the opinion that the right notation helps a TON in expressing ideas that are very difficult to say in the common parlance (if not impossible)

14:32 ChongLi: callen: didn't we already go down the road with fortress?

14:32 technomancy: `fogus: also you can't have a startup based around a language that encourages hermitism.

14:32 `fogus: callen: There are Common Lispers who have come to Clojure and are quite happy

14:33 technomancy: `fogus: I think that means they're not archetypal CLers

14:33 SegFaultAX|work: technomancy: Paul Graham might have something to say about that. :)

14:33 proofit404: hi everybody, can anyone give me few suggestions about Hot Code Swap with Clojure?

14:33 callen: `fogus: No doubt. I'm an ex-CLer and I enjoy Clojure for tinkering quite a bit. They're also not likely archetypal CLers and I'm not either.

14:33 `fogus: technomancy: Yeep!

14:33 technomancy: `fogus: no true scotsman; I know =)

14:34 `fogus: callen: What you call archetypal is more like a stereotype IMO

14:34 grettke: callen: the lispers and schemers who like clojure are probably not very vocal, the folks who dislike are probably very vocal!

14:34 ChongLi: technomancy: the correctness angle is an interesting one, I just don't know where we'd really want to end up with that

14:34 SegFaultAX|work: What exactly is an "ex-CLer"? Does not using a language as your go-to make you an "ex" of that language? Or have you actually divorced yourself entirely of the language?

14:35 technomancy: SegFaultAX|work: if you use slime from marmalade vs CVS =)

14:36 `fogus: Just my two cents: Trying to win over people who are perfectly happy with their tool(s) of choice is a fools errand

14:36 ChongLi: how much better than something like haskell could we really get (re: type inference)?

14:36 callen: `fogus: *shrugs* if you want to believe that, you can. It'd probably be better to understand why some people have such very different priorities and how you can incorporate those different perspectives.

14:36 ChongLi: that is, without putting too much cognitive load on the programmer

14:37 `fogus: callen: You can incorporate those perspectives fine without dragging the people along with them

14:37 callen: `fogus: whether those people are a stereotype or archetypal is besides the point. clearly the notion of what CLers are like is borne from some measure of collective anecdote.

14:37 for my part, what you call a stereotype has been virtually ever CL'er I've known, even the more practical ones that went on to found a successful startup.

14:38 I know one in particular that built his own web server, framework, and stack from the ground up. That wasn't atypical at all.

14:38 SegFaultAX|work: callen: Your argument there doesn't hold any water.

14:38 callen: SegFaultAX|work: I'll let the collander know.

14:38 nDuff: grettke: the Python community also cares a great deal about instilling idiomatic usage.

14:38 callen: that much is true, although it's more of a debate there.

14:38 ChongLi: idiomatic dogma

14:38 nDuff: grettke: ...explicitly rejecting the Perl idea of TIMTOWTDI is very much a thing.

14:38 callen: Some hate lambda, map, filter, reduce. Some love their itertools.

14:39 Some hate async reactors and prefer green threads, some are fine with Twisted.

14:39 ChongLi: seems weird to me that someone could hate a function

14:39 callen: Python definitely cares about idioms, but they only agree on the more trivial parts.

14:39 ChongLi: it's just a tool

14:39 grettke: nDuff: Agreed, Clojure is the 2nd most idiomatic bunch I've seen :P

14:39 callen: ChongLi: it's not the function, it's the pattern.

14:40 ChongLi: I think the point still stands

14:40 grettke: ChongLi: they hate the 'sin' function

14:40 `fogus: callen: I've also worked with my share of CL programmers and I've yet to meet one who fit the Tarver model. This is anecdotal, so take it at face value (hint: near zero value)

14:40 grettke: fogus: what is the tarver model?

14:41 `fogus: grettke: In this conversation it's the "archetypal CLer"

14:41 technomancy: there are a few archetypal CLers hanging out in #emacs

14:41 I have a couple of them on /ignore

14:42 callen: `fogus: I don't really mind speaking from anecdote. None of us have any right to pretension to scientific rigor, and if we used such a standard to circumscribe what could be discussed, we would discuss nothing.

14:42 As long as we're aware of the shaky ground, I don't see it as a big deal.

14:42 grettke: fogus: Mark Tarver, Qi creator, is the archetypical CL developer?!

14:42 technomancy: one of them reacted to the egal paper by "well you can always audit every single library you use to make sure they aren't mutating strings" with an apparently straight face.

14:42 `fogus: grettke: http://www.lambdassociates.org/blog/bipolar.htm

14:42 callen: technomancy: *snorts* that sounds about right.

14:43 `fogus: callen: agreed

14:43 ChongLi: ohhh, turing complete types

14:43 throw that type checker into an infinite loop!

14:43 callen: ChongLi: you mean C++ templates?

14:43 dnolen: callen: there I disagree - earlier point about Datomic, I don't think it would have existed w/o Clojure.

14:43 ChongLi: Qi's type system

14:43 grettke: fogus: oh yea i forgot about that, lol

14:43 * technomancy fondly recalls http://groups.google.com/group/comp.lang.lisp/msg/4c95766a8bdda347

14:43 dnolen: callen: believing so doesn't do service to the nature of ideas IMO

14:44 callen: dnolen: hard to say. you might be right. It's impossible for me to benefit from Datomic anyway.

14:44 dnolen: I don't use databases that other people control. I like the concept though.

14:44 Quite a lot, actually.

14:46 dnolen: callen: also people underestimate how influential Clojure & Scala have been to adoption of Phil's data structures.

14:47 callen: FP languages honestly some mostly for theorem provers w/o them

14:47 seem

14:47 callen: dnolen: er. bagwell?

14:47 dnolen: callen: yes

14:48 callen: weird. I'd always heard more emphasis on Okasaki's work. I'm not familiar with Bagwell's work.

14:48 clojurebot: http://haacked.com/images/haacked_com/WindowsLiveWriter/IConfigMapPathIsInaccessibleDueToItsProt_1446B/works-on-my-machine-starburst.png

14:49 callen: clojurebot really weirds me out sometimes.

14:49 TimMc: clojurebot: work

14:49 clojurebot: http://haacked.com/images/haacked_com/WindowsLiveWriter/IConfigMapPathIsInaccessibleDueToItsProt_1446B/works-on-my-machine-starburst.png

14:50 callen: technomancy: troll thread of the century.

14:50 `fogus: The spread of HAMTs in FP langs is a credit to Rich proving them out

14:50 callen: TimMc: nice repro.

14:50 technomancy: callen: a classic

14:50 dnolen: callen: Okasaki's works is very good and definitely showed how much more there was to do, but doesn't deliver on the promise the way Phil's work did.

14:50 Hodapp: HAMT? Phil?

14:50 callen: dnolen: one of the more interesting thoughts on data structures I've gleaned from Clojure comes from one of Rich Hickey's talks about using a tree vs. a hash table for representing hash-maps.

14:51 dnolen: am I take it that that bit of inspiration comes by way of Bagwell?

14:51 dnolen: callen: yes

14:51 callen: but this is also why reducers work so well

14:52 callen: Very cool. That was one of the most fun bits of knowledge I got from Hickey's talks.

14:52 scriptor: I thought Phil's data structures were usually mutable?

14:52 callen: scriptor: I don't know about his oeurve, but HAMTs are persistent.

14:53 scriptor: the lock-free one is mutable AFAIK

14:53 scriptor: ah, nice

14:53 zerokarmaleft: phil's talk was one of the best at conj '11 :(

14:53 callen: zerokarmaleft: we've lost of a lot of good people lately. Uriel is gone too.

14:54 shaungilchrist: :(

14:55 TimMc: It's easier to see the greats disappear than to see them appear.

14:55 One process is fast, the other slow.

14:55 callen: that explains why nobody notices when I successfully build things, only when they break.

14:55 TimMc: Heh.

14:55 AdmiralBumbleBee: also that it's easier to see someone had a point when they're not here to argue with anymore

14:55 callen: People don't like being robbed of something they thought they could take for granted

14:58 anyway, I'm glad some of what i said in that rant seemed to get across.

14:58 gtrak: sad news, I had no idea

14:58 re: Bagwell

14:59 callen: gtrak: uriel died too. :(

14:59 uriel was only 30 years old.

15:00 TimMc: "[Universe] Bug report: Phil Bagwell has died. Resolution: WONTFIX" :-(

15:00 This place has terrible maintainers.

15:01 So VLists... are those used in Clojure?

15:02 callen: TimMc: they're the foundation for the arrays and hash-maps in Clojure.

15:02 aperiodic: aren't vectors basically those?

15:02 callen: TimMc: and as the tower goes up, STM too.

15:02 arrays, vectors. Same difference. ;)

15:03 rlb: I tried to set up the simple incanter hello-world, but the (view ...) just produces a blank window over ssh -X ...; is that to be expected?

15:03 TimMc: Well, I've looked at that blog post everyone else has looked at of how vectors work in Clojure, and it didn't look like the VList diagram I saw.

15:04 rlb: I've run Clojure/Swing apps over ssh -X before, and it worked.

15:04 gtrak: callen: who's Uriel?

15:04 rlb: TimMc: ok, thanks -- it's not working here, so I suppose I'll need to investigate.

15:05 pjstadig: i don't think clojure's vectors are an implementation of VLists

15:05 TimMc: rlb: If screen is involved, it might be trying to render to the old X port/socket/whatever-the-hell-it-uses.

15:05 pjstadig: i always thought they were a riff on HAMTs

15:05 but Rich's own doing

15:06 TimMc: $def HAMT

15:06 gtrak: callen: I think I found him, nm

15:06 TimMc: Horsemen's Association of Millstone Township

15:06 https://en.wikipedia.org/wiki/Hash_array_mapped_trie

15:06 pjstadig: TimMc: correct

15:06 rlb: TimMc: nope -- this test was just via "ssh -X foo@localhost" -- though I think my -X is *really* -X, i.e. not -Y. But I think I tried -Y too.

15:06 However, I'll try -Y again...

15:16 dnolen: timsgardner: hullo!

15:27 jonasen: I created a few example queries for codeq if someone's interested: https://github.com/jonase/codeq/blob/queries/src/datomic/codeq/examples.clj

15:28 callen: so lets say I wanted to write a web app in Clojure, but I want my templates to be plain HTML, and my JS to be plain JS because my frontend person doesn't know Clojure or ClojureScript. What would be the proper way to go about that?

15:28 Noir seems to assume you'll use their templating system.

15:28 clostache/mustache exists, but fully logic-less templates are a little extreme.

15:30 zerokarmaleft: seems that's a constraint given by insulating your frontend guy from learning anything new

15:30 raek: callen: Enlive could be an option

15:30 callen: zerokarmaleft: giving up jQuery and standard JS is absurd. Not going to happen.

15:30 zerokarmaleft: he doesn't want to learn Clojure. He doesn't mind what I use on the backend, but he's not going to give up his productivity for the sake of my curiosity.

15:30 zerokarmaleft: callen: i'm not contending you do that

15:30 raek: with Enlive you usually read the html, transforms the element tree, and write new html

15:30 callen: raek: eeeeeeek.

15:31 zerokarmaleft: just that if you can't compromise based on his skillset, then you

15:31 dnolen: callen: people were doing things that way for a long time

15:31 zerokarmaleft: have to make compromises elsewhere

15:31 callen: dnolen: which what way?

15:31 dnolen: callen: I mean Clojure web apps w/ just HTML/CSS/JS on the front end

15:31 callen: dnolen: so should I just use vanilla ring and mustache?

15:32 I was hoping not to give up the faculty of something as nice as Jinja.

15:32 gtrak: callen: you can hook up whatever you like, I've done stringtemplate once (and regretted it)

15:33 callen: dnolen: Amusingly, your enlive tutorial contrasts itself at the beginning with PHP, and then Jinja/Django style templates.

15:33 gtrak: what'd you shift to?

15:33 gtrak: I was just messing around, since I'm mostly backend, I use hiccup myself, which you've ruled out

15:33 dnolen: callen: haha yes, it's quite old and I don't really maintain that anymore.

15:34 Lone_Wanderer_: Is a SLIME-style REPL in Eclipse for Clojure too much to hope for? >.> (I just barely installed Clojure for the first time.)

15:34 callen: I really don't like having templates baked into the code. I prefer to inject data into the templates.

15:34 To be perfectly frank, I don't see having templates baked into the code as being any less...questionable than having code baked into the templates.

15:34 gtrak: callen: here was the stringtemplate embedding I wrote: https://github.com/gtrak/garytrakhman.com/blob/91813c7d0b6206e2821aadbf2b47c18135d5a6e1/src/garytrakhman/stview.clj

15:35 callen: I rather like keeping my food on my plate in their separate corners.

15:35 hiredman: Lone_Wanderer_: have you looked at and rejected counterclockwise?

15:35 gtrak: callen: and rendering with moustache: https://github.com/gtrak/garytrakhman.com/blob/91813c7d0b6206e2821aadbf2b47c18135d5a6e1/src/garytrakhman/core.clj

15:36 callen: gtrak: interesting.

15:36 Didn't plan on using stringtemplate. Definitely not going there now.

15:37 gtrak: yea, it's shitty

15:37 but the idea of embedding a lib and using it shouldn't be surprising

15:38 callen: I just really don't care for whole-template-transformation and processing.

15:38 I prefer to inject, iterate, and project in a separate universe.

15:38 gtrak: like composable snippets?

15:38 Lone_Wanderer_: hiredman: No, I googled "clojure slime" and looked around a bit but thought I'd ask here in case I'm heading the wrong direction.

15:39 gtrak: I've used django's templates, do you mean like that?

15:39 callen: gtrak: like Jinja. http://jinja.pocoo.org/docs/

15:39 gtrak: Jinja is somewhat more powerful than Django's templates, but same idea.

15:39 gtrak: how about closure templates?

15:39 hiredman: counterclockwise is the clojure plugin for eclipse

15:39 rikerbe: new car arrived today:D

15:39 hiredman: now, I never used it

15:40 callen: gtrak: I hadn't tried closure templates. I only use google closure for compilation, I avoid the rest of their ecosystem.

15:40 hiredman: but I know it exists in a vague sort of way

15:40 Lone_Wanderer_: ok, thanks

15:40 callen: rikerbe: congrats!

15:40 rikerbe: Thanks

15:40 gtrak: callen: if I recall, it fits the bill, but I looked at it a while back

15:40 callen: rikerbe: A new car is always really exciting. For me, its motorcycles. I know the feeling :)

15:41 gtrak: oh you mean using them from the java side.

15:41 gtrak: callen: "In contrast to traditional templating systems, in which you must create one monolithic template per page, you can think of Closure Templates as small components that you compose to form your user interface."

15:41 yea

15:41 rikerbe: callen, I can relate to that - i love bikes. I'm a big time vehicles collector - more than 100 cars and over 80 bikes.

15:41 callen: jesus fucking christ

15:41 rikerbe: I own one motorcycle.

15:41 it's my 5th.

15:42 rikerbe: its a lot of vehicles, but I only have one wife, so it evens things out.

15:42 gtrak: rikerbe: and you got them all by writing clojure? :-)

15:42 callen: gtrak: I really don't like the idea of bringing even *more* java into my life, but I'll take a look.

15:42 "The house that Clojure built"

15:43 rikerbe: gtrak sorry to disappoint you but its got nothing to do with clojure

15:45 http://postimage.org/gallery/chhce5w8/

15:45 there she is.

15:46 gtrak: sweet sweetness

15:47 grettke: rikerbe: you are a programmer?!

15:47 callen: rikerbe: what brought you to this IRC channel?

15:47 grettke: callen: pics of your bike?

15:47 rikerbe: Thats a Hennessey Venom GT - its a twin turbocharged based on a highly modified Lotus Exige chassis (which is basically the coupe Lotus Elise). All carbon fiber. brembo brakes, 1200 hp, 2700 pounds.

15:47 grettke yep.

15:47 callen: rikerbe: did you win the IPO lottery?

15:47 grettke: rikerbe: lol what kind of programmer?

15:47 callen: grettke: founder, probably.

15:48 gtrak: he must have used dependency injection instead of singletons

15:48 rikerbe: I've started lots of startup companies over the years, lots of projects - some very successful.

15:48 grettke: I just read a blog post today about aftermarketers tweaking stuff out like taking a Ferrari Enzo and tweaking the heck out of it

15:49 rikerbe: any motorcycle pics?

15:49 rikerbe: Aftermarket stuff is really huge and certain cars have cult followers with huge aftermarket stuff.

15:49 grettke: rikerbe: caterham super 7?

15:50 rikerbe: I dont have one of those.

15:50 uvtc: That baby's probably got a interleave cycle, 12:1 partial comp ratio. Custom doseq transmission. Interpose chassis. The works.

15:50 mindbender1: technomancy: is there a way to know the name of a project that a repl started in?

15:51 oskarth`: I have (foo-wrapper-macro bar-fn baz-fn), where bar-fn evaluates into a map. foo-wrapper-macro takes a map and a function, and turns it into another fn. This works when I supply the wrapper-macro with a map and my baz-fn, but not otherwise. How do I re-write this so the evaluation happens in the right order?

15:51 rikerbe: Its a drivers cars - theres no crash control, no abs - this is a drivers car. it requires you to drive it.

15:52 uvtc: Clojure may not be appropriate for drivers. Perhaps C?

15:52 rikerbe: its got proper gearbox - which is just so rare these days with supercars.

15:52 gtrak: abstraction doesn't lend itself well to driving..

15:53 rikerbe: uvtc, http://www.venomgt.com/the-venom-gt/specifications/

15:53 Hodapp: gtrak: Gas pedal, brake, and steering wheel are fairly common abstractions though.

15:53 gtrak: sure... :-)

15:53 uvtc: Imagine flyin' down the highway, then *bam*, you throw an exception.

15:54 Hodapp: psh.

15:54 gtrak: I threw a guy an exception the other rday

15:54 uvtc: gtrak: did he catch it?

15:54 gtrak: he told me to goto somewhere

15:55 mindbender1: technomancy: that's from within the repl. I find that attimes I just can't remember which project a repl in emacs was started in

15:55 gtrak: I told him gotos were considered harmful... haha bad joke

15:56 `fogus: listening to Hawkwind makes want to adventure!

15:57 * `fogus meant that for twitter :-(

15:59 gtrak: is jay leno a clojure developer? http://www.jaylenosgarage.com/collections/hennessey/2012-hennessey-venom-gt/#item=215886

16:02 cgag: i have a vector and i want to pull out a few values into a new vector, say the first third and fourth, is there a better way to do it than (mapv myvec [0 2 3])?

16:04 cemerick: cgag: vectors can be associatively destructured, too

16:04 oh, sorry, didn't read the Q fully :-|

16:05 hyPiRion: cgag: That looks rather succinct. Are the values you want changing, or are they constant?

16:07 cgag: Yeah it doesn't feel bad, i just had a nagging feeling there was something in the standard lib i was missing. They change, but is there something you'd do differently if they were constant?

16:09 technomancy: mindbender1: the current directory of the repl buffer should be in the project I believe

16:09 callen: I agree that there's definitely room for something like enlive, but comprehensible

16:10 mindbender1: technomancy: yeah you're right totally escaped me. thanks

16:10 technomancy: personally I <3 hiccup, but it's obviously not a good choice for all team mixes

16:10 hyPiRion: cgag: Well, if they were constant and differed only by one, you could've used subvec

16:11 uvtc: I was probably a little rude to rikerbe up there. Sorry about that, rikerbe.

16:12 hyPiRion: That's about it, I guess.

16:13 TimMc: What in god's name broken piece of shit UI is the Datomic blog using?

16:13 pjstadig: blogger

16:14 TimMc: Oh. Carry on then.

16:15 hyPiRion: TimMc: I went to check and found out that the datomic logos aren't lining up properly to the blog content

16:16 Now I'm going to look at those logos everytime I go there, sigh =/

16:17 TimMc: Blogger has *always* had a shit interface. Now it's just a Web 2.0 kind of shit.

16:28 edw: Using client/post in clj-http 0.5.6 I'm getting a "java.lang.NoSuchFieldError: DEF_CONTENT_CHARSET". Anyone have a clue?

16:31 hyPiRion: I'm guessing you need to specify the charset the content uses. What kind of content type have you set it to?

16:33 callen: technomancy: oh, you find enlive a bit baffling too?

16:33 ystael: Under what circumstances will an AOT-compiled class be loaded into a clojure.lang.DynamicClassLoader rather than the base AppClassLoader ?

16:33 callen: technomancy: that's actually encouraging. I was worried I was surrounded by people who were fine with it and I was the only one generally unable to get traction with it.

16:34 technomancy: callen: yeah I like it in theory, but I generally find myself stumped

16:34 fixing things by just "maybe if I move this around it'll work" cargo-culting stuff

16:34 danlarkin: clearly everyone should just be using clabango

16:34 callen: yeah, exactly!

16:34 I hate that.

16:34 technomancy: I love how it's declarative, and once it's written it's very readable.

16:35 callen: technomancy: hiccup seems understandable to me but my coworker, for better or worse, needs to be able to edit the templates sadly.

16:35 technomancy: but whatever abstractions it uses inside are simply not clearly defined

16:35 dakrone: edw: can you post your code somewhere?

16:35 amalloy: oskarth`: the question isn't very clear, but it sounds like the answer is to use a function, not a macro

16:35 technomancy: callen: the theory is that the designer shouldn't need to edit the markup if it is well-structured to begin with

16:36 I don't have experience either way, but my gut suggests the theory is BS

16:36 callen: technomancy: that's not really the case, he does HTML, CSS, and JS. He builds on the template bases and builds up the markup as he goes.

16:36 edw: hyPiRion: that's what I thought, but I'm having some trouble figuring out the correct type to use for those values. Let me go read some source. (It'd be hard to disentangle the source for a gist/paste.)

16:36 technomancy: yeah, I don't do much web work myself

16:36 thmzlt: technomancy: you are so lucky

16:36 devinus: callen: it's a fallacy that developers should be in charge of markup

16:37 callen: technomancy: I'm sorry to hear that given that you and I seem to be of like mind. but I'm left needing to figure out how to handle templates that both I and the frontend guy work on.

16:37 I don't really care what religious precepts you hold to. My guy does the HTML, CSS, and JS and calls my backend APIs.

16:37 thmzlt: devinus: amen

16:37 callen: All I want to know is how to make it work with a Clojure stack.

16:37 technomancy: callen: think of the bright side: plenty of low-hanging fruit and opportunities for an ambitious hacker to make his mark

16:38 callen: technomancy: I don't think I'm intelligent enough to do it right, but I may resort to that if I have to.

16:38 danlarkin: clabango!

16:38 uroborus_labs: Newb Question: When in the repl, what is the best way to load a library from the project? For example monger for mongodb

16:38 callen: danlarkin: the readme didn't show me anything. show me sumtin :(

16:39 danlarkin: well from looking at tests/, I like it, but how complete is it?

16:39 uroborus_labs: For example, attempting "(use [monger.collection :only [insert]])" results in an error

16:39 scriptor: I like the idea of templates as just clojure data, but honestly I'm not sure how practical that actually is

16:39 danlarkin: callen: complete enough that I've used it for 3 (small) projects

16:39 callen: scriptor: for me, not in the slightest, sadly.

16:39 pjstadig: ~suddenly

16:39 clojurebot: CLABANGO!

16:40 callen: danlarkin: your profile pic on github is sucking my soul through a straw.

16:40 danlarkin: callen: here are some samples https://github.com/danlarkin/clojars/tree/master/src/clojars/templates

16:40 hyPiRion: uroborus_labs: First of all, you need to quote the vector, like so: (use '[libname :only [foo]])

16:40 Kowboy: anyone here very familiar with datomic?

16:40 uroborus_labs: hyPiRion: Ahh

16:40 scriptor: right, the theory should be that the markup is so well structured that the *back-end developer* doesn't have to worry about it

16:40 callen: danlarkin: does it have for loops?

16:40 danlarkin: callen: yep

16:40 uroborus_labs: hyPiRion: That solved my problem :)

16:40 hyPiRion: That should be it, really. Just ensure you're using lein repl and that you've added the library as a dependency.

16:40 uroborus_labs: good!

16:40 callen: scriptor: sorta. There are occasionally cases where I have to pierce the veil.

16:40 uroborus_labs: hyPiRion: Thanks, still new here :)

16:40 Kowboy: is this some sort of reader macro? -> #db/id[:db.part/db]

16:41 callen: danlarkin: intriguing.

16:41 danlarkin: thank you.

16:41 scriptor: callen: right, but general practice should at least lean towards that side

16:41 hyPiRion: uroborus_labs: There's space for everyone here :)

16:41 danlarkin: callen: I have a few more things I've added but haven't pushed yet because I haven't written tests for them yet

16:41 callen: scriptor: I'm not really in a prescriptive mood when it comes to telling other people how to do their job.

16:41 danlarkin: callen: but other than those I've used it successfully as-is

16:42 callen: scriptor: all I know is that I generally expose an HTTP REST + JSON API, and I occaisionally chuck data into a server-side template, but the frontend guy works otherwise independently.

16:42 danlarkin: more disciplined than I am.

16:42 danlarkin: what are they?

16:43 danlarkin: callen: count and pluralize filters and I added forloop.last to the context when you're in a for loop

16:43 callen: danlarkin: ...did you write your own web framework on laeggen?

16:43 danlarkin: I wouldn't call it a framework

16:43 because that term annoys me

16:43 callen: lets not get hung up on nomenclature

16:44 you've established your own idioms for writing an async HTTP web server.

16:44 danlarkin: right?

16:44 also, I didn't know aleph was still being maintained.

16:44 danlarkin: I guess

16:44 it is

16:44 (aleph)

16:45 callen: yeah, it seemed like it'd been abandoned for awhile. odd.

16:45 that was awhile ago.

16:45 danlarkin: just curious, why aleph instead of ring/jetty?

16:45 danlarkin: I have some unpushed work on laeggen too

16:46 callen: I'm trying to learn where your code comes from so I understand.

16:46 danlarkin: callen: it's an experiment

16:46 technomancy: callen: danlarkin looooooves his labyrinths =)

16:46 http://oglaf.com/labyrinth/

16:47 SegFaultAX|work: technomancy: Oh that last frame... his eyes.

16:47 technomancy: SegFaultAX|work: we've all been there =)

16:48 danlarkin: callen: I don't really like how compojure works and I wanted to write a web thing for clojure so I came up with my own that works how I want it to

16:48 SegFaultAX|work: technomancy: I cracked up. :)

16:48 callen: technomancy: hahahahaha

16:49 danlarkin: that's fine, I'm not criticizing, I'm legitimately trying to grok your work.

16:49 danlarkin: what were you trying to glean from the experiment?

16:49 thmzlt: danlarkin: what did you do instead of compojure?

16:50 danlarkin: thmzlt: laeggen

16:50 callen: I guess partly "what does web dev in clojure look like without ring"

16:51 callen: danlarkin: well, I really like the way the clojars app works.

16:51 it all makes sense to me.

16:51 danlarkin: I'm pleased you think so

16:51 thmzlt: danlarkin: cool, will take a look

16:51 aperiodic: danlarkin: what did you find dissatisfying about compojure?

16:51 weavejester: danlarkin: Did you discover anything aside from async that could be done better with a different approach?

16:51 callen: I'm curious about that too.

16:52 danlarkin: you've done it now, you're the pied piper of clojure programmers.

16:52 danlarkin: lead the rats to their cheeeese!

16:53 danlarkin: weavejester: I just prefer a simpler layer of dispatch separated from the view functions (or whatever you want to call them)

16:54 weavejester: danlarkin: Oh, I was more thinking of Ring rather than Compojure.

16:54 callen: weavejester: Pardon the incredibly trivial summary: danlarkin's approach is more "django", yours is more "sinatra"

16:54 danlarkin: oh, I see

16:54 callen: django has an independent dispatch layer that is separate from the views themselves. Sinatra generally has them closer together although there's a continuum.

16:54 danlarkin: well ring has this whole middleware model which I don't have in laeggen

16:55 though I might be sticking my head in the sand on that, I haven't decided yet

16:55 weavejester: Ah, do you have anything instead of it?

16:55 danlarkin: well sorta, for auth, for example, I wrap the normal view functions

16:56 see line 14 in https://github.com/danlarkin/clojars/blob/master/src/clojars/main.clj

16:56 callen: reminds me a great deal of the way I used decorators in Python (auth/authorization_required)

16:57 weavejester: danlarkin: So it's more a static (and more predictable) routing table?

16:58 danlarkin: The views in clojars.pages look a lot like handlers

16:58 danlarkin: yup

16:59 weavejester: Static routing tables have the distinct advantage of being reversible, something that Compojure's design doesn't always allow.

17:00 danlarkin: yes, I haven't explored that yet, but something like a get-url-for function would aid DRY

17:01 we should have a BoF next month

17:01 weavejester: BoF?

17:02 danlarkin: http://en.wikipedia.org/wiki/Birds_of_a_feather_(computing)

17:02 weavejester: Ahh...

17:03 xeqi: I would be interested in listening to that

17:03 weavejester: My thoughts are currently leaning toward a practice of not changing URLs

17:04 callen: weavejester: cool URLs don't change :)

17:04 jcromartie: lolwut "Can't define method not in interfaces"?

17:04 callen: danlarkin: BoF via internets?

17:04 weavejester: callen: Exactly ;)

17:04 jcromartie: I'm trying to deftype a key/mouse listener

17:04 danlarkin: callen: I mean at the conj

17:04 cemerick: ~cool uris

17:04 clojurebot: Cool URIs don't change: http://www.w3.org/Provider/Style/URI

17:04 callen: danlarkin: sad. :(

17:04 I won't be there.

17:05 weavejester: I'll be at the conj

17:05 I may take notes

17:05 danlarkin: cool URIs go to the conj...

17:05 weavejester: And put them online

17:05 callen: weavejester: t'would be appreciated. Since you have a lot of experience on web apps, maybe you could help me.

17:05 jcromartie: what's wrong with this picture

17:05 https://gist.github.com/8c91a431b7bc4b14775a

17:06 callen: weavejester: I need my frontend guy to be able to work on the HTML, CSS, and JS independently of my backend work in Clojure. Only solutions I've seen so far have been danlarkin's clabango or moustache. Thoughts?

17:06 jcromartie: (yes KeyListener is imported)

17:06 callen: weavejester: I'm looking to decouple the HTML (templates), CSS, and JS from the Clojure.

17:06 jcromartie: callen: Enlive might work too

17:06 weavejester: jcromartie: The first argument of a type is the instance itself.

17:06 callen: jcromartie: noooooope.

17:06 jcromartie: ah ha

17:06 weavejester: jcromartie: So (keyPressed [_ e] …)

17:07 callen: jcromartie: Enlive just leads me to the same result as techno. Cargo-cult fwacking code around until it works.

17:07 jcromartie: thanks weavejester

17:07 cemerick: callen: very surprised you've not picked up enlive

17:07 callen: I can understand hiccup, but it's still clojure code.

17:07 cemerick: I haven't been able to understand it in a reasonable amount of time. I'm not sure that's crazy.

17:07 seemingly, I'm not the only one with this problem.

17:08 jcromartie: Enlive is kind of a mind bender

17:08 callen: cemerick: I'll give it another try if you really think that's the way to go, but I don't like cargo-culting my way about.

17:08 weavejester: callen: Unfortunately, I haven't looked into this problem much. All the work I've done has had the Clojure developer write the HTML as well.

17:08 callen: :(

17:08 weavejester: thanks anyway!

17:09 weavejester: callen: Sorry I couldn't help more

17:09 Now… Back to Dishonored :)

17:09 technomancy: moustache seems to have the advantage of being somewhat standardized

17:09 callen: weavejester: s'not like you owe me anything. Have fun. I enjoyed Dishonored a lot.

17:09 cemerick: callen: To each their own. One of Enlive's motivators is the kind of separation you're looking for. Not sure where cargo-culting comes in.

17:09 callen: cemerick: it's hard to understand.

17:09 technomancy: tell 'em. enlive leads to misunderstood cargo-culting and whacking code around at random until it works.

17:10 technomancy: that has been my experience

17:10 callen: mine as well, which is my point.

17:10 danlarkin: I can only speak for myself but I completely failed at understanding enlive

17:10 and that's why I wrote clabango in the first place

17:10 callen: cemerick: so that makes three. Do you use enlive?

17:11 kmicu: cemerick's point: +1

17:11 technomancy: I can read enlive code and it looks beautiful, but when it comes to trying to figure out where clone-for goes and what do-> means, it devolves into flailing

17:11 cemerick: callen: Yes, extensively.

17:11 Use whatever you like. Still puzzled by the "cargo-culting" mentions.

17:12 danlarkin: cemerick is a better man than us :p

17:12 callen: cemerick: I think technomancy's descriptions suffice. Maybe danlarkin has the right idea, haha.

17:12 I mean, I get this experience all the time. Like the first year I spent with Haskell, or my first time with parser combinators.

17:12 technomancy: cemerick: it means not understanding what's really going on, looking at other code that you know works, and trying to ape it in your own code without knowing why

17:13 callen: Never did figure out parser combinators. Did learn how to use XML.Light in Haskell though.

17:13 cemerick: technomancy: Yeah, I know what it means. :-) Just unclear as to how it got into the conversation.

17:13 Insofar as enlive is just sugar for zippers, it seems pretty straightforward.

17:13 callen: cemerick: it's a way of describing what was objectionable about Enlive.

17:13 what about the experience of using it that made it unsuitable/unpleasant.

17:13 for us mere mortals.

17:14 danlarkin: hey watch who you're calling mortal

17:14 callen: well pardon me Highlander.

17:14 cemerick: callen: I think danlarkin was trolling me, don't worry about it :-P

17:15 danlarkin: psh no way I was completely serious, I feel The Quickening

17:16 callen: I could try powering through another enlive tutorial.

17:16 cemerick: callen: have you grokked zippers?

17:16 callen: I feel kinda blub-y for really just wanting a jinja2 equivalent in Clojure, but here we are.

17:16 cemerick: last time I encountered them was xml-zip and it turned into a horror. OTOH, I have no issue with "zippers" in Python.

17:16 cemerick: lets conservatively say, "no" with the understanding that I'm not a total rube.

17:17 cemerick: Yeah, if you're not comfortable with zippers, then enlive will feel magical.

17:17 technomancy: cemerick: why doesn't the enlive readme mention zippers anywhere?

17:17 callen: the concept of returning tree transformations isn't utterly alien if the experience of using xml-zip was.

17:18 emphasizing the foundational material needed to grok enlive in the readme would be wise. If you don't want to write libraries that rush to the bottom and require some kind of background, stating the prerequisites would help people like me a lot.

17:18 TimMc: I had a similar experience with Enlive, by the way.

17:19 cemerick: technomancy: Because it's aiming to provide an abstraction above them? Maybe cgrand would like a new section connecting the dots.

17:19 callen: I don't know if I should be feel encouraged or discouraged that people with more experience and knowledge of Clojure had trouble too.

17:19 AdmiralBumbleBee: I feel like I'm the only person who thought enlive was amazing and very easy to use

17:19 TimMc: I really, really want to use tree transforms on HTML to inject data.

17:19 technomancy: TimMc: sameo

17:19 same

17:19 TimMc: technomancy: Too much core.logic?

17:19 AdmiralBumbleBee: Will you write my code for me? :-/

17:19 technomancy: TimMc: no idea

17:19 callen: AdmiralBumbleBee: ever written a parser composed of parser combinators before?

17:20 AdmiralBumbleBee: TimMc: maybe I can help?

17:20 akhudek: I'm really shocked people have so much trouble with enlive.

17:20 How is it any harder than jquery?

17:20 technomancy: probably part of it is because it's functional; jquery is bash-in-place

17:21 callen: Call me crazy, but I'm going to plant the flag in the ground here and now. Enlive will become Clojure's proverbial monad tutorial.

17:21 AdmiralBumbleBee: callen: I don't even know what combinators are

17:21 callen: AdmiralBumbleBee: that makes me feel worse.

17:21 AdmiralBumbleBee: why?

17:21 clojurebot: why is the ram gone is <reply>I blame UTF-16. http://www.tumblr.com/tagged/but-why-is-the-ram-gone

17:21 hiredman: akhudek: the model is very different from most (all?) other template libraries

17:21 callen: AdmiralBumbleBee: I have no idea how you came to understand it so intuitively.

17:21 hiredman: no need to hedge. All.

17:22 wait let me double-check something real quick

17:22 AdmiralBumbleBee: callen: It's strange, because I feel the same of the folks saying they have trouble with it

17:22 enlive seems remarkably straightforward to me

17:23 callen: Hrm. Yes. I just double-checked cabal.

17:23 TimMc: AdmiralBumbleBee: This was a while ago, but it was basically that I had no idea which API elements returned fns vs html specs, took one vs many elements, etc.

17:23 callen: Nobody in Haskell is crazy enough to do HTML templating like Enlive

17:23 akhudek: hiredman: jquery works somewhat similarly on the dom, use xml selectors to perform transformations

17:23 callen: and they use zippers all over the place.

17:23 cemerick: Maybe if we all declare our eternal disdain for enlive, callen will be happy?

17:23 akhudek: they are not exactly the same of course, but I figured the similarities would be enough for people to feel somewhat comfortable

17:23 callen: they just generally mark where data should be injected and leave it at that.

17:23 hiredman: I like enlive

17:23 callen: cemerick: I'm trying to figure out what I need to understand to utilize it!

17:23 cemerick: that's why I said the note about zippers should be in the readme.

17:24 TimMc: cemerick: Disdain? No. Confusion.

17:24 hiredman: but it isn't something you just slip in to using, there is a learning curve

17:24 danlarkin: cemerick: we can't stop now, the 5 minutes hate isn't finished

17:25 cemerick: TimMc: As you like. :-)

17:25 callen: you're making me feel like a demagogue now, I'm legitimately trying to understand what background is required because if it supports the separation of concerns I want then i'm fine with it.

17:25 TimMc: AdmiralBumbleBee: Do you have any Enlive-using code in a public place? I feel like some examples might help.

17:26 technomancy: seems like everybody confused by enlive is bummed out because we like the way it reads

17:26 callen: TimMc: well there is this: https://github.com/marick/enlive-tutorial

17:26 oskarth: callen: did https://github.com/swannodette/enlive-tutorial/ help?

17:26 AdmiralBumbleBee: TimMc: I do not, the project I'm using it in is not open source.

17:26 oskarth: oh

17:26 callen: oskarth: that's old, marick's is more up to date.

17:26 technomancy: also, nobody really cares about scraping

17:26 callen: what technomancy said goes for me too. I like the way it looks.

17:26 AdmiralBumbleBee: TimMc: however if you came up with some sort of example, contrived or otherwise, I'm fairly confident I could give a solution and explain it

17:27 callen: yeah I don't care about the scraping either.

17:27 technomancy: TimMc: for me at least more examples won't help. I can read the code just fine; it's just not clear which functions to reach for in which cases.

17:27 cemerick: callen: It sounds like you have all the primary enlive resources in-hand. The only thing I could suggest is our treatment of it in http://clojurebook.com, but that's hardly impartial advice.

17:28 callen: cemerick: I already own your book, I just haven't read it yet.

17:28 I need to figure out a way to extract a PDF from the kindle app though.

17:28 their app is annoying sometimes.

17:28 cemerick: Well, thanks for that. :-)

17:28 callen: yeah, Emerick, Carper, and Grand.

17:28 cemerick: for sure! I'm always happy to support my fellow programmers. I just really don't like the kindle cloud-reader thingie.

17:29 cemerick: $STANDARD_KINDLE_FORMAT_DISCLAIMER

17:29 edw: dakrone: ping.

17:29 dakrone: edw: pong

17:29 callen: cemerick: well, if you address enlive in the book then I'll definitely work through it and see what I learn. thanks for writing the book!

17:30 thmzlt: I haven't tried clojure for web stuff yet, but would you use enlive for the same thing you use hiccup?

17:30 pooya72: "member:callen: Nobody in Haskell is crazy enough to do HTML templating like Enlive" Is Heist pretty similar? http://snapframework.com/docs/tutorials/heist

17:31 sorry, * isn't*

17:31 callen: pooya72: I don't believe so, but I could be wrong.

17:31 technomancy: thmzlt: yeah, they cover the same space

17:31 edw: darkone: Hi. Using the 0.5.6 of clj-http, the sample client/post in the README throws an exception, a no such field error for DEF_CONTENT_CHARSET. You familiar with that?

17:31 pooya72: callen: seemed similar.

17:31 cemerick: callen: Yup, a full 10 pages or so.

17:31 dakrone: edw: let me give it a try

17:31 edw: Using Clojure 1.4.0.

17:31 Thanks.

17:31 pooya72: callen: that was much harder then enlive ;) with slices and stuff.

17:32 callen: pooya72: Heist seemed to be to be more type-aware binding/injection with partial template combination.

17:32 pooya72: and less "zip all the things!"

17:32 I mean, I'm sure people do plenty of partial application in enlive, but you get my meaning.

17:32 pooya72: callen: yeah that's true

17:33 dakrone: edw: seems to work fine: http://p.draines.com/1350422865069ee982aeb.txt are you talking about a different example?

17:33 callen: Heist doesn't really attempt to do comprehensive whole-tree treatments of the templates as transformations, and insofar as I can tell, that's generally discouraged in Haskell for web dev.

17:34 It's more bottom-up/mixin, like Jinja.

17:34 pooya72: callen: ok. I haven't used jinja

17:35 edw: dakrone: That's very odd. Yes, same example.

17:35 dakrone: edw: are you on a very old JDK? is something else bringing in a different apache client?

17:35 edw: Ring maybe?

17:35 dakrone: edw: what version of apache http client is your `lein deps :tree` showing? (assuming lein2)

17:36 xeqi: insert plug for lein-pedantic here

17:37 callen: xeqi: trying to reimplement cabal for Clojure? If so, I suggest you add some random breakage to make the experience more realistic.

17:37 dakrone: xeqi: but lein-pedantic is sooooo annoying if you can't change the project.clj you're working with ;)

17:37 pooya72: callen: maybe you should write a template engine like Heist :)

17:37 callen: xeqi: also, unnecessarily ceiling'd library versions.

17:37 pooya72: gods no. I'd just use danlarkin's clabango if I can't eventually figure out enlive.

17:38 akhudek: personally, I really like enlive and find that it mirrors the typical client side dom manipulations quite well (e.g. enfocus)

17:38 edw: It may be pomegranate. 4.2.1.

17:38 xeqi: callen: heh, figuring out how to use aether's dependency resolution, and what it would do, was fun enough

17:38 edw: Actually, 4.1.2 from pomegranate, 4.2.1 for clj-http.

17:39 dakrone: edw: do you have a full stacktrace?

17:39 callen: xeqi: I actually just got done dealing with some cabal breakage. It was so infuriating I uninstalled Haskell.

17:39 pooya72: callen: may I ask what part of enlive are you finding difficult?

17:39 callen: pooya72: please tell me you have scrollback. I don't really want to subject the channel to another review of enlive.

17:40 xeqi: ~logs

17:40 clojurebot: logs is http://clojure-log.n01se.net/

17:40 pooya72: callen: yeah I scrolled back and read your comments but still wasn't clear for me. It's ok don't worry about it, just curious.

17:40 edw: I did, but then I blew away my nrepl in Emacs. Let's hope the error didn't go away. ;)

17:40 callen: pooya72: it just leads to random clobbering of code due to cargo-cult and misunderstanding how it works at a fundamental level.

17:40 The plumbing is mysterious and arcane.

17:41 AdmiralBumbleBee: mysterious and arcane!?

17:41 xeqi: sounds like magic

17:41 AdmiralBumbleBee: it's very simple how it works, and the codebase is tiny :|

17:41 I feel like you're using some sort of weird forked version of enlive or something

17:42 pooya72: callen: ok, but what are you trying to do that you find difficult? maybe I just don't do advanced stuff with it.

17:42 dnolen: so anybody tried the core.logic 0.8.0 beta1 stuff? anyone? :)

17:43 edw: That solved it. Pomegranate depends on an old apache commons http.

17:44 Thanks!

17:45 akhudek: dnolen: no, but I did look at the source and feel you could teach me a thing or two about writing performant clojure.

17:45 kmicu: dnolen: I wanted to do this but core.logic 0.8.0 beta1 is some kind of cargo-cult in comparison to the previous version ;p

17:46 dakrone: edw: cool, glad to hear it isn't a bug

17:48 kmicu: and I like enlive more for templating then core.logic ;]

17:48 clojurebot: underscores in namespaces is a bad idea

17:48 dnolen: akhudek: ha, it's actually a little bit slower than the previous alpha on some of the constraint problems - but anything involving interval arithmetic got a lot faster.

17:48 kmicu: than*]

17:48 dnolen: kmicu: heh, what do you mean?

17:49 callen: core.logic registers for me mentally as, "thar be dragons!" and a wizard's grimoire with fire gouting out of it.

17:49 edw: dakrone: Always happy to report user error!

17:49 dakrone: edw: :)

17:49 dnolen: callen: :)

17:49 callen: dnolen: take that as a compliment. Also, what was the story with predicate dispatch? You mentioned that it had stalled or something but it was unclear to me why.

17:50 dnolen: callen: it just takes a lot of time to do that kind of work - and your enthusiasm level has to be up.

17:50 callen: plus I think for some of the things I'd like to do be able to reason sensible over integers might be useful - thus the cKanren work.

17:50 sensibly

17:51 akhudek: dnolen: we're still wrestling with the performance of our theorem prover, though the our main problem is probably still down to rule choices and some combinatorical issues in how we explore the proof space

17:51 callen: dnolen: aha! A use for my proposed theft of the minds of the Common Lisp community. They've got boundless enthusiasm for unusual things.

17:51 akhudek: dnolen: if you're going to the conj, I'll be happy to explain details to you there

17:51 callen: tbatchelli: which cafe are you working at?

17:51 xeqi: akhudek: is this a thorem prover in clojure?

17:52 akhudek: xeqi: yes, but designed for doing query compilation, so fairly special purpose

17:52 dnolen: akhudek: definitely. I did run into some nasty perf problems heading towards beta1 from the alphas actually - things that used to take 1000ms were taking 18000ms

17:52 akhudek: a lot of these things turned out to be silly errors - missing Object equals definitions, not failing fast enough in some cases.

17:53 xeqi: akhudek: ah, still nice to hear about people caring enough to use some formal methods

17:54 callen: oh this is actually relevant to my interests. I recently wrote a query compiler in Python. It's been painful.

17:54 dnolen: akhudek: there's actually a pretty interesting CL project that I found inspiring for my desire to work on core.logic - http://www.cl-user.net/asp/libs/screamer

17:54 callen: lots of difficult to overcome statefulness.

17:54 dnolen: oops that was for callen

17:54 callen: dnolen: thank you, taking a look, although it's not loading.

17:55 dnolen: callen: https://github.com/nikodemus/screamer

17:55 callen: dnolen: oh yeah, that sounds about right.

17:56 akhudek: dnolen: our performance issues are often of the form "can this problem even solve" or "can we reduce the time from 20 minutes to 1 minute"

17:56 how you explore the proof space can make massive differences in time

17:57 the end goal here is to be used as a compiler to produce fast code, so it's ok if it takes a while, but not if it takes days or forever

17:57 dnolen: akhudek: ah so that's internal? certainly users of core.logic encounter that issue :)

17:57 callen: dnolen: I like the end of the screamer.lisp, "Tam V'Nishlam Shevah L'El Borei Olam". Says a lot about what it was probably like to make that.

17:58 akhudek: dnolen: I guess I'm not surprised by that, theorem proving is hard :)

17:58 kmicu: dnolen: I refer to the cargo-cult templating discussion here during last hours ;] and seriously thank you for your great&hard work, as always, unfortunately I did not find applications for core.logic yet :(

17:58 callen: kmicu: don't distract him with our five minutes of hate.

17:58 kmicu: I got to kvetch with the best of them. t'was great. also I was reminded to read a book I'd already purchased.

17:59 kmicu: 5 min :)

17:59 callen: yeah yeah. be coy. fiiiine.

18:01 oh, look, an envoy from the land of lisp visited me on hacker news. http://news.ycombinator.com/item?id=4659597

18:01 technomancy: ^^ we were both right :P

18:02 he recounted exactly the same reasons I said CL users would.

18:03 technomancy: yeah, pretty hand-wavy

18:04 callen: technomancy: same old "Clojure is not Lisp and is thus defeat!" mantra

18:04 technomancy: no true scotsman

18:04 callen: the comment about direct access to the hardware wasn't unexpected either. They deeply resent that.

18:04 technomancy: yeah to be fair the JVM deeply sucks at unix

18:05 TimMc: AdmiralBumbleBee: At some point (I swear I will, eventually!) I'll read through Enlive's source, understand all of it, and write my own README or tutorial.

18:05 edw: Clojure is the Django of lisps for me: "For perfectionists with deadlines."

18:05 callen: I should write the "Confused Drunk's guide to Enlive"

18:05 edw: an excellent way of putting it. :)

18:06 jrajav: The JVM is fine on Unix if you're doing nothing but running the JVM

18:06 hyPiRion: edw: Huh, that may explain stuff.

18:06 brehaut: TimMc: hmm. some parts of enlives source provide enlightement, others only confound

18:06 * nDuff chokes on the idea of Django's ORM being written for perfectionists.

18:06 emezeske: jrajav: That means that UNIX is good at the JVM, but doesn't say anything about whether the JVM is good at UNIX :P

18:06 nDuff: (yes, they have a nice tagline)

18:06 brehaut: nDuff: wat‽

18:06 jrajav: Good point :P

18:06 AdmiralBumbleBee: TimMc: I don't know if you saw the diagrams I'm doing for the CDS core_overview, but once I finish that I'm planning on giving the same treatment to XML processing and then enlive

18:07 tbatchelli: callen, right now? I am sight glass

18:07 TimMc: AdmiralBumbleBee: Hmm, that would be cool!

18:07 nDuff: brehaut: ...I wouldn't say "worst. ORM. ever", but that's just because there are so many bad ones.

18:07 brehaut: nDuff: i fight it every day.

18:07 shaungilchrist: so I am working on something where I need "first class" symbols in js for edn interop - I was getting away w/ cheating and checking for strings starting with ":" to be treated as a keyword but thats obviously a hack at best.

18:08 TimMc: shaungilchrist: keyword? doesn't do it?

18:08 callen: tbatchelli: you're a predictable man :)

18:08 TimMc: Oh, misread.

18:08 technomancy: mmmm sightglass

18:08 shaungilchrist: I forgot to say - this is removed from clojurescript - stand alone node lib

18:08 tbatchelli: callen: not my usual hang out, but was meeting some guys here

18:08 callen: tbatchelli: I just remembered you spending a lot of time working from coffeeshops is all.

18:09 tbatchelli: technomancy: great coffee. I broke my 6mo run of coffee abstinence

18:09 shaungilchrist: one solution I can think of is a function tagged with the representation and a toString method so it can still be treated as a key etc. in objs

18:09 callen: wow.

18:09 tbatchelli: callen: yeah. My hangout is Bean There, in the Lower Haight

18:09 shaungilchrist: anyway sorry just had to type out loud but I think I am going to move forward

18:09 callen: tbatchelli: I remembered Haight, but not Bean There.

18:10 tbatchelli: callen: great tea selection :)

18:10 callen: I'll have to remember that. I love tea. Coffee too, but I love tea as well.

18:11 oich: Can you tell me how :exposes works in the gen-class macro (to expose a protected field in the super-class)? My attempts to use it have failed (no such field). Are protected-field-name and name, symbols in the syntax diagram: :exposes {protected-field-name {:get name :set name}, ...}

18:13 tbatchelli: callen: maybe we should get tea some day then!

18:13 callen: tbatchelli: maybe so! I'm in mountain view.

18:14 tbatchelli: oh, sunny MV

18:14 callen: there are a few downtown tea places that aren't bad here.

18:14 aperiodic: oich: yeah, they should be symbols

18:14 tbatchelli: callen: I'll ping you when I am around then

18:15 hiredman: oich: how in the world did you come up with that syntax?

18:16 oich: it looks like that generates gettter/setter methods

18:17 oich: (doc gen-class))

18:17 clojurebot: "([& options]); When compiling, generates compiled bytecode for a class with the given package-qualified :name (which, as all names in these parameters, can be a string or symbol), and writes the .class file to the *compile-path* directory. When not compiling, does nothing. The gen-class construct contains no implementation, as the implementation will be dynamically sought by the generated class in functions in an implementi

18:17 hiredman: doesn't give you direct access to the field

18:23 oich: hiredman: I figured it's making getters/setters like it says. I made a paste thingy: http://pastebin.com/sAuDsCW3 if you or someone cares to look.

18:24 The ressult is it says there is no such field PROTECTED_FIELD in com.example.Example

18:24 aperiodic: uh, how would that even work? you're trying to make two different methods with the same name...

18:25 :exposes {secret {:get getSecret, :set setSecret}}; then (.getSecret this)

18:26 oich: arity is different. but I'll try changing that

18:26 aperiodic: oh, good point

18:29 oich: ooh. it says no such field getProtectedField now. So, I guess name is supposed to be the field name? But then, I would think that what I tried would work.

18:31 aperiodic: hmm, that seems odd. normally (.method obj) should end up calling a zero-arg method of obj, if one exists, but otherwise ends up as a field access

18:33 does setting it work?

18:39 oich: err. weird. it either set it (after changing it from final) or at least completed without error.

18:39 callen: oh wow, I didn't know nutter chilled in here.

18:39 is he a Clojure user?

18:39 augustl: I really enjoy his posts about nitty gritty details in the JVM

18:39 technomancy: no, he's here for cross-pollination of ideas

18:40 callen: augustl: you saw that HN post too?

18:40 augustl: his posts are great.

18:41 aperiodic: oich: hmm, that suggests to me that for some reason the getter method isn't being seen when (.getSecret this) is compiled, so it's ending up as a field access

18:43 dnolen: improved to core.logic Datomic support based on rhickey's feedback - http://gist.github.com/3902508, kinda neat!

18:43 improvements

18:44 callen: forgive me and I hate to ask this, but is Datomic ever going to be a fully community-run project or will it remain a commercial endeavour?

18:44 aperiodic: oich: which would suggest a bug in either gen class or the dot special form, which triggers the part of my brain that yells at me that whatever's going on is probably my fault

18:44 callen: if you don't know what I mean, contrast with Postgres, Cassandra, etc.

18:45 aperiodic: oich: in the meantime, though, you can probably get around this will clj-wallhack: https://github.com/arohner/clj-wallhack

18:46 callen: aperiodic: I like the name a lot. Reminds me of playing quake.

18:46 technomancy: callen: is there anything about clojure's general history of community engagement that would lead you to believe that's remotely likely?

18:47 hyPiRion: Happy fifth birthday, Clojure :)

18:47 callen: technomancy: I feel like I'm being set up for a trap. I realize Hickey's generally had a "Moses coming down from the mountain" style, but I don't know what you mean to tell me.

18:47 technomancy: callen: nah that's basically it

18:47 callen: technomancy: I'm trying to determine if datomic is something I can use, or if I will always be on the hook to a commercial entity.

18:47 scottj: callen: I believe the hope of the authors is that it will be a commercial success and if that can happen while remaining closed source it looks like that will happen. if it is unsuccessful commercially then it may become open source/community/abandonware..

18:48 callen: to be fair, Cassandra started life as abandonware and has become increasingly vibrant.

18:48 oich: aperiod that looks interesting. But, I'm ultimately trying to generate a class. gen-class docs say that the methods are wrapped in clojure functions, so there is no access to the fields. Maybe this isn't pointing to the class. But, I'll try it. thaniks.

18:49 * technomancy files under "looks neat; hope its ideas are adopted in a system with agreeable licensing"

18:49 callen: technomancy: yeah...that's what I figured. I guess that's where I'm at too.

18:49 I really like the ideas, but I absolutely cannot hand over control my persistence layer like that.

18:49 * nDuff is in the "can't use it pending relicense" boat as well.

18:49 callen: technomancy: thanks for clarifying.

18:50 dnolen: callen: given the fact that mainstream languages / tools seem pretty dead set on destructive updates - I wouldn't hold your breath.

18:51 callen: dnolen: I'd rather use bit-basher persistence layers than give up control over my stack, sorry to say.

18:51 dnolen: callen: sure, I just meant it's unlikely that a similar product will appear anytime soon.

18:51 scottj: even if you can't use datomic for your companies main database, it seems you might be able to use the free version for small tools a la codeq

18:51 dnolen: open source replacement I mean.

18:51 aperiodic: oich: but `this` *is* an instance of the gen-classed class, otherwise the dot special form wouldn't work at all. like i said, i'm not sure exactly what's going on. you can always put the setter/getter methods in your :methods vector, and use clj-wallhack in their implementing fns (gross as that may be)

18:52 callen: scottj: a good idea and I might do something like that for experimentation's sake, but those aren't the kind of things I build.

18:52 * technomancy can wait

18:53 technomancy: I know the bigcouch people paying close attention

18:53 callen: technomancy: you work at Heroku, right?

18:53 technomancy: yeah

18:53 callen: technomancy: You mentioned you don't work on web apps. Do you work on their stack, their middleware, their postgres backend or what?

18:53 technomancy: currently working on the build pipeline

18:54 callen: technomancy: very cool. Re: BigCouch. I had a super-bad-bad experience with CouchDB vanilla, should I give them the benefit of the doubt?

18:55 dnolen: hey it's Clojure's BDay

18:55 brehaut: dnolen: 5 years old?

18:55 (publiclly)

18:56 callen: I think I discovered clojure 3 or 4 years ago. I don't remember exactly when. Are there logs for #clojure going that far back?

18:56 dnolen: callen: yes

18:56 brehaut: http://clojure-log.n01se.net/date/2008-02-01.html

18:57 callen: at the very least, at the time I discovered it, rhickey was still sitting in this channel and helped me with my classpath issues :)

18:57 very gracious of him.

18:57 I don't really know when he stopped having the time to do that.

18:57 brehaut: mid to late 2010

18:58 scottj: sounds like when datomic started

18:58 brehaut: also clojurescript

18:59 technomancy: callen: can't say I have much nontrivial experience with couch myself but I like its accessibility

18:59 callen: technomancy: I used to work on one of the larger couch clusters that existed at the time. It was an analytics stack.

19:00 technomancy: I have organs missing from that time period in my life.

19:00 The company that owned the setup has since been acquired for $XXXm. I should've taken that job offer. Sigh.

19:00 Somelauw: Does emacs have any feature useful for editing clojure that vim doens't have.

19:01 callen: Somelauw: being good at text editing. Having a real repl.

19:01 brehaut: vim has both those things

19:01 thmzlt: and here we start...

19:01 callen: brehaut: I know but I answered a farcical question with a farcical answer.

19:01 Somelauw: use whatcha like :)

19:02 thmzlt: I use vim for languages with syntax (non s-exp), emacs for clojure

19:02 Somelauw: callen: tmux + tslime is a repl good enough for me

19:02 devinus: what about notepad.exe?

19:02 callen: Somelauw: then keep using it!

19:02 devinus: thmzlt: me too, basically anything with s-exps i use emacs

19:02 aperiodic: Somelauw: their paredit probably doesn't have the weird quirks that paredit.vim does. i think that's pretty much it, though (full disclojure: vim user)

19:02 brehaut: devinus: 16 or 32bit notepad?

19:02 callen: Somelauw: I come from Python and CL. I have a pretty specific background that lends a lot of reasons to why I use Emacs.

19:03 Rope is one reason I use Emacs with Python. Slime is why I learned Emacs at the same time as Common Lisp...ages ago...

19:04 aperiodic: Somelauw: also, ew, tslime?? check out slimv or lein-tarsier + vimclojure. those give you actual editor-repl integration

19:05 Somelauw: aperiodic: It is easy to setup and it works.

19:06 aperiodic: Somelauw: fn arities in the bottom line while you type, leader-S to look up documentation, leader-M to print a nice representation of the current form after macroexpansion (invaluable when you're writing one)

19:06 i could not live without these things

19:07 Somelauw: aperiodic: what's wrong with tslime?

19:07 aperiodic: Yes, some code inspection would be nice.

19:08 aperiodic: Somelauw: maybe i'm confusing it with something else, but isn't that just the thing that blits text around using tmux's facilities for copy/pasting between panes?

19:08 Somelauw: from what i've heard lein-tarsier is very easy to set up (i use slimv personally, tho)

19:10 Somelauw: aperiodic: In one window I run vim, other window I run dmux+clojure repl. Then with vim plugin I send code to clojure repl in tmux. I will try lein-tarsier, but don't see much benefit in it.

19:12 aperiodic: the doc lookup for the current symbol alone saves me tons of time

19:12 i used to have your setup, and was happy with it; now, i would never go back. i'd highly recommend giving it a shot

19:14 emezeske: Somelauw: My favorite use of tmux: use the command ",et" to send the top-level form occupied by the cursor to the REPL, or ",ef" to reload the whole file

19:15 Somelauw: err, typo s/tmux/lein-tarsier

19:16 aperiodic: oh yeah, you even have to enter visual mode and do a% or smth to select what you want to send to the repl with tslime, right?

19:17 * emezeske doesn't know much about tslime.

19:18 Somelauw: aperiodic: no, ctrl-c, ctrl-c, sends current paragraph to tmux

19:19 Unless something is selected in which case it sends the selected stuff.

19:22 oich: aperiodic: about my gen-class fiddling, It shows the expected class and superclass name, but if I use Class.getDeclaredFields(), the field isn't there. There's a field called fieldInfo__var, which is the declared method name followed by "__var". If I try to access it java complains that I can't access a private static final field....

19:23 the declared field is protected

19:24 aperiodic: oich: does the getter method show up in the declared methods?

19:25 muhoo: the one annoying thing about both vim and emacs, is continually ending up with stray characters in files. in emacs, i continually end up with stray x, g, etc in there. with vim i end up with :wq, l 1, G, etc in there.

19:25 aperiodic: oich: you'd expect the field you're trying to access not to show up in the declared fields, though, since it's a superclass field

19:27 technomancy: muhoo: need foot pedals =)

19:27 * brehaut imagines emacs controlled fuzz pedals

19:27 brehaut: its both amazing and frightening

19:28 AdmiralBumbleBee: brehaut: you should see my desk :)

19:28 muhoo: that's so rock and roll.

19:28 it'd be easy actually, get a midi footpedal

19:28 technomancy: I would have foot pedals if I didn't have a standing desk

19:28 http://www.kinesis-ergo.com/fs-savant-elite.htm

19:29 muhoo: and a midi interface to your computer, write some easy code to decode the midi events

19:29 aperiodic: does anyone sell bluetooth foot pedals?

19:29 muhoo: http://www.behringer.com/EN/Products/FCB1010.aspx

19:30 emezeske: technomancy: Just get a DDR mat!

19:30 brehaut: muhoo: i have very bad memories of a very old version of that particular product

19:30 muhoo: brehaut: heh, the user interface is pretty miserable. but it does work.

19:31 there are custom firmwares for it too

19:31 brehaut: muhoo: i was thinking of the low quality ADC in the expression pedals that made the wah and volume functions have audible steps

19:31 AdmiralBumbleBee: making your own footpedals is very easy

19:31 bluetooth or wired

19:31 muhoo: an arduino

19:32 AdmiralBumbleBee: arduino leonardo + any switch you want

19:32 muhoo: actually, you could dismember a usb keyboard, and just run the wires for the keys out to foot switches or whatever

19:32 AdmiralBumbleBee: old sewing machine pedals can be had for $1, guitar pedals, power tool pedals etc..

19:32 takes maybe 20 minutes per pedal even if you're relatively clueless

19:33 muhoo: i want pictures of technomancy's new setup with keyboard pants and ddr mat.

19:35 brehaut: haha

19:45 oich: aperiodic: about gen-class, thanks if I look at the superclass it shows the field from java. Also, calling getProtectedField from java get's the field value. But, (.getProtectedField this) in clojure says "no such field getProtectedField", as does (.PROTECTED_FIELD this)...

19:46 tomoj: '(binding [] foo) is semantically equivalent to 'foo, yes?

19:46 aperiodic: oich: yeah, sounds like a bug in clojure somewhere. it appears that the (.getProtectedField this) is always ending up a field access, when it should be calling the method.

19:47 oich: I will make a wrapper class to expose the fields I guess.

19:51 aperiodic: oich: you should open up a JIRA issue about this: http://dev.clojure.org/jira/browse/CLJ

19:51 amalloy: as far as i know, tomoj

19:53 tomoj: oh, cljs 6da149d8 already fixed that

19:58 callen: has anyone here ever talked to a production engineer or persistence-side person from Facebook? If so, can someone explain to me why those people act like they work at the NSA?

20:00 Frozenlock: Would someone explain to me why facebook is popular?

20:00 while we are on the subject :P

20:02 muhoo: callen: facebook had funding from, IIRC, the NSA

20:02 * callen cocks eyebrow

20:02 pandeiro: keep = filter + map?

20:02 danlarkin: I think the answer is a lot more mundane than that... they just deal with a lot of personal info

20:02 callen: in my case, I'm talking about their general reticence with respect to discussing anything of substance about their backend.

20:02 danlarkin: no no, not that, I mean about their stack.

20:03 danlarkin: you can almost never get them to do anything other than namedrop and even then they creep about.

20:03 it's really strange.

20:03 danlarkin: perhaps they just consider it to be a competitive advantage

20:03 * callen rolls eyes

20:03 callen: Barely, they use the same hacked up Hadoop sub-clustering bullshit as everybody else. The only people with an "advantage" and something to keep secret are Google with megastore/spanner/colossus.

20:04 danlarkin: that's your opinion, not a fact

20:04 callen: the last secret they had was Cassandra and they futzed that one up badly. Took the community + DataStax to make that one awesome.

20:05 danlarkin: well, I'd like to be proven wrong, but none of them will. frickin. talk about it.

20:05 muhoo: Q: Why does KFC keep their recipe a secret/

20:05 A: They're embarassed of it.

20:05 callen: apply above to fb

20:05 pandeiro: muhoo: why does coca cola keep their recipe a secret?

20:05 callen: muhoo: I snorted loudly, thank you.

20:05 pandeiro: it's not a secret.

20:05 pandeiro: they just don't want to confirm present suspicions.

20:06 pandeiro: so why does pepsi still suck?

20:07 callen: pandeiro: pepsi's recipe aims for different properties.

20:07 pandeiro: pepsi's recipe is more orange and sweetness based. Coca-Cola's is crisper/tangier.

20:07 muhoo: just to clear the air and not spread rumours, i looked up the fb-nsa connection, and it's pretty thin: one of their early funders was ex ceo of in-q-tel, the cia's venture arm

20:07 technomancy: who cares; they both use corn syrup. ick.

20:07 hiredman: b

20:08 callen: muhoo: I didn't take it seriously / care

20:08 good to know though.

20:08 pandeiro: callen: coca cola still imports raw material from bolivia i believe

20:09 callen: but seriously, why would backend engineers be so reticent?

20:09 did somebody get in trouble in the past for saying something about their stack?

20:09 i"m starting to think I should just ask Quora.

20:09 muhoo: callen: apply for a job there. you can ask questions in the interview

20:10 hiredman: technomancy: speaking of corn syrup, what was that orange/lime drink from the seajure bbq?

20:10 it was nice

20:10 technomancy: hiredman: probably hansens?

20:10 hiredman: it's probably the easiest sugar-based drink to get around here

20:10 thorbjornDX: best soda: blue sky cherry vanilla cream

20:10 pandeiro: do you guys have schwepps citrus in the states?

20:11 callen: muhoo: actually, I tried that.

20:11 hiredman: technomancy: noted

20:11 technomancy: it used to be easier to get Jones'; I don't know if they've come across hard times with their distribution or what

20:11 callen: muhoo: motherlovers still didn't answer any questions so I dropped out of the process.

20:11 muhoo: next clojure survey: favorite caffeine/sugar infusion vector

20:11 callen: muhoo: I even got an on-campus lunch with a couple of their hadoop people, no dice.

20:11 there's some seriously suspicious stuff afoot there.

20:11 technomancy: I like how Henry Weinhard's claims to still be using "the original recipe from the '20s" yet it uses con syrup.

20:11 muhoo: callen: may i ask why you're concerned with what they're using as a back end?

20:11 callen: technomancy: maybe they invented corn syrup.

20:12 danlarkin: callen: why are you being so weird about this

20:12 who cares what they're using

20:12 callen: muhoo: it's my bag, so I want to learn from them.

20:12 danlarkin: and how could you possibly call it "suspicious"

20:12 in what sense could software be suspicious

20:12 callen: danlarkin: well, I care. I can't convince anybody to let me buy 1 billion users to hammer something to pieces.

20:12 it's not the software that's suspicious

20:13 muhoo: i suspect whatever they are using is a total POS. they're embarassed of it. it is held together with scotch tape and chewing gum. zuck himself hacked it together.

20:13 callen: it's their reticence about things like hadoop, their front-line caching/roll-ups in memcached and their memcached replacement that they won't speak the name of, etc.

20:13 hiredman: technomancy: huh, amazon will ship me a 24 pack

20:13 technomancy: muhoo: they use PHP fer crying out loud

20:13 muhoo: technomancy: exactly, my point :-)

20:14 pandeiro: so does google?

20:14 callen: pandeiro: nope.

20:14 nice try, but no cigar.

20:16 pandeiro: callen: no, i was browsing some API (thought it was drive but no) and got directed to a user.php

20:16 sure i am not wrong about that

20:16 i looked and was like wtf

20:16 technomancy: they probably use some off-the-shelf stuff for documentation/support or something

20:18 callen: generally they stick to C++, Java, and Python. With their acquisition of ITA they've chosen to go with the flow and allow Common Lisp where it was already established.

20:18 exceptions to that rule are generally front-end specific.

20:18 pandeiro: callen: go

20:18 muhoo: their google apps seems very python-heavy. everything else i've seen from them seems java-heavy.

20:19 s/apps/appengine/

20:19 obv question: are they using clojure at all anywhere?

20:19 callen: pandeiro: you know, you'd think? I'm not aware of much usage outside Chubby though.

20:20 pandeiro: I mean it's an accepted language, but I don't think it's used much more than Common Lisp.

20:20 maybe a google employee knows better.

20:20 muhoo: emezeske: ^^ ?

20:20 pandeiro: golang site mentions some stuff i think

20:20 i really wish my chromium history were plaintext

20:21 technomancy: muhoo: they were using it for their internal code indexing tool; not sure if that's still happening

20:21 callen: so...Chubby and code indexing is what we have so far. I'm trying to find any other publicly announced Google things made in Go.

20:21 technomancy: callen: oh the code indexing was clojure

20:22 and apparently steve yegge only got away with it because he has a famous blog?

20:22 callen: oh, haha. Okay, still just Chubby for team Go at Google though.

20:22 emezeske: muhoo: Unfortunately, I'm going to err on the side of caution and say very little. :P

20:22 callen: technomancy: he's kinda noisy. and by kinda, I mean extremely.

20:22 technomancy: callen: apparently it's paid off for him

20:22 callen: technomancy: honestly it seems other companies, such as Heroku, use Go more than Google does.

20:23 technomancy: we're probably just more open about it

20:23 callen: I think JGC / that CDN he works for use it a fair bit too.

20:23 technomancy: maybe, but it's not really a vote of confidence that they don't talk about it.

20:23 technomancy: they were pretty open and inclusive about their Java stuff.

20:25 technomancy: we make more noise about it because we want to emphasize the self-hosting aspect of our platform I guess

20:26 google is still figuring out how to be a platform

20:26 callen: technomancy: I guess, but I generally am a lot more apt to trust Heroku because of how open they are in comparison to otehrs.

20:26 in particular, I find the situation with golang a bit hypocritical. They want us to "take their word for it" on using the language yet they've been silent on it.

20:27 * technomancy shrugs

20:27 technomancy: not interested in languages that pretend interactivity doesn't matter

20:27 it's just not worth it

20:27 callen: technomancy: oh man, you know I've had the entire #go-nuts channel tell me that?

20:27 technomancy: unbelievable.

20:27 they tried to tell me I didn't need a debugger for practical or pedagogical reasons.

20:27 and that all I needed was printf.

20:28 sorry, fmt.Printf

20:28 aperiodic: callen: http://www.cloudera.com/resource/hadoop-world-2011-presentation-video-building-realtime-big-data-services-at-facebook-with-hadoop-and-hbase/

20:28 technomancy: callen: not worth it

20:28 callen: technomancy: blubbiest thing I'd ever heard from a programmer.

20:28 even Java developers recognize the utility of debugging, repls, generally.

20:28 technomancy: if people want to go back to punch cards that's their own business

20:29 callen: aperiodic: this is relevant to my interests. +1

20:29 ,inc aperiodic

20:29 clojurebot: #<core$inc clojure.core$inc@495929e7>

20:29 callen: hrm.

20:29 aperiodic: it's (inc foo)

20:29 callen: ,(inc :aperiodic)

20:29 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.Number>

20:29 callen: ,(inc aperiodic)

20:29 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: aperiodic in this context, compiling:(NO_SOURCE_PATH:0)>

20:30 aperiodic: just the bare form

20:30 no evaluation actually happens

20:30 well, you know what i mean

20:30 callen: I've seen people +1 each other before.

20:30 * callen brings up clojurebot's source

20:30 aperiodic: (inc nick)

20:30 lazybot: ⇒ 1

20:30 callen: (inc aperiodic)

20:30 lazybot: ⇒ 4

20:30 callen: bwaha!

20:30 aperiodic: thank you.

20:30 aperiodic: you're welcome

20:31 we're still gonna be lining up for dinner at the conj by lazybot karma, right?

20:31 callen: aperiodic: anyway, that said, I'm actually familiar with the Messenger story for Facebook with Hbase.

20:32 aperiodic: it's a by-product of the fact that most of the engineers working on it were stolen from Yahoo and other hadoop shops. Hadoop is simply what they knew.

20:32 this should be a good talk.

20:35 pandeiro: technomancy: you browser with w3m in emacs mostly?

20:37 technomancy: pandeiro: no, I use conkeror

20:38 pandeiro: technomancy: is w3 bad?

20:38 technomancy: yeah

20:38 w3m is fine

20:38 but w3 is ancient and unmaintained

20:39 pandeiro: ah ok

21:20 thmzlt: I'm going to start hacking on web thing here with compojure, what should I use to start the server inside nrepl? ring-serve?

21:21 augustl: hmm, getting a lot of "java.lang.OutOfMemoryError: PermGen space" when loading 6 or so clojure apps into the same JVM via jetty. My current permgen space is 64 megs, should I increase it? And is this a common clojure specific problem? I'm using openjdk 1.6

21:21 thmzlt: I use lein-ring, works great for me

21:21 err never mind, missed the repl part ;) Never done that

21:23 hiredman: augustl: the permgen space is where the jvm keeps class data

21:24 augustl: if you are generating new class data a lot, or have lots of classes to start with, then you should have a larger permgen

21:24 augustl: I'm not generating classes run-time at lesat

21:24 hiredman: loading clojure code, unless it is aot compiled generates classes

21:25 augustl: so I suppose increasing it is the right thing to do (it probably won't just hit the roof after another couple of hours of leaking)

21:25 hiredman: but hopefully only one class is generated per file?

21:25 hiredman: some servlet containers have issues with leaking classes if you redeploy wars, but that has to do with a particular life cycle

21:25 augustl: no

21:25 xeqi: thmzlt: I use https://www.refheap.com/paste/5915; which came from the heroku template

21:25 hiredman: it is at least one per fn

21:26 xeqi: well, slightly modified from there

21:26 augustl: hiredman: I think my actual question is, does the number increase infinitely, or is clojure smart and generates the required classes once?

21:27 hiredman: augustl: I think you may have misunderstood

21:27 augustl: loading clojure code causes it to be compiled to jvm bytecode i.e. some number of classes

21:27 augustl: so far so good :)

21:28 hiredman: "generates the required classes once?" just doesn't make sense

21:28 augustl: is clojure code only loaded once per jvm?

21:29 hiredman: it is loaded and compiled whenever you load/reload it

21:30 augustl: I see

21:31 Sgeo: Quick question

21:32 ,(for [i [1 2 3] j [4 5 6]] [i j])

21:32 clojurebot: ([1 4] [1 5] [1 6] [2 4] [2 5] ...)

21:32 Sgeo: Suppose I want something like for that works differently, such that if the sequences were infinite, any given combination would be reached in finite time?

21:32 ,(repeat 1)

21:32 clojurebot: (1 1 1 1 1 ...)

21:33 Sgeo: (for [i (repeat 1) j (repeat 2)] [i j])

21:33 ,(for [i (repeat 1) j (repeat 2)] [i j])

21:33 clojurebot: ([1 2] [1 2] [1 2] [1 2] [1 2] ...)

21:33 Sgeo: Hmm.

21:33 amalloy: Sgeo: not possible without consuming infinite memory

21:33 hiredman: generally in something steady state like a server you want a constant permgen size (e.g. it should not be growing) but large enough to hold everything

21:34 Sgeo: amalloy, hmm?

21:34 I'm pretty sure there's an algorithm that would do it

21:34 hiredman: at work we set it to 256m, I forget if that is out of necessity, or just a nice high number

21:34 amalloy: Sgeo: not without holding onto the head of at least one infinite sequence

21:34 augustl: hiredman: I see now why containers and their classloaders might be a problem..

21:35 since they might not purge permgen stuff from old wars

21:35 Sgeo: What does Haskell's Control.Monad.Omega do?

21:35 * Sgeo guesses that it's likely that it will do that

21:36 amalloy: Sgeo: you can see ninjudd's effort on this topic at https://github.com/flatland/useful/blob/develop/src/useful/seq.clj#L73, but it really doesn't work for actual infinite seqs

21:36 hiredman: augustl: purge the permgen!?!? gc'ing the permgen is actually a relatively recent feature in the jvm world (maybe java 6?)

21:37 and java 8 is supposed to get rid of the permgen entirely

21:37 * Sgeo just wants to be able to use Fermat's Last Theorem in his Mission Impossible 4clojure question

21:37 amalloy: hiredman: sounds about right to me, though i think different jvm vendors added it at different times

21:41 augustl: hiredman: oh, nice

21:41 doubled permgen space from 64 to 128, let's see how that works out

21:48 jcromartie: can someone explain resource loading to me

21:49 augustl: jcromartie: resources from the classpath, you mean?

21:49 jcromartie: yeah

21:49 like, where do I put them in my Clojure (Lein) project

21:49 and then how do I reference them

21:49 augustl: jcromartie: that depends (tm)

21:49 jcromartie: :) fun

21:49 augustl: jcromartie: the classpath is a run-time thing, so the source can be anything. You typically embed stuff in your .jar or .war by putting it in resources/ (default, can add other folders)

21:50 jcromartie: to get a URL to something on the classpath, use (clojure.java.io/resource path-thingie)

21:51 jcromartie: so if I have a lein project, with a src/my/ns/resources/foo.txt

21:51 augustl: the folder leiningen by default adds to the classpath is the top-level resources/ folder

21:51 so not in src/whatever

21:51 jcromartie: ah, not src

21:51 ok

21:51 I thought leiningen added src/

21:52 I suppose I could inspect the classpath

21:54 ,(get (System/getProperties) "java.class.path")

21:54 clojurebot: #<SecurityException java.lang.SecurityException: denied>

21:54 jcromartie: right?

21:54 clojurebot: Equal Rights for Functional Objects is Baker's paper on equality and why it's impossible to define sensible equality in the presence of mutable data structures: http://www.pipeline.com/~hbaker1/ObjectIdentity.html

21:54 jcromartie: oh yeah

21:54 augustl: jcromartie: hmm, not sure if "src" is actually on the classpath

21:54 jcromartie: ah well this is instructive

21:54 augustl: I don't think it is, but I don't know what I'm talking about

21:54 jcromartie: yeah, in my project here...

21:55 aperiodic: there's no need for it to be, since there are no classes in there

21:55 jcromartie: test, src, dev-resources, resources, target/classes, then a bunch of .m2

21:55 the need is for Clojure source loading

21:55 Clojure looks for namespaces as .clj files on the classpath

21:55 aperiodic: oh, i suppose you're right

21:56 jcromartie: sometimes I know something :)

21:56 hiredman: clojure's runtime loads classes and clojure files both via classloaders

21:57 augustl: out of curiousity, why is clojure typically shipping .clj files instead of .class files?

21:57 xeqi: jcromartie, aperiodic: leiningen does add src/ to the classpath, and the jvm will look there for resources; for that example (io/resource "my/ns/resources/foo.txt") should work

21:57 which is nice for some things, like enlive templates

21:57 augustl: does clojure keep extra stuff in memory after compilation that doesn't fit in class files, since clojure is more dynamic than what the JVM classfiles support? </wildtheory>

21:58 jcromartie: I think the gap in my understanding is how resource paths work

21:58 xeqi: though the resources/ directory is usually used for thing not directly related to a src file (css, js, etc)

21:58 hiredman: augustl: clojure's abi is not fixed

21:58 jcromartie: augustl: absolutely, since loading a class results in runtime results… i.e. (def x ...)

21:58 hiredman: so .clj files tend to be more portable across versions of clojure

21:59 augustl: no

22:00 augustl: hiredman: ah, I see

22:00 hiredman: internel methods in the clojure runtime that the compiler generates calls to might change names

22:21 Apage43: aw nuts

22:21 finally ran into being unable to use clojure.walk on records

22:52 thmzlt: xeqi: thanks for that refheap, I got it work, but I had to use the :join? false so jetty wouldn't block my repl

23:01 amalloy: augustl: fwiw i wouldn't be astonished if six copies of the clojure runtime need more than 64M of permgen - it's not a tiny library

23:02 but aside from the usual problems with containers (eg tomcat, jetty) hanging onto the permgen of undeployed applications, clojure doesn't generate any additional classes once it's done loading .clj files

23:04 thmzlt: xeqi: oh, didn't see you had that too, my bad

23:17 augustl: amalloy: makes sense, 64m isn't a lot

23:17 and it's a bunch of uberwars too, so there are quite a few megs of duplicate dependencies to be loaded

23:18 amalloy: yeah, that makes sense

23:19 64m is actually a lot for like...your application heap, even though it doesn't sound like much. eg, lazybot and 4clojure both run with 40m or so of heap

23:19 obviously if you're doing data-driven stuff you will need a much larger heap, but for basic webserver stuff you need like nothing

23:22 (i suspect lazybot and 4clojure would be perfectly happy with half as much, but it hasn't been urgent to try)

23:22 augustl: which container are you using btw?

23:22 amalloy: for those? none

23:22 augustl: ah

23:22 arrdem: amalloy: is that licence for me to taunt the bots and drive up memory usage?

23:22 amalloy: just nginx in front of embedded jetty

23:22 sure thing, bro. they're pretty stable actually

23:23 augustl: at work, a jetty container with a small number of apps running in it. usually just one, i think, but maybe it's two

23:28 Raynes: amalloy: At least two now, cuz my project.

23:29 Which means one that is actually used. ;)

23:34 mindbender1: I have observed that when people name their functions to be like nouns it's most certainly a precursor to wrong reasoning about the problem domain

23:39 amalloy: sounds like tosh to me, but of course you're welcome to name all your functions verbs

23:40 or adjectives? i bet functions named like adverbs probably are precursors to being too dang clever

23:43 mindbender1: it also predetermines what you may or may not take as argument further complecting the clarity of the function in question

Logging service provided by n01se.net