Why not all statement are expressions ?
Stewart Gordon
smjg_1998 at yahoo.com
Wed May 9 05:11:41 PDT 2012
On 07/05/2012 18:06, deadalnix wrote:
> Hi,
>
> Working on D I noticed that some statement, notably assert, are expression of type void.
> Why not all statement (that are not expression already) are expression ?
Because it wouldn't make sense.
The semantic of an ExpressionStatement is to evaluate the expression.
Creating a variable in the scope in which an expression appears, and controlling the flow
of the function in which an expression appears, are beyond the scope of the expression
evaluation mechanism.
To take an example, what sense would it make if
return 42
were an expression? What would its type be? You would be able to do something like
auto qwert() {
return return 105;
}
to instantly return from the function that called qwert.
OK, so assert, or exception throwing more generally, feels like that kind of thing. But
exceptions aren't part of the normal flow of program logic. Exceptions can be, and indeed
usually are, thrown in the process of evaluating an expression. AssertExpression is an
example of this.
Though this does suggest an answer of "because it can be" for why an assert is an
expression. Indeed, you could well ask why an assert is an expression but a throw isn't.
Maybe it was thought worth convoluting assert to make for concise code by including it
in a CommaExpression - but not worth convoluting throw in the same way, since a throw
throws unconditionally.
Not that it would be much more complicated to make throw an expression. But you could
always define a function of your own like
void throwEx(Throwable t) { throw t; }
Stewart.
More information about the Digitalmars-d
mailing list