在Clojure中取消引用原子时,我感到困惑。在下面的代码中,我有一个server-request
函数,该函数接收数据并更新request-result-data
,后者只是由请求ID索引的映射。该功能将阻塞,直到服务器完成数据发送,然后返回请求ID。下面的第一个代码段按预期工作。第二个没有,因为(看来)@ request-result-data在函数返回之前已被取消引用。
;works
(let [req-id (server-request "parameters")]
(pprint (@request-result-data req-id)))
;returns nil
(pprint (@request-result-data (server-request "parameters"))))
这是正常行为吗?有没有更好的方法编写此代码?从直觉上看,这里似乎不需要let
。
谢谢
答案 0 :(得分:2)
如果[
{
from_place_id: 5,
to_place_id: 3,
...
},
{
from_place_id: 3,
to_place_id: 8,
...
},
{
from_place_id: 8,
to_place_id: 1,
...
},
]
函数正在修改server-request
原子,那么确实需要使用第一种形式来确保事情以正确的顺序进行。如果您有函数调用request-result-data
,则不应依赖于(E1 E2)
或E1
以任何特定顺序进行求值。
在没有任何其他上下文的情况下,我想知道为什么您不能E2
返回信息而不是将其放到原子中,但这超出了您的原始问题。