Ken Takata wrote: > 2016/9/22 Thu 2:37:29 UTC+9 Bram Moolenaar wrote: > > Christian Brabandt wrote: > > > > > Am 2016-09-21 00:00, schrieb Ken Takata: > > > > Hi Christian, > > > > > > > > 2016/9/21 Wed 5:31:26 UTC+9 Christian Brabandt wrote: > > > >> Hi, > > > >> I think I found a bug with lambda expressions. > > > >> > > > >> I was looking into writing some automated tests and was trying to use > > > >> the new lambda expressions. However this does not work as expected: > > > >> > > > >> Here is an example: > > > >> #v+ > > > >> let a = ['FOOBAR "word"', 'FOOBAR "word2"'] > > > >> let pat='^FOOBAR\s\+\zs"[^"]\+"' > > > >> let pat2='^FOOBAR\s\+\("[^"]\+"\)' > > > >> :echo map(copy(a), 'matchstr(v:val, g:pat)') > > > >> -> result ['"word"', '"word2"'] > > > >> :echo map(copy(a), {val -> matchstr(val, g:pat)}) > > > >> -> BUG: result ['""', '""'], expected ['"word"', '"word2"'] > > > >> :echo map(copy(a), 'substitute(v:val, g:pat2, > > > >> ''\=submatch(1)'',"")') > > > >> -> result ['"word"', '"word2"'] > > > >> :echo map(copy(a), {val -> substitute(val, g:pat2, '\=submatch(1)', > > > >> '')}) > > > >> -> BUG: result ['0', '1'], expected ['"word", '"word2"'] > > > >> #v- > > > > > > > > This is not a bug. map() always passes two arguments (key and val) to > > > > the > > > > specified Funcref. So, > > > > > > > >> :echo map(copy(a), {val -> matchstr(val, g:pat)}) > > > > > > > > this should be: > > > > > > > > :echo map(copy(a), {key, val -> matchstr(val, g:pat)}) > > > > > > > > Or you can still use v:val: > > > > > > > > :echo map(copy(a), {-> matchstr(v:val, g:pat)}) > > > > > > Hm, should there be an error when only one argument is given? > > > Or at least it should be more stressed in the documentatio, that two > > > arguments are expected. > > > > How about extending the example in the help: > > > > If {expr2} is a |Funcref| it is called with two arguments: > > 1. The key or the index of the current item. > > 2. the value of the current item. > > The function must return the new value of the item. Example > > that changes each value by "key-value": > > > func KeyValue(key, val) > > return a:key . '-' . a:val > > endfunc > > call map(myDict, function('KeyValue')) > > < It is shorter when using a |lambda|: > > > call map(myDict, {key, val -> key . '-' . val}) > > < If you do not use "val" you can leave it out: > > > call map(myDict, {key -> 'item: ' . key}) > > A similar update might be needed for `:help filter()`.
How about this: If {expr2} is a |Funcref| it must take two arguments: 1. the key or the index of the current item. 2. the value of the current item. The function must return |TRUE| if the item should be kept. Example that keeps the odd items of a list: > func Odd(idx, val) return a:idx % 2 == 1 endfunc call filter(mylist, function('Odd')) < It is shorter when using a |lambda|: > call filter(myList, {idx, val -> idx * val <= 42}) < If you do not use "val" you can leave it out: > call filter(myList, {idx -> idx % 2 == 1}) -- "To whoever finds this note - I have been imprisoned by my father who wishes me to marry against my will. Please please please please come and rescue me. I am in the tall tower of Swamp Castle." SIR LAUNCELOT's eyes light up with holy inspiration. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.