如何应用clojure?

如何应用clojure?,clojure,Clojure,我正在学习Clojure,我真的很喜欢它的一些特性。现在是时候考虑一些真正的“宠物项目”了,我意识到我不知道如何实际使用Clojure 我看到许多web和模板框架(例如Compojure),但不知何故,我怀疑它是否值得。我觉得从长远来看,它不能满足您使用Spring、Hibernate和JavaEE堆栈的某些部分来解决的实际应用程序的需求 另一方面,我看到并发特性有很大的潜力,但我对如何真正使用它们缺乏想法 有足够的背景,我的问题是: Clojure和函数式编程的可行应用是什么?对于一个pet

我正在学习Clojure,我真的很喜欢它的一些特性。现在是时候考虑一些真正的“宠物项目”了,我意识到我不知道如何实际使用Clojure

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

另一方面,我看到并发特性有很大的潜力,但我对如何真正使用它们缺乏想法

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

  • Clojure和函数式编程的可行应用是什么?对于一个pet项目,你能提出什么样的想法,而不是将我用OO/JavaEE所做的事情改写成不同的语法?我正在寻找真正发挥Clojure潜力的东西,并找到一种比OO/结构化编程感觉更好(不仅仅是语法)的解决方案
  • Clojure和Java的混合是否常见,或者至少合理?我的意思是在95%的Java项目中使用Clojure作为小型库,或者在用Clojure编写的核心之上构建Java应用程序


编辑:感谢所有精彩的答案。他们都非常鼓舞人心。因此,如果您还有其他需要添加的内容,请继续,不要因为一项内容已被接受而感到延迟。

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

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

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

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

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

我想你应该读一下Jörg W.Mittag的题为“真实世界Haskell编程”的问题解答。他提出了许多极好的观点。请继续阅读我在现实世界问题上对FP的看法;滚动横线,查看两个实际问题的答案

有许多以FP为中心的公司,他们似乎真的很擅长他们所做的事情;例如,google Jane Street(OCaml)、Galois(Haskell)、FlightCaster(Clojure用于后端重载;我似乎记得读过他们的前端目前是用Rails完成的)。据说,自动交易策略通常是用面向FP的语言编写的;尽管我没有内部数据来证实这一点,但这确实是有道理的。有关Clojure的其他示例,请参阅

有些人似乎在解决Rails、Django等现实世界应用程序的需求方面取得了一定程度的成功。他们似乎觉得没有必要接触J2EE和friends。并不是说这些语言与FP有很大关系,而是它们与FP相似,因为它们与当前的“企业语言”完全不同


至于两个实际问题:

为什么不拿起你上一次想做的事情,在Clojure做呢?显然,任何事情都可以用Java来完成(大多数事情可能都是这样),但更精简的语言可能会使产品更干净、体验更愉快、耗时更少等等


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

我一直在使用Clojure开发一个小型web应用程序,虽然该应用程序没有什么特殊之处,但它不能用其他语言完成,写这本书的经历完全不同。我曾经使用ASP.net编写过web应用程序,搬到Clojure不是为了学习不同的语法,而是为了学习不同的思考和编程方式。无论你选择做什么样的项目,都需要学习不同的思考方式,因此我不太担心找到完美的功能项目,而更担心找到你只想做的事情。

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

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

当然,并非所有的问题在函数式语言中都有同样自然的解决方案