Re: Some questions and comments on the srfi and its reference implementation
Amirouche Boubekki 26 Sep 2021 07:28 UTC
Hello Alejandro,
For some reason I can not find that thread in my mailbox:
ref: https://srfi-email.schemers.org/srfi-180/threads/2021/3/#16148221
Here is the repository with the code of the Gambit implementation:
https://github.com/alejsan/gambit-srfi-180-json
I quote the original thread and try to answer the question when I can:
>
> 1. Should the generator produced by json-generator close over the current values
> of json-nesting-depth-limit and json-number-of-character-limit when it is
> created? Consider the example:
>
> ;; generator created, default parameter values of +inf.0
> (define gen (with-input-from-string "true" json-generator))
>
> ;; generator used, reference implementation does not raise an error
> (parameterize ((json-number-of-character-limit 1))
> (gen))
>
I do not understand the question.
If I could, I would remove the json-number-of-character-limit from
that specification. That is good practice to limit the size of the
input, but it must be done upstream, and not in a JSON library.
> 2. Why is the port-or-accumulator argument to json-accumulator required? I think
> the returned accumulator should default to writing to the current-output-port
> just like json-write does.
>
> I believe the following are errors in the reference implementation:
That is a mistake, port-or-accumulator or port-or-generator must
always be optional, like you describe.
> 1. The reference implementation of json-generator accepts ONLY an input-port and
> does not accept a character generator as its argument.
That is a mistake in the sample / reference implementation.
> 2. The reference implementation of json-accumulator accepts ONLY an accumulator
> and does not accept an output-port as its argument.
That is another mistake.
> 3. In the reference implementation the accumulator produced by json-accumulator
> expects its input to be pairs such as (cons 'json-value 10) or (cons
> 'json-structure 'array-start). It does not accept the output of generators
> produced by json-generator.
Do you have an example of that? Seems like yet another mistake.
In the gambit repository there is this comment in the README:
> Very large numbers
>
> Some grammatically valid inputs may cause gambit to perform expensive bignum operations possibly using all available memory. The test data includes one such file “i_number_huge_exp.json” (the test case is commented out).
>
> Should there be a way to mitigate this risk?
What I was thinking is to add parameters such as
json-maximum-absolute-number. But then what do we do with inexact
numbers?
I perused some other JSON readers / writers in other languages. They
support NaN, -inf and +inf but those are not in the RFC.
https://github.com/python/cpython/blob/main/Lib/json/decoder.py#L15-L17