Формулирайте собствена тема за проект (по желание)

Curry-нат Lisp

Curry-нат Lisp

от Павел Атанасов -
Number of replies: 2

Бих искал за проект да направя вариация на проекта "Интерпретатор на Scheme". Става дума за интерпретатор на lisp-ов език, но със драстично различни семантики от Scheme. Мисля си за lisp, който пак да е динамично типизиран, но да има само fixed arity функции, което да позволява curry-ване, както в хаскел. Това обезсмисля наличието на функции като `apply` и затова не съм сигурен как точно ще се държи останалата част на езика и дали ще загуби lisp-овият си чар.

Оставам на разположение за коментари, промени и допълнения.

In reply to Павел Атанасов

Re: Curry-нат Lisp

от Трифон Трифонов -
Звучи обещаващо, може ли да подготвиш кратко описание (до 1 страница)?
In reply to Трифон Трифонов

Re: Curry-нат Lisp

от Павел Атанасов -
Предложение за проект "Интерпретратор на Curry-нат Lisp".

Целта на този проект е да се напише интерпретатор на език, слабо наподобяващ `Scheme` и `Fennel`/`Clojure`. Врътката е обаче, че няма да има `n`-арни функции, а само такива с констанен брой аргумент. Това ограничение влече обезсмислянето на неща като `apply` от `Scheme`, но дава възможност за нова функционалност - `curry`-ване.

В `Scheme`, при извикване на `k`-арна функция с различен от `k` на брой аргументи интерпретора се шашка и казва, че не знае какво да прави. В `Crisp` обаче (WIP име), ако извикаме `k`-арна фунцкия с `k-m` аргумента (`m \in [0,k)`) то ще имаме резултат от това оценяване и то ще бъде нова анонимна функция с `m` аргумента, след получаването на които ще се оцени до оригиналната функция с всичките ѝ аргументи.

Примерно (примерен синтаксис, не е финален):
crisp
(let ([foldr (fn [op nv l]
(cond
[(null? l) nv]
[otherwise (op (car l)
(foldr op nv (cdr l)])
[sum (foldr + 0)])
(sum [1,2,3,4,5])) ;; -> 15

Подобно на проекта "Интерпретатор на Scheme", тук също ще бъдат имплементирани специалните форми `define`, `lambda`, `if`, `cond` или поне техни алтернативи (във `Fennel` `if` играе ролята и на `cond`; ползва се `fn` и за `define`, и за `lambda`, т.н.).
Заедно с това се планира имплементация на `REPL` и минимална стандарна библиотека, представяща възможностите на езика.
За реализация на интерпретатора се предвижда имплементацията и използването на вътрешна Parser Combinator библиотека, която (опционално) би поддържала диагностики за това къде и защо даден код не би бил parse-нат.