UStackUStack
Franz icon

Franz

Franz est un langage fonctionnel orienté prototypes, syntaxe concise et portée lexicale. Compilation native via LLVM IR, bibliothèque standard riche.

Franz

Qu’est-ce que Franz ?

Franz est un langage de programmation de haut niveau, fonctionnel, interprété, typé dynamiquement et généraliste, doté d’une syntaxe concise et d’une bibliothèque standard fournie. Son objectif principal est de prendre en charge les modèles de programmation fonctionnelle tout en fournissant des outils pour gérer les effets et garantir une exécution prévisible.

Le projet est présenté comme un langage orienté prototypes avec des effets à sécurité par capacités et un rejeu déterministe, incluant « strictement aucun effet de bord » (avec une exception explicite pour les E/S). Il propose également un chemin de la source vers des exécutables natifs via LLVM IR.

Fonctionnalités clés

  • Noyau fonctionnel avec objets orientés prototypes : Utilise une petite base fonctionnelle complétée par des objets orientés prototypes pour modéliser le comportement tout en gardant le langage centré sur les constructions fonctionnelles.
  • Effets à sécurité par capacités avec rejeu déterministe : Conçu pour localiser et contrôler les effets provenant des fichiers Franz importés.
  • Strictement aucun effet de bord (exception pour la table E/S) : Le modèle du langage est décrit comme évitant les effets de bord sauf pour un mécanisme d’E/S explicitement mentionné.
  • Compilation native via LLVM IR : Prend en charge la compilation directe vers des exécutables natifs en utilisant LLVM IR.
  • Littéraux de liste et opérations de liste LLVM : Inclut la syntaxe des littéraux de liste comme [1, "hello", 3.14] et des listes imbriquées, plus des opérations telles que head, tail, cons, empty?, length, nth et is_list.
  • Primitives de comparaison et de mathématiques compilées pour les types communs : Fournit des opérateurs d’égalité/ordonnancement (is, less_than, greater_than) pour les entiers, flottants et chaînes, plus des fonctions mathématiques telles que remainder, power, random, floor, ceil, round, abs, min, max et sqrt.
  • Flux de contrôle et conditionnels de type motif : Offre les constructions if/when/unless et des « chaînes cond » pour un branchement multi-voies de style pattern-matching.
  • Portée lexicale avec fermetures basées sur instantané : Implémente la portée lexicale où les fermetures capturent les variables de leur environnement au moment de la définition ; prend en charge les fermetures imbriquées de profondeur arbitraire.
  • Bac à sable basé sur les capacités pour le code importé : Utilise des modèles d’exécution isolés via use_with() et la localisation des effets via use_as() et la notation point (comme décrit dans le texte du dépôt).

Comment utiliser Franz

  1. Clonez ou ouvrez le dépôt Franz et examinez le README.md inclus et les fichiers d’exemple (par exemple, examples/mult-table.franz et examples/game-of-life.franz).
  2. Consultez les modules de la bibliothèque standard mentionnés dans la documentation (String, Math, List, Func) pour voir les fonctions natives et les opérations de liste/list-combinators disponibles.
  3. Suivez les modèles de portée lexicale et de fermeture montrés dans le texte du dépôt pour vérifier comment les fermetures capturent les variables et comment les fermetures imbriquées behave.
  4. Exécutez les scripts fournis par le dépôt pour exercer l’implémentation et les tests de fumée (le dépôt mentionne des scripts bash tels que scripts/run-comparison.sh et des tests de fumée automatisés).

Cas d’utilisation

  • Construction de code de transformation de données avec traitement de liste fonctionnel : Utilisez les littéraux de liste et les opérations de liste (par exemple, les modèles de style map montrés dans le texte du dépôt, plus head/tail/nth et les autres aides de liste) pour manipuler les données structurées.
  • Implémentation de logique multi-branches avec chaînes conditionnelles : Utilisez les chaînes cond for pattern-like branching lorsque vous avez besoin de router la logique basée sur des comparaisons ou des gardes d’entier/flottant/chaîne.
  • Écriture de code d’ordre supérieur avec fermetures : Utilisez les combinaisons du « module Func » (tels que compose2, apply, et apply_twice) avec les fermetures basées sur instantané pour construire des composants fonctionnels de réutilisation.
  • Démonstration de la portée prédictible dans des programmes petits : Utilisez la portée lexicale et les fermetures imbriquées de profondeur arbitraire to build programs où les variables capturées doivent rester stables across calls.
  • Prototypage du comportement du langage avec compilation native : Compilez le code Franz à travers la pipeline LLVM IR pour produire des exécutables natifs, incluant des chemins de code qui exercent les opérations de liste, les mathématiques, les comparaisons et le flux de contrôle.

FAQ

  • Franz est-il exempt d’effets de bord ? Le texte du dépôt dit « Strictement aucun effet de bord », avec une exception explicite pour la table E/S.

  • Franz compile-t-il vers des exécutables natifs ? Oui. La description du projet indique « Compilation directe vers des exécutables natifs via LLVM IR ».

  • Quel modèle de typage utilise Franz ? Franz est décrit comme typé dynamiquement et ramasse-miettes.

  • Comment fonctionne la capture de fermeture dans Franz ? La documentation décrit la portée lexicale où les fermetures capturent les variables de leur environnement au moment de la définition (fermetures basées sur instantané), et il supports des fermetures imbriquées de profondeur arbitraire.

  • Quels outils sont inclus dans le dépôt ? Le dépôt inclut des exemples sous examples/, des tests (incluant « tests de fumée »), et des scripts pour running comparisons et checks (comme référencés dans le contenu de la page).

Alternatives

  • Langages de programmation fonctionnelle dotés de systèmes de types forts (par ex. les langages de la famille ML) : si vous recherchez principalement une syntaxe fonctionnelle avec une portée et des fermetures prévisibles, mais sans avoir besoin de la compilation native via LLVM comme priorité.
  • Langages orientés prototypes (par ex. JavaScript avec des motifs fonctionnels) : utiles lorsque votre intérêt porte sur la modélisation objet orientée prototypes, bien que le flux de travail et le modèle d’effets décrit pour Franz diffèrent.
  • Langages compilés généralistes dotés de fonctionnalités fonctionnelles (par ex. langages qui compilent via LLVM) : si vous souhaitez la compilation LLVM IR et des constructions fonctionnelles, mais préférez un écosystème avec une syntaxe et des conventions d’exécution différentes.
  • Langages de script utilisés pour le prototypage avec des approches de sandboxing : si votre priorité est l’expérimentation rapide avec une exécution contrôlée (le dépôt évoque des modèles de sécurité basés sur les capacités), vous pouvez opter pour un autre runtime offrant ses propres mécanismes de sandbox.