#clojure logs

2009-12-31

00:01arohnertechnomancy: lexical scope is implemented as a stack of maps in the compiler
00:01arohnerit's in compiler.java
00:02technomancyyeah, I've got that in front of me... but it's 5000+ lines. =)
00:02technomancyif they're real clojure maps then they must be copied from the enclosing scope
00:02technomancysince otherwise the enclosing scope couldn't have local-clearing done due to immutability
00:03arohnercheck out registerLocal()
00:03arohnerthat will point you at enough variables to keep you busy
00:03arohner:-)
00:03technomancyheh
00:03technomancythanks
00:03arohneryes, it's a real persistent map
00:04technomancysince functions compile to methods, function locals are just method locals that get nulled out after the function returns IIRC, but the enclosing scope is an IPersistentMap
00:06arohnerLetExpr is also worth checking out
00:07technomancysoooo freaking spoiled by clojure
00:07technomancymy brain cannot hold a single method that's longer than a page
00:08devlinsftechnomancy: a direct deref causes the error too (no surprise)
00:08technomancyactually, that has nothing to do with clojure, I couldn't do that before I learned clojure either. never mind.
00:08technomancydevlinsf: yeah, in Delay.java deref is implemented as just calling force
00:09devlinsfYeah, I'm looking at the source too. Still, testing beat analysis every time :)
00:09danlarkinclojure makes me wary of namespaces that are much longer than a page :)
00:09danlarkins/namespaces/files/
00:10devlinsftechnomancy: Hey, I just used a future instead
00:10devlinsftechnomancy: worker properly
00:11technomancyhuh. futures are also thin wrappers around fns, albeit with a little more JVM infrastructure pulled in.
00:13devlinsfchecking out future-call....
00:13hugodAdding a (println x) after (do-something x) makes things work too - is the argument being optimised away?
00:15devlinsfhugod: what about (println :foo) ?
00:16hugoddevlinsf: that worked as well
00:16devlinsfHmmm... futures are wrapped in an agent
00:18technomancydevlinsf: sort of... I think they actually just share a thread-pool with agents
00:18devlinsfYeah, you're right
00:20technomancywell the main thing I'm learning here is that I'm not cut out to write a compiler
00:20devlinsfclojure.lang.Compiler?
00:22devlinsfIt would be nice to have some of the static classes in their own package
00:22devlinsfeasier to follow
00:22devlinsfat least, I think so
00:23technomancybut I don't know Java, so...
00:24devlinsfI understand why it's like that. It's not an easy inheritance system to get right
00:25devlinsfBut the random blocks of dead code 50 lines long?
00:25devlinsfIt'd be nice to clean those out
00:26technomancywell I'd assume they were commented out before the move to git
00:26technomancyback when finding stuff from your history was hard. =)
00:27devlinsfYeah. Once 1.1 is official, then I'll bring it up
00:29technomancywouldn't agonize over it too much since cinc will make it go away.
00:34hugodwriting the delay body as a call to a local function closing over x works. adding a {:once true} hint to the local function breaks it..
00:35devlinsfhugod: But writing a local fn and closing over delay does NOT
00:36technomancyhugod: what's :once?
00:37hugodno idea - its used in the delay macro delay
00:48technomancyline 3845 of Compiler.java
00:48technomancyif(fn.onceOnly) { fn.emitClearCloses(gen); }
00:48technomancy
00:49technomancylooks like :once is only used for lazy seqs and delays
00:49technomancyI wonder if lazy seqs would exhibit the same problem
00:50technomancybut I'm headed off for today; bye folks.
00:50Mec_is there a simpler way to write: (. (SomeClass. initValue) method)
00:52devlinsf(-> initValue Someclass. .method)
01:16defnwhat's the difference between rest and next
01:17defn,(doc rest)
01:17defn,(doc next)
01:18defnnevermind
01:19replaca_next supports nil punning
01:19defn,(rest '()) => ()
01:19chousernext forces an extra step of a lazy seq in order to return nil it's empty
01:19defn,(next '()) => nil
01:19defn*nod*
01:19replaca_yup, you got it
01:19defnty
02:10hiredman~ping
02:10clojurebotPONG!
02:10chouseryay
02:12chouserI think the problem is that, because the last expr in a try block produces the value that will be returned, it is compiled in a "return" context (a.k.a. tail position)
02:13chousertherefore the locals are cleared before calling the final function
02:14chouserbut if that final call throws an exception, you end up in the catch clause with your locals cleared.
02:16chouser,((let [x :foo] (#^{:once true} fn* [] (try (#(throw (Exception.))) (catch Exception e (println "x:" x))))))
02:16clojurebotchouser: I don't understand.
02:16chouser:-(
02:21chouseremitClearLocals protects against this problem by using localsUsedInCatchFinally, but emitClearCloses (used only when :once is true) does not.
02:30chouserbut the solution is so very far beyond me
02:31chouserI guess the simplest might be to skip clearing of closed-overs that are used in catch/finally clauses, but I don't think those are currently tracked.
03:17LauJensenMorning team
03:17defn'lo Lau
03:20defnLauJensen: welcome to the monkey house
03:20LauJensenI sure like them monkeys :)
03:21defni always carry a minimum of three monkeys
03:21defn..just in case..
03:25defngood evening cgrand
03:29neotykmorning
03:29neotykcan someone help with clojure-test-mode
03:29neotyk?
03:30defnneotyk: what about it?
03:30neotykwell I don't have it :P
03:31defnwhat editor do you use?
03:31neotykand when I do M-x package-install
03:31neotykemacsitor
03:31defnwhat's emacsitor?
03:31neotykemacs
03:31defnwhen you do M-x package-install??
03:32neotyknow, in running session
03:32neotykso after M-x package-install
03:32neotyki say clojure-test-mode
03:33neotykand get message that swank-clojure.el exists
03:33neotykand no clojure-test-mode is installed
03:33neotyk:/
03:34neotykis elpa recomended for aquamacs?
03:34neotykor should I focus on manual procedure
03:37LauJensenneotyk: It works I know that, but not if its recommended
03:41cgranddefn: good morning (or whatever time it is in your timezone)
03:41neotykLauJensen: how do i get test mode?
03:41LauJensenneotyk: That I don't know - I'm very uncomfortable in OSX - I'm just saying that the ELPA install for Clojure-mode works fine
03:41neotykclojure-mode is ok
03:41neotykclojure-test-mode is fail
05:39LauJensenI've added a custom search to my site, which runs through hackernews, lambda-the-ultimate, clojure.org etc for whatever you search for - is that usable for anyone, or just bloat? http://www.bestinclass.dk/index.php/blog/hackersearch/
05:43LauJensenI mean, there's one definite advange, if you search for "ikeda map" you actually get a Clojure implementation as the first hit - where else do you get that? :)
05:51vyLauJensen: 1337.
05:51LauJensenExactly
06:33fliebelGood morning
06:35fliebelIs there any way I can use a delay/future/atom/whatever without the need to use @ every time?
06:38fliebelOr the other way around, use @ one a value if I'm not sure if it needs to be dereferenced or not.
06:49somniumfliebel: if youre not sure if its mutable then YDIW
07:00fliebelYDIW? what is that?
07:00somniumfliebel: you're doing it wrong ;)
07:00fliebelah...
07:01somnium@foo expands to (deref foo), so you could write a fn that does that
07:02fliebelWell, the point is that if I put a delay in a map and along the way something does something to the data and puts it back, the rest of the application screws up thinking that it needs to @ it.
07:02fliebelYea, right now I wrote my own macro with a try in it.
07:04somniumfliebel: if you access a delay with force why do you need deref?
07:07fliebelsomnium: whoa! That is magic! force just returns any value, that will work!
07:07somniumfliebel: no...
07:07fliebel?
07:07somniumfliebel: delay is about laziness, delaying evaluation
07:08somniumfliebel: atoms are about identity and state
07:08fliebelsomnium: I know, I mean that (force 1) just works, while (deref 1) throws.
07:09Chousukefliebel: check whether it implements IDeref
07:10fliebelIf I write delay on the bottom of a -> macro, will that delay the whole ->?
07:10Chousukehm, yes.
07:12fliebelcool
07:12fliebelI guess that would not work if -> where a function :)
07:13fliebelChousuke: can you help me unravel another stacktrace?
07:15fliebelhttp://gist.github.com/266711
07:15fliebelI hate those things… Wading through Java and Clojure internals to find your own function.
07:16cemerickfliebel: there's a lib somewhere in contrib that will filter out the noise, if you're so inclined
07:16Chousukehm, wasn't it moved to clojure itself?
07:17fliebelcemerick: ah, godsend!
07:17Chousukeclojure.stacktrace, as of 1.1
07:18fliebelHow do I use it? Just require it somewhere?
07:18Chousukeyeah.
07:19Chousukethough unless you get the exception in a repl, you'll have to catch it and print the stacktrace in the catch block.
07:20fliebelHmmm, so just wrap everything in a try?
07:21Chousukeor run stuff from the repl
07:21Chousukesince you can access the last exception as *e
07:21fliebelhmmm
07:23Chousukeanyway, in that case it seems the error is in the utterson.core/reader function
07:24ska2342can someone please give me one example each for a "namespace-qualified" and a "package-qualified" symbol? Are they different in any way, except that one names Clojure-symbols and the other Java-classes?
07:24Chousukeska2342: they're similar.
07:25ska2342Chousuke: similar, yes, but exactly the same? Have you ever come across an example where the order of evaluation mattered?
07:25Chousukeorder of evaluation?
07:26ska2342Chousuke: according to http://clojure.org/evaluation the namespace-qualified symbols are resolved first.
07:26ChousukeI don't think it matters
07:26Chousukeyou can never have a java class that would conflict with a clojure namespace.
07:27ska2342Why?
07:27Chousukewithout getting weird errors everywhere, that is
07:28ska2342Hm. It's just that I'd like to *know* ;-)
07:28Chousukethe names should be unique. it'll just be a naming conflict. :/
07:30ska2342My problem here is "should be" vs. "are". Can't be vague when doing documentation.
07:30ChousukeI guess a package-qualified symbol is foo.bar.java.Class(/somefield) and a namespace-qualified is foo.bar/something
07:31Chousukewhere foo.bar is a namespace, of course.
07:31ska2342Yes, that is my understanding, too. In that case they just look the same.
07:57fliebelWhat are the advantages and intended uses of structmap?
07:57Chousukesaving memory if you have lots of maps with the same keys
07:58cemericklargely replaced by deftype
07:59fliebeldeftype? *opens repl*
07:59fliebelUnable to resolve var: deftype :(
08:00cemerickfliebel: it's only in the 'new' branch
08:00fliebelI'm not on new...
08:06fliebelSo far defstruct is only giving headaches… Key's not in the struct are not showing up.
08:36fliebelHm, this is not the git channel, but does anyone know how to checkout master undoing merge I did?
08:37fliebelIt just shows "Your branch is ahead of 'origin/master' by 4 commits"
08:38balintfliebel: do you want to completely discard the 4 latest commits?
08:39fliebelno… well I don't know, i'm new to git. I merged in a branch. which contained 4 commits I guess… but I want to.. uhm unmerge that.
08:40fliebelnever mind… I'm just playing around, I don't desperately need it.
08:40Chousukeyou can copy your current master to another branch
08:40Chousukejust do git co -b saved-master from the master branch
08:41Chousukethen git co master && git reset --hard origin/master
08:41lpetitmemorize the version you want to take master back. Then edit .git/refs/heads/master and replace the version. That should do the trick, as far as I understand git
08:41lpetitafter all, master is just a label on a particular commit
08:42Chousukeyou shouldn't need to edit any files directly :)
08:42balintlpetit: that's a bit "low-level" :)
08:42lpetitI understand, but that's the beauty of the simplicity of git :)
08:42fliebelIt's not important enough for that stuff… I wanted to add a file before the merge instead of after, just to see how merging works so that I'm prepared when I actaully need to merge things for real, now it just did a fast worward, which is not half the fun :(
08:42balintfliebel: you can check what version want to return to by: git show master@{4}
08:43lpetitIt's no porcelaine, not even plumbing, it's digging :-)
08:43Chousukebalint: he wants to return to origin/master
08:43Chousukewhich can be done with git reset --hard origin/master
08:43lpetitindeed, that's the way to go
08:43balintChousuke: ah, yep, you are right
08:43fliebelbrrr, scary… I'll try it :D
08:44Chousukefliebel: save your commits in another branch first
08:44balintfliebel: just make sure you still have the changes on another branch (e.g the one you merged master with) git reset --hard deletes them for good
08:44fliebelChousuke: everything important is in simplify...
08:44Chousukeyou can actually do it by just writing "git branch saved" on your current master
08:44lpetitfliebel: as long as you won't run a "prune" command, your commits won't be lost. Just steganographied :-)
08:45Chousukeit takes about the blink of an eye so you lose nothing by saving things :P
08:46fliebelah, it worked...
08:46Chousukethen you can always checkout the saved branch and take a look at it.
08:46ChousukeI usually don't touch master at all
08:47lpetitfliebel: git is like clojure. Persistent trees and the like. Never does a destructive update. And garbage collection (of commits that are not referenced from any label -aka branch name-) is triggered by you, so in the mean time, it's still possible to view "dangle" commits
08:47ChousukeI do all development on other branches and then just generate patches against master. or merge master and the dev branch and then push the dev branch as a new master :)
08:47fliebelhmmm
08:48Chousukegit it really interesting in that you can actually combine completely different repositories
08:48fliebelwhat does this imply> error: Entry 'src/utterson/plugin/tagspages.clj' not uptodate. Cannot merge.
08:48Chousukeyou can just pull a branch from a random repository into a local one.
08:48fliebelChousuke: So I can merge like.. jQuery into Utterson? :P
08:49Chousukewell, not merge. not very easily
08:49Chousukebut you could have them in separate local branches.
08:49fliebelthat is fun...
08:49Chousukeit's not very useful most of the time though.
08:50Chousukeusually you'd like branches to be part of the same tree...
08:50fliebelCan I pull one file from a previous revision and put it in the current one?
08:50fliebelSay… 4 revisions ago...
08:50Chousukewell, that's not pulling
08:50fliebelcheck out, revert, whtever
08:51ChousukeI think git co HEAD~4 -- filename would do it
08:51Chousukethen you of course need to git add the changes
08:51Chousukeand commit them
08:51rhickeyaargh - clojure-version still has trailing dash for release version
08:52Chousukethe index is another feature of git I like.
08:52lpetithadn't it be corrected ?
08:53Chousukeit gives you more control over what you actually commit. :)
08:53Chousukeso I can bash on files without committing for a long time and then split out the changes into separate commits. helps keep things clean
08:54fliebelhuh? cool...
08:54Chousukefliebel: git add --patch
08:54rhickeylpetit: maybe when qualifier is missing, but other things are broken then
08:54Chousukefliebel: though it's not very user friendly
08:54fliebelhm
08:54Chousukefliebel: you can basically stage chunks of code instead of whole files
08:54Chousuke(staging = included in next commit)
08:55fliebelChousuke: that must create a maze in your mind what belongs where and work with which code...
08:55Chousukefliebel: well, sometimes.
08:55Chousukefliebel: but sometimes it's also easy to see that you have made two unrelated changes in one file
08:55Chousukecombined with rebase that's also interesting :P
08:56Chousukewhen I was mostly done with my reader I cleaned it up and that included rebasing it against a recent master, combining and splitting commits in the process :P
08:57Chousukebecause I had some "random fixes" and "blah" commits in my local history
08:58lpetitrhickey: humm, I'm at work, but maybe I can take a quick look at that
09:00rhickeylpetit: thanks, but I'm on it
09:00lpetitok
09:07lpetitrhickey: want to release 1.1.0 before the end of the year ?
09:07rhickeylpetit: before the end of the hour, I hope
09:07lpetit:)
09:12lpetitWas thinking (related to my reflexions on how to port an existing application to clojure) : doesn't we conflate two different things by creating new types via deftype, thus imposing 1/ a single implementation of datastructure for the type, and 2/ a single type for a datastructure ?
09:13lpetitFor 2/, I mean maybe I want to create a personalized datastructure with high performance, so I use deftype for this purpose. But then, I can just plug one implementation of a protocol for the type. If I want the exact same datastructure definition for another type, I have to recreate this type from scratch.
09:17lpetitCurrently, I see types that can be defined via deftype more like "technical types" aimed at allowing clojure core datastructures be written in clojure. But I "feel" it couldn't scale well for other use cases (more general business use cases). Something having to do with the protocols/types and multimethods impedance mismatch (sort of)
09:19fliebel,(println "welcome back clojurebot, where have you been?") ;Is he really back?
09:19clojurebotwelcome back clojurebot, where have you been?
09:20lpetit,(clojure-version)
09:20clojurebot"1.1.0-alpha-SNAPSHOT"
09:20lpetit,(doc deftype)
09:20clojurebot"([name [& fields] & [[& interfaces] & methods]]); Alpha - subject to change Dynamically generates compiled bytecode for an anonymous class with the given fields, and, optionally, interfaces and methods. The Name will be used to create a dynamic type tag keyword of the form :current.ns/Name. This tag will be returned from (type an-instance). A factory function of current.ns/Name will be defined, overloaded on 2 arities, t
09:20lpetitseems so
09:22fliebelBleh…. If I require a ns in the ns declaration, how can the required ns use things from it's source?
09:23lpetitfliebel: huh ?
09:23fliebelhaha, it's basically a circular dependency. I hit those over and over :(
09:24lpetitfliebel: time to refactor things then :-)
09:25fliebelyea… Is putting all the stuff needed by more than one in a third ns a good plan?
09:26fliebelI have a defstruct that I need in multiple places
09:27rhickeyhttp://clojure.blogspot.com/2009/12/clojure-11-release.html
09:27fliebelHurray! (?)
09:28lpetitfliebel: probably
09:31lpetitrhickey: splendid !
09:37lpetitAm I totally wrong/off-topic with my above reflexions, or is it just not the right time frame for me to speak about that ?
09:53cemerickreplaca: the new docs are looking pretty great, I hadn't looked at them lately
10:03fliebelHow can this trigger a reflection warning? #(.contains #^String (or (:tags %) "") #^String (:body a))
10:05fliebelTechnically speaking contains takes a CharSequence, what do I do with that? It does work with a string...
10:16fliebelMeh, moving the #^String a bit worked… silly stuff.
10:16lpetit,(#(.contains #^String (or (:tags %) "") #^String (:body {:body "c"})) {:tags "hello"})
10:16clojurebotfalse
10:17lpetit,(set! *warn-on-reflection* true)
10:17clojurebotjava.lang.IllegalStateException: Can't change/establish root binding of: *warn-on-reflection* with set
10:17lpetit,*warn-on-reflection*
10:17clojurebotfalse
10:17chouser'or' loses type hints
10:18lpetitoh
10:18chouserapparently.
10:18chouser:-/
10:18chouserI haven't had my tea yet -- can't think... is there any way for a macro to get at metadata put on its calling form?
10:22devlinsfrhickey: Congrats on getting 1.1 out the door!
10:36defnchouser: The return value of invoke() is the value of the call expression. If the function call form has metadata, it may be used by the compiler, but will not be part of the resulting value.
10:40rhickeydevlinsf: thanks for your help, and everyone else's!
10:40devlinsfn/p
10:40rhickeychouser: not right now
10:41BrianB04Morning all.
10:42devlinsfOooh, just noticed something.
10:42devlinsfShould someone create a contrib 1.1 compatible branch?
10:42lpetitBye all, cu next year !
11:25BrianB04I have a quick question: After building clojure + clojure-contrib, can they be moved, or do they hardcode the locations of each other anywhere during compiling?
11:27ChousukeBrianB04: you can move them
11:28BrianB04Chousuke: Great, thanks much. I built them in ~/src, but I have a habit of clearing that out from time to time.
11:29the-kennyBrianB04: They're just normal .jars. You can do with them everything you can do with every other jar
12:29rbehi
12:35arohnerrbe: hi
12:40gkoHello: which swank-clojure should be used? jochu's or technomancy's?
12:44ghotlii'm using technomancy's on ubuntu 9.10 with emacs23 and it works just fine
12:45gkoOK, I'll try the technomancy's swank-clojure/clojure-mode.
12:46ghotlii had a lot of trouble getting swank-clojure to work on 9.04
12:46ghotliif that's what your using.
12:46ghotlii finally gave up and upgraded to 9.10 and it behaved.
13:06gkoYeah, I haven't used it for 4 months and thought I'll update the whole stuff... The jochu version have changed a lot since then..
13:14RaynesIs there a generally agreed on blog post or something that details setting up Emacs with Slime for Clojure for new users? I've been set up forever, but I'm not sure what to tell my friend who want's to get into Clojure. :\
13:15RaynesI mean, I suppose I could get him set up, but I'd rather not reiterate instructions for installing ELPA and such if possible.
13:24aldebrnRaynes, I was going to try this http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Emacs_.2F_Slime_.2F_Clojure_on_Ubuntu_-_Tutorial
13:24aldebrnBut can't vouch for its accuracy/clarity
13:24RaynesMaybe I should just write my own post :|
13:26Raynestechnomancy should write and maintain a tutorial for setting up Emacs for Clojure, and link to it from the clojure-mode or swank-clojure README. It would certainly end a lot of questions.
13:26RaynesConsidering that if I write a tutorial, it wont include instructions for emacs-starter-kit because I don't use it, so I doubt it would have his approval. :p
13:34defnI love technomancy, but I disagree with starter kits at least in the sense that I don't think anyone ever really learns anything about emacs unless they configure it themselves.
13:35mebaran151what's letrec in clojure?
13:35gkoBy the way, what's working version of swank-clojure with Clojure 1.1? HEAD of master?
13:35defnRaynes: that being said, I'd like to write an article on that
13:35defnjust more general, no emphasis on the starter-kit
13:35gkoIn my previous version, there was a "
13:35gkoswank-clojure-autoload.el"
13:36defnmebaran151: as of 2007 there wasnt one and you needed to use recur/loop
13:37gkobut in the last version, none. So I checked out branch "clojure-1.1". This one runs OK, but I have to evaluate one expression before having the "Connected ..." (and clean buffer) message. If I then tries something like completion, I have a "Exception in thread "Read Loop Thread" java.lang.RuntimeException: clojure.lang.LispReader$ReaderException: java.lang.Exception: Invalid token: swank::".
13:37gkoArgh.
13:37mebaran151I can't recur loop: I want to write a recursive anonymous function that absorbs its environment
13:38defngko: get elpa
13:38mebaran151to get started with Clojure, I think the Netbeans setup with the plugin is actually the best way
13:38defnmebaran151: http://osdir.com/ml/java.clojure.user/2008-07/msg00319.html would something like that work for you?
13:38mebaran151it *just works*
13:39defngko: get elpa, then install swank-clojure clojure-mode slime and slime-repl
13:39gkodefn: OK, I'll take a look.
13:39mebaran151actually I think letfn will do it....
13:39gkodefn: is it the general Slime or a customized one ? I need it to work with Common Lisp too...
13:39defnmebaran151: yeah thats right
13:40defnletfn is letrec for funtctions only
13:40mebaran151says it allows a function to refer to its and its closed bindings
13:40defnfunctions*
13:40mebaran151*itself
13:40mebaran151seems like you could always wrap a recursive definition in thunk though no?
13:41defnmebaran151: thunk?
13:41defnoh nvm
13:41mebaran151as in a closure
13:42defnyeah that seems reasonable
13:42mebaran151basically what I'm writing is a functional way to walk a neo4j namespace and build a nested hashmap one could use with clojure zippers
13:42mebaran151for recursive relationships, I thunk them
13:43mebaran151so you never infinite loop, but if you want to go back you can call the function and get the right subsection of the node-space
13:43mebaran151I think I reinvented the trampoline...
14:00cupertinochadCan I ask a simple newbie question?
14:01tolstoycupertinochad: People often do!
14:01cupertinochadHow can I get the ASCII value of a character?
14:01dandersenThere is _always_ a Russian writer in every channel I join.
14:02tolstoyHeh.
14:06akingcupertinochad: (int \a)
14:06aking,(int \b)
14:06clojurebot98
14:06cupertinochadMany thanks!
14:06aking,(int \B)
14:06clojurebot66
14:07tolstoyAny hints on how you might unit test a compojure based app?
14:08tolstoyHm. Maybe the source code will help.
14:16triddellaldebrn: I wrote the tutorial you referenced earlier... it worked in Oct... not sure now... I will be trying is again on a new Ubuntu 9.10 setup soon though
14:18mebaran151the easiest way to get a repl is to use the lein repl command heh
14:18mebaran151just looking through the wikibook, it should probably reference lein
14:45shr3kst3rshouldn't "do" be in clojure.core documentation?
14:45chouserit's a special form
14:46chouserso like 'if', 'def', 'let', etc. it's over at http://clojure.org/special_forms
14:46shr3kst3rah, cool, i was just wonder
14:47shr3kst3ri guess i got confused by "let" it is in both places
14:50KirinDaveIs there a way in the args string of a defn to name it something else?
14:50KirinDaveI'd like my signature to be [x y z] but for underlying reasons I want to use [& args]
14:53KirinDavecemerick: I liked your response to jfl on hackernews.
14:54shr3kst3rmaybe something like defn f [& {:keys [x y]} args]
14:55KirinDaveAhh, I can actually set :arglists in the meta.
14:56KirinDaveWhat's the right way to do that in 1.1? I'm confused over the #^ vs. ^ thing.
14:56KirinDaveIs #^{} the right way moving forward?
15:08chouserKirinDave: ^ still has the old meaning for now. #^{} is correct
15:22KirinDavechouser: Got it.
15:22KirinDaveshr3kst3r: I guess this is the right way: https://gist.github.com/91d213ba84940cf0fdfe
15:23KirinDaveit's still less typing than redoing the arguments logic in the other function though
15:25dabdwhich version of clojure-contrib should be used with clojure-1.1.0
15:25chouserdabd: for now 'master', I believe
15:25dabdchouser: thx
15:54notostraca2can anyone tell me how to call a function on every value in a map for a certain key?
15:54cemerickKirinDave: Thanks. Comments like that are particularly pernicious.
15:55notostraca2like if I have {:key1 "bob" :key2 "phil"} and I want to change all :key1 s to "sally"
15:56notostraca2I can't seem to figure out clojure.walk
16:00notostraca2I'm really kinda stuck here
16:04notostraca2I keep getting the error
16:04notostraca2nth not supported on this type: Symbol
16:05notostraca2but I never call the function nth, so it must be in one of the library functions
16:08chousercemerick: link?
16:09chousernotostraca2: a map will only have at most one value for a given key -- I don't think I understand what you want.
16:09notostraca2i have a vector of structs
16:09notostraca2and i need to go through that vector
16:10chouserah, ok.
16:10notostraca2and call (ref-set) on each :img
16:10notostraca2(the value of each :img key)
16:11chouser,(into [] (map #(update-in % [:a] inc) [{:a 1 :b 2} {:a 3 :b 4}]))
16:11clojurebot[{:a 2, :b 2} {:a 4, :b 4}]
16:11chousernotostraca2: something like that?
16:12notostraca2I am new to clojure, so most of that looks like gibberish right now -- what is %?
16:12chouserhm, sorry.
16:12chouser,(into [] (map (fn [v] (update-in v [:a] inc)) [{:a 1 :b 2} {:a 3 :b 4}]))
16:12clojurebot[{:a 2, :b 2} {:a 4, :b 4}]
16:13cemerickchouser: I think KirinDave was referring to this: http://news.ycombinator.com/item?id=1023270
16:13chouser,(into [] (map (fn [m] (assoc m :a (inc (get m :a)))) [{:a 1 :b 2} {:a 3 :b 4}]))
16:13clojurebot[{:a 2, :b 2} {:a 4, :b 4}]
16:14chousernotostraca2: those are all essentially the same
16:15notostraca2chouser: how do I ask clojurebot what these functions mean?
16:15notostraca2in particular into
16:19KirinDavecemerick: Pernicious but somewhat entertaining.
16:20KirinDavecemerick: The asshole college student segment is certainly on the rise at news.ycomb. If not in numbers, than at least in boldness.
16:20KirinDavecemerick: "My subjective view… Peace."
16:20KirinDavecemerick: Why didn't he just go whole hog and say, "You don't know me, muthafucka. Don't judge! *finger wag*"
16:21arohner,(doc into)
16:21clojurebot"([to from]); Returns a new coll consisting of to-coll with all of the items of from-coll conjoined."
16:21cemerickKirinDave: I was really surprised at the reaction to the post in general. A lot of machismo, chest-beating junk. The girls and spiders thing was particularly striking.
16:22KirinDavecemerick: Yeah.
16:22KirinDavecemerick: Well unfortunately that's how a lot of americans, of which news.ycomb is particularly rich, view this sort of thing.
16:23KirinDavecemerick: There is really a paucity of education about functional programming or even practical concurrent programming in most CS programs in the US. It's sad because they were finally catching up but then this concurrent programming problem snuck up on them.
16:25cemerickI don't know if any geopolitical generalizations can be made, but the pendulum has definitely swung towards purely vocational training AFAICT.
16:28KirinDavecemerick: Since I am a product of more than 3 american universities I feel comfortable making that assertion. Justified? No. But comfortable? Hell yes.
16:28KirinDavecemerick: ;)
16:28KirinDavecemerick: But most people I know find the notion of functional programming to be something of a propellerhead sort of exercise.
16:31cemerickKirinDave: It's always been the case that the the majority have been "stuck" with the technologically-inferior options. PHP, VB, etc.
16:31cemerickI suppose that's bound to continue.
16:33job_I've got a newbie question about namespaces; can anyone provide me some quick help?
16:33cemerickHappy new year, everyone. :-)
16:35job_It's probably dead-simple. I'm just not familiar with how to "import" (using that loosely) a Clojure file to the REPL.
16:37q2try (load-file) to straight upload text
16:37q2otherwise (use) to import a library
16:37q2or rather require / refer heh
16:38job_so I've tried load-file, but after trying to refer to some of the symbols in the namespace I defined in the file, Java can't resolve the given symbol.
16:39job_Ah! Nevermind, got it. Braindead mistake.
16:39job_Thanks,
17:03notostraca2chouser: I'm trying to figure out how to use what you showed me with ref-set
17:03notostraca2so that i can change the refs inside the structs inside the vector
17:05chouserit's usually best to have refs at outer levels rather than inner ones.
17:05notostraca2oh?
17:05notostraca2i will try that
17:06notostraca2so if my vector becomes a ref to a vector
17:06notostraca2i wouldn't use into [] would I?
17:06technomancychouser: thanks for that explanation on bug #232; very interesting stuff.
17:06technomancyre: locals clearing
17:08chousernotostraca2: the code I showed you would be the purely functional part.
17:08chouserif the code were in a fn names update-b or something, then you could appliy it to your ref-of-a-vector with (alter myref update-b)
17:09notostraca2ah ok
17:09chouserwhich is what you want -- pure functions doing most of the work, better for thinking and testing.
17:09notostraca2i'll try that, thanks
17:09chouserthen small bits where you do some transactions and alters or whatever
17:11chousertechnomancy: sure -- you showed the way, and I still can't see all the way to a solution.
17:32Chousukehm
17:35piccolinoWhat would that be?
17:35hiredmantechnomancy: we need scopes to land
17:36technomancypiccolino: all the I/O-related functions from contrib that I've found I use all the time
17:36technomancywant to open a discussion about standardizing them
17:36piccolinoAh, OK.
17:36technomancyI've found 90% of my contrib usage is for I/O functions
17:36technomancyhiredman: scopes?
17:37piccolinoYeah, or just make a standard library.
17:37hiredmanclojurebot: scope?
17:37clojurebotscope is at http://paste.lisp.org/display/73838
17:37technomancypiccolino: that's what I mean
17:37hiredmangeneric with-open sort of thing
17:37piccolinoOh, I meant a tighter relationship between core and contrib in general.
17:38technomancypiccolino: actually my secret ulterior motive is to abolish contrib. =)
17:38hiredman:D
17:38piccolinoAwesome. Let's form a conspiracy. :)
17:39technomancyhiredman: looks handy. is that in the "new" branch?
17:39hiredmannope
17:39hiredmanit's no where
17:39technomancyoh, heh
17:40hiredmanI'd hate to have clojure.io just be a wrapper over java.io
17:41hiredmansomething like reader/writer but souped up into some kind of io dsl
17:42technomancyhiredman: so you'd rather iterate on an io lib to make it more idiomatic before getting it canonized?
17:42chouserI think you'd have to build it first (probably in contrib) so it could prove itself.
17:43hiredmangood lord
17:43chouseryou disagree?
17:43hiredmanI think I'm thinking about a monad
17:43chouserheh
17:43technomancymwahaha
17:44hiredmanchouser: that's a good point
17:44hiredmanduck-streams has gotten a lot of use
17:45technomancyhiredman: I could see how getting an io lib in now would make it harder to get a better one in place in the future
17:45technomancyneeding to go through a deprecation phase makes things much more complicated
17:45hiredmanclojure.nio
17:45technomancybut yeah, if we're just going by popular demand, duck streams is very proven
17:45technomancyhehe
17:45hiredman:P
17:45Chousuke:P
17:46Chousukemonads are fine. just, forcing non-functional things into the functional world using them is something you need to think twice about.
17:47hiredmanmm
17:47Chousukethey're just another method of abstraction.
17:48hiredmanI was thinking something that sort of collects all the io operations together, and analyzes them before settling on a reader or an inputstream
17:48hiredmanbut would be hard to make work everywhere
17:49hiredmanarg
17:49hiredmanwe need scopes
17:49technomancyI wonder if we'll see an influx of interest in the next few weeks from people following their "1 new language a year" goals
17:51Chousukeclojure.org/todo is somewhat out of date btw
17:51wdouglasHaha quite the resolution
17:51hiredmanmaybe the reader pattern can be lifted even more, (io/lines [x FILE-STREAM-WHATEVER] do stuff here)
17:51chouserwas that a yegge idea, or older than that?
17:52chouser1 lang/year I mean
17:52hiredmanyou almost always need to call reader and with-open in conjuction anyway
17:52ChousukeI'm going to stick with clojure for at least one more year. :)
17:54technomancychouser: it's from the Pragmatic Programmer (book)
17:54chouseroh, ok.
17:54technomancyI've heard the boot time for Clojure makes it untenable on those devices
17:55technomancyhiredman: yeah, that looks like a good move
17:55technomancywe've probably got a lot of time before 1.2 to figure it out. =)
17:55Chousukethat's one thing the jvm folks need to fix I guess.
17:55chousernooo. I hope not
17:56chouserIf 1.2 can beat our book deadlines, then we don't have to describe idiomatic use of defstruct, agent-errors, implicit head-holding...
17:56Chousukeso this time around will there be a 1.1.1?
17:56chouserdoubt it
17:57chouserthere was essentially no demand for bug fixes to 1.0
17:57ChousukeI saw one bugfix in the 1.0 branch :&
17:57Chousukebut some kind of process for those bugfixes would be good to have.
17:57chousertechnomancy: I wonder if a "native" android target for cinc could do any better than what's currently done.
17:58hiredmanif I recall ruby's io was nice, you could either do the block thing or not
17:58chouserChousuke: I think we have a process, or at least a sketch of one. But without demand for the results it would just be busywork.
17:58technomancychouser: probably. I guess the current compiler assumes hotspot is going to do awesome things, but that's not necessarily true with dalvik.
17:58chouserheh
17:58Chousukechouser: hm, I guess so
17:58technomancythe dalvik compiler is way smarter than javac, but lacks hotspot from what I hear
17:59technomancyis cinc the next logical step after 1.2?
17:59hiredmana dalvik code generation library would be nice
17:59Chousukechouser: most folks using clojure in production seemed to be following master or have their own forks anyway
17:59chouseryeah
17:59chousermaybe cherry-picking their own bugfix patches. ...though if they do that, it would be nice to share back into a potential bugfix release.
18:00ChousukeI should make my reader good enough for cinc ;/
18:00Chousukeright now it's not much better than the java reader.
18:00Chousukeand the bootstrapping is done via hacks mostly.
18:01Chousukeit was still fun to write though.
18:01hiredmanFileLineSeq, a lazy seq that you can call close on when you are done
18:02dandersenHappy UTC+2 New Year.
18:09hoeckdandersen: hopefully another good year for clojure!
18:09hiredmanlisppaste8: url?
18:09lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
18:10lisppaste8hiredman pasted "io/lines" at http://paste.lisp.org/display/92879
18:10Chousukeseems like the donation drive went pretty well too
18:14hiredmanI've started putting dummy symbols in some of my macro calls to make them read like english
18:14hiredman(react-on [Q to ::some-thing as X] ...)
18:15hiredmanwhere whatever is in the 'to' and 'as' spot is ignored by the macro
18:20zmyrgelany ideas why slime repl seems to freeze when I try to eval anything in it
18:20zmyrgelslime repl seems to work ok with sbcl and clisp but not with clojure
18:21technomancyzmyrgel: how did you install it and how did you invoke it?
18:22zmyrgelmanual installation from git repos and invoked it with M-- M-x slime clojure RET
18:22technomancyzmyrgel: there's been a change in slime from git that breaks clojure support. try installing via elpa as it recommends in the swank-clojure readme.
18:26zmyrgelok, I'll try that and see how it works out
18:30technomancyI've got a clojure.io that takes just the functions I use from duck-streams (about 90% of it) and adds a handful of java-utils functions as well
18:30technomancyyou think it's worth just taking all of duck-streams for compatibility's sake?
18:30technomancythe ones I don't use are: append-spit with-in-reader make-parents write-lines file-str read-lines to-byte-array pwd with-out-append-writer with-out-writer
18:33chouserI think it would be good to leave out read-lines
18:34technomancyfile-str should be dropped in favour of java-utils/file as well, though possibly file would be enhanced to support ~ like file-str does
18:35technomancychouser: you mean because of the "close it only when you've consumed the whole thing" issue?
18:35technomancythat does seem quite problematic
18:35chouseryeah, that's the wrong way to go about closing files.
18:35chouserwe need scopes. :-)
18:36hiredmanI have my horizons stuff
18:37chouseryeah, I think rhickey implemented his as well. There must be some reason it's not in.
18:37technomancycould probably use to-byte-array... even though it doesn't do I/O itself, it's quite useful in many I/O-related contexts
18:38technomancywhy does duck-streams' *byte-array-type* have earmuffs? it can't be intended for rebinding use, can it?
18:38hiredmanchouser: possibly he is planning something with streams
18:39chouserI think streams are dead.
18:39hiredmanI thought there were just tabled
18:39hiredmanmaybe I was looking at something out of date
18:41chouserI think lazier + chunked seqs got most of what he wanted from streams, but without most of the drawbacks.
18:44chouserbut I don't know what would be holding up scopes, so there's clearly something I don't know about.
18:46replacachouser: what are scopes?
18:50technomancyok, so I put in everything except make-parents write-lines file-str read-lines pwd
18:50technomancyand I added file, delete-file, and delete-file-recursively from java-utils
18:50technomancyuse those all the time
18:51technomancyhttp://github.com/technomancy/clojure/blob/io/src/clj/clojure/io.clj
18:51chouserheh. useless link http://www.assembla.com/spaces/clojure/tickets/2-Scopes
18:51technomancywill send it to the mailing list later
18:51technomancyclojurebot: scopes?
18:51clojurebotHuh?
18:51technomancyclojurebot: scope?
18:51clojurebotscope is at http://paste.lisp.org/display/73838
18:52replacachouser: wow, that *is* a useless ticket!
18:53chouserah, there it is.
18:53replacachouser: ahh , the other link reminds me though. Thanks
18:53chouserand hiredman implemented it.
18:55hiredmanexcept mine are cool because I called them "horizons" and the exception says you have a naked singularity if you try to use when-hrz outside of a horizon
18:56replacatechnomancy: why are you dropping those funcs from clojure.io? I vote we keep them. I know some folks have issues with the behavior of read-lines and write-lines, though.
18:57technomancyreplaca: pwd and make-parents just seem pretty useless
18:57technomancyand java-utils/file is better than duck-streams/file-str
19:02technomancythe earmuffs on *byte-array-type* are almost certainly a mistake, right?
19:07technomancyreplaca: is there a specific one you feel attached to?
19:09technomancyyou can't really say things are "getting dropped from clojure.io" anyway, considering it has only existed for about 15 minutes. =)
19:16polypusso what revision is clojure.io on these days?
19:17technomancypolypus: it only exists on the "io" branch on my fork of Clojure in github. I just created it today. there's nothing even vaguely official about it.
19:17polypusi know. just jestig :)
19:18polypusjesting
19:25replacatechnomancy: (sorry, away for a minute) java-utils/file doesn't do ~ expansion (which is a thing to be encouraged in my book). I like both pwd and make-parents (though I'm not sure about the name of the latter).
19:26replacatechnomancy: well, "dropped" in the sense of not being tranferred from duck-streams
19:26the-kennyIs there a way to refer to clojure 1.1.0 in leiningen? Looks like it isn't on build.clojure.org
19:27replacaof course both pwd and make-parents are simple wrappers around java stuff, but the underlying java is ugly compared to the wrapper
19:27replacaIMHO :-)
19:30technomancyreplaca: I added ~ support to file when I moved it from java-utils
19:31technomancyreplaca: pwd doesn't make a lot of sense considering there's no notion of a "working" directory on the JVM
19:31technomancythere's just "the directory you launched from"
19:32replacawell, there is the notion of "if I create a file "foo", what directory will it be in.
19:32replaca?"
19:35replacasomething like (.getAbsolutePath (File. ".")) might be a better implementation than what Stuart has. I don't know.
19:36technomancywell given that the very idea behind "working directory" varies based on platform, I am inclined towards making the user drop into Java for it or possibly moving pwd to java-utils.
19:38technomancybut I dunno; I've never used relative paths at all
19:39replacatechnomancy: oh, I use 'em all the time. But I'm not stuck on it.
19:40replacaadding ~ to file and some sort of make-parents are the two things I'd be more worried about. (Though in the end I don't care to much if it's in clojure or contrib)
19:41technomancyhow about this: (mkdir path "..")
19:41technomancymkdir is much more general than make-parent
19:48replaca,(doc mkdir)
19:48clojurebotNo entiendo
19:54replacatechnomancy: where is mkdir coming from? I don't see it in clojure (or are you proposing it as new?)
19:55hiredmanso much nicer
19:55replacahiredman: come on, just throw all of slime in there :-)
19:55hiredmanyeah
19:58replacatechnomancy: I think "mkdirs" would be a better name (a la java.io.File/mkdirs) since you want to make the whole chain. But it seems fine to me if it operates on strings
19:59hiredman:(
20:03replacahiredman: ?
20:04hiredmanstrings
20:05replacahiredman: you have a preference for java.io.File objects?
20:06hiredmanI have a distaste for string manipulation
20:06hiredmanfor? of?
20:07hiredmanhttp://www.thelastcitadel.com/lab/repl.ogv
20:07replacammm, ok. I don't have a strong opinion either way. (So long as we don't reimplement CL style pathnames!)
20:08replacado I need to do something to my broswer to read that? Comes out all crazy!
20:11technomancyreplaca: I was thinking it would take the same args as file
20:13technomancyit would operate on files or strings, like file
20:17notostraca2is there a version of map that isn't lazy?
20:22notostraca2any ideas?
20:25chouseryou can wrap it in (doall ...)
20:25chouseror (vec ...)
20:26chouseror if you don't care about the results and just want side-effects, you can wrap it in (dorun ...) or use doseq instead.
20:27notostraca2I tried doall and dorun with map
20:27notostraca2and it seemed to have some other error, let me reproduce it
20:28notostraca2yeah, NPE after some kind of problem in clojure.lang.LazySeq.sval
20:41notostraca2this room seems to be less active than usual
20:45chouserthe exception is almost certainly coming from your code. you could lisppaste the full stack trace.
20:59notostraca2chouser: I've given up on using map on this vector, and I switched it to a bunch of separate defs that i call functions on separately
20:59notostraca2not as good, but oh well
20:59notostraca2at least it works
21:16chrisdonewhat's the interest from .NETers been like for Clojure on the CLR?
21:24ztellmanIs the implementation of a FIFO queue at http://rosettacode.org/wiki/FIFO#Clojure thread-safe?
21:24ztellmanit seems like two threads could get the same element
21:25ztellmanbut maybe I'm missing something?
21:26chouserdoesn't look thread safe to me.
21:26ztellmanwould making the atom a ref and wrapping the whole thing in dosync make it thread-safe?
21:27chouseralso not very memory-efficient -- every item put in the queue will be held forever.
21:28chouserztellman: yes, that would be much better.
21:29chouseralso better to use a clojure.lang.PersistentQueue instead of a vector
21:30ztellmanI'm asking because I'm making a thread-pool, and it seems like the easiest way to do it is to create two views on an infinite seq of promises
21:30ztellmanone for empty promises, and the other for promises which haven't been consumed yet
21:30chouseroh, dear. I suppose you could, but Java comes with good thread-pool classes. You could just use one of those.
21:31ztellmanI'm constrained by needing to instantiate OpenGL contexts in my threads
21:31ztellmanI guess I could just check every time whether a context is active in the thread, but that seems even weirder than making my own thread-pool
21:31ztellmanneither option is all that great
21:31chouserin fact clojure wraps up a couple of them for agents, future, etc.
21:32ztellmanare there any hooks into the thread creation for these pools?
21:32chouserhm...
21:35chouserlooks like it -- you can pass in a ThreadFactory
21:36chouserhttp://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html
21:37ztellmanoh, excellent
21:38replacatechnomancy: (after some running around) yeah, that sounds good to me
21:38ztellmanthanks chouser, I had pretty much resigned myself to doing this myself
21:39chouserztellman: np. You know about 'proxy'?
21:39ztellmanyeah, I've used it a few times
21:39ztellmanthanks
21:43chouserztellman: do you feel like correcting rosettacode?
21:49ztellmanchouser: I can't just now, but I can do it later if no one else does
21:50technomancyok, gonna send off this clojure.io proposal then
21:51chouserarg. I hate this kind of problem.
21:51chouseroh!
21:54chousernope
21:54chousergrrr
21:57chouser(:use [net.cgrand.enlive-html :only [xml-resource select]])
21:57chouserthen later, (xml-resource ...)
21:57chouserBut I get: Exception in thread "main" java.lang.Exception: Unable to resolve symbol: xml-resource in this context
21:58chouserhow is that possible?
22:00chouserif xml-resource weren't in enlive-html, or enlive-html wasn't on the classpath, I'd get an error there in the ns form.
22:00_mstis that from the repl or slime? I've had surprising results from slime before when it hadn't picked up what namespace I was in
22:01_mstso the :use was going into one namespace but forms sent to slime got evaled in user/
22:02chouserI don't touch slime. I'm loading this file using clojure.main -i foo.clj
22:03_msthm, youch
22:04chouseroh my. adding (prn xml-resource) right after the (ns ...) works -- prints the fn.
22:04defnhappy new year everyone
22:04defnto Clojure!
22:05chouserwhere are you -- in the atlantic somewhere?
22:06defnhaha no, it's only 9:07pm here, not the new year. however, I am from Wisconsin-- we get started with the drinking early in the evening
22:06chouserhehe
22:06defnwhere are you from chouser?
22:06chouserIndiana
22:06defnah, cool
22:07defnso you can probably attest to some of the pain of no one caring about computer science in your area, then?
22:08defnI'm in Madison, WI -- The University of Wisconsin has a decent CS program, but few of them could give a hoot about Clojure. They all want to learn Java to get jobs.
22:08chouserah.
22:08defn"them" being the people I went to school with
22:10chouseryeah, I went to Taylor -- the CS department there is strong, but definitely more oriented toward getting work done than theoretical work.
22:10chouserbut Clojure's pretty practical. I should find out if they want me to go tell them something about it.
22:10defnyeah i was just going to say -- i dont want to make it sound like applications aren't important
22:11defnbut i feel like clojure has more of a balance of the two than many are comfortable with
22:12defni was talking with my friend last night whom I forced to watch Rich's lecture "Are we there yet?" -- and we were talking about communication between two people and the flow of it -- sort of a tangent of the conversation we started with
22:13hiredmanif anything clojure is more pratical because it brings more power
22:13defnthere was this moment where we were talking about free association, and just for fun we started trading words back and forth, trying deliberately to make sure that each word was unrelated to the previous person's word
22:14_mstchouser: any chance you're somehow switching namespaces between your (prn ...) and the code that fails?
22:14defnthose pieces were unrelated, and yet they were part of that "river" we called a conversation
22:14defnit was very interesting to talk about rich's lecture in relationship to that scenario. very true stuff.
22:15chouserI just sprinkled those prn's around the file. The error changed. 8-|
22:16defnDoes anyone know if there is something like a (render "filename.html") form in compojure
22:17_mstI'll be interested to know what it ends up being anyway :) I always enjoy bugs that make you question your own sanity...
22:17defn_mst: have you read coders at work?
22:17_mstyep, sure have
22:18_mstexcellent book :)
22:18defnsome fantastic bug stories in there
22:18defnyeah i loved it
22:18defnwho was your favorite?
22:18_mstterribly edited, but excellent book :)
22:18_msthm, I think I enjoyed Joe Armstrong's the most, actually
22:18defnyeah i enjoyed that as well
22:19defni really liked reading simon peyton jones
22:19_mstI don't have my copy at hand to remind myself why, but I remember being struck with how sane he was
22:19_mstyeah, his was good too. And Knuth's of course--I suspected putting that one last was a trick to get people to read the others first :)
22:20defnyeah, some of the guys in there reek of ... i dont know ... it's like you could smell why you didn't like them
22:20defn_mst: haha yes, but I read his first anyway :)
22:20defnjwz came off as kind of a jerk
22:21chouserphantom error. it's gone.
22:21chouser:-(
22:21defnmost of his employers seemed to think he was arrogant
22:21_msteugh :)
22:21defnso im not alone there?
22:22chouserI put the code back the way it was, and I'm still getting the new error. (A nice, reasonable error about bad xml data)
22:22defnwhen they asked him what he's been up to it was like "i dont really code much"
22:22defnit's like...what?!
22:23defnhave you seen simon peyton jones with (forgetting his name...the erlang guy)
22:24defnthere's a video of them discussing the different approaches in a very cordial manner
22:24defnoh duh -- joe armstrong
22:24defnhttp://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell
22:24_mstthat's the one :) I don't think I've seen it
22:24_mstah, thanks