Sintassi Base

I fondamenti del linguaggio Flux: pulito come Python, potente per il web

Filosofia: Flux usa una sintassi Python-like senza i fastidiosi $, ; e -> di PHP. Codice pulito, leggibile e moderno.

Commenti

Flux supporta commenti su singola linea e multilinea:

# Questo è un commento su singola linea

"""
Questo è un commento
su più linee
"""

# Puoi anche usare i commenti inline
name = "Mario"  # Nome dell'utente

Variabili e Costanti

In Flux non servono simboli speciali per dichiarare variabili:

# Variabili
name = "Luca"
age = 25
is_active = True

# Costanti (per convenzione in maiuscolo)
API_KEY = "abc123"
MAX_USERS = 100

# Assegnazione multipla
x, y, z = 1, 2, 3

# Swap di valori
a, b = b, a

Tipi di Dati

Numeri

# Interi
count = 42
hex_value = 0xFF      # Esadecimale
binary = 0b1010       # Binario

# Float
price = 19.99
scientific = 1.5e-4   # Notazione scientifica

# Operazioni
result = 10 + 5       # 15
result = 10 - 5       # 5
result = 10 * 5       # 50
result = 10 / 5       # 2.0 (sempre float)
result = 10 // 3      # 3 (divisione intera)
result = 10 % 3       # 1 (modulo)
result = 2 ** 3       # 8 (potenza)

Stringhe

# Stringhe semplici
name = "Mario"
name = 'Mario'  # Singoli o doppi apici

# Stringhe multilinea
description = """
    Questa è una stringa
    su più linee
"""

# F-strings (interpolazione)
greeting = f"Ciao {name}!"
calculation = f"2 + 2 = {2 + 2}"

# Escape characters
path = "C:\\Users\\Mario"
quote = "Disse \"Ciao!\""

# Metodi utili
text = "  Flux Lang  "
text.strip()          # "Flux Lang"
text.lower()          # "  flux lang  "
text.upper()          # "  FLUX LANG  "
text.replace(" ", "") # "FluxLang"
"Hello".startswith("He")  # True

Liste

# Creazione liste
numbers = [1, 2, 3, 4, 5]
mixed = [1, "due", 3.0, True]
empty = []

# Accesso elementi
first = numbers[0]      # 1
last = numbers[-1]      # 5

# Slicing
subset = numbers[1:3]   # [2, 3]
copy = numbers[:]       # Copia completa

# Operazioni
numbers.append(6)       # Aggiungi alla fine
numbers.insert(0, 0)    # Inserisci all'inizio
numbers.remove(3)       # Rimuovi valore
popped = numbers.pop()  # Rimuovi e ritorna ultimo

# List comprehension
squares = [x**2 for x in range(5)]     # [0, 1, 4, 9, 16]
evens = [x for x in numbers if x % 2 == 0]

Dizionari

# Creazione dizionari
user = {
    "name": "Mario",
    "age": 30,
    "email": "mario@example.com"
}

# Accesso
name = user["name"]
name = user.get("name", "Default")  # Con default

# Modifica
user["age"] = 31
user["city"] = "Roma"  # Aggiungi nuova chiave

# Metodi utili
keys = user.keys()     # ["name", "age", "email", "city"]
values = user.values() # ["Mario", 31, "mario@example.com", "Roma"]
items = user.items()   # Coppie chiave-valore

# Dict comprehension
squares = {x: x**2 for x in range(5)}

Booleani e None

# Booleani
is_active = True
is_deleted = False

# None (valore nullo)
result = None

# Valori "falsy"
# False, None, 0, "", [], {} sono considerati False

# Controllo None
if user is None:
    print("Utente non trovato")
    
# Operatore coalescenza
name = username or "Guest"  # Usa "Guest" se username è falsy

Strutture di Controllo

If/Elif/Else

# If semplice
if age >= 18:
    print("Maggiorenne")

# If/else
if is_logged_in:
    show_dashboard()
else:
    redirect("/login")

# If/elif/else
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"

# Operatore ternario
status = "active" if user.is_active else "inactive"

# Match (pattern matching) - Nuovo in Flux!
match status:
    case "pending":
        send_reminder()
    case "active":
        show_content()
    case "suspended":
        show_error()
    case _:
        log_unknown_status()

