Sintassi di Modraft (per utenti)

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:

  • x
  • massa
  • _tmp2

Numeri Numeri in forma decimale, con parte frazionaria e/o esponente:

  • 3
  • 3.14
  • 1e-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^2
  • 5 (m*s)/kg
  • 1e3 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.x
  • p.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:

  • real
  • phquantity
  • string
  • array
  • record
  • 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

Leave a Reply

Your email address will not be published.


*