Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
Dictionary Clojure:在集合中使用引用_Dictionary_Vector_Clojure_Ref - Fatal编程技术网

Dictionary Clojure:在集合中使用引用

Dictionary Clojure:在集合中使用引用,dictionary,vector,clojure,ref,Dictionary,Vector,Clojure,Ref,我正在和裁判一起工作,我需要一些帮助 我这里有两个银行账户,分别有:操作 (ref :name "bank" :accounts {12345678 (ref {:name "joey" :account-number 12345678 :operations (ref {:desc "DESC1" :amount 100 :date "2017-01-10

我正在和裁判一起工作,我需要一些帮助

我这里有两个银行账户,分别有
:操作

    (ref :name "bank"
         :accounts 
        {12345678 (ref {:name "joey" 
                       :account-number 12345678 
                       :operations (ref {:desc "DESC1" :amount 100 :date "2017-01-10"]})
                                   (ref {:desc "DESC2" :amount 200 :date "2017-01-11"]})
                                   (ref {:desc "DESC3" :amount 300 :date "2017-01-12"]})})
        {87654321 (ref {:name "paul" 
                       :account-number 12345678 
                       :operations (ref {:desc "DESC1" :amount 50 :date "2017-01-10"]})
                                   (ref {:desc "DESC2" :amount 10 :date "2017-01-11"]})
                                   (ref {:desc "DESC3" :amount 30 :date "2017-01-12"]})})
})
我需要从所有帐户获取所有
:操作
,以构建如下集合:

[{:desc "DESC1" :amount 100 :date "2017-01-10"]}
 {:desc "DESC2" :amount 200 :date "2017-01-11"]}
 {:desc "DESC3" :amount 300 :date "2017-01-12"]}
 {:desc "DESC1" :amount 50 :date "2017-01-10"]}
 {:desc "DESC2" :amount 10 :date "2017-01-11"]}
 {:desc "DESC3" :amount 30 :date "2017-01-12"]}]

不需要相同,这只是一个想法,我正在尝试使用
map
deref
,但仍然卡住了。

您的代码有许多问题需要解决。虽然clojure对并行性/并发性有很好的支持,但您需要首先正确掌握基础知识。处理多线程的活动是很困难的,同时尝试解决基本数据结构和核心函数如何工作,这几乎是不可能的

  • 您的ref函数无效。ref state的文档
  • ref函数用法:(ref x) (ref x和选项)创建并返回初始值为x的ref以及零个或多个选项(以任意顺序):

    :元数据映射

    :验证程序验证fn

    :最小历史记录(默认值0):最大历史记录(默认值10)

    如果提供了元数据映射,它将成为ref上的元数据。 validate fn必须为零或一个参数的无副作用fn, 将在任何状态更改时传递到预期的新状态。如果 新状态不可接受,验证fn应返回false或false 抛出异常。validate fn将在事务提交时调用, 当所有参照都有其最终值时

    通常,引用会根据需要动态累积历史以处理 阅读要求。如果你事先知道你将需要你可以设定的历史 :最小历史记录,以确保在首次需要时可用(而不是 读取错误后的)。历史是有限的,可以设置限制 与:马克斯历史。在Clojure 1.0版中添加

    您在开始时使用的两个关键字看起来可能是试图为ref定义元数据。在定义ref时,您需要使用:meta选项(这是我对您真正意图的猜测,可能完全不正确)

    • ref的强制参数是初始值。这需要是有效的clojure“结构”或返回一个的函数。在你的情况下,你看起来想要一张地图

    • 我不认为你想要嵌套的引用。虽然从技术上讲,我认为你可以定义它们,但这几乎肯定不是你真正想要的。了解一下你为什么不想做这件事,以及它对执行STM的影响。一般的经验法则是隔离需要确保管理的值。您需要细粒度的访问控制,并且希望避免嵌套的访问控制,因为它会使事情变得过于复杂,并且您的访问控制将变得更加细粒度。考虑一下你的银行账户操作。当只对其中一个或两个帐户进行操作时,您不想锁定所有银行帐户-您只想锁定/控制相关帐户的更新。您可能需要的是ref的数组(向量)或普通哈希映射,其中一个键是account,值是ref,而ref又是一个映射,其中包含您需要确保在事务中更新的值(其他选项包括信号量或关键区域方法,其中ref是一个简单的标志/锁,用于确定事务是否可以继续或必须回卷并重试

    • 我认为您可能需要更多地考虑一下您的数据结构。稍微玩弄一下哈希映射,并尝试嵌套结构。在这些基本和嵌套数据结构上玩核心函数(映射、筛选、减少、循环/重现、序列和惰性等。正确地获取基本抽象,然后查看您需要如何更改它以确保数据的一致性,即如何确保您的事务具有适当的原子性,尤其是在涉及多个帐户时。您当前的嵌套结构无效-例如,查找在:operations值处。那是什么值?它是事务引用的向量吗?clojure如何知道这是一个向量?你的应用程序需要如何提取该数据?最频繁的操作是什么-将所有事务提取到一起还是提取单个事务?它们需要按日期顺序吗?获取特定事务的事务有多容易c date?一旦你有数百个账户和数千笔交易,这种规模会扩大吗?等等。正确抽象,容易的事情仍然很容易。如果把它弄错了,容易的事情就会变得困难,困难的事情可能会更加困难


    我感觉
    (ref:name“bank”)
    无效,对吗?您尝试了什么,被卡住了吗?顺便说一下,您的代码甚至不可读(“不匹配的分隔符”)两件事:请告诉我这不是实际的银行代码。:P并告诉我们更多关于您的数据看起来像这样的原因。三重嵌套引用有一种代码味道。