S-выражения и префиксная запись
Главный синтаксис Clojure: всё — это s-выражения, где оператор стоит перед аргументами.
S-выражение (symbolic expression) — список в круглых скобках, где первый элемент — функция или операция, а остальные — её аргументы.
Один синтаксис на всё
В большинстве языков много форм записи: a + b для арифметики, f(a, b) для вызова, if ... else для условий. В Clojure форма ровно одна — список в скобках, где первый элемент главный:
(оператор аргумент1 аргумент2 ...)Эта запись называется префиксной: оператор стоит перед операндами. Сложение, вызов функции, условие — всё выглядит одинаково.
(+ 1 2) ; сложение: 3
(* 3 4 5) ; умножение нескольких: 60
(max 7 2 9 1) ; максимум: 9
(str "a" "b") ; склейка строк: "ab"Вывод:
3 60 9 "ab"
Почему оператор первым — это удобно
Префиксная запись снимает вопрос о приоритете операций. В выражении 2 + 3 * 4 нужно помнить правила. В Clojure всё явно — скобки сами задают порядок:
(+ 2 (* 3 4)) ; => 14, сначала умножение в скобках
(* (+ 2 3) 4) ; => 20, сначала сложениеА ещё операторы работают с любым числом аргументов: (+ 1 2 3 4 5) сразу даёт 15, не надо писать плюсы между каждой парой.
Скобки — это не страшно
Новичков пугает «море скобок». На деле скобок не больше, чем фигурных и круглых в Java или JavaScript, — просто они все одного вида и стоят по краям. Несколько приёмов:
- Читайте изнутри наружу: находите самое внутреннее выражение, мысленно заменяйте его результатом.
- Доверяйте редактору: любой редактор для Clojure подсвечивает парную скобку и умеет «структурное редактирование».
- Отступы важнее скобок: правильно выровненный код читается как дерево.
; Читаем изнутри: (* 2 3) => 6, потом (+ 6 1) => 7
(+ 1 (* 2 3))Вывод:
7
Как работает под капотом
Когда reader встречает (+ 1 2), он строит список из трёх элементов: символа + и чисел 1 и 2. Компилятор смотрит на первый элемент: если это функция — вызывает её с остальными как аргументами. То есть круглые скобки буквально означают «вызвать первый элемент». Эта простота и делает синтаксис единообразным.
Частые ошибки
- Писать инфиксно.
(1 + 2)— ошибка: Clojure попытается вызвать число 1 как функцию. - Лишние или недостающие скобки. Считайте баланс или доверяйте редактору с подсветкой пар.
- Путать скобки видов. Круглые
()— вызов, квадратные[]— вектор, фигурные{}— отображение. О них в следующих уроках.
Итоги
- S-выражение — список в скобках: первый элемент — операция, остальные — аргументы.
- Префиксная запись убирает вопрос о приоритете и работает с любым числом аргументов.
- Читайте код изнутри наружу и доверяйте редактору в балансировке скобок.
- Круглые скобки означают «вызвать первый элемент».