Change type syntax of collection into list of

This commit is contained in:
Louis Gesbert 2023-12-05 15:06:28 +01:00
parent 3779a249db
commit e123d7eb95
54 changed files with 425 additions and 471 deletions

View File

@ -162,8 +162,7 @@ let rec typ_gen
(typ ~colors:(List.tl colors)) (typ ~colors:(List.tl colors))
t2 t2
| TArray t1 -> | TArray t1 ->
Format.fprintf fmt "@[<hov 2>%a@ %a@]" base_type "collection" (typ ~colors) Format.fprintf fmt "@[<hov 2>%a@ %a@]" base_type "list of" (typ ~colors) t1
t1
| TDefault t1 -> | TDefault t1 ->
punctuation fmt ""; punctuation fmt "";
typ ~colors fmt t1; typ ~colors fmt t1;

View File

@ -157,9 +157,8 @@ let rec format_typ
")" (format_typ ~colors) t2 ")" (format_typ ~colors) t2
| TArray t1 -> ( | TArray t1 -> (
match Mark.remove (UnionFind.get (UnionFind.find t1)) with match Mark.remove (UnionFind.get (UnionFind.find t1)) with
| TAny _ when not Cli.globals.debug -> | TAny _ when not Cli.globals.debug -> Format.pp_print_string fmt "list"
Format.pp_print_string fmt "collection" | _ -> Format.fprintf fmt "@[list of@ %a@]" (format_typ ~colors) t1)
| _ -> Format.fprintf fmt "@[collection@ %a@]" (format_typ ~colors) t1)
| TDefault t1 -> | TDefault t1 ->
Format.pp_print_as fmt 1 ""; Format.pp_print_as fmt 1 "";
format_typ ~colors fmt t1; format_typ ~colors fmt t1;

View File

@ -56,8 +56,8 @@ module R = Re.Pcre
#ifndef MR_OF #ifndef MR_OF
#define MR_OF MS_OF #define MR_OF MS_OF
#endif #endif
#ifndef MR_COLLECTION #ifndef MR_LIST
#define MR_COLLECTION MS_COLLECTION #define MR_LIST MS_LIST
#endif #endif
#ifndef MR_CONTAINS #ifndef MR_CONTAINS
#define MR_CONTAINS MS_CONTAINS #define MR_CONTAINS MS_CONTAINS
@ -203,8 +203,8 @@ module R = Re.Pcre
#ifndef MR_IS #ifndef MR_IS
#define MR_IS MS_IS #define MR_IS MS_IS
#endif #endif
#ifndef MR_EMPTY #ifndef MR_LIST_EMPTY
#define MR_EMPTY MS_EMPTY #define MR_LIST_EMPTY MS_LIST_EMPTY
#endif #endif
#ifndef MR_CARDINAL #ifndef MR_CARDINAL
#define MR_CARDINAL MS_CARDINAL #define MR_CARDINAL MS_CARDINAL
@ -266,7 +266,7 @@ let token_list : (string * token) list =
(MS_DECREASING, DECREASING); (MS_DECREASING, DECREASING);
(MS_INCREASING, INCREASING); (MS_INCREASING, INCREASING);
(MS_OF, OF); (MS_OF, OF);
(MS_COLLECTION, COLLECTION); (MS_LIST, LIST);
(MS_CONTAINS, CONTAINS); (MS_CONTAINS, CONTAINS);
(MS_ENUM, ENUM); (MS_ENUM, ENUM);
(MS_INTEGER, INTEGER); (MS_INTEGER, INTEGER);
@ -315,7 +315,7 @@ let token_list : (string * token) list =
(MS_MAXIMUM, MAXIMUM); (MS_MAXIMUM, MAXIMUM);
(MS_MINIMUM, MINIMUM); (MS_MINIMUM, MINIMUM);
(MS_IS, IS); (MS_IS, IS);
(MS_EMPTY, EMPTY); (MS_LIST_EMPTY, LIST_EMPTY);
(MS_CARDINAL, CARDINAL); (MS_CARDINAL, CARDINAL);
(MS_YEAR, YEAR); (MS_YEAR, YEAR);
(MS_MONTH, MONTH); (MS_MONTH, MONTH);
@ -417,9 +417,9 @@ let rec lex_code (lexbuf : lexbuf) : token =
| MR_OF -> | MR_OF ->
L.update_acc lexbuf; L.update_acc lexbuf;
OF OF
| MR_COLLECTION -> | MR_LIST ->
L.update_acc lexbuf; L.update_acc lexbuf;
COLLECTION LIST
| MR_CONTAINS -> | MR_CONTAINS ->
L.update_acc lexbuf; L.update_acc lexbuf;
CONTAINS CONTAINS
@ -567,9 +567,9 @@ let rec lex_code (lexbuf : lexbuf) : token =
| MR_IS -> | MR_IS ->
L.update_acc lexbuf; L.update_acc lexbuf;
IS IS
| MR_EMPTY -> | MR_LIST_EMPTY ->
L.update_acc lexbuf; L.update_acc lexbuf;
EMPTY LIST_EMPTY
| MR_CARDINAL -> | MR_CARDINAL ->
L.update_acc lexbuf; L.update_acc lexbuf;
CARDINAL CARDINAL

View File

@ -28,7 +28,8 @@
#define MS_DECREASING "decreasing" #define MS_DECREASING "decreasing"
#define MS_INCREASING "increasing" #define MS_INCREASING "increasing"
#define MS_OF "of" #define MS_OF "of"
#define MS_COLLECTION "collection" #define MS_LIST "list of"
#define MR_LIST "list", space_plus, "of"
#define MS_CONTAINS "contains" #define MS_CONTAINS "contains"
#define MS_ENUM "enumeration" #define MS_ENUM "enumeration"
#define MS_INTEGER "integer" #define MS_INTEGER "integer"
@ -80,7 +81,8 @@
#define MS_MAXIMUM "maximum" #define MS_MAXIMUM "maximum"
#define MS_MINIMUM "minimum" #define MS_MINIMUM "minimum"
#define MS_IS "is" #define MS_IS "is"
#define MS_EMPTY "empty" #define MS_LIST_EMPTY "list empty"
#define MR_LIST_EMPTY "list", space_plus, "empty"
#define MS_CARDINAL "number" #define MS_CARDINAL "number"
#define MS_YEAR "year" #define MS_YEAR "year"
#define MS_MONTH "month" #define MS_MONTH "month"

View File

@ -36,7 +36,8 @@
#define MR_DECREASING "d", 0xE9, "croissant" #define MR_DECREASING "d", 0xE9, "croissant"
#define MS_INCREASING "croissant" #define MS_INCREASING "croissant"
#define MS_OF "de" #define MS_OF "de"
#define MS_COLLECTION "collection" #define MS_LIST "liste de"
#define MR_LIST "liste", space_plus, "de"
#define MS_CONTAINS "contient" #define MS_CONTAINS "contient"
#define MS_ENUM "énumération" #define MS_ENUM "énumération"
#define MR_ENUM 0xE9, "num", 0xE9, "ration" #define MR_ENUM 0xE9, "num", 0xE9, "ration"
@ -100,7 +101,8 @@
#define MS_MAXIMUM "maximum" #define MS_MAXIMUM "maximum"
#define MS_MINIMUM "minimum" #define MS_MINIMUM "minimum"
#define MS_IS "est" #define MS_IS "est"
#define MS_EMPTY "vide" #define MS_LIST_EMPTY "liste vide"
#define MR_LIST_EMPTY "liste", space_plus, "vide"
#define MS_CARDINAL "nombre" #define MS_CARDINAL "nombre"
#define MS_YEAR "an" #define MS_YEAR "an"
#define MS_MONTH "mois" #define MS_MONTH "mois"

View File

