From 945cf11555aa0f6b3116677801cc7247d68e6f7a Mon Sep 17 00:00:00 2001 From: Sebeck10 Date: Wed, 9 Nov 2022 13:26:51 +0900 Subject: [PATCH] adds functions: map, guardmap, select, reject --- ccmeta.leg | 117 ++++++++++++++++++++---------------------- tests-parsimony/map.c | 18 +++++++ 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/ccmeta.leg b/ccmeta.leg index ff3c219..139b594 100644 --- a/ccmeta.leg +++ b/ccmeta.leg @@ -1308,9 +1308,10 @@ language printLang = C; oop outputProgram= 0; +/* TO DELETE IN FUTURE oop searchType(char *type) { - ssize_t pos = map_intern_search(symbol_table, type ); + ssize_t pos = map_intern_search(symbol_table, type); if (pos >= 0) return get(symbol_table, Map, elements)[pos].key; return null; } @@ -1332,72 +1333,66 @@ oop findMap(oop map) } return null; } +*/ -oop selectFunction(oop type, oop map) +oop selectFunction(oop filter, oop map) { - oop enumList; - oop filter = searchType(type->String.value); - if (filter == null) - return null; - oop ret = findMap(map); - oop name_Type = map_get(map_get(ret, __proto___symbol), __name___symbol); - int number_type = get(name_Type, Symbol, prototype); - switch (number_type) { - case t_C_enumSpec : - enumList = map_get(ret, enumList_symbol); - size_t sizeType = map_size(enumList); - for (int i=0; iString.value); - if (filter == null) - return null; - oop ret = findMap(map); - oop name_Type = map_get(map_get(ret, __proto___symbol), __name___symbol); - int number_type = get(name_Type, Symbol, prototype); - switch (number_type) { - case t_C_enumSpec : - enumList = map_get(ret, enumList_symbol); - size_t sizeType = map_size(enumList); - for (int i=0; i { $$ = makeString(unescape(yytext))} meta_ident = l:META_IDENT { $$ = l } -# | META_AT n:meta_prefix { $$ = newUnary(Unquote_proto, n) } +# | META_AT n:meta_prefix { $$ = newUnary(Unquote_proto, n) } meta_syntax2 = < [a-zA-Z_][a-zA-Z0-9_]* > &{ null != getSyntaxId(2, intern(yytext)) } -- { $$ = getSyntaxId(2, intern(yytext)) } @@ -2419,12 +2417,11 @@ meta_postfix = i:meta_value ( META_DOT s:META_IDENT a:meta_argumentList { i = newInvoke(i, s, a) } | META_DOT s:META_IDENT !meta_assignOp { i = newGetMap(GetMember_proto, i, s) } | META_LBRAC p:meta_exp META_RBRAC !meta_assignOp { i = newGetMap(GetIndex_proto, i, p) } - | a:meta_argumentList { i = (null != getSyntax(1, i)) ? apply(globals, globals, getSyntax(1, i), a, i) : newCall(i, a); } + | a:meta_argumentList { i = (null != getSyntax(1, i)) ? apply(globals, globals, getSyntax(1, i), a, i) : newCall(i, a) } | META_PLUSPLUS { i = newPostIncrement(i) } | META_MINUSMINUS { i = newPostDecrement(i) } ) * { $$ = i } -meta_funcMap = META_LPAREN i:meta_value META_COMMA e:meta_exp META_RPAREN { $$ = mapFunction(i, eval(globals, e)) } meta_paramList = META_LPAREN m:meta_makeMap ( i:META_IDENT { map_append(m, i) } @@ -2509,7 +2506,7 @@ MO_OPERATION = META_BACKTICK ( MO_INITIALIZER i:initializer { $$ = newU | MO_STRING i:stringLiteral { $$ = newUnary(Quote_proto ,i) } ) -META_OPERATORS = MO_INITIALIZER | MO_CONSTANT | MO_STATEMENT | MO_INTEGER | MO_DECLARATION | MO_STRING +# META_OPERATORS = MO_INITIALIZER | MO_CONSTANT | MO_STATEMENT | MO_INTEGER | MO_DECLARATION | MO_STRING MO_INITIALIZER = 'initializer' ![(a-zA-Z0-9_] -- MO_CONSTANT = 'constant' ![(a-zA-Z0-9_] -- diff --git a/tests-parsimony/map.c b/tests-parsimony/map.c index 0cc45ee..7b2a3db 100644 --- a/tests-parsimony/map.c +++ b/tests-parsimony/map.c @@ -6,9 +6,27 @@ foo * foo; } c = ["earth", "sky", "water"]; + isSky(x) { x == "sky" } + c = reject(isSky, c); } @{print(map(p2, [100, 2, 3]));} @{print(map(toChar, c));} +enum foo { A, B, C }; +enum oof { A, B, C }; + +@{ + isEnum(x) { x.__proto__ == C_enum } + to_C_string(x) {{ __proto__: C_string, value: "\"" + string(x.name.identifier) + "\"" }} + // to_C_string(properties.enums.foo.enumList[?].name.identifier); + a = map(to_C_string, select(isEnum, properties.enums.foo.enumList)); + b = map(to_C_string, properties.enums.foo.enumList, isEnum); +} +char *a = @(a); + +char *b[] = { @(b) }; + + +