Clojure-原子何时被解除引用?
我对Clojure中原子的解引用感到困惑。在下面的部分中,我有一个Clojure-原子何时被解除引用?,clojure,thread-safety,Clojure,Thread Safety,我对Clojure中原子的解引用感到困惑。在下面的部分中,我有一个服务器请求函数,它接收数据并更新请求结果数据,这只是一个由请求ID索引的映射。该函数将一直阻止,直到服务器发送完数据,并返回请求ID。下面的第一个代码段按预期工作。第二个没有,因为(看起来)@请求结果数据在函数返回之前被取消引用 ;works (let [req-id (server-request "parameters")] (pprint (@request-result-data req-id))) ;returns
服务器请求
函数,它接收数据并更新请求结果数据
,这只是一个由请求ID索引的映射。该函数将一直阻止,直到服务器发送完数据,并返回请求ID。下面的第一个代码段按预期工作。第二个没有,因为(看起来)@请求结果数据在函数返回之前被取消引用
;works
(let [req-id (server-request "parameters")]
(pprint (@request-result-data req-id)))
;returns nil
(pprint (@request-result-data (server-request "parameters"))))
这是正常的行为吗?有没有更好的编码方法?从直觉上看,我似乎不需要一个let
谢谢,如果
服务器请求
函数正在修改请求结果数据
原子,那么您确实需要使用第一个表单来确保事情按正确的顺序发生。如果您有一个函数调用(E1 E2)
,则不应依赖于以任何特定顺序计算的E1
或E2
如果没有任何其他上下文,我想知道为什么不能让
服务器请求
返回信息而不是将其放入atom中,但这超出了您原来的问题。如果服务器请求
函数正在修改请求结果数据
atom,当然,您需要使用第一种形式来确保事情按正确的顺序发生。如果您有一个函数调用(E1 E2)
,则不应依赖于以任何特定顺序计算的E1
或E2
如果没有任何其他上下文,我想知道为什么您不能让
服务器请求
返回信息,而不是将其放入atom中,但这超出了您最初的问题。我错过了并更新了请求结果数据部分。请显示服务器请求
功能的详细信息。在处理排序副作用时,顺序很重要,因此如果没有所有信息,很难确定问题出在哪里。谢谢-在处理您无权访问的服务器时,很难给出完整/可验证的示例!嗯,可能不是一个可运行的示例,但是如果我们看到函数,解释行为就会更容易。我错过了部分并更新了请求结果数据。请显示服务器请求
功能的详细信息。在处理排序副作用时,顺序很重要,因此如果没有所有信息,很难确定问题出在哪里。谢谢-在处理您无权访问的服务器时,很难给出完整/可验证的示例!嗯,可能不是一个可运行的示例,但是如果我们看到了函数,那么解释行为就会更容易。谢谢-服务器请求是一个围绕Java API的包装器,异步发送数据,我将在atom中缓存数据,直到请求完成。“你不应该依赖于E1或E2以任何特定顺序进行计算。”我认为这不是真的。保证函数被求值,然后它的每一个参数都按这个顺序求值。尽管如此,我认为这不是一个共同的理解,因此我认为这会降低代码的可读性。谢谢-服务器请求是围绕异步发送数据的Java API的包装器,我将数据缓存在atom中,直到请求完成。“你不应该依赖E1或E2以任何特定的顺序进行计算”,我认为这是不对的。保证函数被求值,然后它的每个参数都按这个顺序求值。即使如此,我认为这不是一个共同的理解,因此我认为这会降低代码的可读性。