@ -30,7 +30,7 @@
#define MS_INCREASING "rosnący" #define MS_INCREASING "rosnący"
#define MR_INCREASING "rosn", 0x0105, "cy" #define MR_INCREASING "rosn", 0x0105, "cy"
#define MS_OF "z" #define MS_OF "z"
#define MS_COLLECTION "kolekcja" #define MS_LIST "lista"
#define MS_CONTAINS "zawiera" #define MS_CONTAINS "zawiera"
#define MS_ENUM "enumeracja" #define MS_ENUM "enumeracja"
#define MS_INTEGER "całkowita" #define MS_INTEGER "całkowita"
@ -93,7 +93,8 @@
#define MS_MAXIMUM "maksimum" #define MS_MAXIMUM "maksimum"
#define MS_MINIMUM "minimum" #define MS_MINIMUM "minimum"
#define MS_IS "jest" #define MS_IS "jest"
#define MS_EMPTY "pusty" #define MS_LIST_EMPTY "lista pusta"
#define MR_LIST_EMPTY "lista", space_plus, "pusta"
#define MS_CARDINAL "liczba" #define MS_CARDINAL "liczba"
#define MS_YEAR "rok" #define MS_YEAR "rok"
#define MS_MONTH "miesiąc" #define MS_MONTH "miesiąc"

File diff suppressed because it is too large Load Diff

View File

@ -119,7 +119,7 @@ let primitive_typ :=
let typ_data := let typ_data :=
| t = primitive_typ ; <Primitive> | t = primitive_typ ; <Primitive>
| COLLECTION ; t = addpos(typ_data) ; <Collection> | LIST ; t = addpos(typ_data) ; <Collection>
let typ == t = typ_data ; <Data> let typ == t = typ_data ; <Data>
@ -213,7 +213,7 @@ let naked_expression ==
} %prec apply } %prec apply
| max = minmax ; | max = minmax ;
OF ; coll = expression ; OF ; coll = expression ;
OR ; IF ; COLLECTION ; EMPTY ; THEN ; OR ; IF ; LIST_EMPTY ; THEN ;
default = expression ; { default = expression ; {
CollectionOp (AggregateExtremum { max; default }, coll) CollectionOp (AggregateExtremum { max; default }, coll)
} %prec apply } %prec apply
@ -265,7 +265,7 @@ let naked_expression ==
AMONG ; coll = expression ; AMONG ; coll = expression ;
SUCH ; THAT ; f = expression ; SUCH ; THAT ; f = expression ;
IS ; max = minmax ; IS ; max = minmax ;
OR ; IF ; COLLECTION ; EMPTY ; THEN ; default = expression ; { OR ; IF ; LIST_EMPTY ; THEN ; default = expression ; {
CollectionOp (AggregateArgExtremum { max; default; f = i, f }, coll) CollectionOp (AggregateArgExtremum { max; default; f = i, f }, coll)
} %prec top_expr } %prec top_expr

View File

@ -38,7 +38,7 @@
%token<string * string> MONEY_AMOUNT %token<string * string> MONEY_AMOUNT
%token BEGIN_CODE TEXT %token BEGIN_CODE TEXT
%token COLON ALT DATA %token COLON ALT DATA
%token OF INTEGER COLLECTION CONTAINS AMONG %token OF INTEGER LIST CONTAINS AMONG
%token RULE CONDITION DEFINED_AS %token RULE CONDITION DEFINED_AS
%token<Ast.op_kind> LESSER GREATER LESSER_EQUAL GREATER_EQUAL %token<Ast.op_kind> LESSER GREATER LESSER_EQUAL GREATER_EQUAL
%token LET EXISTS IN SUCH THAT COMMA %token LET EXISTS IN SUCH THAT COMMA
@ -55,6 +55,6 @@
%token BEGIN_METADATA MONEY DECIMAL %token BEGIN_METADATA MONEY DECIMAL
%token UNDER_CONDITION CONSEQUENCE LBRACE RBRACE %token UNDER_CONDITION CONSEQUENCE LBRACE RBRACE
%token LABEL EXCEPTION LBRACKET RBRACKET SEMICOLON %token LABEL EXCEPTION LBRACKET RBRACKET SEMICOLON
%token MAXIMUM MINIMUM IS EMPTY %token MAXIMUM MINIMUM IS LIST_EMPTY
%% %%

View File

@ -273,7 +273,7 @@
\end{catala} \end{catala}
& \begin{catala} & \begin{catala}
```catala ```catala
collection integer list of integer
``` ```
\end{catala} \end{catala}
@ -632,7 +632,7 @@
\\ \\
\end{tabular} \end{tabular}
\section{Collection operations} \section{List operations}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}} \begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala} \begin{catala}
@ -709,7 +709,7 @@
\begin{catala} \begin{catala}
```catala ```catala
maximum of coll maximum of coll
or if collection empty then -1 or if list empty then -1
``` ```
\end{catala} \end{catala}
& Extremum & Extremum
@ -718,7 +718,7 @@
```catala ```catala
x among coll x among coll
such that (x * x) is minimum such that (x * x) is minimum
or if collection empty then -1 or if list empty then -1
``` ```
\end{catala} \end{catala}
& Arg-extremum & Arg-extremum

View File

@ -273,7 +273,7 @@
\end{catala} \end{catala}
& \begin{catala} & \begin{catala}
```catala ```catala
collection entier liste de entier
``` ```
\end{catala} \end{catala}
@ -631,7 +631,7 @@
\\ \\
\end{tabular} \end{tabular}
\section{Opérations sur les collections} \section{Opérations sur les listes}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}} \begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala} \begin{catala}
@ -693,10 +693,10 @@
\\ \\
\begin{catala} \begin{catala}
```catala ```catala
somme entier coll somme entier de coll
``` ```
\end{catala} \end{catala}
& Aggrégation & Agrégation
\\ \\
\begin{catala} \begin{catala}
```catala ```catala
@ -708,7 +708,7 @@
\begin{catala} \begin{catala}
```catala ```catala
maximum de coll maximum de coll
ou si collection vide alors -1 ou si liste vide alors -1
``` ```
\end{catala} \end{catala}
& Extremums & Extremums
@ -717,7 +717,7 @@
```catala ```catala
x parmi coll x parmi coll
tel que (x * x) est minimum tel que (x * x) est minimum
ou si collection vide alors -1 ou si liste vide alors -1
``` ```
\end{catala} \end{catala}
& Élément selon extremum & Élément selon extremum

View File

