João Távora <address@hidden
> schrieb am Mi., 30. Mai 2018 um 10:58 Uhr:
Yuri Khan <address@hidden> writes:
> On Wed, May 30, 2018 at 5:31 AM João Távora <address@hidden> wrote:
>> Well, it's not really "global state" in the sense I believe you're
>> talking about, because no part of the library is maintaining any state in
>> global variables -- it's read-only from json.c.
> after ironing out all [the other?] bugs related to shared state
Which ones? Those seem to be precisely the ones I meant to say are
excluded because the var is read-only.
It is not read-only. If it were read-only, it would be just a constant and not a variable (in the imperative programming sense) at all.
> * ‘foo’ wants plists while ‘bar’ wants alists.
If "want" is the same thing as "must have", then bar should be setting
the var from the beginning, end of story. It should only not set the var
if it doesn't care.
(Almost) every caller cares about the return type of the function call; what else should it care about? That means that every caller would have to set this variable, turning it into a parameter, just with awkward syntax and subtle, easy-to-get-wrong interface.
There are many variables like this in emacs.
Yes, unfortunately. That's no reason to introduce new ones.
Emacs was written in simpler times (the 1970s?) when the amount of code in the world was much smaller and people didn't yet know everything that we now know about software engineering. That's OK; if you look at Fortran code from that era it also looks very different from what people would write today (six-letter function names, a single static callback function, customization happens generally by copying and modifying functions, ...). But we have 2018, so we should apply the accumulated wisdom from the last decades.
Eli recently reminded me in
a closely related thread I have to bind coding-system-for-write around
process-send-string, for example.
Yes, that's necessary because the existing interface of process-send-string uses dynamic variables as hidden parameters. That's unfortunate, but no reason why other, unrelated APIs should also do that.
Obviously, the pitfall is overlooking to bind them when you have
to. Presumably this is outweighed by the convenience of not passing a
trillion args to a function call and, more importantly, to every caller
of a function, like in the commit that removes the var, which is quite a
bit more complex (which is why I started with the other alternative).
No, it's never outweighted. If there are too many parameters, you'd collecting them in an "options" object and pass that around, or create a "JsonDecoder" object that keeps the settings, etc.
Anyway, this point could be irrelevant if we remove the variable and
argument completely, auto-detecting plists.
Can't decide if that could
be a worse idea, though.
It might be because it could make the interface more surprising. There's a clear type difference between hashtables and lists, so detecting them automatically is fine. But "plist" isn't really a type; there's no fundamental difference between plists and alists, and the only difference is how they are used (assq vs. plist-get etc.). That's one of the (several) reasons why I decided to not support plists in json.c at all, and I'm still not convinced it's worth the additional interface complexity (for deserializing the story is probably different, as it doesn't make the existing interface more complex, and with the CL argument lists you already have an actual use case).