> I didn't benchmark the 2 examples since they run about 8 hours each.

ok.

> I mentioned the next JVM release, only to highlight that some improvements are being implemented for BigInteger, which currently is a slow as can be.

Ok, Afaik BigIntegers are slow everywhere.

> Regarding the 2.nd example and linecounting. Firstly, if I counted blank lines with Python I apologize, I must have been a bit too fast going over it.

ok

> Generally the line counting was not meant to be viewed as THE indicator for quality, as I obviously compressed the Clojure-code more than what was optimally - The irony didn't come across though.

It didn't, besides that, it degrades the whole of your post to focussing on meaningless metrics.

> Your speed on the webcrawler is really quite amazing. I hit it at 2200 here, which is around 4 o'clock on the east coast of the US if I'm not mistaking, using my 4Mbit line. It took exactly 1 hour and 53 minutes, so if yours run in 6 minutes ... Something was horribly wrong.

That was my take on it. When I saw how fast it did the first couple I decided to time it, I was quite surprised on seeing the results. Now I'm curious how fast clojure would run on this rig. fwiw it wasn't exactly doing nothing while running that test either, I just didn't feel like shutting stuff down.

> The fact that my gain is from opening several connections is not masked in anyway - I knew that was the key to speed, that's why I did it :)

And you're still twice as slow as my python run. I think that benchmarking anything in a context such as networking should be done by several runs at different times of day and presenting both the average as well as the min and max run times.

> Anyway, putting line counting aside I suggest focus be given to the clarity and expressiveness of the samples - where Python is not lacking. Line counting is fun for golfing.

I think that expressiveness in both languages is comparable, I don't really see a clear winner, it depends on the use case. I'm more used to imperative languages (for the moment) so I can read the python code a little easier but I've long ago learned that micro-optimizing the number of lines at the expense of clarity is a losing strategy.

> Out of curiosity, did you get 8200+ something tasks from your crawl?

here's the condensed output:

eleven:/tmp# date ; python examples.py

Mon Oct 19 16:49:35 EDT 2009

100 doors: 50 examples.

99 Bottles of Beer: 67 examples.

Abstract type: 18 examples.

Ackermann Function: 56 examples.

Active object: 8 examples.

Adding variables to a class instance at runtime: 16 examples.

Address Operations: 18
examples.

...

XML Creation: 17 examples.

XML Reading: 17 examples.

XML and XPath: 15 examples.

Xiaolin Wu's line algorithm: 3 examples.

Y combinator: 20 examples.

Yuletide Holiday: 30 examples.

Zig Zag: 27 examples.

Total: 8275 examples.

eleven:/tmp# date

Mon Oct 19 16:55:22 EDT 2009

eleven:/tmp#

---

edit: I just saw jcl's post above, combining his trick with some more cramming we now have:

from math import sqrt

def is_prime(i): return (i > 1 and all(i % x != 0 for x in range(2, int(sqrt(i)) + 1)))

def is_mersenne_prime ( p ):
if p == 2: return True
m_p = ( 1 << p ) - 1; s = 4;
for i in range(3, p+1): s = (s ** 2 - 2) % m_p
return s == 0

for p in range(2, 33219):
if is_prime(p) and is_mersenne_prime(p): print("M%d"%p);

There must be a way to make it shorter still ;)