Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Piton

Piton - інтерпретована мова програмування з українським синтаксисом у трансліті. Вона написана на Go і орієнтована на навчання, швидкі експерименти та демонстрацію того, як влаштовані інтерпретатори.

Коротко про мову:

  • змінні оголошуються простим =
  • блоки керуються відступами
  • умови пишуться через yaksho / inackshe
  • цикл у мові зараз один: poky
  • функції створюються через functia
  • колекції: spysok ([]) і slovnyk ({})
  • є вбудовані функції на кшталт dovzhyna(), dodaty(), delete(), vypadkovo()
  • через CLI можна не лише запускати код, а й будувати SVG-блок-схеми

Бінарники можна або зібрати локально з вихідного коду, або просто скачати з Releases для актуальних платформ Linux, macOS і Windows.

Minimalnyi pryklad

profil = {"imya": "Mavka", "mista": ["Lviv", "Kyiv"]}
profil["rol"] = "moderator"
delete(profil, "rol")

drukuvaty profil["imya"]
drukuvaty profil

Shcho chytaty dаly

Якщо ти тільки починаєш:

  1. Shvydkyi Start
  2. Tur po Movi
  3. Bazovyi Syntaksys
  4. Spysok і Slovnyk
  5. Vbudovani Funktsii

Якщо тобі потрібен інструментальний бік проєкту:

Yak vyhlyadaye kod u vizualizatori

Нижче - реальна SVG-схема, згенерована з examples/session-tracker.piton.

Vizualizatsiya session-tracker

Shvydkyi Start

Найкоротший шлях до першого запуску:

  1. Скачати бінарник з Releases
  2. Запустити REPL:
./piton

Або запустити відразу готовий приклад:

./piton examples/slovnyk-demo.piton

Якщо хочеш саме зібрати інтерпретатор самостійно з вихідного коду, дивись Vstanovlennya ta CLI.

Naiprostisha programa

drukuvaty "Pryvit, svite!"

Запуск:

./piton hello.piton

Shcho vazhlyvo z pershykh khvylyn

  • відступи мають значення
  • змінні створюються при першому присвоєнні
  • числа всередині мови працюють як числа з плаваючою крапкою
  • для списків і словників є індексація через []
  • якщо запустити ./piton без файла, відкриється REPL

Pryklad zi zminnymy, umovoyu i tsyklom

values = [1, 2, 3]
i = 0

poky i < dovzhyna(values):
    yaksho values[i] > 1:
        drukuvaty "bilshe za odyn"
    inackshe:
        drukuvaty "odyn abo menshe"
    i = i + 1

Hotovi skrypty v repozytorii

  • examples/session-tracker.piton
  • examples/spysok-demo.piton
  • examples/slovnyk-demo.piton
  • examples/vykorystaty-demo.piton
  • examples/chas-demo.piton

Найкращий наступний крок - Tur po Movi.

Tur po Movi

Цей розділ проходить по головних можливостях Piton на одному компактному прикладі.

sessions = [35, 40, 28]
target = 40

functia classify(value):
    yaksho value > target:
        vernuty "bilshe za plan"
    inackshe:
        vernuty "v mezhakh planu"

i = 0
poky i < dovzhyna(sessions):
    current = sessions[i]
    drukuvaty current
    drukuvaty classify(current)
    i = i + 1

Shcho tut vidbuvayetsya

  1. sessions - це список чисел.
  2. target - звичайна змінна.
  3. functia classify(value): оголошує функцію з одним параметром.
  4. yaksho ... inackshe працює як if/else.
  5. poky виконує тіло циклу, поки умова істинна.
  6. dovzhyna(sessions) повертає кількість елементів у списку.
  7. sessions[i] читає елемент за індексом.

Mentalna model movy

Piton варто сприймати як невелику динамічну мову з такими правилами:

  • усе крутиться навколо виразів, присвоєнь і викликів функцій
  • колекції мутабельні: елементи списків і словників можна змінювати
  • типи перевіряються під час виконання, а не на етапі парсингу
  • помилки не кидають винятки у стилі Python, а друкуються повідомленням інтерпретатора

Після цього розділу переходь до Bazovyi Syntaksys або одразу до Operatory ta Porivnyannya.

Vstanovlennya ta CLI

Hotovi binarnyky z Releases

Найпростіший варіант - скачати готовий бінарник з Releases репозиторію.

У релізах публікуються збірки для:

  • Linux
  • macOS
  • Windows
  • архітектур amd64 та arm64

Після завантаження достатньо розпакувати файл і запускати piton напряму.

