gpt4 book ai didi

clojure 以编程方式命名空间映射键

转载 作者:行者123 更新时间:2023-12-04 23:15:17 28 4
gpt4 key购买 nike

我最近了解到 namespaced maps在 clojure。
非常方便,我想知道以编程方式命名 map 的惯用方法是什么?还有我不知道的另一种语法吗?

  ;; works fine
(def m #:prefix{:a 1 :b 2 :c 3})
(:prefix/a m) ;; 1

;; how to programmatically prefix the map?
(def m {:a 1 :b 2 :c 3})
(prn #:prefix(:foo m)) ;; java.lang.RuntimeException: Unmatched delimiter: )

最佳答案

此功能将执行您想要的操作:

(defn map->nsmap
[m n]
(reduce-kv (fn [acc k v]
(let [new-kw (if (and (keyword? k)
(not (qualified-keyword? k)))
(keyword (str n) (name k))
k) ]
(assoc acc new-kw v)))
{} m))

你可以给它一个实际的命名空间对象:
(map->nsmap {:a 1 :b 2} *ns*)
=> #:user{:a 1, :b 2}

(map->nsmap {:a 1 :b 2} (create-ns 'my.new.ns))
=> #:my.new.ns{:a 1, :b 2}

或者给它一个命名空间名称的字符串:
(map->nsmap {:a 1 :b 2} "namespaces.are.great")
=> #:namespaces.are.great{:a 1, :b 2}

并且它只更改非限定关键字的键,这与 #: 的行为相匹配宏:
(map->nsmap {:a 1, :foo/b 2, "dontalterme" 3, 4 42} "new-ns")
=> {:new-ns/a 1, :foo/b 2, "dontalterme" 3, 4 42}

关于clojure 以编程方式命名空间映射键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43722091/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com