Вы смотрите не в тот конец телескопа.Помните, что
- У Clojure нет локальных переменных.
- У Clojure нет действий (обычно называемых операторами), только выражения, возвращающие значение.
Существует нет эквивалента Clojure оператора a += 5;
.
Однако выражения могут иметь побочные эффекты: print
и т.п. ничего другого не достигают.Форма do
позволяет выполнить ряд побочных эффектов перед возвратом окончательного значения.Например,
(do (print a) (print b) (+ a b))
- печатает
a
, - печатает
b
, - возвращает их сумму.
Вот почему, когда вы пишете форму if
...
Кажется, что каждый сегмент истинного и ложного допускает только одно действие.
Что имеет Clojure, так это
- локальные привязки имен с формой
let
и - производной версией
let
под названием loop
, которая реализует примитивную форму рекурсии, которая может заменить простое использованиециклы в таких языках, как C или Java.
Между ними let
и его потомки loop
позволяют писать самые простые управляющие структуры.чтобы определить, относится ли это к фрагменту вашей программы ...
if (i > 0)
{
a += 5;
b += 10;
}
... нам нужно увидеть контекст.
Однако вот самая большая общая функция делителей в C (непроверенная)
long gcd (long i, long j)
{
long m = i, n = j;
while (n != 0)
{
long t = n;
n = m % n;
m = t;
}
}
и в Clojure
(defn gcd [i j]
(loop [m i, n j]
(if (zero? n)
m
(recur n (mod m n)))))
Обе они могут быть сокращены.