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 будет доступна в терминале.
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Интерпретатор выполнит скрипт и завершит работу.
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.