Pārlūkot izejas kodu

add argument splicing (aka unpacking, aka splatting); add test-splice.txt to test argument splicing

master
Ian Piumarta pirms 4 gadiem
vecāks
revīzija
bc623143ca
2 mainītis faili ar 48 papildinājumiem un 15 dzēšanām
  1. +32
    -15
      parse.leg
  2. +16
    -0
      test-splice.txt

+ 32
- 15
parse.leg Parādīt failu

@ -21,7 +21,7 @@
_DO(PostDecVariable) _DO(PostDecMember) _DO(PostDecIndex) \
_DO(GetVariable) _DO(GetMember) _DO(SetMember) _DO(GetIndex) _DO(SetIndex) \
_DO(Return) _DO(Break) _DO(Continue) _DO(Throw) _DO(Try) \
_DO(Quasiquote) _DO(Unquote)
_DO(Quasiquote) _DO(Unquote) _DO(Splice)
typedef enum {
t_UNDEFINED=0,
@ -743,19 +743,22 @@ postfix = i:value ( DOT s:IDENT a:argumentList { i = newInvoke(
) * { $$ = i }
paramList = LPAREN m:makeMap
( i:IDENT { map_append(m, i) }
( COMMA i:IDENT { map_append(m, i) }
( i:ident { map_append(m, i) }
( COMMA i:ident { map_append(m, i) }
) *
) ?
RPAREN { $$ = m }
argumentList = LPAREN m:makeMap
( e:exp { map_append(m, e) }
( COMMA e:exp { map_append(m, e) }
( a:argument { map_append(m, a) }
( COMMA a:argument { map_append(m, a) }
) *
) ?
RPAREN { $$ = m }
argument = MULTI e:exp { $$ = newUnary(Splice_proto, e) }
| e:exp { $$ = e }
value = n:NUMBER { $$ = newInteger(n) }
| s:string { $$ = newString(s) }
| s:symbol { $$ = s }
@ -1457,6 +1460,9 @@ oop eval(oop scope, oop ast)
}
return apply(scope, this, func, args, ast);
}
case t_Splice: {
runtimeError("* outside of argument list");
}
case t_Return: {
assert(jbs);
@ -1824,16 +1830,27 @@ oop prim_print(oop scope, oop params)
return params;
}
oop evalArgs(oop scope, oop args)
{
int i = 0;
oop params = makeMap();
oop index;
while ((index = makeInteger(i)), map_hasKey(args, index)) {
map_set(params, index, eval(scope, map_get(args, index)));
i++;
}
return params;
oop evalArgs(oop scope, oop asts)
{
oop args= makeMap();
size_t nargs= map_size(asts);
for (size_t i= 0; i < nargs; ++i) {
oop ast= get(asts, Map, elements)[i].value;
if (is(Map, ast) && (Splice_proto == map_get(ast, __proto___symbol))) {
oop splice= eval(scope, map_get(ast, rhs_symbol));
if (!is(Map, splice)) map_append(args, splice);
else {
size_t nsplice= map_size(splice);
for (size_t j= 0; j < nsplice; ++j) {
map_append(args, get(splice, Map, elements)[j].value);
}
}
}
else {
map_append(args, eval(scope, ast));
}
}
return args;
}
oop AST= NULL;

+ 16
- 0
test-splice.txt Parādīt failu

@ -0,0 +1,16 @@
fun f(a, b, c, d, e) {
print(a, " ", b, " ", c, " ", d, " ", e, "\n");
}
args = ["a", "b", "c"];
f(1, 2, 3, 4, 5);
f(1, *args, 2);
fun myprintln() {
print(*__arguments__);
print("\n");
}
myprintln("Hello, world");
myprintln("Goodbye, world");

Notiek ielāde…
Atcelt
Saglabāt