parser: support numbered parameters when used as a singleton

This commit is contained in:
Hoshiumi Arata
2024-11-13 00:22:49 +09:00
parent 13acf12df5
commit cc2ec53807
2 changed files with 20 additions and 5 deletions
+10 -5
View File
@@ -2674,10 +2674,6 @@ primary : literal
| heredoc
| var_ref
| backref
| tNUMPARAM
{
$$ = new_nvar(p, $1);
}
| tFID
{
$$ = new_fcall(p, $1, 0);
@@ -3491,6 +3487,11 @@ symbol : basic_symbol
}
$$ = new_dsym(p, new_dstr(p, n));
}
| tSYMBEG tNUMPARAM
{
mrb_sym sym = intern_numparam($2);
$$ = new_sym(p, sym);
}
;
basic_symbol : tSYMBEG sym
@@ -3576,6 +3577,10 @@ var_ref : variable
{
$$ = var_reference(p, $1);
}
| tNUMPARAM
{
$$ = new_nvar(p, $1);
}
| keyword_nil
{
$$ = new_nil(p);
@@ -6435,7 +6440,7 @@ parser_yylex(parser_state *p)
break;
case '_':
if (p->lstate != EXPR_FNAME && toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) {
if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) {
int n = tok(p)[1] - '0';
int nvar;
+10
View File
@@ -718,6 +718,16 @@ assert('_0 is not numbered parameter') do
assert_equal(:l, ->{_0}.call)
end
assert('numbered parameters in symbol name (https://github.com/mruby/mruby/issues/5295)') do
assert_equal([:_1], Array.new(1) {:_1})
end
assert('numbered parameters as singleton') do
o = Object.new
lambda { def _1.a(b) = "a#{b}" }.call(o)
assert_equal('ab', o.a('b'))
end
assert('argument forwarding') do
c = Class.new {
def a0(*a,&b)