Skip to content
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PLIC

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

Особенности

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

Требования

  • Rust (стабильная версия 1.70 или новее)
  • Cargo (входит в Rust)

Установка

Быстрая установка (скрипт)

В корне репозитория выполните:

chmod +x install.sh
./install.sh

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

Ручная сборка

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

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

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

REPL (интерактивный режим)

plic

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

Пример:

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

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

>>> if x > 0:
...     show $ "positive"
... else:
...     show $ "non-positive"

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

Передайте имя файла с расширением .plic:

plic script.plic

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

Встроенные команды в REPL

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

Примеры

Математика и функции

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

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

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

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

show $ [x * x for x in [1..10] if x % 2 == 0]   # [4, 16, 36, 64, 100]

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

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

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

# терминал 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()   # покажет сообщение от Алисы

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

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

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

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

About

programming language implementation competition

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages