добавил iife (возможность вызова лямбда функции сразу после объявления), iife с аргументами и defer

master2
serr 2025-05-18 20:10:57 +03:00
parent f556df4101
commit dbfcb87b81
4 changed files with 40 additions and 3 deletions

View File

@ -72,6 +72,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
"++" { return INC; } "++" { return INC; }
"--" { return DEC; } "--" { return DEC; }
"defer" { return DEFER; }
"range" { return RANGE; } "range" { return RANGE; }
"for" { return FOR; } "for" { return FOR; }
"break" { return BREAK; } "break" { return BREAK; }

View File

@ -25,7 +25,7 @@ void free_node(char *str) {
%token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT %token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT
%token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ %token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ
%token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ %token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ
%token FOR BREAK CONTINUE ARROW IF ELSE RANGE %token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER
%token CHAN CONST CASE SWITCH %token CHAN CONST CASE SWITCH
%token PLUS MINUS MULT DIV MOD %token PLUS MINUS MULT DIV MOD
%token STRING %token STRING
@ -58,6 +58,7 @@ program:
; ;
statement: statement:
| DEFER func_call SEMICOLON
| func_call SEMICOLON | func_call SEMICOLON
{ printf("\033[1;33mSTATEMENT: func_call\033[0m\n"); } { printf("\033[1;33mSTATEMENT: func_call\033[0m\n"); }
| var_declaration SEMICOLON | var_declaration SEMICOLON
@ -334,6 +335,7 @@ func_literal:
func_call: func_call:
any_identifier LPAREN math_expr_or_literals_list_or_empty RPAREN any_identifier LPAREN math_expr_or_literals_list_or_empty RPAREN
| func_literal LPAREN math_expr_or_literals_list_or_empty RPAREN
arg_declaration: arg_declaration:
identifiers_list type identifiers_list type

View File

@ -1,6 +1,9 @@
package main package main
import "fmt" import (
"fmt"
"log"
)
func ujas() (func() func() func() int, int, string) { func ujas() (func() func() func() int, int, string) {
return func() func() func() int { return func() func() func() int {
@ -19,5 +22,15 @@ func main() {
fmt.Println(idx, val) fmt.Println(idx, val)
} }
defer func() {
if err := recover(); err != nil {
log.Println("work failed:", err)
}
}()
func(msg string) {
fmt.Println("Message:", msg)
}("Hello, IIFE!")
return return
} }

View File

@ -2,6 +2,27 @@ package main;
import "fmt"; import "fmt";
func server(a int) {
for work := range workChan {
}
}
func iife(work int) {
func(){}();
func(){fmt.Println(123);}();
func(a, b string) {
fmt.Println("Message:", a + b);
}("Hello", ", world!");
defer func() {
if err := recover(); err != nil {
log.Println("work failed:", err);
}
}();
}
func ujas() (func() func() func() int, int, string) { func ujas() (func() func() func() int, int, string) {
return func() func() func() int { return func() func() func() int {