Язык программирования Dark

Добро пожаловать в официальную документацию по языку программирования Dark.

Dark — это современный, динамический язык программирования, созданный для простоты и эффективности. Его синтаксис интуитивно понятен, что делает его отличным выбором как для начинающих, так и для опытных разработчиков. Эта документация поможет вам изучить основы языка, его синтаксис и стандартную библиотеку, чтобы вы могли начать создавать свои собственные программы.

Для удобной разработки на языке Dark рекомендуется использовать официальное расширение для Visual Studio Code, которое предоставляет подсветку синтаксиса, автодополнение и другие полезные функции.

Скачать установщик Dark-0.2.2

Основы синтаксиса

Переменные

Переменные объявляются с помощью оператора присваивания =. Имена переменных могут содержать буквы, цифры и знак подчеркивания, но не могут начинаться с цифры.

my_variable = 10
another_var = "Hello, Dark!"
is_active = true

Типы данных

Операторы

Dark поддерживает стандартные арифметические (+, -, *, /), сравнительные (==, !=, <, >, <=, >=) и логические операторы.

Логические операторы (and / or / not)

Для создания сложных условий используются логические операторы and (логическое И), or (логическое ИЛИ) и not (логическое НЕ).

# Пример с 'and'
if age > 18 and has_license == true then
    println("Можно водить машину")
end

# Пример с 'or'
if is_weekend or is_holiday then
    println("Время отдыхать!")
end

# Пример с 'not'
is_ready = false
if not is_ready then
    println("Ещё не готово.")
end

# Пример not с операторами сравнения
if not (a > b) then
    println("a не больше b")
end

Операторы поддерживают "короткое замыкание" (short-circuiting). Например, в выражении A and B, если A ложно, то B не будет вычисляться.

Управляющие конструкции

If-Then-Else

Условный оператор. Блок else не является обязательным.

if x > 10 then
    println("x is greater than 10")
else
    println("x is not greater than 10")
end

While

Цикл, который выполняется, пока условие истинно.

i = 0
while i < 5 do
    println(i)
    i = i + 1
end

For

Цикл для итерации по элементам списка, строки или ключам словаря.

my_list = [1, 2, 3]
for item in my_list do
    println(item)
end

Обработка ошибок (try...except)

Конструкция try...except позволяет перехватывать ошибки времени выполнения, предотвращая аварийное завершение программы.

try do
    # Код, который может вызвать ошибку
except e do
    # Код, который выполнится в случае ошибки.
    # 'e' - это словарь с информацией об ошибке.
end

Пример:

try do
    result = 10 / 0
except e do
    println("Произошла ошибка: " + e["message"])
end

Импорт модулей

Для использования кода из других файлов (модулей) используется ключевое слово import. Путь к модулю указывается в двойных кавычках. Расширение .dark или .py указывать не нужно.

# Импортируем стандартный модуль os
import "os"

# Импортируем пользовательский модуль из файла my_module.dark
import "my_module"

# Используем функцию из импортированного модуля
os.system("cls")
my_module.my_function()

Функции

Определение пользовательских функций.

function add(a, b) do
    return a + b
end

result = add(5, 3)
println(result) # Выведет 8

Функция может не возвращать значение. В этом случае можно использовать return для досрочного выхода из функции.

function check_age(age) do
    if age < 18 then
        println("Доступ запрещен.")
        return # Досрочный выход из функции
    end
    println("Доступ разрешен.")
end

Комментарии

Однострочные комментарии начинаются с символа #.

# Это комментарий. Он будет проигнорирован.
variable = 1 # Это тоже комментарий.

Директивы

Если в начале фаила будет строка начинающаяся с символа #! - это даст информацию о объявлении директивы.

#!nocache
# Это директива, которая отключает кеширование для этого файла.
# Полезно при разработке, чтобы изменения в файле сразу применялись.

Встроенные функции

print(value) / print()

Выводит значение в консоль без переноса строки. Если вызван без аргументов, ничего не делает.

println(value) / println()

