No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-29 22:17:59 +02:00
src Made Function trait use an Rc<dyn EnvironmentTrait>, added lists and a way to convert a raw list into a list 2026-09-29 22:17:59 +02:00
.gitignore Added .gitignore 2026-09-15 19:34:47 +02:00
Cargo.lock Initial commit with lexer 2026-09-15 09:15:26 +02:00
Cargo.toml Initial commit with lexer 2026-09-15 09:15:26 +02:00
grammatikk.md Updated the README.md and the grammatikk.md 2026-09-27 19:49:28 +02:00
LICENSE.txt Added information files 2026-09-15 19:33:17 +02:00
math_test.vevmaal Added a math test file 2026-09-27 23:27:24 +02:00
matte.vevmaal Basic math library 2026-09-27 22:54:57 +02:00
README.md Fixed "fastset" definition and also added comments to plans 2026-09-27 23:28:26 +02:00
test.vevmaal Added test for "fastset" with a sum function 2026-09-22 13:36:09 +02:00

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))
    • Elles kan ein gjera som Coalton og kunngjera typane på førehand.
      • Døme:
        (kunngjer (pluss) (number -> number -> number))
        
  • 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
            }
        )
        
    • 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"))
        
  • «Hashmaps»

    • Akkurat som namnebroren i Rust og dictionaries i Python. - Ein datatype som vert indeksert med ein nykel av eit førehandsbunde slag.
  • Unicode stytte

    • 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

  • 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=.