gpt4 book ai didi

clojure - 如何理解 clojure core.async 中的 alt

转载 作者:行者123 更新时间:2023-12-01 10:36:15 26 4
gpt4 key购买 nike

我已阅读以下文档和示例,但仍然不明白它的真正含义。我理解 alts !!,但不是 alt !!。有人举一个容易理解的例子吗?

https://clojure.github.io/core.async/#clojure.core.async/alt !!

我也准备好了以下链接

In Clojure (core.async) what's the difference between alts and alt?

更新:文档中的示例是:

(alt!
[c t] ([val ch] (foo ch val))
x ([v] v)
[[out val]] :wrote
:default 42)

对于第二行
[c t] ([val ch] (foo ch val))

[c t] 的 channel-op 表示一个 channel c 和一个值 t:将值 t 放在 channel c 上。
([val ch] (foo ch val)) 的 result-expr 表示为操作出价 [val ch],但由于它是一个列表,因此 [val ch] 应该作为一个函数计算,并且 (foo ch val) 将是作为传递给[val ch]函数的参数。但是对于具有 (foo ch val) 参数的 [val ch] 函数意味着什么?

最佳答案

[c t] ([val ch] (foo ch val))



在某些情况下,列表并不意味着“评估为函数”。例如:
(ns com.foo.bar
(:require …))

在上面的代码中,没有调用 :require 的函数。被调用。
letfn 是用于函数应用程序以外的其他用途的列表的另一个示例。 :
(letfn [(foo [x] (+ (bar 1) x))
(bar [x] (+ 2 x))]
(+ (foo 5) (bar 7)))

如上所示, letfn有两个列表,一个以符号 foo 开头, 一个以符号 bar 开头,并且这些列表都不是传统的函数调用。相反, letfn正在定义两个新函数,一个名为 foo ,另一个名称为 bar .表达式的其余部分被视为使用这些函数的“主体”。

but what does it mean for function of [val ch] with parameter of (foo ch val) ?



类似于 letfn , alt定义一个名为 val 的值和一个名为 ch 的 channel ,然后表达式的其余部分( (foo ch val) )被视为使用这两个名称的“主体”。
alt!/alt!!的解释:

我觉得最容易想到 alt!alt!!有点像 cond ,除了不是测试条件来选择要执行的主体,它会等待 channel 来选择要执行的主体。每个子句由两部分组成,就像 cond – 第一部分( “ channel 操作” )用于指定 alt! 的 channel 应该等待,第二部分( "result expr" )指定如果该 channel 首先传递一个值应该发生什么。

由于您可能希望在发生这种情况时访问由 channel 或 channel 本身传递的值, 结果表达式 让您有机会将值和 channel 绑定(bind)到符号,以及使用这些绑定(bind)执行的代码体。因此,以下条款……
[c t]
([val ch]
(foo ch val))

…方法:

One of the channel operations that this call to alt! should block on is an attempt to take from either of two channels, c or t. If either of those send a value before any other channel op in this call to alt!, then execute (foo ch val) with val bound to the value taken from the channel that first delivered a value, and with ch bound to the channel that delivered val (which will be either c or t).



和下面的条款……
[[out input-val]]
([val ch]
(bar ch val))

…方法:

One of the channel operations that this call to alt! should block on is an attempt to put input-val onto a channel called out. If that succeeds before any other channel op in this call to alt!, then execute (bar ch val) with val bound to input-val and ch bound to out (the channel that successfully received the value).



总之,这两个子句可以写成:
(alt!
[c t] ; "Takes" can be a single channel instead of vectors.
([val ch]
(foo ch val))

[[out input-val]] ; "Puts" must be nested vectors.
([val ch]
(bar ch val)))

关于clojure - 如何理解 clojure core.async 中的 alt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com