Racket é uma linguagem de programação de propósito geral que é descendente do Scheme, que por sua vez é um derivado do Lisp. Inicialmente projetada como uma plataforma para a criação de linguagens, Racket fornece um conjunto rico de ferramentas para desenvolvedores definirem novas linguagens de programação e prototiparem rapidamente novas ideias. Ela enfatiza paradigmas de programação funcional, e seu poderoso sistema de macros permite uma flexibilidade significativa no desenvolvimento de linguagens específicas de domínio. Racket é particularmente adequada para fins educacionais, pesquisa e qualquer aplicação que exija recursos ou comportamentos de linguagem personalizados.
Racket (originalmente chamada PLT Scheme) foi criada por um grupo de pesquisadores da Northeastern University em meados da década de 1990, liderado por Matthew Flatt. Foi projetada como uma ferramenta educacional para ajudar os alunos a aprender conceitos de programação e design de linguagens através do dialeto Scheme do Lisp. As primeiras versões do Racket focaram principalmente em fornecer um ambiente robusto para o ensino e aprendizado de linguagens de programação.
Nos anos seguintes, Racket evoluiu além de suas raízes educacionais, tornando-se uma linguagem de programação de propósito geral com uma identidade distinta. A equipe do PLT rebatizou-a como Racket em 2010, enfatizando a versatilidade da linguagem e sua capacidade de suportar diferentes paradigmas, incluindo programação funcional, imperativa e orientada a objetos. A comunidade Racket cresceu, com contribuições de educadores, pesquisadores e desenvolvedores de software, reforçando suas capacidades em design e execução de linguagens.
Hoje, Racket apresenta um rico conjunto de bibliotecas e ferramentas, incluindo um poderoso ambiente de desenvolvimento integrado (IDE) chamado DrRacket. Seu design incentiva a criação de novas linguagens; portanto, sua base de usuários se estende além dos casos de uso tradicionais de programação para experimentação e desenvolvimento de linguagens. Racket tem sido influente na comunidade mais ampla de linguagens de programação, afetando linguagens como Julia e influenciando desenvolvimentos em ambientes de programação educacional.
Racket suporta funções de primeira classe, permitindo que funções sejam tratadas como cidadãos de primeira classe. Isso significa que podem ser passadas como argumentos, retornadas de outras funções e atribuídas a variáveis.
(define (apply-twice f x)
(f (f x)))
(apply-twice add1 5) ; Retorna 7
O poderoso sistema de macros do Racket permite extensões sintáticas, possibilitando que desenvolvedores criem formas especiais que não existem na linguagem base.
(define-syntax-rule (when condition body)
(if condition
(begin body)))
(when (> 3 2)
(display "3 é maior que 2")) ; Saída: 3 é maior que 2
Racket suporta correspondência de padrões via match
, permitindo um código limpo e legível ao desestruturar dados.
(define (describe lst)
(match lst
[(list 0) "Zero"]
[(list n) (string-append "Um: " (number->string n))]
[_ "Outro"]))
Racket permite que funções aceitem um número variável de argumentos usando a sintaxe de reticências.
(define (sum . numbers)
(apply + numbers))
(sum 1 2 3 4) ; Retorna 10
Funções em Racket podem ter argumentos opcionais e por palavra-chave, proporcionando flexibilidade na definição de assinaturas de função.
(define (greet #:name [name "Mundo"])
(string-append "Olá, " name "!"))
(greet) ; Retorna "Olá, Mundo!"
(greet #:name "Alice") ; Retorna "Olá, Alice!"
Racket suporta programação orientada a objetos através de seu sistema de class
, permitindo a criação de classes e métodos.
(define my-class
(class object%
(super-new)
(define/public (greet) "Olá!")))
(define obj (new my-class))
(send obj greet) ; Retorna "Olá!"
Racket fornece continuações de primeira classe, permitindo que desenvolvedores manipulem o fluxo de controle de maneiras avançadas.
(define (call-with-current-continuation f)
(call/cc f))
(call-with-current-continuation
(lambda (k) (k 10))) ; Retorna 10
Racket tem suporte a contratos embutido, ajudando desenvolvedores a especificar o comportamento esperado de funções e estruturas.
(define/contract (safe-div x y)
(-> number? (and/c number? (not/c (= y 0))) number?)
(/ x y))
Racket usa um sistema de módulos para facilitar a organização e reutilização de código.
(module my-module racket
(define (hello) "Olá do meu-módulo!"))
Racket Tipado é uma variante do Racket que adiciona tipos estáticos, permitindo verificação de tipos durante o desenvolvimento.
#lang typed/racket
(: add (-> Integer Integer Integer))
(define (add a b) (+ a b))
(add 2 3) ; Retorna 5
DrRacket serve como o IDE principal para Racket, proporcionando um ambiente integrado para escrever e executar programas Racket. Inclui recursos como destaque de sintaxe, ferramentas de depuração e um REPL (Read-Eval-Print Loop) para programação interativa.
Racket possui um compilador embutido que compila código Racket para bytecode ou código de máquina nativo para execução eficiente. Seu sistema de tempo de execução gerencia memória, coleta de lixo e outras tarefas de sistema de baixo nível.
Construir projetos Racket geralmente envolve organizar o código em módulos e usar o sistema de pacotes Racket para gerenciar bibliotecas externas. Projetos podem ser criados usando raco
, a ferramenta de linha de comando do Racket, para compilar e executar arquivos Racket.
raco make my-project.rkt
raco run my-project.rkt
Racket é usado em vários domínios, incluindo:
Racket compartilha semelhanças com várias linguagens de programação, enfatizando suas raízes na programação funcional:
Existem ferramentas como racket2cpp
do Racket que permitem a tradução de código-fonte de Racket para C++ ou linguagens similares. Além disso, alguns projetos de pesquisa se concentraram na tradução de Racket para JavaScript ou Python, permitindo uma integração mais fácil com aplicações web ou sistemas existentes.
As ferramentas existentes de tradução de código-fonte podem incluir:
A flexibilidade do Racket e suas fortes capacidades de metaprogramação fazem dele um excelente candidato para a construção de linguagens e exploração de novos paradigmas de programação. Sua rica história e desenvolvimento orientado pela comunidade garantem que continue sendo uma ferramenta valiosa para educadores, pesquisadores e desenvolvedores de software.