我想编写一个函数,该函数接受地图的特定结构并返回(打印出)我想要的地图的任何部分。这可能吗?
到目前为止,我还没有成功。以下是我编写的用于打印地图的a,b和c部分的函数,但在整个过程中似乎缺少一些逻辑。
测试图是{:nums {:test number?}}。 我的真正目标是返回测试值,即数字?还是用户希望测试的任何值(例如符号)?还是矢量?。这就是为什么我选择使用此方法。
我想了解为什么选择返回地图的所有部分(即a,b,c)的逻辑。
谢谢。
(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
根据评论,当前的问题是在地图中找到任何:test
键。因此some
+ vals
可用于产生这样的结果:
user=> (some :test (vals {:nums {:test number?}}))
#<Fn@45297e7 clojure.core/number_QMARK_>
这是激进的,因为它假定可以在每个映射值上调用: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