2017-02-23 16:25 GMT+03:00 Bram Moolenaar <b...@moolenaar.net>: > >> > Nikolai Pavlov wrote: >> > >> >> @brammool This is not fine. First, this shows yet another >> >> inconsistency between different notations. Second, dictionary with >> >> variables in not guaranteed to be `b:` and `let d = b:|call >> >> islocked('d.changedtick')` errors out just in the same fashion. E.g. >> >> consider writing a serializer which saves containers with locked >> >> status and it is unable to serialize b: (such thing may be useful for >> >> debugging: `:let b:` is not showing locked status). Third, ***I am not >> >> changing a variable***. If `islocked()` attempts or it seems like >> >> `islocked()` may attempt changing a variable this looks very strange >> >> and makes function very suspicious. Fourth, there is an existing key, >> >> syntactically correct and valid expression (which may even be used to >> >> obtain `count`) and it still errors out. >> > >> > OK, islocked('d.changedtick') is something that should work. >> > >> > I never intended b:.changedtick to be a valid syntax. It's ugly. >> > I suppose we can't make that an error now, for backwards compability. >> >> It is a direct consequence of existence of `b:` scope dictionary >> variable and short form of dictionary indexing syntax, making it not >> work would be inconsistent and not only incompatible. I sometimes use >> things like `funccall(args).key`. > > I was talking about the syntax, not the semantics. Although b: behaves > like a dictionary, it's a namespace in which members are accessed > directly, without a separating ".". > >> >> By the way, why `islocked('v:count')` is zero and there are no >> >> functions like `isfixed()`? >> > >> > Been like that forever. v:count is read-only, and there is no >> > isreadonly(). >> > >> > We can probably remove the locked flag on b:changedtick, for >> > consistency. >> >> I intentionally added it there because `islocked('b:changedtick')` >> intentionally returned 1, I did not try to understand why it does so. >> I do not know whether somebody actually depends on that, but think it >> is unlikely because `b:changedtick` was not previously in a `b:` >> dictionary so whatever you did you needed to handle this value >> separately; actually it is more likely that something will break >> because of `b:changedtick` suddenly appearing inside a b: dictionary >> then because of `islocked('b:changedtick')` starting to return 0 in >> place of 1. > > Other read-only variables are also not considered locked. Let's keep it > consistent. > >> > The locking is something under user control, with :lockvar and >> > :unlockvar. Read-only and fixed are not properties the user can change. >> > Thus it's not really needed to have a function to check for that. >> >> I do not have a use-case except that it is slightly easier to check >> isfixed/isreadonly in Vim own tests then checking that >> assigning/unletting fails. Does not matter much because checking for >> failures is more robust then checking for function output. >> >> It would be needed if you plan on adding more such special variables >> to scope dictionaries in the future, to make scripts forwards >> compatible (e.g. if you need to save and restore b: dictionary >> contents it would be good idea to honor `isreadonly()` to not get >> error messages, now you may just special-case b:changedtick), but this >> idea is not backwards compatible: consider a script which used >> variable b:number and you added readonly b:number with `bufnr()` of >> this buffer. Previously legal script suddenly broken. (I also think >> this is what justifies user functions and commands forcing to begin >> with upper case letter.) > > Making variables writeable just to be able to save/restore them is > tricky. It opens the possibility to write any time and cause harm. > If needed, we could add specific save and restore functions. But that's > just in general, there can be exceptions for historic reasons... > > b:changedtick should never be saved/restored anyway, it only ever > increments. That is its purpose.
I did not mean to make anything writeable. I meant that assuming you have code which saves and restores b: variables you need to handle cases like “variable can be saved, but can’t be restored”. There currently is a single case with b:changedtick (or saving/restoring a very few writeable values in v:, but I have not seen a use-cases so far), but if there are plans on making more something like isreadonly() would be good to have: I would normally use `deepcopy()` and `filter(, 'isreadonly('b:'.v:key))` then than iterating over `keys(b:)` (in which case it would be easy to check whether `let b:{key} = b:{key}` fails): this is not only less code to write, it also aligns will with main VimL optimization principle: the less Ex commands the faster the code. If b:changedtick keeps staying unique it is enough to just special-case only it for this purpose. If there will be more in the future then `isreadonly()` is needed to nicely keep forward compatibility. > > > -- > login: yes > password: I don't know, please tell me > password is incorrect > login: yes > password: incorrect > > /// 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.