Zbirka z vykhidnoho kodu

git clone https://github.com/OlexiyOdarchuk/piton.git
cd piton
go build -o piton ./cmd/piton

Zapusk skrypta

./piton script.piton

Osnovni rezhymy CLI

  • ./piton file.piton - виконання програми
  • ./piton -draw file.piton - блок-схема для одного файла
  • ./piton -all file.piton - блок-схема для проєкту з імпортами
  • ./piton -draw -split file.piton - окремий SVG для кожної функції
  • ./piton -draw -target=myFunc file.piton - схема лише для однієї функції

Korysni detali pro REPL

  • вхід у REPL: ./piton
  • вихід з REPL: exit
  • багаторядкові блоки після рядка з : підтримуються

Zapusk prykladiv

./piton examples/slovnyk-demo.piton
./piton examples/spysok-demo.piton
./piton examples/vypadkovo-demo.piton

CLI зараз орієнтований на дві задачі:

  • виконання .piton файлів
  • генерація SVG-блок-схем

REPL

Piton має інтерактивний режим. Якщо запустити програму без аргументів, відкриється REPL:

./piton

Це зручно для швидких перевірок:

drukuvaty 2 + 3
drukuvaty korin 9
drukuvaty {"a": 1, "b": 2}

REPL корисний для:

  • перевірки синтаксису
  • пробування вбудованих функцій
  • дрібних експериментів із spysok і slovnyk
  • тестування багаторядкових блоків yaksho, poky, functia

Щоб вийти з REPL, введи:

exit

Для більших сценаріїв краще переходити у .piton файл і запускати його через CLI.

Bazovyi Syntaksys

Zminni

Окремого ключового слова для оголошення немає. Перше присвоєння одразу створює змінну:

x = 10
name = "Piton"
ready = true

Булеві значення в мові - це true і false.

Komentari

Однорядковий коментар починається з #:

# tse komentar
drukuvaty "ok"

Vidstupy i bloky

Блоки в Piton задаються відступами, як у Python:

yaksho true:
    drukuvaty "inside"

drukuvaty "outside"

Без правильних відступів програма не розбереться коректно.

Vyrazy

Підтримуються:

  • +, -, *, /
  • stupin
  • >, <, >=, <=, ==, !=
  • ta, abo, ne
drukuvaty 2 + 3
drukuvaty 2 stupin 3
drukuvaty ne false
drukuvaty (2 < 3) ta true

Ryadky

Рядки задаються в подвійних лапках:

msg = "Pryvit"
drukuvaty msg + "!"

+ також уміє конкатенувати рядки з числами та булевими значеннями.

Оператор * теж має спеціальну поведінку: рядок можна повторити числом.

drukuvaty "ha" * 3

Vstup i vyvid

drukuvaty "Vvedy chislo"
vvid x
drukuvaty x

Поточна реалізація vvid читає число. Для рядкового введення окремого режиму поки немає.

Operatory ta Porivnyannya

Aryfmetychni operatory

  • +
  • -
  • *
  • /
  • stupin
drukuvaty 1 + 2
drukuvaty 10 - 3
drukuvaty 4 * 5
drukuvaty 8 / 2
drukuvaty 2 stupin 3

Для рядків:

  • + виконує конкатенацію
  • * у парі string * number або number * string повторює рядок
drukuvaty "hello" + "!"
drukuvaty "ha" * 3
drukuvaty 2 * "go"

Porivnyannya

  • >
  • <
  • >=
  • <=
  • ==
  • !=
drukuvaty 5 > 3
drukuvaty 5 == 5
drukuvaty 3 != 4

Поточна реалізація операторів порівняння орієнтована на числові значення.

Logika

  • ta
  • abo
  • ne
drukuvaty true ta false
drukuvaty true abo false
drukuvaty ne true

ta і abo очікують булеві значення з обох боків.

Prefixni matematychni operatory

Деякі математичні дії виглядають як префіксні оператори:

  • korin
  • loh10
  • abs
  • arksyn
  • kosynus
drukuvaty korin 9
drukuvaty abs -5
drukuvaty loh10 100

Keruvannya Potokom

Yaksho / Inackshe

score = 75

yaksho score >= 90:
    drukuvaty "vidminno"
inackshe yaksho score >= 60:
    drukuvaty "zarakhovano"
inackshe:
    drukuvaty "nezarakhovano"

Для else if використовується форма inackshe yaksho:

yaksho x > 10:
    drukuvaty "big"
