UStackUStack
Franz icon

Franz

Franz è un linguaggio di programmazione funzionale orientato ai prototipi, con sintassi essenziale e compilazione nativa via LLVM IR.

Franz

Cos'è Franz?

Franz è un linguaggio di programmazione ad alto livello, funzionale, interpretato, tipizzato dinamicamente e di uso generale, con una sintassi essenziale e una libreria standard estesa. Il suo scopo principale è supportare i paradigmi di programmazione funzionale fornendo al contempo strumenti per la gestione degli effetti e un'esecuzione prevedibile.

Il progetto è presentato come un linguaggio orientato ai prototipi con effetti sicuri per capacità e replay deterministico, inclusa la regola “strettamente senza effetti collaterali” (con un'eccezione esplicita per l'IO). Include inoltre un percorso dal codice sorgente agli eseguibili nativi tramite LLVM IR.

Funzionalità principali

  • Nucleo funzionale con oggetti orientati ai prototipi: Utilizza una base funzionale ridotta più oggetti orientati ai prototipi per modellare il comportamento, mantenendo il linguaggio centrato sui costrutti funzionali.
  • Effetti sicuri per capacità con replay deterministico: Progettato per localizzare e controllare gli effetti provenienti da file Franz importati.
  • Strettamente senza effetti collaterali (con eccezione per la tabella IO): Il modello del linguaggio è descritto come privo di effetti collaterali, tranne per un meccanismo IO esplicitamente menzionato.
  • Compilazione nativa tramite LLVM IR: Supporta la compilazione diretta in eseguibili nativi utilizzando LLVM IR.
  • Letterali di lista e operazioni LLVM su liste: Include la sintassi dei letterali di lista come [1, "hello", 3.14] e liste annidate, oltre a operazioni come head, tail, cons, empty?, length, nth e is_list.
  • Primitive di confronto e matematica compilate per i tipi comuni: Fornisce operatori di uguaglianza/ordinamento (is, less_than, greater_than) per interi, float e stringhe, più funzioni matematiche come remainder, power, random, floor, ceil, round, abs, min, max e sqrt.
  • Flusso di controllo e condizionali pattern-like: Offre i costrutti if/when/unless e le “catene cond” per ramificazioni multi-via in stile pattern matching.
  • Scoping lessicale con chiusure basate su snapshot: Implementa lo scoping lessicale in cui le chiusure catturano le variabili dall'ambiente al momento della definizione; supporta chiusure annidate di profondità arbitraria.
  • Sandboxing basato su capacità per codice importato: Utilizza pattern di esecuzione sandbox tramite use_with() e localizzazione degli effetti tramite use_as() e notazione a punto (come descritto nel testo del repository).

Come usare Franz

  1. Clona o apri il repository di Franz e ispeziona il README.md incluso e i file di esempio (ad esempio examples/mult-table.franz e examples/game-of-life.franz).
  2. Esamina i moduli della libreria standard citati nella documentazione (String, Math, List, Func) per vedere le funzioni integrate e le operazioni su liste/list-combinator.
  3. Segui i pattern di scoping lessicale e delle chiusure mostrati nel testo del repository per verificare come le chiusure catturano le variabili e come si verifichino le chiusure annidate.
  4. Esegui gli script forniti dal repository per esercitare l'implementazione e i test di smoke (il repository menziona script bash come scripts/run-comparison.sh e test di smoke automatizzati).

Casi d'uso

  • Costruire codice di trasformazione dati con processamento funzionale di liste: Use list literals and list operations (e.g., map-style patterns shown in the repository text, plus head/tail/nth and other list helpers) to manipulate structured data.
  • Implementare logica multi-ramificazione con catene condizionali: Use cond chains for pattern-like branching when you need to route logic based on integer/float/string comparisons or guards.
  • Scrivere codice higher-order con closures: Use the “Func module” combinators (such as compose2, apply, and apply_twice) together with snapshot-based closures to build reusable functional components.
  • Dimostrare scoping prevedibile in programmi piccoli: Use lexical scoping and arbitrary-depth nested closures to build programs where captured variables should remain stable across calls.
  • Prototipare il comportamento del linguaggio con compilazione nativa: Compile Franz code through the LLVM IR pipeline to produce native executables, including code paths that exercise list operations, math, comparisons, and control flow.

FAQ

  • Franz è privo di effetti collaterali? Il testo del repository dice “Strictly no side effects,” con un'eccezione esplicita per una tabella IO.

  • Franz compila in eseguibili nativi? Sì. La descrizione del progetto afferma “Direct compilation to native executables via LLVM IR.”

  • Quale modello di tipizzazione usa Franz? Franz è descritto come tipizzato dinamicamente e garbage collected.

  • Come funziona la cattura nelle closures in Franz? La documentazione descrive lo scoping lessicale in cui le chiusure catturano le variabili dall'ambiente al momento della definizione (chiusure basate su snapshot), e supporta chiusure annidate di profondità arbitraria.

  • Quali strumenti sono inclusi nel repository? Il repository include esempi sotto examples/, test (inclusi “smoke tests”), e script per eseguire confronti e controlli (come riferito nel contenuto della pagina).

Alternative

  • Linguaggi di programmazione funzionali con sistemi di tipi forti (ad es. linguaggi della famiglia ML): se cerchi principalmente una sintassi funzionale con scoping e closure prevedibili, ma non hai bisogno della compilazione nativa basata su LLVM come focus principale.
  • Linguaggi basati su prototipi (ad es. JavaScript con pattern funzionali): utili quando l’interesse è la modellazione orientata ai prototipi, anche se il flusso di lavoro e il modello degli effetti descritti per Franz differiscono.
  • Linguaggi generici compilati con caratteristiche funzionali (ad es. linguaggi che compilano tramite LLVM): se desideri la compilazione LLVM IR e costrutti funzionali, ma preferisci un ecosistema con sintassi e convenzioni di runtime differenti.
  • Linguaggi di scripting usati per prototipazione con approcci di sandboxing: se la priorità è sperimentare rapidamente con esecuzione controllata (il repository discute pattern di sicurezza basati su capability), puoi scegliere un runtime diverso che offra i propri meccanismi di sandbox.