Alqor documentation

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.alq alqor
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ş >= 18 onda
    yaz("{ad}, siz yetkinsiniz.")
yoxsa
    yaz("{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.alq alqor
yaz("Salam, dünya!")

Then run it:

terminal bash
alqor işlət salam.alq
nəticə output
Salam, dünya!

To try without creating a file there is an interactive mode (REPL):

terminal bash
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.alq alqor
dəyişən ad = "Aysel"          // mətn
dəyişən yaş = 24              // tam ədəd
dəyişən boy = 1.68            // onluq ədəd
dəyişən tələbədir = doğru     // məntiqi
dəyişən heçnə = boş           // dəyər yoxdur

sabit Pİ = 3.14159            // dəyişməz

If you want to declare the type explicitly:

tiplər.alq alqor
dəyişən say: tam = 0
dəyişən qiymət: onluq = 9.99
dəyişən adlar: siyahı[mətn] = []
TypeExample
tam42, -7, 1000000
onluq3.14, -0.5
mətn"Salam"
məntiqdoğru, yanlış
siyahı[T][1, 2, 3]
lüğət[A,D]{"ad": "Aysel"}

4Conditions and selection

sert.alq alqor
əgər yaş >= 18 onda
    yaz("Yetkin")
yoxsa əgər yaş >= 13 onda
    yaz("Yeniyetmə")
yoxsa
    yaz("Uşaq")
son

For many options, use seç (select):

sec.alq alqor
seç gün
    hal "B.e", "Ç.a" → yaz("İş günü")
    hal "Ş", "B" → yaz("İstirahət")
    hal 1..5 → yaz("Rəqəm")
    digər hallarda → yaz("Naməlum")
son

5Loops

dovr.alq alqor
// 1-dən 5-ə qədər
hər i üçün 1..5 iç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övr
dəyişən i = 0
nə qədər ki i < 5
    yaz(i)
    i += 1
son

// Sayla təkrar
təkrarla 3 dəfə
    yaz("Salam")
son

6Functions

funksiya.alq alqor
funksiya salamla(ad: mətn)
    yaz("Salam, {ad}!")
son

funksiya topla(a: tam, b: tam) -> tam
    qaytar a + b
son

salamla("Aysel")
yaz(topla(3, 4))              // 7

// Qısa (lambda) funksiya
dəyişən ikiqat = (x) => x * 2
yaz(ikiqat(21))              // 42

7Lists and dictionaries

siyahı.alq alqor
dəyişən s = [3, 1, 4, 1, 5]

s.əlavə(9)                    // sona əlavə
yaz(s[0])                     // 3
yaz(uzunluq(s))               // 6
yaz(s.sıralanmış())           // [1, 1, 3, 4, 5, 9]
yaz(s.cəm())                  // 23
yaz(s.filtr((x) => x > 3))    // [4, 5, 9]
yaz(s.çevir((x) => x * 10))   // [30, 10, 40, 10, 50]

A dictionary for key–value pairs:

lüğət.alq alqor
dəyişən yaşlar = {"Aysel": 24, "Rəşad": 31}

yaz(yaşlar["Aysel"])          // 24
yaşlar["Nigar"] = 28

hər ad, yaş üçün yaşlar içində
    yaz("{ad}: {yaş}")
son

8Classes

sinif.alq alqor
sinif İnsan
    xassə ad: mətn
    xassə yaş: tam

    qurucu(ad: mətn, yaş: tam)
        özü.ad = ad
        özü.yaş = yaş
    son

    metod təqdim()
        yaz("Mən {özü.ad}, {özü.yaş} yaşım var.")
    son
son

dəyişən a = yeni İnsan("Aysel", 24)
a.təqdim()

Inheritance and method overriding:

teleb.alq alqor
sinif Tələbə miras İnsan
    xassə universitet: mətn

    qurucu(ad: mətn, yaş: tam, universitet: mətn)
        üst(ad, yaş)
        özü.universitet = universitet
    son

    əvəz et metod təqdim()
        yaz("Mən {özü.ad}, {özü.universitet} tələbəsiyəm.")
    son
son

9Error handling

xeta.alq alqor
cəhd et
    də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.alq alqor
funksiya böl(a: onluq, b: onluq) -> onluq
    təmin b != 0 yoxsa
        at BölməXətası("Sıfıra bölmək olmaz")
    son
    qaytar a / b
son

10Web server

A web server that works in just five lines:

server.alq alqor
gətir veb

dəyişən s = yeni veb.Server()
s.al("/", (sorğu) => veb.mətn("Salam, dünya!"))
s.dinlə(8080)

Route parameters and a JSON response:

server.alq alqor
s.al("/salam/:ad", (q) =>
    veb.html(<h1>Salam, {q.parametr("ad")}!</h1>))

s.al("/api/vaxt", (q) => veb.json({
    "saat": vaxt.indi().saat,
    "dəqiqə": vaxt.indi().dəqiqə
}))

11Desktop app

pencere.alq alqor
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.alq alqor
gətir vidjet

komponent Sayğac
    vəziyyət say: tam = 0
    göstər()
        qaytar <button klik={() => özü.say += 1}>
            Basıldı: {özü.say}</button>
    son
son

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.alq alqor
hər i üçün 1-dən 5-ə qədər           // 1..5 — hər iki uc daxil
    yaz(i)
son

də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.

cümlə.alq alqor
dəyişən adlar = ["Ali"]
"Vüqar" adlar-a əlavə et        // adlar.əlavə("Vüqar")
adlar-ı sırala                  // adlar.sırala()
0 adlar-dan sil                 // adlar.sil(0)
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.alq alqor
struktur Adam
    qurucu(açıq xassə ad: mətn, açıq xassə yaş: tam, açıq xassə şəhər: mətn)
son

də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.alq alqor
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.alq alqor
dəyişən məsafə = 5 km

yaz(məsafə + 300 m)                  // 5.3 km
yaz((90 km/saat).çevir("m/san"))     // 25.0 m/san
yaz(1500 m kimi km)                  // 1.5 km
yaz(2 m * 3 m)                       // 6 m²
yaz(5 km > 4000 m)                   // doğru
yaz(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ə.alq alqor
funksiya böl(a: tam, b: tam) -> Nəticə
    əgər b == 0 onda
        qaytar Uğursuz("sıfıra bölmə")
    son
    qaytar Uğur(a / b)
son

seç böl(10, 2)
    hal Uğur(d) → yaz("Nəticə: {d}")
    hal Uğursuz(m) → yaz("Xəta: {m}")
son

yaz(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.alq alqor
funksiya hesabla(x, y, z) -> Nəticə
    dəyişən a = böl(x, y)?       // Uğursuz olsa, dərhal qaytarılır
    də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ə.alq alqor
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 şərt
    qaytar a / b
son

sinif Hesab
    xassə balans = 100
    metod çı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
    son
son
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.alq alqor
funksiya jurnalla(f)
    qaytar funksiya(...arq, **adlı)
        yaz("→ {f.ad}({arq})")
        qaytar f(...arq, **adlı)
    son
son

@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.alq alqor
makro kvadrat(x) = x * x

yaz(kvadrat!(4))          // 16
yaz(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.alq alqor
aktyor Bank
    xassə balans = 0

    metod yatır(məbləğ: tam) -> tam
        özü.balans += məbləğ
        qaytar özü.balans
    son

    metod çək(məbləğ: tam) -> tam
        əgər məbləğ > özü.balans onda
            at Xəta("balans çatmır")
        son
        özü.balans -= məbləğ
        qaytar özü.balans
    son
son

dəyişən hesab = Bank()
hesab.yatır(100)                    // mesaj — cavab gözlənilmir
də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.alq alqor
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ər
    yaz(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.alq alqor
funksiya topla(a, b)
    qaytar a + b
son

sınaq "toplama işləyir"
    gözlənilir topla(2, 2) == 4
    gözlənilir topla(-1, 1) == 0
son

sınaq "sıfıra bölmə"
    gözlənilir xəta BölməXətası: 1 / 0
son
terminal bash
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.alq alqor
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:

python-xeta.alq alqor
gətir python:json

cəhd et
    json.loads("pozulmuş")
tut (x: PythonXətası)
    yaz("Tutuldu:", x.pythonTipi)    // JSONDecodeError
son

PyPI packages are installed into the project like this:

terminal bash
alqor python qur requests numpy     # layihənin python_paketlər/ qovluğuna
alqor python siyahı
alqor python sil numpy

22Fast Rust engineNew2.4

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.

terminal bash
alqor işlət --motor rs proqram.alq     # Rust icraçısı (bayt kodu virtual maşını)
alqor işlət --motor avto proqram.alq   # modullar Rust-da varsa Rust, yoxdursa Python
alqor-rs işlət proqram.alq             # quraşdırıcısız Rust icraçısı
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.

23Tools and commands

CommandWhat it does
alqor işlət [fayl]Runs the program
alqor söhbətInteractive mode (REPL)
alqor yeni <ad>Creates a new project
alqor sınaRuns the tests
alqor yoxlaFinds errors (without running)
alqor format .Formats the code
alqor studioAlqor Studio IDE
alqor köməkAll commands
alqor sazla [fayl]Debugger (breakpoints, step-by-step execution) New2.5
alqor python qur <paket>Installs a Python package into the project New2.4
alqor işlət --motor rsRuns the program on the fast Rust engine New2.4

New project templates:

terminal bash
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:

terminal bash
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.alq alqor
// İstifadəçidən ad və yaş alıb salamlayır
dəyişən ad = oxu("Adınız: ")
dəyişən yaş = oxuTam("Yaşınız: ")

yaz("Salam, {ad}!")
əgər yaş >= 18 onda
    yaz("Siz yetkinsiniz.")
yoxsa
    yaz("Yetkinliyə {18 - yaş} il qalıb.")
son
Example run
Output output
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.alq alqor
// Dörd əməl və sıfıra bölmə xətası
funksiya hesabla(a: onluq, əməl: mətn, b: onluq) -> onluq
    seç əməl
        hal "+" → qaytar a + b
        hal "-" → qaytar a - b
        hal "*" → qaytar a * b
        hal "/"
            əgər b == 0 onda
                at BölməXətası("sıfıra bölmək olmaz")
            son
            qaytar a / b
        digər hallarda → at ArqumentXətası("naməlum əməl: {əməl}")
    son
son

dəyişən misallar = [(12, "+", 30), (7, "/", 2), (5, "*", 8), (1, "/", 0)]

hər (a, əməl, b) üçün misallar içində
    cəhd et
        yaz("{a} {əməl} {b} = {hesabla(a, əməl, b)}")
    tut (x: BölməXətası)
        yaz("{a} {əməl} {b} → xəta: {x.mesaj}")
    son
son
Output
Output output
12 + 30 = 42.0
7 / 2 = 3.5
5 * 8 = 40.0
1 / 0 → xəta: sıfıra bölmək olmaz
03

FizzBuzz

The classic task — a suffix range and a chain of conditions.

Basics
03-fizzbuzz.alq alqor
// 1-dən 15-ə qədər: 3-ə bölünəndə "Fizz", 5-ə "Buzz", hər ikisinə "FizzBuzz"
hər i üçün 1-dən 15-ə qədər
    əgər i % 15 == 0 onda
        yaz("FizzBuzz")
    yoxsa əgər i % 3 == 0 onda
        yaz("Fizz")
    yoxsa əgər i % 5 == 0 onda
        yaz("Buzz")
    yoxsa
        yaz(i)
    son
son
Output
Output output
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
04

Temperature converter

Celsius ↔ Fahrenheit functions and a formatted table.

Basics
08-temperatur.alq alqor
// Selsi ↔ Farenheyt çevirmə cədvəli
funksiya farenheytə(c: onluq) -> onluq
    qaytar c * 9 / 5 + 32
son

funksiya selsiyə(f: onluq) -> onluq
    qaytar (f - 32) * 5 / 9
son

hər c üçün [-10, 0, 25, 36.6, 100] içində
    yaz("{c:>5} °C = {farenheytə(c):.1} °F")
son
yaz("98.6 °F = {selsiyə(98.6):.1} °C")
Output
Output output
  -10 °C = 14.0 °F
    0 °C = 32.0 °F
   25 °C = 77.0 °F
 36.6 °C = 97.9 °F
  100 °C = 212.0 °F
98.6 °F = 37.0 °C
05

Multiplication table

Nested loops and column-aligned output.

Basics
11-vurma-cedveli.alq alqor
// 1–9 vurma cədvəli, səliqəli sütunlarla
yazSətirsiz("   │")
hər j üçün 1..9 içində
    yazSətirsiz("{j:>4}")
son
yaz("")
yaz("───┼" + "─" * 36)

hər i üçün 1..9 içində
    yazSətirsiz("{i:>2} │")
    hər j üçün 1..9 içində
        yazSətirsiz("{i * j:>4}")
    son
    yaz("")
son
Output
Output output
   │   1   2   3   4   5   6   7   8   9
───┼────────────────────────────────────
 1 │   1   2   3   4   5   6   7   8   9
 2 │   2   4   6   8  10  12  14  16  18
 3 │   3   6   9  12  15  18  21  24  27
 4 │   4   8  12  16  20  24  28  32  36
 5 │   5  10  15  20  25  30  35  40  45
 6 │   6  12  18  24  30  36  42  48  54
 7 │   7  14  21  28  35  42  49  56  63
 8 │   8  16  24  32  40  48  56  64  72
 9 │   9  18  27  36  45  54  63  72  81
06

Prime numbers (Sieve of Eratosthenes)

List comprehension, stepped ranges and filtering.

Algorithms
04-sade-ededler.alq alqor
// Eratosfen ələyi: n-ə qədər bütün sadə ədədlər
funksiya 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 üçün 2..n içində
        əgər i * i > n onda dayan son
        əgər ələk[i] onda
            hər k üçün i * i..n addım i içində
                ələk[k] = yanlış
            son
        son
    son

    qaytar [i üçün i içində 0..n əgər ələk[i]]
son

yaz(sadələr(50))
yaz("100-ə qədər {uzunluq(sadələr(100))} sadə ədəd var")
Output
Output output
[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.alq alqor
// Fibonaççi: yaddaşlı rekursiya və generator
@yaddaşla
funksiya fib(n: tam) -> tam
    əgər n < 2 onda qaytar n son
    qaytar fib(n - 1) + fib(n - 2)
son

yaz("fib(90) = {fib(90)}")

generator funksiya ardıcıllıq() -> tam
    dəyişən a, b = 0, 1
    həmişə
        ver a
        a, b = b, a + b
    son
son

dəyişən ilkOn = []
hər x üçün ardıcıllıq() içində
    əgər uzunluq(ilkOn) == 10 onda dayan son
    ilkOn.əlavə(x)
son
yaz(ilkOn)
Output
Output output
fib(90) = 2880067194370816120
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
08

Text tools

Capitalisation, word count, reversing, vowels and palindromes.

Algorithms
06-metn-aletleri.alq alqor
// Mətn üzərində tez-tez lazım olan əməliyyatlar
də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əntiq
    dəyişən t = s.kiçiyə().əvəz(" ", "")
    qaytar t == t.tərs()
son
yaz(palindromdur("Ana"), palindromdur("Alqor"))
Output
Output output
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.alq alqor
// Mətndə ən çox işlənən sözləri tapır
dəyişən mə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 üçün mətn.sözlər() içində
    say[söz] = say.al(söz, 0) + 1
son

də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
Output
Output output
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.alq alqor
// Tələbələrin balları: orta, ən yaxşı və qiymət
dəyişən ballar = {"Aysel": 95, "Murad": 72, "Leyla": 88, "Elçin": 54}

funksiya qiymət(bal: tam) -> mətn
    seç bal
        hal 90..100 → qaytar "əla"
        hal 70..<90 → qaytar "yaxşı"
        hal 50..<70 → qaytar "kafi"
        digər hallarda → qaytar "qeyri-kafi"
    son
son

hər ad, bal üçün ballar içində
    yaz("{ad:<6} {bal:>3}  {qiymət(bal)}")
son

də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})")
Output
Output output
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.alq alqor
// Ədəd tapmaca oyunu: kompüter 1–100 arası ədəd tutur
gətir təsadüfi

dəyişən tutulan = təsadüfi.tam(1, 100)
dəyişən cəhdSayı = 0

həmişə
    dəyişən təxmin = oxuTam("Təxmininiz: ")
    cəhdSayı += 1
    əgər təxmin < tutulan onda
        yaz("Daha böyük ↑")
    yoxsa əgər təxmin > tutulan onda
        yaz("Daha kiçik ↓")
    yoxsa
        yaz("Təbriklər! {cəhdSayı} cəhddə tapdınız.")
        dayan
    son
son
Example run
Output output
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.alq alqor
// Güclü təsadüfi şifrə yaradır
gətir təsadüfi

funksiya şifrə(uzunluq: tam = 16) -> mətn
    də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 olsun
    də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əkrarla uzunluq - 3 dəfə
        s.əlavə(təsadüfi.seç(hamısı))
    son
    təsadüfi.qarışdır(s)
    qaytar "".birləşdir(s)
son

təkrarla 3 dəfə
    yaz(şifrə())
son
yaz(şifrə(24))
Example run
Output output
9me!$fNtdmcfu26W
S6iXB8px*#Y!EtuH
*$6wat*ubA!C2!Q7
P?Sb95Q8XyNvCDtb@Q2!z8Np
13

Phone book

Adding, updating, deleting and safely reading dictionary entries.

Games & tools
16-telefon-kitabcasi.alq alqor
// Lüğət ilə kiçik telefon kitabçası
dəyişən kitabça = {"Aysel": "+994 50 111 22 33", "Murad": "+994 55 444 55 66"}

kitabça["Leyla"] = "+994 70 777 88 99"        // əlavə
kitabça["Murad"] = "+994 51 000 00 00"        // yenilə
kitabça.sil("Aysel")                          // sil

funksiya tap(ad: mətn) -> mətn
    qaytar kitabça.al(ad, "tapılmadı")
son

yaz("Leyla: {tap("Leyla")}")
yaz("Aysel: {tap("Aysel")}")

yaz("--- Bütün kontaktlar ({uzunluq(kitabça)}) ---")
hər ad üçün kitabça.açarlar().sıralanmış() içində
    yaz("{ad:<7} {kitabça[ad]}")
son
Output
Output output
Leyla: +994 70 777 88 99
Aysel: tapılmadı
--- Bütün kontaktlar (2) ---
Leyla   +994 70 777 88 99
Murad   +994 51 000 00 00
14

E-mail validator (regex)

Validating addresses, finding and masking numbers with the naxış module.

Games & tools
20-email-yoxla.alq alqor
// Naxış (regex) ilə e-poçt ünvanlarını yoxlamaq
gə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ış" son
    yaz("{ünvan:<18} → {nəticə}")
son

dəyişən mə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, "*"))
Output
Output output
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.alq alqor
// Sinif, hesablanan xassə və öz xətanı atmaq
sinif BankHesabı
    gizli xassə _balans: onluq = 0

    qurucu(açıq xassə sahib: mətn)

    xassə balans: onluq
        oxu qaytar özü._balans son
    son

    metod yatır(məbləğ: onluq)
        əgər məbləğ <= 0 onda
            at ArqumentXətası("məbləğ müsbət olmalıdır")
        son
        özü._balans += məbləğ
    son

    metod çıxar(məbləğ: onluq)
        əgər məbləğ > özü._balans onda
            at Xəta("balans çatmır: {özü._balans} AZN")
        son
        özü._balans -= məbləğ
    son
son

dəyişən h = yeni BankHesabı("Aysel")
h.yatır(500)
h.çıxar(120)
yaz("{h.sahib}: {h.balans} AZN")

cəhd et
    h.çıxar(1000)
tut (x: Xəta)
    yaz("Əməliyyat rədd edildi — {x.mesaj}")
son
Output
Output output
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.alq alqor
// İnterfeys, miras və polimorfizm
gətir riyaziyyat kimi r

interfeys Fiqur
    metod sahə() -> onluq
    metod ad() -> mətn
son

sinif Dairə tətbiq Fiqur
    qurucu(açıq xassə radius: onluq)
    metod sahə() -> onluq
        qaytar r.Pİ * özü.radius ** 2
    son
    metod ad() -> mətn
        qaytar "Dairə"
    son
son

sinif Düzbucaqlı tətbiq Fiqur
    qurucu(açıq xassə en: onluq, açıq xassə hündürlük: onluq)
    metod sahə() -> onluq
        qaytar özü.en * özü.hündürlük
    son
    metod ad() -> mətn
        qaytar "Düzbucaqlı"
    son
son

sinif Kvadrat miras Düzbucaqlı
    qurucu(tərəf: onluq)
        üst(tərəf, tərəf)
    son
    əvəz et metod ad() -> mətn
        qaytar "Kvadrat"
    son
son

də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}")
son
yaz("Cəm: {fiqurlar.çevir((f) => f.sahə()).cəm():.2}")
Output
Output output
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.alq alqor
// Sadalama (enum): svetoforun vəziyyətləri növbə ilə dəyişir
sadalama İşıq
    QIRMIZI
    YAŞIL
    SARI
son

sabit İ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ı)]
son

