I miss LISP!
Well, okay, to be exact, I miss LISP's cousins. LISP itself is kind of overly hardcore.
There is a popular theory that what you can think is affected by the languages you know. I think it's definitely true, triple true for programming.
I don't know how it is for you, but in my neck of the woods, there are a lot of people who seem to think that all programming languages are able to express the same basic functionality. I think they've taken the whole "Turing-compatible" thing to heart a bit too much.
"Sure," they'll say, "Java does such-and-such worse, and C++ does such-and-such better, but you can use either to do so-and-so..."
I say, "Provincial! C++ and Java are the same language!"
Some of you might be nodding along. Some of you might be about to explode in irritation.
I say that the difference between Java and C++ is about as much as the difference between crayons and markers. Sure, they're different. But we're not exactly talking about radically different mediums.
Where's our painting? Where's our architecture? Where's our pottery? Our singing and dancing? Why are we stuck rubbing little sticks against flat paper?
I miss LISP.
I might have mentioned that.
In my time programming web-accessable databases, I used quite a lot of PHP.
Sure, PHP is a kludge. It's ugly, kinda slow, and has all the grace of a cow falling from a helicopter... onto another helicopter. But you know what it has? "Eval". Yeah, despite how it looks, it's still a (distant, inbred) cousin of LISP.
Not a single project went by without me using that "eval" statement.
Have you ever used "eval"? As you know, Bob, it lets you pump in strings you make up on the fly, and it executes them as if they were code.
If you're thinking, "and so what?" then you, my friend, don't speak 'interpreter' or 'recursion'. Not fluently.
Using eval, you can create code which creates code.
For example, say you have an object which keeps several arrays of objects inside it. You want to apply some code to each member of a given array.
Using non-interpreted code, you have two choices. Either invade the object's data and forcably apply the function, or make the function a member of the object.
Either way, if you have about thirty different ways you need to do that, you end up with a huge mess of re-used, messy code.
Alternately, you can pass the object the code you want to run, and it will apply that code to each member of the array. No muss, no fuss.
Sure, you can work around it using, say, function pointers. But those are just methods of working around a disability that comes from not being an interpreted language.
The power of this kind of algorithm is staggering, and it's just the tip of the iceberg.
And that's limiting things to LISP.
What about other languages we haven't even innovated yet? What about a language built specifically to run evolving swarms of code - an aLife-specific language? Imagine sitting at your desk and popping in a few basic pieces of code. Then the system runs - on its own - and you simply click your way through your favorite members of each generation.
Or a language for neural nets? Or a language for massively parallel processing? Or a language for massively multiplayer processing?
I miss LISP, it's true - t2d has an "eval" function but it's a bit wonky.
However, I'm looking forward to these new kinds of languages even more than I'm missing the old ones.
Can you imagine what we'll be able to imagine with them?