То, как код на Лиспе используется с отступом, похоже на существенный пробел в Python, за исключением того, что он, конечно, не обязателен. Основное правило заключается в том, что вы помещаете элементы в список под друг друга вертикально, если они не находятся на одной строке.
(a (b (c (d e)
(f g))
(h i j))
(k l m n))
Даже не глядя на скобки, вы можете видеть, что (d e)
и (f g)
являются параметрами для c
, (c (d e) (f g))
и (h i j)
являются параметрами для b
, а (b (c (d e) (f g)) (h i j))
и (k l m n)
параметры для a
.
В вашем примере он должен быть более правильно отформатирован следующим образом:
(if (= a something)
(if (= b otherthing)
(foo)))
^ ^
notice how they line up
Теперь, когда уровень отступа становится значимым, вам больше не нужно полагаться на балансировку круглых скобок для получения этой информации, и, поскольку более компактно размещать их в одной строке с заключительным оператором, это то, что делает Лисперс. Конечно, нет необходимости, чтобы код Lisp форматировался таким образом, но это довольно стандартное соглашение, которое люди используют и на которое можно положиться.