有没有办法编写clojure函数来分解映射并返回映射的任何部分?
我想写一个函数,它接受映射的特定结构,并返回(打印)我想要的映射的任何部分。这可能吗 到目前为止我还没有成功。下面是我为打印地图的a、b和c部分而编写的函数,但在整个过程中我似乎缺少了一些逻辑 测试映射为{:nums{:测试编号?}我的真正目标是返回测试值,即数字?或用户希望测试的值,例如符号?或者向量?这就是我选择使用此方法的原因 我希望理解逻辑,这就是为什么我选择返回地图的所有部分,即a、b、c 谢谢有没有办法编写clojure函数来分解映射并返回映射的任何部分?,clojure,destructuring,Clojure,Destructuring,我想写一个函数,它接受映射的特定结构,并返回(打印)我想要的映射的任何部分。这可能吗 到目前为止我还没有成功。下面是我为打印地图的a、b和c部分而编写的函数,但在整个过程中我似乎缺少了一些逻辑 测试映射为{:nums{:测试编号?}我的真正目标是返回测试值,即数字?或用户希望测试的值,例如符号?或者向量?这就是我选择使用此方法的原因 我希望理解逻辑,这就是为什么我选择返回地图的所有部分,即a、b、c 谢谢 (defn des [mapp] (let [[a [b c]] [mapp]]
(defn des [mapp]
(let [[a [b c]] [mapp]]
(println (str a)))
)
=> #'user/des
(des {:nums {:test number?}})
{:nums {:test #object[clojure.core$number_QMARK_ 0x1089d00e "clojure.core$number_QMARK_@1089d00e"]}}
=> nil
(defn des [mapp]
(let [[a [b c]] [mapp]]
(println (str b)))
)
=> #'user/des
(des {:nums {:test number?}})
=> nil
(defn des [mapp]
(let [[a [b c]] [mapp]]
(println (str c)))
)
=> #'user/des
(des {:nums {:test number?}})
=> nil
根据评论,当前的问题是在地图中找到any
:test
键。因此,可以使用一些+VAL
产生这样的结果:
user=>(some:test(vals{:nums{:testnumber?}))
#
这是有攻击性的,因为它假设可以对每个映射值调用:test
(作为一个函数)(至少在找到结果之前)。您的最终目标是什么?在通过:nums时获取:测试?我认为你最好是通过进入或者你可以这样分解结构:(让[{{test:test}:nums}{:nums{:test number?}]test)
如果你能更清楚你的最终目标是什么(我打赌它不是打印出来的)你好@cfrick,谢谢你的回复。我的目标只是返回用户希望测试的内容,即数字?,符号?矢量?等等。我不想预编码,我希望它由用户提供。但是你的代码怎么知道用户想要什么呢?要么是用户和代码共享的测试路径,要么代码必须“找到”一个带有:test键的映射;如果是的话,深度是多少?是的,代码必须找到测试值的值并返回它。映射将始终采用以下形式{:nums{:test number?}},但是测试值可以更改为用户想要的任何内容,例如symbol?。听起来就像@cfrick建议的那样,您想要(进入mapp[:nums:test])
。
(defn des [mapp]
(let [m mapp
{x :nums y :vects z :syms} m
{a :test} x
{b :test} y
{c :test} z
]
(println x)
(println y)
(println z)
(println a)
(println b)
(println c)
)
)
=> #'user/des
(des {:nums {:test number?}})
{:test #object[clojure.core$number_QMARK_ 0x48c86e76 clojure.core$number_QMARK_@48c86e76]}
nil
nil
#object[clojure.core$number_QMARK_ 0x48c86e76 clojure.core$number_QMARK_@48c86e76]
nil
nil
=> nil
(des {:nums {:test number?}, :vects {:test vector?} :syms {:test symbol?}})
{:test #object[clojure.core$number_QMARK_ 0x48c86e76 clojure.core$number_QMARK_@48c86e76]}
{:test #object[clojure.core$vector_QMARK___5399 0x17d504aa clojure.core$vector_QMARK___5399@17d504aa]}
{:test #object[clojure.core$symbol_QMARK_ 0x4593ff34 clojure.core$symbol_QMARK_@4593ff34]}
#object[clojure.core$number_QMARK_ 0x48c86e76 clojure.core$number_QMARK_@48c86e76]
#object[clojure.core$vector_QMARK___5399 0x17d504aa clojure.core$vector_QMARK___5399@17d504aa]
#object[clojure.core$symbol_QMARK_ 0x4593ff34 clojure.core$symbol_QMARK_@4593ff34]
=> nil