core.async不是违背Clo​​jure原则吗?

2024-05-02

我看到许多 Clo​​jure 程序员对新的 core.async 库充满热情,尽管它看起来很有趣,但我很难看出它如何符合 Clojure 原则,所以我有以下问题:

  1. 它在任何地方都使用可变状态,正如函数名称通过感叹号所暗示的那样,例如 alt!、put!、>! 等。如果您从通道中放入或取出值,则该通道将被就地修改。这不是违背了 Clojure 偏好不可变数据结构、纯函数等的哲学吗?或者 core.async 是否只在根本无法避免可变事物的情况下使用?
  2. 由于“go”是一个宏(从而修改代码结构)并确保“

    (defn take-and-print [c]
     (println (<! c)))
    
    (def ch (chan 1))
    (>!! ch 123)
    
    (go (take-and-print ch))
    
    Assert failed: <! used not in (go ...) block
    

    在我看来,这阻碍了简单性和可组合性。为什么这不是问题?

  3. 也许由于前两个问题,许多带有 core.async 的代码使用了较低级别的构造,例如循环/递归而不是映射/过滤/减少。这不是倒退一步吗?

我哪里遗漏了重点?

提前致谢。


第一个担忧 - 是的,核心操作是副作用。然而,通道不存在通常与可变引用相关的问题,因为它们不代表“位置” - 通道是不透明的,您无法检查它们,事实上您甚至无法查询通道是否已关闭或无法读取零。

第二个问题——除了浅产量之外的任何事情都意味着整个计划的转变。这是一种权衡,我认为是合理的。组合的水平是通道而不是块,它们组合得很好。

最后一个问题是,您可以轻松地通过通道进行 Rx 风格的映射/过滤/归约操作,并且人们已经这样做了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

core.async不是违背Clo​​jure原则吗? 的相关文章

