Clojure рекурсия со структурой данных - PullRequest
1 голос
/ 24 октября 2011

Я пробовал несколько версий этой подпрограммы Clojure, но она всегда приводит к нулевому указателю. Как я могу устранить ошибки?

(defn loopthru [n] (
  (if-not (empty? n) (
       (println (first n))
       (loopthru (rest n))
  ))
))
(loopthru [1 2 3 4 5 6])

Спасибо, Грег

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Как все отметили, у вас есть двойные скобки вокруг вашего 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))))
3 голосов
/ 24 октября 2011
(defn loopthru [col]
  (doseq [n col] (println n)))

(defn loopthru [f col]
  (doseq [item col] (f item)))
0 голосов
/ 24 октября 2011

Пара скобок вокруг тела функции должна быть опущена.Тогда это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...