La facciata rappresenta ogni tipo Lean presente in una firma esportata come segue. I tipi del
crate lungo sono documentati nella sua documentazione API (cargo doc -p lungo --open).
Tipi predefiniti
| Lean | Rust |
|---|---|
Nat |
lungo::Nat (illimitato) |
Int |
lungo::Int (illimitato) |
Bool |
bool |
UInt8, UInt16, UInt32, UInt64, USize |
u8, u16, u32, u64, usize |
Int8, Int16, Int32, Int64, ISize |
i8, i16, i32, i64, isize |
Float, Float32 |
f64, f32 |
Char |
char |
String |
String |
Unit, PUnit |
() |
ByteArray |
lungo::ByteArray |
FloatArray |
lungo::FloatArray |
Option α |
Option<A> |
List α |
lungo::List<A> |
Array α |
Vec<A> |
α × β |
(A, B) |
Except ε α |
Result<A, E> |
Effetti
| Tipo di risultato Lean | Tipo di risultato Rust |
|---|---|
IO α |
Result<A, lungo::IoError> |
EIO ε α |
Result<A, E> |
BaseIO α |
A |
IoError::message() è la resa dell’errore da parte di Lean (IO.Error.toString);
IoError::user(msg) costruisce IO.userError msg.
Funzioni
Un parametro o un risultato di tipo funzione α₁ → … → αₙ → β è
lungo::LeanClosure<fn(A1, …, An) -> B>. call(a1, …, an) la applica;
LeanClosure::from_fn(f) avvolge una funzione Rust (Fn + Send + Sync + 'static). Sono
supportate le arietà da 1 a 8. Le funzioni che restituiscono IO sono opache (vedi sotto).
Polimorfismo
I parametri di tipo diventano parametri generici vincolati da lungo::LeanType. Gli argomenti
di istanza diventano parametri ordinari il cui tipo è la struttura della classe, quando è del
primo ordine.
Tipi induttivi
Un tipo induttivo del primo ordine (i cui campi hanno tutti una rappresentazione in questa tabella) diventa un tipo Rust con gli stessi parametri:
| Lean | Rust |
|---|---|
| structure | struct con campi nominati |
| solo costruttori senza campi | enum senza campi |
| più costruttori | enum; varianti con campi nominati quando ogni argomento ha un nome, varianti tupla altrimenti |
| un solo costruttore, non una structure | struct, nominata o tupla come sopra |
I campi ricorsivi sono inscatolati (Box<T>). I tipi derivano Clone e Debug; PartialEq
a meno che un campo sia una funzione o un valore opaco; Eq e Hash a meno che un campo sia
anche un float. Un tipo fornito dall’applicazione con extern_type interrompe queste
derivazioni per i tipi che lo contengono, e altre derivazioni si aggiungono con
type_attribute (vedi
configurazione).
serde
Con la feature serde del crate lungo, i tipi della facciata implementano Serialize e
Deserialize di serde, così i tipi generati possono derivarli tramite type_attribute:
[dependencies]
lungo = { version = "1.108.38", features = ["serde"] }
| Rust | Serializzato come |
|---|---|
lungo::Nat, lungo::Int |
una stringa decimale ("12", "-3"), poiché i valori sono illimitati; deserializzato da una stringa del genere o da un intero |
lungo::List<A> |
una sequenza |
lungo::ByteArray |
byte |
lungo::FloatArray |
una sequenza di float |
I valori opachi e le chiusure non hanno una forma serializzata.
Valori opachi
I valori di qualsiasi altro tipo (tipi dipendenti, tipi con dimostrazioni o campi a valori di
tipo, funzioni che restituiscono IO) sono lungo::LeanValue<M>, dove M è un tipo marcatore
in __opaque che prende il nome dalla costante di testa del tipo. Possono essere memorizzati,
clonati e restituiti a Lean.
Nomi
| Lean | Rust |
|---|---|
| componente di namespace | modulo snake_case |
| tipo, costruttore | CamelCase |
| funzione, campo, parametro | snake_case |
| parola chiave Rust | identificatore raw (r#type) o suffisso _ dove gli identificatori raw non sono ammessi |
UInt/USize/ISize sono parole singole nella conversione di maiuscole e minuscole
(toUInt8 → to_uint8). I nomi in conflitto ricevono suffissi numerici nell’ordine dei nomi
Lean. Ogni mappatura è registrata in
names.json.