Выводит значение в консоль и добавляет перенос строки. Если вызван без аргументов, просто добавляет перенос строки.

input()

Читает строку текста от пользователя.

to_int(value)

Преобразует значение в целое число. (Рекомендуется использовать конструкцию try...except)

to_str(value)

Преобразует значение в строку.

to_float(value)

Преобразует значение в число с плавающей точкой. (Рекомендуется использовать конструкцию try...except)

type(value)

Возвращает тип значения (например, "string", "number").

Встроенные методы

Некоторые типы данных имеют встроенные методы, которые можно вызывать через точку. Методы — это функции, связанные с конкретным объектом.

Методы строк (String)

"my string".len()

Возвращает количество символов в строке.

"my string".upper()

Возвращает новую строку в верхнем регистре.

"my string".lower()

Возвращает новую строку в нижнем регистре.

" str ".strip()

Удаляет пробельные символы в начале и в конце строки.

"string".startswith(prefix)

Возвращает true, если строка начинается с prefix.

"string".endswith(suffix)

Возвращает true, если строка заканчивается на suffix.

"string".find(substring)

Ищет подстроку и возвращает индекс первого вхождения или -1, если не найдено.

Методы списков (List)

my_list.len()

Возвращает количество элементов в списке.

my_list.append(item)

Добавляет элемент в конец списка.

my_list.pop()

Удаляет и возвращает последний элемент списка.

Методы словарей (Dictionary)

my_dict.len()

Возвращает количество пар ключ-значение в словаре.

my_dict.keys()

Возвращает список всех ключей в словаре.

Стандартная библиотека

Язык Dark поставляется с набором встроенных модулей для выполнения общих задач. Для использования функций модуля, импортируйте его: import "os", а затем вызывайте функции через точку: os.getcwd().

Модуль vsp210

vsp210.history()

Возвращает исторю создателя языка Dark.

vsp210.philosophy()

Возвращает философию языка Dark.(Секретная функция)

vsp210.calculator()

Запускает калькулятор написаный для примера.

vsp210.version()

Возвращает версию языка Dark.

vsp210.docs()

Отправляет пользователя на страницу документации языка Dark.

vsp210.telegram()

Отправляет пользователя в телеграм канал создателя языка Dark.

Модуль http

http.get(url)

Выполняет HTTP GET-запрос и возвращает словарь с `status_code`, `headers` и `body`.

http.post(url)

Выполняет HTTP POST-запрос и возвращает словарь с `status_code`, `headers` и `body`.

Модуль os

os.getcwd()

Возвращает текущую рабочую директорию.

os.path_exists(path)

Проверяет, существует ли путь. Возвращает True или False.

os.mkdir(path)

Создает директорию.

os.rmdir(path)

Удаляет директорию.

os.remove(path)

Удаляет файл.

os.rename(old, new)

Переименовывает файл или директорию.

os.listdir(path)

Возвращает список содержимого директории.

os.getsize(path)

Возвращает размер файла.

os.isdir(path)

Проверяет, является ли путь директорией.

os.system(command)

Выполняет системную команду (например, "cls" или "clear").

os.exit(code)

Завершает выполнение программы с указанным кодом выхода.

Модуль math

math.sqrt(number)

Вычисляет квадратный корень числа.

math.pow(base, exp)

Вычисляет `base` в степени `exp`.

math.floor(number)

Возвращает наибольшее целое число, меньшее или равное `number`.

math.ceil(number)

Возвращает наименьшее целое число, большее или равное `number`.

math.pi()

Возвращает значение числа PI.

math.random()

Возвращает случайное число с плавающей точкой от 0.0 до 1.0.

math.randint(min, max)

Возвращает случайное целое число в диапазоне от min до max включительно.

Модуль stdlib

stdlib.range(start, stop)

Возвращает список чисел в диапазоне от `start` (включительно) до `stop` (не включительно).

stdlib.list_contains(list, item)

Проверяет, содержится ли `item` в `list`.

stdlib.list_join(list, separator)

