Token_Type_Right_Arrow,
Token_Type_Left_Arrow,
Token_Type_Empty_Block,
+ Token_Type_Pipe,
Token_Type_Greater_Equal,
Token_Type_Less_Equal,
use package printing
use package memory
-sort :: proc (arr: [N]i32, cmp: proc (i32, i32) -> i32) {
+sort :: proc (arr: [N]i32, cmp: proc (i32, i32) -> i32) -> [N]i32 {
for i: 0, N {
smallest_idx := i;
arr[i] = arr[smallest_idx];
arr[smallest_idx] = tmp;
}
+
+ return arr;
}
ret_val :: proc (x: i32, y: i32) -> i32 {
z = v.z + u.z;
}
+clamp :: proc (v: i32, lo: i32, hi: i32) -> i32 {
+ if v < lo do return lo;
+ if v > hi do return hi;
+ return v;
+}
+
some_value := 20 + 30 * 4 + 15 / 5;
start :: proc #export {
arr[1][3] = 40;
arr[1][4] = 50;
arr[1][9] = 123;
- print(arr[1] 'sumN());
+ print(arr[1]|>sumN());
print(summing(cast(^i32) arr[1]));
v1: Vec3;
print(v3.y);
print(v3.z);
- print(v3'mag_squared());
+ print(v3|>mag_squared());
- print(10'ret_val(4));
+ print(10 |> ret_val(4));
for i: 0, N do print(arr[1][i]);
for i: 0, N do something[i] = N - i;
for i: 0, N do print(something[i]);
- something'sort(proc (a: i32, b: i32) -> i32 { return a - b; });
+ val := something
+ |> sort(proc (a: i32, b: i32) -> i32 { return a - b; })
+ |> sumN();
+ print(val);
- for i: 0, N do print(something[i]);
+ for i: 0, N do print(something[i] |> clamp(3, 6));
}
\ No newline at end of file
"->",
"<-",
"---",
+ "|>",
">=",
"<=",
LITERAL_TOKEN("->", 0, Token_Type_Right_Arrow);
LITERAL_TOKEN("<-", 0, Token_Type_Right_Arrow);
LITERAL_TOKEN("---", 0, Token_Type_Empty_Block);
+ LITERAL_TOKEN("|>", 0, Token_Type_Pipe);
LITERAL_TOKEN("&&", 0, Token_Type_And_And);
LITERAL_TOKEN("||", 0, Token_Type_Or_Or);
LITERAL_TOKEN(">>>=", 0, Token_Type_Sar_Equal);
break;
}
- case '\'': {
+ case Token_Type_Pipe: {
AstUfc* ufc_node = make_node(AstUfc, Ast_Kind_Ufc);
- ufc_node->token = expect_token(parser, '\'');
+ ufc_node->token = expect_token(parser, Token_Type_Pipe);
ufc_node->object = retval;
- ufc_node->call = parse_factor(parser);
- retval = (AstTyped *) ufc_node;
+ AstTyped* right = parse_factor(parser);
+
+ if (right->kind == Ast_Kind_Ufc) {
+ ufc_node->call = ((AstUfc *) right)->object;
+ ((AstUfc *) right)->object = (AstTyped *) ufc_node;
+ retval = right;
+
+ } else {
+ ufc_node->call = right;
+ retval = (AstTyped *) ufc_node;
+ }
+
break;
}
}
static void symres_ufc(AstUfc** ufc) {
+ AstCall* call_node = (AstCall *) (*ufc)->call;
+ symres_expression((AstTyped **) &call_node);
+ symres_expression(&(*ufc)->object);
+
if ((*ufc)->call->kind != Ast_Kind_Call) {
onyx_message_add(Msg_Type_Literal,
(*ufc)->token->pos,
return;
}
- symres_expression(&(*ufc)->object);
if ((*ufc)->object == NULL) return;
- AstCall* call_node = (AstCall *) (*ufc)->call;
-
AstArgument* implicit_arg = onyx_ast_node_new(semstate.node_allocator,
sizeof(AstArgument),
Ast_Kind_Argument);
implicit_arg->value = (*ufc)->object;
implicit_arg->next = (AstNode *) call_node->arguments;
-
+
call_node->arguments = implicit_arg;
call_node->arg_count++;
call_node->next = (*ufc)->next;
- symres_expression((AstTyped **) &call_node);
-
// NOTE: Not a UFC node
*ufc = (AstUfc *) call_node;
}