- Rust 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| grammatikk.md | ||
| LICENSE.txt | ||
| math_test.vevmaal | ||
| matte.vevmaal | ||
| README.md | ||
| test.vevmaal | ||
Vevmaal
Målet med dette språket er å ha ein integrerbar tolkar som lett kan kjøre under eit anna system. Det skal vera lisp-basert, men likevel stø delar av eit språk som eg ynskjer. Dimed har eg planar om å leggja til eigenskapar, enums, matching, og meir.
Grammatikken kan du lesa her: Grammatikk.
Førebels er språket særs enkelt med få mogleikar. Her har vi nykelorda:
- skrivut - tek eit uttrykk og skriv ut svaret
- lat - kan setja ein eller fleire variablar og deretter køyra eit uttrykk som kan bruke desse variablane
- dersom - sjekker førebels om ein verdi er "sann" eller ikkje og køyrer deretter anten det eine uttrykket eller hitt utrykket
- lambda - definerer en anonym funksjon med parametrar og eit uttrykk som kan nytta desse parametrane
- fastset - setjer variabler i den blokka det står i eller definerer "namngjevne" funksjonar, som kan (men må ikkje) vera halerekursive
- fleire - tillét at ein køyrer fleire uttrykk etter kvarandre og sender ut resultatet til den siste
Her er funksjonane:
- leggtil - legger saman anten tall eller strenger
- fraatrekk - trekkjer frå dei siste talla frå det fyrste
- gang - gangar saman talla
- del - deler det fyrste tallet på dei siste
- ertallalike - samanliknar to tall. Dersom talla er liket vert svaret førebels 1 elles 0
Merk at tolkaren førebels er grunne på AST (Abstrakte syntaks tre) og dimed vert det mykkje rekursjon, som snøggare kan føre til ein Stack-Overflow, av di det vert køyrd so mange funksjonar at det ikkje er plass igjen til eit nytt kall. Når eg får fiksa bytecode, vert det færre stack-er.
Planar
Før eg lærer meg å lage ein bytecode-tolkar, tenkjer eg å sysla med fylgjande:
-
Ein måte å statisk evaluere kva slags type som sendast inn eller ut av ein funksjon
- Av di Vevmaal ikkje nyttar ':' til noko, kan vi nytta han til inputtypar.
- Døme på ein funksjon:
(fastset (pluss a: number b: number) (add a b))
- Døme på ein funksjon:
- Elles kan ein gjera som Coalton og kunngjera typane på førehand.
- Døme:
(kunngjer (pluss) (number -> number -> number))
- Døme:
- Av di Vevmaal ikkje nyttar ':' til noko, kan vi nytta han til inputtypar.
-
Namngjevne funksjonar
- Gjer halerekursjon mogleg, av di ein kan finna kor funksjonen kallar seg sjølv.
- Kan forenkla funksjonsdefinisjonar.
-
Referanser
- Gjer det mogleg å endra verd som ikkje er i det nåværande området utan å setja ein ny ein.
- Gjer det å halda ei referanse til ein klasse enklare. Då slipp ein å kopiere definisjonen i kvart objekt.
-
Faste typar i nyttardefinerte funksjonar.
- Gjer statiske sjekkar enklare.
-
Eigenskapar
- Kan t.d. definera ein eigenskap for samanlikning og nytta han i fleire funksjonar, der argumentet elles ville vera av ein fast type.
-
Konsept for om ein verdi er brigdeleg eller ei.
-
Algebraiske datatyper! - døma viser eit forenkla Vevmaal
- Struct-ar/produkttypar, ei samling namngjevne felt
- Definisjon:
(fastset-struct Token { token_type: TokenType line: Number column: Number literal_range: { first: Number last: Number} literal: String } )
- Definisjon:
- Enum-ar/sum-typar, som kan innehalda andre datatyper - Kanskje eg kan gjenskapa vevmaal i vevmaal?
- Definisjon:
(fastset-enum Expression (Statement Statement) (FunctionCall { callable: Expression args: [Expression]}) (Single Single)) (fastset-enum Statement (Print { keyword: Token Value: Expression}) (Let { keyword: Token assignments: [{ name: Token value: Expression}]}) (If { keyword: Token condition: Expression truthy: Expression falsey: Option<Expression> }) (Lambda { keyword: Token parameters: [Token] body: Expression })) (fastset-enum Single (Name Token) (Literal Token) (PropertyOfExpression { expression: Expression dot: Token property: Token})) (fastset-enum VevValue (Number Number) (String String)) - Samsvarssjekking
- Kan nyttast til å t.d. køyra ein tolkar eller sjekka kva verdi noko er
(fastset min_verdi (VevValue.Number 10)) (samsvar min_verdi ( (VevValue.Number n) (skrivut "Dette er eit tal, med verdi: ") (skrivut n)) ( (VevValue.String n) (skrivut "Dette er visst ein streng; dette skulle ikkje hendt"))
- Definisjon:
- Struct-ar/produkttypar, ei samling namngjevne felt
-
«Hashmaps»
- Akkurat som namnebroren i Rust og dictionaries i Python. - Ein datatype som vert indeksert med ein nykel av eit førehandsbunde slag.
-
- Førebels stør ikkje Vevmål variabelnamn som inneheld teikn utanfor ASCII. Dimed vert ikkje namn som "Vevmål" støtt.
-
Stytte av "escape"-sekvensar
- Forenklar kontrollteikn
- \n vert ny linje
- \r vert «vognretur»
- Forenklar kontrollteikn
-
Kommentarar
Programdøme
Her har vi ei løkke som tel ned frå 5 til 1:
(lat
(lokke
(lambda
(teljar)
(lat
(
(x (skrivut teljar))
(ny_teljar (fraatrekk teljar 1)))
(dersom
(ertallalike ny_teljar 0)
0
(lokke ny_teljar)))))
(lokke 5))
Merk at ein førebels ikkje kan rekna ut fleire uttrykk av gangen utan lat-påstander. Difor må ein her skriva ut fyrst og deretter setja den nye teljaren i ein lat-påstand for å kunna nytta han seinare.
Køyring
Merk at programmet lagar ei test.vevmaal fil i mappa ein køyer programmet i, når det vert køyrt.
Installering
Til innstalleringa treng ein, på dei fleste system, berre Rust og git.
Vidare må ein lasta / klona filene her. I eit konsollvindu køyrer ein då:
git clone https://git.grim2016.no/grim2016/vevmaal.git
cd vevmaal
cargo install --path=.