Clojure если-тогда-еще? - PullRequest
       2

Clojure если-тогда-еще?

10 голосов
/ 24 декабря 2011

Это должен быть очень тривиальный вопрос.я новичок в Clojure и пишу это if-then-else на основе: http://clojure.org/special_forms#Special%20Forms--%28if%20test%20then%20else?%29

Однако я продолжаю получать эту ошибку:

java.lang.Exception: слишком много аргументов для if(NO_SOURCE_FILE: 424)

// This code has infinite recursion bugs; but it should compile!
(defn sumdown [sum x]
    (
    if (foo x) 
     (do
     (recur (+ sum x) (dec x))
     )
     else do(
        (recur (+ sum x) (dec x))
     )

     )
) 

Ответы [ 3 ]

15 голосов
/ 24 декабря 2011

В шаблоне:

(if test then else?)

и then, и else представляют не ключевые слова, а фактические выражения.? указывает, что выражение else является необязательным.

Условие теста оценивается и на основе его значения вычисляется соответствующее выражение ветви и «возвращается» как значение всего выражения if.

Например, это определит функцию абсолютного значения:

(defn abs [x]
  (if (< x 0)
    (- x)
    x))
7 голосов
/ 24 декабря 2011
(defn sumdown [sum x]
  (if (foo x)
    (recur (+ sum x) (dec x))
    (recur (+ sum x) (dec x))))

Это идиоматический способ написания этого кода. Я рекомендую текстовый редактор / IDE с базовой поддержкой для редактирования исходного кода Lisp (сопоставление скобок / скобок / скобок).

1 голос
/ 23 июля 2014

Правильная реализация вашего примера, удаляющая весь избыточный код, будет выглядеть следующим образом:

(defn sumdown
  [sum x]
  (recur (+ sum x) (dec x)))

Поскольку оба предложения «then» и «else» идентичны, а «do» являются избыточными (и в любомcase различные формы «do» предназначены для побочных эффектов).

Другие условия, которые следует учитывать: когда, cond, condp и case.

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