如何在clojure中创建动态地图?
我想创建一个像这样的地图如何在clojure中创建动态地图?,clojure,Clojure,我想创建一个像这样的地图 {:a 1 :b 2 ;;in some condition :c 3 ;;in some other condition } 但是我不知道如何在map结构中将类似[:b2]的列表更改为:b2 以下是我尝试过的一些错误案例: {:a 1 (if (is condition1) [:b 2]) (if (is condition2) [:c 3]) ;... } {:a 1 (map indentity (if (is condition1) [:b
{:a 1
:b 2 ;;in some condition
:c 3 ;;in some other condition
}
但是我不知道如何在map结构中将类似[:b2]
的列表更改为:b2
以下是我尝试过的一些错误案例:
{:a 1
(if (is condition1) [:b 2])
(if (is condition2) [:c 3])
;...
}
{:a 1
(map indentity (if (is condition1) [:b 2]))
(map indentity (if (is condition2) [:c 2]))
;;...
}
我所尝试的都将返回一个序列,而不是参数
有没有一种不用宏的处理方法?这里有一种方法:
(fn [cond1 cond2]
(into
{:a 1}
(map
(fn [[c e]] (when c e))
[[cond1 [:b 2]] [cond2 [:c 3]]])))
您可能希望传入一个与条目对关联的条件表 这里有一种方法:
(fn [cond1 cond2]
(into
{:a 1}
(map
(fn [[c e]] (when c e))
[[cond1 [:b 2]] [cond2 [:c 3]]])))
(into {} [{:a 1}
(if (is condition1) [:b 2])
(if (is condition2) [:c 3])])
您可能希望传入一个与条目对关联的条件表
(into {} [{:a 1}
(if (is condition1) [:b 2])
(if (is condition2) [:c 3])])
这是因为如果is condition 1
为false,则if
表达式将返回nil
,这将被地图上的conj
忽略
这是因为如果
is condition 1
为false,则if
表达式将返回nil
,这被地图上的conj
忽略。我认为merge
是一个不错的选择
(merge {:a 1}
(if condition1 {:b 2})
(if condition2 {:c 3}))
我认为
merge
是一个不错的选择
(merge {:a 1}
(if condition1 {:b 2})
(if condition2 {:c 3}))
要回答您最初的问题,即向地图添加一对
[:b2]
,只需使用conj
:
user> (conj {:a 1} [:b 2])
{:b 2, :a 1}
现在,如果只想在条件(谓词)为true时添加一对,则可以使用一个函数,例如:
(defn conj-if-value-is-positive [m kv-pair]
(if (< 0 (second kv-pair))
(conj m kv-pair)
m))
user> (conj-if-value-is-positive {:a 1} [:b 2])
{:b 2, :a 1}
[:d-1]
未添加到映射,因为它不符合条件。
事实上,函数conj if value positive
不是很通用,可以分解为单独的步骤:
在您的示例中,您希望在不同的对上使用不同的条件。这可以通过减少一系列
[[key-value]谓词]
来实现 要回答您最初的问题,即向地图添加一对[:b2]
,您只需使用conj
:
user> (conj {:a 1} [:b 2])
{:b 2, :a 1}
现在,如果只想在条件(谓词)为true时添加一对,则可以使用一个函数,例如:
(defn conj-if-value-is-positive [m kv-pair]
(if (< 0 (second kv-pair))
(conj m kv-pair)
m))
user> (conj-if-value-is-positive {:a 1} [:b 2])
{:b 2, :a 1}
[:d-1]
未添加到映射,因为它不符合条件。
事实上,函数conj if value positive
不是很通用,可以分解为单独的步骤:
在您的示例中,您希望在不同的对上使用不同的条件。这可以通过减少一系列
[[key-value]谓词]
来实现 什么是操作员是?@缩略图我不知道,问OP.vOv操作员是?@缩略图我不知道,问OP.vOv