Ada is actually a language I have never touched, I should look at its syntax sometime; as I recall it is one of the gcc supported languages, along with fortran, C/C++, and a half-dozen or so others...
EDIT1: Well, I looked at a couple short Ada programs and went through the beginning of
this tutorial, I can say that I do not like the syntax, I prefer things like braces rather then begin/end and such, just reads better to me (not to mention, saying NewLine prints a new line makes no sense to me... how do you know it is supposed to print a new line?); however, if you know of any good design principles or anything else from the language that you like, please state.
EDIT2: Interesting how it uses := for assignment and just = for const assignment. I think = would be used more often though, and I do like doing const type name = something; to state that something is immutable, reads better in my opinion. As stated though, my opinions are open to debate if sufficient evidence is shown.
EDIT3: I have seen where ranges can be defined of in some languages, so some integer could be constrained to, for example, between, [4, 12), mean between and including 4, but not including 12, so 4 through 11 are valid numbers, problem is that hits efficiency in that it causes spurious if/then/else's to be hiddenly littered across all the code that uses it. And although I have thought about supporting it anyway, I am still leery because of the hidden cost, since the user could put the if/then/else tests manually, and far better positioned (and usually would not be necessary anyway with a good logic structure), and if they really wanted then a class could encapsulate it and provide the same functionality (I think boost already has such a library...).
EDIT4: And yes, I was planning to allow redefining a type and have it be distinct, was planning the D way so "alias type newtype;" is identical to how typedef in C/C++ works (new typename, but it is the same as its original type, casting is not necessary, everything) and where "typename type newtype;" actually creates a new type, so for example you could do "typename int32 Index;" and you could not cast an int32 to Index (without a cast override function at least) and so forth, they would be treated as full distinct types by the compiler. If you cannot tell, I am taking a lot from D, since it does fix a lot of C++ issues, but it still has a few issues of its own I will need to fix.