Hi Bram, thanks for sharing. Looks really promising.
Regarding https://github.com/brammool/vim9#3-better-vim-script, I have a
few ideas for your consideration:
* Execution often relies on user configuration (ignorecase, magic, etc.)
and there is common boilerplate required in many scripts to set/restore
cpo. Could we say that when `scriptversion` is `vim9`, we always execute as
if `set cpo&vim` ?
* Line continuation. I know this is probably hard to change, but could we
look at a line-continuation scheme that's more familiar ? As we don't have
line termination, Perhaps something more like python's e.g. if a line ends
with an unbalanced parenthesis (or a `<backslash><newline>`), then assume
the next line is a continuation? I think the `<newline><backslash>` syntax
is unfamiliar to a lot of people.
* Scoped functions or lambdas containing ex-commands (or better, def
function bodies). When combined with try/finally, this would allow
constructs that take a "block" of code, such as "WithCurrentBuffer( buf, {
=> block of code/commands, maybe split across lines } )" or something like
this when working with external tools `SendMessageToTool( message, then = {
=> some block of ex commands } ). This can currently be done with Funcref,
but I think that you have to do 'function ...' and then 'delfiunc' as all
functions are currently global. Maybe the new scoping rules could be
extended to allow this.
I already mentioned elsewhere that the other barrier to entry for vim
scripting is tooling and debugging. Hopefully with a these changes we can
consider how to:
* extract the parser so that an external tool can parse and do code
comprehension, go-to, refactor, etc., think Vim Language Server (there is
one, but it's not canonical)
* provide a interface to a debug adapter to allow debugging of vimscript
executing in a Vim instance (i.e. Vim Debug Adapter)
* provide better source/line information for stack traces (so that we can
reliably jump to location of assertions e.g. test failures using cnext). I
saw a recent patch which improves sourcing_lineno and uses a proper stack.
I was planning to work on a patch to store source/line info when debugging
is enabled, but might hold off while vim 9 shakes down, as this is likely
required for the above debugger interface (assuming that's a goal).
Just a few ideas to throw in to the mix!
Thanks again,
Ben
On Thursday, January 2, 2020 at 7:44:10 PM UTC, Bram Moolenaar wrote:
>
>
> I have created a repository for the Vim9 script experiments:
> https://github.com/brammool/vim9
>
> I did another measurement for a more realistic example, re-indenting a
> large number of lines. In old Vim script it would be:
>
> let totallen = 0
> for i in range(1, 100000)
> call setline(i, ' ' .. getline(i))
> let totallen += len(getline(i))
> endfor
>
> The timing differences are much smaller than for the computational
> example, but Vim9 script is clearly the fastest:
>
> Vim old: 0.853752
> Python: 0.304584
> Lua: 0.286573
> Vim new: 0.190276
>
> Compared to legacy Vim script it is a 4 times faster.
>
> If you want to look at the instructions that are used internally, the
> ":disassemble" command shows what's the compilation result. For
> example, this function:
>
> def VimNew(): number
> let totallen = 0
> for i in range(1, 100000)
> setline(i, ' ' .. getline(i))
> totallen += len(getline(i))
> }
> return totallen
> enddef
>
> Results in this:
>
> let totallen = 0
> 0 STORE 0 in $0
>
> for i in range(1, 100000)
> 1 STORE -1 in $1
> 2 PUSHNR 1
> 3 PUSHNR 100000
> 4 BCALL range(argc 2)
> 5 FOR $1 -> 21
> 6 STORE $2
>
> setline(i, ' ' .. getline(i))
> 7 LOAD $2
> 8 PUSHS " "
> 9 LOAD $2
> 10 BCALL getline(argc 1)
> 11 CONCAT
> 12 BCALL setline(argc 2)
> 13 DROP
>
> totallen += len(getline(i))
> 14 LOAD $0
> 15 LOAD $2
> 16 BCALL getline(argc 1)
> 17 BCALL len(argc 1)
> 18 ADDNR
> 19 STORE $0
>
> }
> 20 JUMP -> 5
> 21 DROP
>
> return totallen
> 22 LOAD $0
> 23 RETURN
>
>
> Obviously there is still an awful lot of work to be done. Fortunately,
> the numbers show it's worth it.
>
> --
> The Law of VIM:
> For each member b of the possible behaviour space B of program P, there
> exists
> a finite time t before which at least one user u in the total user space U
> of
> program P will request b becomes a member of the allowed behaviour space
> B'
> (B' <= B).
> In other words: Sooner or later everyone wants everything as an option.
> -- Vince Negri
>
> /// Bram Moolenaar -- [email protected] -- 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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/0538bce3-cc96-4e69-8899-9f5f958de7fb%40googlegroups.com.