Clojure возвращает простое значение true или false из функции

Я новичок в 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 не скомпилировалась: and не является оператором. Я думаю, что вы имеете в виду оператора && и соответствующим образом отредактировали свой вопрос.

Thumbnail 04.06.2019 10:34

это был скорее псевдокод для справки о том, чего я хочу достичь в Java. Написал большую часть кода clojure, смешал синтаксис Java. В любом случае спасибо.

heman123 05.06.2019 01:54

... и, как и в случае с Clojure, исходная Java может быть сокращена до return a > 0 && b > 0.

Thumbnail 05.06.2019 10:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
1 416
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Аналога 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 29.05.2019 18:51

@ heman123 - Тогда вы должны использовать if и do в каждой ветке.

Lee 29.05.2019 18:53

Но после печати заявления я хочу вернуть true и false. Как этого добиться? я все еще не понимаю. Я отредактирую свой вопрос в соответствии с этим .. не могли бы вы предложить соответствующее редактирование

heman123 29.05.2019 18:55

Большое спасибо @Lee .. Я смог сделать это, как вы сказали ... Clojure действительно сложен или это только мне сложно?

heman123 29.05.2019 19:00

@ heman123 — Clojure довольно сильно отличается от java, и может потребоваться некоторое время, чтобы привыкнуть к нему, но я думаю, что изучение функционального языка улучшит то, как вы пишете на других языках (включая java).

Lee 29.05.2019 19:14

Чтобы продолжить ответ Ли, вы также можете использовать функцию 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?))

Другие вопросы по теме