It is not uncommon to declare types once everything is working to speed things up -- so with Lisp, you get the best of both worlds.
What sets Lisp's condition system apart is that it separates signaling a condition, handling it, and restarts. In other words, the decision about which handler to choose for an exception is usually made in much higher-level code, where it belongs.
And when no suitable handler is found you get dropped into the debugger. While in the debugger you can create the handler you need, and then call it.
And all this without unwinding the stack at all.
So while in another language I'll have to restart a long running process over and over again until the code covers all the unexpected cases -- in Lisp I can just start off assuming the happy path and refine as I go along, without ever having to start over because of an error.
I almost always feel that people talk about the wrong things regarding Lisp. A huge deal is made over macros, but nobody ever mentions the reader which is what makes macros possible. And when people do talk about macros they almost never mention reader macros.
And sometimes people do make a completely justified big deal out of the MOP (meta-object protocol) -- but frankly, I think generic functions and multiple dispatch are far more important. Or the fact that Lisp offers multiple-inheritance done right (multiple inheritance gets a bad rap because most other languages lack the flexibility to properly handle them).
But seriously, the Condition System. It is in my mind, the killer feature of Lisp.
http://www.nhplace.com/kent/Papers/Condition-Handling-2001.h...
http://www.gigamonkeys.com/book/beyond-exception-handling-co...
* a typing system some call "gradual typing" (loosely similar to optional typing);
* a condition system;
* "grammars/actions" which are not only first class in the language but are self-applied in a bootstrapping fashion during parsing (which I'm thinking is equivalent in power to reader macros);
* CLOS inspired OO;
* a MOP;
* generic functions;
* multiple dispatch;
* multiple inheritance "done right".
The condition system looks very nice, but I rarely see people talking about it. Not saying it is not useful, just that I'd love to know more about usage. Maybe at one point people leave conditions to go into typed programming too.
The 'no value' was a bit strong, I meant it relatively to trendy and stable languages.