Есть ли способ (или условное утверждение в Clojure) к go через все различные условия, даже если одно из условий является ложным? - PullRequest
0 голосов
/ 20 февраля 2020

Я хотел бы оценить все условия в этом блоке, но я не могу найти ни одного условного утверждения, которое бы делало это, не вытаскивая, когда одно условие ложно. Если есть выход за рамки условных операторов, пожалуйста, дайте мне знать.

Пожалуйста, помогите. Tnx.

(when
     ;;when "number" is found in 'a' execute the nextline
      (clojure.string/includes? (.toString a) "number")
        (println (hash-map :num {:test 'number?, :data (flatten num)}))
     ;;when "vector" is found in 'b' execute the nextline
      (clojure.string/includes? (.toString b) "vector")
        (println (hash-map :vec {:test 'vector?, :data vec}))
     ;;when "string" is found in 'c' execute the nextline
      (clojure.string/includes? (.toString c) "symbol")
        (println (hash-map :sym {:test 'symbol?, :data (flatten sym)}) )
     )

Ответы [ 2 ]

4 голосов
/ 20 февраля 2020

Просто напишите его как последовательность из 3 when операторов.

(do   ; it doesn't hurt to wrap in a `do`, but this is usually not needed

  ;when "number" is found in 'a' execute the nextline
  (when (clojure.string/includes? (.toString a) "number")
    (println (hash-map :num {:test 'number?, :data (flatten num)})))

  ;when "vector" is found in 'b' execute the nextline
  (when (clojure.string/includes? (.toString b) "vector")
    (println (hash-map :vec {:test 'vector?, :data vec})))

  ;when "string" is found in 'c' execute the nextline
  (when (clojure.string/includes? (.toString c) "symbol")
    (println (hash-map :sym {:test 'symbol?, :data (flatten sym)}))))

Как говорится в комментарии, оборачивать все в do возможно, но, вероятно, не нужно.

1 голос
/ 20 февраля 2020

Если вы посмотрите на https://clojuredocs.org/clojure.core/when, вы увидите, что when принимает только 1 выражение и 1 тело, что означает, что только первая написанная вами проверка будет использоваться как выражение, а остальная часть является частью тела.

Я не совсем уверен, что вы пытаетесь достичь в вашем примере, но если вы хотите соответствовать нескольким критериям, вы можете заключить в or.

(def a 120)
(when (or (= a 120) (= a 1)) (println "a is 120 or 1"))

Если вам нужен какой-то механизм продолжения попытки, тогда решения могут быть case, cond или condp. Вы можете посмотреть их на ClojureDocs

...