inackshe yaksho x > 5:
    drukuvaty "medium"
inackshe:
    drukuvaty "small"

Poky

i = 0

poky i < 3:
    drukuvaty i
    i = i + 1

Умови очікують булеві вирази. Для складніших умов комбінуй ta, abo і ne.

Typovyi pattern dlya spyskiv

У мові зараз немає for, тому обхід списку робиться через poky:

i = 0
poky i < dovzhyna(items):
    drukuvaty items[i]
    i = i + 1

Funktsii

Функція оголошується через functia, повернення значення робиться через vernuty.

functia add(a, b):
    vernuty a + b

drukuvaty add(2, 3)

Parametry i vyklyk

functia repeat(label, count):
    i = 0
    poky i < count:
        drukuvaty label
        i = i + 1

repeat("go", 3)

Povernennya znachennya

functia square(x):
    vernuty x * x

Obsyah vydymosti

Параметри функції обчислюються в місці виклику і передаються в нове локальне оточення. Функція має власний scope, але бачить глобальні значення через зовнішнє оточення.

outer = 10

functia show():
    drukuvaty outer

show()

Funktsii z moduliv

Після vykorystaty "hello" можна викликати функцію через селектор:

hello.Hello("svit")

Rekursiya

Функції можуть викликати самі себе, тобто рекурсія підтримується.

functia fact(n):
    yaksho n <= 1:
        vernuty 1
    inackshe:
        vernuty n * fact(n - 1)

drukuvaty fact(5)

Це працює для задач на кшталт обходу, факторіала або рекурсивної обробки вкладених структур.

Typy Danykh

Piton - динамічно типізована мова. Основні типи значень:

  • float64 для чисел
  • string
  • bool
  • [] для списків
  • {} для словників

Chysla

a = 10
b = 2.5
drukuvaty a / b

Boolean

enabled = true
drukuvaty ne enabled

Доступні обидва значення:

drukuvaty true
drukuvaty false

Ryadky

name = "Piton"
drukuvaty "Hello " + name

Kolektsii

s = [1, "two", true]
m = {"name": "Piton", "year": 2026}

Списки та словники можна вкладати один в одного.

Shcho potribno pamyataty

  • окремих декларацій типів немає
  • одна й та сама змінна може містити різні типи в різний момент часу
  • словники очікують рядкові ключі

Spysok

Список задається через [] і може містити значення різних типів.

s = [1, 2, "tri", true]
drukuvaty s

Dostup za indeksom

s = [10, 20, 30]
drukuvaty s[0]

Індекс має бути цілим числом у межах списку.

Zmina elementa

s = [10, 20, 30]
s[1] = 99
drukuvaty s

Zrizy

Підтримуються:

  • s[start:end]
  • s[:end]
  • s[start:]
  • s[:]
s = [1, 2, 3, 4]
drukuvaty s[1:3]
drukuvaty s[:2]
drukuvaty s[2:]

Dodavannya

dodaty(list, x) додає один елемент або зливає два списки.

a = [1, 2]
b = [3, 4]
drukuvaty dodaty(a, b)
drukuvaty dodaty(a, 5)

Vydalennya elementa

Окремого delete для списків зараз немає. Типовий спосіб - склеїти два зрізи:

s = [1, 2, 3, 4]
trimmed = dodaty(s[:2], s[3:])
drukuvaty trimmed

Slovnyk

Словник задається літералом через {}. Ключі мають бути рядками.

profil = {"imya": "Mavka", "vik": 128}
drukuvaty profil

Chytannya

drukuvaty profil["imya"]

Якщо ключа немає, інтерпретатор надрукує помилку.

Onovlennya i dodavannya

profil["vik"] = 129
profil["rol"] = "moderator"

Vydalennya

Для видалення ключа використовується delete(slovnyk, "key").

profil = {"imya": "Mavka", "vik": 128, "rol": "moderator"}
delete(profil, "rol")
drukuvaty profil

Dovzhyna

drukuvaty dovzhyna(profil)

Typovyi pryklad

profil = {"imya": "Mavka", "vik": 128, "mista": ["Lviv", "Kyiv"]}
profil["rol"] = "moderator"
profil["mista"][0] = "Odesa"
delete(profil, "vik")
drukuvaty profil

Vkladenist

profil = {
    "imya": "Mavka",
    "mista": ["Lviv", "Kyiv"],
    "nalashtuvannya": {"tema": "temna"}
}

drukuvaty profil["nalashtuvannya"]["tema"]

Vbudovani Funktsii

