Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法编写clojure函数来分解映射并返回映射的任何部分?_Clojure_Destructuring - Fatal编程技术网

有没有办法编写clojure函数来分解映射并返回映射的任何部分?

有没有办法编写clojure函数来分解映射并返回映射的任何部分?,clojure,destructuring,Clojure,Destructuring,我想写一个函数,它接受映射的特定结构,并返回(打印)我想要的映射的任何部分。这可能吗 到目前为止我还没有成功。下面是我为打印地图的a、b和c部分而编写的函数,但在整个过程中我似乎缺少了一些逻辑 测试映射为{:nums{:测试编号?}我的真正目标是返回测试值,即数字?或用户希望测试的值,例如符号?或者向量?这就是我选择使用此方法的原因 我希望理解逻辑,这就是为什么我选择返回地图的所有部分,即a、b、c 谢谢 (defn des [mapp] (let [[a [b c]] [mapp]]

我想写一个函数,它接受映射的特定结构,并返回(打印)我想要的映射的任何部分。这可能吗

到目前为止我还没有成功。下面是我为打印地图的a、b和c部分而编写的函数,但在整个过程中我似乎缺少了一些逻辑

测试映射为{:nums{:测试编号?}我的真正目标是返回测试值,即数字?或用户希望测试的值,例如符号?或者向量?这就是我选择使用此方法的原因

我希望理解逻辑,这就是为什么我选择返回地图的所有部分,即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

根据评论,当前的问题是在地图中找到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