So, in my continuing quest to try and find out what makes a good programming language, I’ve managed to come up with a little-talked-about criterion: transparency.
I require that any language I use be highly transparent. I want the guts available, and I want the “how” of the execution to be accessible at many levels – the abstract “+ adds things” level, and the concrete “+ calls first.__add__(second) which is actually first.__class__.__add__(first, second)”, to the ridiculous “and this translates into the following bytecode that is closed over these variables and will execute as the following machine instructions”. SML and Prolog don’t tell me how things are going to happen. With a lot of work, I can generally suss out an SML program, but if I want to do advanced stuff where I break the rules but promise it’s okay and that I’ll unbreak them shortly, then I am SOL in SML.
Lisp is pretty transparent, usually, and so is TCL, but implementations vary. Also, I’ll use any language that has an interactive shell that has tab completion. Tab completion allows interactive exploration of the guts in a way that I’m only beginning to appreciate when I see students discover it for the first time. It’s a very good thing, and I’m curious to see whether tab completion would make lisp or sml or ruby or java or perl equally transparent.
Compile-run-debug has given way to run-debug. I predict the next result is going to be something like debug-test-run. My python code generally comes out clean, because as I write it, I’m conducting an interactive exploration of how to write it using the python shell. That’s important, and not to be overlooked.