dəyişən işıq = İşıq.QIRMIZI
təkrarla 4 dəfə
    yaz("{işıq} → {İZAH[işıq.sıra()]}")
    işıq = növbəti(işıq)
son
yaz("Bütün vəziyyətlər: {İşıq.hamısı()}")
Output
Output output
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.alq alqor
// Fayla yazmaq, əlavə etmək və sətir-sətir oxumaq
gə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}")
son
yaz("Ölçü: {fayl.ölçü(YOL)} bayt")

fayl.sil(YOL)
yaz("Fayl qalıbmı? {fayl.vardır(YOL)}")
Output
Output output
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.

Files & data
18-json.alq alqor
// Obyektləri JSON fayla saxlamaq və geri oxumaq
gətir json

dəyişən məhsullar = [
    {"ad": "Noutbuk", "qiymət": 1450.0, "say": 3},
    {"ad": "Siçan", "qiymət": 25.5, "say": 40},
    {"ad": "Monitor", "qiymət": 380.0, "say": 7}
]

json.faylYaz("anbar.json", məhsullar)

dəyişən oxunan = json.faylOxu("anbar.json")
dəyişən cəm = oxunan.çevir((m) => m["qiymət"] * m["say"]).cəm()
yaz("Məhsul sayı: {uzunluq(oxunan)}")
yaz("Anbarın dəyəri: {cəm:,az} AZN")

