UStackUStack
Franz icon

Franz

Franz é uma linguagem funcional e orientada a protótipos, com sintaxe concisa e escopo lexical. Suporta compilação nativa via LLVM IR.

Franz

O que é Franz?

Franz é uma linguagem de programação de alto nível, funcional, interpretada, tipada dinamicamente e de propósito geral, com sintaxe concisa e uma biblioteca padrão extensa. Seu objetivo principal é suportar padrões de programação funcional, ao mesmo tempo que oferece ferramentas para gerenciar efeitos e garantir execução previsível.

O projeto é apresentado como uma linguagem orientada a protótipos com efeitos seguros por capacidades e replay determinístico, incluindo “estritamente sem efeitos colaterais” (com uma exceção explícita para IO). Também inclui um caminho do código-fonte até executáveis nativos via LLVM IR.

Principais Recursos

  • Núcleo funcional com objetos orientados a protótipos: Utiliza uma base funcional pequena combinada com objetos orientados a protótipos para modelar comportamento, mantendo o foco da linguagem em construções funcionais.
  • Efeitos seguros por capacidades com replay determinístico: Projetada para ajudar a localizar e controlar efeitos provenientes de arquivos Franz importados.
  • Estritamente sem efeitos colaterais (com exceção da tabela IO): O modelo da linguagem é descrito como evitando efeitos colaterais, exceto por um mecanismo de IO explicitamente mencionado.
  • Compilação nativa via LLVM IR: Suporta compilação direta para executáveis nativos usando LLVM IR.
  • Literais de lista e operações de lista LLVM: Inclui sintaxe de literais de lista como [1, "hello", 3.14] e listas aninhadas, além de operações como head, tail, cons, empty?, length, nth e is_list.
  • Primitivas de comparação e matemática compiladas para tipos comuns: Fornece operadores de igualdade/ordem (is, less_than, greater_than) para inteiros, floats e strings, além de funções matemáticas como remainder, power, random, floor, ceil, round, abs, min, max e sqrt.
  • Fluxo de controle e condicionais com padrão: Disponibiliza construções if/when/unless e “cadeias cond” para ramificações de múltiplos caminhos com estilo de correspondência de padrões.
  • Escopo lexical com closures baseados em snapshot: Implementa escopo lexical onde os closures capturam variáveis do ambiente no momento da definição; suporta closures aninhados de profundidade arbitrária.
  • Sandboxing baseado em capacidades para código importado: Utiliza padrões de execução sandbox via use_with() e localização de efeitos via use_as() e notação de ponto (como descrito no texto do repositório).

Como Usar Franz

  1. Clone ou abra o repositório Franz e inspecione o README.md e os arquivos de exemplo incluídos (por exemplo, examples/mult-table.franz e examples/game-of-life.franz).
  2. Revise os módulos da biblioteca padrão mencionados na documentação (String, Math, List, Func) para ver as funções built-in e as operações de lista/list-combinator disponíveis.
  3. Siga os padrões de escopo lexical e closure mostrados no texto do repositório para verificar como os closures capturam variáveis e como os closures aninhados se comportam.
  4. Execute os scripts fornecidos do repositório para exercitar a implementação e os smoke tests (o repositório menciona scripts bash como scripts/run-comparison.sh e smoke tests automatizados).

Casos de Uso

  • Construir código de transformação de dados com processamento funcional de listas: Use literais de lista e operações de lista (ex.: padrões estilo map mostrados no texto do repositório, plus head/tail/nth e outros auxiliares de lista) para manipular dados estruturados.
  • Implementar lógica de múltiplos ramos com cadeias condicionais: Use cond chains para ramificações estilo padrão quando precisar rotear lógica baseado em comparações de inteiros/floats/strings ou guards.
  • Escrever código de ordem superior com closures: Use os combinadores do “módulo Func” (como compose2, apply e apply_twice) junto com closures baseados em snapshot para construir componentes funcional reutilizáveis.
  • Demonstrar escopo previsível em pequenos programas: Use escopo lexical e closures aninhados de profundidade arbitrária to build programs onde as variáveis capturadas devem permanecer estável across calls.
  • Prototipar comportamento de linguagem com compilação nativa: Compile código Franz através do pipeline LLVM IR para produzir executáveis nativos, incluindo caminhos de código que exercitam operações de lista, matemática, comparações e fluxo de controle.

FAQ

  • Franz é livre de efeitos colaterais? O texto do repositório diz “Strictly no side effects,” com uma exceção explícita para uma tabela IO.

  • Franz compila para executáveis nativos? Sim. A descrição do projeto afirma “Direct compilation to native executables via LLVM IR.”

  • Qual modelo de tipagem Franz usa? Franz descrito como tipado dinamicamente e garbage collected.

  • Como funciona a captura de closure em Franz? A documentação descreve escopo lexical onde closures capturam variáveis do ambiente no momento da definição (closures baseados em snapshot), e suporta closures aninhados de profundidade arbitrária.

  • Quais ferramentas são incluídas no repositório? O repositório inclui exemplos under examples/, testes (incluindo “smoke tests”), e scripts para running comparisons e checks (como referenciado no conteúdo da página).

Alternativas

  • Linguagens de programação funcional com sistemas de tipos fortes (por exemplo, linguagens da família ML): Se você busca principalmente uma sintaxe funcional com escopo e closures previsíveis, mas não precisa de compilação nativa baseada em LLVM como foco declarado.
  • Linguagens baseadas em protótipos (por exemplo, JavaScript com padrões funcionais): Útil quando o interesse está na modelagem orientada a protótipos, embora o fluxo de trabalho e o modelo de efeitos descrito para Franz sejam diferentes.
  • Linguagens de propósito geral compiladas com recursos funcionais (por exemplo, linguagens que compilam via LLVM): Se você deseja compilação por LLVM IR e construções funcionais, mas prefere um ecossistema com sintaxe e convenções de runtime diferentes.
  • Linguagens de script usadas para prototipagem com abordagens de sandbox: Se sua prioridade é experimentar rapidamente com execução controlada (o repositório discute padrões de segurança baseados em capacidades), você pode escolher um runtime diferente que ofereça seus próprios mecanismos de sandbox.