Mercurial > vim
diff src/eval.c @ 23428:5807e3958e38 v8.2.2257
patch 8.2.2257: Vim9: using -> for lambda is ambiguous
Commit: https://github.com/vim/vim/commit/2949cfdbe4335b9abcfeda1be4dfc52090ee1df6
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Dec 31 21:28:47 2020 +0100
patch 8.2.2257: Vim9: using -> for lambda is ambiguous
Problem: Vim9: using -> for lambda is ambiguous.
Solution: Stop supporting ->, must use =>.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 31 Dec 2020 21:30:03 +0100 |
parents | 108039938e3c |
children | b1dbbc81a011 |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -3316,7 +3316,10 @@ eval7( * Lambda: {arg, arg -> expr} * Dictionary: {'key': val, 'key': val} */ - case '{': ret = get_lambda_tv(arg, rettv, in_vim9script(), evalarg); + case '{': if (in_vim9script()) + ret = NOTDONE; + else + ret = get_lambda_tv(arg, rettv, in_vim9script(), evalarg); if (ret == NOTDONE) ret = eval_dict(arg, rettv, evalarg, FALSE); break; @@ -3617,7 +3620,24 @@ eval_lambda( *arg += 2; rettv->v_type = VAR_UNKNOWN; - ret = get_lambda_tv(arg, rettv, FALSE, evalarg); + if (**arg == '{') + { + // ->{lambda}() + ret = get_lambda_tv(arg, rettv, FALSE, evalarg); + } + else + { + // ->(lambda)() + ++*arg; + ret = eval1(arg, rettv, evalarg); + *arg = skipwhite_and_linebreak(*arg, evalarg); + if (**arg != ')') + { + emsg(_(e_missing_close)); + ret = FAIL; + } + ++*arg; + } if (ret != OK) return FAIL; else if (**arg != '(') @@ -5645,8 +5665,8 @@ handle_subscript( *arg = p; if (ret == OK) { - if ((*arg)[2] == '{') - // expr->{lambda}() + if (((*arg)[2] == '{' && !in_vim9script()) || (*arg)[2] == '(') + // expr->{lambda}() or expr->(lambda)() ret = eval_lambda(arg, rettv, evalarg, verbose); else // expr->name()