【问题标题】:How to apply clojure? [closed]如何应用clojure? [关闭]
【发布时间】:2010-08-16 20:04:57
【问题描述】:

我正在学习 Clojure,我真的很喜欢它的一些功能。是时候考虑一​​些真正的“宠物项目”了,我意识到我不确定如何真正使用 Clojure。

我看到许多网络和模板框架(例如 Compojure),但不知何故我怀疑它是否值得。我觉得从长远来看,它无法满足您使用 Spring、Hibernate 和 Java EE 堆栈的某些部分解决的实际应用程序的需求。

另一方面,我看到并发功能的巨大潜力,但我对如何真正使用它们缺乏想法。

足够的背景,我的问题是:

  • Clojure 和函数式编程的可行应用有哪些?你能建议一个宠物项目的什么想法,它不会将我用 OO/Java EE 所做的东西改写成不同的语法?我正在寻找能够真正发挥 Clojure 潜力并带来比 OO/结构编程感觉更好(不仅仅是语法)的解决方案的东西。
  • 混合 Clojure 和 Java 是否常见,或者至少是合理的?我的意思是在 95% 的 Java 项目中将 Clojure 用于小型库,或者在用 Clojure 编写的核心之上构建 Java 应用程序。

编辑:感谢所有出色的答案。他们都非常鼓舞人心。因此,如果您还有其他要补充的内容,请继续前进,不要因为已被接受而推迟。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    回答问题的“背景”部分:

    我认为您应该阅读 Jörg W. Mittag 的 answer 以了解题为“真实世界 Haskell 编程”的 SO 问题。他提出了许多出色的观点。请继续阅读我对现实世界问题中 FP 的看法;滚动越过水平线以获取两个实际问题的答案。

    有许多以 FP 为中心的公司似乎非常擅长他们正在做的事情;例如,google Jane Street (OCaml)、Galois (Haskell)、FlightCaster(用于后端繁重工作的 Clojure;我似乎记得读过他们的前端目前是在 Rails 中完成的)。据称自动交易策略通常用面向 FP 的语言编码;这确实很有意义,尽管我没有内部数据来证实这一点。有关 Clojure 的其他示例,请参阅the list of companies on the success stories page

    有些人似乎在满足 Rails、Django 等现实世界应用程序的需求方面取得了一定程度的成功。他们似乎觉得没有必要接触 J2EE 和朋友。并不是说这些与 FP 有很大关系,但它们与 FP类似,因为它们 没有 像现在的“企业语言”。


    至于两个实际问题:

    为什么不直接选择你最近想做的事情并在 Clojure 中做呢?显然,任何事情都可以用 Java 完成(大多数事情可能已经完成),但更精简的语言可能会使产品更简洁、体验更愉快且耗时更少等。

    关于混合 Clojure 和 Java —— 我已经看到大量的 Clojure 代码使用直接用 Java 编码的几个类(无论出于何种原因)。我尝试过另一种方式,这有点痛苦,因为接口继承比 Clojure 中的类继承要简单得多,Java 代码中的意外耦合会严重干扰 Clojure 代码的能力以最自然的方式做事等。不过,在 Clojure 中扩展 Java 程序是完全可能的,对于担心的 Java 开发人员来说,这似乎是一种特别安全和理智的试验方式。

    【讨论】:

      【解决方案2】:

      函数式编程几乎可以应用于任何任务。 Web 应用程序、科学应用程序、游戏,应有尽有。

      将 Clojure 和 Java 混合使用是很常见的,因为 Clojure 没有很多专门用于 I/O 或网络之类的库。

      已经拥有大量 Java 代码的组织可以将 Clojure 用于其 Java 项目的一小部分。

      对于新项目,使用 Clojure 作为高级驱动语言通常更有效,必要时调用 Java 库。

      【讨论】:

      • 我想补充一点,虽然起初在 Clojure 中做讨厌的 Swing GUI 可能看起来很痛苦,但如果你使用一些精心设计的宏,它实际上一点也不坏(感谢 Stuart,其中几个),并使用 refs 协调整个 GUI 的变化。即add-watch 是你的朋友。 Clojure 用途广泛,而且非常好用。
      【解决方案3】:

      我一直在使用 Clojure 开发一个小型 Web 应用程序,虽然该应用程序并没有什么特别之处,无法用其他语言完成,但编写它的体验却完全不同。我使用 ASP.net 编写了 Web 应用程序,迁移到 Clojure 不是为了学习不同的语法,而是更多地学习不同的思考和编程方式。无论您选择从事何种项目,都必须学习不同的思维方式,因此我不必担心找到完美的功能性项目,而更多地担心找到您只想从事的工作。

      【讨论】:

        【解决方案4】:

        我认为这个问题的答案与您的项目所嵌入的环境以及强加给您的约束有很大关系。如果没有社会因素,我认为 Clojure 可能至少与 Java 一样“好”一门语言,但可能是您需要最后一点性能的情况除外。即使在这些情况下,事情也并不像看起来那么简单。一方面,某些未来版本的 Clojure 可能在理论上可以被编译为与 Java 编译成一样“快”的字节码(假设程序员在瓶颈处做更多的工作。)更重要的是,优化是一个多因素问题,其中程序员的生产力和代码的灵活性在很大程度上是一个因素。因此,虽然在某种意义上说 Clojure 比 Java 慢是准确的,但在讨论特定应用程序的性能时,这种意义可能并不重要。

        所以我想说,如果您不考虑社会因素,Clojure 的用例就接近于 Java 的超集。我不会尝试在 clojure 中编写 Linux 内核模块...

        当然,并非所有问题在函数式语言中都有同样自然的解决方案。但是人们已经提出了一些有趣的方法来处理一些 FP 似乎很难映射到域的情况,无论如何,Clojure 实际上为您提供了足够的纯 FP 逃生舱口,如果您真的觉得有必要编写您的部分你可以用命令式编程(当然,在这种情况下你放弃了 Clojure 的一些好处。)在最坏的情况下,你可以使用 Clojure 来驱动 Java 库,就像在 Java 中一样。 . 很难想象这是一个好主意的情况,但在大多数情况下,这不会明显逊于仅使用 Java,而且在许多情况下可能会更好。

        我仍然是 Clojure 的新手,尽管我已经使用 CL 和方案进行编程很长时间了,并且我花了大约五年的时间编写 Java 来谋生。但我可能更喜欢 Clojure 而不是 Java,即使我完全不了解它,只要不涉及社会因素。

        不过,忽略社会因素是错误的。我作为一名 Lisp 程序员已经足够长的时间了,对 Lisp 在给定上下文中的工作情况有很好的直觉。我已经将 Lisp 引入到商业环境中,它已经取得了巨大的成功,并且我已经将它引入了它实际上不是的环境中。我会长期认真地考虑将你的职业生涯押在成功地将程序员团队转变为任何 Lisp,包括 Clojure,尤其是如果他们不太热衷于这个想法的话。

        只是为了让您了解我认为 Clojure 可能有用的用途,我目前正在 Clojure 中编写大量与扑克相关的代码。其中一些非常简单(从七张牌中找出最好的五张牌),而另一些则更有趣(查看某人的游戏历史并使用一些启发式方法和一些基本统计数据从中提取有意义的趋势) .) 它对 Clojure 复杂的并发机制的要求并不高,但在 Clojure 中(至少对我而言)比在 Java 中要好得多。

        当然还有其他一些案例,有人可能会描述 Clojure 因其复杂的并发管理机制而大获全胜的地方,等等。我的目标是更温和的东西——我只是指出,即使你不需要这些机制 您可能会发现 Clojure 是一种非常适合通用编程的语言,尽管如果您来自命令式/OO 背景,它需要您重新考虑如何抽象事物。嘿,如果您需要并发机制(正如您可能需要的那样),至少您已经了解 Clojure。

        【讨论】:

          【解决方案5】:

          我喜欢在学习一门新语言时编写游戏程序。

          我正在学习 Clojure 并开始编写蜘蛛纸牌播放器。如果你从未玩过蜘蛛,请不要开始;这是非常附加的:-)。见http://www.spidersolitaire.org/

          在编写这个游戏时,我开始使用一些我想学习的东西:函数式编程、并发、Java 互操作(用于 Swing)等。

          我也开始编写 Bejeweled 播放器 (http://www.popcap.com/games/free/bejeweled2),但在寻找游戏评分的最终规则时遇到了问题。

          【讨论】:

            猜你喜欢
            • 2015-12-25
            • 2012-12-26
            • 2011-08-28
            • 2011-05-14
            • 2021-06-07
            • 1970-01-01
            • 2015-05-07
            • 2015-05-18
            相关资源
            最近更新 更多