20 June 2024

本来,Clojure 已经很好用了。它的好处数不胜数,以下简单罗列几个:

  • REPL,可以实时看到代码语句的运行结果,调试超级方便
  • 基于 Java ,可以无缝调用大量 Java类库。而 ClojureScript 则基于 JavaScript,随手一个npm/yarn add就可以调用 JS 库。常见的功能,基本都能找得到
  • immutable async 都用起来很方便
  • 有了 Clojure 和 ClojureScript 前后端可以用一套语言通吃

既然,Clojure 已经那么好了,为什么还要有 babashka?

因为,Clojure 主要还是用来开发应用的。桌面,或者网络,或者移动端应用,可以用 Clojure 或者 ClojureScript 编写。

但是,它们不适用于命令行脚本编写。没法像 shell 那样,串联起几个命令,就解决一个重复处理的小任务。比如批量查找替换文件中的字符串,批量修改文件名。

所以,正如 babashka 项目首页说的:babashka is a fast native Clojure scripting runtime. 用上它,Clojure 程序员就不用在 Clojure 和 bash 之间来回切换了。因为,考虑到一些项目任务管理、文件管理、文本替换之类的工作还需要写 shell 脚本处理。

babashka 本来是俄罗斯妇女戴在头上的漂亮头巾。在 Clojure 世界,它意味着 beyond bash。项目主页: https://babashka.org

babashka 的特色功能

  • 启动速度快

    第一,它通过 GraalVM 编译成 native-image ;第二,它内嵌了一个小型 Clojure解析器。

  • 内置常用库

    比如 cheshire 解析 json 文件,babashka.fs 操作文件系统, babashka.process 进程管理,java.time 时间日期库。

  • 扩展很方便

    除了内置的这些常用库,babashka 也可以加载 Clojure 库。更神奇的是,它可以动态添加扩展库,直接从网上下来,导入使用。

    另外,也可以通过 pod 协议集成其他各种语言开发的程序。

  • 支持多线程

    基于 JVM 线程,支持异步操作。

  • 可管理任务

    内置了task runner,能像 make, npm 那样管理脚本任务。

运行 babashka

  1. 解析 Clojure 表达式

    bb -m clojure.core/prn 1 2 3
    
  2. 运行脚本任务,通过bb.edn设置任务,然后调用 bb 运行任务。
  3. 在 shell 调用 shebang 文件,比如将以下内容保存为 print.bb

    #!/usr/bin/env bb
    (println (+ 1 2 3))
    

    然后,在 shell 执行。

    chmod +x print.bb
    ./print.bb
    
  4. orgmode 代码块

    #+begin_src bb
    (println (+ 1 2 3))
    

    #+end_src

    (println (+ 1 2 3))
    
    6
    

平时工作中已经用 bb 写了不少脚本,感觉还是满方便的。