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并告诉我们更多关于您的数据看起来像这样的原因。三重嵌套引用有一种代码味道。