Назад
Дружній вступ до Racket: сучасна мова родини Lisp
SiTech AI Team3 წთ. საკითხავი

Дружній вступ до Racket: сучасна мова родини Lisp

У блозі geometridae.bearblog.dev опубліковано дружній туторіал із Racket — мови, що продовжує традицію Lisp з 1958 року і дозволяє читачеві наприкінці написати власний синтаксис.

Дружній вступ до Racket — сучасної спадкоємиці однієї з найстаріших і найсвоєрідніших родин програмування — опубліковано в блозі geometridae.bearblog.dev. Обіцянка автора проста: наприкінці туторіалу читач уже писатиме власний синтаксис.

Від Lisp до Scheme і Racket

Lisp створив 1958 року Джон Маккарті в MIT. Це друга найстарша мова високого рівня, яка досі використовується: її випереджає лише Fortran (1957) — на один рік. Python з'явився 1991 року, JavaScript — 1995-го.

Саме в Lisp народилися ідеї, які сьогодні називають сучасними: збирач сміття, функції як значення першого класу, цикл REPL, умовні вирази, що повертають значення, та гомоіконічність — властивість, коли код сам є структурою даних мови. У 1970–80-х Lisp виконувався навіть безпосередньо на апаратурі: Lisp-машини компаній Symbolics і LMI. Після «зими штучного інтелекту» фінансування зникло, і мова втратила зірковий статус.

1975 року Джеральд Сассман і Гай Стіл створили Scheme — мінімалістичний, майже математичний Lisp, на якому написано класичний підручник SICP. 1995 року група Маттіаса Фелляйзена створила PLT Scheme, яку 2010 року перейменували на Racket. Сьогодні це значно більше, ніж Scheme: це мова для побудови мов, а її неофіційне гасло — програмування, орієнтоване на мову.

Хто сьогодні користується Lisp

Більше людей, ніж здається. Clojure працює у продакшені банків, авіакомпаній і стартапів: на ньому побудовано Nubank, найбільший цифровий банк Латинської Америки. Common Lisp із компілятором SBCL досі живий в експертних системах, плануванні польотів (ITA Software, придбана Google і покладена в основу Google Flights).

Мільйони людей щодня виконують Lisp, навіть не помічаючи цього: їхній редактор Emacs — це інтерпретатор Lisp. GNU Guix — це цілий дистрибутив Linux, налаштований на 100% мовою Scheme. У Racket є щорічна конференція RacketCon, а мову використовують у дослідженнях мов, формальній верифікації (Rosette), типографіці та видавництві (Pollen).

Як виглядає код

Встановлення займає п'ять хвилин: інсталятор із racket-lang.org і середовище DrRacket, де зверху пишуть визначення, а знизу працює REPL. Перший рядок файлу — #lang racket: він вибирає мову, адже Racket — це фабрика мов.

Правило Lisp вміщується в один рядок: усе є (оператор аргумент1 аргумент2…), без винятків. (+ 1 2) повертає 3, (* 3 (+ 2 2)) — 12, (string-append "hello " "world") — "hello world". Немає ні пріоритету операторів, ні спеціального синтаксису; define створює сталу або функцію, а lambda — безіменну функцію.

Lisp означає обробку списків: (first '(1 2 3)) повертає 1, (rest '(1 2 3)) — (2 3), (cons 0 '(1 2 3)) — (0 1 2 3). map, filter і foldl розв'язують більшість задач зі списками без жодного циклу for. Рекурсія тут природна: факторіал пишуть так, що базовий випадок і крок до нього видно одразу, а з бібліотекою 2htdp/image кілька рядків малюють трикутник Серпінського.

Фінал — макроси: апостроф ' перетворює код на дані, а eval виконує дані як код. Через define-syntax-rule туторіал навіть додає до мови цикл while, якого в ній немає. Алан Кей назвав Lisp «рівняннями Максвелла для програмного забезпечення» — крихітне ядро, з якого виводиться все інше.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.