Another big thing is that functions can pass their values around to each other, and return values correctly. This makes the following code possible:
entrypoint : () -> (){ integer(foo, 0) assign(foo, quuxfunction(lexicalcast(integer, debugreadstring()))) debugwritestring(lexicalcast(string, foo))}quuxfunction : (integer var) -> (integer){ add(var, 41)}
Evaluation is lazy; if quuxfunction never accessed var, then the call to debugreadstring would never be evaluated.
Other than that, I've made lots of little tiny tweaks and additions. There's enough major stuff ready that it's probably worth doing another release soon, just to add to the available things for people to toy with (assuming anyone actually is toying with it, of course).
Oh, and the answer to yesterday's challenge question: Visual Basic 3. VB3 ran almost exactly the same pseudo-code scheme I'm working up, down to the shared interpreter DLL. Things changed a bit (IIRC) in VB5 when native code compilation was introduced, but even through VB6 it was necessary to ship the helper DLL with any programs written in the language.