随机推荐

  • Laravel 查询生成器 - 高级条件子句(可选参数)

    我需要带有接受可选参数的查询生成器的子句 例如 请考虑以下情况 我们有三个搜索字段 产品标题 公司名称和位置 邮政编码 城市或州 2 3 8 种可能性 该位置与 OR 连接 WHERE location postal code LIKE O
  • 如何打开 matlab p 代码文件

    有谁知道如何查看 matlab p 代码文件的代码 p 代码文件专门存在 以便您可以共享代码 以便其他人无法查看它 换句话说 您看不到 Matlab p 代码文件的代码
  • 如何在 github 中拉取请求时忽略或排除文件

    我们有 4 个分支 1 dev 2 qa 3 staging 4 master 我们要更新并添加1 dev中的CODEOWNERS文件中的一些人 2 qa到4 master的CODEOWNER文件将被保留 因为 1 dev 有 4 个审稿人
  • Cytoscape.js 强制导向布局和节点放置

    我最近发现了 Cytoscape js 并想尝试一下力导向布局 arbor 和 springy 现在 我有几个问题 是否可以通过使用其中一种布局来实现图 其中节点放置基于某种算法并且不需要节点坐标 例如 在 VivaGraphJS 中 图会
  • 什么是合约(如 C++17 的建议)?

    我读到了有关合同的内容关于 C 17 的思考 http www open std org jtc1 sc22 wg21 docs papers 2015 n4492 pdf由 B Stroustrup 撰写 并协助进行了一次小型演讲 讨论了
  • CoreData 多对多添加错误

    不确定我在这里做错了什么 School has a to many to Student and Student has its inverse 一点测试代码如下 class Student interface School NSManag
  • 具有自定义背景的 android textInputEditText 无法正常工作

    我在 textInputLayout 中使用 textInputEditText 我必须为我的 editText 设置背景才能为我的 editText 实现边框视图 但是当我在 textInputLayout 上调用 setError 时
  • 如何在 Android Studio 中为目标添加系统映像

    我有一个选项呈灰色 我必须完成该选项才能推进项目 它说 No system images installed for this target 这个答案适用于 Eclipse 但我不确定是否有 Android Studio 的等效项 无法创建
  • 在 Java 8 中,如何使用 lambda 将 Map 转换为另一个 Map

    我刚刚开始研究 Java 8 并尝试 lambda 我想我应该尝试重写我最近写的一个非常简单的东西 我需要将字符串到列的映射转换为另一个字符串到列的映射 其中新映射中的列是第一个映射中的列的防御副本 列有一个复制构造函数 到目前为止我最接近
  • 如何查明我的 Mac 上安装了哪些 Python 库?

    我刚刚开始使用 Python 发现我可以导入各种库 如何找出我的 Mac 上存在哪些可以导入的库 我如何找出它们包含哪些功能 我似乎记得使用一些网络服务器类型的东西来浏览本地帮助文件 但我可能已经想象到了 从 Python REPL 命令行
  • ProviderManifestToken 2008 或 2012

    应用程序 NET 4 5 C 使用 EF6 和数据库优先方法 支持 SQL Server 2008R2 2012 和 2014 这个问题是关于ProviderManifestToken自动生成的 edmx 文件的属性 根据使用哪个版本的数据
  • org.hibernate.AssertionFailure:例如无法执行取消删除

    当我尝试在一些删除操作后进行读取时 我收到此休眠断言错误 我找不到任何有关此 无法执行取消删除 错误的信息 除了源代码 https github com hibernate hibernate orm blob master hiberna
  • git:显示所有已修改的文件 - 已暂存和未暂存

    我需要一个命令给我所有修改过的文件 这包括暂存 即新添加的文件 和非暂存更改 在普通列表我可以在脚本中使用它 虽然这个问题可能听起来很熟悉 但我只找到接近我想要做的命令 git ls files m 列出 非分阶段 修改但忽略了上演的和新的
  • 在 Ionic/Cordova 中接收 URL

    我正在尝试设置一种从另一个应用程序接收网址的方法 就像 您在浏览器中 单击共享 然后将链接发送到另一个应用程序 我的应用程序 我发现这个科尔多瓦插件 https github com Initsogar cordova webintent
  • chcp 65001 代码页导致程序终止且没有任何错误

    Problem 当我想要的时候问题就出现了inputPython 解释器中的 Unicode 字符 为简单起见 我在示例中使用了变音符号 但我第一次遇到波斯语字符 每当我使用 Python 时CHCP 65001 https ss64 co
  • OnIdle 事件中的异常不会冒泡

    在我的主窗体上 我订阅了两个事件 Application ThreadException 和 Application Idle 理论上 任何未捕获的异常都应该冒泡到主窗体 但是 如果异常发生在 OnIdle 事件中 则此方法不起作用 系统就
  • Altair 中具有自定义置信区间的折线图

    假设我有下面的数据框 我检查了文档 https altair viz github io gallery line with ci html但它仅基于单个列 可重现的代码 x np random normal 100 5 100 data
  • Visual Studio 中的 HTML5 Javascript API Intellisense 支持

    我开始使用 HTML5 CSS3 和新的 JavaScript API 我在 VS 2010 中注意到它不支持新的 JavaScript API 我想知道我是否可以对此做些什么 所以在 Vs2010 中如果我输入 var canvas do
  • SQL DROP TABLE 外键约束

    如果我想像这样删除数据库中的所有表 它会处理外键约束吗 如果没有 我该如何处理 GO IF OBJECT ID dbo Course U IS NOT NULL DROP TABLE dbo Course GO IF OBJECT ID d
  • core.async不是违背Clo​​jure原则吗?

    我看到许多 Clo jure 程序员对新的 core async 库充满热情 尽管它看起来很有趣 但我很难看出它如何符合 Clojure 原则 所以我有以下问题 它在任何地方都使用可变状态 正如函数名称通过感叹号所暗示的那样 例如 alt