doseq Clojure返回nil,不访问函数

时间:2016-01-30 19:24:24

标签: clojure

我要做的是,序列中的每个单词都通过名为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))

4 个答案:

答案 0 :(得分:3)

doseq用于在迭代一系列项目时执行副作用。例如,将每个项目逐个放在队列中:

(doseq [msg messages]
  (put-to-queue! msg))

它返回nil,因为它旨在用于副作用,而不是计算某些

转换一个值列表(这是您尝试做的事情),您可以使用for,其语法与{相似} {1}}。您还可以使用doseqmapfilter

答案 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" "#")