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})

-- 
Eight Megabytes And Continually Swapping.

 /// 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.

Raspunde prin e-mail lui