Brunost er eit programmeringsspråk designa for dei som meiner at kode ikkje berre skal vere funksjonell — han skal ha sjel. Inspirert av den klassiske norske frukostopplevinga kombinerer Brunost ein rein, lesbar syntaks med ekte nynorsk terminologi.
Ingen framandord. Ingen rar import-hierarki. Berre kode som flyt like mjukt som brunost over ein nysteikt vaffel.
Merk: Brunost er under aktiv utvikling. Enkle einfilsskript fungerer godt.
prøv/fangfangar berre feil kasta medkast— ikkje interne køyretidsfeil.
| Eigenskap | Brunost |
|---|---|
| Løkker | forKvart og medan-syntaks som les seg naturleg |
| Feilhandtering | prøv/fang-blokker for reine feilflyt |
| Modular | Innebygde, brukar-definerte og fil-baserte modular |
| Mutabilitet | Eksplisitt låst/open — aldri uventa endringar |
| Typar | Eigendefinerte datatypar med feltmutabilitet |
bruk terminal
bruk matte
gjer rekn(tal, faktor) {
viss (faktor er 0) gjer {
kast "Kan ikkje gange med null, det er kjedeleg"
}
gjevTilbake tal * faktor
}
låst talrekke er [1, 2, 3, 4, 5]
prøv {
forKvart tal i talrekke {
låst resultat er rekn(tal, 3)
terminal.skriv(resultat)
}
} fang (feil) {
terminal.skriv("Noko gjekk gale: " + feil)
}Brunost skil mellom variablar som kan endrast og dei som ikkje kan det.
// Uforanderleg — set ein gong, aldri endra
låst fart er 88
// Foranderleg — kan oppdaterast fritt
open straum er 1
straum er straum + 1låst erNynorsk er sant // Boolsk
låst årstal er 1814 // Heiltal
låst graderNord er 71.0 // Desimaltal
låst helsing er "God dag, Noreg!" // Streng
låst fjordar er ["Sognefjord", "Hardangerfjord", "Geirangerfjord"] // ListeFunksjonar definerast med gjer og returnerer verdi med gjevTilbake:
gjer kroppsMasseIndeks(vekt, høgd) {
gjevTilbake vekt / (høgd * (høgd / 100))
}
låst resultat er kroppsMasseIndeks(70, 175)bruk terminal
låst temperatur er -5
viss (temperatur erMindreEnn 0) gjer {
terminal.skriv("Det er kaldt — ta på deg ull!")
} elles viss (temperatur erMindreEnn 15) gjer {
terminal.skriv("Frisk luft, ta med jakke")
} elles {
terminal.skriv("Norsk sommar! Nyt det medan det varar")
}For-kvar-løkke — iterer over ei liste:
bruk terminal
låst fylke er ["Vestland", "Rogaland", "Troms", "Finnmark"]
forKvart namn i fylke {
terminal.skriv("Hei frå " + namn + "!")
}Medan-løkke — køyr så lenge ein påstand er sann:
bruk terminal
open teller er 10
medan (teller erStørreEnn 0) gjer {
terminal.skriv(teller)
teller er teller - 1
}prøv/fang fangar feil kasta med kast:
bruk terminal
gjer delTal(teljar, nemnar) {
viss (nemnar er 0) gjer {
kast "Matematikken seier nei: kan ikkje dele på null"
}
gjevTilbake teljar / nemnar
}
prøv {
låst svar er delTal(42, 0)
terminal.skriv("Svar: " + svar)
} fang (feil) {
terminal.skriv("Feil oppstod: " + feil)
}Brunost støttar eigendefinerte datatypar med type. Typenamn skal skrivast med stor forbokstav. Kvart felt får si eiga mutabilitet med låst eller open:
bruk terminal
type Bil {
låst namn er "ukjend" // kan ikkje endrast etter oppretting
open alder er 0 // kan endrast fritt
}
låst minBil er Bil { namn er "Troll", alder er 70 }
terminal.skriv(minBil.namn) // Troll
terminal.skriv(minBil.alder) // 70Felt utan standardverdi er påkravde ved oppretting:
type Person {
låst namn er "ukjend"
open alder // påkravd — ingen standardverdi
}
låst person er Person { namn er "Kari", alder er 30 }Opne felt kan oppdaterast med er:
open minBil er Bil { namn er "Troll", alder er 69 }
minBil.alder er 70
terminal.skriv(minBil.alder) // 70Typar fungerer i viss-vilkår, forKvart-løkker og som funksjonsparameter:
bruk terminal
type Bil {
låst namn er "ukjend"
open alder er 0
}
type Flåte {
open bilar er []
}
gjer skrivBil(kvar) {
terminal.skriv(kvar.namn + " (" + kvar.alder + " år)")
}
låst minBil er Bil { namn er "Troll", alder er 70 }
// Felt i vilkårsutsagn
viss (minBil.alder er 70) gjer {
terminal.skriv("Bilen er 70 år gamal")
}
// Iterera over eit listfelt
låst minFlåte er Flåte {
bilar er ["Troll", "Buddy", "Th!nk"],
}
forKvart b i minFlåte.bilar {
terminal.skriv(b)
}
// Type som parameter
skrivBil(minBil)Typar skrives ut som JSON:
terminal.skriv(minBil) // {"namn": "Troll", "alder": 70}Brunost støttar tre typar modular for å organisere koden din.
bruk terminal // Inn- og utdata
bruk matte // Matematiske funksjonar
bruk streng // Strengmanipulasjon
bruk liste // Listeoperasjonarbruk terminal
bruk matte
terminal.skriv(matte.abs(-42)) // 42
terminal.skriv(matte.maks(7, 13)) // 13
terminal.skriv(matte.min(7, 13)) // 7bruk terminal
modul geometri {
gjer areal(breidde, høgd) {
gjevTilbake breidde * høgd
}
gjer omkrins(breidde, høgd) {
gjevTilbake 2 * (breidde + høgd)
}
}
terminal.skriv(geometri.areal(5, 8)) // 40
terminal.skriv(geometri.omkrins(5, 8)) // 26Del koden over fleire filer for større prosjekt.
utils/rekning.brunost:
gjer leggTil(a, b) {
gjevTilbake a + b
}
gjer trekkFrå(a, b) {
gjevTilbake a - b
}hovud.brunost:
bruk terminal
bruk utils.rekning
terminal.skriv(rekning.leggTil(100, 23)) // 123
terminal.skriv(rekning.trekkFrå(100, 23)) // 77Bruk som ved namnekonflikt:
bruk utils.rekning som rekn
terminal.skriv(rekn.leggTil(5, 7)) // 12mise handterer alle avhengigheiter automatisk:
mise install # Installer avhengigheiter
mise run build # Bygg prosjektet
mise run test # Køyr alle testar
mise run demo:start # Start demo-server på http://localhost:8765
mise run demo:stop # Stopp demo-serverenKrav: Zig 0.16 eller nyare.
zig build # Bygg prosjektet
zig build run -- mittskript.brunost # Køyr eit skript
zig build test # Køyr alle testarEller bruk den kompilerte binærfila direkte:
./zig-out/bin/brunost mittskript.brunostTestane er snapshot-testar som køyrer .brunost-skript og samanliknar utdata med venta resultat. Testskripter ligg i src/tests/.
Ein kan òg køyre brunost direkte ved hjelp av nix:
nix run github:atomfinger/brunost -- mittskript.brunostBrunost er eit aktivt prosjekt og tek gjerne imot bidrag — anten det er feilrettingar, nye funksjonar, betre dokumentasjon eller fleire demoar.
- Fork repoet
- Lag ein ny gren:
git checkout -b mi-endring - Gjer endringane dine
- Send ein pull request
Laga med kjærleik og altfor mykje brunost
