如何提取函数token-generator返回的值:(延迟(令牌生成器状态))

时间:2019-05-06 20:22:52

标签: clojure

我试图在另一个函数中使用'new'中的值,但是看起来下面给出的代码是错误的。

我不知道为什么。

我将函数'token-generator'包装在延迟中,因为我只希望它在当前旧令牌值到期时运行'token-generator'函数来获取新令牌。

(def r (let [new (delay (token-generator state))]
  (if (compare-and-set! token old new)
      new
      @token)))

(prn r)  ->  nil
(prn @r) ->  NullPointerException   clojure.core/deref-future (core.clj:2208) 

请协助!谢谢!

Edit1:“ token”是保存最后收到的令牌的变量,“ old”是最后使用的令牌。在程序范围上,它们可以有所不同。

Edit2:添加了@token(最后一行)

1 个答案:

答案 0 :(得分:1)

如果您在问题中提供了更多详细信息,如预期的输入和输出数据以及缺少的代码(即token是什么),这将有所帮助。


您可能打算像这样取消引用new

(if (compare-and-set! token old @new)

有关概述,请参见The Clojure CheatSheet。查找atomdelaydeliverderef(也称为@)的定义。

您可能还希望在最后一行上插入@token