yaz(json.yaz({"ad": "Alqor", "versiya": "2.5"}))
Output
Output output
Məhsul sayı: 3
Anbarın dəyəri: 8 030 AZN
{"ad": "Alqor", "versiya": "2.5"}
20

Date and time

Today’s date, Azerbaijani formatting and measuring run time.

Files & data
19-tarix-vaxt.alq alqor
// Bugünkü tarix, formatlama və icra müddətini ölçmək
gətir vaxt

yaz("Bu gün: {vaxt.bugün()}")
yaz("Azərbaycanca: {vaxt.azərbaycanca()}")
yaz("Ay adları: {vaxt.ayAdları().dilim(0, 2)}")

dəyişən başla = vaxt.ölç()
dəyişən cəm = 0
hər i üçün 1..100000 içində
    cəm += i
son
yaz("Cəm: {cəm}, müddət: {vaxt.ölç() - başla:.3} san")
Example run
Output output
Bu gün: 2026-10-30
Azərbaycanca: 30 oktyabr 2026, cümə
Ay adları: ["yanvar", "fevral"]
Cəm: 5000050000, müddət: 0.732 san
21

Python libraries

statistics, datetime, collections and math straight from Alqor.

Files & data
29-python.alq alqor
// Python kitabxanaları birbaşa Alqor-da (standart kitabxana — quraşdırma lazım deyil)
gətir python:statistics kimi st
gətir python:datetime.{date}
gətir python:collections.{Counter}
gətir python:math.{comb}

