Skip to content
Open

Plic #14

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
[package]
name = "plic"
version = "3.2.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
base64 = "0.21"
chrono = "0.4"
once_cell = "1.19"
native-tls = "0.2"
reqwest = { version = "0.11", features = ["blocking", "json"] }
rustyline = "10.0"
hex = "0.4"
sha2 = "0.10"
pqcrypto-kyber = "0.7"
pqcrypto-traits = "0.3"
rand = "0.8"
rcgen = "0.10"
anyhow = "1.0"
thiserror = "1.0"
aes-gcm = "0.10"
codespan = "0.11"
codespan-reporting = "0.11"
ctrlc = "3.4"

[[bin]]
name = "plic"
path = "src/main.rs"
187 changes: 118 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,103 +1,152 @@
# plic (langjam)
## Цель
# PLIC

Разработать язык программирования и реализовать на нём многопользовательский чат.
**PLIC** — это динамический язык программирования, сочетающий функциональное, императивное и объектно‑ориентированное программирование. Встроенная поддержка P2P‑сообщений и файлового обмена позволяет использовать его как платформу для децентрализованных чат‑приложений.

---
## Особенности

## Что нужно сделать
- **Каррирование** всех функций (как в Haskell).
- **Единый числовой тип `Num`** (Int и Float автоматически объединены).
- **Блоки на основе отступов** (как в Python) вместо фигурных скобок.
- **Списковые включения** (`[expr for x in iterable if cond]`).
- **Цикл `loop` и оператор `break`** (с возвратом значения).
- **Клиент‑серверная модель чата** (сервер хранит только контакты, вся история локальна).
- **Упоминания** (`@user`) в сообщениях.
- **F‑строки** с подсветкой выражений внутри `{}`.
- **Подробные отчёты об ошибках** с указанием файла, строки, столбца и фрагментом кода.

### 1. Язык программирования
- Придумать синтаксис и семантику
- Написать компилятор или интерпретатор
- Обеспечить работу на выбранной платформе
## Требования

### 2. Проект на этом языке — Чат-комната
- Пользователи могут подключаться к чату
- Отправлять сообщения всем участникам
- Видеть историю сообщений
- Выходить из чата
- [Rust](https://rustup.rs/) (стабильная версия 1.70 или новее)
- Cargo (входит в Rust)

---
## Установка

## Технические требования
### Быстрая установка (скрипт)

### Платформа
- **Приоритет** — AtomVM (Erlang-совместимая виртуальная машина): https://atomvm.org/
- Допустимы альтернативы (JVM, .NET, CPython, собственная VM и т.д.)
В корне репозитория выполните:

### Язык должен поддерживать
- Переменные и типы данных
- Условные конструкции
- Циклы или рекурсию
- Функции/процедуры
- Работу с коллекциями (списки, массивы, словари)
```bash
chmod +x install.sh
./install.sh
```

Дополнительные фишки будут плюсом
Скрипт соберёт проект в режиме `release` и установит исполняемый файл в `/bin/plic` (потребуются права sudo).

### Чат должен поддерживать
- Добавление пользователя
- Отправка сообщения всем участникам
- Просмотр последних N сообщений (история)
- Удаление пользователя (выход из чата)
### Ручная сборка

---
```bash
cargo build --release
sudo cp target/release/plic /bin/plic
```

## Критерии оценки
После этого команда `plic` будет доступна в терминале.

| Критерий | Баллы | Описание |
|----------|-------|----------|
| Работоспособность | 5 | Код запускается и выполняет базовые функции чата |
| Дизайн языка | 5 | Синтаксис логичен, выразителен, удобен |
| Архитектура | 5 | Использование процессов/акторов, продуманность структуры |
| Качество кода | 3 | Читаемость, обработка ошибок |
| Креативность | 2 | Нестандартные решения, дополнительные фичи |
## Использование

**Максимальный балл:** 20
### REPL (интерактивный режим)

---
```bash
plic
```

## Дополнительные возможности (приветствуются)
Появится приглашение `>>>`. Вводите выражения, результаты выводятся с помощью встроенной функции `show`.

- Комнаты / приватные сообщения
- Таймстемпы сообщений
- Имена пользователей
- Сохранение истории между сессиями
- Визуальный интерфейс (консольный или графический)
- Команды (/help, /kick, /clear)
- Авторизация пользователей
Пример:

---
```
>>> let square x = x * x
>>> show $ square 5
25
>>> f"2 + 2 = {2 + 2}"
"2 + 2 = 4"
```

## Требования к сдаче
Многострочные блоки оформляются через двоеточие и отступ:

- [ ] Исходный код языка (компилятор/интерпретатор)
- [ ] Исходный код чата на этом языке
- [ ] Инструкция по запуску (1–2 абзаца)
- [ ] Краткое описание языка (синтаксис, особенности)
```
>>> if x > 0:
... show $ "positive"
... else:
... show $ "non-positive"
```

---
### Запуск скриптов

## Как сдавать
Форкайте репозиторий -> добавляете директорию с названием вашего языка и выгружаете в нее проект -> делаете pull request
Передайте имя файла с расширением `.plic`:

```bash
plic script.plic
```

## Дедлайн
Интерпретатор выполнит скрипт и завершит работу.

**Дата и время:** 20 июля
### Встроенные команды в REPL

---
- `exit()` – завершить сеанс.
- `load "файл.plic"` – выполнить скрипт в текущем окружении (определения сохраняются).

## Приз
## Примеры

5000 RUB
### Математика и функции

---
```plic
let add a b = a + b
let inc = add 1
show $ inc 10 # 11
show $sqrt 16 # 4.0
```

## Контакты
### Работа со списками и множествами

По всем вопросам: @k1ngmang (telegram)
```plic
let numbers = [1, 2, 3, 4, 5]
show $ map (lambda x -> x * 2) numbers # [2, 4, 6, 8, 10]
show $ filter (lambda x -> x > 2) numbers # [3, 4, 5]
let s = %[1, 2, 3]
show $ setContains s 2 # true
```

---
### Списковые включения

**Удачи!**
```plic
show $ [x * x for x in [1..10] if x % 2 == 0] # [4, 16, 36, 64, 100]
```

### Классы и объекты

```plic
class Counter = (val = Num; inc(self) = self { val = self.val + 1 }; get(self) = self.val)
let c = new Counter(0)
show $ c.inc().get() # 1
```

### Чат: запуск сервера и подключение

```plic
# терминал 1 (сервер)
serverStart("127.0.0.1:9000", "secret")
setExternalIP("203.0.113.5") # если нужен внешний IP

# терминал 2 (Алиса)
login(@alice)
connect("127.0.0.1:9000", @alice, "secret")
newChat("general", [@bob, @alice])
sendChat("general", "Hello everyone!")

# терминал 3 (Боб)
login(@bob)
connect("127.0.0.1:9000", @bob, "secret")
inbox() # покажет сообщение от Алисы
```

### Отправка файлов

```plic
sendFile(@bob, "report.txt")
downloads()
saveFile(0, "received.txt")
```

## Документация

Полное описание языка, всех встроенных функций и синтаксиса находится в файле `doc.md`.
Loading