docs / decisiones / 0013decisions / 0013
ADR 0013. Elementos de lista vacíos#
- Estado: aceptada
- Fecha: 2026-09-17 (SPEC 1.1)
- Especificación: SPEC.md §3.4 y §6
Contexto y problema#
La gramática 1.0 permitía elementos vacíos (bare ::= value, que puede ser vacío), de
modo que a,,b y un separador final (a,) eran sintácticamente válidos, y la
referencia los leía como cadenas vacías. Sin embargo, el serializador escribía [""]
como un campo vacío, que el parser lee como []: la propiedad de ida y vuelta (§9)
fallaba para listas con un único elemento vacío.
Alternativas consideradas#
- Rechazar los elementos vacíos sin comillas (E06) y exigir
"". - Aceptarlos como cadena vacía y escribir siempre
""en la salida canónica. - Aceptarlos y escribir
""solo cuando la lista es[""].
Decisión#
Se adopta la alternativa 2. Un elemento vacío, con o sin comillas, es la cadena vacía
para elementos str y un error del tipo de elemento en otro caso (E06; E10 para
enum). El serializador canónico escribe todo elemento vacío como "", único caso en
que emite comillas.
Consecuencias#
- Ningún documento aceptado por 1.0 se vuelve inválido; la alternativa 1 habría invalidado documentos válidos según la gramática 1.0.
[""]hace ida y vuelta:""→[""]→"".- Una forma uniforme para todo elemento vacío evita que la salida canónica dependa de la longitud de la lista (alternativa 3) y no confunde un separador final con un corte.
- Las tuplas no cambian: un componente vacío sigue siendo null si es opcional y E06 si
es requerido (casos 1.0
tuple-optional-componentytuple-required-component-empty).
Evidencia#
- Lista de puntos pendientes de conformance/README.md en la
revisión
d4a1d44(«la referencia los acepta como cadena vacía, lo que rompe la ida y vuelta de[""]»). - Caso 1.0
quote-empty(""*,b→["", "b"]) en conformance/cases/quotes.json. - Casos 1.1:
list-empty-element-middle,list-empty-element-trailing,list-single-empty-string,list-empty-element-int,list-empty-element-enum(lists.json),dumps-empty-string-elements(roundtrip.json) ymlist-empty-marked-element(mlist.json).
Decision records are written in Spanish.
ADR 0013. Elementos de lista vacíos#
- Estado: aceptada
- Fecha: 2026-09-17 (SPEC 1.1)
- Especificación: SPEC.md §3.4 y §6
Contexto y problema#
La gramática 1.0 permitía elementos vacíos (bare ::= value, que puede ser vacío), de
modo que a,,b y un separador final (a,) eran sintácticamente válidos, y la
referencia los leía como cadenas vacías. Sin embargo, el serializador escribía [""]
como un campo vacío, que el parser lee como []: la propiedad de ida y vuelta (§9)
fallaba para listas con un único elemento vacío.
Alternativas consideradas#
- Rechazar los elementos vacíos sin comillas (E06) y exigir
"". - Aceptarlos como cadena vacía y escribir siempre
""en la salida canónica. - Aceptarlos y escribir
""solo cuando la lista es[""].
Decisión#
Se adopta la alternativa 2. Un elemento vacío, con o sin comillas, es la cadena vacía
para elementos str y un error del tipo de elemento en otro caso (E06; E10 para
enum). El serializador canónico escribe todo elemento vacío como "", único caso en
que emite comillas.
Consecuencias#
- Ningún documento aceptado por 1.0 se vuelve inválido; la alternativa 1 habría invalidado documentos válidos según la gramática 1.0.
[""]hace ida y vuelta:""→[""]→"".- Una forma uniforme para todo elemento vacío evita que la salida canónica dependa de la longitud de la lista (alternativa 3) y no confunde un separador final con un corte.
- Las tuplas no cambian: un componente vacío sigue siendo null si es opcional y E06 si
es requerido (casos 1.0
tuple-optional-componentytuple-required-component-empty).
Evidencia#
- Lista de puntos pendientes de conformance/README.md en la
revisión
d4a1d44(«la referencia los acepta como cadena vacía, lo que rompe la ida y vuelta de[""]»). - Caso 1.0
quote-empty(""*,b→["", "b"]) en conformance/cases/quotes.json. - Casos 1.1:
list-empty-element-middle,list-empty-element-trailing,list-single-empty-string,list-empty-element-int,list-empty-element-enum(lists.json),dumps-empty-string-elements(roundtrip.json) ymlist-empty-marked-element(mlist.json).