Official documentation — from zero to your first web and desktop program.
1What is Alqor?
Alqor is a programming language written entirely in Azerbaijani. Keywords, error messages and documentation are all in the native language.
There is not a single English word in the code below — əgər instead of if, yaz instead of print. And the letters ə, ı, ş work fully.
salam.alqalqor
yaz("Adınızı daxil edin:")
dəyişən ad = oxu()
yaz("Yaşınızı daxil edin:")
dəyişən yaş = oxuTam()
əgər yaş >= 18ondayaz("{ad}, siz yetkinsiniz.")
yoxsayaz("{ad}, siz hələ yetkin deyilsiniz.")
son
With Alqor you can write console programs, websites and APIs, desktop apps and libraries — all in one language, one syntax.
Download Alqor from vuqar.pro/hub (Windows, Linux, macOS), or start learning the language with this guide.
2Your first program
Create a file named salam.alq and write:
salam.alqalqor
yaz("Salam, dünya!")
Then run it:
terminalbash
alqor işlət salam.alq
nəticəoutput
Salam, dünya!
To try without creating a file there is an interactive mode (REPL):
terminalbash
alqor söhbət
Azerbaijani letters: in Alqor Studio just type ASCII — type eger and it becomes əgər. Or use the ;e → ə, ;s → ş compose keys.
3Variables and types
tiplər.alqalqor
dəyişən ad = "Aysel"// mətndəyişən yaş = 24// tam ədəddəyişən boy = 1.68// onluq ədəddəyişən tələbədir = doğru// məntiqidəyişən heçnə = boş// dəyər yoxdursabit Pİ = 3.14159// dəyişməz
əgər yaş >= 18ondayaz("Yetkin")
yoxsaəgər yaş >= 13ondayaz("Yeniyetmə")
yoxsayaz("Uşaq")
son
For many options, use seç (select):
sec.alqalqor
seç gün
hal"B.e", "Ç.a"→yaz("İş günü")
hal"Ş", "B"→yaz("İstirahət")
hal1..5→yaz("Rəqəm")
digərhallarda→yaz("Naməlum")
son
5Loops
dovr.alqalqor
// 1-dən 5-ə qədərhər i üçün1..5içindəyaz("Rəqəm: {i}")
son// Siyahı üzərindədəyişən meyvələr = ["alma", "armud", "üzüm"]
hər m üçün meyvələr içindəyaz(m)
son// Şərtli dövrdəyişən i = 0nəqədərki i < 5yaz(i)
i += 1son// Sayla təkrartəkrarla3dəfəyaz("Salam")
son
6Functions
funksiya.alqalqor
funksiya salamla(ad: mətn)
yaz("Salam, {ad}!")
sonfunksiya topla(a: tam, b: tam) ->tamqaytar a + b
son
salamla("Aysel")
yaz(topla(3, 4)) // 7// Qısa (lambda) funksiyadəyişən ikiqat = (x) => x * 2yaz(ikiqat(21)) // 42
dəyişən yaşlar = {"Aysel": 24, "Rəşad": 31}
yaz(yaşlar["Aysel"]) // 24
yaşlar["Nigar"] = 28hər ad, yaş üçün yaşlar içindəyaz("{ad}: {yaş}")
son
8Classes
sinif.alqalqor
sinif İnsan
xassə ad: mətnxassə yaş: tamqurucu(ad: mətn, yaş: tam)
özü.ad = ad
özü.yaş = yaş
sonmetod təqdim()
yaz("Mən {özü.ad}, {özü.yaş} yaşım var.")
sonsondəyişən a = yeni İnsan("Aysel", 24)
a.təqdim()
Inheritance and method overriding:
teleb.alqalqor
sinif Tələbə miras İnsan
xassə universitet: mətnqurucu(ad: mətn, yaş: tam, universitet: mətn)
üst(ad, yaş)
özü.universitet = universitet
sonəvəzetmetod təqdim()
yaz("Mən {özü.ad}, {özü.universitet} tələbəsiyəm.")
sonson
9Error handling
xeta.alqalqor
cəhdetdəyişən n = tamƏt(oxu("Ədəd: "))
yaz("İki qatı: {n * 2}")
tut (x: ÇevrilməXətası)
yaz("Bu ədəd deyil!")
son
Raising your own error and checking a condition:
bol.alqalqor
funksiya böl(a: onluq, b: onluq) ->onluqtəmin b != 0yoxsaat BölməXətası("Sıfıra bölmək olmaz")
sonqaytar a / b
son
10Web server
A web server that works in just five lines:
server.alqalqor
gətir veb
dəyişən s = yeni veb.Server()
s.al("/", (sorğu) => veb.mətn("Salam, dünya!"))
s.dinlə(8080)
gətir pəncərə
dəyişən p = yeni pəncərə.Pəncərə("Mənim Proqramım", 800, 600)
p.məzmun(<h1>Salam, dünya!</h1>)
p.göstər()
pəncərə.işlət()
A stateful component — the same code also runs on the web:
saygac.alqalqor
gətir vidjet
komponent Sayğac
vəziyyət say: tam = 0göstər()
qaytar <button klik={() =>özü.say += 1}>
Basıldı: {özü.say}</button>
sonson
12Suffix formsNew2.5
In Azerbaijani, case suffixes link words together. Alqor accepts these suffixes as syntax: a range can be written as 1-dən 5-ə qədər (“from 1 to 5”) — both ends included, and a descending range steps by -1 automatically.
diapazon.alqalqor
hər i üçün1-dən 5-ə qədər// 1..5 — hər iki uc daxilyaz(i)
sondəyişən geri = siyahı(5-dən 1-ə qədər) // [5, 4, 3, 2, 1]
A method call can also follow Azerbaijani word order: the object of the action first, then the target with its case suffix, then the verb. The trailing et is an auxiliary word.
The hyphen must be attached: 1-dən. With spaces, n - a is always a subtraction.
13Query — sorğu hər … sonNew2.5
A query over collections that reads as Azerbaijani: filter (harada), sort (sırala), group (qrupla) and select the result (seç) in one expression. The result is always a list.
sorğu.alqalqor
struktur Adam
qurucu(açıqxassə ad: mətn, açıqxassə yaş: tam, açıqxassə şəhər: mətn)
sondəyişən adamlar = [Adam("Aysel", 28, "Bakı"), Adam("Murad", 17, "Gəncə"),
Adam("Leyla", 34, "Bakı"), Adam("Elçin", 22, "Şəki")]
dəyişən böyüklər = sorğu hər a üçün adamlar içində
harada a.yaş >= 18
sırala a.şəhər, a.yaş azalan
seç"{a.ad} ({a.şəhər})"son// ["Leyla (Bakı)", "Aysel (Bakı)", "Elçin (Şəki)"]
Grouping — qrupla açar olaraq (k, q). seç fərqli, ilk n, atla n and multiple hər sources are supported too.
qrupla.alqalqor
dəyişən sayları = sorğu hər a üçün adamlar içində
qrupla a.şəhər olaraq (şəhər, qrup)
sırala uzunluq(qrup) azalan, şəhər
seç"{şəhər}: {uzunluq(qrup)}"son// ["Bakı: 2", "Gəncə: 1", "Şəki: 1"]
14Units of measureNew2.5
A number followed by a unit name becomes a quantity. Incompatible units are never added — mistakes such as adding san (seconds) to km raise VahidXətası immediately.
vahidlər.alqalqor
dəyişən məsafə = 5 km
yaz(məsafə + 300 m) // 5.3 kmyaz((90 km/saat).çevir("m/san")) // 25.0 m/sanyaz(1500 m kimi km) // 1.5 kmyaz(2 m * 3 m) // 6 m²yaz(5 km > 4000 m) // doğruyaz(5 km + 3 san) // ✖ VahidXətası: `km` və `san` toplanmır
Length (mm…km, mil), mass (q, kq, ton), time (ms…həftə) and data (B…TB) units are available. Compound units are written without spaces: 90 km/saat, 9.8 m/san^2.
15The Result type and the ? operatorNew2.5
Return the outcome as a value instead of throwing: Uğur(dəyər) (success) or Uğursuz(xəta) (failure). These types are built in — no gətir needed.
nəticə.alqalqor
funksiya böl(a: tam, b: tam) -> Nəticə
əgər b == 0ondaqaytar Uğursuz("sıfıra bölmə")
sonqaytar Uğur(a / b)
sonseç böl(10, 2)
hal Uğur(d) →yaz("Nəticə: {d}")
hal Uğursuz(m) →yaz("Xəta: {m}")
sonyaz(böl(10, 0).dəyərVəYa(0.0)) // 0.0
Methods: uğurludur(), dəyərVəYa(), çevir(), zəncirlə(), aç(). ifadə? unwraps the result or returns a failure from the function right away:
yayma.alqalqor
funksiya hesabla(x, y, z) -> Nəticə
dəyişən a = böl(x, y)? // Uğursuz olsa, dərhal qaytarılırdəyişən b = böl(a, z)?
qaytar Uğur(a + b)
son
16Contracts — tələb and zəmanətNew2.5
The first statements of a function can declare its contract: tələb — a precondition checked before the body, zəmanət — a postcondition checked when the function returns. Inside zəmanət, nəticə is the returned value.
müqavilə.alqalqor
funksiya böl(a, b)
tələb b != 0, "bölən sıfır ola bilməz"// ön şərt
zəmanət nəticə * b == a // son şərtqaytar a / b
sonsinif Hesab
xassə balans = 100metod çıxar(məbləğ)
tələb məbləğ <= özü.balans, "balans çatmır"
zəmanət özü.balans >= 0özü.balans -= məbləğ
qaytarözü.balans
sonson
A violation raises ÖnŞərtXətası or SonŞərtXətası; both are caught by tut (x: MüqaviləXətası).
17DecoratorsNew2.5
A decorator is a plain function that takes a function (method, class) and returns a new value in its place. @jurnalla funksiya topla means topla = jurnalla(topla).
bəzəyici.alqalqor
funksiya jurnalla(f)
qaytarfunksiya(...arq, **adlı)
yaz("→ {f.ad}({arq})")
qaytar f(...arq, **adlı)
sonson
@jurnalla
funksiya topla(a, b) qaytar a + b son
topla(2, 3) // → topla([2, 3]) və nəticə 5
Parameterised decorators (@neçəDəfə(3)), stacked decorators and method decorators work too. A function’s name is read with f.ad, and **lüğət spreads named arguments.
18MacrosNew2.5
A macro is a code template expanded at parse time: the call site is replaced by the macro body. Calls look like ad!(…) — the ! tells a macro from a function. If the last parameter is ad: blok, the macro takes a code block.
makro.alqalqor
makro kvadrat(x) = x * x
yaz(kvadrat!(4)) // 16yaz(kvadrat!(1 + 2)) // 9 — (1 + 2) * (1 + 2)
makro vaxtÖlç(ad, iş: blok)
dəyişən başla = vaxt.ölç()
iş
yaz("{ad}: {vaxt.ölç() - başla:.3} san")
son
vaxtÖlç!("hesablama")
ağırHesab()
son
Macros are hygienic: names declared in the body never clash with the caller’s variables. Macros from another file come in with gətir "./makrolar.alq".
19Actors and channelsNew2.5
An actor is an object that guards its own state: every method call from outside is a message, the caller immediately gets a Gələcək (future), and messages are processed one at a time in arrival order — no locks needed.
aktyor.alqalqor
aktyor Bank
xassə balans = 0metod yatır(məbləğ: tam) ->tamözü.balans += məbləğ
qaytarözü.balans
sonmetod çək(məbləğ: tam) ->taməgər məbləğ > özü.balans ondaat Xəta("balans çatmır")
sonözü.balans -= məbləğ
qaytarözü.balans
sonsondəyişən hesab = Bank()
hesab.yatır(100) // mesaj — cavab gözlənilmirdəyişən g = hesab.çək(30) // Gələcək[tam]yaz(gözlə g) // 70
Kanal is a FIFO message queue between threads and actors: göndər (send), al (receive), bağla (close). If no one is left to send, the deadlock is detected with DalanXətası.
kanal.alqalqor
dəyişən k = Kanal()
k.göndər(1)
k.göndər(2)
k.bağla()
hər x üçün k içində// bağlanıb boşalana qədəryaz(x)
son
20Test blocksNew2.5
Write tests right inside the program file, without functions or annotations. A sınaq "ad" … son block is skipped in a normal run — only alqor sına runs it.
riyazi.alqalqor
funksiya topla(a, b)
qaytar a + b
sonsınaq"toplama işləyir"
gözlənilir topla(2, 2) == 4
gözlənilir topla(-1, 1) == 0sonsınaq"sıfıra bölmə"
gözlənilir xəta BölməXətası: 1 / 0son
terminalbash
alqor sına riyazi.alq
When gözlənilir (expect) fails, it shows both sides of the comparison; gözlənilir xəta Tip: ifadə checks that the expression raises that error.
21Python librariesNew2.4
Any Python module — standard library or a PyPI package — is imported directly with the python: prefix. Numbers, strings, lists, dictionaries, sets and tuples convert both ways automatically, and Alqor functions can be passed to Python.
python.alqalqor
gətir python:math.{sqrt, pi kimi PI}
gətir python:statistics kimi st
gətir python:collections kimi kol
yaz(sqrt(2), PI)
yaz(st.mean([87, 92, 78, 95, 88, 92]))
dəyişən say = kol.Counter("azərbaycan")
yaz(say.most_common(2)) // [("a", 3), ("z", 1)]
Python exceptions are caught as PythonXətası with cəhd et / tut:
Code is compiled to bytecode and runs on a virtual machine written in Rust: about 100× faster than the Python runtime (for example, fib 7.5 s → 0.08 s). The Rust engine ships with every installer.
The Rust engine includes veb, http, şəbəkə, verilənlər (SQLite), şifrə, csv, toml, xml and other modules. The default engine is still py; change it with ALQOR_MOTOR=avto.
alqor yeni mənim-saytım --şablon veb
alqor yeni mənim-tətbiqim --şablon desktop
alqor yeni mənim-kitabxanam --şablon kitabxana
24Sample code libraryNew2.5
Ready-made programs you can copy and run right away. Every sample was run on Alqor 2.5.1 — the outputs below come from real runs.
Copy the code, save it to a file (e.g. proqram.alq) and run it:
terminalbash
alqor işlət proqram.alq
01
Greeting and input
Reads a name and an age from the user and answers by condition.
Basics
01-salam.alqalqor
// İstifadəçidən ad və yaş alıb salamlayırdəyişən ad = oxu("Adınız: ")
dəyişən yaş = oxuTam("Yaşınız: ")
yaz("Salam, {ad}!")
əgər yaş >= 18ondayaz("Siz yetkinsiniz.")
yoxsayaz("Yetkinliyə {18 - yaş} il qalıb.")
son
Example runOutputoutput
Adınız: Aysel
Yaşınız: 16
Salam, Aysel!
Yetkinliyə 2 il qalıb.
02
Calculator
Four operations, choosing the operation with seç and catching division by zero.
Basics
02-kalkulyator.alqalqor
// Dörd əməl və sıfıra bölmə xətasıfunksiya hesabla(a: onluq, əməl: mətn, b: onluq) ->onluqseçəməlhal"+"→qaytar a + b
hal"-"→qaytar a - b
hal"*"→qaytar a * b
hal"/"əgər b == 0ondaat BölməXətası("sıfıra bölmək olmaz")
sonqaytar a / b
digərhallarda→at ArqumentXətası("naməlum əməl: {əməl}")
sonsondəyişən misallar = [(12, "+", 30), (7, "/", 2), (5, "*", 8), (1, "/", 0)]
hər (a, əməl, b) üçün misallar içindəcəhdetyaz("{a} {əməl} {b} = {hesabla(a, əməl, b)}")
tut (x: BölməXətası)
yaz("{a} {əməl} {b} → xəta: {x.mesaj}")
sonson
// Eratosfen ələyi: n-ə qədər bütün sadə ədədlərfunksiya sadələr(n: tam) ->siyahı[tam]
dəyişən ələk = [doğruüçün _ içində0..n]
ələk[0] = yanlış
ələk[1] = yanlışhər i üçün2..n içindəəgər i * i > n ondadayansonəgər ələk[i] ondahər k üçün i * i..n addım i içində
ələk[k] = yanlışsonsonsonqaytar [i üçün i içində0..n əgər ələk[i]]
sonyaz(sadələr(50))
yaz("100-ə qədər {uzunluq(sadələr(100))} sadə ədəd var")
OutputOutputoutput
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
100-ə qədər 25 sadə ədəd var
07
Fibonacci
Fast recursion with @yaddaşla (memoize) and an infinite generator.
Algorithms
05-fibonacci.alqalqor
// Fibonaççi: yaddaşlı rekursiya və generator
@yaddaşla
funksiya fib(n: tam) ->taməgər n < 2ondaqaytar n sonqaytar fib(n - 1) + fib(n - 2)
sonyaz("fib(90) = {fib(90)}")
generatorfunksiya ardıcıllıq() ->tamdəyişən a, b = 0, 1həmişəver a
a, b = b, a + b
sonsondəyişən ilkOn = []
hər x üçün ardıcıllıq() içindəəgəruzunluq(ilkOn) == 10ondadayanson
ilkOn.əlavə(x)
sonyaz(ilkOn)
Capitalisation, word count, reversing, vowels and palindromes.
Algorithms
06-metn-aletleri.alqalqor
// Mətn üzərində tez-tez lazım olan əməliyyatlardəyişən cümlə = " azərbaycan dili gözəl və zəngin dildir "dəyişən təmiz = cümlə.kəs()
yaz(təmiz.hərSözBöyük())
yaz(təmiz.böyüyə())
yaz("Söz sayı: {uzunluq(təmiz.sözlər())}")
yaz("Tərsinə: {təmiz.tərs()}")
dəyişən saitlər = "aıoueəiöü"dəyişən say = təmiz.simvollar().filtr((h) => saitlər.ehtiva(h)).uzunluq()
yaz("Sait sayı: {say}")
funksiya palindromdur(s: mətn) ->məntiqdəyişən t = s.kiçiyə().əvəz(" ", "")
qaytar t == t.tərs()
sonyaz(palindromdur("Ana"), palindromdur("Alqor"))
OutputOutputoutput
Azərbaycan Dili Gözəl Və Zəngin Dildir
AZƏRBAYCAN DİLİ GÖZƏL VƏ ZƏNGİN DİLDİR
Söz sayı: 6
Tərsinə: ridlid nignəz əv ləzög ilid nacyabrəza
Sait sayı: 13
doğru yanlış
09
Word frequency
Counting with a dictionary and listing the top results.
Algorithms
07-soz-tezliyi.alqalqor
// Mətndə ən çox işlənən sözləri tapırdəyişənmətn = "alma armud alma üzüm armud alma nar üzüm alma"dəyişən say: lüğət[mətn, tam] = {}
hər söz üçünmətn.sözlər() içində
say[söz] = say.al(söz, 0) + 1sondəyişən sıralı = say.cütlər().sıralanmış((c) => -c.1)
hər i, (söz, n) üçün sıralı.dilim(0, 2) içindəyaz("{i + 1}. {söz:<6} {n} dəfə")
son
OutputOutputoutput
1. alma 4 dəfə
2. armud 2 dəfə
10
Student grades
seç with ranges, the average score and the best result.
Algorithms
09-qiymetler.alqalqor
// Tələbələrin balları: orta, ən yaxşı və qiymətdəyişən ballar = {"Aysel": 95, "Murad": 72, "Leyla": 88, "Elçin": 54}
funksiya qiymət(bal: tam) ->mətnseç bal
hal90..100→qaytar"əla"hal70..<90→qaytar"yaxşı"hal50..<70→qaytar"kafi"digərhallarda→qaytar"qeyri-kafi"sonsonhər ad, bal üçün ballar içindəyaz("{ad:<6} {bal:>3} {qiymət(bal)}")
sondəyişən hamısı = ballar.dəyərlər()
yaz("Orta bal: {hamısı.orta():.1}")
dəyişən ən = ballar.cütlər().sıralanmış((c) => -c.1)[0]
yaz("Ən yaxşı: {ən.0} ({ən.1})")
OutputOutputoutput
Aysel 95 əla
Murad 72 yaxşı
Leyla 88 yaxşı
Elçin 54 kafi
Orta bal: 77.2
Ən yaxşı: Aysel (95)
11
Number guessing game
A random number, an endless loop and user input.
Games & tools
10-tapmaca.alqalqor
// Ədəd tapmaca oyunu: kompüter 1–100 arası ədəd tuturgətir təsadüfi
dəyişən tutulan = təsadüfi.tam(1, 100)
dəyişən cəhdSayı = 0həmişədəyişən təxmin = oxuTam("Təxmininiz: ")
cəhdSayı += 1əgər təxmin < tutulan ondayaz("Daha böyük ↑")
yoxsaəgər təxmin > tutulan ondayaz("Daha kiçik ↓")
yoxsayaz("Təbriklər! {cəhdSayı} cəhddə tapdınız.")
dayansonson
Example runOutputoutput
Təxmininiz: 50
Daha kiçik ↓
Təxmininiz: 25
Daha böyük ↑
Təxmininiz: 37
Daha kiçik ↓
Təxmininiz: 31
Təbriklər! 4 cəhddə tapdınız.
12
Password generator
A strong random password with at least one of each character type.
Games & tools
12-sifre-generatoru.alqalqor
// Güclü təsadüfi şifrə yaradırgətir təsadüfi
funksiya şifrə(uzunluq: tam = 16) ->mətndəyişən hərflər = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"dəyişən rəqəmlər = "23456789"dəyişən işarələr = "!@#$%&*?"dəyişən hamısı = hərflər + rəqəmlər + işarələr
// hər növdən ən azı bir simvol olsundəyişən s = [təsadüfi.seç(hərflər), təsadüfi.seç(rəqəmlər), təsadüfi.seç(işarələr)]
təkrarlauzunluq - 3dəfə
s.əlavə(təsadüfi.seç(hamısı))
son
təsadüfi.qarışdır(s)
qaytar"".birləşdir(s)
sontəkrarla3dəfəyaz(şifrə())
sonyaz(şifrə(24))
Validating addresses, finding and masking numbers with the naxış module.
Games & tools
20-email-yoxla.alqalqor
// Naxış (regex) ilə e-poçt ünvanlarını yoxlamaqgətir naxış
// x"…" — xam mətn: \ və {…} olduğu kimi qalır (naxışlar üçün rahatdır)sabit EMAİL = x"^[\w.+-]+@[\w-]+(\.[\w-]+)+$"hər ünvan üçün ["aysel@vuqar.pro", "yanlış@", "info@mail.az", "ad soyad@x.com"] içindədəyişən nəticə = əgər naxış.uyğundur(EMAİL, ünvan) onda"düzgün"yoxsa"yanlış"sonyaz("{ünvan:<18} → {nəticə}")
sondəyişənmətn = "Əlaqə: 050-111-22-33 və ya 055-444-55-66"yaz(naxış.hamısınıTap(x"\d{3}-\d{3}-\d{2}-\d{2}", mətn))
yaz(naxış.əvəz(x"\d", mətn, "*"))
OutputOutputoutput
aysel@vuqar.pro → düzgün
yanlış@ → yanlış
info@mail.az → düzgün
ad soyad@x.com → yanlış
["050-111-22-33", "055-444-55-66"]
Əlaqə: ***-***-**-** və ya ***-***-**-**
15
Bank account
A private field, a computed property and raising your own error.
Classes
13-bank-hesabi.alqalqor
// Sinif, hesablanan xassə və öz xətanı atmaqsinif BankHesabı
gizlixassə _balans: onluq = 0qurucu(açıqxassə sahib: mətn)
xassə balans: onluqoxuqaytarözü._balans sonsonmetod yatır(məbləğ: onluq)
əgər məbləğ <= 0ondaat ArqumentXətası("məbləğ müsbət olmalıdır")
sonözü._balans += məbləğ
sonmetod çıxar(məbləğ: onluq)
əgər məbləğ > özü._balans ondaat Xəta("balans çatmır: {özü._balans} AZN")
sonözü._balans -= məbləğ
sonsondəyişən h = yeni BankHesabı("Aysel")
h.yatır(500)
h.çıxar(120)
yaz("{h.sahib}: {h.balans} AZN")
cəhdet
h.çıxar(1000)
tut (x: Xəta)
yaz("Əməliyyat rədd edildi — {x.mesaj}")
son
OutputOutputoutput
Aysel: 380.0 AZN
Əməliyyat rədd edildi — balans çatmır: 380.0 AZN
16
Shapes: interfaces and inheritance
Polymorphism — one method across different classes.
Classes
14-fiqurlar.alqalqor
// İnterfeys, miras və polimorfizmgətir riyaziyyat kimi r
interfeys Fiqur
metod sahə() ->onluqmetod ad() ->mətnsonsinif Dairə tətbiq Fiqur
qurucu(açıqxassə radius: onluq)
metod sahə() ->onluqqaytar r.Pİ * özü.radius ** 2sonmetod ad() ->mətnqaytar"Dairə"sonsonsinif Düzbucaqlı tətbiq Fiqur
qurucu(açıqxassə en: onluq, açıqxassə hündürlük: onluq)
metod sahə() ->onluqqaytarözü.en * özü.hündürlük
sonmetod ad() ->mətnqaytar"Düzbucaqlı"sonsonsinif Kvadrat miras Düzbucaqlı
qurucu(tərəf: onluq)
üst(tərəf, tərəf)
sonəvəzetmetod ad() ->mətnqaytar"Kvadrat"sonsondəyişən fiqurlar: siyahı[Fiqur] = [yeni Dairə(2), yeni Düzbucaqlı(3, 5), yeni Kvadrat(4)]
hər f üçün fiqurlar içindəyaz("{f.ad():<11} sahə = {f.sahə():.2}")
sonyaz("Cəm: {fiqurlar.çevir((f) => f.sahə()).cəm():.2}")
OutputOutputoutput
Dairə sahə = 12.57
Düzbucaqlı sahə = 15.00
Kvadrat sahə = 16.00
Cəm: 43.57
17
Traffic light (enum)
A state machine with enum values, sıra() and hamısı().
Classes
15-svetofor.alqalqor
// Sadalama (enum): svetoforun vəziyyətləri növbə ilə dəyişirsadalama İşıq
QIRMIZI
YAŞIL
SARI
sonsabit İZAH = ["Dayan", "Keç", "Hazırlaş"] // sıra() ilə eyni düzülüşfunksiya növbəti(i: İşıq) -> İşıq
dəyişən hamısı = İşıq.hamısı()
qaytar hamısı[(i.sıra() + 1) % uzunluq(hamısı)]
sondəyişən işıq = İşıq.QIRMIZI
təkrarla4dəfəyaz("{işıq} → {İZAH[işıq.sıra()]}")
işıq = növbəti(işıq)
sonyaz("Bütün vəziyyətlər: {İşıq.hamısı()}")
OutputOutputoutput
QIRMIZI → Dayan
YAŞIL → Keç
SARI → Hazırlaş
QIRMIZI → Dayan
Bütün vəziyyətlər: [QIRMIZI, YAŞIL, SARI]
18
Writing and reading files
Writing, appending, reading line by line and deleting.
Files & data
17-fayl-qeydler.alqalqor
// Fayla yazmaq, əlavə etmək və sətir-sətir oxumaqgətir fayl
sabit YOL = "qeydlər.txt"
fayl.yaz(YOL, "Alqor ilə ilk qeyd")
fayl.əlavəEt(YOL, "\nİkinci qeyd")
fayl.əlavəEt(YOL, "\nÜçüncü qeyd")
hər i, sətir üçün fayl.oxuSətirlər(YOL) içindəyaz("{i + 1}: {sətir}")
sonyaz("Ölçü: {fayl.ölçü(YOL)} bayt")
fayl.sil(YOL)
yaz("Fayl qalıbmı? {fayl.vardır(YOL)}")
OutputOutputoutput
1: Alqor ilə ilk qeyd
2: İkinci qeyd
3: Üçüncü qeyd
Ölçü: 48 bayt
Fayl qalıbmı? yanlış
19
Saving with JSON
Writing a list to a JSON file, reading it back and calculating.
Speed, distance and file size — error-free maths with units.
New in 2.5
26-olcu-vahidleri.alqalqor
// 2.5 · Ölçü vahidləri: səhvsiz fizika hesablarıdəyişən yol = 120 km
dəyişən müddət = 1.5 saat
dəyişən sürət = yol / müddət
yaz("Orta sürət: {sürət}")
yaz("m/san ilə: {sürət.çevir("m/san")}")
yaz("Marafon: {42195 m kimi km}")
yaz("Fayl: {(3 GB).çevir("MB")}")
cəhdetyaz(5 km + 3 san)
tut (x: VahidXətası)
yaz("Xəta tutuldu: {x.mesaj}")
son
OutputOutputoutput
Orta sürət: 80.0 km/saat
m/san ilə: 22.22222222222222 m/san
Marafon: 42.195 km
Fayl: 3072.0 MB
Xəta tutuldu: `km` və `san` toplanmır — ölçülər uyğun deyil
28
Result type and ?
Exception-free error handling: Uğur / Uğursuz and the ? operator.
New in 2.5
27-netice-tipi.alqalqor
// 2.5 · Nəticə tipi və ? operatoru: istisnasız xəta idarəsifunksiya ədədə(m: mətn) -> Nəticə
cəhdetqaytar Uğur(m kimitam)
tut (x)
qaytar Uğursuz("`{m}` ədəd deyil")
sonsonfunksiya cəm(a: mətn, b: mətn) -> Nəticə
qaytar Uğur(ədədə(a)? + ədədə(b)?)
sonhər (a, b) üçün [("2", "3"), ("10", "x")] içindəseç cəm(a, b)
hal Uğur(d) →yaz("{a} + {b} = {d}")
hal Uğursuz(m) →yaz("Xəta: {m}")
sonsonyaz(ədədə("abc").dəyərVəYa(0))
OutputOutputoutput
2 + 3 = 5
Xəta: `x` ədəd deyil
0
29
Test blocks and a contract
Tests in the same file as the program; a precondition with tələb.
New in 2.5
28-sinaq.alqalqor
// 2.5 · Sınaq blokları: proqramla eyni faylda testlərfunksiya endirim(qiymət: onluq, faiz: tam) ->onluq
tələb faiz >= 0və faiz <= 100, "faiz 0–100 arası olmalıdır"qaytar qiymət * (100 - faiz) / 100sonyaz(endirim(200, 15)) // adi icra — 170.0sınaq"endirim düzgün hesablanır"
gözlənilir endirim(200, 15) == 170.0
gözlənilir endirim(99, 0) == 99.0sonsınaq"yanlış faiz rədd edilir"
gözlənilir xəta ÖnŞərtXətası: endirim(100, 150)
son
OutputOutputoutput
170.0
$ alqor sına 28-sinaq.alq
Alqor Sınaq 2.5.1
28-sinaq.alq
✓ endirim düzgün hesablanır 0.1ms
✓ yanlış faiz rədd edilir 0.1ms
Nəticə: 2 uğurlu, 0 uğursuz, 0 xəta, 0 atlanmış 0.93s
30
Actor and channel
Lock-free state and a message queue between threads.
New in 2.5
30-aktyor.alqalqor
// 2.5 · Aktyor: vəziyyəti kilidsiz qoruyan obyekt
aktyor Sayğac
xassə dəyər = 0metod artır(n: tam) ->tamözü.dəyər += n
qaytarözü.dəyər
sonsondəyişən s = Sayğac()
hər i üçün1..5içində
s.artır(i) // mesaj — cavab gözlənilmirsonyaz("Son dəyər: {gözlə s.artır(0)}")
dəyişən k = Kanal()
hər söz üçün ["salam", "dünya"] içində
k.göndər(söz)
son
k.bağla()
hər x üçün k içindəyaz("kanaldan: {x}")
son