2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多关于它的工作方式的信息。

+2
Clojure

我是Clojure的大粉丝,因为其简洁性、多线程模型、语言稳定性和卓越的Java互操作性。但我更是静态类型的粉丝,这对于拥有多个开发者的项目非常有帮助。

TypeScript为JavaScript增加了一层出色的类型检查,这有助于在编译时消除许多编程错误。它还打开了许多编辑器/ IDE工具的可能性。我认为TypeScript是JavaScript发生的最好的事情。

我想知道Clojure核心团队或任何有能力且有资源的组织是否正在考虑为Clojure开发类似于TypeScript的东西?

如果没有,为什么?

谢谢

1 答案

+5

Clojure核心团队没有计划为Clojure开发静态类型,因为我们认为并不必要。我们的努力集中于spec(https://clojure.org/about/spec),它为Clojure数据和函数的描述性规范提供了支持。

TypeScripted Clojure项目(https://typedclojure.org/)是Ambrose Bonnaire-Sergeant在攻读博士学位期间进行的一项相当大的努力。您可能还对Spectrum(https://github.com/arohner/spectrum)感兴趣,它是基于规格的静态类型检查。据我所知,这些都没有得到广泛的使用,也没有特别的活跃开发。

谢谢你的回答。

我们已经研究了规范,发现它主要是一个运行时问题。对于文档和测试非常有帮助,但在我看来,它无法完成类型系统所做的工作。

我们是一家小型初创公司,有几名程序员。当我们开始时,我们认真考虑了Clojure,但最终我们决定采用Scala,因为它有强大的类型系统。当需要使用JavaScript时,我们也使用TypeScript。

我相信许多Clojure粉丝都和我有同样的处境。他们喜欢它,并想用它来处理重要工作,但由于缺少类型检查,不得不选择其他语言。为了澄清,我并不是说Clojure不是适合重要工作的语言。我的意思是,对于某些团队或公司来说,在项目选择语言或技术堆栈时,类型系统是一个重要因素。

我理解Clojure的无类型是一个特性。但TypeScript证明了良好的类型系统可以给一个灵活且强大的无类型语言的生态系统增加巨大价值。

顺便说一句,前几天我在2017年Clojure会议中的一次关于抽象的科技演讲中遇到了zak tellman的发言。我记得他分享了一种观点,即在通常的Lisp语言家族中,包括Clojure,过于灵活,这在某种程度上是它成功的一个障碍。
TypeScript并没有“证明”类型系统“增加了巨大的价值”,但我认为你评论中的关键点是“对于一些团队...类型系统是一个重要因素”。而对于那些重视灵活性的团队来说,像Clojure这样的语言将比Scala更适合。

在我工作的地方,我们尝试引入Scala,但类型系统让每个人都感到不舒服,所以我们改用了Clojure。那是在九年前的,现在我们完全在Clojure后端运行了约四十个在线约会网站,拥有数百万客户,我们发现它提供的强大和灵活性使我们能够非常快速地更改和改进系统。我们在生产中大量使用Spec进行输入验证,以及在测试中处理各种事情,这些事情有些人可能依赖类型系统来完成,但Spec更强大,因为它既可以从形状又可以从行为上来描述,这是类型系统无法做到的。
感谢您分享您的见解。

请问您在使用哪个Clojure Web框架?

REST API服务是我们服务的关键部分。我们曾是Netty的忠实粉丝,并在我们成立自己的公司之前,曾在Netty上运行了一个自定义构建的REST API框架。因此,当我们开始时,我们想要选择一个基于Netty的Web/REST框架。我们评估了Clojure的,发现大多数Clojure Web框架都没有积极维护,或者缺乏生产案例。我们最感兴趣的,aleph,似乎也被遗弃了。

这也是我们选择Scala的部分原因,因为Akka http。但是,我仍然渴望把Clojure引入到其他项目中,正是由于您提到的那些原因。

了解您的技术栈将有很大帮助。谢谢。
我想加上,clj-kondo最近增加了一种简单的类型检查形式,这也值得一看:[链接](https://github.com/borkdude/clj-kondo/blob/master/doc/types.md)
至于您的评论,很多人在生产环境中成功使用Aleph。所以我认为这是一个可行的选择。

换句话说,我相信支持netty(及其他)的最积极维护的HTTP服务器可能是Pedestal:[链接](https://github.com/pedestal/pedestal)

否则,Clojure中最受欢迎且积极维护的选择将是ring:[链接](https://github.com/ring-clojure/ring),它附带了ring-jetty-adapter,可用于与Jetty服务器一起使用。

建议您阅读以下指南作为进一步学习:[链接](https://purelyfunctional.tv/mini-guide/clojure-web-servers/)

此外,请注意,您可以直接使用Netty,Clojure的Java互操作性非常好,远好于Scala。因此,直接使用Java服务器接口也是一个不错的选择。
by
谢谢。

正如你所说,如果我们决定从Clojure开始做点什么,我们可能会直接使用Netty。我们在Netty之上进行了Java互操作实验,一切都很顺利。裸硬件方法将给我们带来更多的灵活性。
by
我们不使用Clojure的任何“框架”。我们使用库的组合。Ring几乎是无所不能的核心。我们在几乎所有应用中使用Compojure进行路由(我们在一个中使用了Bidi)。我们主要使用嵌入式的Jetty网络服务器(通过“标准”Ring适配器),但基于命令行参数和环境变量,我们也可以启动http-kit。我们直接使用Netty为依赖SocketIO功能的一个应用提供服务(通过Java互操作)。

我们在大约十个服务中使用了大量其他库的组合。其中一些是在服务器端渲染HTML -- 我们几乎使用Selmer进行所有的HTML渲染,Hiccup在一个地方用于从Clojure数据渲染HTML片段。

我们最初在2015年考虑将ClojureScript作为可能的客户端,但当时的生态系统非常粗糙,工具似乎很脆弱(当时Clojure和ClojureScript之间的差距比现在大得多)。因此,我们决定使用JavaScript和React.js / Redux / Immutable.js等构建我们的面向客户的客户端应用。我们有一个专门的JS前端团队。

如果我们今天再次进行相同的项目,我认为我们会再次将ClojureScript作为认真的竞争者进行评估,因为过去4-5年中,生态系统已经发生了重大变化。不知道那时我们会选择JS还是cljs。
by
谢谢。这非常有帮助。我们可能也会考虑Clojurescript。

顺便问一下,我可以建议这个论坛的版主将关于在clojure开发者中分享技术堆栈和见解的帖子固定在顶部吗?

我认为这对社区非常有帮助。
我不打算固定这个帖子,但在https://ask.clojure.org/index.php/8280/what-is-your-clojure-and-clojurescript-stack有一个技术栈问题。
非常有帮助。谢谢

编辑了
我认为这里有个误解
"静态类型,对于项目中有多个开发者的项目来说非常有帮助"
"Clojure 核心团队没有计划为 Clojure 开发静态类型,因为我们认为这不是必要的。我们的努力集中在规格上 (https://clojure.org/about/spec))

AFAIU,并且请纠正我,发帖者询问的是“设计时类型”,而答案处理的则是Java所理解的静态类型。

我和,可能还有问题作者,想要的可能是编写
 
(defn describe-dog [^:happy-puppy-co.api/dog dog]
      (println (str (:breed dog) (:age dog))))

并让智能感知获取  :happy-puppy-co.api/dog 规格并提供基于其键及其相应子规格的提示。也就是说,帮助我按照作者的意图使用 ::dog,而无需查看出它的文件。

TypeScript 在编译后不存在,其输出是 JavaScript。TS 的最大优点是它帮助您更快地理解别人的代码(并且提供一些避免误用的帮助,但这secondary)。
我并不觉得您的评论与原始问题相符,但如果您是在询问与函数定义集成的规格,那么这正是我们在第2版规格中要查看的内容。
那么以下内容如何解释呢?

“我……是静态类型的粉丝,这对于有多个开发者的项目非常有帮助。”

TypeScript……也打开了众多编辑器/ IDE 工具的可能性。我认为TypeScript是发生过在JS上的最好事情。”

据我所知,这意味着必须不断地处理大量代码,这些代码既不是你写的,也不是你或你的团队先前编写或审查过的。企业应用程序通常有许多具有30+键的dtos,并且命名很不一致。典型的思路是这样的:“好吧,我们的函数将获得一个'sales-deal' dto,我需要将其转换为'financing-deal'并发送到分析,'sales-deal'上的利润边际属性叫什么?是'margin'、'markup'还是仅仅是'rate'?它是一个十进制数还是销售-deal仍然有它的项目化费率组件子-dto?”然后对'financing-deal'提出相同的问题...

我完全认同“发生JS上的最好事情”这部分。遗憾的是,尝试ClojureScript感觉像是回到了JS——并不好。我欣赏spec的力量,它如何帮助我在运行时和测试中。我现在想要做的是,将所有这些力量都集成到我的IDE中,以便我也在编写代码时得到帮助。如果我还没有写出来,就没有什么要运行或测试的。
顺便说一下,为了更好地说明我想要什么,请查看这个库:https://github.com/vriad/zod
它可以让你在设计/编译时定义类似spec的架构,该架构也被TS编译器理解和可用。

// spec定义 - 在TS编译后存在,可用于验证架构
const dogSchema = z.object({
  name: z.string(),
  neutered: z.boolean(),
});

//在运行时验证架构
const cujo = dogSchema.parse({
  name: 'Cujo',
  neutered: true,
}); //通过,返回Dog

//TypeScript类型定义 - 在TS编译后不存在
type Dog = z.infer<typeof dogSchema>;
/*
相当于:
type Dog = {
  name:string;
  neutered: boolean;
}
*/

// 使用推断类型进行编译时类型检查和设计时智能感知
const fido: Dog = {
  name: 'Fido',
}; // TypeError: 缺少必要属性 `neutered`
...