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