Clojure, возвращающий простое значение true или false из функции - PullRequest
1 голос
/ 29 мая 2019

Я новичок в 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;
    }

Ответы [ 2 ]

4 голосов
/ 29 мая 2019

Нет аналога 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)))
3 голосов
/ 31 мая 2019

Для дальнейшего ответа Ли, вы также можете использовать функцию 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?))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...