Официальная документация — от нуля до первой веб- и десктоп-программы.
1Что такое Alqor?
Alqor — язык программирования, полностью написанный на азербайджанском. Ключевые слова, сообщения об ошибках и документация — на родном языке.
В коде ниже нет ни одного английского слова — əgər вместо if, yaz вместо print. И буквы ə, ı, ş работают полностью.
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
На Alqor можно писать консольные программы, сайты и API, десктоп-приложения и библиотеки — всё на одном языке, одном синтаксисе.
Скачайте Alqor с vuqar.pro/hub (Windows, Linux, macOS) или начните изучать язык по этому руководству.
2Первая программа
Создайте файл с именем salam.alq и напишите в нём:
salam.alqalqor
yaz("Salam, dünya!")
Затем запустите:
terminalbash
alqor işlət salam.alq
nəticəoutput
Salam, dünya!
Чтобы попробовать без создания файла, есть интерактивный режим (REPL):
terminalbash
alqor söhbət
Азербайджанские буквы: в Alqor Studio просто печатайте ASCII — набираете eger, получается əgər. Или клавиши ;e → ə, ;s → ş.
3Переменные и типы
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
Для многих вариантов — seç (выбор):
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
5Циклы
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
6Функции
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
8Классы
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()
Наследование и переопределение метода:
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
9Обработка ошибок
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
Своя ошибка и проверка условия:
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
10Веб-сервер
Веб-сервер, работающий всего в пять строк:
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()
Компонент с состоянием — тот же код работает и в вебе:
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
12Формы с суффиксамиНовое2.5
В азербайджанском языке слова связывают падежные суффиксы. Alqor принимает их как синтаксис: диапазон можно записать как 1-dən 5-ə qədər («от 1 до 5») — оба конца включены, для убывающего диапазона шаг -1 ставится автоматически.
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]
Вызов метода можно записать и в порядке слов азербайджанского предложения: сначала дополнение, затем объект с падежным суффиксом, в конце глагол. Завершающее et — вспомогательное слово.
Дефис пишется слитно: 1-dən. С пробелами n - a — всегда вычитание.
13Запрос — sorğu hər … sonНовое2.5
Запрос к коллекциям, читающийся по-азербайджански: фильтрация (harada), сортировка (sırala), группировка (qrupla) и выбор результата (seç) в одном выражении. Результат всегда список.
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)"]
Группировка — qrupla açar olaraq (k, q). Также поддерживаются seç fərqli, ilk n, atla n и несколько источников hər.
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"]
14Единицы измеренияНовое2.5
Число с названием единицы становится величиной. Несовместимые единицы не складываются — ошибки вроде сложения km и san (секунд) сразу дают VahidXətası.
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
Есть единицы длины (mm…km, mil), массы (q, kq, ton), времени (ms…həftə) и данных (B…TB). Составные единицы пишутся без пробелов: 90 km/saat, 9.8 m/san^2.
15Тип Nəticə и оператор ?Новое2.5
Возвращайте результат как значение вместо исключения: Uğur(dəyər) (успех) или Uğursuz(xəta) (неудача). Эти типы встроены — gətir не нужен.
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
Методы: uğurludur(), dəyərVəYa(), çevir(), zəncirlə(), aç(). ifadə? распаковывает результат или сразу возвращает неудачу из функции:
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
16Контракты — tələb и zəmanətНовое2.5
Первые инструкции функции могут задать её контракт: tələb — предусловие, проверяемое до тела, zəmanət — постусловие, проверяемое при возврате. В zəmanət имя nəticə — возвращаемое значение.
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
При нарушении выбрасывается ÖnŞərtXətası или SonŞərtXətası; обе ловятся через tut (x: MüqaviləXətası).
17ДекораторыНовое2.5
Декоратор — обычная функция, которая принимает функцию (метод, класс) и возвращает вместо неё новое значение. Запись @jurnalla funksiya topla означает 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
Работают декораторы с параметрами (@neçəDəfə(3)), несколько декораторов подряд и декораторы методов. Имя функции читается через f.ad, **lüğət передаёт именованные аргументы.
18МакросыНовое2.5
Макрос — шаблон кода, раскрываемый при разборе: место вызова заменяется телом макроса. Вызов имеет вид ad!(…) — ! отличает макрос от функции. Если последний параметр ad: blok, макрос принимает блок кода.
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
Макросы гигиеничны: имена, объявленные в теле, не конфликтуют с переменными вызывающего кода. Макросы из другого файла подключаются через gətir "./makrolar.alq".
19Акторы и каналыНовое2.5
Актор — объект, защищающий своё состояние: каждый внешний вызов метода — это сообщение, вызывающий сразу получает Gələcək (future), а сообщения обрабатываются по одному в порядке поступления — блокировки не нужны.
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 — FIFO-очередь сообщений между потоками и акторами: göndər (отправить), al (получить), bağla (закрыть). Если отправлять больше некому, взаимная блокировка обнаруживается через 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
20Блоки тестовНовое2.5
Пишите тесты прямо в файле программы, без функций и аннотаций. Блок sınaq "ad" … son пропускается при обычном запуске — его выполняет только alqor sına.
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
При неудаче gözlənilir (ожидание) показывает обе стороны сравнения; gözlənilir xəta Tip: ifadə проверяет, что выражение выбрасывает эту ошибку.
21Библиотеки PythonНовое2.4
Любой модуль Python — стандартная библиотека или пакет PyPI — импортируется напрямую с префиксом python:. Числа, строки, списки, словари, множества и кортежи автоматически преобразуются в обе стороны, функции Alqor можно передавать в 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 ловятся как PythonXətası через cəhd et / tut:
Код компилируется в байт-код и выполняется на виртуальной машине, написанной на Rust: примерно в 100 раз быстрее исполнителя на Python (например, fib 7.5 с → 0.08 с). Исполнитель на Rust входит во все установщики.
В Rust-исполнителе есть модули veb, http, şəbəkə, verilənlər (SQLite), şifrə, csv, toml, xml и другие. Движок по умолчанию пока py; сменить можно через ALQOR_MOTOR=avto.
Запускает программу на быстром исполнителе Rust Новое2.4
Шаблоны новых проектов:
terminalbash
alqor yeni mənim-saytım --şablon veb
alqor yeni mənim-tətbiqim --şablon desktop
alqor yeni mənim-kitabxanam --şablon kitabxana
24Библиотека примеровНовое2.5
Готовые программы, которые можно скопировать и сразу запустить. Каждый пример запущен на Alqor 2.5.1 — результаты ниже взяты из реальных запусков.
Скопируйте код, сохраните в файл (например, proqram.alq) и запустите:
terminalbash
alqor işlət proqram.alq
01
Приветствие и ввод
Запрашивает имя и возраст и отвечает по условию.
Основы
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
Пример запускаРезультатoutput
Adınız: Aysel
Yaşınız: 16
Salam, Aysel!
Yetkinliyə 2 il qalıb.
02
Калькулятор
Четыре действия, выбор через seç и перехват деления на ноль.
Основы
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")
РезультатРезультат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
Фибоначчи
Быстрая рекурсия с @yaddaşla (мемоизация) и бесконечный генератор.
Алгоритмы
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)
Регистр, число слов, разворот, гласные и палиндромы.
Алгоритмы
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"))
РезультатРезультат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
Частота слов
Подсчёт словарём и вывод в порядке убывания.
Алгоритмы
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
РезультатРезультатoutput
1. alma 4 dəfə
2. armud 2 dəfə
10
Оценки студентов
seç с диапазонами, средний балл и лучший результат.
Алгоритмы
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})")
РезультатРезультатoutput
Aysel 95 əla
Murad 72 yaxşı
Leyla 88 yaxşı
Elçin 54 kafi
Orta bal: 77.2
Ən yaxşı: Aysel (95)
11
Игра «Угадай число»
Случайное число, бесконечный цикл и ввод пользователя.
Игры и утилиты
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
Пример запускаРезультат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
Генератор паролей
Надёжный случайный пароль с символами всех типов.
Игры и утилиты
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))
Проверка адресов, поиск и маскировка номеров модулем naxış.
Игры и утилиты
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, "*"))
РезультатРезультат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
Банковский счёт
Скрытое поле, вычисляемое свойство и своя ошибка.
Классы
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
РезультатРезультатoutput
Aysel: 380.0 AZN
Əməliyyat rədd edildi — balans çatmır: 380.0 AZN
16
Фигуры: интерфейс и наследование
Полиморфизм — один метод в разных классах.
Классы
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}")
РезультатРезультатoutput
Dairə sahə = 12.57
Düzbucaqlı sahə = 15.00
Kvadrat sahə = 16.00
Cəm: 43.57
17
Светофор (перечисление)
Автомат состояний на перечислении, sıra() и hamısı().
Классы
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ı()}")
РезультатРезультатoutput
QIRMIZI → Dayan
YAŞIL → Keç
SARI → Hazırlaş
QIRMIZI → Dayan
Bütün vəziyyətlər: [QIRMIZI, YAŞIL, SARI]
18
Запись и чтение файлов
Запись, дозапись, построчное чтение и удаление.
Файлы и данные
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)}")
РезультатРезультатoutput
1: Alqor ilə ilk qeyd
2: İkinci qeyd
3: Üçüncü qeyd
Ölçü: 48 bayt
Fayl qalıbmı? yanlış
Скорость, расстояние и размер файла — расчёты без ошибок.
Новое в 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
РезультатРезультат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
Тип Nəticə и ?
Обработка ошибок без исключений: Uğur / Uğursuz и оператор ?.
Новое в 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))
РезультатРезультатoutput
2 + 3 = 5
Xəta: `x` ədəd deyil
0
29
Блоки тестов и контракт
Тесты в том же файле, что и программа; предусловие tələb.
Новое в 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
РезультатРезультат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
Актор и канал
Состояние без блокировок и очередь сообщений.
Новое в 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