Mercurial > vim
comparison src/testdir/test_vim9_func.vim @ 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 | c3c690c8fcbf |
children | f00d6ff51046 |
comparison
equal
deleted
inserted
replaced
23427:8f2dcc0cfcf6 | 23428:5807e3958e38 |
---|---|
52 def CallRecursive(n: number): number | 52 def CallRecursive(n: number): number |
53 return CallRecursive(n + 1) | 53 return CallRecursive(n + 1) |
54 enddef | 54 enddef |
55 | 55 |
56 def CallMapRecursive(l: list<number>): number | 56 def CallMapRecursive(l: list<number>): number |
57 return map(l, {_, v -> CallMapRecursive([v])})[0] | 57 return map(l, (_, v) => CallMapRecursive([v]))[0] |
58 enddef | 58 enddef |
59 | 59 |
60 def Test_funcdepth_error() | 60 def Test_funcdepth_error() |
61 set maxfuncdepth=10 | 61 set maxfuncdepth=10 |
62 | 62 |
308 | 308 |
309 lines =<< trim END | 309 lines =<< trim END |
310 vim9script | 310 vim9script |
311 def Outer() | 311 def Outer() |
312 def g:Inner() | 312 def g:Inner() |
313 echo map([1, 2, 3], {_, v -> v + 1}) | 313 echo map([1, 2, 3], (_, v) => v + 1) |
314 enddef | 314 enddef |
315 g:Inner() | 315 g:Inner() |
316 enddef | 316 enddef |
317 Outer() | 317 Outer() |
318 END | 318 END |
507 CheckScriptFailure(head + ["funcMap['func']('str', 123)"] + tail, 'E119:') | 507 CheckScriptFailure(head + ["funcMap['func']('str', 123)"] + tail, 'E119:') |
508 CheckScriptFailure(head + ["funcMap['func']('str', 123, [1], 4)"] + tail, 'E118:') | 508 CheckScriptFailure(head + ["funcMap['func']('str', 123, [1], 4)"] + tail, 'E118:') |
509 enddef | 509 enddef |
510 | 510 |
511 def Test_call_lambda_args() | 511 def Test_call_lambda_args() |
512 CheckDefFailure(['echo {i -> 0}()'], | 512 CheckDefFailure(['echo ((i) => 0)()'], |
513 'E119: Not enough arguments for function: {i -> 0}()') | 513 'E119: Not enough arguments for function: ((i) => 0)()') |
514 | 514 |
515 var lines =<< trim END | 515 var lines =<< trim END |
516 var Ref = {x: number, y: number -> x + y} | 516 var Ref = (x: number, y: number) => x + y |
517 echo Ref(1, 'x') | 517 echo Ref(1, 'x') |
518 END | 518 END |
519 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string') | 519 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string') |
520 enddef | 520 enddef |
521 | 521 |
522 def Test_lambda_uses_assigned_var() | 522 def Test_lambda_uses_assigned_var() |
523 CheckDefSuccess([ | 523 CheckDefSuccess([ |
524 'var x: any = "aaa"' | 524 'var x: any = "aaa"' |
525 'x = filter(["bbb"], {_, v -> v =~ x})']) | 525 'x = filter(["bbb"], (_, v) => v =~ x)']) |
526 enddef | 526 enddef |
527 | 527 |
528 " Default arg and varargs | 528 " Default arg and varargs |
529 def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string | 529 def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string |
530 var res = one .. ',' .. two | 530 var res = one .. ',' .. two |
1411 return Ref('more') | 1411 return Ref('more') |
1412 enddef | 1412 enddef |
1413 | 1413 |
1414 def Test_closure_simple() | 1414 def Test_closure_simple() |
1415 var local = 'some ' | 1415 var local = 'some ' |
1416 RefFunc({s -> local .. s})->assert_equal('some more') | 1416 RefFunc((s) => local .. s)->assert_equal('some more') |
1417 enddef | 1417 enddef |
1418 | 1418 |
1419 def MakeRef() | 1419 def MakeRef() |
1420 var local = 'some ' | 1420 var local = 'some ' |
1421 g:Ref = {s -> local .. s} | 1421 g:Ref = (s) => local .. s |
1422 enddef | 1422 enddef |
1423 | 1423 |
1424 def Test_closure_ref_after_return() | 1424 def Test_closure_ref_after_return() |
1425 MakeRef() | 1425 MakeRef() |
1426 g:Ref('thing')->assert_equal('some thing') | 1426 g:Ref('thing')->assert_equal('some thing') |
1427 unlet g:Ref | 1427 unlet g:Ref |
1428 enddef | 1428 enddef |
1429 | 1429 |
1430 def MakeTwoRefs() | 1430 def MakeTwoRefs() |
1431 var local = ['some'] | 1431 var local = ['some'] |
1432 g:Extend = {s -> local->add(s)} | 1432 g:Extend = (s) => local->add(s) |
1433 g:Read = {-> local} | 1433 g:Read = () => local |
1434 enddef | 1434 enddef |
1435 | 1435 |
1436 def Test_closure_two_refs() | 1436 def Test_closure_two_refs() |
1437 MakeTwoRefs() | 1437 MakeTwoRefs() |
1438 join(g:Read(), ' ')->assert_equal('some') | 1438 join(g:Read(), ' ')->assert_equal('some') |
1465 unlet g:Read | 1465 unlet g:Read |
1466 enddef | 1466 enddef |
1467 | 1467 |
1468 def MakeArgRefs(theArg: string) | 1468 def MakeArgRefs(theArg: string) |
1469 var local = 'loc_val' | 1469 var local = 'loc_val' |
1470 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s} | 1470 g:UseArg = (s) => theArg .. '/' .. local .. '/' .. s |
1471 enddef | 1471 enddef |
1472 | 1472 |
1473 def MakeArgRefsVarargs(theArg: string, ...rest: list<string>) | 1473 def MakeArgRefsVarargs(theArg: string, ...rest: list<string>) |
1474 var local = 'the_loc' | 1474 var local = 'the_loc' |
1475 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)} | 1475 g:UseVararg = (s) => theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest) |
1476 enddef | 1476 enddef |
1477 | 1477 |
1478 def Test_closure_using_argument() | 1478 def Test_closure_using_argument() |
1479 MakeArgRefs('arg_val') | 1479 MakeArgRefs('arg_val') |
1480 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val') | 1480 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val') |
1524 return a:Ref('some') | 1524 return a:Ref('some') |
1525 endfunc | 1525 endfunc |
1526 | 1526 |
1527 def Test_call_closure_not_compiled() | 1527 def Test_call_closure_not_compiled() |
1528 var text = 'text' | 1528 var text = 'text' |
1529 g:Ref = {s -> s .. text} | 1529 g:Ref = (s) => s .. text |
1530 GetResult(g:Ref)->assert_equal('sometext') | 1530 GetResult(g:Ref)->assert_equal('sometext') |
1531 enddef | 1531 enddef |
1532 | 1532 |
1533 def Test_double_closure_fails() | 1533 def Test_double_closure_fails() |
1534 var lines =<< trim END | 1534 var lines =<< trim END |
1535 vim9script | 1535 vim9script |
1536 def Func() | 1536 def Func() |
1537 var name = 0 | 1537 var name = 0 |
1538 for i in range(2) | 1538 for i in range(2) |
1539 timer_start(0, {-> name}) | 1539 timer_start(0, () => name) |
1540 endfor | 1540 endfor |
1541 enddef | 1541 enddef |
1542 Func() | 1542 Func() |
1543 END | 1543 END |
1544 CheckScriptSuccess(lines) | 1544 CheckScriptSuccess(lines) |
1547 def Test_nested_closure_used() | 1547 def Test_nested_closure_used() |
1548 var lines =<< trim END | 1548 var lines =<< trim END |
1549 vim9script | 1549 vim9script |
1550 def Func() | 1550 def Func() |
1551 var x = 'hello' | 1551 var x = 'hello' |
1552 var Closure = {-> x} | 1552 var Closure = () => x |
1553 g:Myclosure = {-> Closure()} | 1553 g:Myclosure = () => Closure() |
1554 enddef | 1554 enddef |
1555 Func() | 1555 Func() |
1556 assert_equal('hello', g:Myclosure()) | 1556 assert_equal('hello', g:Myclosure()) |
1557 END | 1557 END |
1558 CheckScriptSuccess(lines) | 1558 CheckScriptSuccess(lines) |
1563 vim9script | 1563 vim9script |
1564 def FuncA() | 1564 def FuncA() |
1565 FuncB(0) | 1565 FuncB(0) |
1566 enddef | 1566 enddef |
1567 def FuncB(n: number): list<string> | 1567 def FuncB(n: number): list<string> |
1568 return map([0], {_, v -> n}) | 1568 return map([0], (_, v) => n) |
1569 enddef | 1569 enddef |
1570 FuncA() | 1570 FuncA() |
1571 END | 1571 END |
1572 CheckScriptFailure(lines, 'E1012:') | 1572 CheckScriptFailure(lines, 'E1012:') |
1573 enddef | 1573 enddef |
1640 def Test_nested_lambda() | 1640 def Test_nested_lambda() |
1641 var lines =<< trim END | 1641 var lines =<< trim END |
1642 vim9script | 1642 vim9script |
1643 def Func() | 1643 def Func() |
1644 var x = 4 | 1644 var x = 4 |
1645 var Lambda1 = {-> 7} | 1645 var Lambda1 = () => 7 |
1646 var Lambda2 = {-> [Lambda1(), x]} | 1646 var Lambda2 = () => [Lambda1(), x] |
1647 var res = Lambda2() | 1647 var res = Lambda2() |
1648 assert_equal([7, 4], res) | 1648 assert_equal([7, 4], res) |
1649 enddef | 1649 enddef |
1650 Func() | 1650 Func() |
1651 END | 1651 END |
1652 CheckScriptSuccess(lines) | 1652 CheckScriptSuccess(lines) |
1653 enddef | 1653 enddef |
1654 | 1654 |
1655 def Shadowed(): list<number> | 1655 def Shadowed(): list<number> |
1656 var FuncList: list<func: number> = [{ -> 42}] | 1656 var FuncList: list<func: number> = [() => 42] |
1657 return FuncList->map({_, Shadowed -> Shadowed()}) | 1657 return FuncList->map((_, Shadowed) => Shadowed()) |
1658 enddef | 1658 enddef |
1659 | 1659 |
1660 def Test_lambda_arg_shadows_func() | 1660 def Test_lambda_arg_shadows_func() |
1661 assert_equal([42], Shadowed()) | 1661 assert_equal([42], Shadowed()) |
1662 enddef | 1662 enddef |
1674 | 1674 |
1675 def Test_script_var_in_lambda() | 1675 def Test_script_var_in_lambda() |
1676 var lines =<< trim END | 1676 var lines =<< trim END |
1677 vim9script | 1677 vim9script |
1678 var script = 'test' | 1678 var script = 'test' |
1679 assert_equal(['test'], map(['one'], {-> script})) | 1679 assert_equal(['test'], map(['one'], () => script)) |
1680 END | 1680 END |
1681 CheckScriptSuccess(lines) | 1681 CheckScriptSuccess(lines) |
1682 enddef | 1682 enddef |
1683 | 1683 |
1684 def Line_continuation_in_lambda(): list<string> | 1684 def Line_continuation_in_lambda(): list<string> |
1685 var x = range(97, 100) | 1685 var x = range(97, 100) |
1686 ->map({_, v -> nr2char(v) | 1686 ->map((_, v) => nr2char(v) |
1687 ->toupper()}) | 1687 ->toupper()) |
1688 ->reverse() | 1688 ->reverse() |
1689 return x | 1689 return x |
1690 enddef | 1690 enddef |
1691 | 1691 |
1692 def Test_line_continuation_in_lambda() | 1692 def Test_line_continuation_in_lambda() |
1770 def Test_recursive_call() | 1770 def Test_recursive_call() |
1771 Fibonacci(20)->assert_equal(6765) | 1771 Fibonacci(20)->assert_equal(6765) |
1772 enddef | 1772 enddef |
1773 | 1773 |
1774 def TreeWalk(dir: string): list<any> | 1774 def TreeWalk(dir: string): list<any> |
1775 return readdir(dir)->map({_, val -> | 1775 return readdir(dir)->map((_, val) => |
1776 fnamemodify(dir .. '/' .. val, ':p')->isdirectory() | 1776 fnamemodify(dir .. '/' .. val, ':p')->isdirectory() |
1777 ? {[val]: TreeWalk(dir .. '/' .. val)} | 1777 ? {[val]: TreeWalk(dir .. '/' .. val)} |
1778 : val | 1778 : val |
1779 }) | 1779 ) |
1780 enddef | 1780 enddef |
1781 | 1781 |
1782 def Test_closure_in_map() | 1782 def Test_closure_in_map() |
1783 mkdir('XclosureDir/tdir', 'p') | 1783 mkdir('XclosureDir/tdir', 'p') |
1784 writefile(['111'], 'XclosureDir/file1') | 1784 writefile(['111'], 'XclosureDir/file1') |
1888 vim9script | 1888 vim9script |
1889 def Func() | 1889 def Func() |
1890 var x = ['a', 'b', 'c'] | 1890 var x = ['a', 'b', 'c'] |
1891 if 1 | 1891 if 1 |
1892 var y = 'x' | 1892 var y = 'x' |
1893 map(x, {-> y}) | 1893 map(x, () => y) |
1894 endif | 1894 endif |
1895 var z = x | 1895 var z = x |
1896 assert_equal(['x', 'x', 'x'], z) | 1896 assert_equal(['x', 'x', 'x'], z) |
1897 enddef | 1897 enddef |
1898 Func() | 1898 Func() |
1920 # builtin function considered failing | 1920 # builtin function considered failing |
1921 var lines =<< trim END | 1921 var lines =<< trim END |
1922 vim9script | 1922 vim9script |
1923 au BufWinLeave * # | 1923 au BufWinLeave * # |
1924 def Func() | 1924 def Func() |
1925 popup_menu('', {callback: {-> popup_create('', {})->popup_close()}}) | 1925 popup_menu('', {callback: () => popup_create('', {})->popup_close()}) |
1926 eval [][0] | 1926 eval [][0] |
1927 enddef | 1927 enddef |
1928 nno <F3> <cmd>call <sid>Func()<cr> | 1928 nno <F3> <cmd>call <sid>Func()<cr> |
1929 feedkeys("\<F3>\e", 'xt') | 1929 feedkeys("\<F3>\e", 'xt') |
1930 END | 1930 END |
2012 vim9script | 2012 vim9script |
2013 g:result = 'none' | 2013 g:result = 'none' |
2014 var d: dict<any> | 2014 var d: dict<any> |
2015 def Func() | 2015 def Func() |
2016 try | 2016 try |
2017 g:result = map([], {_, v -> {}[v]})->join() .. d[''] | 2017 g:result = map([], (_, v) => ({}[v]))->join() .. d[''] |
2018 catch | 2018 catch |
2019 endtry | 2019 endtry |
2020 enddef | 2020 enddef |
2021 silent! Func() | 2021 silent! Func() |
2022 assert_equal('0', g:result) | 2022 assert_equal('0', g:result) |