在 Clojure 中使用 multimethods 代替 cond 有什么好处?

2024-01-18

为什么 Clojure 中的多方法不应该简单地用 cond 表达式替换?

在看了第 1 章中多种方法的简单示例后,我受到启发而提出了这个问题。拉斯·奥尔森 (Russ Olsen) 的书的 5 篇获取 Clojure.

在回答类似问题时(Clojure 中 multimethod 与 cond 的性能 https://stackoverflow.com/questions/28577115/performance-of-multimethod-vs-cond-in-clojure),用户丹尼尔·康普顿说

多种方法允许开放扩展;其他人可以扩展您对任意表达式的多方法调度。 Cond 表达式不允许其他人甚至您自己的代码进行扩展。

但我根本不清楚“开放扩展”和“封闭扩展”在这种情况下意味着什么,因为在我看来,多方法和条件表达式都可以很容易地编辑或扩展。

那么...为什么 Clojure 中的多方法不应该简单地用 cond 表达式替换呢?

或者,同样地,使用 multimethods 到底如何或何时才能比使用 cond 更好或更优雅?


这里的关键点是“允许开放扩展”。任何人都可以添加新内容 多种方法的分支 - acond是硬编码的:新调度 必须添加到cond代码就位。

假设:您有一些小部件并且想要绘制它们。小部件有 A:type并且您想发送如何draw就那种类型。

写一篇大cond对于所有小部件你知道将工作。但现在 对于每个新的小部件,您必须触摸cond源码并修改。 这can完全没问题,例如实际应用,不需要 扩大。

用多种方法做同样的事情,anyone可以实施一个draw他们的 小部件。所以you在编写代码时并不知道所有这些。这使得 对于例如,这是一种更好的(甚至是强制性的)方法图书馆。

现在想象一下,您已经决定cond图书馆方法 你正在写。现在任何拥有新小部件的人都必须编写自己的小部件draw,先派遣他们的抽奖,然后致电您的draw。还有他们 必须确保他们的draw到处都被调用,无论你在哪里draw被要求让它工作(这通常是不可能的) 一种干净的方式)。

直接在 Clojure 核心中使用多方法的一个流行示例是print-method https://github.com/clojure/clojure/blob/f9b04ae5f7fd9f11ea7a431675f4ec2d23f295f5/src/clj/clojure/core.clj#L3665-L3667。 通过这种方式,任何人都可以为其类型和游戏实现“序列化” 很好。

其他值得一提的例子有Clojure.测试 https://github.com/clojure/clojure/blob/28efe345d5e995dc152a0286fb0be81443a0d9ac/src/clj/clojure/test.clj and 积分 https://github.com/weavejester/integrant.

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

