On Sun, Feb 7, 2016 at 10:40 PM, Nikolay Aleksandrovich Pavlov
<[email protected]> wrote:
> 2016-02-07 8:07 GMT+03:00 tyru <[email protected]>:
>> On Sun, Feb 7, 2016 at 8:17 AM, Bram Moolenaar <[email protected]> wrote:
>>>
>>> Tyru wrote:
>>>
>>>> >> Sorry Bram, I forgot to send this mail to vim_dev.
>>>> >> Send again with +alpha about problems of current JSON features.
>>>> >>
>>>> >> On Sat, Feb 6, 2016 at 11:50 PM, Bram Moolenaar <[email protected]>
>>>> >> wrote:
>>>> >> >
>>>> >> >> What do you think about this?
>>>> >> >
>>>> >> > I don't want to spend much time discussing this. v:null and v:none
>>>> >> > are
>>>> >> > needed just like JavaScript has null and undefined.
>>>> >> >
>>>> >> > I was thinking of taking this a step further to a more efficient
>>>> >> > encoding that is similar to Javascript. Unfortunately I haven't been
>>>> >> > able to find a specification. I thought it was used in combination
>>>> >> > with
>>>> >> > protocol buffers. Besides empty entries in an array, it also removes
>>>> >> > the quotes around object item names. It's more efficient and doesn't
>>>> >> > drop any functionality. We could add protocol buffer support, but
>>>> >> > let's
>>>> >> > leave that for some other time.
>>>> >> >
>>>> >> > Also keep in mind that when you want to stick to the JSON standard
>>>> >> > (well, one of them), you should not write the string yourself but use
>>>> >> > a
>>>> >> > library to create it. Arguments that it's hard to type or spot a
>>>> >> > mistake are hardly relevant.
>>>> >>
>>>> >> Okay.
>>>> >> Now I know you seem to follow JavaScript syntax rather than JSON
>>>> >> standard.
>>>> >
>>>> > True. Perhaps we should split this and add jsencode() / jsdecode().
>>>>
>>>> Sounds great!
>>>> Do you have the plan to add jsencode() / jsdecode() ?
>>>> Or, will you merge the patch for those functions if I write?
>>>
>>> Feel free to make a patch.
>>
>> Okay, thanks!
>>
>>>
>>>> >> But please remind JSON is not only for JavaScript.
>>>> >> It might be used for a communication with Vim and scripts, external
>>>> >> commands, and so on.
>>>> >>
>>>> >> And more, currently, 'jsonencode({"key": v:none})' produces output
>>>> >> '{"key":}'.
>>>> >> This is not even a correct JavaScript syntax.
>>>> >
>>>> > I'll fix that.
>>>>
>>>> Thanks!
>>>> Now I confirmed that 7.4.1269 raises an E474 error for the expression.
>>>> But yet it seems to return the string ('{"key":}').
>>>> Is it intentional?
>>>
>>> When there is an error it returns what it has. Would it be better to
>>> return nothing?
>>
>> Hmm, patch 7.4.1270 seemed to fix this temporarily last night
>> and the result was totally what I was thinking;
>> which returns 'v:none' instead of what it has.
>>
>> An explicit error return value is better I think
>> because immediately we can notice something went wrong.
>> and if only a user checks the return value (without surrounding :try ~
>> :catch),
>> a user can detect an error, like 'delete()' returns -1 with an error.
>>
>> let json = jsonencode({"key": v:none})
>> if json is v:none
>> echoerr 'error!'
>> return ...
>> endif
>>
>> And sorry, tyru is a nickname.
>> The real name is Takuya Fujiwara.
>> I think you prefer a real name :)
>> (changed my nickname on google groups, too)
>> (oh, ':helpgrep Tyru' also shows my nickname in some places...)
>
> Your code should not assume that execution continues after error. Wrap
> the whole thing into :try/:catch and `echoerr` will never be run. And
> it is not necessary you that will use :try/:catch, users of your
> plugin may do the same thing and it will stop.
>
> If you need to handle the error reliably use :try/:catch, there are no
> other options. And *never* use :echoerr, it has just the same problem:
> you do not know whether Vim will continue executing your code or
> :echoerr error will be transformed into exception, jumping to :catch,
> :finally or halting completely right after :echoerr.
Yes.
You seem to know well about both Vim script and C implementation :)
I also think :try/:catch is a more practical way to handle an error in
Vim script.
But, what I wanted to say in that example is that,
1. I suppose that a Vim script function must return a value even when
an error raised
(like 'delete()' returns -1 on error) *not just throwing an exception*.
* (Please tell me if the implementation like *just throwing an
exception* function is possible.
Because I don't know much about Vim's implementation)
2. I also think it is simpler if jsonencode() just throws an exception.
BTW, in Vim script, an error and an exception are slightly different.
Also I don't use :echoerr for error message
and I add 'abort' to all functions (my old script doesn't have it,
though... ;) ).
The safest way to echo an error message, is to create a function like below.
But it is too complicated for an example :)
function s:error(msg) abort
try
echohl ErrorMsg
echomsg a:msg
finally
echohl None
endtry
endtry
>
>>
>>>
>>>
>>> --
>>> You're as much use as a condom machine at the Vatican.
>>> -- Rimmer to Holly in Red Dwarf 'Queeg'
>>>
>>> /// 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].
>> For more options, visit https://groups.google.com/d/optout.
>
> --
> --
> 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.
--
--
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.