dəyişən satışlar = [120, 95, 140, 110, 160, 130]
yaz("Orta: {st.mean(satışlar):.1}, median: {st.median(satışlar)}")
yaz("Standart kənarlaşma: {st.stdev(satışlar):.2}")

dəyişən novruz = date(2026, 3, 20)
dəyişən ilSonu = date(2026, 12, 31)
yaz("Novruzdan il sonuna {(ilSonu - novruz).days} gün")

yaz(Counter("mississippi").most_common(2))
yaz("10 nəfərdən 3 nəfərlik komanda: {comb(10, 3)} variant")
Output
Output output
Orta: 125.8, median: 125.0
Standart kənarlaşma: 22.89
Novruzdan il sonuna 286 gün
[("i", 4), ("s", 4)]
10 nəfərdən 3 nəfərlik komanda: 120 variant
22

JSON REST API

GET, POST and DELETE routes, validation and status codes.

Web & desktop
21-veb-api.alq alqor
// JSON API: tapşırıqların siyahısı, əlavə etmək və silmək
gətir veb

dəyişən tapşırıqlar = [{"id": 1, "ad": "Alqor öyrən", "bitib": yanlış}]
dəyişən növbətiId = 2

funksiya əsas()
    dəyişən s = yeni veb.Server()

    s.al("/api/tapşırıqlar", (q) => veb.json(tapşırıqlar))

    s.göndər("/api/tapşırıqlar", funksiya(q)
        dəyişən d = q.json()
        əgər mətnƏt(d.al("ad", "")).kəs() == "" onda
            qaytar veb.json({"xəta": "ad boş ola bilməz"}).kod(422)
        son
        dəyişən t = {"id": növbətiId, "ad": d["ad"], "bitib": yanlış}
        növbətiId += 1
        tapşırıqlar.əlavə(t)
        qaytar veb.json(t).kod(201)
    son)

    s.sil("/api/tapşırıqlar/:id", funksiya(q)
        dəyişən id = tamƏt(q.parametr("id"), 0)
        tapşırıqlar = tapşırıqlar.filtr((t) => t["id"] != id)
        qaytar veb.boş()
    son)

    s.dinlə(8091)
