这段代码在Clojure.core.async中做什么?
这是一段代码,我不明白alt代码>正在执行此操作这段代码在Clojure.core.async中做什么?,clojure,Clojure,这是一段代码,我不明白alt正在执行此操作 (defn listener [f ch] (let [stop-ch (chan)] (go-loop [] (alt! stop-ch ([_] :no-op) ch ([msg] (f msg) (recur)))) {:listener ch :stop stop-ch
(defn listener [f ch]
(let [stop-ch (chan)]
(go-loop []
(alt!
stop-ch ([_] :no-op)
ch ([msg] (f msg)
(recur))))
{:listener ch :stop stop-ch}))
(defn stop-listener [{:keys [stop]}]
(put! stop :stop))
尤其是alt的第二个参数代码>
,即:
ch ([msg] (f msg)
(recur))
是吗
是否意味着调用
函数后,它将无限期地等待以接收值?go loop alt!将根据哪个通道有消息执行任一块
您会注意到stop ch不会再次出现,因此在收到stop后,go循环将结束
如果在侦听器通道上接收到某个内容,则函数f将对其进行处理。然后,循环将我们带回到go循环的开始,在那里alt!将等待侦听器或停止通道上的进一步消息
创建的监听器结构是两个通道的映射-将内容放入监听器,它们将被f'ed,将任何内容放入停止,监听器将停止。然后,停止侦听器fn为用户提取最后的细节
这一切本质上只是core.async通道和函数之间的一个简单适配器,带有清理逻辑
go循环是否意味着在调用侦听器函数后,它将无限期地等待以接收值
不会。调用侦听器不会阻止控制流。然而,创建的go循环将“阻塞”,直到它在其中一个通道上接收到输入。我使用引号是因为这不是一个阻塞的线程-我真的建议您在REPL上玩过游戏后,看看一些基本的core.async演示。一旦你能将行为与理论联系起来,它就相当简单了。go loop alt!将根据哪个通道有消息执行任一块 您会注意到stop ch不会再次出现,因此在收到stop后,go循环将结束 如果在侦听器通道上接收到某个内容,则函数f将对其进行处理。然后,循环将我们带回到go循环的开始,在那里alt!将等待侦听器或停止通道上的进一步消息 创建的监听器结构是两个通道的映射-将内容放入监听器,它们将被f'ed,将任何内容放入停止,监听器将停止。然后,停止侦听器fn为用户提取最后的细节 这一切本质上只是core.async通道和函数之间的一个简单适配器,带有清理逻辑 go循环是否意味着在调用侦听器函数后,它将无限期地等待以接收值
不会。调用侦听器不会阻止控制流。然而,创建的go循环将“阻塞”,直到它在其中一个通道上接收到输入。我使用引号是因为这不是一个阻塞的线程-我真的建议您在REPL上玩过游戏后,看看一些基本的core.async演示。一旦你能将行为与理论联系起来,这就相当简单了。你可能想看看,你可能想看看最后一段的详细内容?关于适配器。您有一个(大概是副作用)函数。你有一个频道。此侦听器模式是一个适配器,它将通道上的传入消息转换为函数调用。这有用吗?我在这里使用的是GoF适配器模式意义上的适配器——尽管在LISP中OO的模式明显不同。请详细解释一下最后一段?关于适配器。您有一个(大概是副作用)函数。你有一个频道。此侦听器模式是一个适配器,它将通道上的传入消息转换为函数调用。这有用吗?我在这里使用的是GoF适配器模式意义上的适配器——尽管在LISP中,OO的模式显然不同。