Clojure-如果基于某些结果

时间:2019-01-25 09:31:38

标签: if-statement clojure

我想以道歉开头,尽管我使用Stackoverflow A LOT,但我完全是自强不息,这是我的第一个问题。

我想根据some函数的结果做出决定...

(if (= nil (some (partial = (:activeboard (:boards app)))
                 (:otherboards (:boards app))))
  (om/transact! (:boards app) :activeboard (fn [_] active)))

我知道some测试有效,因为我进一步具有相同的some功能,可以将结果输出到屏幕。但是if测试却没有。我同样尝试了casecondp。似乎没有任何东西可以评估some函数。 some函数的结果是niltrue,因此if应该对此进行评估?

2 个答案:

答案 0 :(得分:1)

some中评估if并没有什么特别的,据我所知,您的代码很好。在下面查看一下,看看是否可以构造类似的东西(我们都可以尝试自己运行)并且证明了问题所在。

案例1,活动板包含在其他板上:

(def app {:boards {:activeboard 1 :otherboards [1 2 3]}})

(if (= nil (some (partial = (:activeboard (:boards app))) (:otherboards (:boards app))))
  (println "some returned nil")
  (println "some did not return nil"))

评估:

>> some did not return nil

案例2,activeboard不包含在otherboard中:

(def app {:boards {:activeboard 1 :otherboards [2 3 4]}})

(if (= nil (some (partial = (:activeboard (:boards app))) (:otherboards (:boards app))))
  (println "some returned nil")
  (println "some did not return nil"))

评估:

>> some returned nil

答案 1 :(得分:1)

首先,代码缩进可以大大帮助您理解自己的代码。我对您的问题进行了修改,使其至少更加清晰。

第二,考虑使用线程优先运算符(->)或get-in浏览地图中的多个级别。但这仅仅是代码风格的事情。

您的状况看起来还不错,就像@jas已经证明的那样。可能会惹上您麻烦的是,您没有提供通往if的“其他”路径。 if宏需要三个“参数”:条件,“ then”块和“ else”块。如果您只想测试情况的​​真实情况,请使用when

希望有帮助。