son
Example run
Output output
$ curl http://127.0.0.1:8091/api/tapşırıqlar
[{"id": 1, "ad": "Alqor öyrən", "bitib": false}]

$ curl -X POST -H "Content-Type: application/json" \
       -d '{"ad": "Sayt hazırla"}' http://127.0.0.1:8091/api/tapşırıqlar
{"id": 2, "ad": "Sayt hazırla", "bitib": false}          ← 201

$ curl -X POST -d '{"ad": ""}' ...                       ← 422
{"xəta": "ad boş ola bilməz"}

$ curl -X DELETE http://127.0.0.1:8091/api/tapşırıqlar/1   ← 204
23

A web page with JSX

Writing HTML right in the code, plus a route parameter.

Web & desktop
22-veb-sehife.alq alqor
// JSX ilə HTML səhifə qaytaran veb sayt
gətir veb

dəyişən xidmətlər = ["Veb saytlar", "CRM sistemləri", "API inteqrasiyaları"]

funksiya səhifə(başlıq: mətn)
    qaytar <html lang="az">
        <head><meta charset="UTF-8" /><title>{başlıq}</title></head>
        <body>
            <h1>{başlıq}</h1>
            <ul>{xidmətlər.çevir((x) => <li>{x}</li>)}</ul>
        </body>
    </html>
