Clojure编辑函数内矢量的值

时间:2017-10-29 15:06:55

标签: clojure

我的变量牌有空值:

(def cards [0 0 0])

我试图在功能中将卡的值(取决于输入)设置为3。 这就是为什么我有以下代码:

(defn parse-int [s]
  (Integer. (re-find  #"\d+" s )))

(defn changevalue [] (assoc cards (parse-int (read-line)) 3)) 
(changevalue) 

但是当我在输入1中执行问题和打字时,该功能不会改变键1的值,当我打印它时,它仍然是0 0 0。我该如何解决?

我确定parse-int有效,我从In Clojure how can I convert a String to a number?

得到它

2 个答案:

答案 0 :(得分:4)

首先,只需使用Integer/parseInt来解析输入:

(defn change-value [cards]
  (let [s (read-line)]
    (assoc cards (Integer/parseInt s) 3)))

此函数返回cards副本,其中一个元素已更改。请记住,cards是一个向量,它是不可变的。  一旦创建,您就无法更改它。

您写道“该功能不会更改键1的值,当我打印它时,它仍然是0 0 0。我该如何解决这个问题?”你没有解决它,你拥抱不变性。不要试图更改cards。使用change-value返回的修改后的副本:

(def cards [0 0 0])
(def changed-cards (change-value cards))

(println cards)
(println changed-cards)

如果你真的,真的真的需要可变性,你可以使用atom,但这不应该是你的第一选择。 Clojure是一种强调不变性的功能语言。顺其自然而不是试图与语言作斗争。

答案 1 :(得分:1)

Clojure的数据结构几乎是不可变的。 在clojure中,严格限制替换变异值。 如果您想要可变数据结构,可以使用Java的可变数据结构或clojure的{atom,ref,var}。

如果你真的想改变卡片,请尝试这样做:

(def cards (atom [0 0 0]))
(defn change-cards! [idx] (swap! cards assoc idx 3))
(change-cards! 2)
@cards
#_"here is no parseint to simplify your problem"