Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion book.toml
2 changes: 1 addition & 1 deletion src/en/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<!-- - [Macros](macros.md) -->
- [Integer operations](integer.md)
- [Error handling](errors.md)
<!-- - [Type system](typesystem.md) -->
- [Type system](typesystem.md)
- [Central traits](central_traits.md)
- [Unsafe Rust](unsafe.md)
- [Generalities](unsafe/generalities.md)
Expand Down
2 changes: 1 addition & 1 deletion src/fr/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<!-- - [Macros](macros.md) -->
- [Gestion des entiers](integer.md)
- [Gestion des erreurs](errors.md)
<!-- - [Système de types](typesystem.md) -->
- [Système de types](typesystem.md)
- [Traits centraux](central_traits.md)
- [Unsafe Rust](unsafe.md)
- [Généralités](unsafe/generalities.md)
Expand Down
42 changes: 36 additions & 6 deletions src/fr/typesystem.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,39 @@
# Système de types

<!-- ## À propos du système de types de Rust -->
## Sémantique typée

<!--
<mark>TODO</mark> : identifier les pièges du système de types (par exemple,
des confusions à propos du code qui est vraiment exécuté à la suite d'une
résolution de contraintes de traits complexes).
-->
Certains langage (comme OCaml, Java ou C) ont une sémantique majoritairement[^syntax_directed_exceptions] *non typée* car leur exécution n'a pas besoin d'information de type. D'autres langages comme Haskell, Rust ou C++[^cpp_typed] ont majoritairement une sémantique *typée* dans laquelle la sémantique d'une opération dépend de son type.

[^syntax_directed_exceptions]: Les types primitifs de Java utilisent des informations de type pour déterminer leur sémantique. De même, l’arithmétique des tableaux en C utilise les informations de type pour calculer les *offsets*.
[^cpp_typed]: On excepte le cas des méthodes virtuelles.

Par exemple, dans les programmes suivants, l'expression `"127.0.0.1:8080".parse()` dépend du type attendu :

```rust
let r : Result<u8, _> = "127.0.0.1:8080".parse();
println!("{:?}", r);
```

affiche

```
Err(ParseIntError { kind: InvalidDigit })
```

alors que

```rust
let r : Result<std::net::SocketAddr, _> = "127.0.0.1:8080".parse();
println!("{:?}", r);
```

affiche

```
Ok(127.0.0.1:8080)
```

Le compilateur Rust utilise ici l'information de type pour résoudre la fonction `parse`.

<!-- Attention aux implémentations de la même fonction pour un smart pointer et le type qu'il wrap -->
<!-- Attention aux implémentations qui se chevauchent mais pas trop dérangeant car si on ne sait pas qu'un type implémente un trait, on ne va pas l'utiliser dans le cadre de ce trait -->