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
}
}
}
spr praštevila: [celo; 1_000_000]
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")
spr x = 1
x = x + 3.0 # Napaka E5: Nemogoča operacija: celo + real | test.slj:2:7
x = x + 3
spr odgovor: celo # cela števila
spr pi: real # realna števila
spr enako: bool # boolove vrednosti
spr č: znak
odgovor = 3.14 # Napaka E3: Nemogoča operacija: celo = real | test.slj:5:1
odgovor = 42
pi = 3.14
enako = laž
č = 'č'
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
spr 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 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ž
}
spr a: [real; 13]
spr b: [real; 42]
spr c: [celo; 15]
vsebuje(@a, 4.0)
vsebuje(@b, 0.0)
vsebuje(@c, -1) # Napaka E2: Funkcija 'vsebuje(@[celo], celo)' ne obstaja (16, 1)
# aritmetične in bitne operacije
spr x = 16 - 3
x = x + 2
x += 1
x = 2**3
x = 1 << 3
x = x % 5
x >>= 1 | 3
# Boolove operacije
spr b = laž
b = !laž
b = b && laž
b ||= resnica
b ^= laž
# pretvorbe med tipi
spr a = 13.0
a += 29 kot real
spr 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
# ...
Zanka dokler
:
dokler seznam[0] {
}
# Napaka E6: Pogoj mora biti Boolova vrednost (1, 8)
spr i = 0
dokler seznam[i] > 0 {
...
i += 1
}
Zanka za
:
za i = 0, i < seznam.dolžina, i += 1 {
...
}
če št > 9 {
...
}
čene če št > 0 {
...
}
čene {
...
}
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
}
Č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")