@ -216,9 +216,9 @@ déclaration énumération DateNaissanceTroisièmeOuDernierPlusEnfant:
-- PlusDeTroisEnfants contenu DateDeNaissanceOuMoisDeGrossesse -- PlusDeTroisEnfants contenu DateDeNaissanceOuMoisDeGrossesse
déclaration structure Ménage: déclaration structure Ménage:
donnée prestations_reçues contenu collection PrestationReçue donnée prestations_reçues contenu liste de PrestationReçue
donnée logement contenu Logement donnée logement contenu Logement
donnée personnes_à_charge contenu collection PersonneÀCharge donnée personnes_à_charge contenu liste de PersonneÀCharge
donnée nombre_autres_occupants_logement contenu entier donnée nombre_autres_occupants_logement contenu entier
donnée situation_familiale contenu SituationFamiliale donnée situation_familiale contenu SituationFamiliale
donnée condition_rattaché_foyer_fiscal_parent_ifi contenu booléen donnée condition_rattaché_foyer_fiscal_parent_ifi contenu booléen
@ -311,7 +311,7 @@ déclaration champ d'application ÉligibilitéAidesPersonnelleLogement:
interne prise_en_compte_personne_à_charge condition interne prise_en_compte_personne_à_charge condition
dépend de personne_à_charge contenu PersonneÀCharge dépend de personne_à_charge contenu PersonneÀCharge
interne personnes_à_charge_prises_en_compte interne personnes_à_charge_prises_en_compte
contenu collection PersonneÀCharge contenu liste de PersonneÀCharge
contexte date_entrée_vigueur_différée_cch contenu date contexte date_entrée_vigueur_différée_cch contenu date
interne nombre_personnes_logement contenu entier interne nombre_personnes_logement contenu entier
@ -330,7 +330,7 @@ déclaration champ d'application ÉligibilitéAidesPersonnelleLogement:
résultat éligibilité condition résultat éligibilité condition
résultat nombre_personnes_à_charge_prises_en_compte contenu entier résultat nombre_personnes_à_charge_prises_en_compte contenu entier
résultat coefficents_enfants_garde_alternée_pris_en_compte contenu résultat coefficents_enfants_garde_alternée_pris_en_compte contenu
collection décimal liste de décimal
résultat condition_2_r823_4 condition résultat condition_2_r823_4 condition
dépend de personne_à_charge contenu PersonneÀCharge dépend de personne_à_charge contenu PersonneÀCharge
@ -388,7 +388,7 @@ déclaration champ d'application ÉligibilitéAidePersonnaliséeLogement:
résultat éligibilité condition résultat éligibilité condition
résultat nombre_personnes_à_charge_prises_en_compte contenu entier résultat nombre_personnes_à_charge_prises_en_compte contenu entier
résultat coefficents_enfants_garde_alternée_pris_en_compte contenu résultat coefficents_enfants_garde_alternée_pris_en_compte contenu
collection décimal liste de décimal
champ d'application ÉligibilitéAidePersonnaliséeLogement: champ d'application ÉligibilitéAidePersonnaliséeLogement:
@ -437,7 +437,7 @@ déclaration champ d'application ÉligibilitéAllocationLogement:
état l841_2 état l841_2
résultat nombre_personnes_à_charge_prises_en_compte contenu entier résultat nombre_personnes_à_charge_prises_en_compte contenu entier
résultat coefficents_enfants_garde_alternée_pris_en_compte contenu résultat coefficents_enfants_garde_alternée_pris_en_compte contenu
collection décimal liste de décimal
champ d'application ÉligibilitéAllocationLogement: champ d'application ÉligibilitéAllocationLogement:
# Ici nous instancions le champ d'application d'éligibilité aux prestations # Ici nous instancions le champ d'application d'éligibilité aux prestations
@ -608,9 +608,9 @@ déclaration champ d'application CalculÉquivalenceLoyerMinimale:
entrée condition_2_du_832_25 contenu booléen entrée condition_2_du_832_25 contenu booléen
entrée n_nombre_parts_d832_25 contenu décimal entrée n_nombre_parts_d832_25 contenu décimal
interne tranches_revenus_d832_26 contenu collection TrancheRevenu interne tranches_revenus_d832_26 contenu liste de TrancheRevenu
interne tranches_revenus_d832_26_multipliées contenu interne tranches_revenus_d832_26_multipliées contenu
collection TrancheRevenuDécimal liste de TrancheRevenuDécimal
interne montant_forfaitaire_d832_26 contenu argent interne montant_forfaitaire_d832_26 contenu argent
résultat montant contenu argent résultat montant contenu argent
@ -1137,7 +1137,7 @@ déclaration champ d'application CalculetteAidesAuLogement:
résultat traitement_aide_finale contenu argent résultat traitement_aide_finale contenu argent
dépend de aide_finale contenu argent dépend de aide_finale contenu argent
résultat coefficents_enfants_garde_alternée_pris_en_compte contenu résultat coefficents_enfants_garde_alternée_pris_en_compte contenu
collection décimal liste de décimal
champ d'application CalculetteAidesAuLogement: champ d'application CalculetteAidesAuLogement:
définition éligibilité_aide_personnalisée_logement.ménage égal à définition éligibilité_aide_personnalisée_logement.ménage égal à
@ -1205,7 +1205,7 @@ déclaration champ d'application CalculetteAidesAuLogementGardeAlternée:
interne ménage_sans_enfants_garde_alternée contenu Ménage interne ménage_sans_enfants_garde_alternée contenu Ménage
interne coefficents_enfants_garde_alternée_pris_en_compte contenu interne coefficents_enfants_garde_alternée_pris_en_compte contenu
collection décimal liste de décimal
calculette champ d'application CalculetteAidesAuLogement calculette champ d'application CalculetteAidesAuLogement
calculette_sans_garde_alternée champ d'application CalculetteAidesAuLogement calculette_sans_garde_alternée champ d'application CalculetteAidesAuLogement

View File

