clojure - Lisp 方言以及与 Java/C# 的比较

标签 clojure lisp scheme common-lisp

现在我通常使用 Java/C#(两者都喜欢,不能说我专注于其中一个)。
我最近一直在和一位 friend 讨论 F# 和 C# 之间的区别,当时他让我惊讶地说:“所以.. F# 听起来很像 lisp,但它没有‘瑞士军刀’的感觉。”
现在,我有点为这么说感到羞愧,但我不知道 lisp 是什么。
经过一番搜索,我看到lisp很有趣,但被多种方言和运行环境难住了。

这是我所知道的:
我知道3种方言:

  • Common Lisp(我的书签中有 Practical Common Lisp 书。
  • 方案(更“理论”的 CL 版本)
  • Clojure .似乎是在 JVM 上运行的 CL 版本。

  • lisp 的基本思想似乎是将代码用作数据。

    我想知道的是:
  • 不同方言的运行环境是怎样的?它们如何工作/安装(我的意思是它是像 Java 虚拟机这样的运行时,或者它是否需要其他东西,或者它是否被操作系统普遍支持(如在编译中))。以及如何获得它们(如果要获得的话)
  • 什么是更好的方言学习(我希望方言不是一种“学习语言”,而是一种你可以在之后充分使用而不会后悔没有学习其他语言的方言,例如,在尝试 Visual C++ 之前,应该先学习 C++,如果你知道我的意思)
  • 一般来说,lisp 的主要优点是什么(我看过很多页面都说它在开发和执行方面更快,但他们对细节都非常模糊)
  • 能不能普遍用于通用,还是专注于AI? (我的意思是,例如,如果有人可以用它制作一个完整的控制台应用程序,然后同样轻松地实现 OpenGL 并制作游戏。学习一种专门用于精确事物的语言是值得的,但目前对我来说不是)

  • 我也很高兴你们可以给我任何其他细节! (链接也很受欢迎!电子书等等。)

    编辑:这里的所有答案都非常有用。因此,我给了他们所有的 +1 代表,但选择了更具体的最好。谢谢你们。

    最佳答案

    在来 Lisp 之前,我还深入学习了 Java 和 C#,所以希望可以分享一些有用的观点。

    首先,所有 Lisp 都很棒,你绝对应该考虑学习一个。埃里克·雷蒙德 (Eric Raymond) 有一句名言:

    "Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot."



    Lisps 特别有趣和强大的原因是:
  • 同质性 - 在 Lisp 中“代码就是数据” - 语言本身是用 Lisp 数据结构编写的。这本身很有趣,但是当您开始使用它进行代码生成和高级宏时,它变得真正强大。有些人认为这个特性是 Lisp 可以帮助你成为一个关键原因 more productive than anyone else (保罗格雷厄姆短文)
  • REPL 的交互开发 - 其他一些语言也有这个,但它在 Lisp 文化中特别惯用且根深蒂固。在更改实时运行程序的同时进行开发是非常高效和自由的。最近引起我注意的例子包括 music hacking with overtoneediting a live game simulation .
  • 动态打字 - 关于这是否是优势的意见分歧更大(我个人是中立的),但许多人认为动态类型语言为您提供了生产力优势,至少在快速构建事物方面。天啊。

  • 我个人建议现在学习 Lisp 是 Clojure。 Clojure 有几个明显的优势使其脱颖而出:
  • 现代语言设计 - Clojure 以多种方式“改进”了 Lisp。例如,Clojure 为向量添加了一些新语法 []和哈希图 {}除了列表() .纯粹主义者可能不赞成,但我个人相信这些创新发现使该语言更易于使用和阅读。
  • 功能第一 - 所有的 Lisps 都适合作为函数式语言,但 Clojure 走得更远。所有标准库都是用纯函数编写的。所有数据结构都是不可变的。可变状态受到严格限制。支持惰性序列(包括无限序列)。从某种意义上说,它比其他 Lisps 更像 Haskell。
  • 并发 - Clojure 拥有独特的并发管理方法,并得到了非常好的 STM 实现的支持。值得一看excellent video更深入的解释。
  • 在 JVM 上运行 - 无论您如何看待 Java,JVM 都是一个出色的平台,具有极其出色的 GC、JIT 编译、跨平台可移植性等。这对某些人来说可能是一个入门障碍,但任何习惯了 Java 或 C# 的人都会很快感到宾至如归。
  • 图书馆生态系统 - 由于 Clojure 在 JVM 上运行,因此可以非常轻松地使用 Java 库。从 Clojure 调用 Java API 是微不足道的——就像任何其他函数调用一样,语法为 (.methodName someObject arg1 arg2) .随着庞大的 Java 库生态系统(主要是开源的)的可用性,Clojure 在实用性方面基本上超越了所有“小众”语言

  • 在应用方面,Clojure 被设计为一种完全通用的语言,因此可以用于任何领域——当然不限于人工智能。我知道有人在初创公司中使用它,将其用于大数据处理,甚至编写游戏。

    最后关于性能点:使用更高级别的语言结构基本上总是要付出轻微的性能损失。但是,根据我的经验,Clojure 与 Java 或 C#“足够接近”,您不会注意到通用开发的差异。 Clojure 是 有帮助始终编​​译 并且您可以使用 可选类型提示 获得静态类型的性能优势。

    flawed benchmarks (截至 2012 年初)使 Clojure 的速度是 Java、Scala 和 C# 等静态类型语言的 2-3 倍,比 Common Lisp 落后一点,比 Scheme (Racket) 领先一点。

    关于clojure - Lisp 方言以及与 Java/C# 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9577965/

    相关文章:

    clojure - :key parameter in add-watch function是什么意思

    clojure - 基座 : what data flow can you use to render a newly initialized empty list?

    Clojure:在调用者的命名空间中解析的宏中的限定关键字?

    lisp - Lambda 微积分 CONS Pair implementation with Lisp

    macros - DrRacket 中的 While 循环宏

    java - 引用从 Clojure 文件生成的类的 Java 文件的 Leiningen 编译错误

    lisp - delete-if 中谓词的多个参数

    python - 在 Common Lisp 中延迟生成质数

    list - 方案:当我使用两个原子时,我在中间得到一个点。为什么?

    functional-programming - 在 scheme 中转换具有两次递归调用的函数以使其成为尾递归