#clojure logs

2008-12-04

00:31chavo_clojure.contrib.fcase/in-case macro uses private function in-test-case. When it is expanded in a different namespace the compiler throws an exception. Is this a bug?
00:32timothypratley(defmacro while[v cnd & body]
00:32timothypratley `(loop[~v ~cnd] (when ~v ~@body (recur ~cnd))))
00:33timothypratley<-- what is wrong with the v
00:34hiredmanuh
00:34timothypratley (while msg (.readLine input)
00:34timothypratley (println "Read " socket msg))
00:34hiredmanyou are evaling it twice?
00:34timothypratley<-- doesn't work
00:35timothypratleyhiredman: oh damn
00:35hiredman:)
00:50replacaQuestion - in "regular" lisp, to create an accumulator, the idiom is to cons up a list and reverse it, in clojure you can create a vector and just conj to it, skipping the reverse step. What's the trade-off?
01:00timothypratleyreplaca: isn't that just a fundamental trade-off question between lists and vectors in general? ie: list pop is faster than vector pop, list push is faster than vector push - ie: nothing specific to clojure or lisp as it relates to the data structure?
01:06replacawell, yeah, but in lisp that's not going to be the usual idiom cause
01:06replacayou don't have first class vectors
01:06replacain clojure you can hardly avoid them
01:08replacaso the question is: what's the penalty for ([...] conj x) vs. (cons x (...))
01:08replacaif the former is close to constant time it seems nice
01:09replaca(THat is, when used over an accumulator, are they both clsoe to O(n) time?
01:09replacaor is the vector going to be a lot more expensive?
01:11notallamathe vector is technically something like O(n log(n)), i think. but that's log base 32, so the constants quite possibly make it faster in practice than list + reverse. i dunno, though.
01:11fyuryureplaca: appending to the end of a vector is cheap
01:11replacacool. And does that tend to be the idiom folks are using?
01:12replacait does make the code a little cleaner
01:12fyuryureplaca: from what I've seen, yes
01:12replacaI find I use vectors just cause the syntax encourages me to, which makes me a little nervous :-)
01:13replacaThanks!
01:13fyuryuat worst, appending to a vector is log32(n)
01:13replacawhich for small things is fine
01:14fyuryuI say at worst, because I don't remember if there's an optimization just for appending
01:14replacayeah
01:14fyuryuI looked at the implementation some time ago, don't remember now, sorry
01:15replacathat's OK -> I'm looking for idiom & not being stupid more than precise performace
02:00timothypratleyuser=> (str [1 2 3 4])
02:00timothypratley"[1 2 3 4]"
02:00timothypratleyuser=> (str 1 2 3 4)
02:00timothypratley"1234"
02:01timothypratleyhow can I make mystr behave like the 2nd when passed the 1st?
02:01lvijay(apply str [1 2 3 4]) ?
02:01timothypratleygreat! :)
02:01timothypratleythanks
02:48Lau_of_DKMorning gents
02:57replacaI'm new to #clojure, but I've already learned that when Lau shows up for the morning in DK, it's time for me to go to bed in San Francisco :-)
02:58stuarthallowayin that case I better go to be in North Carolina...
02:58stuarthalloway(bed)
02:58replacaoh yeah, you're up way too late!
02:59replacabut I have a little boy to take to school in the morning so there's no sleeping in
03:00stuarthalloway:-) night all
03:01replacanight!
03:15Lau_of_DKreplaca: :)
03:18timothypratleyI have a thread which pops messages off a queue and processes them using a multimethod which dispatches on 'message type'. Trouble is that in order for it to access outside information, I put the message definitions inside the processing thread. So when I make multiple processing threads, the functions get redefined [I stupidly thought they would be local functions but they aren't].
03:19timothypratleySo I have some options... I could persist with the 'local functions' but using a let, but I can't see how I can make multimethods work inside that.
03:19timothypratleyOr I could make the functions global and pass in the extra information... but again I can't add extra arguments to multimethods
03:21timothypratleyKind of a bit hard to explain I could paste the code it is about 50 lines
03:21Lau_of_DKCant you simply put the shared information in a global ref to a hash-map ?
03:22timothypratleyLau: but how will the method know what to look up? each thread has a different 'information'
03:23timothypratleyMind if I paste it?
03:23hiredmanlisppaste8: url
03:23lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
03:24lisppaste8timothypratley pasted "MR" at http://paste.lisp.org/display/71566
03:25timothypratleyooo neato thanks
03:26timothypratleySo yeah if you take a look there you might see what I'm trying to do, and where I've gone wrong
03:27timothypratleyThe important part is that client is required to process the messages
03:27hiredmanwhy can't you just pass client?
03:28timothypratleymaybe I can :) I tried modifying the multimethod example given on the website (using shapes)
03:28timothypratleyadding an extra argument caused them to fail
03:28hiredmanoh
03:29hiredmanyou just need a slightly more complex dispatch function
03:29timothypratleyah....
03:29timothypratleyso I make a function that takes 2 args
03:29timothypratleyand just dispatches on the first?
03:29hiredmanyes
03:29timothypratleyHmmm great!
03:29timothypratleythanks.
03:29hiredmanclojurebot: multimethods?
03:29clojurebotmultimethods is what separates the boys from the men.
03:29timothypratley:)
03:30hiredman<-- lame
03:31hiredmanfor my multimethod stuff I just make a struct and put everything I could possibly need in it
03:36timothypratleyhmmm actually that might be more convenient for me too
03:36timothypratleyI could just assoc the extra data to the message
03:37timothypratleyI'll have a look at both ways
07:31Chouserrhickey: good morning.
07:32Kerris7Good morning Chouser
07:32ChouserKerris7: good morning!
07:32rhickeyhi
07:33ChouserI replaced a couple (dosync (commute ...))s with (swap! ...)s last night
07:33Kerris7I've been writing 90% of my Java homework using (tail) recursion and constructive instead of destructive updates :V
07:33Chouserit took me a while to realize I was relying on the return value of the dosync
07:33ChouserKerris7: excellent!
07:33rhickeyah
07:33Kerris7this functional paradigm is catching
07:35ChouserKerris7: have to be careful of those stack overflows in Java, though, no?
07:35Kerris7yeah, been running into a lot of those lately
07:36rhickeyjava -Xss
07:37Chouserso now have (do (swap! foo ...) @foo)
07:37rhickeyCL programmers just set a stack appropriate for their data
07:37Chouserseriously? amazing.
07:38rhickeyChouser: yeah, I held off on returning val just to give myself some more time to think about it
07:38Chouseratom's nice and fast, though.
07:38Chouserrhickey: sure. Don't rush on my account.
07:38rhickeyI think atom is an important addition
07:39rhickeyfits in the reference model nicely
07:40Chouseryep. I simply replaced 'ref' with 'atom' and then made the 'set!' substitiution. Everything else used @ already -- very simple change.
07:46rhickeypeople were having to use refs for truly isolated things like memoization caches, which is overkill
07:49rhickeysvn 1143: swap! returns new value
07:55hoeckare there some more docs on atom and swap (besides (doc ..))?
07:55chavo_/
07:57rhickeyhoeck: not yet
07:57rhickeydo you have a question on them?
07:58Chouserrhickey: yes, that was exactly my case here. my little prime stream seems to be about twice as fast with atom vs ref/dosync
07:58clojurebotsvn rev 1143; swap! returns new value
07:58rhickeyChouser: wow - that's a testament to dosync
07:59hoeckrhickey: what are their use cases, where do they replace a ref?
08:00rhickeyanyway, the decision shouldn't be about perf, but independence. There's no way to coordinate changes to atoms, so they better be independent forever. refs are for coordinated change
08:01rhickeyhoeck: if you imagine a grid with independent/coordinated axis and async/sync on the other...
08:02rhickeyagents: independent + async
08:02rhickeyrefs: coordinated + sync
08:02rhickeyatoms: independent + sync
08:02rhickeyand coordinated + async makes no sense
08:03lisppaste8cemerick pasted "loop destructuring happening in recur's lexical scope?" at http://paste.lisp.org/display/71571
08:03clojurebotsvn rev 1144; made APersistenVector.compareTo use Util.compare on elements
08:06rhickeycemerick: binding is not lexical scope
08:07hoeckrhickey: thanks!
08:07cemerickrhickey: well, within a single thread it is, no?
08:07rhickeyno, it's dynamic scope
08:07cemerickI didn't actually consider this an issue with binding, but with the destructuring of loop happening in recur
08:08rhickeyyou'll have to show me a problem not involving binding
08:09AWizzArdBtw, atom is not yet in the api description on clojure.org right? What is it good for?
08:09rhickeyif you use an expression involving *blah* it means what ever the value of *blah* is at the time
08:11cemerickrhickey: right -- and my intuition about recur is that it pushes the arguments provided back into the in-context loop (or fn) -- in the provided example, doesn't that mean that the binding of dec to *fn* has been popped off by the time that arg gets to loop's destructuring?
08:13AWizzArdWhat is an atomic reference?
08:13rhickeycemerick: dynamically, no - imagine it was a tail call
08:14rhickey(defn foo [] ... (binding ... (foo)))
08:14cemerickhaving never done any scheming, I'll have to think about that for a little while...
08:15cemerickrhickey: ah, so effectively, recur "carries forward" the body of the loop, so each recur maintains recur's lexical scope...
08:16rhickeyyou have to stop talking about lexical scope with binding - binding is not lexical
08:16rhickeythat it's problem/benefit
08:16lisppaste8Chouser pasted "primes using atom" at http://paste.lisp.org/display/71572
08:17ChouserAWizzArd: ^ an example of atom and set!
08:17Chousersorry, swap!
08:17cemerickit's amazing how far one can get without truly understanding things!
08:17rhickeycemerick: :)
08:17AWizzArdoh, swap! is also new
08:17cemerickShort of recur, then, I'm unclear about how binding != let given a single thread of execution
08:18rhickeydynamic binding can be confusing
08:19lvijayso atoms are unsynchronized mutable objects?
08:19rhickeycemerick: because any use of a dynamic var anywhere means 'the current dynamic value', not the value at the point the code was written
08:19AWizzArdatom is more or less like an agent, but it runs in the same thread yes? And we don't (send) an atom, but (swap! it).
08:19rhickeylvijay: not at all, that is why they only support swap! - it is atomic and not subject to race conditions
08:20rhickeybut it is CAS sync, not monitor sync
08:20lvijayok now i'm confused
08:20AWizzArdwhat is a cas sync?
08:20lvijaywhat is CAS synch?
08:20rhickeycompare-and-swap
08:21rhickeyis an atomic operation
08:21lisppaste8cemerick annotated #71571 with "perhaps finally understanding bindings" at http://paste.lisp.org/display/71571#1
08:21AWizzArdcompare with what?
08:21lvijayis the code for atom in src/clj/clojure/core.clj?
08:22rhickeyinternally swap! uses a cas spin, essentially read, make new value, try to swap it in, if when swapping it is found that the value has changed, don't replace it, try again
08:22rhickeycore_proxy.clj
08:22AWizzArd10k retries?
08:22rhickeyAWizzArd: ?
08:22lvijayis it like: value=atom; synchonized (lock) { if (lock == value) swap(atom, new_value); }
08:23AWizzArddosync retry 10k times before they give up
08:23lvijaypseudo java
08:23rhickeyAWizzArd: no retry limit
08:23AWizzArdYou said swap! retries if it sees that the value has changed (from some other thread)
08:24lvijayok, spin lock.
08:24lvijaygot it
08:24lvijaynow i look at the code
08:24lvijayare there any example uses?
08:24cemerickrhickey: so, is it right to say that, conceptually, binding just set!'s the vars with the values initially provided, and then resets them to their pre-binding values upon exit?
08:24lvijayexample code, i mean
08:25AWizzArdcemerick: but only for this specific thread
08:25rhickeycemerick: dynamically, yes, it's a stack discipline
08:25AWizzArdother threads still see the original binding
08:25cemerickright, I'm only talking about single-threaded execution here
08:26cemerickwell, that clarifies things quite a bit :-)
08:26lvijayah so it uses AtomicReference
08:26lvijayneat
08:27rhickeylvijay: yes, just wraps AtomicReference in Clojure abstraction, and makes easy to use, supports deref/@, validators
08:27Chouserlvijay: I just posted an example of atom and swap! http://paste.lisp.org/display/71572
08:28Chouserprobably the simplest possible use case
08:28lvijayChouser: you call that simple???
08:29Chouserwell, I mean the use of atom is simple.
08:29Chouserno compare-and-set! no validator.
08:29rhickeymemoize would probably be simplest use
08:29rhickeyno prime logic
08:30Chousertrue.
08:30AWizzArdfor? :-)
08:30rhickeyChouser
08:30rhickeyto write memoize
08:30rhickey:)
08:30lvijay:)
08:31abrooksheh.
08:31hoeck:)
08:31lvijayok my repl just hung because of the paste
08:31abrooksChouser: No pressure. :)
08:32cemerickI think a simple example of some code set!-ing a var within the lexical scope of a binding form would help to clarify things for any other pikers like myself who come across http://clojure.org/vars
08:32abrooksYou know.. the problem with identifiers that allow exclamation points is that I spent a moment trying to figure out why people were so excited about swap!
08:33lvijay:)
08:33cemerickUntil now, I've only thought of binding as being a handy way to thread a value across fn calls, but clearly I've not been using everything available to me.
08:33rhickeycemerick: the best example of the power of binding is *out*
08:34AWizzArdWhat is the main difference between atoms and agents? That atoms don't run in their own thread?
08:34cemerickrhickey: which I've used a good deal, but even then, it still just feels like a cross-fn let with a globally-available storage location
08:34rhickeyalthough set! is interesting as a way to communicate up the stack
08:35rhickeycemerick: I see
08:35cemerickI think the set! example is really what exemplifies the mechanics of what's going on
08:36gnuvinceHello
08:36cemerickthat is the mechanism for bubbling up data from many frames down, though, right?
08:36rhickeycemerick: yes
08:37lisppaste8lvijay annotated #71572 with "this returns nil?" at http://paste.lisp.org/display/71572#1
08:39lvijaycan someone comment on the above paste? I replaced Chouser's (iterate inc 3) with (range 1 100)
08:43lisppaste8rhickey pasted "memoize with atom" at http://paste.lisp.org/display/71574
08:44lvijayrhickey: thanks.
08:44lvijaythat was easier to understand
08:52lisppaste8lvijay annotated #71572 with "this works" at http://paste.lisp.org/display/71572#2
08:55Lau_of_DKIs anyone working on a Clojure Yansippet?
08:55Lau_of_DKs/Yansippet/Yasnippet
08:55AWizzArdrhickey: if-let :-)
08:55lisppaste8rhickey annotated #71574 with "forgot about if-let" at http://paste.lisp.org/display/71574#1
08:55AWizzArduh!
08:59lvijayLau_of_DK: what's yasnippet?
08:59Lau_of_DKIts something that comes close to Intellisense for Emacs, speeds things up quite a bit
09:00cemerickare snippets at all useful in a lisp where boilerplate is slight to nonexistent?
09:00lvijayi was writing something like that
09:00Lau_of_DKhttp://code.google.com/p/yasnippet/
09:00Lau_of_DKCheck out the screencast
09:00lvijayi posted it to the groups yesterday
09:00lvijayoh wait
09:00lvijayintellisense
09:00Lau_of_DKcemerick: Somebodys who's made the attempt will have to answer that
09:00lvijaythat's a nifty thing
09:01cemerickI just can't think of any repetitive code patterns I run into *shrug*
09:02AWizzArdhow can send a thread sleeping for n milliseconds?
09:03Lau_of_DKcemerick: There are a few things where tab completion would speed it up, like you type map<tab> and you get (map % %) to quickly enter. Im not sure how good the idea is, thats why I asked
09:03lvijay(Thread/sleep n)
09:03AWizzArdthx
09:04cemerickI think the biggest wins will be sexpr navigation/editing primitives and completion of java names (in enclojure, hopefully :-))
09:05Lau_of_DKJavanames would be nice
09:05lvijayso that's what i submitted (incompletely) to the clojure group yesterday
09:05lvijaylet me see if i can find it
09:08lvijayhttp://groups.google.com/group/clojure/browse_thread/thread/5595e9597e14c8b3/cce596f2aa248408
09:10cemericklvijay: I'm sure ericthorsen and crew have that sort of thing on the drawing board
09:10lvijaythat's good to know
09:10lvijaywill it help with emacs?
09:10cemerickthe church of emacs is likely on its own ;-)
09:11lvijaymy plan was to write this in clojure, inspect a clojure file for Java-styled symbols (camel case, starts with caps...) and build import statements where possible
09:12lvijayemacs thru swank would use this to import files
09:12lvijaybut i got bored :)
09:12cemerickyeah, some standard modules to support IDE functionality are surely welcome. I know the enclojure and eclipse plugin teams have talked (at least briefly) about sharing some base functionality.
09:14RSchulzGood morning...
09:14RSchulzWho checked in the current clojure-contrib/trunk/build.xml?
09:14RSchulzIt's broken.
09:14RSchulzBUILD FAILED
09:14RSchulz/repo/JT/clojure-svn/clojure-contrib/trunk/build.xml:62: The <jar> type doesn't support the nested "path" element.
09:14RSchulzOr is my version of ant outdated?
09:15drewolsonRSchulz: i'm fairly sure that should be classpath, but i didn't check it in :)
09:15lvijayRSchulz: ant works for me
09:15lvijayi'm on svn 1144
09:15drewolsonRSchulz: works for me too
09:16RSchulzWhich SVN rev are you at? I just did an "svn up" this morning before the failing build.
09:16RSchulzThat's the SVN for Clojure. I'm talking about Clojure-Contrib.
09:16RSchulzRev is 273.
09:16drewolsonRSchulz: 273
09:16lvijaysorry, i missed that bit. i'm on some old clojure-contrib
09:16RSchulzWhich version of ant are you using?
09:16drewolson1.7.1
09:17RSchulzI'm using 1.6.2
09:17drewolsonhrm, that might be the issue
09:17RSchulzTime to upgrade, I guess...
09:18lvijayRSchulz: since ant 1.6.2 The nested indexjars element specifies a PATH like structure. Its content is completely ignored unless you set the index attribute of the task to true.
09:18lvijayhttp://ant.apache.org/manual/CoreTasks/jar.html
09:19RSchulzHa. Somewhere along the line, I already downloaded the tarball!
09:25RSchulzOK. That was it. Sorry for the noise.
09:44ChouserI was going for classy, but I think I ended up with cheesy: http://clojure.googlegroups.com/web/clojure-conc.png
09:44Chouseroh well. there's the concurrency graph that rich described.
09:45rhickeytypo: s.b. independent
09:46rhickeycolorful!
09:47cemerickit's very SICP-esque :-)
09:50Chouserfixed, thanks.
09:50gnuvinceheheh :)
09:51Chousercertainly not up to tomhickey standards, is it. :-P
09:51rhickeyChouser: thanks, I think that graph is the way to think about refs
09:51rhickeyer, references
09:52Chouserof course var is missing to make it a complete clojure-supported-mutable chart. We might have to go 3d for that.
09:53rhickeyChouser: the other D is shared/isolated, complicated by the shared root bindings of vars
09:53Chouserif they were forced into that chart, I guess Var would be synchronous/independent?
09:54gnuvinceWhat does atom do?
09:54Chousergnuvince: doesn't the chart answer your question?
09:54Chouser:-)
09:55gnuvinceChouser: I guess I don't see why independent data needs to be synchronized
09:56Chouserit can be independent of other state, but still shared by multiple threads.
09:57ChouserIn C: x = x + 1 has a race condition, even if x is independent of any other state
09:58Chouserref and dosync can do the job, but that's more work than needed if not coordinating multiple refs.
09:58Chouserso atom provides a thread-safe mutable solution for a piece of state that stands alone.
09:59gnuvincemore work for the programmer or more work for the run-time?
09:59Chouserboth
09:59Chouser(dosync (alter x inc)) becomes (swap! x inc)
10:00Chouser...and the runtime has to do much less work.
10:00gnuvinceok
10:05rhickeyChouser: the graph you have is the shared plane, the isolated plane would have only var in sync/independent, but the async/coordinated flavors make no sense in that plane anyway
10:07Chouseryeah, ok. async within a single thread -- I guess not.
11:04Chouserhm! I only just now noticed that def doesn't support destructuring.
11:08danlarkinhow would it? (def [a b] [1 2])?
11:10Chouserwhy not?
11:20danlarkinnot saying it shouldn't
11:32danlarkinbut it could only destructure as a vector? how would a map work
11:32AWizzArddanlarkin: same as everywhere else
11:33drewolsonis there an easy way to turn ([1 2] [3 4]) into {1 2 3 4}
11:34rhickeydrewolson: (into {} [[1 2] [3 4]])
11:35AWizzArd(let [{val1 :key1, val2 :key2} {:hallo 10 :key1 30 :key2 40 :x :y}] ...)
11:36Chouserdanlarkin: for the record, I'm not saying it should, I was just surprised to notice it didn't.
11:36AWizzArddanlarkin: check also http://clojure.org/special_forms#toc4
11:36ChouserI've never wanted it before, and even in the case where I just thought of it it would have been a poor choice.
11:36AWizzArdYeah, I also thought that destructuring works everywhere, where bindings are made
11:37AWizzArdChouser: you basically wanted something like (in Python) a, b, c = 10, 20, 30
11:37ChouserAWizzArd: yes
11:38ChouserThe reason I didn't want them separate is I wanted them to share a lexical scope.
11:38AWizzArdis it for def's not always the global scope?
11:39Chouser(def [a b] (let [x ... y ...] [(fn f1 ...) (fn f2 ...)]))
11:39Chouserthis would create global 'a' and 'b' that each closed over the same 'x' and 'y'
11:44dthomasCan you not turn that inside out? (let ... (defn ...) (defn ...))?
11:45Chouseryeah, I guess that would be okay. def's anywhere other than the top level scare me.
11:45Chouserwell, not scare -- make me uncomfortable.
11:49drewolsonrhickey: thanks
11:50AWizzArdsure, one can work around this of course
11:50AWizzArddestructuring nothing but syntactic sugar
11:50AWizzArd+is
12:21hiredmanclojurebot: latest?
12:21clojurebotlatest is 1144
12:34danlarkinclojurebot: you're so rad
12:34clojurebotI don't understand.
12:34danlarkinyou wouldn't... :-/
12:43RSchulzDoes clojurebot have to be told the latest SVN rev?
12:51duck1123RSchulz: I think it automatically updates that value, but if you tell it the latest is something else, it will announce back up to the latest
12:51RSchulzSpiffy
12:57technomancyRSchulz: yeah, he polls it every five minutes.
12:57technomancyclojurebot: latest?
12:57clojurebotlatest is 1144
12:57RSchulzSo clojurebot _is_ a he, eh?
12:57technomancyheh... officially an it, but I can't keep things straight.
12:58duck1123I think the general consensus has been to refer to it as male
14:19hiredmanclojurebot: alter is <reply>no, you mean commute
14:19clojurebotYou don't have to tell me twice.
14:19clojurebotRoger.
14:20hiredmanuh oh
14:20ozy`clojurebot: info
14:20clojurebotIt's greek to me.
14:20ozy`clojurebot: stats
14:20clojurebotexcusez-moi
14:21hiredmanugh
14:22hiredmanside effects in my transactions
14:28Chouserthe only high-order functions that provide any state from previous iterations are reduce and iterate, right?
14:29rhickeyChouser: I think so
14:30Chouserand of those only iterate can produce a lazy sequence
14:31ChouserI probably should just use lazy-cons
14:32AWizzArdHow can I select (filter) every nth element of an collection into a new one?
14:33ChouserAWizzArd: take-nth
14:33Chouserwhich is essentially a special case of partition
14:34rhickey?
14:34AWizzArdIn the mathematical sense?
14:35Chouser(defn take-nth [n c] (map first (partition 1 n c)))
14:36rhickeythat's not a case of partition
14:36rhickeythat's a use of partition
14:36Chouseryes, of course you're right.
14:36ChouserI've forgotten the 'map first' detail before too.
14:37rhickeyI thought you had some way to do take-nth with just partition :)
14:37ChouserI did too. :-P
14:39rhickeyanyone planning on attending ILC 2009 in Boston this March 22-25?
14:40rhickeyand would you sit through a full day Clojure tutorial if there was one?
14:41Kerris7why do all the cool things happen on the other side of the pond :(
14:41Chouser...and half-way across the continent.
14:42rhickeyKerris7: I'm speaking at QCon in London in March also
14:42Kerris7:O
14:43Kerris7crumbs I'll have to put that down on my timetable
14:47rhickeyhalf day Clojure tutorial?
14:47rhickeyhate Boston?
14:47Kerris7rhickey: you'll be doing the Functional and Concurrent Programming Languages Applied track?
14:48rhickeyKerris7: no - Emerging languages in the enterprise - http://qconlondon.com/london-2009/tracks/show_track.jsp?trackOID=231
14:48Kerris7Alright, thanks.
14:49Chouserrhickey: can't get to Boston.
14:50Lau_of_DKrhickey: One thing I dont remember if you commented on before. I understood why you picked functional programming and concurrency as main focus points for clojure. But what made you settle on Lisp ?
14:50rhickeyLau_of_DK: Lisp is right
14:52Lau_of_DKSo would you say its primarily an emotional decision? :)
14:53rhickeyno
14:55AWizzArdLau_of_DK: Lisp can do what the other languages also can. But on top of it, you don't write programs as strings, but instead as something like parse trees. That gives you additional control that is harder to get in other languages.
14:55gnuvinceLau_of_DK: small core, very extensible, code can manipulate code
14:56ozy`Lau_of_DK: plus the parentheses look really neat
14:56gnuvinceLau_of_DK: the alternatives are slim
14:56Kerris7the QCon registration fees are impressive .__.
14:56ozy`(if you're going to do functional programming but you don't want to do lisp, the alternatives are basically ML and Haskell)
14:56AWizzArdThe parens are there mostly because we have functions that take any number of args, and to make writing macros easier.
14:56ChouserLau_of_DK: you could propose specific alternatives for us to shoot down. :-)
14:56AWizzArdozy`: Erlang and F#
14:57Lau_of_DKgnuvince, AWizzArd, thanks good points
14:57ozy`AWizzArd: you're right, there's Erlang. F# is basically ML though
14:57Lau_of_DKBut Im really interesting in what you mean rhickey, when you say that Lisp is right, what do you base that on ?
14:57Lau_of_DKChouser: Ive always been fond of the x86 Assembler language, its very concise and clean of misunderstandings and bloat
14:58gnuvinceLau_of_DK: the design has been pretty stable for 50 years and (most) other languages still don't have the capabilities that Lisp can provide.
14:58rhickeyamong other things, code is data
14:58rhickeyor should be
14:58AWizzArdLau: you just got the reasons what makes Lisp special. Usually it takes most people several years to understand this.
14:58ChouserLau_of_DK: lisp allows you to add new language primitives. Assembly does not. Next?
14:59Lau_of_DKAWizzArd: I know and Im familiar with Lisp and its history, so when I ask Rich its because I was interesting in his view on the subject specifically. Not because I dont have my own oppinion.
14:59Lau_of_DKChouser: HAHA
14:59Lau_of_DKChouser: I think C# coupled with Visual Studio provides awesome development speeds.
15:00ChouserLau_of_DK: lisp allows you to add new language primitives. C# does not. Next?
15:00Chouser:-)
15:00AWizzArdLau_of_DK: after Rich said it was not an emotional descision it means it must be something that Lisp has and most languages don't. So, the question was implicitly answered by then.
15:00AWizzArdLau: it is not C#, but the libraries of .NET.
15:00Lau_of_DKAWizzArd: Thanks alot
15:01AWizzArdReusing code is the productivity boost number 1.
15:01Lau_of_DKAWizzArd: wrong, Emacs is always #1
15:01AWizzArdIf you just need to say (foo 1 2) instead of writing 10-2000 LOC you are more productive.
15:02Chousukebasing a language on lisp also lets you not worry that much about what the syntax will be like, because it's extensible. After all, every decision you have to make limits what the programmer can (easily) do.
15:02rhickeySyntax is generally language fail
15:02AWizzArdC# does not offer anything important that Lisp doesn't. So in general you can't outperform Lisp with C#, language wise.
15:03AWizzArdAs soon libs come in the game is different. But Rich solved this problem, by giving Clojure all jvm libs.
15:03Lau_of_DKI said C# coupled with Visual Studio
15:03AWizzArdAn IDE can help.
15:03rhickeyBTW, I did not say only Lisp is right
15:03rhickeyBut C# is definitely wrong
15:04rhickey:)
15:04Lau_of_DK<rhickey> Lau_of_DK: Lisp is right
15:04Kerris7I just like the way how functional languages tend to encourage people to think before coding, rather than spending time sifting through APIs</anecdotal evidence>
15:04AWizzArdBut currently the AI in VS is smaller than the natural intelligence of most humans. So, VS won't help too much.
15:04AWizzArdAs soon Visual Studio becomes about as intelligent as humans, then languages won't matter any longer.
15:04ChousukeLau_of_DK: if C# with an IDE is nice, try to imagine clojure with an equally good IDE. :p
15:05Lau_of_DKAWizzArd: When was the last time you tried VS?
15:05Lau_of_DKThe intellisense there is insane nowadays
15:05Lau_of_DKChousuke: I am trying... hard :)
15:05Lau_of_DKMy Emacs is almost up to speed now :)
15:05AWizzArdLau: x = a+8; how can the ide help me here?
15:05AWizzArdI wanted to say x = a+9
15:05Lau_of_DKAWizzArd: I think you need to go to #newbies to have that answered :)
15:06AWizzArdNo Lau, the IDE can't understand humans and their intentions. It does all it do mechanically, without any thinking involved.
15:06AWizzArdAnd lot's of stuff that IDEs can do are not needed in Lisp anymore.
15:07leadnosespeaking about intentions, i found this a rather nice read: http://www.technologyreview.com/computing/18047/page1/
15:07AWizzArdThe ide has to provide this stuff, because otherwise languages like C# and Java would be impossible to write programs in.
15:09Kerris7Chousuke: do you use enclojure?
15:09AWizzArdWhat do we need setters/getters for in Clojure? It is nice that an IDE can insert the code for them, but they are useless.
15:10ChousukeKerris7: no
15:10AWizzArdThe wizards, that insert good bits of code are basically trying to simulate what macros do in Lisp.
15:10ChousukeKerris7: just SLIME
15:10gnuvincerhickey: are there other languages that you find "right"?
15:10ChousukeAWizzArd: heh. macros are more readable too
15:11Lau_of_DKAWizzArd: I disagree
15:11ChousukeAWizzArd: mostly because there's less to read.
15:11AWizzArdLau: with a few more years of Lisp experience you wouldn't, so let's talk in 2011 again
15:12Chousergnuvince: if there were, I imagine he'd be using them instead of creating Clojure :-)
15:12Lau_of_DKAWizzArd: Actually it might be you who need a little experience, but only time well tell
15:13rhickeygnuvince: compromises abound. Haskell has its own conceptual rightness, but is syntactically wrong
15:13ChousukeLau_of_DK: IDE code generation is basically manually copy-pasting expanded macros into your code :/
15:14kib2rhickey: why do you think Haskell is syntactically wrong ?
15:14Chousukeif you wanted to make some stuff expand differently after a while, that's impossible to do with generated code. You'll have to rewrite all expansions manually :/
15:14gnuvincekib2: probably because the syntax cannot be manipulated
15:15gnuvinceChouser: there can be others which are just not his cup of tea. I find Factor interesting for example, but don't see me writing code with anytime soon
15:15leadnosethere is always template haskell and liskell :)
15:16rhickeyleadnose: I definitely need to check out Liskell - does it come with a translator that turns ordinary Haskell into sexprs?
15:16kib2gnuvince: right, but I've heard of a project to handle sort of macros in haskell
15:17leadnoseI haven't actually tried it, just seems a neat idea with the type checking of haskell and flexibility of lisp and macros
15:17gnuvincekib2: TemplateHaskell. It's possible, but it's definitly a whole lot messier than Lisp
15:17kib2gnuvince: that's it !
15:17AWizzArdTemplateHaskell only showes that some Haskell coders think that something is missing with the Haskell syntax.
15:18rhickeyhaskell simply does too much with adjacency, you constantly have to parse, apply precedence etc. currying is too subtle
15:18kib2There's another interesting language : factor. It has macros, seems really powerfull but lacks docs.
15:18gnuvincekib2: there's a guy writing a tutorial that's pretty good
15:18gnuvincehttp://elasticdog.com/2008/11/beginning-factor-introduction/
15:19leadnoseI've found that haskell is sometimes kind of hard to read, it requires lot's of good taste to know how to write it neatly
15:19gnuvinceVery interesting language, very smart creator, but I have problems designing a solution with stacks
15:19kib2gnuvince: nice, thanks a lot.
15:19hiredmanclojurebot: what is the latest revision?
15:19clojurebotwhat is the latest revision is 1144
15:19rhickeyyeah, I just can't think that (stack) way all the time
15:19danlarkinpostfix syntax makes me think of the computer lab from university in which we had to write projects in postscript... bad memories
15:19hiredmanhmm
15:20gnuvinceI once tried to write map in Factor
15:20kib2gnuvince: I totally agree
15:20technomancydid factor move off or on to the JVM?
15:20gnuvinceIt's a piece of cake in any applicative language; in Factor, it was very hard.
15:20kib2technomancy: off
15:20gnuvincetechnomancy: it was implemented in Java originally, it's now only in C.
15:20technomancyah, interesting
15:20gnuvinceThe Java version isn't supported anymore.
15:25Lau_of_DKgnuvince: why this fascination with stack ?
15:27gnuvinceLau_of_DK: my fascination or in general?
15:28Lau_of_DKin general, what do these guys seek to accomplish with this focus on stack ?
15:28gnuvinceLau_of_DK: it's another way to organize a program, and it has some advantages over applicative languages.
15:29Lau_of_DKHow so?
15:31gnuvinceFor instance, you read it from left-to-right instead of inner-to-outer. It's easy to return multiple values, just push them onto the stack. It also makes combining words (functions) that return multiple values and consume multiple values easier.
15:32notallamameddling with continuations seems like it'd be trivial.
15:32Lau_of_DKThanks gnuvince
15:32kib2Lau_of_DK: stack is a simple concept, but you can make really beautiful things with it, ie look at the Postscript language
15:32Lau_of_DKI'll have a look see
15:33Chousukehm
15:33gnuvinceLau_of_DK: look at the elasticdog posts on Factor
15:33Lau_of_DKI read it
15:33notallamain my c class, my assignments generally have to produce postscript as output. i quite like it. most of my class does not.
15:33gnuvinceLau_of_DK: ok
15:34Lau_of_DKgnuvince: To me, it just looks like a dumb way to work with data, forcing a complexity on you which the language should actually remove
15:37gnuvinceI wouldn't call it dumb, although I would agree that it imposes a cognitive load on the programmer that we could do without.
15:38danlarkinOh jeez... just ran the numbers on this calculation I'm doing. At the current rate it'll finish in 6 years :-o Time to refactor
15:38gnuvincedanlarkin: what calculation is that?
15:38Lau_of_DKgnuvince: ok, what if we do this (def dumb "force a cognitive load on a programmer")
15:38Lau_of_DKWould you say its dumb then ?
15:38Lau_of_DK:)
15:38Chousukeall languages do that to an extent :P
15:39Lau_of_DKhehe
15:39danlarkingnuvince: something for work, 191 million calculations + store to the DB
15:40gnuvincedanlarkin: heh :)
15:40nsinghalI have a vector (def v [4 5 6 7]) what is the function to remove value 6 from the vector?
15:40Lau_of_DKfilter?
15:40danlarkingnuvince: and my boss thought this was going to be nightly cronjob :)
15:40Lau_of_DK(doc filter)
15:40clojurebotReturns a lazy seq of the items in coll for which (pred item) returns true. pred must be free of side-effects.; arglists ([pred coll])
15:40gnuvinceLau_of_DK: I wouldn't do this in the first place, I'd use a more appropriate var name ;)
15:40Chousernsinghal: vectors only grow/shrink effeciently on the right-end
15:41gnuvincedanlarkin: are you under a strict NDA, or can you tell us what these calculations are?
15:41Chouser(remove #{6} [4 5 6 7]) ==> (4 5 7) ...but that returns a seq
15:42Chousernsinghal: you can wrap it in (vec ...) to build a new vector from the results, but that's O(n)
15:43nsinghali probably use map where i am using vector - that list will really be changing frequently
15:43notallamaa c style language force a load on programmers and compilers without much of any benefit. a stack language puts a load on humans, but very little on the computer, so it allows you to reason about what parts of the code generation you can automate, much like a lisp, but with some differences.
15:44Chousernsinghal: 'remove' returns a lazy seq, which should work nicely if you're passing in a lazy seq from 'map'
15:45danlarkingnuvince: can't really say much, just a domain-specific algorithm designed by the client. At least it can be written as a pure function and easily parallelized
15:45gnuvincedanlarkin: ok
15:46nsinghalChouser - thx i will try to change my vector and use other data structure
15:46Chousernsinghal: if you're doing a lot off adding/removing from the middle you might like a hash-set or sorted-set
15:47Lau_of_DKDoes anyone else wonder a little about CGrandes latest blogpost/ understand why it is so ?
15:47nsinghali will read up on hash-set and sorted-set - never used them
15:57kib2I just buy "Programming with Clojure". Hoping it's a good book.
15:57technomancyit is
15:57kib2technomancy: thanks
16:06AWizzArdhttp://pragprog.com/podcasts/show/24
16:08RSchulzkib2: The book is definitely good, even though it's just beta 3, right now. And you can find the author here and on the Clojure Google Group / mailing list.
16:08kib2whaoo...my old "clojure.jar" was 1.18 Mo, it's now 1.80 Mo : I should have missed a lot of new things !
16:09kib2RSchulz: yes, from what I'm currently reading, it misses some chapters, but the first 5 are here :)
16:09RSchulzStuart expects the next beta fairly soon.
16:09RSchulzHe knows we're chomping at the bit.
16:09danlarkinkib2: what's an Mo?
16:10RSchulzMegabyte
16:10RSchulzIn French...
16:10danlarkinah
16:10RSchulzMegaoctet
16:10danlarkinI see
16:10kib2danlarkin: MegaOctet
16:12danlarkinoctet makes a lot more sense than byte
16:13RSchulzEspecially since there are computers out there with, say, 10-bit bytes.
16:13RSchulzUnivac is 36-bit word, 9-bit byte.
16:13notallamait also sounds cooler.
16:13RSchulzI don't know if they're still made, though.
16:13RSchulzWe had one back in school.
16:14RSchulzBatch mode. Card readers. Very old-school.
16:14RSchulzAnd there are nybbles, too: 4 bits.
16:18danlarkinwe read about univacs in history books in school :)
16:23kib2is someone here using a Win XP os with Clojure ? I've got problems in setting my CLASSPATH correctly (from the book)
16:23mehrheitdanlarkin: is that an emacs variant?
16:24ChouserI don't think there's currently a foo such that (foo + [1 2 3 4 5]) ==> (3 6 10 15), right?
16:24danlarkinmehrheit: ha! http://en.wikipedia.org/wiki/UNIVAC_I
16:24RSchulzkib2: Are you using Windows-style CLASSPATH syntax? Semicolon separators, in particular?
16:24kib2RSchulz: yes
16:24RSchulzWhat symptom are you getting?
16:25mehrheitdanlarkin: well, the plural sounds similar
16:26kib2RSchulz: "could not find the main class : clojure.lang.Repl"
16:26RSchulzmehrheit: Univac is a mainframe computer from the 70s and before.
16:26rhickeyChouser: no
16:26RSchulz(or maybe _was_)
16:26RSchulzHow sure are you that your CLASSPATH is correct?
16:26RSchulzAnd are you sure it's established as an environment variable?
16:27RSchulzAre you using CMD.exe or Cygwin?
16:27kib2The book told me to make a bat file with "SET CLASSPATH=/jars/clojure.jar;/jars/clojure-contrib.jar;etc." but what is "/jars" supposed to be ?
16:27Chouserrhickey: ok, thanks.
16:27kib2RSchulz: CMD.exe (via Console2)
16:27rhickeyChouser: http://www.zvon.org/other/haskell/Outputprelude/scanl_f.html
16:28RSchulzThat's just an example You have to use the actual drive letter and directory in which you have your Clojure JAR file.
16:28RSchulzI strongly recommend Cygwin for programmers using Windows.
16:29notallamawindows powershell looks like it's fairly non-horrible too.
16:29kib2RSchulz: sure, that's what I've did but it does not work.
16:29Chouserrhickey: excellent, thanks.
16:29RSchulzCheck by taking the file names from the CLASSPATH and checking that you can access them by that name.
16:30rhickeyChouser: deja vu: http://paste.lisp.org/display/68046#2
16:30notallamakib2: does it work with the -cp flag, instead of setting the global classpath?
16:30Chousersheesh
16:31RSchulzIt should.
16:32hiredmanclojurebot: scanl is http://paste.lisp.org/display/68046#2
16:32clojurebotOk.
16:33hiredmanstupid functional programming stuffs being so useful
16:33hiredmanChouser: that inits thing you mentioned yesterday is now used in clojurebot for fuzzy matching stuff
16:33hiredmanthe doc string for the inits function says "this is chouser's fault"
16:34Chouserhiredman: gah. I can't remember a thing. Did I post an implementation or something?
16:35hiredmanyou were looking for inits, then remembered you had looked for it before
16:35hiredmanthen pasted a url for irc logs, where you had pasted a link to an implementation
16:35Chouseroh, right. but it was my implementation, not rhickey's. I coulda sworn he wrote a better one...
16:36hiredmanclojurebot: please pontificate on the subject of multimethods
16:36clojurebotmultimethods is what separates the boy from the man.
16:37RSchulzMaybe you need some pithy noun-oriented vs. verb-oriented programming aphorism in there...
16:37lisppaste8kib2 pasted "batch file" at http://paste.lisp.org/display/71603
16:38technomancyman... the next time I do anything like that I'm flagging it with huge FIXME/HACK comments.
16:38kib2I've now got the REPL, but typing "(require :verbose 'clojure.contrib.str-utils)" raise an error
16:38RSchulzSome of the nastiest bugs I've written have been in "mostly immutable" data structures. That 1% mutability can kill you...
16:39technomancyRSchulz: actually this is not a clojure project, it's just a project that would be way simpler in clojure.
16:39hiredmankib2: you don't have clojure.contrib in the cp
16:39technomancythis is my jruby stuff from work
16:39RSchulzAnd the bugs I mentioned were in Java code. (Of course.)
16:39technomancyheh
16:39hiredman-cp %CLASSPATH%;%CLOJURE_DIR%
16:39technomancythe worst is when the problem is in your test fixtures and you think it's in the implementation
16:39hiredmanand you are playing pretty fast and loose with / v. \
16:39kib2hiredman: I've got a line "set CLASSPATH=%CLOJURE_DIR%\clojure-contrib.jar"
16:40hiredmankib2: yeah, well, that is being ignored for whatever reason
16:41RSchulzYou might try sticking an "echo" in front of the Java invocation so you can see precisely what's being passed.
16:41hiredmanclojurebot: how can I have a "jar directory" where I can put all my libs and have java pick them up?
16:41clojurebota is b
16:42RSchulzDon't let an objectivist hear you say that.
16:42hiredmancurse you fuzzy matching
16:42hiredmanclojurebot: how can I have a "jar directory" where I can put all my libs and have java pick them up?
16:42clojurebota is b
16:42RSchulzIs clojurebot speaking without being spoken to?
16:42hiredmanhmmm
16:42hiredmanno
16:43RSchulzOh. There it is.
16:43hiredmanclojurebot: how can I have some "jar directory" where I can put all my libs and have java pick them up?
16:43clojurebotjar directory is -Djava.ext.dirs=$LIBS
16:43kib2hiredman: "cp %CLASSPATH%;%CLOJURE_DIR%" --> my system tells me it needs more arguments
16:43hiredmanso the fuzzy matching needs tuning
16:44ozy`hint for people using clojure on a mac: put the jar in /Library/Java/Extensions
16:44RSchulzkib2: Is that an invocation of "cp"?
16:44kib2RSchulz: yes
16:44hiredmankib2: just do "java -Djava.ext.dirs=%CLOJURE_DIR%" and forget about your classpath
16:45RSchulzWell, you need to give individual names, not PATH-like syntax and a destination, of course.
16:46hiredmanRSchulz: the java.ext.dirs= thing works with a directory
16:46hiredmanand you just dump your jars in there
16:46RSchulzYes, that's handy.
16:47RSchulzIs there a provision for multiple directories using -Djava.ext.dirs? Comma-separated list, maybe?
16:47hiredmanI think that is correct
16:47RSchulzOr maybe the local platform's native PATH-style syntax?
16:48hiredmancolon seperated
16:48RSchulzBut colon-separated would be a big problem on Windows!
16:49lisppaste8kib2 annotated #71603 with "fixed" at http://paste.lisp.org/display/71603#1
16:49kib2Finally got it ! :)
16:52RSchulzThe answer is here: http://java.sun.com/j2se/1.4.2/docs/guide/extensions/spec.html
16:52RSchulzIt is indeed the platform-specific PATH separator.
16:53RSchulzkib2: What was amiss?
16:57hiredmanugh
16:58RSchulzYou can't kill Java. It's immortal.
16:58technomancythat or undead.
16:58kib2RSchulz: I don't know really. I've "set CLOJURE_CONTRIB=" then "java -cp %CLOJURE_CONTRIB%;%CLOJURE_JAR% clojure.lang.Script %1" and it works
16:59technomancyRSchulz: the two are easily confused
16:59RSchulztechnomancy: Yeah. It's as likley the latter.
17:00RSchulzWell, we need the JVM, after all.
17:00technomancyright. I've aliased "java" to "jvm" in my shell just to avoid confusion between the runtime and the language
17:09hiredmanugh, one of the first things I wrote in clojure was a xmpp repl bot, and I am revisting xmpp, but now the smack library just wants to sit there and throw exceptions
17:43olgenhi, i have a small problem with namespaces in my clojure installation
17:43olgeni downloaded the svn version (rev. 1144)
17:44olgeni have a problem getting access to the names in the clojure namespce
17:44olgenwhich boils down to:
17:45olgenDingo:~/local/clojure/trunk jacobm$ java -cp clojure.jar clojure.lang.Repl
17:45olgenClojure
17:45olgenuser=> (clojure/refer 'clojure)
17:45olgenjava.lang.Exception: No such namespace: clojure (NO_SOURCE_FILE:1)
17:45olgenuser=>
17:45olgenanyone knows what i am doing wrong?
17:46danlarkinclojure.core
17:46hiredmanclojure is now clojure.core
17:48olgenuser=> (clojure/refer 'clojure.core)
17:48olgenjava.lang.Exception: No such namespace: clojure (NO_SOURCE_FILE:7)
17:48olgeni guess thats not what i should do?
17:50dudleyfolgen: No, clojure.core is already 'refer'ed for you
17:51olgenyes it works in the repl, but when i try working in my own namespace, i loose access to the clojure functions in the clojure.core namespace
17:51olgeni read somewhere that i then had to (clojure/refer 'clojure) after the (in-ns 'mynamespace)
17:51dudleyfolgen: If you're creating a new namespace, you should use the ns macro
17:52dudleyf(doc ns)
17:52clojurebotSets *ns* to the namespace named by name (unevaluated), creating it if needed. references can be zero or more of: (:refer-clojure ...) (:require ...) (:use ...) (:import ...) (:load ...) (:gen-class) with the syntax of refer-clojure/require/use/import/load/gen-class respectively, except the arguments are unevaluated and need not be quoted. (:gen-class ...), when supplied, defaults to :name corresponding to th
17:52olgenoki thanks
17:52dudleyfThe clojure/refer stuff is out of date
17:52olgenok
17:54dudleyfolgen: BTW, the refer function is clojure.core/refer now
17:55dudleyfnamespace/name
17:55olgenoki, thanks for the help guys
17:55dudleyfnp
18:07kib2good night, thanks for all
18:38technomancydoes the clojure-mode author hang out in here?
18:39dudleyftechnomancy: Not that I know of
19:26hiredmanclojurebot: well?
19:26clojurebotExcuse me?
19:27danlarkinclojurebot: get your act together
19:27clojurebotGabh mo leithsc�al?
19:31clojurebotsvn rev 1145; made RT.DEFAULT_COMPARATOR use Util.compare
19:33duck1123did clojurebot just die?
19:33duck1123I have my parts hidden
19:39RSchulzclojurebot: how many things do you know?
19:39clojurebotExcuse me?
19:39RSchulzclojurebot: what do you know?
19:39clojurebotIt's greek to me.
19:39RSchulzclojurebot: how much do you know?
19:39clojurebotI know 80 things
19:39hiredmanclojurebot: latest?
19:39clojurebotlatest is 1145
19:39technomancysounds like he's suffered a blow to the head
19:39RSchulzI think clojurebot's alive and ... speaking.
19:46clojurebotsvn rev 1145; made RT.DEFAULT_COMPARATOR use Util.compare
19:46hiredmanclojurebot: now keep doing that
19:46clojurebotExcuse me?
19:51clojurebotsvn rev 1145; made RT.DEFAULT_COMPARATOR use Util.compare
19:53hiredmanuh
20:02danlarkinevery 5 minutes?
20:02danlarkin:)
20:03danlarkinoh, nevermind I guess that was over 5 minutes ago
20:12gnuvince_Those videos are awesome :)
20:12duck1123took a while to download
20:13duck1123the direct download was faster than the torrent
20:19RSchulzWatching? Lectures?? SICP??? Where do I find these lectures?
20:20danlarkin*ditto*
20:22RSchulzPerhaps this? http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/legal-info.html
20:23RSchulzOr, maybe, this: http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/
20:23RSchulzOh, NO, Mr. Wizzard!!!
20:41danlarkinI dig the opening music
20:46mortis`thos are good lectures, the book is good too
20:52RSchulzdanlarkin: You need to check out Wendy / Walter Carlos' recordings!
20:54RSchulzOr, perhaps, more conventional recordings of Bach's music.
20:54RSchulzBach is, of course, eternal!
20:54danlarkinOH I hear about him/her on NPR the other day
20:55danlarkinI can't recall on which program
20:55RSchulzReally? I missed that one. I have vinyl of both "Switched-On Bach" and "Switched-On Bach II" (from my high school days)
20:56danlarkinever listen to p d q bach aka Peter Schickele?
20:57RSchulzYeah. Once upon a time. Not lately.
20:58danlarkinI love his sense of humor
21:02RSchulzGlenn Gould once wrote of Wendy's Bach recordings (incidentally on the back of her Well Tempered Synthesizer LP), "Carlos's realization of the Fourth Brandenburg Concerto is, to put it bluntly, the finest performance of any of the Brandenburgs--live, canned, or intuited--I've ever heard."
21:03RSchulzI listened to those albums over and over. I'm glad how reverently I treated my LPs. They're probably still in good condition, though I lost track of my last turntable many years ago...
21:04RSchulzYou think if Bach were reincarnated today he'd be a Lisp programmer?
21:05danlarkinI doubt he'd be playing music
21:06RSchulzWell, not as a profession.
21:07RSchulzI learned at least one two-part invention. It helped me realize that music was _not_ my future...
21:07RSchulzBut music does seem to have very salient effects on young people's brains.
21:12Chouserrhickey: typo at http://clojure.org/atoms "needs" should be "need"
21:32rhickeyChouser: fixed - thanks
21:47larrytheliquidhttp://clojure.org/vars "provides 3 distinct mechanisms for doing so in a controlled manner - Vars, Refs and Agents. "
21:47larrytheliquid^ should be 4 now
21:51jeremy__larrytheliquid: really? what's the fourth?
21:51Chouserjeremy__: http://clojure.org/atoms
21:52jeremy__ah thanks
22:15duck1123jhtff7
22:15duck1123huybg7uhuy7buyughb y ihgyibgho g cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
22:17duck1123I am sorry about that, my daughter got ahold of the computer
22:18notallamamy frend's cat sent me a screenshot of her desktop over msn once. it was pretty fancy.
22:48johnwaynertomhickey: on http://clojure.org/api the section for (gensym) has "the prefix is 'G<u>'." which is causing the entire rest of the page to be underlined. Probably want &lt;u&gt;
23:29hiredmanclojurebot: please explain map to me
23:29clojurebotmap
23:29hiredmanhmm
23:29hiredmanclojurebot: tell me about map
23:29clojurebotmap
23:31hiredmanclojurebot: tell me about map
23:31clojurebotmap is *LAZY*
23:31hiredmanoh
23:56danlarkinnice