@ -12,7 +12,7 @@ champ d'application EnfantLePlusÂgé:
définition le_plus_âgé égal à définition le_plus_âgé égal à
potentiel_plus_âgé parmi enfants tel que potentiel_plus_âgé parmi enfants tel que
potentiel_plus_âgé.date_de_naissance est minimum potentiel_plus_âgé.date_de_naissance est minimum
ou si collection vide alors Enfant { ou si liste vide alors Enfant {
-- identifiant: -1 -- identifiant: -1
-- obligation_scolaire: Pendant -- obligation_scolaire: Pendant
-- rémuneration_mensuelle: 0€ -- rémuneration_mensuelle: 0€
@ -72,8 +72,8 @@ déclaration structure EnfantEntrée:
déclaration champ d'application InterfaceAllocationsFamiliales: déclaration champ d'application InterfaceAllocationsFamiliales:
entrée i_date_courante contenu date entrée i_date_courante contenu date
entrée i_enfants contenu collection EnfantEntrée entrée i_enfants contenu liste de EnfantEntrée
interne enfants_à_charge contenu collection Enfant interne enfants_à_charge contenu liste de Enfant
allocations_familiales champ d'application AllocationsFamiliales allocations_familiales champ d'application AllocationsFamiliales
entrée i_ressources_ménage contenu argent entrée i_ressources_ménage contenu argent
entrée i_résidence contenu Collectivité entrée i_résidence contenu Collectivité
@ -137,4 +137,4 @@ champ d'application InterfaceAllocationsFamiliales:
NOTA : NOTA :
Conformément à l'article 63 de la loi n° 2019-791 du 26 juillet 2019, ces Conformément à l'article 63 de la loi n° 2019-791 du 26 juillet 2019, ces
dispositions entrent en vigueur à la rentrée scolaire 2019. dispositions entrent en vigueur à la rentrée scolaire 2019.

View File

@ -65,7 +65,7 @@ déclaration champ d'application AllocationFamilialesAvril2008:
résultat âge_minimum_alinéa_1_l521_3 contenu durée résultat âge_minimum_alinéa_1_l521_3 contenu durée
déclaration champ d'application EnfantLePlusÂgé: déclaration champ d'application EnfantLePlusÂgé:
entrée enfants contenu collection Enfant entrée enfants contenu liste de Enfant
résultat le_plus_âgé contenu Enfant résultat le_plus_âgé contenu Enfant
déclaration champ d'application AllocationsFamiliales: déclaration champ d'application AllocationsFamiliales:
@ -80,9 +80,9 @@ déclaration champ d'application AllocationsFamiliales:
entrée date_courante contenu date entrée date_courante contenu date
# Variables concernant les enfants du ménage # Variables concernant les enfants du ménage
entrée enfants_à_charge contenu collection Enfant entrée enfants_à_charge contenu liste de Enfant
interne enfants_à_charge_droit_ouvert_prestation_familiale interne enfants_à_charge_droit_ouvert_prestation_familiale
contenu collection Enfant contenu liste de Enfant
interne prise_en_compte contenu PriseEnCompte dépend de enfant contenu Enfant interne prise_en_compte contenu PriseEnCompte dépend de enfant contenu Enfant
résultat versement contenu VersementAllocations résultat versement contenu VersementAllocations
dépend de enfant contenu Enfant dépend de enfant contenu Enfant

View File

@ -31,14 +31,14 @@ déclaration structure BienUsufruitRenteViagère:
déclaration champ d'application RéserveHéréditaire: déclaration champ d'application RéserveHéréditaire:
résultat quotité_réserve_héréditaire contenu décimal résultat quotité_réserve_héréditaire contenu décimal
entrée enfants contenu collection Enfant entrée enfants contenu liste de Enfant
interne enfant_pris_en_compte_réserve_héréditaire contenu booléen interne enfant_pris_en_compte_réserve_héréditaire contenu booléen
dépend de enfant contenu Enfant dépend de enfant contenu Enfant
interne enfants_réserve_héréditaire contenu collection Enfant interne enfants_réserve_héréditaire contenu liste de Enfant
entrée conjoint_survivant_non_divorcé condition entrée conjoint_survivant_non_divorcé condition
entrée patrimoine_total contenu argent entrée patrimoine_total contenu argent
entrée biens_usufruit_rente_viagère contenu collection BienUsufruitRenteViagère entrée biens_usufruit_rente_viagère contenu liste de BienUsufruitRenteViagère
résultat patrimoine_assiette_réserve_héréditaire contenu argent résultat patrimoine_assiette_réserve_héréditaire contenu argent
résultat montant_réserve_héréditaire contenu argent résultat montant_réserve_héréditaire contenu argent
``` ```

View File

@ -819,20 +819,20 @@ scope DateValues:
(value1 - |1999-12-31|) + 45 day # 367 + 45 days (2000 is bissextile) (value1 - |1999-12-31|) + 45 day # 367 + 45 days (2000 is bissextile)
``` ```
### Collections ### Listes
Often, Catala programs need to speak about a collection of data because the law Often, Catala programs need to speak about a collection of data because the law
talks about the number of children, the maximum of a list, etc. Catala features talks about the number of children, the maximum of a list, etc. Catala features
first-class support for collections, which are basically fixed-size lists. first-class support for lists.
You can create a list, filter its elements but also aggregate over its contents You can create a list, filter its elements but also aggregate over its contents
to compute all sorts of values. to compute all sorts of values.
```catala ```catala
declaration scope CollectionValues: declaration scope ListValues:
internal value1 content collection integer internal value1 content list of integer
internal value2 content integer internal value2 content integer
scope CollectionValues: scope ListValues:
definition value1 equals [45;-6;3;4;0;2155] definition value1 equals [45;-6;3;4;0;2155]
definition value2 equals sum integer of (i * i) for i among value1 definition value2 equals sum integer of (i * i) for i among value1
# sum of squares # sum of squares

View File

@ -863,18 +863,17 @@ champ d'application ValeursDate:
### Collections ### Collections
Souvent, les programmes Catala ont besoin de parler de collection de données Souvent, les programmes Catala ont besoin de parler de collection de données
parce que la loi parle du nombre denfants, du maximum dune liste, etc. parce que la loi parle du nombre denfants, du maximum dune liste, etc. Catala
Catala propose un support de première classe pour les collections, qui ne sont propose un support de première classe pour les listes. Vous pouvez créer une
finalement que des listes de taille fixe. Vous pouvez créer une liste, filtrer liste, filtrer ses éléments, mais aussi agréger son contenu pour calculer toutes
ses éléments, mais aussi agréger son contenu pour calculer toutes sortes de sortes de valeurs.
valeurs.
```catala ```catala
déclaration champ d'application ValeursDeCollection: déclaration champ d'application ValeursDeListe:
interne valeur1 contenu collection entier interne valeur1 contenu liste de entier
interne valeur2 contenu entier interne valeur2 contenu entier
champ d'application ValeursDeCollection: champ d'application ValeursDeListe:
définition valeur1 égal à [45;-6;3;4;0;2155] définition valeur1 égal à [45;-6;3;4;0;2155]
définition valeur2 égal à somme entier de (i * i) pour i parmi valeur1 définition valeur2 égal à somme entier de (i * i) pour i parmi valeur1
# somme de carré # somme de carré

View File

@ -6,9 +6,9 @@ declaration structure Period:
data end content date data end content date
declaration scope PeriodMerge: declaration scope PeriodMerge:
context periods1 content collection Period context periods1 content list of Period
context periods2 content collection Period context periods2 content list of Period
output output_periods content collection Period output output_periods content list of Period
scope PeriodMerge: scope PeriodMerge:
# Placeholders, overwritten by caller # Placeholders, overwritten by caller
@ -34,13 +34,13 @@ declaration scope Section121SinglePerson:
output requirements_ownership_met condition output requirements_ownership_met condition
output requirements_usage_met condition output requirements_usage_met condition
input date_of_sale_or_exchange content date input date_of_sale_or_exchange content date
input property_ownage content collection Period input property_ownage content list of Period
# Invariant: the periods in the collection are disjoint # Invariant: the periods in the collection are disjoint
input property_usage_as_principal_residence input property_usage_as_principal_residence
content collection Period content list of Period
# Invariant: the periods in the collection are disjoint # Invariant: the periods in the collection are disjoint
internal aggregate_periods_from_last_five_years content duration internal aggregate_periods_from_last_five_years content duration
depends on periods content collection Period depends on periods content list of Period
context output gain_cap content money context output gain_cap content money
input gain_from_sale_or_exchange_of_property content money input gain_from_sale_or_exchange_of_property content money
output income_excluded_from_gross_income_uncapped content money output income_excluded_from_gross_income_uncapped content money
@ -49,9 +49,9 @@ declaration scope Section121SinglePerson:
input other_section_121a_sale content OtherSection121aSale input other_section_121a_sale content OtherSection121aSale
declaration structure PersonalData: declaration structure PersonalData:
data property_ownage content collection Period data property_ownage content list of Period
data property_usage_as_principal_residence data property_usage_as_principal_residence
content collection Period content list of Period
data other_section_121a_sale content OtherSection121aSale data other_section_121a_sale content OtherSection121aSale
declaration structure JointReturn: declaration structure JointReturn:

View File

@ -22,7 +22,7 @@
(define-generic-mode 'catala-mode-fr (define-generic-mode 'catala-mode-fr
'("#") '("#")
'("contexte" "entrée" "résultat" "interne" '("contexte" "entrée" "résultat" "interne"
"champ d'application" "si et seulement si" "dépend de" "déclaration" "inclus" "collection" "contenu" "optionnel" "structure" "énumération" "contexte" "entrée" "résultat" "interne" "règle" "sous condition" "condition" "donnée" "conséquence" "rempli" "égal à" "assertion" "définition" "état" "étiquette" "exception" "soit") "champ d'application" "si et seulement si" "dépend de" "déclaration" "inclus" "liste de" "contenu" "optionnel" "structure" "énumération" "contexte" "entrée" "résultat" "interne" "règle" "sous condition" "condition" "donnée" "conséquence" "rempli" "égal à" "assertion" "définition" "état" "étiquette" "exception" "soit" "liste vide")
'(("\\<\\(selon\\|sous\s+forme\\|fixé\\|par\\|décroissante\\|croissante\\|varie\\|avec\\|on\s+a\\|soit\\|dans\\|tel\s+que\\|existe\\|pour\\|tout\\|de\\|si\\|alors\\|sinon\\|initial\\)\\>" . font-lock-builtin-face) '(("\\<\\(selon\\|sous\s+forme\\|fixé\\|par\\|décroissante\\|croissante\\|varie\\|avec\\|on\s+a\\|soit\\|dans\\|tel\s+que\\|existe\\|pour\\|tout\\|de\\|si\\|alors\\|sinon\\|initial\\)\\>" . font-lock-builtin-face)
("\\<\\(vrai\\|faux\\)\\>" . font-lock-constant-face) ("\\<\\(vrai\\|faux\\)\\>" . font-lock-constant-face)
("\\<\\([0-9][0-9 ]*\\(,[0-9]*\\|\\)\\)\\>" . font-lock-constant-face) ("\\<\\([0-9][0-9 ]*\\(,[0-9]*\\|\\)\\)\\>" . font-lock-constant-face)
@ -41,7 +41,7 @@
(define-generic-mode 'catala-mode-en (define-generic-mode 'catala-mode-en
'("#") '("#")
'("context" "input" "output" "internal" '("context" "input" "output" "internal"
"scope" "depends on" "declaration" "includes" "collection" "content" "optional" "structure" "enumeration" "context" "input" "output" "internal" "rule" "under condition" "condition" "data" "consequence" "fulfilled" "equals" "assertion" "definition" "state" "label" "exception" "let") "scope" "depends on" "declaration" "includes" "list of" "content" "optional" "structure" "enumeration" "context" "input" "output" "internal" "rule" "under condition" "condition" "data" "consequence" "fulfilled" "equals" "assertion" "definition" "state" "label" "exception" "let" "list empty")
'(("\\<\\(match\\|with\s+pattern\\|fixed\\|by\\|decreasing\\|increasing\\|varies\\|with\\|we\s+have\\|let\\|in\\|such\s+that\\|exists\\|for\\|all\\|of\\|if\\|then\\|else\\|initial\\)\\>" . font-lock-builtin-face) '(("\\<\\(match\\|with\s+pattern\\|fixed\\|by\\|decreasing\\|increasing\\|varies\\|with\\|we\s+have\\|let\\|in\\|such\s+that\\|exists\\|for\\|all\\|of\\|if\\|then\\|else\\|initial\\)\\>" . font-lock-builtin-face)
("|[0-9]\\+-[0-9]\\+-[0-9]\\+|" . font-lock-constant-face) ("|[0-9]\\+-[0-9]\\+-[0-9]\\+|" . font-lock-constant-face)
("\\<\\(true\\|false\\)\\>" . font-lock-constant-face) ("\\<\\(true\\|false\\)\\>" . font-lock-constant-face)

View File

@ -75,7 +75,7 @@ ace.define(
{ {
token: "keyword.other", token: "keyword.other",
regex: regex:
"\\b(scope|depends\\s+on|declaration|includes|collection|content|optional|structure|enumeration|context|input|output|internal|rule|under\\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception|anything)\\b", "\\b(scope|depends\\s+on|declaration|includes|list\\s+of|content|optional|structure|enumeration|context|input|output|internal|rule|under\\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception|anything|list\\s+empty)\\b",
}, },
{ {
token: "constant.numeric", token: "constant.numeric",

View File

@ -125,7 +125,7 @@
'name' : 'keyword.control.catala_en' 'name' : 'keyword.control.catala_en'
} }
{ {
'match' : '\\b(scope|depends\\s+on|declaration|includes|collection|content|optional|structure|enumeration|context|input|output|internal|rule|under\\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception|anything)\\b' 'match' : '\\b(scope|depends\\s+on|declaration|includes|list\\s+of|content|optional|structure|enumeration|context|input|output|internal|rule|under\\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception|anything|list\\+empty)\\b'
'name' : 'keyword.other.catala_en' 'name' : 'keyword.other.catala_en'
} }
{ {

View File

@ -221,7 +221,7 @@ code : context {
} }
: pattern { : pattern {
regex \= \b(contains|number|sum|such\s+that|exists|for|all|of|if|then|else|is|empty|among|maximum|minimum|round)\b regex \= \b(contains|number|sum|such\s+that|exists|for|all|of|if|then|else|is|empty|among|maximum|minimum|round|list\s+empty)\b
styles [] = .keyword_rule ; styles [] = .keyword_rule ;
} }
@ -253,7 +253,7 @@ code : context {
} }
: pattern { : pattern {
regex \= \b(structure|enumeration|collection|integer|boolean|date|duration|money|text|decimal)\b regex \= \b(structure|enumeration|list\s+of|integer|boolean|date|duration|money|text|decimal)\b
styles [] = .primitive; styles [] = .primitive;
} }

View File

@ -27,13 +27,13 @@ class CustomLexer(RegexLexer):
(u'(\\s*\\#.*$)', bygroups(Comment.Single)), (u'(\\s*\\#.*$)', bygroups(Comment.Single)),
(u'(context|input|output|internal)(\\s*)(|output)(\\s+)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)', bygroups(Keyword.Declaration, String, Keyword.Declaration, String, Name.Variable)), (u'(context|input|output|internal)(\\s*)(|output)(\\s+)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)', bygroups(Keyword.Declaration, String, Keyword.Declaration, String, Name.Variable)),
(u'\\b(match|with\\s+pattern|fixed|by|decreasing|increasing|varies|with|we\\s+have|let|in|scope|depends\\s+on|declaration|includes|content|rule|under\\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception)\\b', bygroups(Keyword.Reserved)), (u'\\b(match|with\\s+pattern|fixed|by|decreasing|increasing|varies|with|we\\s+have|let|in|scope|depends\\s+on|declaration|includes|content|rule|under\\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception)\\b', bygroups(Keyword.Reserved)),
(u'\\b(contains|number|sum|such\\s+that|exists|for|all|of|if|then|else|is|empty|among|maximum|minimum|round)\\b', bygroups(Keyword.Declaration)), (u'\\b(contains|number|sum|such\\s+that|exists|for|all|of|if|then|else|is|list\\s+empty|among|maximum|minimum|round)\\b', bygroups(Keyword.Declaration)),
(u'(\\|[0-9]+\\-[0-9]+\\-[0-9]+\\|)', bygroups(Number.Integer)), (u'(\\|[0-9]+\\-[0-9]+\\-[0-9]+\\|)', bygroups(Number.Integer)),
(u'\\b(true|false)\\b', bygroups(Keyword.Constant)), (u'\\b(true|false)\\b', bygroups(Keyword.Constant)),
(u'\\b([0-9]+(,[0-9]*|))\\b', bygroups(Number.Integer)), (u'\\b([0-9]+(,[0-9]*|))\\b', bygroups(Number.Integer)),
(u'(\\-\\-|\\;|\\.|\\,|\\:|\\(|\\)|\\[|\\]|\\{|\\})', bygroups(Operator)), (u'(\\-\\-|\\;|\\.|\\,|\\:|\\(|\\)|\\[|\\]|\\{|\\})', bygroups(Operator)),
(u'(\\-\\>|\\+\\.|\\+\\@|\\+\\^|\\+\\$|\\+|\\-\\.|\\-\\@|\\-\\^|\\-\\$|\\-|\\*\\.|\\*\\@|\\*\\^|\\*\\$|\\*|/\\.|/\\@|/\\$|/|\\!|>\\.|>=\\.|<=\\.|<\\.|>\\@|>=\\@|<=\\@|<\\@|>\\$|>=\\$|<=\\$|<\\$|>\\^|>=\\^|<=\\^|<\\^|>|>=|<=|<|=|not|or|xor|and|\\$|\u20ac|%|year|month|day)', bygroups(Operator)), (u'(\\-\\>|\\+\\.|\\+\\@|\\+\\^|\\+\\$|\\+|\\-\\.|\\-\\@|\\-\\^|\\-\\$|\\-|\\*\\.|\\*\\@|\\*\\^|\\*\\$|\\*|/\\.|/\\@|/\\$|/|\\!|>\\.|>=\\.|<=\\.|<\\.|>\\@|>=\\@|<=\\@|<\\@|>\\$|>=\\$|<=\\$|<\\$|>\\^|>=\\^|<=\\^|<\\^|>|>=|<=|<|=|not|or|xor|and|\\$|\u20ac|%|year|month|day)', bygroups(Operator)),
(u'\\b(structure|enumeration|collection|integer|boolean|date|duration|money|text|decimal)\\b', bygroups(Keyword.Type)), (u'\\b(structure|enumeration|list\\s+of|integer|boolean|date|duration|money|text|decimal)\\b', bygroups(Keyword.Type)),
(u'\\b([A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Class, Operator, Name.Variable)), (u'\\b([A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Class, Operator, Name.Variable)),
(u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\'\\.]*)\\b', bygroups(Name.Variable, Operator, String)), (u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\'\\.]*)\\b', bygroups(Name.Variable, Operator, String)),
(u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Variable)), (u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Variable)),

View File

@ -22,7 +22,7 @@ syn match Include "^\s*>\s*Include:.*$"
syn match sc_id_def contained "\<\([a-zéèàâùîôêœç][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>" syn match sc_id_def contained "\<\([a-zéèàâùîôêœç][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>"
syn match cc_id contained "\<\([A-ZÉÈÀÂÙÎÔÊŒÇ][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>" syn match cc_id contained "\<\([A-ZÉÈÀÂÙÎÔÊŒÇ][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>"
syn match Keyword contained "\<\(scope\|depends\s\+on\|declaration\|includes\|collection\|content\|optional\|structure\|enumeration\|context\|rule\|under\s\+condition\|condition\|data\|consequence\|fulfilled\|equals\|assertion\|definition\|state\|label\|exception\|anything\)\>" syn match Keyword contained "\<\(scope\|depends\s\+on\|declaration\|includes\|list\s\+of\|content\|optional\|structure\|enumeration\|context\|rule\|under\s\+condition\|condition\|data\|consequence\|fulfilled\|equals\|assertion\|definition\|state\|label\|exception\|anything\)\>"
syn match Statement contained "\<\(match\|with\s\+pattern\|fixed\|by\|decreasing\|increasing\|varies\|with\|we\s\+have\|let\|in\|such\s\+that\|exists\|for\|all\|of\|if\|then\|else\|initial\)\>" syn match Statement contained "\<\(match\|with\s\+pattern\|fixed\|by\|decreasing\|increasing\|varies\|with\|we\s\+have\|let\|in\|such\s\+that\|exists\|for\|all\|of\|if\|then\|else\|initial\)\>"
syn keyword Conditional contained if then else syn keyword Conditional contained if then else
syn match Comment contained "#.*$" syn match Comment contained "#.*$"

View File

@ -200,7 +200,7 @@
</dict> </dict>
<dict> <dict>
<key>match</key> <key>match</key>
<string>\b(scope|depends\s+on|declaration|includes|collection|content|optional|structure|enumeration|context|input|output|internal|rule|under\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception|anything)\b</string> <string>\b(scope|depends\s+on|declaration|includes|list\s+of|content|optional|structure|enumeration|context|input|output|internal|rule|under\s+condition|condition|data|consequence|fulfilled|equals|assertion|definition|state|label|exception|anything)\b</string>
<key>name</key> <key>name</key>
<string>keyword.other.catala_en</string> <string>keyword.other.catala_en</string>
</dict> </dict>

View File

@ -75,7 +75,7 @@ ace.define(
{ {
token: "keyword.other", token: "keyword.other",
regex: regex:
"\\b(champ\\s+d'application|si\\s+et\\s+seulement\\s+si|d\u00e9pend\\s+de|d\u00e9claration|inclus|collection|contenu|optionnel|structure|\u00e9num\u00e9ration|contexte|entr\u00e9e|r\u00e9sultat|interne|r\u00e8gle|sous\\s+condition|condition|donn\u00e9e|cons\u00e9quence|rempli|\u00e9gal\\s+\u00e0|assertion|d\u00e9finition|\u00e9tat|\u00e9tiquette|exception|n'importe\\s+quel)\\b", "\\b(champ\\s+d'application|si\\s+et\\s+seulement\\s+si|d\u00e9pend\\s+de|d\u00e9claration|inclus|liste\\s+de|contenu|optionnel|structure|\u00e9num\u00e9ration|contexte|entr\u00e9e|r\u00e9sultat|interne|r\u00e8gle|sous\\s+condition|condition|donn\u00e9e|cons\u00e9quence|rempli|\u00e9gal\\s+\u00e0|assertion|d\u00e9finition|\u00e9tat|\u00e9tiquette|exception|n'importe\\s+quel)\\b",
}, },
{ {
token: "constant.numeric", token: "constant.numeric",

View File

@ -125,7 +125,7 @@
'name' : 'keyword.control.catala_fr' 'name' : 'keyword.control.catala_fr'
} }
{ {
'match' : '\\b(champ\\s+d\'application|si\\s+et\\s+seulement\\s+si|dépend\\s+de|déclaration|inclus|collection|contenu|optionnel|structure|énumération|contexte|entrée|r\\x{00e9}sultat|interne|règle|sous\\s+condition|condition|donnée|conséquence|rempli|égal\\s+à|assertion|définition|état|étiquette|exception|n\'importe\\s+quel)\\b' 'match' : '\\b(champ\\s+d\'application|si\\s+et\\s+seulement\\s+si|dépend\\s+de|déclaration|inclus|liste\\s+de|contenu|optionnel|structure|énumération|contexte|entrée|r\\x{00e9}sultat|interne|règle|sous\\s+condition|condition|donnée|conséquence|rempli|égal\\s+à|assertion|définition|état|étiquette|exception|n\'importe\\s+quel)\\b'
'name' : 'keyword.other.catala_fr' 'name' : 'keyword.other.catala_fr'
} }
{ {

View File

@ -221,7 +221,7 @@ code : context {
} }
: pattern { : pattern {
regex \= \b(contient|nombre|somme|tel\s+que|existe|pour|tout|de|si|alors|sinon|est|vide|parmi|maximum|minimum|arrondi)\b regex \= \b(contient|nombre|somme|tel\s+que|existe|pour|tout|de|si|alors|sinon|est|liste\s+vide|parmi|maximum|minimum|arrondi)\b
styles [] = .keyword_rule ; styles [] = .keyword_rule ;
} }
@ -253,7 +253,7 @@ code : context {
} }
: pattern { : pattern {
regex \= \b(structure|énumération|collection|entier|booléen|date|durée|argent|texte|décimal|décret|loi|nombre|somme)\b regex \= \b(structure|énumération|liste\s+de|entier|booléen|date|durée|argent|texte|décimal|décret|loi|nombre|somme)\b
styles [] = .primitive; styles [] = .primitive;
} }

View File

@ -27,14 +27,14 @@ class CustomLexer(RegexLexer):
(u'(\\s*\\#.*$)', bygroups(Comment.Single)), (u'(\\s*\\#.*$)', bygroups(Comment.Single)),
(u'(contexte|entr\xe9e|r\xe9sultat|interne)(\\s*)(|r\xe9sultat)(\\s+)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)', bygroups(Keyword.Declaration, String, Keyword.Declaration, String, Name.Variable)), (u'(contexte|entr\xe9e|r\xe9sultat|interne)(\\s*)(|r\xe9sultat)(\\s+)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)', bygroups(Keyword.Declaration, String, Keyword.Declaration, String, Name.Variable)),
(u'\\b(selon|sous\\s+forme|fix\xe9|par|d\xe9croissante|croissante|varie|avec|on\\s+a|soit|dans|champ\\s+d\'application|d\xe9pend\\s+de|d\xe9claration|inclusion|contenu|r\xe8gle|sous\\s+condition|condition|donn\xe9e|cons\xe9quence|rempli|\xe9gal\\s+\xe0|assertion|d\xe9finition|\xe9tat|\xe9tiquette|exception)\\b', bygroups(Keyword.Reserved)), (u'\\b(selon|sous\\s+forme|fix\xe9|par|d\xe9croissante|croissante|varie|avec|on\\s+a|soit|dans|champ\\s+d\'application|d\xe9pend\\s+de|d\xe9claration|inclusion|contenu|r\xe8gle|sous\\s+condition|condition|donn\xe9e|cons\xe9quence|rempli|\xe9gal\\s+\xe0|assertion|d\xe9finition|\xe9tat|\xe9tiquette|exception)\\b', bygroups(Keyword.Reserved)),
(u'\\b(contient|nombre|somme|tel\\s+que|existe|pour|tout|de|si|alors|sinon|est|vide|parmi|maximum|minimum|arrondi)\\b', bygroups(Keyword.Declaration)), (u'\\b(contient|nombre|somme|tel\\s+que|existe|pour|tout|de|si|alors|sinon|est|liste\\s+vide|parmi|maximum|minimum|arrondi)\\b', bygroups(Keyword.Declaration)),
(u'(\\|[0-9]+\\-[0-9]+\\-[0-9]+\\|)', bygroups(Number.Integer)), (u'(\\|[0-9]+\\-[0-9]+\\-[0-9]+\\|)', bygroups(Number.Integer)),
(u'\\b(vrai|faux)\\b', bygroups(Keyword.Constant)), (u'\\b(vrai|faux)\\b', bygroups(Keyword.Constant)),
(u'\\b([0-9]+(,[0-9]*|))\\b', bygroups(Number.Integer)), (u'\\b([0-9]+(,[0-9]*|))\\b', bygroups(Number.Integer)),
(u'(\\-\\-|\\;|\\.|\\,|\\:|\\(|\\)|\\[|\\]|\\{|\\})', bygroups(Operator)), (u'(\\-\\-|\\;|\\.|\\,|\\:|\\(|\\)|\\[|\\]|\\{|\\})', bygroups(Operator)),
(u'(\\-\\>|\\+\\.|\\+\\@|\\+\\^|\\+\u20ac|\\+|\\-\\.|\\-\\@|\\-\\^|\\-\u20ac|\\-|\\*\\.|\\*\\@|\\*\\^|\\*\u20ac|\\*|/\\.|/\\@|/\u20ac|/|\\!|>\\.|>=\\.|<=\\.|<\\.|>\\@|>=\\@|<=\\@|<\\@|>\u20ac|>=\u20ac|<=\u20ac|<\u20ac|>\\^|>=\\^|<=\\^|<\\^|>|>=|<=|<|=|\u20ac|%)', bygroups(Operator)), (u'(\\-\\>|\\+\\.|\\+\\@|\\+\\^|\\+\u20ac|\\+|\\-\\.|\\-\\@|\\-\\^|\\-\u20ac|\\-|\\*\\.|\\*\\@|\\*\\^|\\*\u20ac|\\*|/\\.|/\\@|/\u20ac|/|\\!|>\\.|>=\\.|<=\\.|<\\.|>\\@|>=\\@|<=\\@|<\\@|>\u20ac|>=\u20ac|<=\u20ac|<\u20ac|>\\^|>=\\^|<=\\^|<\\^|>|>=|<=|<|=|\u20ac|%)', bygroups(Operator)),
(u'\\b(non|ou\\s+bien|ou|et|an|mois|jour)\\b', bygroups(Operator)), (u'\\b(non|ou\\s+bien|ou|et|an|mois|jour)\\b', bygroups(Operator)),
(u'\\b(structure|\xe9num\xe9ration|collection|entier|bool\xe9en|date|dur\xe9e|argent|texte|d\xe9cimal|d\xe9cret|loi|nombre|somme)\\b', bygroups(Keyword.Type)), (u'\\b(structure|\xe9num\xe9ration|liste\\s+de|entier|bool\xe9en|date|dur\xe9e|argent|texte|d\xe9cimal|d\xe9cret|loi|nombre|somme)\\b', bygroups(Keyword.Type)),
(u'\\b([A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Class, Operator, Name.Variable)), (u'\\b([A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Class, Operator, Name.Variable)),
(u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\'\\.]*)\\b', bygroups(Name.Variable, Operator, String)), (u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)(\\.)([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\'\\.]*)\\b', bygroups(Name.Variable, Operator, String)),
(u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Variable)), (u'\\b([a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7][a-z\xe9\xe8\xe0\xe2\xf9\xee\xf4\xea\u0153\xe7A-Z\xc9\xc8\xc0\xc2\xd9\xce\xd4\xca\u0152\xc70-9_\\\']*)\\b', bygroups(Name.Variable)),

View File

@ -23,7 +23,7 @@ syn match Include "^\s*>\s*Inclusion:.*$"
syn match sc_id_def contained "\<\([a-zéèàâùîôêœç][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>" syn match sc_id_def contained "\<\([a-zéèàâùîôêœç][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>"
syn match cc_id contained "\<\([A-ZÉÈÀÂÙÎÔÊŒÇ][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>" syn match cc_id contained "\<\([A-ZÉÈÀÂÙÎÔÊŒÇ][a-zéèàâùîôêœçA-ZÉÈÀÂÙÎÔÊŒÇ0-9_\']*\)\>"
syn match Keyword contained "\<\(contexte\|entrée\|résultat\|interne\|champ\s\+d'application\|collection\|structure\|donnée\|énumération\|définition\|déclaration\|si\s\+et\s\+seulement\s\+si\|dépend\s\+de\|inclus\|contenu\|optionnel\|règle\|sous\s\+condition\|condition\|conséquence\|rempli\|égal\s\+à\|assertion\|état\|étiquette\|exception\|n'importe\s\+quel\)\>" syn match Keyword contained "\<\(contexte\|entrée\|résultat\|interne\|champ\s\+d'application\|liste\s\+de\|structure\|donnée\|énumération\|définition\|déclaration\|si\s\+et\s\+seulement\s\+si\|dépend\s\+de\|inclus\|contenu\|optionnel\|règle\|sous\s\+condition\|condition\|conséquence\|rempli\|égal\s\+à\|assertion\|état\|étiquette\|exception\|n'importe\s\+quel\)\>"
syn match Statement contained "\<\(selon\|sous\s\+forme\|fixé\|par\|décroissante\|croissante\|varie\|avec\|on\s\+a\|soit\|dans\|tel\s\+que\|existe\|pour\|tout\|de\|initial\)\>" syn match Statement contained "\<\(selon\|sous\s\+forme\|fixé\|par\|décroissante\|croissante\|varie\|avec\|on\s\+a\|soit\|dans\|tel\s\+que\|existe\|pour\|tout\|de\|initial\)\>"
syn keyword Conditional contained si alors sinon syn keyword Conditional contained si alors sinon
syn match Comment contained "#.*$" syn match Comment contained "#.*$"

View File

@ -200,7 +200,7 @@
</dict> </dict>
<dict> <dict>
<key>match</key> <key>match</key>
<string>\b(champ\s+d&apos;application|si\s+et\s+seulement\s+si|dépend\s+de|déclaration|inclus|collection|contenu|optionnel|structure|énumération|contexte|entrée|résultat|interne|règle|sous\s+condition|condition|donnée|conséquence|rempli|égal\s+à|assertion|définition|état|étiquette|exception|n'importe\s+quel)\b</string> <string>\b(champ\s+d&apos;application|si\s+et\s+seulement\s+si|dépend\s+de|déclaration|inclus|liste\s+de|contenu|optionnel|structure|énumération|contexte|entrée|résultat|interne|règle|sous\s+condition|condition|donnée|conséquence|rempli|égal\s+à|assertion|définition|état|étiquette|exception|n'importe\s+quel)\b</string>
<key>name</key> <key>name</key>
<string>keyword.other.catala_fr</string> <string>keyword.other.catala_fr</string>
</dict> </dict>

View File

@ -67,7 +67,7 @@
<keyword>上下文</keyword> <keyword>上下文</keyword>
<!--COLLECTION--> <!--COLLECTION-->
<keyword>collection</keyword> <keyword>list\s+of</keyword>
<!--CONTAINS--> <!--CONTAINS-->
<keyword>contains</keyword> <keyword>contains</keyword>

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
context list content collection integer context list content list of integer
context list_high_count content integer context list_high_count content integer
scope A: scope A:
@ -23,10 +23,10 @@ money
└─ Article └─ Article
Type integer coming from expression: Type integer coming from expression:
┌─⯈ tests/test_array/bad/fold_error.catala_en:5.35-5.42: ┌─⯈ tests/test_array/bad/fold_error.catala_en:5.32-5.39:
└─┐ └─┐
5 │ context list content collection integer 5 │ context list content list of integer
‾‾‾‾‾‾‾ │ ‾‾‾‾‾‾‾
└─ Article └─ Article
Type money coming from expression: Type money coming from expression:

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
output x content collection money output x content list of money
scope A: scope A:
definition x equals [$0; $4 + $5; $8 * 0.65] definition x equals [$0; $4 + $5; $8 * 0.65]
@ -16,9 +16,9 @@ declaration scope B:
scope B: scope B:
definition max equals maximum of (m * 2.0) for m among a.x definition max equals maximum of (m * 2.0) for m among a.x
or if collection empty then $0 or if list empty then $0
definition min equals minimum of (m + $5) for m among a.x definition min equals minimum of (m + $5) for m among a.x
or if collection empty then $20 or if list empty then $20
definition y equals sum money of (m + $1) for m among a.x definition y equals sum money of (m + $1) for m among a.x
definition z equals number of m among a.x such that m >= $8.95 definition z equals number of m among a.x such that m >= $8.95
``` ```

View File

@ -6,7 +6,7 @@ declaration structure S:
data income content money data income content money
declaration scope A: declaration scope A:
context output x content collection S context output x content list of S
scope A: scope A:
definition x equals [ definition x equals [
@ -23,10 +23,10 @@ declaration scope B:
scope B: scope B:
definition argmax equals definition argmax equals
(m among a.x such that m.income * 2.0 is maximum (m among a.x such that m.income * 2.0 is maximum
or if collection empty then S { -- id: -1 --income: $0 }) or if list empty then S { -- id: -1 --income: $0 })
definition argmin equals definition argmin equals
(m among a.x such that m.income + $5 is minimum (m among a.x such that m.income + $5 is minimum
or if collection empty then S { -- id: -1 --income: $20 }) or if list empty then S { -- id: -1 --income: $20 })
``` ```

View File

@ -21,13 +21,13 @@ scope S:
assertion (number of i among [1; 2; 3] such that i >= 2) = 2 assertion (number of i among [1; 2; 3] such that i >= 2) = 2
# Extremum # Extremum
assertion maximum of [1; 2; 3] or if collection empty then 10 = 3 assertion maximum of [1; 2; 3] or if list empty then 10 = 3
assertion maximum of (decimal of i) for i among [1; 2; 3] or if collection empty then 10. = 3. assertion maximum of (decimal of i) for i among [1; 2; 3] or if list empty then 10. = 3.
# Arg extremum # Arg extremum
assertion (i among [1; 2; 3] assertion (i among [1; 2; 3]
such that decimal of ((2 - i) * (2 - i)) is minimum such that decimal of ((2 - i) * (2 - i)) is minimum
or if collection empty then 42) or if list empty then 42)
= 2 = 2
``` ```

View File

@ -1,9 +1,9 @@
## Unit testing for collection concatenation. ## Unit testing for list of concatenation.
```catala ```catala
declaration scope A: declaration scope A:
output x content collection integer output x content list of integer
output y content collection integer output y content list of integer
scope A: scope A:
definition x equals [0; 1; 2] ++ [3; 4; 5; 6] definition x equals [0; 1; 2] ++ [3; 4; 5; 6]

View File

@ -2,14 +2,14 @@
```catala ```catala
declaration scope A: declaration scope A:
output x content collection money output x content list of money
scope A: scope A:
definition x equals [$0; $4 + $5; $8 * 0.65] definition x equals [$0; $4 + $5; $8 * 0.65]
declaration scope B: declaration scope B:
a scope A a scope A
output y content collection money output y content list of money
scope B: scope B:
definition y equals m among a.x such that m >= $4.95 definition y equals m among a.x such that m >= $4.95

View File

@ -2,15 +2,15 @@
```catala ```catala
declaration scope A: declaration scope A:
output x content collection money output x content list of money
scope A: scope A:
definition x equals [$0; $4 + $5; $8 * 0.65] definition x equals [$0; $4 + $5; $8 * 0.65]
declaration scope B: declaration scope B:
a scope A a scope A
output y content collection money output y content list of money
output z content collection boolean output z content list of boolean
scope B: scope B:
definition y equals m among a.x such that m >= $4.95 definition y equals m among a.x such that m >= $4.95

View File

@ -6,7 +6,7 @@ declaration structure S:
data income content money data income content money
declaration scope A: declaration scope A:
context output x content collection S context output x content list of S
scope A: scope A:
definition x equals [ definition x equals [
@ -23,10 +23,10 @@ declaration scope B:
scope B: scope B:
definition argmax equals definition argmax equals
(m among a.x such that m.income * 2.0 is maximum (m among a.x such that m.income * 2.0 is maximum
or if collection empty then S { -- id: -1 --income: $0 }) or if list empty then S { -- id: -1 --income: $0 })
definition argmin equals definition argmin equals
(m among a.x such that m.income + $5 is minimum (m among a.x such that m.income + $5 is minimum
or if collection empty then S { -- id: -1 --income: $20 }) or if list empty then S { -- id: -1 --income: $20 })
``` ```

View File

@ -2,8 +2,8 @@
```catala ```catala
declaration scope B: declaration scope B:
output x content collection money output x content list of money
output z content collection boolean output z content list of boolean
scope B: scope B:
definition x equals [$4; $8 ] definition x equals [$4; $8 ]

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
output x content collection integer output x content list of integer
scope A: scope A:
definition x equals [0; 4+5; 8*8] definition x equals [0; 4+5; 8*8]

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
output x content collection integer output x content list of integer
output w content boolean output w content boolean
scope A: scope A:

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
output x content collection integer output x content list of integer
scope A: scope A:
definition x equals [0; 4; 8] definition x equals [0; 4; 8]

View File

@ -3,12 +3,12 @@
```catala ```catala
declaration scope S: declaration scope S:
input x content collection integer input x content list of integer
output y content integer output y content integer
scope S: scope S:
definition y equals definition y equals
potential_max among x such that potential_max is minimum or if collection empty then -1 potential_max among x such that potential_max is minimum or if list empty then -1
``` ```
@ -38,8 +38,8 @@ Invariant Dcalc__Invariants.invariant_default_no_arrow
```catala-test-inline ```catala-test-inline
$ catala Lcalc -s S --avoid-exceptions -O --closure-conversion $ catala Lcalc -s S --avoid-exceptions -O --closure-conversion
let scope S (S_in: S_in {x_in: collection integer}): S {y: integer} = let scope S (S_in: S_in {x_in: list of integer}): S {y: integer} =
let get x : collection integer = S_in.x_in in let get x : list of integer = S_in.x_in in
let set y : integer = let set y : integer =
match match
(handle_default_opt (handle_default_opt
@ -72,8 +72,8 @@ with optimizations on passes.
```catala-test-inline ```catala-test-inline
$ catala Lcalc -s S --closure-conversion $ catala Lcalc -s S --closure-conversion
let scope S (S_in: S_in {x_in: collection integer}): S {y: integer} = let scope S (S_in: S_in {x_in: list of integer}): S {y: integer} =
let get x : collection integer = S_in.x_in in let get x : list of integer = S_in.x_in in
let set y : integer = let set y : integer =
match match
(handle_default_opt (handle_default_opt

View File

@ -3,9 +3,9 @@
```catala ```catala
declaration scope S: declaration scope S:
internal weights content collection money internal weights content list of money
output result1 content collection money output result1 content list of money
output result2 content collection money output result2 content list of money
scope S: scope S:
definition weights equals [$4;$1;$1;$4;$1;$1] definition weights equals [$4;$1;$1;$4;$1;$1]

View File

@ -4,12 +4,12 @@ Define a prototype for an external function in an ml file
```catala-metadata ```catala-metadata
# Trivial algorithm that cumulates all rounding errors to the last element # Trivial algorithm that cumulates all rounding errors to the last element
declaration prorata content collection money declaration prorata content list of money
depends on amount content money, depends on amount content money,
weights content collection money weights content list of money
# Another algorithm that distributes errors along the way # Another algorithm that distributes errors along the way
declaration prorata2 content collection money declaration prorata2 content list of money
depends on amount content money, depends on amount content money,
weights content collection money weights content list of money
``` ```

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
internal x content collection integer internal x content list of integer
output y content boolean output y content boolean
scope A: scope A:

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
internal x content collection integer internal x content list of integer
output y content boolean output y content boolean
scope A: scope A:

View File

@ -2,7 +2,7 @@
```catala ```catala
declaration scope A: declaration scope A:
internal x content collection integer internal x content list of integer
output y content boolean output y content boolean
scope A: scope A:

View File

@ -11,6 +11,6 @@ declaration structure Structure:
declaration scope S: declaration scope S:
input x content integer input x content integer
input output y content Enum input output y content Enum
output z content collection Structure output z content list of Structure
output a content decimal output a content decimal
``` ```

View File

@ -15,7 +15,7 @@ $ catala Typecheck
[ERROR] [ERROR]
Error during typechecking, incompatible types: Error during typechecking, incompatible types:
┌─⯈ decimal ┌─⯈ decimal
└─⯈ collection └─⯈ list
This expression has type decimal: This expression has type decimal:
┌─⯈ tests/test_typing/bad/err2.catala_en:10.39-10.42: ┌─⯈ tests/test_typing/bad/err2.catala_en:10.39-10.42:
@ -23,7 +23,7 @@ This expression has type decimal:
10 │ definition a equals number of (z ++ 1.1) / 2 10 │ definition a equals number of (z ++ 1.1) / 2
│ ‾‾‾ │ ‾‾‾
Expected type collection coming from expression: Expected type list coming from expression:
┌─⯈ tests/test_typing/bad/err2.catala_en:10.36-10.38: ┌─⯈ tests/test_typing/bad/err2.catala_en:10.36-10.38:
└──┐ └──┐
10 │ definition a equals number of (z ++ 1.1) / 2 10 │ definition a equals number of (z ++ 1.1) / 2

View File

@ -40,9 +40,9 @@ This expression has type Enum:
│ ‾‾‾‾‾‾‾‾‾‾‾‾‾ │ ‾‾‾‾‾‾‾‾‾‾‾‾‾
Expected type Structure coming from expression: Expected type Structure coming from expression:
┌─⯈ tests/test_typing/bad/common.catala_en:14.31-14.40: ┌─⯈ tests/test_typing/bad/common.catala_en:14.28-14.37:
└──┐ └──┐
14 │ output z content collection Structure 14 │ output z content list of Structure
‾‾‾‾‾‾‾‾‾ │ ‾‾‾‾‾‾‾‾‾
#return code 123# #return code 123#
``` ```

View File

@ -11,7 +11,7 @@ declaration structure Structure:
declaration scope S: declaration scope S:
input x content integer input x content integer
input output y content Enum input output y content Enum
output z content collection Structure output z content list of Structure
output a content decimal output a content decimal
``` ```
@ -23,7 +23,7 @@ $ catala Typecheck --check-invariants
┌─⯈ tests/test_typing/good/common.catala_en:14.10-14.11: ┌─⯈ tests/test_typing/good/common.catala_en:14.10-14.11:
└──┐ └──┐
14 │ output z content collection Structure 14 │ output z content list of Structure
│ ‾ │ ‾
[WARNING] In scope "S", the variable "a" is declared but never defined; did you forget something? [WARNING] In scope "S", the variable "a" is declared but never defined; did you forget something?