From 24015fd8df34dfb1c4c3b1d1622b261d01cb5a4c Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Sat, 29 Jul 2023 14:26:57 +0300 Subject: [PATCH] result / optional return type modifiers for functions (one for all returns) --- corpus/test.langexp | 49 ++++++++++++++++++++++++++++++++++++++------- grammar.js | 1 + 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/corpus/test.langexp b/corpus/test.langexp index 55cf5f9..c093bfa 100644 --- a/corpus/test.langexp +++ b/corpus/test.langexp @@ -219,8 +219,12 @@ parse_number : Unit! = { bring (); } -: example of or_in and or_out usage for template operators -( & ) |-> 'a |-> 'b <-| 'x <-| 'y = (|-> 'a := <-| 'x) && (|-> 'b := <-| 'y); +: example of or_in and or_out usage for template operators (tuple input and tuple output) +( & ) |-> 'a |-> 'b <-| 'x <-| 'y = ('a := 'x) && ('b := 'y); + +: function, that return result ('!' not used on calls) +: useful when tuples returned +result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> 'c := 'a, 'd := 'b, () -------------------------------------------------------------------------------- @@ -1194,15 +1198,46 @@ parse_number : Unit! = { (argument_name_identifier) (operator_expression (match - (reference_expression + (name_expression (argument_name_identifier)) (case - (reference_expression + (name_expression (argument_name_identifier)))) (operator) (match - (reference_expression + (name_expression (argument_name_identifier)) (case - (reference_expression - (argument_name_identifier))))))) + (name_expression + (argument_name_identifier)))))) + (empty_lines) + (ERROR + (definition_info + (info) + (info)) + (simple_name_identifier) + (argument_name_identifier) + (argument_name_identifier) + (argument_name_identifier) + (argument_name_identifier) + (comma_expression + (condition + (operator_expression + (name_expression + (argument_name_identifier)) + (operator) + (number_literal)) + (name_expression + (simple_name_identifier) + (string_literal)) + (name_expression + (argument_name_identifier))) + (ERROR + (argument_name_identifier)) + (match + (name_expression + (argument_name_identifier)) + (case + (name_expression + (argument_name_identifier))))) + (unit_literal))) diff --git a/grammar.js b/grammar.js index b544dbd..e736950 100644 --- a/grammar.js +++ b/grammar.js @@ -56,6 +56,7 @@ module.exports = grammar({ repeat(seq($.constraint, ';')), optional($._var_let), choice(field('name', $.simple_name_identifier), seq('(', field('name', $.operator), ')')), + optional($._optional_result), repeat(seq( optional($.annotation_identifier), optional($._reference),