gpt4 book ai didi

.net - clojure 与 C# 语言

转载 作者:行者123 更新时间:2023-12-03 15:07:38 28 4
gpt4 key购买 nike

我仍在努力了解 clojure 的明显好处。我知道它是一种动态的、[几乎] 纯函数式语言,非常适合单元测试、并发和快速开发。

我在看 this presentation由其创始人 Rich Hickey 编写。

在第 25 分钟左右,您可以看到 clojure 通过动态定义列表和向量的能力使编程变得简单的许多奇妙方式:

( 123) [123]

能够将那些动态定义的向量用作函数
([ 123] 0)

能够在新定义的字符串上调用函数
(.ToUpperCase "foo")

正如 Rich 所说,“文字的语法就是语言的语法”……漂亮。

但是在 .net 4.0 中不能进行这种编程风格吗? (虽然更健谈)
(new[] {1,2,3})[0]
"foo".ToUpper()

等等..net 也可以用于以功能方式编程(尽管它没有强制执行)

这些都是微不足道的例子,但似乎这是 clojure 的基础。有哪些特性使 clojure 更加与众不同,并使其在某些情况下成为更好的选择?

最佳答案

我个人认为,一旦掌握了它的窍门,Clojure 的语法就非常有效、简洁甚至美观。但是,在我看来,这并不是选择语言的最令人信服的理由。

在使用了多年 Java 和 C# 之后,我更喜欢 Clojure 作为我的“首选通用开发语言”的个人原因是:

  • 宏元编程 - Clojure 是一个 Lisp 并继承了 Lisp 家族“代码即数据”的座右铭。因为语言本身是以一种本身就是语言中的数据结构的形式编写的(这被称为 Homoiconicity),所以编写代码以您选择的任何形式生成代码都是微不足道的。您基本上再也不需要担心“设计模式”——如果您想使用的语言中缺少某些东西,您只需使用宏扩展该语言并继续.....
  • 默认动态 - 默认情况下,Clojure 是一种动态语言,这意味着对于大多数任务,它会以灵活的方式自动“做正确的事情”。这会提高您的工作效率。例子是 BigInteger 算法的自动溢出,能够将您喜欢的任何对象类型放入集合中,从不需要声明参数类型等。同时,如果需要,您可以指定类型信息以提高性能(通过直接使用原语或例如提供类型提示) - 这样您就可以在需要时获得非常快的性能。
  • 强调函数式编程具有持久的、不可变的数据结构和惰性求值——特别是所有核心 Clojure 库都旨在默认支持这种开发风格。一旦你掌握了它的窍门(我承认这并不容易......)FP 异常强大。虽然您几乎可以在任何语言中模拟“FP 风格”代码,但只有当它是该语言的普遍特性时,您才能真正获得全部优势(Clojure、Haskell、ML 最明显地想到)
  • 优秀的多核并发 .多亏了一个非常新颖的 STM 系统,我相信 Clojure 拥有目前所有语言中最好的并发故事(请参阅此 video for more elaboration by Rich Hickey himself)
  • 开源库生态系统 - 我是开源的忠实粉丝,Clojure 是一种非常“开源”友好的语言。语言本身和几乎每个库都是开源的,如果这对您来说还不够,那么调用 Java 库就很简单了。鉴于整个 Java/JVM 开源生态系统的广度,这意味着您想做的几乎所有事情都可以在库中轻松获得(与大多数新语言相比,这是一个很大的优势!)
  • JVM 互操作性 - 您可能关心或不关心这一点,但就我个人而言,能够与 Java/JVM 领域中的库和工具集成对我来说是一个重要的特性。 Clojure 使这变得非常容易——Clojure 对象是底层的 JVM 对象,调用 Java 方法通常就像 (.someMethod someObject someParameter) 一样简单。
  • REPL 的交互式开发 - 典型的 Clojure 开发风格是在 REPL 上与正在运行的 Clojure 程序进行交互。您几乎可以即时重新定义任何东西,而无需进行编译/构建/测试周期。这是一种非常高效的工作方式——我基本上在 REPL 上构建了一个正在运行的程序,然后将正确的命令复制到源文件中以供将来运行。愚蠢的例子 - 我有一个单行程序,它能够使用 Incanter 从图表中的运行程序中可视化各种数据结构。如果出现问题,我可以立即以视觉方式看到,仅此一项就为我节省了数周的调试时间....
  • 社区 - 我个人喜欢 Clojure 社区,它虽小但发展迅速。它正确地结合了实用主义(即把事情做好)、乐于助人和关心把事情做好,我认为这很重要。
  • 关于.net - clojure 与 C# 语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279531/

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