AN_Modraft-REPL-Intro.md
Sintassi di Modraft (per utenti)
Modraft e’ un REPL matematico: inserisci righe di testo al prompt e Modraft le valuta. La sintassi e’ pensata per scrivere espressioni, definire variabili e funzioni, lavorare con unita di misura e con incertezze.
Nomi e valori
Nomi (identificatori) Un nome inizia con una lettera o _, e puo contenere lettere, cifre e _. Esempi:
xmassa_tmp2
Numeri Numeri in forma decimale, con parte frazionaria e/o esponente:
33.141e-3
Stringhe Testo tra doppi apici:
"ciao""m/s^2"
Operatori e parentesi
Parentesi e raggruppamento
(...)per raggruppare e controllare l’ordine di valutazione.{...}per blocchi (vedi sotto).[...]per array e indicizzazione.
Operatori aritmetici
- Somma e sottrazione:
+,- - Prodotto e divisione:
*,/ - Potenza:
^oppure** - Modulo:
mod(es.7 mod 3)
Confronti
<,<=,>,>=,==,!=
Logica
- NOT:
! - AND:
&& - OR:
||
Ordine di valutazione (in breve)
- Prima si applicano accessi e indicizzazioni (
.e[...]) e le chiamate di funzione. - Poi unari (
+x,-x,!x), potenze, moltiplicazioni/divisioni/mod, somme/sottrazioni. - Poi confronti, quindi
&&, quindi||. - L’assegnamento (
=) si applica dopo tutto il resto.
Variabili e assegnamento
Assegnamento
nome = espressione;
Esempi:
x = 10;y = x * 2 + 1;
Variabili globali Se usi :: davanti a un nome, l’assegnamento e’ globale:
::g = 1;
Assegnamento con tipo (annotazione) Puoi dichiarare un tipo esplicito:
nome : Tipo = espressione;
Esempi:
x : real = 3.14;p : Point3D = Point3D{ x: 1, y: 2, z: 3 };
Unita di misura e incertezze
Unita dopo un numero (suffisso) Dopo un numero puoi scrivere un’espressione di unita. Esempi:
9.81 m/s^25 (m*s)/kg1e3 kg
Le unita possono includere parentesi, *, /, e potenze con ^ o **.
Incertezza Dopo un numero (e l’eventuale unita) puoi scrivere l’incertezza con unc:
- Incertezza assoluta:
valore unc numero- Esempio:
10 m unc 0.2
- Incertezza relativa (percentuale):
valore unc% numero- Esempio:
10 m unc% 2
Nota pratica: l’incertezza e’ un’informazione associata al valore; non si scrive una “unita dell’incertezza” separata nella sintassi.
Array e record
Array
- Literal:
[a, b, c](la virgola finale e’ ammessa:[a, b, c,]) - Indicizzazione:
a[i] - Indicizzazione multi-indice:
a[i, j] - Concatenazione:
a[i][j](si possono concatenare piu[])
Esempi:
v = [1, 2, 3];v[0]m[i, j]
Record (valori con campi)
- Definizione schema:
record Nome { campo: Tipo, ... };
- Literal:
Nome{ campo: valore, ... }
- Accesso campo:
r.campo
- Assegnamento a campo:
r.campo = valore
Esempi:
record Point2 { x: real, y: real };p = Point2{ x: 1, y: 2 };p.xp.y = 3;
Funzioni template (fnT)
Definisci una funzione con corpo a blocco:
fnT nome(parametri_tipati) : TipoRitorno { ... }Il tipo di ritorno puo essere omesso.
Esempio:
fnT add(a: real, b: real) : real { return a + b; }
Parametri sempre in forma nome : Tipo.
Controllo di flusso e blocchi
Blocchi
{ ... }contiene una sequenza di statement.
if / else
if (condizione) statement [else statement]
while
while (condizione) statement
break / continue
break;continue;
return
return espressione;(espressione obbligatoria)
Direttive unita (livello REPL)
Queste righe configurano il sottosistema unita. Sono statement a se stanti e terminano con ;.
unitdef ... ;definisce un’unita.unitpkg ... ;definisce un pacchetto di unita.unitpkguse nome;attiva un pacchetto.
Per unitdef e unitpkg, Modraft conserva il testo e lo passa al sottosistema unita per la validazione.
Tipi (annotazioni)
I tipi si usano dopo : in:
- variabili tipate
- parametri di funzione
- campi record
- tipo di ritorno
Tipi base disponibili:
realphquantitystringarrayrecord- oppure un nome di record (es.
Point2)
Array tipato a lunghezza fissa Dopo un tipo (tranne array) puoi scrivere [N] dove N e’ un intero positivo:
real[3]Point2[10]
Import FFI (prototipi)
Dichiara un prototipo importato:
import nome(parametri_tipati) : TipoRitorno;- oppure con vendor:
import vendor nome(parametri_tipati) : TipoRitorno;
Supporta ... solo come ultimo parametro.
Be the first to comment