son

funksiya əsas()
    dəyişən s = yeni veb.Server()
    s.al("/", (q) => veb.html(səhifə("Xidmətlərimiz")))
    s.al("/salam/:ad", (q) => veb.html(<h1>Salam, {q.parametr("ad")}!</h1>))
    s.dinlə(8092)
son
Example run
Output output
$ curl http://127.0.0.1:8092/salam/Aysel
<h1>Salam, Aysel!</h1>

$ curl http://127.0.0.1:8092/
<!DOCTYPE html>
<html lang="az"><head>…<title>Xidmətlərimiz</title></head>
<body><h1>Xidmətlərimiz</h1><ul><li>Veb saytlar</li><li>CRM sistemləri</li>…</ul></body></html>
24

Desktop counter

A stateful component with buttons — opens in a window.

Web & desktop
23-desktop-sayğac.alq alqor
// Desktop pəncərə: düymə ilə artan sayğac (eyni kod vebdə də işləyir)
gətir pəncərə
gətir vidjet

komponent Sayğac
    vəziyyət say: tam = 0

    göstər()
        qaytar vidjet.sütun(boşluq: 12, məzmun: [
            vidjet.başlıq(mətn: "Sayğac: {özü.say}"),
            vidjet.sətir(boşluq: 8, məzmun: [
                vidjet.düymə(mətn: "−", klik: () => özü.say -= 1),
                vidjet.düymə(mətn: "+", klik: () => özü.say += 1),
                vidjet.düymə(mətn: "Sıfırla", klik: () => özü.say = 0)
            ])
        ])
    son
