Clojure:我正在尝试使用'some'而不是'doseq'但我不确定如何使用它



如何替换"doseq";用";一些";在这种情况下。我是个新手。

(def handle (atom ()))
;; #'user/players
;; conjoin a keyword into that list
(swap! handlers conj [:report "handles"])
;;=> ([:report "handles"])
;; conjoin a second keyword into the list
(swap! handlers conj [:demo "handles2"])
;;=> ([:demo "handles2"] [:report "handle"])
(doseq [[a b] @handlers] (println a "--" b))
;;=> :demo -- handles2
;;=> :report -- handles

doseq的Clojure文档和一些文档中加载了一些示例,可以帮助您确定要使用什么以及如何使用它。

关于你的情况,有几件事我不知道,但也许我可以用这些例子来帮助你。


一些

根据条件检测是否存在某种东西。如果谓词返回truthy,则返回谓词的结果。

采用谓词集合

谓词示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username

集合示例:

[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]

让我们评估一下这些的组合:

(some #(= 2 %) [1 2 3 4 5 6 7 8]) ; => true
(some #(= 2 %) ["user3438838" "programs" "in" "Clojure"]) ; => nil
(some (fn [val] (= val "user3438838")) [1 2 3 4 5 6 7 8]) ; => nil
(some (fn [val] (= val "user3438838")) ["user3438838" "programs" "in" "Clojure"]) => true

剂量q

针对副作用,为序列的所有元素实现表达式。这是我从JS中寻找的第一个函数,但它通常不是正确的(它没有利用懒散评估、降低性能的优势(。通常想要应用递归表达式,比如looprecur,但doseq在这里可能有意义。

我们将采用与some相同的方法

doseq采用(a(序列(s(和表面上使用序列的每个元素的表达式

序列示例:

[x ["user3438838" "programs" "in" "Clojure"]]
[x [1 2 3 4 5 6 7 8]]
; Note: Can use multiple [x (range 10) y (range 10 20)]

身体表情示例:

(println x)
(println (str "The number/word is: " x))

现在我们将这些结合起来:

(doseq [x ["user3438838" "programs" "in" "Clojure"]] (println x)) ; Prints "user3438838nprogramsninnClojure"
(doseq [x ["user3438838" "programs" "in" "Clojure"]] (println (str "The number/word is: " x))) ; Prints "The word is: user3438838 ..." 
(doseq [x [1 2 3 4 5 6 7 8]] (println x)) ; Prints "1n2n3n4n5n6n7n8
(doseq [x [1 2 3 4 5 6 7 8]] (println (str "The number/word is: " x))) ; Prints "The number/word is: 1 ..."

希望这能帮助你理解两者。

如果你是新手,我认为学习Clojure的必经之路是Daniel Higginbotham(2015(的《勇敢与真实的Clojure》,他在书中描述了一些(而不是你通常想要使用惰性/递归求值表达式的doseqb/c(。

相关内容

  • 没有找到相关文章

最新更新