In my experience overuse of meta programming is usually a sign that the architecture of the system is bad and the software should be split up into separate libraries or web services.
Well, Arc is actually very maintainable, and quite fast. After all, HN is powered by Arc, and it serves >100k daily uniques on a single core.
~ $ time (echo '(do (= n 0) (for i 1 100000000 (++ n i)) prn.n (quit))' | arc)
Welcome to Racket v5.3.5.1.
Use (quit) to quit, (tl) to return here after an interrupt.
arc> 5000000050000000
real 0m28.561s
user 0m28.308s
sys 0m0.249s
----
~ $ time (echo -e 'n=0 \ni=0 \nwhile (i <= 100000000): \n n += i \n i += 1 \n\nprint(n)\n' | python3.3)
5000000050000000
real 0m30.244s
user 0m30.230s
sys 0m0.013s
It would appear to be competitive with Python on my machine on this particular task. (Also you can make it faster by dropping into Racket.) $ time python -c 'print sum(xrange(100000000 + 1))'
5000000050000000
real 0m1.398s
user 0m1.383s
sys 0m0.012s
Comparison to baseline: $ time (echo -e 'n=0 \ni=0 \nwhile (i <= 100000000): \n n += i \n i += 1 \n\nprint(n)\n' | python)
5000000050000000
real 0m33.140s
user 0m32.939s
sys 0m0.023s arc> (time:xloop (i 0 n 0) (if (> i 100000000) n (next (+ i 1) (+ n i))))
time: 9121 cpu: 9130 gc: 0 mem: 480 ; the times are in msec
5000000050000000
Or perhaps a "higher-order function": arc> (time:sum idfn 1 100000000)
time: 19889 cpu: 19908 gc: 0 mem: 1224
5000000050000000
Or use a deforestation macro that I wrote, which is closest to your Python example: arc> (time:thunkify:reduce + (range 1 100000000))
time: 17971 cpu: 17985 gc: 0 mem: 3592
5000000050000000
Also, here's what you can get by dropping into Racket: arc> (time:$:let loop ((i 0) (n 0)) (if (> i 100000000) n (loop (+ i 1) (+ n i))))
time: 402 cpu: 403 gc: 0 mem: 920
5000000050000000
I suppose Python has an analogue of that--dropping into C, or at least loading C libraries. Which Racket can do too. Mmm.For example this CAD system from PTC is based on 6+ million lines of Common Lisp code and under development for two decades:
I've been having a lot of fun recently writing code in wat-pl (my perl port of Manuel Simonyi's wat-js interpreter)