最近发现一个基于 Common Lisp 的函数式编程语言 —— Coalton

看作者们的意思是要在 Common Lisp 的基础上实现一门新的语言,加入一些 Haskell、Scala 等函数式编程语言才有的功能特性,简单体验了一下,发现有以下比较有意思的功能与特性:

  • ADT
    Coalton 默认提供了 OptionalResult ,用于处理空值与异常。
  • 模式匹配
    虽然 Common Lisp 已经有 trivia 了,但是 Coalton 提供的模式匹配会更加函数式一点,对 ADT 进行匹配时会更加自然。
  • 静态类型 + 类型推导
    Coalton 的类型推导挺强大的,常量自动推导类型,甚至可以从被调用函数的参数与返回值中推导出调用者的参数与返回值的类型, 这样其实基本不用手动声明类型,享受静态类型带来的好处了,比如可以给编译器(目前仅支持 SBCL)提供更多的信息进行性能优化, 并且在编译时进行类型检查,减少运行时出错的可能性。
  • 类型类
    没什么好说的了,函数式编程语言标配,像 EqOrd 这些基本的类型类都内置了。
  • 高阶类型
    没想到有生之年能够在 Common Lisp 上看到真正的 FunctorMonad 实现,不依赖于 CLOS 。
  • 与 Common Lisp 互操作
    不管是在 Coalton 中调用 Common Lisp 定义的函数,还是在 Common Lisp 中调用 Coalton 定义的函数都是挺方便的, 这样可以实现多范式编程,虽然 Coalton 本身并没有限制程序员进行纯函数式编程。

简单体验下来,我个人还是比较看好这个项目的,因为我个人比较喜欢函数式编程,但 Haskell、F# 的缩进语法我不太喜欢,Scala 依赖于 JVM 又太过臃肿, Coalton 能用 Lisp 语法进行类 Haskell 的函数式编程,还能利用 Common Lisp 现有的生态我觉得挺不错的,不知道大家有什么看法?

2 个赞

老文章了,年轻人可能没见过。

没用过 APL 怎能说喜欢函数式编程(

确实没听说过,有机会拜读一下 :+1:

在 Emacs China 总感觉你都老得能进博物馆了,在 QQ 群又感觉你像个小年轻,着实让人敬佩

1 个赞

现在用QQ的人是老年人还是青年人?

比较老气的青年人和未成年人

仔细看了下,挺失望的。

  1. 不 lazy。不能起到写一段简单的代码当作 stream/iterator 来用

  2. 那个不能直接 4/2 的 Dividable 的例子非常的 emm,让我怀疑是不是脑子有坑强行给自己加戏。典型的“因为不了解计算机是如何工作的所以写出来的代码怪怪的”。明明从 Haskell 抄了 divMod,想要除法结果是整数的话用 divMod 不就行了

  3. 没有啥类似 metaocaml 的或者 type directed opt 之类或者 fusion 之类的概念。SBCL 本来就有一定类型推导能力,只是推导生成个类型声明没啥大用

  4. 不 pure, 没有 optical 的概念。

其他的超纲了,没必要说。

还有比较幼稚的老年人。

好歹来个 linear type 啊

这些特性我不大感兴趣,现在就 racket 最吸引我了。我近来有种倾向:感觉 pure 不 pure 无所谓,ocaml 那样最好。

这个是厉害的,我感觉光这个可以拿出来

我觉得 Coalton 能在 CL 上实现这些已经挺不容易了 :joy: ,类型系统对于提高代码抽象程度和正确性而言还是有一定帮助的

好像不只类型声明呀,静态类型的好处还有多态函数可以进行静态分发或者内联提升性能。

这么一说我想起来了,

支持 typeclass 没有的 subtype polymorphism,和 CLOS defgeneric/defmethod 用法贴近

倒是以我用 FriCAS 和 ATS 这些“编译到另一种语言的带类型语言”的经验来说,写代码时同时处理类型系统的迷之报错和通过 type check 后定位 compile/runtime 的报错(对于这类语言类型系统上有洞极为常见,更别说 logical error 了),可以说是地獄样的体验。

建议题主去用个几天写几个小项目后回来做个汇报,我一不用 SBCL 二对 type system 不是很 found 就不试了。