Hi Bram, 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()`. Regards, Ken Takata -- -- 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.