Hi mattn,
2016/7/14 Thu 15:43:11 UTC+9 mattn wrote:
> On Thursday, July 14, 2016 at 12:49:58 PM UTC+9, ZyX wrote:
> > 2016-07-13 19:17 GMT+03:00 mattn <[email protected]>:
> > > On Wednesday, July 13, 2016 at 4:11:59 AM UTC+9, Bram Moolenaar wrote:
> > >
> > > Well, I wonder this lambda will be useful. At the first, we hoped to call
> > > statements in lambda. But the implementation you will include into vim
> > > can't do because it only allow expressions. It's similar to python's
> > > lambda. python's one doesn't allow statements. So usecase are limited to
> > > use. I don't have strong opinion but I'm thinking that this is an new
> > > expresssion or language for the lambda. It will demand to learn the new
> > > expression for the users.
> >
> > Vim has `execute()`. Python-3 has `exec()` function (Python-2 has it
> > as a statement). Lambdas do not usually allow statements because they
> > are to be used in contexts which requires return value (e.g. in Python
> > this is sorted()/list.sort(), defaultdict(), re.sub[n] (BTW, it is
> > good idea to have `substitute(s, pattern, funcref, flags)` to work
> > like `substitute(s, pattern, '\=funcref(submatch(0), submatch(1), …)',
> > flags)`)). Lambdas are also used as a replacement for
> > `functools.partial` (python)/`function(fref, args, self)` (VimL) in
> > cases when they do not apply (e.g. when one needs to fix not the
> > first, but second or other arguments), but this requires closures.
>
> execute() doesn't have scope. So:
>
> call execute("let a = 1")
> echo 1
>
> This define new variable in global scope. I want anonymous function. If
> execute() works with the scope, for example "let a = 1" mean "let l:a = 1",
> It's so great.
Currently "{args -> expr}" has its own scope.
:echo {-> execute("let a = 1")}()
:echo a
E121: Undefined variable: a
E15: Invalid expression: a
BTW, because of its own scope, the following code doesn't work:
let list = [ /* some data */ ]
let l:threshold = 10
filter(list, {idx, val -> val > l:threshold})
As ZyX pointed out, function() can be used (but redundant):
filter(list, function({th, idx, val -> val > th}, [l:threshold]))
Closure might be useful for this, but it would be the next step.
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 [email protected].
For more options, visit https://groups.google.com/d/optout.