RFC: std.json sucessor
Don via Digitalmars-d
digitalmars-d at puremagic.com
Tue Aug 26 07:40:01 PDT 2014
On Tuesday, 26 August 2014 at 14:06:42 UTC, Sönke Ludwig wrote:
> Am 26.08.2014 15:43, schrieb Don:
>> On Monday, 25 August 2014 at 14:04:12 UTC, Sönke Ludwig wrote:
>>> Am 25.08.2014 15:07, schrieb Don:
>>>> ie this should be parsable:
>>>>
>>>> {"foo": NaN, "bar": Infinity, "baz": -Infinity}
>>>
>>> This would probably best added as another (CT) optional
>>> feature. I
>>> think the default should strictly adhere to the JSON
>>> specification,
>>> though.
>>
>> Yes, it should be optional, but not a compile-time option.
>> I think it should parse it, and based on a runtime flag, throw
>> an error
>> (perhaps an OutOfRange error or something, and use the same
>> thing for
>> values that exceed the representable range).
>>
>> An app may accept these non-standard values under certain
>> circumstances
>> and not others. In real-world code, you see a *lot* of these
>> guys.
>
> Why not a compile time option?
>
> That sounds to me like such an app should simply enable parsing
> those values and manually test for NaN at places where it
> matters.
> For all other (the majority) of applications, encountering
> NaN/Infinity will simply mean that there is a bug, so it makes
> sense to not accept those at all by default.
>
> Apart from that I don't think that it's a good idea for the
> lexer in general to accept non-standard input by default.
Please note, I've been talking about the lexer. I'm choosing my
words very carefully.
>> Part of the reason these are important, is that NaN or Infinity
>> generally means some Javascript code just has an uninitialized
>> variable.
>> Any other kind of invalid JSON typically means something very
>> nasty has
>> happened. It's important to distinguish these.
>
> As far as I understood, JavaScript will output those special
> values as null (at least when not using external JSON
> libraries).
No. Javascript generates them directly. Naive JS code generates
these guys. That's why they're so important.
> But even if not, an uninitialized variable can also be very
> nasty, so it's hard to see why that kind of bug should be
> silently supported (by default).
I never said it should accepted by default. I said it is a
situation which should be *lexed*. Ideally, by default it should
give a different error from simply 'invalid JSON'. I believe it
should ALWAYS be lexed, even if an error is ultimately generated.
This is the difference: if you get NaN or Infinity, there's
probably a straightforward bug in the Javascript code, but your D
code is fine. Any other kind of JSON parsing error means you've
got a garbage string that isn't JSON at all. They are very
different errors.
It's a diagnostics issue.
More information about the Digitalmars-d
mailing list