在 Clojure 中使用 multimethods 代替 cond 有什么好处? 的相关文章

  • Haskell if-then-else 条件中的“解析输入错误”

    当我尝试编译以下 do 块时 它会抛出错误 输入 conn 上的解析错误 我尝试了许多不同的 if then else 语句配置 但均无济于事 在我添加条件之前 数据库逻辑就起作用了 所以这没有问题 else 中是否有太多行 有没有办法在不
  • 将一种类型的对象声明为另一种类型的实例有什么好处? [复制]

    这个问题在这里已经有答案了 可能的重复 Base b2 new Child 是什么意思 表示 https stackoverflow com questions 4447924 what does base b2 new child sig
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • Clojure 缩减函数的目的

    clojure 的目的是什么reduced函数 在 Clojure 1 5 中添加 https clojure github io clojure clojure core api html clojure core reduced htt
  • 在不同上下文中使用的多态变量 haskell

    我有以下一段 Haskell 代码 foo Num a gt a gt a gt Either Integer Double gt Either Integer Double foo f x case x of Left i gt Left
  • Swift 中的协议与多态性

    我对面向对象编程相当陌生 我正在尝试了解协议 委托和多态性 我最近观看了一个培训视频 其中宣传当您有两个相似且具有相似方法实现的类时 协议是优雅地实现此目的的最佳解决方案 这就说得通了 然而 一些额外的研究让我发现了多态性 听起来这也是一种
  • Clojure实现多线程的最佳方法?

    我正在开发一个用 Clojure 编写的 MUD 客户端 现在 我需要两个不同的线程 一种接收用户的输入并将其发送到 MUD 通过简单的套接字 另一种读取 MUD 的输出并将其显示给用户 我应该只使用 Java 线程 还是应该使用一些特定于
  • SQL Server中根据条件进行计数

    有谁知道如何在 SQL Server 中根据条件进行计数 Example 如何对表中名称为 system 的记录以及 CaseID 记录总数进行列计数 顾客表 UserID CaseID Name 1 100 alan 1 101 alan
  • Clojure 的映射和减少 Monad...Juxt Monad 怎么样?

    在学习 Clojure 的过程中 我花了很长时间试图理解 monad 它们是什么以及我们如何使用它们 但没有取得太大成功 然而 我发现了一个很棒的 Monads for Dummies 视频系列 http vimeo com 2071730
  • 使用 swank-clojure 攻击 Clojure 库的工作流程

    Clojure 库的黑客攻击有典型的工作流程吗 假设我的应用程序 Foo 依赖于第三方库 Bar 该库是从存储库获取的 并通过以下方式包含在项目 Foo 中lein deps 然后 假设我想破解 Bar 库 所以我从 github 克隆它
  • Clojure 的分析工具?

    有谁知道 Clojure 有一个好的分析工具或库吗 我更喜欢可以从 REPL 中使用的东西 类似于 with profiling 过去是在 Allegro Common Lisp 中 有什么类似的事情吗 或者您是否有过与 Clojure 配
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • 虚拟继承情况下类的大小

    有人可以解释一下涉及虚函数的虚拟继承情况下类的大小吗 class A char k 3 public virtual void a class B public A char j 3 public virtual void b class
  • 在 Android 上运行 Java 字节码 - DalvikVM 之上的 Sun JVM

    由于 java 实现 OpenJDK 和Android的虚拟机DalvikVM是开源的 因此必须可以在Google的DalvikVM之上实现Sun的JavaVM 这将使运行基于 JVM 的应用程序和语言成为可能 Clojure Jython
  • 给定 A 列中的值,在 EXCEL 中查找 B 列中的最小值/最大值

    我有一列公交车站 ID 号 A 列 B 列是不同的时间 其中每个值都是一个人上 下车的时间 为了知道公交车停了多长时间 我想在给定 A 的某个值的情况下找到 B 列中的最大值 最小值之间的差异 84009 9 17 38 AM 84009
  • Python:numpy/pandas 根据条件更改值

    我想知道是否有更快 更 Pythonic 的方法来执行以下操作 例如使用一些内置方法 给定一个 pandas DataFrame 或 numpy 浮点数组 如果该值等于或小于 0 5 我需要计算倒数并乘以 1 并用新计算的值替换旧值 转变
  • 正则表达式接受 4 条规则中的 3 条

    我似乎无法让正则表达式正确满足以下要求 长度在 8 到 20 之间的字符串 必须包含至少 1 个大写字母字符 至少 1 个小写字母字符 以及至少 1 个数字或至少 1 个特殊字符字符 或两者 假设特殊字符仅限于包括 我最初是这样写的 A Z
  • 与 google guice 相当的 clojure 是什么?

    我遇到了 google guice 但无法真正理解它以及它的作用 尽管它周围似乎有很多炒作 我希望从 clojure 的角度了解该库 以及为什么在 clojure 应用程序中需要 不需要它 以及该语言中是否内置了类似的内容 由于 Java
  • 在循环中使用 if 语句? - 加工

    假设我必须在 for 循环中使用 if 语句 并且 for 循环在特定条件下触发 而 if 语句仅在 for 循环达到特定阶段时触发 例如 条件是一个计数器 当发生特定事件 例如球从屏幕上掉下来 时 该计数器会进行计数 每次球穿过屏幕时 都
  • Emacs htmlize 在批处理模式下?

    我喜欢在 emacs 中使用 htmlize file 将 clojure 源文件转换为 html 我想从 linux 命令行使用它 或者从 clojure 本身以编程方式使用它 I tried emacs eval htmlize fil

随机推荐