Clojure:我正在尝试使用';一些';而不是';多塞克';但我真的不知道如何使用它

Clojure:我正在尝试使用';一些';而不是';多塞克';但我真的不知道如何使用它,clojure,Clojure,在此场景中,如何将“doseq”替换为“some”。我对clojure不熟悉 (def handle (atom ())) ;; #'user/players ;; conjoin a keyword into that list (swap! handlers conj [:report "handles"]) ;;=> ([:report "handles"]) ;; conjoin a second ke

在此场景中,如何将“doseq”替换为“some”。我对clojure不熟悉

(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
和的Clojure文档中包含了一些示例,这些示例可以帮助您了解使用什么以及如何使用它

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


根据条件检测是否存在某些内容。如果谓词返回truthy,则返回谓词的结果

接受谓词和集合

谓词示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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))
收集示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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))
让我们来评估以下各项的组合:

(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


为序列的所有元素实现一个表达式,以获得副作用。这是我从JS中寻找的第一个函数,但它通常不是正确的(它没有利用惰性评估、降低性能的优势)。通常希望应用递归表达式,例如
loop
recur
,但是
doseq
在这里可能有意义

我们将采用与
some

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

序列示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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))
主体表达示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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 "user3438838\nprograms\nin\nClojure"
(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 "1\n2\n3\n4\n5\n6\n7\n8
(doseq [x [1 2 3 4 5 6 7 8]] (println (str "The number/word is: " x))) ; Prints "The number/word is: 1 ..."

希望这有助于你理解两者

如果你是新手,我认为学习Clojure的入门书是他描述的(而不是你通常希望使用惰性/递归计算表达式的
doseq
b/c)。

Clojure文档中有很多例子,可以帮助你弄清楚使用什么和如何使用它

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


根据条件检测是否存在某些内容。如果谓词返回truthy,则返回谓词的结果

接受谓词和集合

谓词示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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))
收集示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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))
让我们来评估以下各项的组合:

(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


为序列的所有元素实现一个表达式,以获得副作用。这是我从JS中寻找的第一个函数,但它通常不是正确的(它没有利用惰性评估、降低性能的优势)。通常希望应用递归表达式,例如
loop
recur
,但是
doseq
在这里可能有意义

我们将采用与
some

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

序列示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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))
主体表达示例:

#(= 2 %) ; Equals 2
(fn [val] (= val "user3438838")) ; equals your username
[1 2 3 4 5 6 7 8]
["user3438838" "programs" "in" "Clojure"]
[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 "user3438838\nprograms\nin\nClojure"
(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 "1\n2\n3\n4\n5\n6\n7\n8
(doseq [x [1 2 3 4 5 6 7 8]] (println (str "The number/word is: " x))) ; Prints "The number/word is: 1 ..."

希望这有助于你理解两者


如果你是新来的,我认为学习Clojure的入门书是他描述的(而不是你通常想要使用惰性/递归计算表达式的
doseq
b/c)。

我只使用Clojure编写代码,而不是ClojureScript,而是基于语法,
#(=:report%)@handlers…)
将以
true
的形式启动anon fn,这不是有效的fn调用。我想你基本上是对的,除了
(一些#(=:report%)@handlers)
,然后将(fn handle event)移到
if
正文中。@AaronBell:很抱歉没有收到你的评论,你能用例子解释一下吗?如果可能,谢谢请用示例和输出更新你的问题。此外,尝试将示例简化到最低限度。请看@AlanThompson:我已经更新了这个问题,请帮我解释一下
doseq
一些做根本不同的事情,你不能用另一个来代替它们。我只使用Clojure而不是ClojureScript编写代码,但是基于语法,
(=:report%)@handlers…)
将以
true
的形式启动anon fn,这不是有效的fn调用。我想你基本上是对的,除了
(一些#(=:report%)@handlers)
,然后将(fn handle event)移到
if
正文中。@AaronBell:很抱歉没有收到你的评论,你能用例子解释一下吗?如果可能,谢谢请用示例和输出更新你的问题。此外,尝试将示例简化到最低限度。请看@AlanThompson:我已经更新了这个问题,请帮我回答
doseq
一些做根本不同的事情,你不能用一个替换另一个。