Table of Contents
Mini-Clojure-TS é um interpretador e transpilador de Lisp moderno inspirado em Clojure, construído inteiramente em TypeScript. Este projeto foi desenvolvido com foco em arquitetura modular, performance e extensibilidade. Ele suporta recursos avançados como otimização de chamada de cauda (TCO), metaprogramação via Macros, interoperabilidade direta com JavaScript e agora também transpilação para código JavaScript executável.
| Componente | Detalhes | |
|---|---|---|
| ⚙️ | Arquitetura |
|
| ⚡️ | Desempenho |
|
| 🧠 | Metaprogramação |
|
| 🌐 | Interoperabilidade com JS |
|
| 📦 | Estruturas de Dados |
|
| 🛡️ | Tratamento de Erros |
|
| 🔄 | Gerenciamento de Estado |
|
| 🎯 | Desestruturação |
|
| ⚙️ | Transpilador |
|
| 💻 | REPL |
|
└── mini-clojure-ts/
├── .github
│ └── workflows
├── src/
│ ├── core/
│ │ ├── Environment.ts
│ │ ├── Evaluator.ts
│ │ ├── Parser.ts
│ │ ├── Tokenizer.ts
│ │ ├── Trampoline.ts
│ │ └── Transpiler.ts
│ ├── errors/
│ │ ├── ClojureError.ts
│ │ ├── InvalidParamError.ts
│ │ └── ReferenceError.ts
│ ├── stdlib/
│ │ └── index.ts
│ ├── types/
│ │ └── index.ts
│ └── index.ts
├── tests/
│ ├── atomos.clj
│ ├── compilador.clj
│ ├── compilador.js
│ ├── destructuring.clj
│ ├── erros.clj
│ ├── estouro.clj
│ ├── filtro.clj
│ ├── final.clj
│ ├── interop.clj
│ ├── listas.clj
│ ├── macros.clj
│ ├── main.clj
│ ├── map.clj
│ ├── multiplo.clj
│ └── soma.clj
├── README.md
├── LICENSE
├── package.json
├── tsconfig.json
├── .eslintrc.json
├── .prettierrc
└── pnpm-lock.yamlMINI-CLOJURE-TS/
src
⦿ src
File Name Summary index.ts - Ponto de entrada principal da aplicação
- Gerencia argumentos CLI para executar arquivos, iniciar REPL ou transpilar código
- Implementa REPL interativo com highlighting de sintaxe
- Suporte a transpilação para JavaScriptcore
⦿ src.core
File Name Summary Environment.ts - Gerencia escopo de variáveis e closures
- Implementa cadeia de escopos (scope chain)
- Suporte a destructuring em bindingsEvaluator.ts - Cérebro do interpretador
- Processa AST, lida com forms especiais (`def`, `if`, `fn`, `let`, `try/catch`)
- Expansão de macros e execução de código
- Suporte a destructuring e TCOParser.ts - Converte tokens em Abstract Syntax Tree (AST)
- Lida com estruturas recursivas (Lists, Vectors, Maps)
- Suporte a reader macros (`'`, `` ` ``, `~`, `@`)Tokenizer.ts - Análise léxica usando Regex
- Lida com comentários, strings, símbolos e caracteres especiais
- Suporte a keywords e númerosTrampoline.ts - Implementa padrão Trampoline para Tail Call Optimization (TCO)
- Permite recursão infinita sem stack overflowTranspiler.ts - NOVO: Compila AST Clojure para código JavaScript executável
- Suporte a forms básicos, funções, condicionais e interop JS
- Gera código limpo e otimizadoerrors
⦿ src.errors
File Name Summary ClojureError.ts - Classe base para todos os erros do interpretador InvalidParamError.ts - Erro para parâmetros inválidos em funções e forms especiais ReferenceError.ts - Erro para símbolos não encontrados no ambiente stdlib
⦿ src.stdlib
File Name Summary index.ts - Biblioteca padrão com funções essenciais (`map`, `filter`, `+`, `str`, etc.)
- Funções de interoperação JavaScript
- Operações com átomos (`atom`, `deref`, `reset!`, `swap!`)
- Funções para manipulação de coleçõestypes
⦿ src.types
File Name Summary index.ts - Tipos de dados fundamentais do Clojure
- `ClojureVector`, `ClojureKeyword`, `ClojureMap`, `ClojureAtom`, `ClojureMacro`
- Interfaces e tipos para AST e funções de usuário
tests
⦿ tests
File Name Summary atomos.clj - Testes de átomos e estado mutável compilador.clj - Programa de exemplo para transpilação compilador.js - NOVO: Saída transpilada do compilador.clj destructuring.clj - Testes de destructuring em let e funções erros.clj - Testes de try/catch e tratamento de erros estouro.clj - Testes de Tail Call Optimization (TCO) filtro.clj - Implementação da função filter final.clj - Teste final integrado interop.clj - Testes de interoperabilidade JavaScript listas.clj - Manipulação básica de listas macros.clj - Testes de metaprogramação com macros main.clj - Programa principal de exemplo map.clj - Testes da função map multiplo.clj - Testes de blocos do e strings soma.clj - Testes de recursão básica
This project requires the following dependencies:
- Clone the repository:
❯ git clone https://github.com/BrunoL28/mini-clojure-ts.git
- Navigate to the project directory:
❯ cd mini-clojure-ts
- Install the dependencies: Using pnpm:
❯ pnpm install
Using npm:
❯ npm install
Start the REPL (Interactive Mode):
❯ pnpm start
Execute a Clojure file:
❯ pnpm start -- tests/final.clj
Transpile a Clojure file to JavaScript:
❯ pnpm start -- -t tests/compilador.clj
or
❯ pnpm start -- --transpile tests/compilador.clj
The project includes a comprehensive suite of .clj files to test various features:
# Test Tail Call Optimization
❯ pnpm start -- tests/estouro.clj
# Test Macros
❯ pnpm start -- tests/macros.clj
# Test Atoms and State Management
❯ pnpm start -- tests/atomos.clj
# Test Destructuring
❯ pnpm start -- tests/destructuring.clj
# Test Error Handling
❯ pnpm start -- tests/erros.clj
# Test JavaScript Interop
❯ pnpm start -- tests/interop.clj
# Test Transpilation
❯ pnpm start -- -t tests/compilador.clj
O Mini-Clojure-TS pode ser usado como uma biblioteca em outros projetos TypeScript/JavaScript.
import { runSource, createGlobalEnv, parse } from "./src/index.js";
// 1. Execução Simples
const code = "(+ 10 20)";
const result = runSource(code);
console.log(result); // 30
// 2. Ambiente Personalizado
const env = createGlobalEnv();
runSource("(def x 42)", { env });
const x = runSource("x", { env });
console.log(x); // 42
// 3. Acesso à AST
const ast = parse('(print "Ola")');
console.log(ast);
// [ ['print', "Ola"] ]- v3.0: Rastreabilidade de Erros, CI e testes automatizados, Separação Engine/CLI, Multiline + Histórico no REPL
- v4.0: Escapes e erros melhores,
identical(para ponteiros), Printing legível, Ferramentas de Macro, Destructuring de Mapas - v5.0: Sec/Core Functions, Predicados e Tipos, Macros Utilitárias, Utilitários e IO básicos para uso no Node
- v6.0: Loader e Cache, Namespaces, Empacotamento
- v7.0: Transpiler como Compilador Útil, Runtime de Suporte, Macroexpand em Compile-Time, Output e Targets
- v8.0: Source Maps, Watch Mode, Sandbox/Whitelist, Definição de Política de Interop
- 💬 Join the Discussions: Share your insights, provide feedback, or ask questions.
- 🐛 Report Issues: Submit bugs found or log feature requests.
- 💡 Submit Pull Requests: Review open PRs, and submit your own PRs.
Contributing Guidelines
- Fork the Repository: Start by forking the project repository to your github account.
- Clone Locally: Clone the forked repository to your local machine.
- Create a New Branch: Always work on a new branch.
git checkout -b feature/my-new-feature
- Make Your Changes: Develop and test your changes locally.
- Commit Your Changes: Commit with a clear message.
- Push to github: Push the changes to your forked repository.
- Submit a Pull Request: Create a PR against the original project repository.
Distributed under the MIT License. See LICENSE for more information.
- Inspired by Rich Hickey's Clojure.
- Built with TypeScript for type safety and developer experience.
- Thanks to all contributors and testers who helped shape this project.