Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这段代码在Clojure.core.async中做什么?_Clojure - Fatal编程技术网

这段代码在Clojure.core.async中做什么?

这段代码在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

这是一段代码,我不明白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 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的模式显然不同。