#clojure logs

2009-01-02

00:07PuzzlerHow do I rebuild Clojure from source?
00:07PuzzlerDo I need to download and install ant?
00:08durkayou need ant yes
00:08durkaor maven perhaps?
00:08PuzzlerIf I make a change to core.clj, do I need to rebuild for that to be seen?
00:08durkabut i don't know maven
00:08durkai think so yes
00:08durkaonce you have ant, just run it in the clojure directory
00:09PuzzlerEven though I've installed the Java JDK, that doesn't mean I already have ant on my machine, right? It's a separate install?
00:10durkaeasy to find out
00:10RaynesAnt is a separate install.
00:10Raynesant.apache.com
00:16Raynesrhickey_: If you write a book about clojure, I want an autographed copy. :>
00:42Rayneshttp://www.pragprog.com/titles/shcloj/programming-clojure
00:56chrisnI might create some macro around io! so I can mark a function as being io related.
00:57chrisnSeems like metadata you could tell the compiler
02:33knapris there a way to measure memory-use of a function?
02:40Lau_of_DKGood morning gents
03:12PuzzlerI want to override map with my own definition; any idea why this line isn't working?: (ns mymap (:refer-clojure :exclude [map]))
03:13PuzzlerWhen I then go define map, it still tells me I'm in conflict with core's map
03:14dhayaIt seems to work for me.
03:15dhaya(I tried it in the repl)
03:15PuzzlerI restarted my REPL, and it worked. Thanks.
03:24PuzzlerWhat's the syntax for :require...:as? This doesn't seem to work: (ns permutations (:require utilcollections :as uc))
03:24PuzzlerCan't find an example in the docs.
03:24dhaya(:require [util.ns :as util])
03:26PuzzlerThx
03:29dhayathe doc for require/use etc can be more helpful with some examples.
03:33knaprcan i do somehow: (get-keyofval {0 :c 1 :g} :c) ?
03:33knapris there a builtin i mean...
03:33dhayaAh. I was searching for this: http://en.wikibooks.org/wiki/Clojure_Programming/Examples/API_Examples
03:34Lau_of_DKknapr: You want the key which holds a given value?
03:35knapryes
03:35dhayaknapr: There is map-invert, if thats useful?
03:36knaprin contrib?
03:36dhayaclojure.set
03:43Lau_of_DKuser> (def abc {:a 5 :b 10})
03:43Lau_of_DK#'user/abc
03:43Lau_of_DKuser> (filter #(= (val %) 5) abc)
03:43Lau_of_DK([:a 5])
03:43Lau_of_DK
03:44Lau_of_DKCouldnt you just filter?
03:45knapris it not possible to breka a for-comprehension?
03:46dhayaknapr: for takes a :while option.
03:47dhaya,(for [i (range 1 10) :while (< i 5)] i)
03:47clojurebot(1 2 3 4)
03:48knapris there when-not as option or something?
03:49dhayathere is :when and :while
03:49knaprcan i somehow the eval the loop-step and then quit rather than quit before it is evaled?
04:00Lau_of_DKknapr: How about writing your own loop/recur?
04:08PuzzlerActually, since filter is lazy, just use first on the filter, and that essentially works as if it is "breaking" out of the loop?
04:23PuzzlerIs there a way to :use a namespace in way that intentionally clobbers names that have already been imported from other namespaces (such as from clojure's core)?
04:29cgrandpuzzler: :refer-clojure :exclude (see (doc ns))
04:30PuzzlerRight, but I want to clobber a whole bunch of functions from the core. So I was hoping there ways a way to do it automatically with a flag to :use, rather than having to explicitly list all the ones I'm excluding.
05:19knaprany plans on adding something like (doc-all hash-map), a doc-function that returns a list of all functions that operates ona specific function in core.
05:51knapris there a way to measure memory-use of a function?
05:53karmazillaknapr: not easily. you can make a memory dump (jmap & such) and investigate what that particular IFn instance is holding on to with tools like Eclipse MAT
05:56karmazilla... asuming you're using the Sun JVM
06:18knaprwhat is the idiomatic Clojure waywhen recursing to build up a new collection? loop+recur or lazy-cons?
06:31ChousukeAre you sure you're limited to those two options? :)
06:32Chousukeif you can use map or something that would be even better.
06:49lisppaste8knapr pasted "monty hall, ugly, tips?" at http://paste.lisp.org/display/72949
06:49knapri made avery long and ugly implementation of a Monty Hall simulation
06:49knapryou know that counter-intuitive probability-example
06:50knaprhttp://en.wikipedia.org/wiki/Monty_Hall_problem
06:50knapranyone could show me how to simplify it?
06:51knaprhmm actually i dont need hashmaps i could just rand numbers and check
06:53ChousukeI think (hashmap choice) is more idiomatic than (get hashmap choice)
06:54knaprok
06:54Chousukeand rather than checking for "(if (nil? foo)) it's more idiomatic to either check for (if foo) or (if-not foo)
06:54knapranyway i could obv simolify it a lot isee now
06:55knaprb not using hashmaps at all
06:56Chousukealso in (if foo bar nil) the nil is redundant, since it's the default :)
07:25lisppaste8knapr annotated #72949 with "much nicer!" at http://paste.lisp.org/display/72949#1
07:25knaprhttp://paste.lisp.org/display/72949#1
07:26knaprthere it is, much nicer and shorter
08:24leafwdoesn't the doc string print when calling (doc fn-name) ?
08:24Lau_of_DKyes sir
08:24leafwI have: (defn area [r] "Computes area of a rectagle." (* (.width r) (.height r)))
08:25leafwbut (doc area) prints user/area ([r]) nil nil
08:25leafw?
08:25Lau_of_DKtry (defn area "bla bla" [r] (code))
08:25leafwI thought defn was a macro that automated the process of placing he documentation string.
08:26leafwok!
08:26leafwthanks
08:26leafwbut then, how come it doesn't fail? It just evaluates to itself and does nothing?
08:26leafwI mean the doc string
08:27karmazillavery true, sir. the string evaluates to itself and does nothing
08:27leafwgreat.
09:00leafwquestion about = vs. == :
09:00leafw(== Rectangle (.getClass r)) --> false
09:00leafw(= Rectangle (.getClass r)) --> true
09:01leafwI understand that '=' uses .equals() method
09:01karmazilla== is for numbers
09:01leafwwhereas == is value comparison. Is that right?
09:01leafwwell, what I want to compare is pointers: the Rectangle.class and the r.getClass() should be the same object.
09:02leafwthe .equals() does a very deep comparison, all the way to ClassLoader.
09:03karmazillaidentical? is what you're looking for
09:03leafwaha
09:04leafwthanks
09:04leafwindeed.
09:04karmazillaalso, find-doc is made of awesome
09:06leafwclojure doc function printouts needs a "see also" section.
09:06karmazillawell, to a degree anyway :)
09:06leafwi.e. =, == and identical? are not logically refered to in the docs. Is there any other comparison that I should be aware of?
09:08karmazillajava.util.Arrays has some stuff for comparing arrays
09:10leafwthanks.
09:12karmazillaclass (indeed any type) comparison/checks are pretty cheap, though
09:16leafwtry doing a few million ...
09:17karmazillaunder what time constraints? :)
09:20leafwmilliseconds
09:20leafwI had to make a quadtree first ...
09:20leafwin any case, lunch time
09:21karmazillathat's a tough nut. But I still think it'll be all the other stuff that .equals() might do, that'll be the time sink. The checkcast and instanceof bytecodes compilers to pointer comparisons or something like that.
09:46Lau_of_DKHey sohail
09:53sohailhey Lau_of_DK
09:55Lau_of_DKsohail: Its been a while since you ranted in here, what are you working on these days?
09:57sohailLau_of_DK, little of this, little of that :-)
09:59sohailLau_of_DK, how about you?
10:01Lau_of_DKMostly ClojureQL these days
10:26Chouserclojurebot: reduction?
10:26clojurebotreduction is http://groups.google.com/group/clojure/msg/4f7e3ca1af3b8b18
10:33Chouserclojurebot: trace?
10:33clojurebotHuh?
10:34Chouserclojurebot: trace is http://groups.google.com/group/clojure/msg/6fd1b352ac1a6744
10:34clojurebotc'est bon!
10:35sohailLau_of_DK, I'm so out of it I don't even know what that is
10:35sohailis that sql in clojure
10:35Lau_of_DKYes sir, it is
10:36sohailhave a link?
10:36Lau_of_DKhttp://github.com/Lau-of-DK/clojureql/tree/master
10:36Lau_of_DKWe havent worked on the docs yet, so give us about 10 days, and we should be in RC
10:37sohailI see test-macs
10:37sohailcute :-)
10:40stuarthallowayLau_of_DK: is the API stable now, but for docs?
10:42Lau_of_DKstuarthalloway: No I wouldnt say so. Queries work flawless but were still implementing commands and finalizing design
10:43Lau_of_DKsohail: Oops, forgot to take that out :)
10:43stuarthallowayLau_of_DK: I am writing the SQL part of the book this weekend, I'll take a look at this and maybe add a short description
10:44Lau_of_DKstuarthalloway: Cool, I'll work faster tonight, and (apply spank kotarak) so he will do the same :)
10:47Chouserrhickey: is it possible that triggering of watchers is getting coalesced in some way that they didn't previously?
10:54rhickeyChouser:shouldn't be - there is a change check, no action sent if identical state, before there was a boolean indicator
10:55Chouseroh! ok, that would be different enough to explain what I'm seeing.
10:56ChouserI have an atomic counter of updates with pending watchers. I inc on update, dec when the watcher fires, so when the counter touches 0 I know all pending work is complete.
10:58rhickeyso that breaks when work doesn't modify state?
11:03Chouserright
11:03ChouserI used to do subsequent send's only if there was a change, but dec my counter regardless.
11:04abrooksChouser: It seems like watchers should only trigger on change. Don't you want a commutable decrement of a ref on work done? (i.e. don't use an atom).
11:04ChouserI can't avoid the extra inc's because I don't know until after the action if there will be a change. I suppose I can move the dec to the action, but that makes it no longer a pure function.
11:06Chouserabrooks: I'm using AtomicInteger not an atom, but either way doesn't really matter here.
11:07stuarthallowayhow do I get paste.lisp.org to announce pastes here? Whenever I choose #clojure, it tells me I have entered the Captcha incorrectly.
11:08stuarthallowayand, why does this run out of heap space? http://paste.lisp.org/display/72958
11:08ChouserThe only purpose of the counter is to determine when all agent sends are complete, so it's bookkeeping not part of the algorithm itself.
11:08Lau_of_DKstuarthalloway: What do you enter in capchta?
11:08abrooksChouser: I realize that. It's still part of the effect of the transaction, though.
11:09Lau_of_DKstuarthalloway: and do you use this url? http://paste.lisp.org/new/clojure
11:09stuarthalloway"Lisp" works fine if I do not select #clojure, but once I do that it fails
11:09Chouserabrooks: there is no transaction
11:09Lau_of_DKTry that link using all lowercase "lisp"
11:09abrooksChouser: Oh, what are the watchers watching?
11:10Chouserstuarthalloway: cgrande explained that one to me.
11:10stuarthallowayChouser: are you teasing me now?
11:10Chouserabrooks: the watchers are watching agents. This is for a projecteuluer puzzle I posted about: http://gist.github.com/gists/32494
11:11Chouserstuarthalloway: heh. gimme a sec
11:11abrooksChouser: I figured it was that. I don't know why I assumed you were watching refs (perhaps because I got all excited about general purpose watchers when they went in last night...).
11:12Chouserstuarthalloway: http://groups.google.com/group/clojure/browse_thread/thread/3edf6e82617e18e0/3cd0cb80a93aae4a?#3cd0cb80a93aae4a
11:15rhickeyChouser: gotta run right now, will think about your problem
11:15Chouserrhickey: ok, thanks.
11:15stuarthallowayChouser: shouldn't we pull fibs from clojure.contrib.lazy-seqs?
11:16stuarthallowayI thought it was broken because it held the head (it is)
11:16stuarthallowaybut you are suggesting that even if it didn't, the approach is still busted
11:16stuarthallowayr/pull/fix
11:16Chouserbut the definition itself is so pretty...
11:17stuarthallowaybut bad style
11:18Chouserapparently.
11:18Chousersame for powers-of-2
11:20stuarthallowayChouser: I am having trouble convincing myself that my fibs has the same issue: it overflows the heap, not the stack
11:23Chouserbut the code is almost identical
11:23stuarthallowayChouser: Yep, and I won't be happy until I understand the different outcome
11:24ChouserI guess I've never paid attention to which kind of memory I was running out of.
11:27Chouserstuarthalloway: perhaps the difference is the amount of memory each item in the seq requires?
11:27Chouserin both, the stack is getting very deep, with each frame pointing to a successive object in the seq being produced
11:29Chouser...but with 'reductions' the items being pointed to are probably all Integers, while 'fibs' is getting into some very large BigIntegers, all of which are presumably stored on the heap?
11:30stuarthallowayChouser: it actually runs out before getting to 100!
11:32stuarthallowaywhich means something combinatorially bad is happening
11:33Chouser(nth fibs 100000) works for me
11:33stuarthallowayusing the one in contrib?
11:33Chouseryes
11:34stuarthallowaythat one is broken in a different wya
11:34Chouseroh
11:34stuarthallowayit holds the whole collection
11:34stuarthallowaywhich is fine until it burns the whole heap
11:34Chouseroh!
11:35Chouserwith the fn version, you're not getting the caching effect of seqs
11:36stuarthallowayThis one seems friendly to both stack and heap: http://paste.lisp.org/display/72958#2
11:37stuarthallowayworks for n=1 million
11:38stuarthallowayChouser: I was expecting to get the caching effect, but have parallel caches for the first and rest expr, but you're right, that ain't happening
11:40Chouserit's amazing how hard I have to work to understand the implications of 4 simple lines of code.
11:42stuarthallowayLikewise, and this is Not A Good Thing. We need some shortcuts for thinking about these.
11:43Chouser#2 in your paste looks very good.
11:45stuarthallowayI'll suggest it to Steve
11:46ChouserI wonder how much a more descriptive name for the inner function, or using 'let' to shift things around a bit would help one understand it.
11:46Chousermy guess would be "not very much". :-/
11:48stuarthallowayChouser: It isn't the big integers. Here is a variant that gets no bigger than 1: http://paste.lisp.org/display/72958#3
11:53Chouserlasts a long time
11:59Chouserjava.lang.OutOfMemoryError: GC overhead limit exceeded
11:59Chouseris that heap?
11:59stuarthallowaynever seen it, but would think so
11:59stuarthallowaymy error was a simple "out of heap space"
11:59RSchulzYou're getting so close to being out of memory that reclamation is taking too long.
12:00stuarthallowayI am trying to figure out big O for time and space
12:00stuarthallowayby running it, not by thinking :-)
12:01RSchulzI think that happens in part when there's a thread that can run without requiring allocation, which then eats into the CPU time available for the GC thread and the watchdog timer calls a halt to its (GC thead's) activity.
12:03stuarthallowaycheck out http://paste.lisp.org/display/72958#4
12:05stuarthallowayso (bad) is pretty bad. The laziness keeps the recursion from being stack consuming, but boy does it use some heap!
12:07stuarthallowayso here is my attempt at a summary explanation:
12:08stuarthallowayHolding the head (as contrib currently does) is bad, because if you want to work with big numbers holding the head will cause you to consume the whole heap
12:09stuarthallowaystraightforward conversion from collections to function calls is disastrous, because the sequence will get realized a huge number of times (e.g. http://paste.lisp.org/display/72958#4)
12:10stuarthallowayinstead, you need to write the lazy collection as a function that "carries its cursor with it", e.g. http://paste.lisp.org/display/72958#2
12:16stuarthallowayclearly I have scared you all away or bored you to death
12:17ChouserI wouldn't say that holding the head is always bad for seqs like this.
12:17RSchulzCan you rephrase that as a question?
12:17stuarthallowayChouser: true, if you don't ever plan to go large
12:17Chouserbut it is a design decision -- space vs. time.
12:17Chouserright
12:17stuarthallowaybut (IMO) false for a general purpose library
12:18stuarthallowaycallers should be able to choose realization/caching strategy, not have it inflicted on them by the API
12:19ChouserI agree for a general API.
12:19ChouserIt's easy for a user to say (def fibs (nice.lib/fibs)) if they want it cached.
12:20Chouserhm, though that doesn't allow the building function to take advantage of the cache.
12:20stuarthallowaythe building function only needs the last two items for a cache
12:21stuarthallowaywhich is what I meant by "carries its cursor with it"
12:21stuarthalloway...for fibs, anyway
12:22Chouserright, good point.
12:23Lau_of_DKYou guys havent worked out an optimal fib-seq yet?
12:25stuarthalloway(defensively). I am a biz app developer, not a mathematician. :-)
12:26Lau_of_DK(condescendingly) Of course, I completely understand
12:27stuarthallowaybut I will vote for http://paste.lisp.org/display/72958#2 until a mathematician shows up
12:27Lau_of_DK(that was a joke btw :-))
12:28Lau_of_DKDoesnt look too impressive :)
12:29stuarthallowaygood! I don't want to write anything so impressive that MarkV feels compelled to add comments :-)
12:32Lau_of_DKThat was an internal remark of some sort wasnt it ? :)
12:34leafwLau_of_DK: mailing list had an example recently. A guy looking for praising and attention.
12:34Lau_of_DKoh I see
12:34leafwclojure is fortunate to not have an add-more-fire benevolent dictator like openbsd does.
12:35Lau_of_DKWhat do you mean? We have The Chouser!
12:35leafwthat's a minor devil :)
12:35leafwconstructive one, even!
12:36stuarthallowayleafw: While I disagree with MarkV, I am not at all dismissive of his concerns
12:37stuarthallowayI see the solution in smaller functions and better names, not (in general) more comments
12:38leafwI agree.
12:38RSchulzI think a big problem with programming in general is how hard it is to understand code. It's often easier just to write something yourself rather than figure out someone else's code.
12:38RSchulzAnd I fear that dense languages like Clojure and other Lisps just make that phenomenon worse.
12:38stuarthallowayRSchulz: any code for which that is true is legacy code
12:39RSchulzYes, but we still get a lot of people saying, in effect: "If you want to use this code, you should read it." And that is no way to produce reusable software.
12:39ChouserI think that reading code is a different skill from writing code. While they of course interact some, being good at one doesn't automatically mean you're good at the other.
12:39leafwRSchulz: so true. This comment about lack of knowlege transfer between generations of programmers stroke a cord: http://news.ycombinator.com/item?id=405188
12:40stuarthallowayTo be concrete, I find 90% of core.clj to be totally readable, and not needing of comments
12:40Chouserreading code is harder than one might expect, and reading comments is no substitute.
12:40stuarthallowaycounterexample: destructure. I would like to see that rewritten or commented
12:40leafwstuart, the readability of core.clj is what brought me in in the first place. A language that can be read so directly must be doing something right.
12:41Chouserthus I think working and practicing at *reading* code is a worthwhile activity, at least as much as practicing writing code.
12:41RSchulzI also find that people tend to write production code as if it's a textbook algorithm, except all the support prose of a textbook is absent. That changes what good choice of names means, for just one example.
12:41Lau_of_DKI really hate reading code compared to writing it, takes just as long :)
12:42leafwLau_of_DK: you may not have tried to implement many algorithms ...
12:42leafwLau_of_DK: libraries of java is what makes clojure so appealing, don't forget that
12:42Lau_of_DKSure, but thats not really the point
12:42RSchulzAuthors (non-software authors) all know that they way to get good at writing is, in part, to do a lot of reading.
12:43ChouserRSchulz: yes, but reading code is hardly ever addressed as a useful skill of its own, to be pursued.
12:43Lau_of_DKChouser: But what Im saying is, that its a seperate skill to me at least
12:44RSchulzTrue. I don't recall ever having an exam in college which said: Given this C code (this was a few decades ago), tell me what it computes and analyze its time and space complexity.
12:44ChouserMany (myself included) tend to find it annoying, unrewarding, difficult. I don't think this is entirely the fault of the writers.
12:44ChouserLau_of_DK: that is also what I'm saying, plus that it's a desperately *useful* skill.
12:45RSchulzI wonder to what extent there's a subtle or latent NIH phenomenon in reading code. Technologists want to feel like an inventors, even when they're _re_inventing...
12:46ChouserI make no claims at all at being good at it, but hopefully recognizing that it's a useful skill will continue to help me persist longer at reading before giving up and writing. :-)
12:47RSchulzDid anyone read that Yegge blog referenced on the list yesterday? I particularly disagree with the "compression tolerance" bit. I think it's one of the biggest reasons code is hard to read.
12:47Lau_of_DKHehe
12:47Lau_of_DKMr. Schulz, NIH phenom ?
12:47RSchulzNot Invented Here.
12:47Lau_of_DKOIS
12:47Lau_of_DK(oh I see)
12:47leafwRSchulz: compressed code that is hard to read is either not compressed right or unnecessarily compressed.
12:48RSchulzWell, I know my coding style is not generally shared or liked, but I eschew the compression thing. My code is "light and fluffy."
12:48leafwRSchulz: but there is such thing as verbose code and succint code
12:48RSchulzI have to cut my line number counts about in half to compare them with others'.
12:49leafwI find myself thinking: does this line layout helpme understand this code one week from now?
12:49RSchulzAlthough I will admit, I find that now that I'm back to doing some Lisp (Clojure), that I'm doing that less and my Lisp / Clojure code is denser than my Java code.
12:49stuarthallowayI don't think these conversations ever get far without specific examples, so hats off to Mark for backing his point with rewritten code
12:49leafwone more, agreed. Idle talk ... this "Sunday" afternoon.
12:50RSchulzI will also give him credit for being adaptable in his position. I think he produced three distinct versions of his rewrite responding to feedback on the list.
12:50Lau_of_DKCan somebody produce a link to that discussion ?
12:50RSchulzhttp://groups.google.com/group/clojure/browse_thread/thread/48aacb9892a79bc4/a3ffff9b6a1206a6?lnk=gst&amp;q=Making+Code+Readable#a3ffff9b6a1206a6
12:51RSchulzStarts here: http://groups.google.com/group/clojure/browse_thread/thread/48aacb9892a79bc4/bc1497883699dab9
12:53RSchulzstuarthalloway: What's the status of your dual Clojure / "conventional" project? Has it started? Ended?
12:53stuarthallowayRSchulz: not begun
12:53RSchulzHave you picked the job, yet?
12:53stuarthallowayno, at this point we are talking about doing a second book, focused on something specific in Clojure
12:54stuarthallowayand moving the case study there
12:54RSchulzNo takers?
12:54stuarthallowaysome takers, no good fits
12:54RSchulzToo bad. It sounded like a really good idea.
12:54stuarthallowayits a timing thing, still might happen
12:54RSchulzI hope it does.
12:55leafwwhat is this project about?
12:55RSchulzHow's business? Is the economy hurting you?
12:55ChouserI do think the book has sufficient value without it.
12:56Chouserthe multimethod chapter alone may be worth the cover price. :-)
12:56Lau_of_DKRSchulz: thanks for the links
12:56RSchulzSure.
12:57stuarthallowayleafw: you tell me :-) http://blog.thinkrelevance.com/2008/10/20/participate-in-a-clojure-case-study
12:57leafwhaven't found a part of the book I could trash in any way so far. On the contrary, I am finding the book a nice refreshing and detailing of all clojure I learned from the website.
12:57stuarthallowayAw, shucks. :-)
12:57stuarthallowayRSchulz: if the business question was to me, no, not yet at leaste.
12:58leafwstuarthalloway: but what you say in the intro is true: the book is not for beginners.
12:58RSchulzYes, to you, stu. That's good to hear.
12:58stuarthallowayleafw: I think some Lisp dialects could be for beginners, but not Clojure
12:58RSchulzI'm surprised by how many people show up looking at Clojure without any prior Lisp background.
12:59stuarthallowayRSchulz; I think lack of Java background would be almost as tough
12:59RSchulzHas anyone used DrScheme? Replicating that for Clojure would be fabulous, though a pile of work, it seems.
12:59leafwstuarthalloway: I am actually doing such thing currently. I have a non-trivial app built in java which I am, part for fun, part for learning, part searching for proper concurrency setup, translating into clojure.
12:59RSchulzI suppose. But you can do Clojure programming while ignoring the Java parts, at least for academic purposes (understanding FP, e.g.)
13:00Lau_of_DKstuarthalloway: The book youre on, is it purely code-oriented, or do you have interviews with relevant parties?
13:01leafwstuarthalloway: clojure expects one to know java quite well, and hate/love it.
13:01ChouserI have extremely little Java background, though enough other OOP that it's not gotten in my way too terribly
13:01Chouser...not counting rants against classpath and java.io
13:01RSchulzLau_of_DK: You should buy the book, at least the PDF. Then you can get the betas (right now).
13:01stuarthallowayLau_of_DK: code
13:01Lau_of_DKRSchulz: What kinda percentages of the sale do you get ?
13:01leafwChouser: don't forget the File path mess cross-platform.
13:01waltersChouser: hopefully classpath stuff will be fixed with the modules/modularity work in 7
13:01RSchulzstuarthalloway: How much is my kickback?
13:02stuarthallowayyou can also check out the sample code for free: http://github.com/stuarthalloway/programming-clojure/tree/master
13:02ChousukeChouser: java.io is actually going to get replaced
13:02ChousukeChouser: by java.nip
13:02Chousukenio*
13:02Lau_of_DKThansk
13:02Lau_of_DKThanks
13:02RSchulzyeah, java.nip would be very rude!
13:02stuarthallowayand RSchulz gets 100% of revenue on people checking out the sample code :-)
13:02RSchulzWow! Set for life!!
13:03Lau_of_DKhehe
13:06ChousukeI think I need a new router :/
13:07Chousukeso far, most attempts to download files larger than 8MB have failed.
13:07RSchulzThe tubes are clogged.
13:07leafwreminds me of the 500-mile email
13:08ChousukeRSchulz: the tubes have enough for 200kB/s... but it just stops.
13:08RSchulzTubes further from you, that is.
13:09RSchulzI used to get 6Mbps, but when I moved, the best they could do for me is 3Mbps.
13:09ChousukeI think I'll just bypass the router for now and use a direct connection
13:09RSchulzProbably some bytes get turned sideways, causing the clog.
13:10RSchulzAnybody here involved with the DC Clojure study group?
13:35pjb3RSchulz: I'm involved with the DC Clojure study group
13:47Lau_of_DKRSchulz: I have to say in that thread you link, MarkV hits on a most excellent topic, Clojure, its code and its docs are not suited for new-comers, imo
13:53triddel1ok, simple question... given a vector ["a" "test"] how do I add a "\t" to the front of each value? I can't seem to get it with apply and str and keep the vector.
13:53Lau_of_DKuser> (map #(str \t %) ["hi" "there"])
13:53Lau_of_DK("thi" "tthere")
13:54triddel1thanks Lau!
13:54Lau_of_DKno probs
13:56mchurchLau_of_DK: I would agree with that. Clojure is still the "bleeding edge" right now.
13:57mchurchIt's a very cool language, but not the easiest to get into at present.
13:57Lau_of_DKmchurch: Yea, I know I spent some 3 - 4 months bleeding from the get go, always crying on Chousers shoulder, took a little break of 1 month or 2, came back, and everything (almost) made sense
13:57mchurchLau_of_DK: Is Clojure your first Lisp?
13:57Lau_of_DKBut the fact that the docs strings dont have examples are a stumbling block I think. I couldnt work out how to use condp from the doc-string, either that says alot about me, or the string (Im hoping the string)
13:57Lau_of_DKNo, coming from SBCL
13:59PuzzlerGood morning, all. You guys talking about the documentation thread?
13:59Lau_of_DKPuzzler: Yes
14:00mchurchLau_of_DK
14:00mchurchLau_of_DK: Where does one find the doc strings?
14:00kotarak(doc doc9
14:00clojurebotPrints documentation for a var or special form given its name; arglists ([name])
14:00kotarak(doc doc)
14:00clojurebotPrints documentation for a var or special form given its name; arglists ([name])
14:00mchurchCool.
14:00Chouserwhoa
14:00kotarakInteresting parser.
14:00mchurch.(doc +)
14:00mchurch,(doc +)
14:00clojurebot------------------------- clojure.core/+ ([] [x] [x y] [x y & more]) Returns the sum of nums. (+) returns 0.
14:00PuzzlerYes, there's no one perfect answer for "the right amount of documentation". But I think it's worth recognizing that Lisp code is somewhat less "readable" than code in other languages.
14:00kotarakmchurch: just (doc +)
14:00PuzzlerAnd I say this as someone who has been programming in Scheme and other Lisp-derived languages for 20 years.
14:00Lau_of_DKmchurch: from the your REPL, just type (doc condp) for instance
14:01kotarakwithout , and stuff
14:01mchurchPuzzler: I think Lisp code is denser, but as readable per amount of content
14:01mchurchkotarak: Yeah. I thought you needed a , to call the IRC Repl
14:01mchurch(+ 3 4)
14:01clojurebot*suffusion of yellow*
14:01Chousukemchurch: you need, but (doc is special
14:01mchurch,(+ 3 4)
14:01clojurebot7
14:02Puzzlermchurch: There are two main reasons I think Lisp code is less readable.
14:02mchurchWhat was *suffusion of yellow*?
14:02mchurch(+ 2 3)
14:02clojurebot*suffusion of yellow*
14:02mchurch(println "*suffusion of pink*")
14:02Puzzler1. The density, which you bring up.
14:03Puzzler2. But more importantly, all code has a certain visual sameness to it. In other languages, there's a lot of little visual things that distinguish loops from assignments from function calls from data.
14:04mchurchPuzzler: Ah, I didn't think about #2. You're right.
14:04Lau_of_DKThe main difference is the FP in this case. Normally youre looking at consequtive statements, here you're looking at wrapped data.
14:04Lau_of_DKIMO :)
14:05PuzzlerIt's definitely "elegant". But you have to read much more carefully to extract meaning out of the code you are looking at.
14:05mchurchLau_of_DK: But you can have FP without syntactic regularity, e.g. ML
14:05ChouserI often have to read lisp code from the inside out, to make sense of it.
14:05Lau_of_DKmchurch: Sure, but hows that relevant in a discussion about the approachability of clojure in its present state?
14:06mchurchLau_of_DK: ML has more syntactic cues, in part because of non-regularity, but also because the static typing means that there are more operators
14:06PuzzlerLau_of_DK: The relevance depends on how much you care about attracting others to the language.
14:06mchurchLau_of_DK: It says little about noob-friendliness at present, but it does indicate where the asymptote lies
14:07Lau_of_DKk
14:07mchurchLau_of_DK: Then again, I'm not fully sure that Lisps aren't noob-friendly, only because I think Scheme is a great (and powerful) noob language.
14:07Puzzleri recognize the readability as a tradeoff, and have still chosen to work with Scheme languages for many years. But I am aware that noobs will have difficulty with this.
14:08mchurchNot to say that Scheme is only a "noob language". Don't want any flamewars. ;)
14:08Puzzlermchurch: True. When I tutor kids in programming, I always use PLT Scheme. It's a GREAT first language. But kids don't have any expectations about what a program should look like, and they are writing short programs.
14:08Lau_of_DKmchurch: It depends on where you start, when I picked up SBCL I felt very lost, and very hard pressed to find a community
14:09mchurchPuzzler: Yep. Large programs are hard in any language, because the difficulty is conceptual.
14:09mchurchLau_of_DK: I found Practical Common Lisp to be of great help. Generally, I find languages easy to learn. It's outer-layer shit like make/build-system that are harder.
14:09ChouserPuzzler: would you consider Clojure for that context now?
14:09Lau_of_DKYes, PCL was also the ice-breaker for me, in a big way
14:09PuzzlerActually, I think most newcomers to LISP/Clojure would benefit from playing around with PLT Scheme and reading "How to Design Programs" at htdp.org.
14:10Lau_of_DKmchurch: also the SICP videos gave me alot to think about
14:10mchurchLau_of_DK: Yeah, SICP is awesome.
14:10PuzzlerChouser: Good question. I think there are a lot of ways that PLT Scheme provides a superior teaching infrastructure, so I'm not going to be changing my teaching pattern any time soon. But I'm more likely to use Clojure for my own projects.
14:10Lau_of_DKMaybe we could have Rich do a 20 hours SICP-Clojure series...
14:11PuzzlerChouser: And Clojure will my give students a real-world power tool they can use after learning Scheme. It's a pretty easy transition, I think.
14:11Chouserenough people are learning Clojure as it is. I hope Rich continues to concentrate on developing the language. the rest of us can teach.
14:11Lau_of_DKChouser: Good point
14:13ChouserPuzzler: I wonder if clojure's complexity surrounding mutable state which is a clear winner for real world programs would be innappropriate for learning.
14:14Lau_of_DKIt would be fantastic if the kids could actually learn something useable
14:14Lau_of_DKI remember 10 years ago in "high school" here we were doing Assembler
14:14PuzzlerChouser: Actually, it's amazing how in a functional language, you can teach interesting projects for years without ever even needing any mutable state.
14:15PuzzlerChouser: But yes, if you want to cover mutable state, it's a bit more complicated in Clojure (although not tremendously so). The main complexity comes from the fact that there are several choices, each with various advantages and disadvantages.
14:15PuzzlerFor me, the big educational win with Clojure would be the persistent vector data structure.
14:16PuzzlerMy students have a lot of trouble transitioning to vectors after using lists for months. The programming style is completely different.
14:16PuzzlerTo be able to manipulate vectors using the same first/rest interface is HUGE.
14:16ChouserPuzzler: interesting. I'm only asked occasionaly, but for a while I've been recommending Python as a good starting language, and I'm still contemplating if Clojure would be an appropriate alternative.
14:17Lau_of_DKSeriously.... Python?
14:17NafaiLau_of_DK: It's not perfect, but why not?
14:17Lau_of_DKNafai: I dare not say
14:18Lau_of_DKIt attracts... special people :)
14:18NafaiMust be special :)
14:18NafaiThough I admit I'm not enamored with it as I used to be
14:18PuzzlerYes, even though I teach kids PLT Scheme, if someone is asking me for a book that their kids can use to self-teach, I also point them towards Python. It's pretty accessible.
14:18NafaiAccessibility is a big thing, yes
14:19PuzzlerChouser: In theory, Clojure would be a fine for language for teaching, but there are so many little details about the environment (not the language proper) that make a difference to beginners. For example, error messages...
14:20Chouserheh
14:20NafaiYeah.
14:20NafaiSometimes the error messages are cryptic for those of us that are experienced Java / Lisp programmers :)
14:21mchurchI think Python's a good CS 1 language.
14:22mchurchAlthough, it's dynamically typed. ML would be cool, except build systems of compiled languages make large projects ugly, and not newb-friendly.
14:22PuzzlerI mostly agree with Norvig's essay about "What Programming Language should I learn?" Basically, kids should learn whatever language they can find someone to mentor them in, because they'll learn far better from a teacher/mentor/friend than a book.
14:22Chousermy greatest fear in recommending Python is that it indoctrinates another generation into syntax and mutable locals, which will later have to be weaned off of both.
14:23mchurchChouser: Why will they have to "be weaned off of" syntax?
14:23mchurchChouser: Concurrency is definitely a major player in the future, but I don't see it as self-evident that all languages of the future will look like Lisps.
14:24Lau_of_DKChouser: In which way are you enriched as a developer from learning Python ? To me is a wasteland of gigantic libs that do all the work for you and an ugly imperative syntax, which stimulates your brain as much as watching TV
14:25Lau_of_DK(and Im talking about Soaps and that type of TV)
14:25NafaiLau_of_DK: You don't like libraries?
14:25Lau_of_DKI dont like Python is more like it
14:26PuzzlerLau_of_DK: I find it interesting that you're so anti-python. To me, Clojure and Python have much in common. I've been billing Clojure to friends as the "new, functional Python".
14:26Lau_of_DKhaha
14:26NafaiLau_of_DK: What are your prefered languages?
14:26Lau_of_DKClojure
14:26NafaiAnything else?
14:26NafaiDo you program for a living?
14:27Lau_of_DKNot really, you could say that I manage developers
14:27Lau_of_DKI cant look at Python, seperate from the crowd it draws
14:27PuzzlerTo me, Python was the first language I tried with a rich set of data structures built right into the reader, and it was a real breath of fresh air. Clojure feels the same way, but it's chosen persistent data structures.
14:28NafaiDescribe this crowd to me?
14:28Chouserpython seems very nice to me for learning programing, compared to: C, C++, Pascal, Perl, Ruby, JavaScript, Visual Basic, Java, C#
14:28Lau_of_DKI have never heard so much meaningless religious garbage than I have from that crowd. Totally incapable of juding any scenario in an intelligent manner
14:28ChouserLau_of_DK: what would you recommend?
14:28NafaiI'm curious as to the perception as I used to be a big fan of Python
14:28Chousermchurch: macros are huge to me.
14:28Lau_of_DKChouser: For a beginners language?
14:29ChouserLau_of_DK: yes
14:29mchurchChouser: Interesting. I can't say I disagree with you.
14:29Lau_of_DKI'd say it depends on the person at little bit, but quickly steer into SBCL for 1 month, then head to Clojure
14:31mchurchChouser: Because I can see why you'd want to introduce that concept early on. Even for a dev in a language that rarely uses macros, the concept of code reuse and program generation underlies much of why FP is the pwn sauce... and macros are the highest and most general form of that.
14:31mchurchPuzzler: I think this was one of the things that impressed me about Python when I moved to it from Java.
14:31Lau_of_DKThere comes a point where is valuable to know the underlying dynamics of a system, but for something which stimulates you as a person to wholesome thinking in regards to code, I think you need to look at a lisp of some type, first learnings the perils of mutability, then moving in the more sane direction
14:32mchurchMy language trajectory was Basic -> C++ -> Java -> Python -> Ocaml -> Lisp(s)... a definite improvement at all links but the last, and a rough tie from Ocaml -> Lisp (although I'm better for having been exposed to both)
14:32Lau_of_DKMy point in regards to Python is just, that it doesnt stimulate, its feels like Punch-card programming in some ways
14:33NafaiLau_of_DK: What turns you off about the Python community?
14:33Lau_of_DKAny moron can do it, and thats fine, especially for morons, but if you want to develop out of that stage, you should start by hauling yourself in a more challenge direction
14:33NafaiLau_of_DK: And, what other than Clojure is stimulating to you?
14:34Lau_of_DKNafai: #1: I'll dig up a quote for you, someone posted it in here a while ago, and it was fantastic, Chouser to remember that quote?
14:35Lau_of_DKNafai: #2: There's too much to mention to be quite frank, I make it a point to drive myself effectively almost every day
14:35mchurchLau_of_DK: I think Python is a fine language, although I do like FP languages better.
14:35NafaiLau_of_DK: You would hate to deal with Java programmers then :)
14:35mchurchLau_of_DK: The difference between great languages and good ones is smaller than that between good ones and mediocre, and that's smaller than that between mediocre and bad. If Lisp is 10, Python's 8.5, Java's 6.5, and something like SAS would be a 0.
14:37mchurchLau_of_DK: I love using FP languages, but I don't actually believe they make me 10x more productive. It's closer to 1.5-2x, but there are other huge benefits in using FP.
14:38Lau_of_DKI wasnt just talking about production-rate
14:38Lau_of_DKBut I hear what you're saying and to some degree, I agree
14:38NafaiLately, unfortunately, I'm most interested in languages I have not a high likelihood of using for work
14:39NafaiI just did Java for 3 years, and I'm lucky enough to be in a position where I use Python, which is a step up
14:39Lau_of_DKSounds awful :(
14:39NafaiBut I'd prefer to use Haskell or Clojure
14:39Lau_of_DKCan I help in any way?
14:40Lau_of_DKThe point of this whole rant. The tools you use, the company you keep, should help you evolve as a programmer. There are enough slaves who just type in statement after statement. Clojure does this very well. Python... Does not opposite
14:40PuzzlerAnyone know how the Netbeans Enclojure IDE is coming along?
14:40NafaiLau_of_DK: I find that perspective interesting.
14:41NafaiI find that Python helps me more than when I was stuck in the Java world
14:41NafaiI'd love to continue the discussion, but I have an appointment, but I'll be back in a while
14:42Lau_of_DKThe reason I started with Lisp way back when, was because I was heavily involved in C#. Then someone showed me lots of cool tricks in Python (on a forum), like Generator expressions and lambdas, and I was blown away, I couldnt approach that in C#. Then the next guy popped up, he implemented the same stuff in 5 different ways in Lisp, and then I was sold :)
14:42Lau_of_DKAlright Nafai :)
14:43PuzzlerGetting back to the original thread about documentation, I have to say that I like languages that have some support for "literate programming". For example, Haskell has a mode where most lines are treated by default as comments, and only explicitly marked lines are treated as code.
14:43Lau_of_DKPuzzler: Good for writing books :)
14:44PuzzlerNot every program needs to be "literate", but it's nice for a language to support that approach.
14:44PuzzlerLau_of_DK: absolutely
14:47PuzzlerPython has "Leo" for literate programming.
14:47PuzzlerI've used funnelweb a couple of times to write literate programs in languages without explicit support for intertwining big-picture design with code.
14:49Lau_of_DKChouser: Do you remember that quote that came up a while ago, which we both thought was fantastic ?
14:49PuzzlerI think there's still room for a lot of innovation on the documentation/literate programming front. But it's an issue that isn't on most people's radar.
14:49ChouserLau_of_DK: about python?
14:50Lau_of_DKYes, by extension. It was about people doing the mistake of viewing something which was higher than themselves from their current standpoint instead of elevating themselves
14:50PuzzlerYou talking about the Paul Graham "blub paradox" essay?
14:50kotarakThat's BLOB. A programmer who knows BLOB (some programming language) looks down on other languages, which are less powerful.
14:50grosoursHi
14:51kotarakAnd he sees that BLOB is more powerful.
14:51kotarakBut when he looks up to more powerful languages, he can only think in BLOB and hence doesn't understand the other languages.
14:51PuzzlerSpeaking of teaching programming, it's time for me to go teach. It's been interesting. See you guys around!
14:52ChouserLau_of_DK: http://technomancy.us/27
14:52kotarakSo he thinks, what kind of crazy guys sees FOO programmers are..
14:55Lau_of_DKThanks Chouser, that was exactly it, and that is exactly the problem of some many Python-scripters. I have heard exponents of their faith call everyone around the Blub programmers, not realizing that they themselves had become the very same thing
14:57ChouserLau_of_DK: I think you may be conflating the subset of the Python community you found with the Python language.
14:57Lau_of_DKconflating... okay back to the dictionary
14:57Lau_of_DKOk, its applicable
14:58Lau_of_DKBut CHouser, I admittet that earlier "I cannot comment on the language Python seperated from its community"
14:58Chouserok
14:58ChousukeLau_of_DK: you should fix that to say "a subset of its community"
14:58Lau_of_DKYou know, if you look at cocaine, you can make a good argument for it, up until you perceive what it does to people in the long run. Python is similar, although I'd have to use crack to be accurate in my analogy :)
14:59Chousukefrankly, your complaint applies to many other languages too
14:59ChouserIt seems inevitable to me that Clojure's userbase will grow, and that as it does the community will become more fractured.
14:59Chousukenot least to lisp & co.
15:00Chousukethere will be zealous nutjob followers in every language community after it has grown large enough.
15:00Chousukeand python certainly has a large community around it.
15:01Chousereven if the tone of the google group and irc are maintainted as open, respectful places (which may become very hard) there will be other corners of the community with underinformed fanboys that may unfortunately turn people off to the language.
15:01Lau_of_DKIm not being clear I think. The question is this: Is your language stimulating you to evolve yorself as a programmer? Thats the question of the night, as far as Im concerned
15:01Chousukepython is big enough that the python nutjobs may even outnumber the entire clojure community right now :P
15:01Chouserhopefully newcomers that run into those corners will be able to overlook that part of the community and find the gem of the language beyond.
15:02Lau_of_DKChousuke: Thats certainly true
15:02Lau_of_DKIm done pouring out my heart now, thanks for turning in. Tomorrow night: C++
15:04kotarakChousuke: I'm always in favour of quality over quantity. ;)
15:04Lau_of_DKkotarak: Unless we're talking coins
15:05kotarakLau_of_DK: for some suitable definitions of "quality" and "quantity" ;)
15:05Lau_of_DKk, Im out
15:05Chousukekotarak: even rational adopters go through a phase where they think their new toy is the best of them all.
15:23mchurchQuestion: What is the build system (e.g. ASDF for Common Lisp) for Clojure?
15:26ChousukeI don't think there are any "native" build systems
15:26Chousukebesides the ones inherited from java
15:26Chousermaybe lancet?
15:27mchurchHow is Lancet?
15:27Chouserdunno, only read about it.
15:27mchurchI'm trying to "go multi-file" (actually, I'm up to 8 source files) with minimal pain
15:28Chousukedo you even need a build system?
15:28Chousukeother than something to run "(compile 'your.lib)" and maybe package it in a jar
15:28mchurchChousuke: Not necessary, but ASDF is nicer than what I've built for clojure
15:29mchurchWhere do I define the 'your.lib?
15:29Chousukeit's the namespace declaration in your library.
15:29Chousukeand it must be in classpath.
15:29Chousermchurch: have you looked at the structure of clojure-contrib? it's a pretty good example of how to set up and use libs
15:30Chousukemchurch: it's only needed for precompilation anyway. plain .clj files work as they are, too.
15:30mchurchChouser: I haven't. I guess it'd be a good idea to look at that.
15:30Chouserit's even set up to use ant to build a .jar. Or so I hear.
15:30Chousukeyeah.
15:50mchurchThe Java doc says that Thread.destroy and Thread.stop are deprecated. What is the proper way to kill a thread?
15:52Chousukemchurch: as far as I know, there is no proper way to kill a thread.
15:52Chousukemchurch: even clojurebot uses the improper way
15:52durkaas far as i know the reason those are deprecated is the thread is killed immediately, which can cause memory leaks/undisposed resources/Bad Things (tm)
15:53durkaif the thread is doing something repeatedly you could have it listen for an event
15:53Chousukedurka: yeah... that doesn't work for clojurebot though :/
15:53Chousukeunless I write a clojure interpreter in clojure first.
15:53rpgback
15:54ChouserThread.interrupt()? or is that something else?
15:54waltersi think Thread.stop etc. are safe if you know the thread isn't operating on mutable state that you care about
15:54ChousukeChouser: that just interrupts it if it's in an interruptible state.
15:54ChousukeChouser: in a busy loop, the thread will just keep rolling.
15:55waltersfor something like clojurebot's eval method, assuming it's executing in a sandboxed environment, Thread.stop should be fine
15:55stuarthallowaywalters: although it still could leak native resources, no?
15:55Chousukeyeah.
15:55waltersstuarthalloway: all the finalize methods should still be called
15:56waltersreally the methods should be @Unsafe, not @Deprecated
15:56Chousukewell you can't open files... though you could allocate a huge array and go into a busy loop until you get killed.
15:56durkahttp://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
15:57Chouser"t should be noted that in all situations where a waiting thread doesn't respond to Thread.interrupt, it wouldn't respond to Thread.stop either."
15:57ChousukeChouser: "responding" to thread.interrupt means that the interrupt flag will get set.
15:57Chousukeso interrupted() will return true.
15:58Chousukeunless the thread is blocking on something.
15:58Chousukein which case an InterruptedException happens.
15:58ChousukeIIRC.
15:58mchurchDoes Thread.interrupt free up the resources that killing the thread would free?
15:59stuarthallowaywalters: I know of a guy who pronounces the word "depreciated" -- maybe he's right :-)
15:59mchurchI'm guessing it doesn't. Am I right?
15:59waltersstuarthalloway: heh
15:59mchurch(This particular thread is not in a busy loop. It blocks.)
15:59stuarthallowaymchurch: what happens after interrupt is much more in your control
16:00waltersmchurch: any finalize {} blocks are still called, and finalizers of now-unreferenced objects are called
16:00stuarthallowaywalters: I need to think more about this "stop is safe in a sandbox
16:01stuarthalloway... idea. That would be hard to reason about in mutable Java, but maybe Clojure's immutable nature makes a big difference here
16:01stuarthallowaysounds worthy of a blog post or article
16:01Chousukewell, clojurebot prevents infinite loops with thread.stop(), because it's the only way I can think of :P
16:01mchurchstuarthalloway: Maybe I should avoid Java threads altogether and work with Clojure agents?
16:01waltersit comes down to reasoning about the state accessible to the sandbox
16:02Chousukemchurch: can you interrupt agent actions? :/
16:02Chousermchurch: clojure agents use java threads.
16:02mchurchChousuke: I don't know much about agents.
16:02waltersit's not exactly a mutable Java/immutable Clojure distinction; e.g. if you didn't allow any library calls at all, arbitrary Java is just as fine as arbitrary Clojure
16:02mchurchChousuke: About 30 minutes of reading, so I have a very very basic concept of how agents work.
16:03stuarthallowaymchurch: not if you need real interruption
16:03stuarthallowaywalters: how much Java code have you seen making no library calls? :-)
16:03stuarthallowayon another subject: any votes on whether trampoline should be covered in the book?
16:04stuarthallowayit seems important until I try to come up with a good example
16:05mchurchstuarthalloway: Good call.
16:05ChouserI think stack overflow is managed by lazy-cons or recur in about 93% of cases, and by trampoline in another 5% beyond that.
16:05ChousukeI think it's important enough to at least deserve a mention. For people who need it, just so they don't accidentally use regular recursion and wonder why their stack blows up
16:06mchurchSo, after an interrupt, any finalize blocks are called... and then the thread's resources are freed after this is finished?
16:06stuarthallowayChouser: guess I need to learn the rule for dividing the 93/7 then...
16:07stuarthallowayI have yet to see a non-toy example
16:08Chousukemchurch: interrupt doesn't really do much
16:08Chousukemchurch: all it does is set a flag, and if the thread is blocking, causes an exception to happen in the thread.
16:08Chousuke("unblocking" it in the process)
16:09Chousukeif you need to handle that, just catch the exception.
16:11triddel1ok, I have function that I can call stand-alone but within another function it never seems to fire... although all the others around it do... this is driving me crazy... has anyone else seen this behavior?
16:11stuarthallowaytriddel1: yes, when failing to realize a lazy collection
16:12triddel1it's within a let tag (implicit do)... and other very similar functions fire
16:13Chousukecan you post an example situation where it does not work?
16:13hiredmantriddel1: doing any agent sends?
16:14triddel1I'll need to simplify it a bit for an example... no agent sends
16:15RSchulzpjb3: Sorry I missed you before. I have a buddy in Germantown, MD who's thinking of going to the next DC Clojure get-together.
16:16pjb3Well, it's tomorrow
16:16pjb3Come on down!
16:16RSchulzYeah. He found the notice on clujurestudydc.wordpress.com
16:17RSchulzI'm on the opposite coast (where it seems there's little Clojure presence), so dropping by is a bit of a challenge.
16:17RSchulzI'm trying to convince him to go. He feels he needs to study, but I told him all his years of Lisp will make him more than qualified to participate.
16:18pjb3Yeah, we're all just gonna together and work on various small problems, you don't need to be an expert to go
16:19RSchulzI know he got Stuart's book and has read some of it. He's been setting up his formerly Windows laptop with openSUSE the past couple of days. He's a hard-core Emacser, too.
16:24Chouserstuarthalloway: do you know how many copies of the book have been sold already? Are you at liberty to share?
16:24stuarthallowaystuarthalloway: yes, and no :-)
16:24stuarthallowaywhy do you ask
16:24Chouserjust curious. Thanks for answering both questions. :-)
16:24Lau_of_DKstuarthalloway: If you cant give out the actualy number, could you subtract 10 from that number, and tell us the result?
16:25stuarthallowayif you were thinking "Wow, a bunch more people would buy the book, if I, Chouser, wrote a blog post about how cool the multimethods chapter is" I bet you are right
16:25Chouserhaha!
16:25stuarthallowayLao_of_DK: I could :-)
16:25stuarthallowayChouser: the book seems to be doing well
16:26stuarthallowayit has sold more copies than my previous books did at a similar juncture
16:26RSchulzAnd for the impatient among us... The next beta will be ready.... When?
16:26ChouserI was actually thinking "seems like lots of people have mentioned they've read it, I wonder if that's true". I had no particular number in mind for "lots"
16:26hiredmanyou should put that on the dust jacket
16:26Lau_of_DKChouser: There's also.. piracy :(
16:27Lau_of_DKWhich really should be called theft, I dont know why it got another label
16:27stuarthallowayRSchulz: writing the functional chapter today
16:27stuarthallowayand the libraries chapter sat and sun
16:27RSchulzExcellent. That's the one I need the most, frankly.
16:27stuarthallowayearly next week the book should be prose-complete
16:27ChouserI continue to doubt very much that piracy costs anybody much actual money, at least when compared to anti-piracy measures.
16:28RSchulzThe think about this FP stuff, for me anyway, is that you have to _think_ so much about the problem. You can't (well, _I_ can't) just hack stuff out from a vague notion of what I intend to do.
16:28Lau_of_DKIts still stealing
16:28RSchulzNot that that's a bad thing, of course.
16:28RSchulzBut in Java, I can sort code on autopilot.
16:28RSchulzNot that that's necessarily a good thing, of course.
16:28ChouserAnd I commend enterprises like pragprog both for providing electronic copies and for not hobbling them.
16:28stuarthallowayand then come the fixes: changes to how Java classes are created, adding atoms to the concurrency chapter, getting the PRNG to work for the Monte Carlo example, etc.
16:28RSchulzI haven't given my beta PDFs to anyone, but I did persuade at least one person I know of for sure to buy a copy.
16:28Lau_of_DKstuarthalloway: If you want to make it a bestseller, consider doing a whole chapter on ClojureQL called "CQL: The sequel, to SQL" .. :)
16:29RSchulzHey! Write your own book, Lau!
16:29stuarthallowayLau_of_DK: we are already talking about doing a whole 'nuther book
16:29Lau_of_DKOk, I just thought it was a catchy title :)
16:29stuarthallowayhow about CQL, on the cloud, on android :-)
16:29RSchulzThat other "stewie" hates it when people say "a whole 'nuther..." And _he's_ a bad little boy!
16:29Lau_of_DKCause you can pronounce it "Sequel the sequel to sequel"
16:29Lau_of_DKhehe
16:30Lau_of_DK"Practical Common Clojure" also works, very original
16:30RSchulzThat won't be feasible until after Clojure fragments and has to be reunified.
16:30RSchulzWhich will take at least three more years.
16:31Lau_of_DKRSchulz: Are you under the influence of any medication, euphorics or alcohol this evening ?
16:31RSchulzNot yet.
16:31Lau_of_DKk
16:31Lau_of_DKlet me know...
16:31stuarthallowayme neither :-(
16:31RSchulzIt's only 1:30 PM here. Not "evening..."
16:31Lau_of_DK"only" 1:30
16:31Lau_of_DK...
16:31RSchulzI just have a funky brain.
16:32RSchulzDamanged by decades of C, C++ and Java programming.
16:32hiredmanLau_of_DK: do you think clojureql's readme.txt could be fleshed out with some syntax examples?
16:33Lau_of_DKWe've just added test.clj which kota is pumping with examples as we speak
16:33Chouserstuarthalloway: I'd bet you've sold more copies of your book than my blog as readers.
16:34hiredmanwhen I click the watch button on github I get redirected to an empty page
16:34Lau_of_DKChouser: Perhaps, but I've read most of your posts 3 - 4 times...
16:34RSchulzSo what is ClojureQL's claim to fame? Why would I not just access my JDBC driver directly? Is there and about / FAQ document somewhere?
16:34Lau_of_DKRSchulz: because you dont want to write SQL, you want to keep it all in lisp
16:34ChouserLau_of_DK: if I recommend the multimethods chapter there, will you buy the book?
16:34stuarthallowayChouser: maybe, but the intersection of the sets is what matters :-)
16:34Lau_of_DKThe JDBC does this "executeStatement "SELECT * FROM devs WHERE id > 5 or id < 10"
16:35Lau_of_DKwe do (query * devs (or (> id 5) (< id 10))) where you can pull in variables from your enviroment
16:35Chouserlowercase alone is a win. :-)
16:35Lau_of_DKWe work in ASTs where you can run set operations like Union, intersect and so on, greatly extending your way ot querying
16:36Lau_of_DKhaha
16:36RSchulzOK. That's certainly cleaner. It's not that I'm particularly fond of SQL. Do you have a provision for handling different SQL dialects? Or is it something you plan?
16:36RSchulzAh. That's nice.
16:36Lau_of_DKRSchulz: We feed JDBC with whatever driver you need, so it should handle that part of it
16:37Lau_of_DKIf you mean in regards to syntax revisions, then we just shoot for the latest
16:37Lau_of_DKBut youre welcome to contribute :)
16:37RSchulzAnd it converts things to Clojure native collections / sequences?
16:37Lau_of_DKYea
16:37Lau_of_DKYou work in native data-types when you work with your results
16:37RSchulzNo, I meant MySQL vs. PostgresQL vs. Oracle, etc.
16:37lisppaste8triddell pasted "untitled" at http://paste.lisp.org/display/72972
16:37Lau_of_DKRSchulz: Thats in the hands of the driver, which you select yourself
16:38RSchulzI'm thinking of how Hibernate, say, (I know ClojureQL is not an ORM) insulates you from SQL dialect differences.
16:39Lau_of_DKTo some extent I think JDBC does the same
16:39triddel1ok, something on the above paste is making this function lazy...my other functions start with a "do" and then call "spit" before the for comprehension and they aren't lazy
16:40RSchulzWell, I've only really dabbled in relational databases. I started getting a little adept at MySQL at my last job, but that's been a while, and most of it has faded, now.
16:40Chousertriddel1: 'for' is lazy
16:40hiredman(doc do)
16:40clojurebotIt's greek to me.
16:41Chousertriddel1: and I'd recommend avoiding the word 'map' for a local (or an arg in this case) since it's builtin
16:41hiredmanerm
16:41Lau_of_DKRSchulz: If you have specific use-cases you want us to look at, youre are _most_ welcome to send me mails, and I'll strive to support your needs for our RC
16:41Chousertriddel1: try replacing "for" with "doseq"
16:42triddel1Chouser: must have been something else forcing the for in my other functions
16:42RSchulzOh, not really. I'm just indulging my idle curiosity. Although there are cases where a permanent storage tie-in with some other stuff I'm working on migh be interesting. Right now, I have a Grails app that handles that stuff.
16:43Lau_of_DKk
16:44triddel1Chouser et al: thanks for the help... it's amazing how deep you can get into something and still be missing some of the basics
16:45triddel1many of the basics I should say :-)
16:46Chousernp. I think that's especially the case with the kind of ad-hoc learning that comes with something as young as Clojure.
16:46ChouserI'm hopeful the book will help in this regard.
16:48kotarakfor is misnamed.
16:49Chouseroh?
16:49kotarakmost people think it's loop, which it is not.
16:49hiredmanI think it's like rhickey said, there are only so many good names
16:49stuarthalloway'comprehension' is a pretty long name, though
16:50kotarakI know. I don't claim to have a better one.
16:50kotarakBut it is a common mistake.
16:50Lau_of_DKCould just call it 'walk', that would make all the sense in the world :)
16:51Lau_of_DK(walk [the dog] (println the))
16:51hiredmanclojurebot: for is see map
16:51clojurebotc'est bon!
16:51Chouserif 'doseq' is the imperative version, should the lazy version be called 'seq'?
16:51Chousukethat's taken though :/
16:53kotarakI only know the mathematical notation for a list comprehension... I don't know how to name it better. for is still unfortunate.
16:55shooverstuarthalloway: re trampoline, how about a finite state machine on a long running process that jumps back and forth between different states?
16:56stuarthallowayshoover: sounds good, might require a fair amount of setup? In code, no problem. In prose, space limited :-)
16:59shooveragreed. the right example might say it better than any prose could. I'll think about it
17:02rpgCan anyone help me getting clojure to work with slime? I've almost got it, but clojure isn't finding the swank stuff...
17:02Lau_of_DKrpg, checkout bill clements blog, he has pretty clear instructions
17:03rpgLau_of_DK: Actually, I'm working from Bill's .emacs snippets now.
17:03abrooksforeach is what some other languages (C#,D,PHP..) use for list comprehension. In those languages it's still looping, just comprehension specific looping.
17:03Lau_of_DKoh :)
17:03Lau_of_DKrpg: Try and post your question here then :)
17:03rpg each rover is at
17:03rpgmaximum 1 location in the initial state,
17:03rpggah!
17:03rpgcut and paste problem...
17:04rpg java.io.FileNotFoundException: Could not locate Clojure resource on classpath: swank/swank.clj
17:04rpgfrom within clojure can I look at the classpath to see what's wrong?
17:05Lau_of_DK(System/getProperty "java.class.path") from the REPL, will output the classpath
17:08stuarthallowayrpg, Lau: check out classloader-seq at http://github.com/stuarthalloway/programming-clojure/tree/master/examples/utils.clj
17:11Lau_of_DKGot it, thanks, nice file in general, utils.clj :)
17:12rpgDo .clj files go in the classpath, or do I put in the directory in which they reside?
17:13stuarthallowayrpg: they do go in the classpath
17:13stuarthallowayand who is "they"? :-)
17:14rpgstuarthalloway: I don't think English has an inanimate third person plural.... I'm stuck with "they" for clj files...
17:15shooverrpg: directories go on the classpath, not clj files
17:15stuarthallowayah, sorry, misunderstood question, English must not be my first language. Listen to shoover :-)
17:16shooveralso, if swank-clojure/swank/swank.clj contains a definition for namespace swank.swank, you'll need to put swank-clojure on the classpath, not swank-clojure/swank. I just ran into that myself
17:17rpgshoover: The swank-clojure distrib I have has swank-clojure/swank.clj and swank-clojure/swank/<a bunch of other .clj files>. So it doesn't seem to have the structure that you say it must have.
17:18rpgmaybe it's time for a git pull...
17:19rpgshoover: that's it --- the swank-clojure distrib has moved the file now.
17:20rpgNo. That's not it. STILL doesn't work.
17:20rpgNow it wants swank/core/core.clj, which doesn't exit.
17:21rpgcore.clj is ADJACENT to core/, not in it.
17:22jwinterrpg: it's not in both places?
17:22rpgjwinter: No.
17:23rpgjwinter: symlinking core.clj into core/ worked, and now it's crashing because util.clj is adjacent to util/ instead of in it.
17:26rpgstuarthalloway: I'm trying to work with your book and a pinned version of clojure, but I'm wondring if that's a bad idea --- is the 20080916 clojure version compatible with swank/slime?
17:26rpgNow I'm getting this error: java.lang.Exception: Unsupported binding form: clojure.lang.PersistentList@f50439d
17:26stuarthallowayrpg: you will need to get a more recent Clojure than that, regardless of the editor you choose
17:27stuarthallowaythe sample code on github (http://github.com/stuarthalloway/programming-clojure/tree/master) includes dependent jar files built from svn
17:28rpgstuarthalloway: the download link on Sourceforge is still to the one I have.
17:28stuarthallowayclojure has moved to Google Code (since the last beta of the book!)
17:28rpgGrrrrrr........................... So the sourceforge page is a big decoy.
17:29stuarthallowayyeah, we should ask Rich to tear it down
17:29rpgWhy don't people take these things DOWN when they are bitrotted?
17:29stuarthallowayhttp://code.google.com/p/clojure/downloads/list
17:29rpgstuarthalloway: thanks!
17:29stuarthallowaysorry the book isn't up to date -- publishing every few weeks isn't fast enough
17:29stuarthallowaythat should be the last churn on that front, anyway
17:30rpgstuarthalloway: so are you saying that the github stuff has a clojure build in it? Or that I should use the google code one, and then pull the sample code from github?
17:30stuarthallowaythe former certainly works
17:30stuarthallowayand there are unit tests to prove it
17:31Chouserrhickey: for what it's worth, I got my code working with the new watchers (see with-watchers.clj): http://gist.github.com/32494
17:31stuarthallowayyou would need to set CLOJURE_HOME, CLOJURE_CONTRIB_HOME, and ANT_HOME to run the unit tests
17:31stuarthallowaybut I can fix that, gimme a sec
17:36stuarthallowayrpg: I just pushed a commit that includes all dependent libs
17:36stuarthallowayIf you are on *nix you should be able to execute runtests.sh to verify that the samples run for you locally
17:37rpgstuarthalloway: Thanks. But I should be able to run clojure and slime (swank) without your code, right? Figure I should do that first (it still doesn't work), before I go back to your book code.
17:40rpgOK, I'm sorry, but I'm back to not being able to find swank. Let me see if I can lisppaste something...
17:42lisppaste8rpg pasted "trouble loading swank" at http://paste.lisp.org/display/72978
17:43stuarthallowayrpg: probably. I am just using inferior-lisp-mode pointing to Clojure
17:44rpgI suppose I could test this outside slime, by just starting clojure at the command line....
17:44stuarthallowaykeeping up with breaking changes to slime/swank was distracting me
17:45rpgstuarthalloway: I take it you don't mean "late breaking" ;-)
17:45rpgActually, I can't load the swank library from the command line, either.
17:46lisppaste8rpg annotated #72978 with "what happens from the command-line" at http://paste.lisp.org/display/72978#1
17:46stuarthallowayskip it and just make clojure your inferior-lisp
17:47Chousukeslime works fine for me :/
17:47shooverrpg: load swank.swank
17:47ChousukeI haven't updated my version of slime in a while though
17:47Chousukeor the swank, I think
17:47rpgshoover: Thank you!
17:47rpgshoover: that worked.
17:47rpgNow, what I don't know is why swank itself didn't load The Right Thing.
17:49shooverrpg: you're welcome. the latter probably depends on what's going in swank-clojure.el, but that's all I've got for tonight. bye
17:49rpgLooks like swank-clojure-init in swank-clojure does (require 'swank.swank) Not sure why that's not working...
17:51rpgweird. I see swank-clojure-init, but I don't see anyone calling it. Maybe that's done automagically.
17:52rpgOh, now I see. It's called as part of the slime-lisp-implementations. But it seems to want arguments...
17:53stuarthallowayis count still broken for large lazy sequences?
17:54Chousukeanyone know of a way to "track" emacs startup? I use viper.el and for some reason it open two windows (both with *scratch* in it)at startup :/
17:59rpgstuarthalloway: when I tried git clone on that url (http://github.com/stuarthalloway/programming-clojure/tree/master), I got an error: warning: remote HEAD refers to nonexistent ref, unable to checkout.
18:00stuarthallowayrpg: git clone git://github.com/stuarthalloway/programming-clojure.git
18:00stuarthallowaythat's a github thing: you click a link on the page to get the clone url
18:00rpgstuarthalloway: thanks! I had forgotten that about github.
18:01rpgstuarthalloway: finally getting it!
18:02rpgstuarthalloway: uh-oh. I got a very large number of patches, then error: Unable to find abfb8382b636233e1082ef7beaf9d850c7c6f262 under http://github.com/stuarthalloway/programming-clojure.git
18:02rpgCannot obtain needed tree abfb8382b636233e1082ef7beaf9d850c7c6f262
18:02rpgwhile processing commit bb0ce6438a8e39ad06616a62134db118f77f8855.
18:02rpgfatal: Fetch failed.
18:02Chousuketry cloning with the git url instead
18:02Chousukenot the http one
18:03stuarthallowayrpg: or if you don't care about using git yourself, just click the download link and download the code that way
18:04ChousukeLau_of_DK: any reason you removed the clojure-auto.el stuff from jochu's clojure mode?
18:04Chousukeah, you made them unnecessary.
18:04rpgChousuke: Thanks. That did it.
18:05Chousuke or actually technomancy did, but anyway
18:07rpgThank you all, very much.
18:07grosourshi every body
18:08rpgbye...
18:09chrisnfighting syntax
18:09chrisnI can't get to javax.swing.event.HyperlinkListener.EventType
18:10chrisnnested class
18:10chrisnI need to get at its public constants
18:10chrisn(import '(javax.swing.event HyperlinkListener))
18:10chrisnsomething like that
18:10chrisnworks fine
18:10chrisnbut
18:10chrisnI can't get to its inner classes
18:10chrisn?
18:15Chousukechrisn: you need to use $ for inner classes instead of .
18:15chrisnHyperlinkListener$EventType/ACTIVATED
18:15chrisndoesn't work in the repl
18:17chrisnits because I misread
18:17chrisnnm
18:18chrisnHyperlinkEvent$EventType/ACTIVATED
18:18chrisnworks fine
18:21chrisnproblems like that are exactly why keywords a 1000 times a better solution
18:22chrisn:activated would have been hard to get wrong
18:24Chousukeokay now I broke my slime too :P
18:24Lau_of_DKChousuke: Tehcnomancy improved the autoloading, not me
18:24Chousukeyeah, I noticed that.
18:24Chousukemeh, slime doesn't even give errors to me... just fails to start its repl.
18:25ChousukeI just get an inferior-lisp
18:32Chousukewell, at least downgrading is easy :P
18:34chrisnwhich are you downgrading? clojure, clojure-swank, or slime?
18:35Chousukeclj-swank and slime
18:35ChousukeI branched them before pulling
18:35Chousukenow I also managed to somehow crash emacs.
18:46soothWhat is the easiest way to see what classpath is being passed to java by slime?
18:47triddel1(System/getProperty "java.class.path")
18:47hiredman,(System/getProperty "java.class.path")
18:47clojurebotjava.security.AccessControlException: access denied (java.util.PropertyPermission java.class.path read) (NO_SOURCE_FILE:0)
18:57stuarthallowaycheck out classloader-seq at http://github.com/stuarthalloway/programming-clojure/tree/master/examples/utils.clj
18:57stuarthallowayhow do I add that to the clojurebot> :-)
18:57stuarthallowayof course this requires that you can get classloader-seq itself onto the classpath
18:58Chousuketo the running clojurebot, I don't think you can
18:58Chousukeyou'd need access to its main repl :)
18:59Chousukewhich reminds me, I should work some more on my version of clojurebot. finally make it truly superior to the version running here :P
19:00Chousukeoh, hmm. or is this one v2 already? :o
19:00Puzzlerstuarthalloway: I just read back the transcript from the past few hours, and I see that you were asking for opinions about whether to include trampoline in your book.
19:00stuarthallowayPuzzler: indeed
19:01stuarthallowayI keep picking trampoline examples and then finding better ways to do them in Clojure
19:01Chousukehiredman: if you're going to move clojurebot to v2, make backups of the data files , please. I can't make any guarantees that the brain won't get clobbered :P
19:01Puzzlerstuarthalloway: My vote is no. It's more important to cover the technique of simulating mutual recursion by storing the functions in a hashtable, and using a loop to pick the right function (see Hickey's finite state automaton example).
19:02PuzzlerMy reasoning is that this technique works for both local and global mutually recursive functions. But trampoline (currently) only works for global functions since there's no letrec, and no way to get local functions to refer to one another.
19:03stuarthallowaywhere's the example you mention?
19:04Puzzlerstuarthalloway: http://list.cs.brown.edu/pipermail/plt-scheme/2007-November/021623.html
19:05stuarthallowayPuzzler: cool, thanks!
19:05PuzzlerI posted a similar example to the group the other day, where I used a similar technique to be able to copy a Knuth algorithm as a straight translation (the Knuth pseudocode has a lot of goto jumping around, so being able to copy that into a functional language is a neat trick.
19:06stuarthallowayPuzzler: on the list or in the files section?
19:06PuzzlerOn the list.
19:08Puzzlerstuarthalloway: It was in the "How to encapsulate local state..." thread. I gave the example primarily to make the case for mutable locals, but regardless, it's an interesting example of simulating mutual recursion.
19:09stuarthallowaypuzzler: just found it, after sorting out that you are not always "puzzler" :-)
19:09Puzzlerstuarthalloway: Ah yes, sorry about that.
19:10stuarthallowayso that example is impossible with trampoline, then?
19:11stuarthallowayI find myself wanting to demo trampoline (briefly), then show this alternative and point out that it is more general
19:11PuzzlerI don't think so. To use trampoline, each "step" would need to be a global function. But you need them to be local so they can see the same local mutable variables.
19:11stuarthallowayso I am still looking for that elusive "make me care about trampoline" example
19:12stuarthallowayPuzzler: if you get a chance to look I'd be curious how you would implement the Hofstadter sequences I posted to the list earlier today
19:13PuzzlerOK, I don't have time to look at it right now. But I'll look at it later.
19:13Puzzlerstuarthalloway: I'm really excited about your book, by the way.
19:15stuarthallowayPuzzler: thanks!
19:18Puzzlerstuarthalloway: By the way, the context of that state machine snippet was as a response to this paper: http://www.cs.brown.edu/~sk/Publications/Papers/Published/sk-automata-macros/paper.pdf
19:19Puzzlerstuarthalloway: Shriram gave a number of talks about how one clever, elegant way to represent state machines was with each state as a function that knows how to accept an input and in turn call the function of the next state. And then how macros let you turn this into a little DSL that generate these things automatically.
19:20Puzzlerstuarthalloway: Someone brought up that this would be hard to do in Clojure due to the lack of tail-call optimization, and so Rich Hickey showed how he would do it. That code snippet is from an older version of Clojure, so some of the function names have probably changed, but the principle remains the same.
19:21lispelotPuzzler: are you at brown now? or did shriram give talks elsewhere?
19:21Puzzlerstuarthalloway: I think parsing might be fertile ground to look for a compelling trampoline example.
19:22Puzzlerlispelot: No, but I'm an active member of the PLT Scheme community, so I pay attention to the talks and slides from those guys.
19:23lispelotah, ok.
19:25lispelotPuzzler: he has a number of interesting ideas. i wasn't sure if you were here.
19:26stuarthallowayPuzzler: thanks for the link -- was having trouble tracking back to the paper
19:26RSchulzPuzzler: what do you think about a DrScheme-like program for Clojure. I've used it (DrScheme) only a bit, but I was wowed by it.
19:26stuarthallowaypartially because I am mostly eating apple pie at the moment
19:27PuzzlerRSchulz: I think DrScheme is a great IDE because it is easy and intuitive to use. Most IDEs are really overwhelming in their complexity.
19:27PuzzlerRSchulz: It was written for educational purposes, but I find it useful for getting real work done.
19:27RSchulzMy usual critique of IDEs is their "my way or the highway" approach. But I saw DrScheme as more of an educational tool than an IDE.
19:29PuzzlerRSchulz: They've got some pretty neat stuff in there that makes it more than just an educational tool. For example, they have a very sophisticated macro debugger, unlike anything I've seen in any Lisp environment.
19:29RSchulzPresumably almost all of it would have a meaningful and useful Clojure counterpart.
19:30RSchulzNaturally, its Clojure counterpart would be a Swing application.
19:31PuzzlerPuzzler: I was fantasizing today about whether it would be possible to make a Clojure "plugin" for DrScheme. I believe the editor is fairly customizable, butI don't think DrScheme has the capability to interact with Java in the way you'd need to get debugging and profiling.
19:31PuzzlerI'm hoping the
19:31PuzzlerNetbeans plugin will rock.
19:32RSchulzIt's lookingn good. And Peter Wolf is working on an IDEA plug-in. He's only getting started, but since I use IDEA for my Java work, I'm rooting for him.
19:32PuzzlerAnway, got to run for now... Good to chat with all of you.
19:33RSchulzCiao!