2016-02-07 18:04 GMT+03:00 tyru <[email protected]>:
> 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.

Functions cannot “just throw an exception”. It is possible that they
throw it (though I do not know built-ins which do this without using
:try), but return value will be present in any case.

>
> 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 :)

In the examples I usually use :echo, :echomsg (without highlighting)
or simply `" handle error`.

>
> 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.

-- 
-- 
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.

Raspunde prin e-mail lui