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-выражение — список в скобках: первый элемент — операция, остальные — аргументы.
  • Префиксная запись убирает вопрос о приоритете и работает с любым числом аргументов.
  • Читайте код изнутри наружу и доверяйте редактору в балансировке скобок.
  • Круглые скобки означают «вызвать первый элемент».
Проверьте себя
1. Как на Clojure записать сумму чисел 2 и 5?
A(2 + 5)
B(+ 2 5)
C2 + 5
D[+ 2 5]
2. Чему равно выражение (+ 2 (* 3 4))?
A20
B14
C24
D9
3. Что означают круглые скобки в s-выражении?
AГруппировку для приоритета, как в математике
BСоздание вектора
CВызвать первый элемент как функцию с остальными аргументами
DКомментарий