Цей розділ описує все, що вже реалізовано в інтерпретаторі як builtin або спеціальний оператор.

Matematyka

  • korin x
  • loh10 x
  • abs x
  • arksyn x
  • kosynus x
  • zaokruhlennya(x, precision)
  • stupin як інфіксний оператор
drukuvaty korin 9
drukuvaty loh10 100
drukuvaty 2 stupin 3
drukuvaty zaokruhlennya(123.4567, 2)

korin, loh10, abs, arksyn, kosynus поводяться як префіксні оператори. zaokruhlennya() викликається як звичайна функція.

Kolektsii

  • dovzhyna(x) для списків і словників
  • dodaty(list, itemOrList) для списків
  • delete(slovnyk, key) для словників
s = [1, 2]
s = dodaty(s, 3)
drukuvaty dovzhyna(s)

m = {"a": 1, "b": 2}
delete(m, "a")
drukuvaty m

Chas i vypadkovist

  • vypadkovo(max) повертає випадкове число з проміжку [0, max)
  • vypadkovo(min, max) повертає число з проміжку [min, max)
  • vypadkovo(list) повертає випадковий елемент списку
  • chas()
  • zatrymka(seconds)
drukuvaty chas()
drukuvaty vypadkovo(10)
drukuvaty vypadkovo(5, 10)
drukuvaty vypadkovo([10, 20, 30])

chas() повертає час у секундах як число. zatrymka(x) призупиняє виконання.

Kolory

kolor(name, value) повертає ANSI-рядок для кольорового друку.

drukuvaty kolor("red", "uvaha")
drukuvaty kolor("bright_cyan", 123)

Назва кольору має бути рядком. Якщо термінал не підтримує ANSI або NO_COLOR увімкнений, колір може не відобразитися.

Доступні назви кольорів:

  • black, red, green, yellow, blue, magenta, cyan, white
  • bright_black, bright_red, bright_green, bright_yellow
  • bright_blue, bright_magenta, bright_cyan, bright_white

Importy

Імпорт у Piton робиться через vykorystaty.

Import za ryadkom

vykorystaty "hello"
hello.Hello("svit")

Import za identyfikatorom

vykorystaty hello
hello.Hello("svit")

Інтерпретатор доповнює шлях суфіксом .piton, виконує файл і створює модульне оточення.

Yak tse pratsyuye

Після імпорту:

  • модуль доступний під своїм ім’ям, наприклад hello.Hello(...)
  • функції з модуля також можуть потрапити в глобальний простір, якщо там ще немає такого імені

Pryklad iz repozytoriyu

Файл examples/vykorystaty-demo.piton імпортує локальний файл hello.piton із тієї ж директорії і звертається до функцій через модуль:

vykorystaty hello

functia Hi():
    drukuvaty "this is MY HI FUNCTIA"
    hello.Hello("world")
    hello.Hi("world!")

Hi()

Obmezhennya

  • шлях імпорту доповнюється .piton
  • модульний механізм простий: це не пакетний менеджер і не ізольована система namespace-ів
  • якщо файл не читається, інтерпретатор надрукує помилку читання

Vizualizator

Piton уміє не тільки виконувати код, а й будувати SVG-блок-схеми.

Komandy

./piton -draw ./main.piton
./piton -all ./main.piton
./piton -draw -split ./main.piton
./piton -draw -target=myFunc ./main.piton

Shcho robyt

  • збирає AST програми
  • може підтягувати імпортовані модулі
  • будує окремі схеми для функцій або загальну схему програми

Це корисно для навчання, рев’ю логіки та демонстрації алгоритмів.

Pryklad: povna skhema prohramy

Нижче - згенерована схема для examples/session-tracker.piton.

Session tracker flowchart

Pryklad: skhema proyektu z importamy

Нижче - згенерована схема для examples/vykorystaty-demo.piton, побудована через -all, тобто разом з імпортованим модулем.

Imports project flowchart

Pryklad: okrema funktsiya u split-rezhymi

-split корисний, коли повна схема завелика. Ось окрема функція average із session-tracker:

Average function flowchart

І ще одна окрема функція deviation:

Deviation function flowchart

Koly shcho vykorystovuvaty

  • -draw - коли працюєш з одним файлом
  • -all - коли хочеш бачити програму разом з імпортами
  • -split - коли функцій багато і потрібні окремі діаграми
  • -target=name - коли треба проаналізувати тільки одну функцію

SVG, які бачиш у цій книжці, згенеровані реальним piton з прикладів репозиторію, а не намальовані вручну.

Piton z Go