Cicli

# For loop
for i in range(5):
    print(i)  # 0, 1, 2, 3, 4

# Iterare su lista
users = ["Mario", "Luigi", "Peach"]
for user in users:
    print(f"Ciao {user}")

# Con indice
for i, user in enumerate(users):
    print(f"{i}: {user}")

# Iterare su dizionario
for key, value in user_data.items():
    print(f"{key} = {value}")

# While loop
count = 0
while count < 5:
    print(count)
    count += 1

# Break e continue
for i in range(10):
    if i == 3:
        continue  # Salta questa iterazione
    if i == 7:
        break     # Esci dal ciclo
    print(i)

Funzioni

# Funzione semplice
def greet(name):
    return f"Ciao {name}!"

# Parametri default
def create_user(name, role="user"):
    return User(name=name, role=role)

# Parametri keyword
def send_email(to, subject, body, cc=None, bcc=None):
    # Invia email
    pass

# Chiamata con keyword arguments
send_email(
    to="user@example.com",
    subject="Benvenuto",
    body="Grazie per la registrazione"
)

# Multiple return
def get_coordinates():
    return 10, 20

x, y = get_coordinates()

# Lambda (funzioni anonime)
square = lambda x: x ** 2
numbers.sort(key=lambda x: x.age)

Gestione Errori

# Try/except base
try:
    result = 10 / 0
except ZeroDivisionError:
    print("Impossibile dividere per zero")

# Except multipli
try:
    user = User.find(id)
    send_email(user.email)
except UserNotFound:
    return error(404, "Utente non trovato")
except EmailError as e:
    log_error(f"Errore email: {e}")
    return error(500, "Errore invio email")

# Finally
try:
    file = open("data.txt")
    data = file.read()
except FileNotFoundError:
    data = ""
finally:
    file.close()  # Sempre eseguito

# Raise (solleva eccezione)
if not user.is_admin:
    raise PermissionError("Accesso negato")

Import e Moduli

# Import base
import datetime
import json

# Import specifico
from datetime import date, time
from app.models import User, Post

# Import con alias
import numpy as np
from app.services import EmailService as Email

# Import relativo
from .utils import format_date
from ..models import User

# Import wildcard (sconsigliato)
from math import *

Decoratori

I decoratori sono una feature potente per modificare il comportamento di funzioni:

# Decoratore semplice
@cache(minutes=5)
def get_expensive_data():
    # Query costosa
    return Database.complex_query()

# Decoratori multipli
@requires_auth
@validate_json
@rate_limit(requests=100, per="hour")
def api_endpoint(request):
    return {"status": "ok"}

# Decoratori con parametri
@timeout(seconds=30)
def long_running_task():
    # Operazione lunga
    pass

Type Hints

Flux supporta type hints opzionali per maggiore chiarezza:

# Type hints base
def greet(name: str) -> str:
    return f"Ciao {name}"

# Con tipi complessi
from typing import List, Dict, Optional

def process_users(users: List[User]) -> Dict[str, int]:
    return {"total": len(users)}

# Optional (può essere None)
def find_user(id: int) -> Optional[User]:
    return User.find(id)

# Union types
from typing import Union

def parse_value(value: Union[str, int]) -> int:
    return int(value)

Context Managers

# With statement
with open("file.txt") as f:
    content = f.read()
# File chiuso automaticamente

# Database transaction
with db.transaction():
    user.save()
    order.save()
# Commit automatico o rollback in caso di errore

# Custom context manager
with timing("operazione"):
    # Codice da misurare
    process_data()

Operatori Speciali

# Walrus operator (:=)
if (n := len(users)) > 10:
    print(f"Troppi utenti: {n}")

# Unpacking
first, *rest = [1, 2, 3, 4]  # first=1, rest=[2,3,4]

# Merge dizionari
defaults = {"color": "blue", "size": "M"}
custom = {"color": "red"}
final = {**defaults, **custom}  # {"color": "red", "size": "M"}

# In/not in
if "admin" in user.roles:
    show_admin_panel()

# Is/is not (identità)
if result is None:
    handle_error()
🎉 Ottimo! Ora conosci la sintassi base di Flux. Prossimo passo: impara a creare Routes per gestire le richieste HTTP.