1 unstable release
0.6.6 | May 25, 2023 |
---|
#606 in Programming languages
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.8–4.5MB
~77K SLoC