son

dəyişən p = yeni pəncərə.Pəncərə("Sayğac", 320, 200)
p.məzmun(yeni Sayğac())
p.göstər()
pəncərə.işlət()

Opens in a window — no console output.

25

Async and parallel

Awaiting three jobs at once — three times faster than in sequence.

Web & desktop
24-asinxron.alq alqor
// Asinxron funksiyalar: ardıcıl və paralel gözləmə
gətir vaxt

asinxron funksiya yüklə(ad: mətn, ms: tam) -> mətn
    gözlə vaxt.gözlə(ms)
    qaytar "{ad} hazırdır"
son

asinxron funksiya əsas()
    dəyişən başla = vaxt.ölç()
    dəyişən (a, b, c) = gözlə paralel(yüklə("İstifadəçilər", 300), yüklə("Sifarişlər", 300), yüklə("Hesabat", 300))
    yaz(a)
    yaz(b)
    yaz(c)
    yaz("Paralel: ~{vaxt.ölç() - başla:.1} san (ardıcıl olsaydı ~0.9 san)")
son
Example run
Output output
İstifadəçilər hazırdır
Sifarişlər hazırdır
Hesabat hazırdır
Paralel: ~0.3 san (ardıcıl olsaydı ~0.9 san)
26

Query language

Filtering, sorting and grouping orders by city.

