Racket er eit generelt programmeringsspråk som er ein etterkommar av Scheme, som igjen er ein avleggar av Lisp. Språket vart opprinneleg utvikla som ei plattform for språkdesign, og Racket tilbyr eit rikt sett av verktøy for utviklarar til å definere nye programmeringsspråk og raskt prototype nye idear. Det legg vekt på funksjonell programmering, og det kraftige makrosystemet gjev stor fleksibilitet i utviklinga av domene-spesifikke språk. Racket er spesielt godt eigna for utdanningsformål, forsking og alle applikasjonar som krev tilpassa språkfunksjonar eller oppførsel.
Racket (opprinneleg kalla PLT Scheme) vart oppretta av ei gruppe forskarar ved Northeastern University på midten av 1990-talet, leia av Matthew Flatt. Det vart utvikla som eit utdanningsverktøy for å hjelpe studentar med å lære programmering og språkdesignkonsept gjennom Scheme-dialekten av Lisp. Dei tidlege versjonane av Racket fokuserte hovudsakleg på å tilby eit robust miljø for undervisning og læring av programmeringsspråk.
I åra som følgde, utvikla Racket seg utover sine utdanningsrøter, og blei eit generelt programmeringsspråk med ei distinkt identitet. PLT-teamet rebrandet det som Racket i 2010, og la vekt på språkets allsidighet og evne til å støtte ulike paradigmer, inkludert funksjonell, imperativ og objektorientert programmering. Racket-samfunnet voks, med bidrag frå utdannarar, forskarar og programvareutviklarar, som forsterka evnene i språkdesign og utføring.
I dag har Racket eit rikt sett av bibliotek og verktøy, inkludert eit kraftig integrert utviklingsmiljø (IDE) kalla DrRacket. Designet oppmuntrar til oppretting av nye språk; difor strekker brukarbasen seg utover tradisjonelle programmeringsbrukstilfelle til språkeksperimentering og utvikling. Racket har hatt innverknad i det breiare programmeringsspråkfellesskapet, og påverka språk som Julia og påverka utviklingar i utdanningsprogrammeringsmiljø.
Racket støttar førsteklasses funksjonar, som gjer at funksjonar kan bli behandla som førsteklasses borgarar. Dette betyr at dei kan bli sende som argument, returnert frå andre funksjonar, og tildelt variablar.
(define (apply-twice f x)
(f (f x)))
(apply-twice add1 5) ; Returnerer 7
Racket sitt kraftige makrosystem gjer det mogleg med syntaktiske utvidingar, som gjer at utviklarar kan lage spesielle former som ikkje eksisterer i basesspråket.
(define-syntax-rule (when condition body)
(if condition
(begin body)))
(when (> 3 2)
(display "3 er større enn 2")) ; Utskrift: 3 er større enn 2
Racket støttar mønster matching via match
, som gjer det mogleg med rein og lesbar kode når ein destrukturerer data.
(define (describe lst)
(match lst
[(list 0) "Null"]
[(list n) (string-append "Ein: " (number->string n))]
[_ "Annan"]))
Racket gjer det mogleg for funksjonar å ta imot eit variabelt antal argument ved å bruke ellipsis-syntaksen.
(define (sum . numbers)
(apply + numbers))
(sum 1 2 3 4) ; Returnerer 10
Funksjonar i Racket kan ha valfrie og nøkkelordargument, som gir fleksibilitet i defineringa av funksjonssignaturar.
(define (greet #:name [name "Verden"])
(string-append "Hallo, " name "!"))
(greet) ; Returnerer "Hallo, Verden!"
(greet #:name "Alice") ; Returnerer "Hallo, Alice!"
Racket støttar objektorientert programmering gjennom sitt class
-system, som gjer det mogleg å opprette klassar og metodar.
(define my-class
(class object%
(super-new)
(define/public (greet) "Hallo!")))
(define obj (new my-class))
(send obj greet) ; Returnerer "Hallo!"
Racket gir førsteklasses fortsetjingar, som gjer det mogleg for utviklarar å manipulere kontrollflyt på avanserte måtar.
(define (call-with-current-continuation f)
(call/cc f))
(call-with-current-continuation
(lambda (k) (k 10))) ; Returnerer 10
Racket har innebygd støtte for kontraktar, som hjelper utviklarar med å spesifisere forventa oppførsel av funksjonar og strukturar.
(define/contract (safe-div x y)
(-> number? (and/c number? (not/c (= y 0))) number?)
(/ x y))
Racket bruker eit modulsystem for å lette kodeorganisering og gjenbruk.
(module my-module racket
(define (hello) "Hallo frå my-module!"))
Typed Racket er ein variant av Racket som legg til statiske typar, som gjer det mogleg med typekontroll under utvikling.
#lang typed/racket
(: add (-> Integer Integer Integer))
(define (add a b) (+ a b))
(add 2 3) ; Returnerer 5
DrRacket fungerer som det primære IDE-et for Racket, og gir eit integrert miljø for å skrive og køyre Racket-program. Det inkluderer funksjonar som syntaksutheving, feilsøkingsverktøy og ein REPL (Read-Eval-Print Loop) for interaktiv programmering.
Racket har ein innebygd kompilator som kompilerer Racket-kode til bytekode eller maskinkode for effektiv utføring. Kjøretidsmiljøet handterer minne, søppelrydding og andre lågnivå systemoppgåver.
Å bygge Racket-prosjekt involverer typisk å organisere kode i moduler og bruke Racket-pakkesystemet for å handtere eksterne bibliotek. Prosjekt kan bli oppretta ved å bruke raco
, Racket sitt kommandolinjeverktøy, for å kompilere og køyre Racket-filer.
raco make my-project.rkt
raco run my-project.rkt
Racket blir brukt i ulike domener, inkludert:
Racket deler likskapar med ulike programmeringsspråk, og legg vekt på sine funksjonelle programmeringsrøter:
Det finst verktøy som Racket sitt racket2cpp
som gjer det mogleg med kilde-til-kilde oversetting frå Racket til C++ eller liknande språk. I tillegg har nokre forskingsprosjekt fokusert på å oversette Racket til JavaScript eller Python, som gjer det enklare å integrere med webapplikasjonar eller eksisterande system.
Eksisterande kilde-til-kilde oversettingsverktøy kan inkludere:
Racket sin fleksibilitet og sterke metaprogrammeringskapabilitetar gjer det til ein utmerka kandidat for å bygge språk og utforske nye programmeringsparadigmer. Den rike historia og samfunnsdrivne utviklinga sikrar at det forblir eit verdifullt verktøy for utdannarar, forskarar og programvareutviklarar.