Block Expressions with Consistent Syntax to Declarations #836
Replies: 5 comments 12 replies
|
Another example: var1: i32 = {
print("Hello!");
print("Say something:");
while true {
var2: string = get_user_input();
if var2.to_lowercase() == "exit" {
print("Goodbye.");
= "";
break;
}
else if var2 != "" {
print("Thanks.");
= var2;
break;
}
print("Try again!");
}
};If a statement starts with |
|
I think changing declarations is a big change, but I do want do expressions in cpp2. Thet can just translate to IILEs on the cpp side. Other than that, if expressions are also great (idk about the |
|
I've to explain the reason of why Currently Cpp2 has var1: i32 = inspect x < 10 -> bool { is true = x; is _ = x - 10; };The assignment operation is right to left (as it's the behavior in Cpp1 too):
Considering var1: i32 = { if x < 10 = z = y = x; else = 0; };In a similar way:
In a nutshell, I mean if we read the assignment operation from right to left (as it's the behavior in Cpp1 too), it'll be a natural syntax in Cpp2. EDIT: Let's assume |
|
Should we support multiple statements in each branch? If so we could use a parameterized var1: i32 = (out r) if x < 10 {
foo(x);
r = x;
} else r = x - 10;Note |
|
Block expressions make it possible to have loop with a half or loop with test in the middle (AKA Dahl loop): (copy name: string = "", copy x: i32 = 0)
while { name = get_name();
= x < 10 && name != ""; } next x++
{
print("(name)$: (x)$\n");
}Without block expressions, it would be like this using infinite loops: (copy name: string = "", copy x: i32 = 0)
while true next x++
{
name = get_name();
if ! (x < 10 && name != "")
{
break;
}
print("(name)$: (x)$\n");
}I'm not saying we need this feature in |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Preface
I suggest to make Cpp2 to be Expression Oriented Programming Language as much as it doesn't harm similarity with C++. In a way that every control structure (such as
ifandfor) can be used inside expressions.My suggestion is based on the new declaration syntax as suggested in issue #824 and discussion #757.
Briefly the new syntax changes
= {...}to{...}:Also the terser function syntax is changed from
: (x) xto: (x) = x.This new syntax for declarations is required. It leads to have definitions uniformly with either statement notation
{...}or expression notation= ...;. Control structures (such asifandfor) can be syntactically and semantically similar to declarations in the same way.First, please read discussion #643 and paper P2806R1 about
doExpressions. Let's name it Block Expressions. The syntax of a block expression is like this:Instead of
return 0;, we write= 0;. It means the value of{}is equal to0inside the expression. In this way,= ...;will be a uniform syntax in all declarations and control structures. Also;is required after{}, because{}is an expression (it's not a block statement), and the whole code is a single statement.Description
Considering
ifcontrol flow:With the help of block expressions, we can write the above example like this:
As you see, the whole
ifcontrol flow is put inside a block expression with{}. It ends with;, so you can assume we replaced0with{ if ... }, and we replaced allvar1 =s with=s. That's it.{}is optional inifwhen it contains= ...;in block expressions, so let's drop them:Let's compact it:
And compact it again to a single line:
Finally, we have used
ifcontrol flow inside an expression to set the value ofvar1. It's syntactically similar toinspectexpression in Cpp2:The expression value is defined with
= ...;in bothifandinspectexpression. Also{}in both of them is not a block statement.In the same way we can use
forandwhilein block expressions:Consistency
Now I write function declarations and control structors when they are used in block expressions to see how much they are consistent.
A function declaration:
fnc1: (x) = x + 1;A
forloop inside block expression:var1: = { for numbers do (x) = x + 1; };They are consistent with
= ...;. They both end with;.A function declaration:
fnc1: (x) { print(x); }A
forloop:They are consistent with
{}. They don't end with;.The same consistency can be checked for all declarations and control flows. Thanks.
All reactions