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.

Raspunde prin e-mail lui