Clojure 改变向量值的一般方法
如果我有Clojure 改变向量值的一般方法,clojure,Clojure,如果我有 (def x [[1 2 3] [4 5 6]]) 有没有一个通用的方法把任何一个数字改成9 我知道我能行 (assoc-in x [1 1] 9) > [[1 2 3] [4 9 6]] 如果你不知道索引号,有没有办法做到这一点。或者,首先找到索引编号的方法以及您拥有的所有信息是,您想将x中的数字5更改为数字9,您可以使用: 您可以使用: 其他答案适用于您的具体情况,但如果您具有任意嵌套结构,则可以使用clojure.walk命名空间: (defn replace-valu
(def x [[1 2 3] [4 5 6]])
有没有一个通用的方法把任何一个数字改成9
我知道我能行
(assoc-in x [1 1] 9) > [[1 2 3] [4 9 6]]
如果你不知道索引号,有没有办法做到这一点。或者,首先找到索引编号的方法以及您拥有的所有信息是,您想将x中的数字5更改为数字9,您可以使用:
您可以使用:
其他答案适用于您的具体情况,但如果您具有任意嵌套结构,则可以使用
clojure.walk
命名空间:
(defn replace-value
[value replacement struct]
(clojure.walk/prewalk
(fn [x]
(if (and (number? x) (== value x))
replacement
x)) struct))
当然,您可以用也可以作为arg传递的任何谓词替换number?
(replace-value 5 9 [[[1 5] 6 5] 1 5 [2 5]])
;; [[[1 9] 6 9] 1 9 [2 9]]
编辑:缩略图更好的版本
(defn replace-value [value replacement struct]
(clojure.walk/prewalk-replace {value replacement} struct))
其他答案适用于您的具体情况,但如果您具有任意嵌套结构,则可以使用
clojure.walk
命名空间:
(defn replace-value
[value replacement struct]
(clojure.walk/prewalk
(fn [x]
(if (and (number? x) (== value x))
replacement
x)) struct))
当然,您可以用也可以作为arg传递的任何谓词替换number?
(replace-value 5 9 [[[1 5] 6 5] 1 5 [2 5]])
;; [[[1 9] 6 9] 1 9 [2 9]]
编辑:缩略图更好的版本
(defn replace-value [value replacement struct]
(clojure.walk/prewalk-replace {value replacement} struct))
更简单的是
(defn replace value[value replacement struct](clojure.walk/prewalk-replace{value replacement}struct))
。谓词是多余的。您的原始谓词使用-数值相等。这是你想要的吗?例如,您不能在字符串上使用它。@Thumbnail@Joseph所以如果我现在有(def z(atom[[a”“b”“c][d”“e”“f]])
并且我想在z上使用replace-value。因为z是一个原子,所以我必须使用swap!。因此,我尝试了(swap!(替换值“b”“g”@z))
,但我得到了一个错误,即传递给swap的参数数目错误!。然后我尝试了(swap!替换值“b”“g”@z)
,但我得到了一个错误:ClassCastException用户$replace\u值不能转换为clojure.lang.IAtom clojure.core/swap!(core.clj:2253)。是否可以对原子使用替换值?替换结构中的结构化元素时,总会出现异常。常见的解决方案是将结构化元素包装到记录中。将结构化元素包装到记录中是什么意思?更简单的方法是(defn replace value[value replacement struct](clojure.walk/prewalk-replace{value replacement}struct))
。谓词是多余的。您的原始谓词使用-数值相等。这是你想要的吗?例如,您不能在字符串上使用它。@Thumbnail@Joseph所以如果我现在有(def z(atom[[a”“b”“c][d”“e”“f]])
并且我想在z上使用replace-value。因为z是一个原子,所以我必须使用swap!。因此,我尝试了(swap!(替换值“b”“g”@z))
,但我得到了一个错误,即传递给swap的参数数目错误!。然后我尝试了(swap!替换值“b”“g”@z)
,但我得到了一个错误:ClassCastException用户$replace\u值不能转换为clojure.lang.IAtom clojure.core/swap!(core.clj:2253)。是否可以对原子使用替换值?替换结构中的结构化元素时,总会出现异常。一种常见的解决方案是将结构化元素包装到记录中。将结构化元素包装到记录中是什么意思?