Песочница

Чтение скобок

Скобки — одно правило, применённое везде, и, как только вы увидите это правило, синтаксис перестаёт быть препятствием.

Результат: найти ведущую форму в выражении со скобками, отделить её от следующих частей и понять, является ли выражение обычным вызовом или особой формой.

Что нужно знать: ничего. Эта страница для читателя, который никогда не писал программ, и для читателя, который написал их много, но которого оттолкнули скобки.

Одна основная форма используется снова и снова

У большинства языков большой синтаксис. Есть вызовы функций, операторы с приоритетом, инструкции, блоки, и у каждого своя форма, которую нужно запомнить.

Этот язык снова и снова использует одну основную форму.

LISPEX
(действие вход1 вход2 ...)

В обычном вызове первый элемент внутри пары скобок говорит, какую процедуру вызвать. Всё после него передаётся как аргументы. Этого правила чтения хватает для большинства выражений, которые встречаются в начале.

LISPEX
(+ 2 3)

Прочитайте вслух: сложить два и три. Выражение даёт 5. Знак плюса — не особый оператор, стоящий между двумя числами, а первый элемент, вызываемая процедура.

Небольшой набор форм, включая define, if, quote и lambda, использует те же скобки, но управляет вычислением вместо вызова процедуры. В этих особых формах первый элемент называет форму, а остальные части составляют синтаксис, которым она управляет.

Вложенность — то же правило внутри себя

Сначала вычисляется внутреннее выражение, а на его месте остаётся полученное значение.

LISPEX
(+ 10 (* 2 3))

Читайте изнутри наружу. Умножить два на три — получится шесть. Затем сложить десять и шесть — получится шестнадцать.

Поэтому скобки сначала кажутся тяжёлыми, а позже становятся лёгкими. Не нужно помнить приоритет, не встаёт вопрос, происходит ли умножение раньше сложения. Форма скобок уже задаёт порядок, однозначно и каждый раз.

Что вы теперь можете прочитать

Посмотрите на это и, не зная, что делает каждое из этих имён, скажите, что к чему применяется.

LISPEX
(define (price-with-fee price fee)
  (+ price fee))

Внешняя форма — define, особая форма, а не вызов процедуры. Её первая часть — (price-with-fee price fee), определяемое имя вместе с именами, которые ожидает процедура. Вторая часть — тело. Тело (+ price fee) является обычным вызовом и складывает эти два значения.

Вы только что разделили определение на осмысленные части, ещё не изучив все детали define. В этом выигрыш маленькой формы, которая повторяется снова и снова.

Попробуйте сами

Прочитайте это выражение и предскажите значение до запуска.

LISPEX
(+ 1 (* 2 (+ 3 4)))
Показать ответ

Пятнадцать. Сначала самое внутреннее: сложить три и четыре — получится семь. Затем умножить два на семь — получится четырнадцать. Затем прибавить один — получится пятнадцать. Приоритет операторов ни разу не участвовал в рассуждении, потому что порядок задали скобки.

Готовы двигаться дальше?

Вы можете посмотреть на незнакомое выражение, указать на первый элемент внутри каждой пары скобок и сказать, что к чему применяется, даже когда не знаете, что означают имена.

Далее: Первая программа — там вы сначала запустите эту форму, а затем подробно разберёте её части.