有没有一种编写Clojure函数的方法,该函数可以解构图并返回图的任何部分?

问题描述 投票:0回答:2

我想编写一个函数,该函数接受地图的特定结构并返回(打印出)我想要的地图的任何部分。这可能吗?

到目前为止,我还没有成功。以下是我编写的用于打印地图的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
clojure destructuring
2个回答
1
投票

根据评论,当前的问题是在地图中找到任何:test键。因此some + vals可用于产生这样的结果:

user=> (some :test (vals {:nums {:test number?}}))
#<Fn@45297e7 clojure.core/number_QMARK_>

这是激进的,因为它假定可以在每个映射值上调用:test(作为函数)(至少直到找到结果为止。)


0
投票
(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
© www.soinside.com 2019 - 2024. All rights reserved.