New in 2.5
25-sorgu.alq alqor
// 2.5 · Sorğu dili: süzmək, sıralamaq, qruplamaq
struktur Sifariş
    qurucu(açıq xassə müştəri: mətn, açıq xassə şəhər: mətn, açıq xassə məbləğ: tam)
son

dəyişən sifarişlər = [
    Sifariş("Aysel", "Bakı", 120), Sifariş("Murad", "Gəncə", 45),
    Sifariş("Leyla", "Bakı", 300), Sifariş("Elçin", "Şəki", 80),
    Sifariş("Nigar", "Gəncə", 210)
]

dəyişən böyüklər = sorğu hər s üçün sifarişlər içində
    harada s.məbləğ >= 100
    sırala s.məbləğ azalan
    seç "{s.müştəri} ({s.məbləğ} AZN)"
son
yaz(böyüklər)

dəyişən şəhərlər = sorğu hər s üçün sifarişlər içində
    qrupla s.şəhər olaraq (şəhər, qrup)
    sırala şəhər
    seç "{şəhər}: {qrup.çevir((x) => x.məbləğ).cəm()} AZN"
son
yaz(şəhərlər)
Output
Output output
["Leyla (300 AZN)", "Nigar (210 AZN)", "Aysel (120 AZN)"]
["Bakı: 420 AZN", "Gəncə: 255 AZN", "Şəki: 80 AZN"]
27

Units of measure

Speed, distance and file size — error-free maths with units.

New in 2.5
26-olcu-vahidleri.alq alqor
// 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əhd et
    yaz(5 km + 3 san)
tut (x: VahidXətası)
    yaz("Xəta tutuldu: {x.mesaj}")
son
Output
Output output
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.alq alqor
// 2.5 · Nəticə tipi və ? operatoru: istisnasız xəta idarəsi
funksiya ədədə(m: mətn) -> Nəticə
    cəhd et
        qaytar Uğur(m kimi tam)
    tut (x)
        qaytar Uğursuz("`{m}` ədəd deyil")
    son
son

funksiya cəm(a: mətn, b: mətn) -> Nəticə
    qaytar Uğur(ədədə(a)? + ədədə(b)?)
son

hə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}")
    son
son

yaz(ədədə("abc").dəyərVəYa(0))
Output
Output output
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.alq alqor
// 2.5 · Sınaq blokları: proqramla eyni faylda testlər
funksiya endirim(qiymət: onluq, faiz: tam) -> onluq
    tələb faiz >= 0 və faiz <= 100, "faiz 0–100 arası olmalıdır"
    qaytar qiymət * (100 - faiz) / 100
son

yaz(endirim(200, 15))           // adi icra — 170.0

sınaq "endirim düzgün hesablanır"
    gözlənilir endirim(200, 15) == 170.0
    gözlənilir endirim(99, 0) == 99.0
son

sınaq "yanlış faiz rədd edilir"
    gözlənilir xəta ÖnŞərtXətası: endirim(100, 150)
son
Output
Output output
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.alq alqor
// 2.5 · Aktyor: vəziyyəti kilidsiz qoruyan obyekt
aktyor Sayğac
    xassə dəyər = 0

    metod artır(n: tam) -> tam
        özü.dəyər += n
        qaytar özü.dəyər
    son
son

dəyişən s = Sayğac()
hər i üçün 1..5 içində
    s.artır(i)                  // mesaj — cavab gözlənilmir
son
yaz("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
Output
Output output
Son dəyər: 15
kanaldan: salam
kanaldan: dünya