Объединяет элементы списка в строку с указанным разделителем.

stdlib.dict_get(dict, key, default)

Получает значение из словаря по ключу, с возможностью указать значение по умолчанию.

stdlib.clamp(value, min, max)

Ограничивает значение `value` между `min` и `max`.

stdlib.json_decode(json_string)

Преобразует строку в формате JSON в словарь или список.

stdlib.read_file(path)

Читает содержимое файла и возвращает его в виде строки.

stdlib.write_file(path, content)

Записывает строку content в файл по указанному пути path.

stdlib.str_split(string, separator)

Разделяет строку по указанному разделителю и возвращает список.

stdlib.str_upper(string)

Преобразует строку в верхний регистр.

stdlib.str_lower(string)

Преобразует строку в нижний регистр.

stdlib.str_replace(string, old, new)

Заменяет все вхождения подстроки `old` на `new`.

Модуль time

time.time()

Возвращает текущее время в виде Unix timestamp (число секунд с 1 января 1970 года).

time.sleep(seconds)

Приостанавливает выполнение программы на указанное количество секунд.

Модуль file

Модуль для работы с файлами. Работает с одним файлом за раз. Сначала откройте файл с помощью file.open(), затем используйте функции чтения/записи и не забудьте закрыть его с помощью file.close().

file.open(path, mode)

Открывает файл. mode - это строка, например: "r" (чтение), "w" (запись), "a" (дозапись), "r+" (чтение и запись).

file.read()

Читает все содержимое открытого файла и возвращает его как строку.

file.readline()

Читает одну строку из файла.

file.readlines()

Читает все строки из файла и возвращает их в виде списка.

file.write(content)

Записывает строку content в открытый файл.

file.close()

Закрывает ранее открытый файл.

Модуль gui

Простой модуль для создания графических интерфейсов на основе Tkinter.

gui.create_window(title, width, height)

Создает главное окно приложения с указанным заголовком и размерами.

gui.create_label(text)

Создает и размещает текстовую метку в окне.

gui.create_button(text, command)

Создает кнопку. command - это имя функции (в виде строки), которая будет вызвана при нажатии.

gui.create_entry()

Создает поле для ввода текста.

gui.get_entry_value()

Возвращает текст, введенный в поле ввода (созданное через create_entry).

gui.set_label_text(text)

Изменяет текст метки (созданной через create_label).

gui.run_app()

Запускает главный цикл обработки событий GUI. Эта функция должна вызываться в конце скрипта.

Python-расширения

Одной из самых мощных возможностей Dark является способность подключать модули, написанные на Python. Это открывает доступ ко всей экосистеме библиотек Python.

Структура проекта

Для использования расширений создайте папку dark_extensions в корне вашего проекта. В эту папку помещайте ваши .py файлы-модули.

my_project/
├── dark_extensions/
│   └── math_ext.py
├── my_script.dark
└── ...

Создание модуля-расширения

Каждый Python-файл расширения должен содержать функцию get_module(). Эта функция должна возвращать словарь, где ключи — это имена, которые будут доступны в Dark, а значения — это соответствующие функции или переменные из Python.

Все функции, предназначенные для вызова из Dark, должны принимать один аргумент — список (list) переданных параметров.

Пример: dark_extensions/math_ext.py

import math

# Функция принимает список аргументов от Dark
def power(args):
    if len(args) != 2:
        raise TypeError("pow() expects 2 arguments")
    return math.pow(args[0], args[1])

# Эта функция будет вызвана интерпретатором Dark
def get_module():
    return {
        "pi": math.pi,      # Экспорт переменной
        "pow": power        # Экспорт функции
    }

Использование в Dark

Импортируйте ваше расширение как обычный модуль и используйте его содержимое.

import "math_ext"

println("Число PI из Python: " + math_ext.pi)

# Вызываем функцию из Python, передавая аргументы
# В Python они придут как список [2, 8]
result = math_ext.pow(2, 8) 
println("2 в степени 8 = " + result) # Выведет 256.0