deref 等同于这些读入器宏(reader macro): @ref / @agent / @var / @atom / @delay / @future / @promise 。
在事务中调用 deref 时,返回 ref 的事务值(in-transaction-value);在非事务情况下调用,则返回 ref 的最近一次提交值(most-recently-committed value).
应用于 var 、 agent 或 atom 时,返回它们的当前状态。
应用于 future 时,如果计算尚未完成,那么阻塞。
应用于 promise 时,如果该 promise 还没用 deliver 设置过值,那么阻塞。
带 timeout 参数的变种(variant)用于处理 future 和 promise 这种可能会阻塞的引用(reference):当阻塞时长超过 timeout 毫秒,而引用还未有值可用时,返回 timeout-val 作为值。
; 普通的 deref
user=> (def d (delay (+ 1 1)))
#'user/d
user=> (deref d)
2
user=> @d
2
; 带超时的 deref
user=> (def p (promise))
#'user/p
user=> (deref p 5000 nil)   ; 5 秒内没有可用值,就返回 nil
nil