#programming-language #celo #jezik #programski #slovenščini #slovenian #funkcija

bin+lib slj

Programski jezik v slovenščini | A programming language in Slovenian

1 unstable release

0.6.6 May 25, 2023

#455 in Programming languages

GPL-3.0 license

180KB
3.5K SLoC

SLJ

Programski jezik v slovenščini | A programming language in Slovenian

SLJ je enostaven interpretiran programski jezik v slovenščini. Nastal je kot nadgradnja enostavnega kalkulatorja, razvil pa se je v nekaj precej zmogljivejšega.

Spodaj je primer uporabe jezika, v katerem je prisotna večina konstruktov jezika.

funkcija je_deljivo(deljenec: celo, delitelj: celo) -> bool {
    vrni deljenec % delitelj == 0
}

funkcija je_praštevilo(kandidat: celo, praštevila: @[celo]) -> bool {
    za i = 0, praštevila[i]**2 < kandidat, i += 1 {
	če je_deljivo(kandidat, praštevila[i]) {
	    vrni laž
	}
    }
    vrni resnica
}

funkcija poišči_praštevila(od: celo, do: celo, praštevila: @[celo], praštevil: @celo) {
    za kandidat = od, kandidat <= do, kandidat += 2 {
	če je_praštevilo(kandidat, praštevila) {
	    praštevila[praštevil@] = kandidat
	    praštevil@ += 1
	}
    }
}

naj praštevila: [celo; 200]
praštevila[0] = 2
praštevila[1] = 3
naj praštevil = 2


poišči_praštevila(5, praštevila.dolžina, @praštevila, @praštevil)

za i = 0, i < praštevil, i += 1 {
    natisni!(praštevila[i], " ")
}

natisni!("\npraštevil do ", praštevila.dolžina, ": ", praštevil, "\n")

Konstrukti

Spremenljivke in prirejanje

naj x = 1
x = x + 3.0 # Napaka E5: Nemogoča operacija: celo + real (2, 7)
x = x + 3

Osnovni tipi

naj odgovor: celo # cela števila
naj pi: real      # realna števila
naj enako: bool   # boolove vrednosti
naj č: znak
odgovor = 3.14 # Napaka E3: Nemogoča operacija: celo = real (4, 1)
odgovor = 42
pi = 3.14
enako = laž
č = 'č'

Reference

naj a = 13
naj ra = @a
natisni(a)
natisni(ra)  # Napaka E2: Funkcija 'natisni(@celo)' ne obstaja (5, 1)

# dereferenciranje
ra@ = 7
natisni(ra@) # 7

Seznami

naj seznam: [real; 64]
seznam[0] = 1 # Napaka E3: Nemogoča operacija: real = celo (2, 1)
seznam[0] = 1.0
seznam[1] = 2.0
seznam[2] = 3.0

Reference na sezname

Reference na sezname so enake za sezname vseh dolžin; seznama [real; 13] in [real; 42] imata različna tipa, a imata oba referenco tipa @[real]. Tako lahko implementiramo eno funkcijo za sezname vseh dolžin.

funkcija vsebuje(seznam: @[real], št: real) -> bool {
    za i = 0, i < seznam.dolžina, i += 1 {
        če seznam[i] == št {
            vrni resnica
        }
    }
    vrni laž
}

naj a: [real; 13]
naj b: [real; 42]
naj c: [celo; 15]

vsebuje(@a, 4.0)
vsebuje(@b, 0.0)
vsebuje(@c, -1) # Napaka E2: Funkcija 'vsebuje(@[celo], celo)' ne obstaja (16, 1)

Operacije

# aritmetične in bitne operacije
naj x = 16 - 3
x = x + 2
x += 1
x = 2**3
x = 1 << 3
x = x % 5
x >>= 1 | 3

# Boolove operacije
naj b = laž
b = !laž
b = b && laž
b ||= resnica
b  ^= laž

# pretvorbe med tipi
naj a = 13.0
a += 29 kot real
naj nič = 48 kot znak
nič += 11 kot znak # Napaka E3: Nemogoča operacija: znak += znak (4, 5)
nič = (nič kot celo + 11) kot znak

# primerjalne operacije
naj enako = 13 == 11 + 2.0 # Napaka E5: Nemogoča operacija: celo + real (1, 22)
naj večje = 13 > 14
naj me    = 14 <= 14
# ...

Zanke

Zanka dokler:

dokler seznam[0] {
}
# Napaka E6: Pogoj mora biti Boolova vrednost (1, 8)

naj i = 0
dokler seznam[i] > 0 {
	...
	i += 1
}

Zanka za:

za i = 0, i < seznam.dolžina, i += 1 {
	...
}

Pogojni stavki

če št > 9 {
	...
}
čene če št > 0 {
	...
}
čene {
	...
}

Funkcije

funkcija je_deljivo(deljenec: celo, delitelj: celo) {
    vrni deljenec % delitelj == 0
}
# Napaka E3: Ne morem vrniti spremenljivke tipa 'bool' iz funkcije tipa 'brez' (2, 10)

funkcija je_praštevilo(kandidat: celo, praštevila: @[celo]) -> bool {
    za i = 0, praštevila[i]**2 < kandidat, i += 1 {
        če je_deljivo(kandidat, i) {
            vrni laž
        }
    }
    vrni resnica
}

Multifunkcijski klic

Če obstaja več funkcij z enakim imenom, ki sprejemajo vsaka po en argument, lahko uporabimo multifunkcijski klic. Izgleda podobno kot navaden klic funkcije, le da za ime njeno dodamo !. Najboljši primer uporabe multifunkcijskih klicev je tiskanje.

funkcija natisni(niz: @[znak]) {
    naj dolžina = niz.dolžina
    za i = 0, i < dolžina, i += 1 {
        natisni(niz[i])
    }
}

funkcija natisni(št: celo) {
    če št > 9 {
        natisni(št / 10)
    }
    # natisni(znak) je vprajena funkcija
    natisni((št % 10 + '0' kot celo) kot znak)
}

natisni!("7! = ", faktoriela(7), "\n")

Dependencies

~2.9–4.5MB
~78K SLoC