• [^] # Re: type

    Posté par (site web personnel) . En réponse au journal [Letlang] Écrire un compilateur en Rust (partie 3). Évalué à 2.

    En gros, on peut mettre des littéraux dans une définition

    Oui, ça permet par exemple de définir des énumérations :

    class roles(r: "admin" | "moderator" | "guest")
    

    on peut définir le type d'un champ plus tard.

    J'ai pas encore réfléchit à comment implémenter le type unknown. J'aimerais aussi éviter le type any si possible. Je regarderais sûrement l'implémentation de TypeScript pour m'en inspirer.

    D'ailleurs, est-ce que tu as déjà codé et tester le "&" et le "non" dans ton typage ?

    J'ai l'implémentation qui est décrite dans l'article (les structs OneOfType, AllOfType et NotType).

    Avec les tests suivants :

    letival=Value::Primitive(PrimitiveValue::Integer(42));
    letitype=IntergerType{};
    letis_42_type=ValueType{llval: PrimitiveValue::Integer(42)};
    letnot_42_type=NotType{lltype: &is_42_type};
    letint_but_not_42=AllOfType{lltypes: vec![&itype,&not_42_type]};
    assert!(itype.has(&ival));
    assert!(!int_but_not_42.has(&ival));

    Ce qui en Letlang s'écrirait :

    ival := 42
    assert ival is int
    assert !(ival is (int & !42))
    

    Ça fonctionne bien.

    NB: Je vais peut-être changer les symboles pour pas confondre :

    • !true = false
    • !42 = false

    https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg