Как все отметили, у вас есть двойные скобки вокруг вашего if-not
макроса, что неверно.(Двойные скобки редко бывают правильными в Clojure, в отличие от Схемы.) Но есть и другая проблема в вашей специальной форме.Должна быть специальная форма do
, которая оценивает s-выражения по порядку.
(defn loopthru [n]
(if-not (empty? n)
(do (println (first n))
(loopthru (rest n)))))
Пара других вещей.Используйте when
/ when-not
в тех случаях, когда в вашем операторе if нет блока else.Фактически, использование when-not
в этом случае устраняет необходимость в do
, поскольку в s-выражениях нет двусмысленности относительно условного выражения.И я должен упомянуть обязательный комментарий, что рекурсия в этом случае будет занимать место в стеке, поэтому используйте recur
вместо
(defn loopthru [n]
(when-not (empty? n)
(println (first n))
(recur (rest n))))