Я новичок в Clojure, и у меня проблемы с его основами. Я пытаюсь написать простую программу if else и использовать ее в рекурсии, но у меня проблемы с синтаксисом. Код на Java:
if (a > 0 && b >0){
return true;
}else{
return false;
}
Код в clojure должен быть:
(defn checkPositiveNumber
[x y]
(if (and (> x 0) (> y 0))
(do
(def val true)
)
(do
(def val false)
)
)
(println (checkPositiveNumber 2 3))
возвращает #'user/val
вместо false.
Что я делаю неправильно ? Эта функция должна возвращать true или false, поскольку я буду использовать ее либо для завершения рекурсии, либо для дальнейшей проверки.
Редактировать: Благодаря Ли я смог добиться того, о чем просил... Но моя настоящая цель:
if (a > 0 && b >0){
System.out.println("Values are Positive");
return true;
}else{
System.out.println("Some Values are Negative");
return false;
}
это был скорее псевдокод для справки о том, чего я хочу достичь в Java. Написал большую часть кода clojure, смешал синтаксис Java. В любом случае спасибо.
... и, как и в случае с Clojure, исходная Java может быть сокращена до return a > 0 && b > 0
.
Аналога return
в clojure нет. Тела функций Clojure — это выражения, поэтому вам нужно организовать свою функцию так, чтобы она оценивалась как true
или false
в каждом случае.
В этом случае вам вообще не нужно использовать if
:
(defn checkPositiveNumber [x y]
(and (> x 0) (> y 0)))
если вы хотите выполнить какой-либо побочный эффект в каждой ветке, вы можете использовать do
:
(defn checkPositiveNumber [x y]
(if (and (> x 0) (> y 0)))
(do
(println "x and y both positive")
true)
(do
(println "One of x or y non-positive")
false)))
Но что, если мне нужно написать код, эквивалентный Java: if (a > 0 и b > 0){ sout("все значения положительные"); return true; }else{ sout("есть отрицательное значение");return false; }
@ heman123 - Тогда вы должны использовать if
и do
в каждой ветке.
Но после печати заявления я хочу вернуть true и false. Как этого добиться? я все еще не понимаю. Я отредактирую свой вопрос в соответствии с этим .. не могли бы вы предложить соответствующее редактирование
Большое спасибо @Lee .. Я смог сделать это, как вы сказали ... Clojure действительно сложен или это только мне сложно?
@ heman123 — Clojure довольно сильно отличается от java, и может потребоваться некоторое время, чтобы привыкнуть к нему, но я думаю, что изучение функционального языка улучшит то, как вы пишете на других языках (включая java).
Чтобы продолжить ответ Ли, вы также можете использовать функцию every?
, чтобы сделать вашу функцию более общей:
(defn every-pos? [& values]
(every? pos? values))
Преимущество этой функции в том, что вам не нужно указывать оценку каждого аргумента, и она принимает неограниченное количество параметров:
=> (every-pos? 1 7)
true
=> (every-pos? 3 -1 13 2)
false
Обучение метапрограммированию последовательностей, а не отдельных значений, действительно демонстрирует сильные стороны функционального программирования.
Чтобы проверить значение и включить побочные эффекты, можно сделать что-то вроде следующего:
(defn check-positive-numbers [x y]
(let [pos-values? (every-pos? x y)
msg (if pos-values?
"all numbers positive"
"one or more numbers non-positive")]
(println msg)
pos-values?))
Ваша Java не скомпилировалась:
and
не является оператором. Я думаю, что вы имеете в виду оператора&&
и соответствующим образом отредактировали свой вопрос.