Clojure 如何提取函数token generator返回的值:(延迟(token generator状态))
我试图在另一个函数中使用“new”的值,但下面给出的代码似乎有错误 我不知道为什么 我将函数“token generator”包装在延迟内,因为我只希望它在当前旧令牌值过期时运行函数“token generator”以获取新令牌Clojure 如何提取函数token generator返回的值:(延迟(token generator状态)),clojure,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
(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(最后一行)如果您在问题中提供更多细节,例如预期的输入和输出数据,以及缺少的代码(即什么是
token
?)
您可能打算删除
new
,例如:
(if (compare-and-set! token old @new)
有关概述,请参阅。查找atom
、delay
、deliver
、deref
(又称@
)的定义
最后一行可能还需要
@token
。谢谢你@AlanThompson,但是我如何实现所需的行为?i、 e.运行函数“token generator”仅在当前旧令牌值过期时获取新令牌,前提是令牌值存储为原子。(如果(比较并设置!token old@new)有效..谢谢Alan!!@Alan Thompson您的目标是保持“有效”每当您请求令牌时,我都会将其作为函数写入,并将最后一个令牌保存在atom中。然后,请求有效令牌的函数可以检查超时情况。@cfrick我持有一个“有效令牌”,我想做的是,当令牌过期时,调用此函数,该函数包含“比较并设置!令牌旧-新”,其中“新”保留延迟以生成新令牌,并返回该令牌。