Am 14.08.2015 um 10:17 schrieb Walter Bright:
On 8/13/2015 11:52 PM, Sönke Ludwig wrote:
Am 14.08.2015 um 02:26 schrieb Walter Bright:
On 8/13/2015 3:51 AM, Sönke Ludwig wrote:
These were, AFAICS, the only major open issues (a decision for an
opt() variant
would be nice, but fortunately that's not a fundamental decision in
any way).

1. What about the issue of having the API be a composable range
interface?

http://s-ludwig.github.io/std_data_json/stdx/data/json/lexer/lexJSON.html


I.e. the input range should be the FIRST argument, not the last.

Hm, it *is* the first function argument, just the last template argument.

Ok, my mistake. I didn't look at the others.

I don't know what 'isStringInputRange' is. Whatever it is, it should be
a 'range of char'.

I'll rename it to isCharInputRange. We don't have something like that in Phobos, right?

2. Why are integers acceptable as lexer input? The spec specifies
Unicode.
In this case, the lexer will perform on-the-fly UTF validation of the
input. It
can do so more efficiently than first validating the input using a
wrapper
range, because it has to check the value of most incoming code units
anyway.

There is no reason to validate UTF-8 input. The only place where
non-ASCII code units can even legally appear is inside strings, and
there they can just be copied verbatim while looking for the end of the
string.

The idea is to assume that any char based input is already valid UTF (as D defines it), while integer based input comes from an unverified source, so that it still has to be validated before being cast/copied into a 'string'. I think this is a sensible approach, both semantically and performance-wise.



3. Why are there 4 functions that do the same thing?

http://s-ludwig.github.io/std_data_json/stdx/data/json/generator.html

After all, there already is a
http://s-ludwig.github.io/std_data_json/stdx/data/json/generator/GeneratorOptions.html

There are two classes of functions that are not covered by
GeneratorOptions:
writing to a stream or returning a string.

Why do both? Always return an input range. If the user wants a string,
he can pipe the input range to a string generator, such as .array

Convenience for one. The lack of number to input range conversion functions is another concern. I'm not really keen to implement an input range style floating-point to string conversion routine just for this module.

Finally, I'm a little worried about performance. The output range based approach can keep a lot of state implicitly using the program counter register. But an input range would explicitly have to keep track of the current JSON element, as well as the current character/state within that element (and possibly one level deeper, for example for escape sequences). This means that it will require either multiple branches or indirection for each popFront().

Reply via email to