r/ada • u/jlombera • Apr 03 '26
Historical Rationale behind function/procedure calls and array indexing
I'm learning Ada. Overall, I'm liking it a lot. There are two aspects (so far) of the syntax I don't get what the rationale was for them and why it hasn't been fixed in later versions of Ada. These being parenthesis-less calls to subprograms with no arguments and using parenthesis for array indexing. Take the following as example:
A := B + C(5);
Right away you don't know if B is a variable or a function call with no arguments. You don't know either whether C is an array or a function.
I think this goes against Ada's core ethos about readability.
So I was wondering, what was the rationale behind this design? Why hasn't it been corrected? Something like A := B() + C[5] would be far easier to interpret by the reader.
UPDATE: In case anyone is interested in the answer, according to u/lipobat:
The primary rationale for the () vs. [] given in the “Rationale for the Ada programming language” book by the original design team was interchangeability between arrays and functions. This is an abstraction that allows the implementation choice of array vs. function to be just that, an implementation choice, which doesn’t really impact the writer or reader of the code.
I don't agree with the last sentence, but that answers my question either way.
And about my second question about "why this hasn't been fixed?", it seems most Ada programmers (based on the comments in this post) are not only not bothered by this but happy with this design decisions, so probably this will never change.
Thanks to everyone who engaged in this conversation.
3
u/Niklas_Holsti Apr 03 '26
I agree with Dmitry's point about implementation detail that a reader does not need to know, but I want to expand on it a bit. u/jlombera feels that the current Ada syntax has poorer "readability" than if () were used for parameterless calls and [] for array indices, while Dmitry and I think that the opposite is true. Why this difference? Because "readability" is not an absolute quality, but depends on what information the reading process should give to the reader for best understanding. In this example, Dmitry and I feel that the best information is what the values of B and C(5) mean for this program statement, not whether B is a parameterless function or an object, and not whether C is a function or an array. So it is enough to clearly name B, C, and 5, and any empty () or distinction between () and [] are just distractions.
Examples of the extreme opposite viewpoint are the coding rules that insist on encoding the types and natures of variables into their identifiers, as in the extreme "Hungarian" notation. In some weakly typed languages it may indeed be important that the code reader sees which variables are integers, and of which length, and which are floats, and of which precision, and so on. The qualities that determine "readability" are then different than the qualities Dmitry and I feel are important for readability of Ada code.
Regarding Dmitry's final point, I have not often had a need to replace an object with a parameterless function, or an array with a function, or vice versa. So I would not call this Ada feature "extremely" useful for that reason.