Son*_*oul 15 .net clr functional-programming clojure .net-4.0
我仍在努力了解clojure的明显好处.我知道它是一种动态的,[几乎]纯函数式的语言,非常适合单元测试,并发和快速开发.
我正在观看其创始人Rich Hickey的演讲.
在第25分钟左右,您可以通过动态定义列表和向量来查看clojure使编程变得简单的许多精彩方法:
( 123) [123]
Run Code Online (Sandbox Code Playgroud)
能够将这些动态定义的向量用作函数
([ 123] 0)
Run Code Online (Sandbox Code Playgroud)
能够在新定义的字符串上调用函数
(.ToUpperCase "foo")
Run Code Online (Sandbox Code Playgroud)
正如Rich所说,"文字的语法是语言的语法"......美丽.
但是不可能在.net 4.0中进行这种编程风格吗?(虽然更健谈)
(new[] {1,2,3})[0]
"foo".ToUpper()
Run Code Online (Sandbox Code Playgroud)
etc..net也可用于以功能方式编程(虽然它没有强制执行)
这些是微不足道的例子,但似乎这是clojure的基础.有哪些功能可以将clojure分开,并在某些情况下使其成为更好的选择?
mik*_*era 23
我个人认为Clojure的语法非常有效,简洁甚至美观一旦你掌握了它.但是在我看来,选择一种语言并不是最有说服力的理由.
在Java和C#多年后,我更喜欢将Clojure作为我的"通用开发语言"的个人原因是:
宏元编程 - Clojure是一个Lisp并继承了Lisp家族"Code is Data"的座右铭.因为语言本身是以一种本身就是语言中的数据结构的形式编写的(这称为Homoiconicity),所以编写以您选择的任何形式生成代码的代码都是微不足道的.您基本上永远不需要再担心"设计模式" - 如果您想要使用的语言中缺少某些内容,您只需使用宏扩展语言并继续......
默认情况下动态 - 默认情况下,Clojure是一种动态语言,这意味着它可以灵活地为大多数任务"做正确的事".这样可以提高您的工作效率.示例是自动溢出到BigInteger算法,能够将您喜欢的任何对象类型放在集合中,从不需要声明参数类型等.同时,您可以指定类型信息以在需要时提高性能(通过直接使用基元或提供类型提示(例如) - 因此您可以在需要时获得非常快的性能.
强调使用持久,不可变数据结构和惰性求值的函数式编程 - 特别是所有核心Clojure库都是为默认支持这种开发风格而设计的.一旦掌握了它(我承认这并不容易......)FP非常强大.虽然你可以用几乎任何语言模拟"FP风格"的代码,但只有当它成为语言的普遍特征时才能真正获得全部优势(Clojure,Haskell,ML spring最明显的想法)
出色的多核并发性.感谢一个非常新颖的STM系统,我相信Clojure目前拥有任何语言的最佳并发故事(请参阅此视频,以获得Rich Hickey本人的更多详细说明)
开源库生态系统 - 我是开源的忠实粉丝,Clojure是一种非常"开源"的友好语言.语言本身和几乎每个库都是开源的,如果这对你来说还不够,那么调用Java库是微不足道的.鉴于整个Java/JVM开源生态系统的广度,这意味着您可以在库中轻松获得您想要做的任何事情(这是大多数新语言的一大优势!)
JVM互操作性 - 您可能或不关心这一点,但就个人而言,能够与Java/JVM领域中的库和工具集成是一项重要功能.Clojure使这很容易 - Clojure对象是引擎盖下的JVM对象,调用Java方法通常很简单(.someMethod someObject someParameter)
REPL的交互式开发 - 典型的Clojure开发风格是与REPL中正在运行的Clojure程序进行交互.您可以动态地重新定义任何内容,而无需进行编译/构建/测试循环.这是一种非常有效的工作方式 - 我基本上在REPL上构建一个正在运行的程序,然后将正确的命令复制到源文件中以便将来运行.愚蠢的例子 - 我有一个单行程,能够使用Incanter从图表中正在运行的程序可视化各种数据结构.如果出现问题,我可以立即以直观的方式看到这一点,这就让我节省了数周的调试时间....
社区 - 我个人喜欢Clojure社区,这个社区虽小但发展迅速.它具有实用主义(即完成任务),乐于助人以及关心做事的正确组合,我认为这很重要.
Jef*_*ter 11
在Clojure的理由给出更好的细节比我可以,但我的理由学习Clojure的是:
mqp*_*mqp 10
Clojure相对于C#的主要便利性大致按照便利性排序,顶部有最大的改进:
正如您所观察到的,文字集合的语法更加令人愉快.主要用于文字哈希映射,它在C#中非常难看(你需要写出泛型类型),你不会定义一个内联.C#new Dictionary<string, int> { { "Joe", 6" }, { "Steve", 18" } }变成了{"joe" 6, "steve" 18}.
功能参数的强大解构与前面提到的集合文字语法一致.
通过关键字,您可以轻松地以符号方式引用内容,而无需花时间来定义枚举.
核心库有许多有用的内置函数,用于LINQ缺少的函数式编程.
核心库有非常好的不可变向量和映射,可以很好地与上述内置函数一起使用.
由于核心数据结构是不可变的,因此该语言具有非常方便的STM事务,用于管理并发性,无需额外工作即可正常工作.
元数据非常方便; 它允许您以比例如定义表示原始数据加其他东西的一次性类型更容易的方式"粘贴"与其他数据一起使用的信息.
通常你想要使用你无法控制的类型的抽象; Clojure协议使这样做变得容易,而在C#中几乎不可能,因为你无法扩展别人的类型来实现接口.(你甚至不能做一些琐碎的事情,比如制作一个INumeric接口.)
对于扩展语言,宏比C#表达式树更容易使用和更强大.
您可以在Clojure.org上找到有关上述大部分内容的更多信息.
([1 2 3] 0)不等于(new [] {1,2,3})[0],因为在clojure [1 2 3]中可以传递给一个函数,该函数接受任何带有int和返回一个值.例如:
(defn do-something [mylist myfunc]
(map myfunc mylist))
(do-something [0 2] [1 2 3])
Run Code Online (Sandbox Code Playgroud)
=>(1 3)
这允许您重用do-something与任何需要1个arg的函数并返回一个值.