我要做的是,序列中的每个单词都通过名为transform
的函数运行每个单词,该函数将按字母顺序排序,也会更改为小写。但我要回来的只是nil
??
我猜我正在使用doseq
错误,但它看起来不错?谁能给我一些指示?
(defn sort-string [s]
(apply str (sort s)))
(defn transform [word x]
(let [x (sort-string (str/lower-case word))]
(prn word)
(prn word)))
(doseq [dictionary '("one" "two" "three" "FouR" "wot" "Rheet" "nope" "#")]
(transform dictionary))
答案 0 :(得分:3)
doseq
用于在迭代一系列项目时执行副作用。例如,将每个项目逐个放在队列中:
(doseq [msg messages]
(put-to-queue! msg))
它返回nil
,因为它旨在用于副作用,而不是计算某些值。
要转换一个值列表(这是您尝试做的事情),您可以使用for
,其语法与{相似} {1}}。您还可以使用doseq
,map
,filter
等
答案 1 :(得分:2)
doseq
仅用于副作用,如果您希望将结果作为序列,则可以使用for
,其语法与doseq相同。
(for [wordset '("one" "two" "three" "FouR" "wot" "Rheet" "nope" "#")]
(transform wordset))
=> ("eno" "otw" "eehrt" "foru" "otw" "eehrt" "enop" "#")
答案 2 :(得分:1)
以下是一个例子:
(def words ["one" "two" "three" "FouR" "wot" "Rheet" "nope" "#"])
(sort (map clojure.string/lower-case words))
;; => ("#" "four" "nope" "one" "rheet" "three" "two" "wot")
答案 3 :(得分:0)
您的transform
功能和doseq
表达式存在问题。他们建议您不了解如何在Clojure计划中传递信息:
let
绑定重新定义了名称。它没有分配给
现有的。您的transform
功能
x
参数word
参数 - 两次 - 并返回nil
。 并且let
绑定没有效果。
你想要的是......
(defn transform [word]
(sort-string (clojure.string/lower-case word)))
或者更简洁地说,
(def transform
(comp sort-string clojure.string/lower-case))
这将返回已转换的字符串,而不会产生打印的副作用。
正如其他人所解释的那样,doseq
是不合适的。它总是返回nil
。只是......
(let [dictionary '("one" "two" "three" "FouR" "wot" "Rheet" "nope" "#")]
(map transform dictionary))
...给...
("eno" "otw" "eehrt" "foru" "otw" "eehrt" "enop" "#")