Piton можна використовувати як Go-бібліотеку.

Vykonannya kodu

package main

import (
	"fmt"
	"os"

	"github.com/OlexiyOdarchuk/piton/pkg/interpreter"
)

func main() {
	code := `
x = 10
y = 20
drukuvaty x + y
`

	if err := interpreter.Run(code, os.Stdout); err != nil {
		fmt.Println("Pomylka vikonannya:", err)
	}
}

Generatsiya SVG z Go

package main

import (
	"fmt"
	"os"

	"github.com/OlexiyOdarchuk/piton/pkg/visualizer"
)

func main() {
	code := `
functia main():
    drukuvaty "hello"

main()
`

	images, err := visualizer.Visualize(code, "", false)
	if err != nil {
		panic(err)
	}

	for name, svg := range images {
		_ = os.WriteFile(name, svg, 0644)
		fmt.Println("saved:", name)
	}
}

Це зручно для:

  • IDE-утиліт
  • навчальних платформ
  • генерації схем у CI
  • вбудовування Piton як DSL у Go-проєкт

Cookbook

Нижче - короткі рецепти, які часто потрібні при роботі з мовою.

Proitysya po spysku

i = 0
poky i < dovzhyna(items):
    drukuvaty items[i]
    i = i + 1

Vydalyty element zi spysku

s = [1, 2, 3, 4]
idx = 1
s = dodaty(s[:idx], s[idx + 1:])
drukuvaty s

Dodaty pole do slovnyka

user = {"name": "Piton"}
user["role"] = "admin"

Vydalyty klyuch zi slovnyka

user = {"name": "Piton", "role": "admin"}
delete(user, "role")

Vypadkovyi element zi spysku

options = ["red", "green", "blue"]
drukuvaty vypadkovo(options)

Okruglyty rezultat

pi = 22 / 7
drukuvaty zaokruhlennya(pi, 3)

Rekursyvnyi factorial

functia fact(n):
    yaksho n <= 1:
        vernuty 1
    inackshe:
        vernuty n * fact(n - 1)

drukuvaty fact(5)

Onovyty vkladene znachennya

profile = {"settings": {"theme": "light"}}
profile["settings"]["theme"] = "dark"

Pomylky ta Obmezhennya

Piton навмисно повертає нестандартні, “характерні” повідомлення про помилки. Це частина стилю мови.

Типові причини помилок:

  • невідоме ім’я змінної
  • неправильний тип для оператора
  • індекс поза межами списку
  • неіснуючий ключ словника
  • неправильна кількість аргументів функції

Pryklady sytuatsii

  • m["missing"] для відсутнього ключа в словнику
  • s[100] для списку з трьох елементів
  • delete([1, 2], "a")
  • dodaty({"a": 1}, 2)
  • true ta 1

Potochni obmezhennya

  • числа всередині інтерпретатора працюють як float64
  • ключі slovnyk мають бути рядками
  • логічні оператори ta / abo очікують bool
  • dodaty() працює тільки зі списками
  • delete() працює тільки зі словниками
  • vvid зараз читає число
  • повноцінного for-циклу поки немає
  • drukuvaty nil окремого літерала не має, а nil може з’являтися як внутрішнє значення результату деяких операцій

Якщо документація і реалізація розійшлися, джерелом істини вважається код та тести репозиторію.

Pryklady

У репозиторії вже є готові сценарії, які зручно використовувати як живу документацію:

  • examples/hello.piton - мінімальний старт
  • examples/session-tracker.piton - базовий потік програми
  • examples/spysok-demo.piton - робота зі списками
  • examples/dodaty-demo.piton - злиття списків і зрізи
  • examples/slovnyk-demo.piton - словники, вкладені значення, delete()
  • examples/vypadkovo-demo.piton - випадкові значення
  • examples/vykorystaty-demo.piton - модулі та імпорти
  • examples/chas-demo.piton - chas(), zatrymka(), округлення

Rekomendovanyi maršrut

  1. examples/hello.piton
  2. examples/spysok-demo.piton
  3. examples/slovnyk-demo.piton
  4. examples/vykorystaty-demo.piton
  5. examples/session-tracker.piton

Koryst ne tilky yak demo

Ці файли зручні ще й як тестовий набір для ручної перевірки:

  • запуск виконання
  • генерація SVG
  • перевірка імпортів
  • перевірка колекцій та builtins
  • швидка звірка документації з реальною поведінкою мови

Для швидкої перевірки будь-якого прикладу:

./piton examples/slovnyk-demo.piton