Clojure变换映射值,它们是要设置的向量

时间:2015-12-26 08:19:58

标签: clojure

我是Clojure的新人。我有一张像

的地图
{:title "The Little Schemer"
 :authors [friedman , felleisen]}

我想将其转换为:

{:title "The Little Schemer"
 :authors #{friedman , felleisen}}

我想尝试:

(def friedman {:name "Daniel Friedman" :birth-year 1944})
(def felleisen {:name "Matthias Felleisen"})

(defn old-book->new-book [book]
  (set  (:authors book)
        )
  )

(println (old-book->new-book {:title "The Little Schemer"
                              :authors [friedman , felleisen]}))

; => Output: #{{:name Daniel Friedman, :birth-year 1944} {:name Matthias Felleisen}}
; => Expected-Output: #{friedman , felleisen}

此处defs friedmanfelleisen会被执行,结果会转换为设置。但是,我希望将函数名称转换为set而不是结果。

1 个答案:

答案 0 :(得分:1)

首先尝试println这个:

(println {:title "The Little Schemer"
      :authors [friedman , felleisen]})

输出将是:

{:title The Little Schemer, :authors [{:name Daniel Friedman, :birth-year 1944} {:name Matthias Felleisen}]}

那么,这里发生了什么?正如您在此上下文中所知friedmanfelleisen是变量,因此,如果您打印它们 - 它们将按值显示在打印消息中。例如:

(def a 1)
(println a)

将打印1,因为a只是一个变量。

您在此处显示的代码执行您想要的操作以及打印时 - 然后friedmanfelleisen的变量值替换为值。

在处理函数(:authors [friedman felleisen])后,您的autors(set)向量将转换为set,这是我们从您的输出中看到的。