Clojure 開発環境まとめ

Clojure開発をするときの開発環境(DX)向上のあれこれ.

主にClojure開発に関わるツールやライブラリまとめ.

Editor

🔧VSCode Calva

📝VSCodeのClojure開発環境.

move

  • Ctrl+Alt+o o/r: REPLに移動, Ctrl+x o で戻る

eval

  • Ctrl+Enter: current line
  • Alt+Enter: top level
  • Ctrl+Alt+c+Enter: current file
  • calva: toggle keybindings enabled
    • <2024-12-29 Sun 10:03> これがtoggleされているとcalvaが動かない(ハマった)

paredit

https://calva.io/paredit/

  • ctrl+alt+shift+backspace, unwrap
    • <2025-02-27 Thu 14:09> これ探しててなかなか分からなかった.

カラーテーマが貧弱

borealis-theme - Visual Studio Marketplace, これがいい.

Outputs

https://calva.io/output/

  • repl-window: output-file, ctrl+alt+o+r
  • output-channe: calva says, ctrl+alt+o+c
"calva.outputDestinations": {
    "evalResults": "output-channel",
    "evalOutput": "output-channel",
    "otherOutput": "output-channel"
}

🔧Clojure: Leiningen

Clojure Build tool.

https://github.com/technomancy/leiningen

Clojureプロジェクト管理ツール. make的な.

howto: Java外部ライブラリをいれるには?

[/ ] という記法でproject.cljのdependenciesに追加.


これが,

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-firestore</artifactId>
  <version>3.0.2</version>
</dependency>

こうなる.

[com.google.cloud/google-cloud-firestore "3.0.2"]

howto: lein uberjarでThe Main-Class specified does not exist within the jar

main の core.cljのnsに(:gen-class)を追加.

Warning: The Main-Class specified does not exist within the jar. It may not be executable as expected. A gen-class directive may be missing in the namespace which contains the main method, or the namespace has not been AOT-compiled.

tips: project.cljにビルド用設定のみ書いて設定情報はenvironやconfigをつかう

よい.

ref: https://twitter.com/t_yano/status/1163413764827303937

🔧clojure.cli(tools.deps)

Clojureのビルドツール.

https://clojure.org/reference/deps_and_cli

基本的には paths/dependencies/aliasesだけ覚えれば基本はできる. leiningenより学習コストは低. leiningenよりシンプルであることが特徴.

🔧clj/clojure

cljとclojureの2つのコマンドがある.

  • cljコマンドでREPL起動.
  • clojureコマンドで .cljファイルを実行.

Rich Hickeyがこれから熱意を入れたいとか. 2022でメジャーなのはleiningenであるもののこれから逆転の可能性はある.


-Jをつけることで, JVM起動オプションを指定可能.

$ clj -A:bot -J-XX:+UnlockExperimentalVMOptions -J-XX:+UseZGC

🔧deps.edn

deps.ednファイルで記述.

ref. https://clojure.org/reference/deps_and_cli#_operation

  • pathsにclojureのコードのrootからの相対パスを記述.
  • dependenciesに依存ライブラリを記述.
  • aliasesにcustom command を記述.
    • たとえば clj (-X/-M/-A):hogehoge のようなオプションを気軽に定義できる.
      • -M: mainプログラム起動
      • -T: ツール起動
      • -X: 関数起動
      • -A: alias起動.

tips: JVMのオプションを起動で指定するには?

:jvm-optsを指定して, -X, -A, -Mで起動.

tip: GitHubの最新バージョンを参照するには?

mvn/versionでタグを参照するのではなく(バグ修正とかで)最新バージョンを使いたいときのtip.

{:deps }の中で, io.github.(user)/(project) がkey, {:git/sha “xx”}が valueで宣言する.

io.github.dm3/clojure.java-time
  {:git/sha "693dffad2343cd9722482a5f200efe75dfbfbd31"}

ただしこの技はdeps.ednを含むprojectでしか使えない(leiningenではつかえない).

clj -X:my-funのargsは1つのみ

clj -Xで実行する関数の引数は1つのみで. 複数をわたしたいときはMapにする.

🔧tools.build

Clojureプロジェクトのビルドツール

jar/uberjarの作成には tools.buildをつかうのが今風(2022~)

refs:

tools.tools

他人のつくったlibをClojure CLI ifに簡単に組み込むことができる.

🔗References

🔧cljstyle

Clojureフォーマッタ.

先発のcljfmtはleiningen縛り. cljstyleはスタンドアロンバイナリとして動作する.

以下, Doom Emacsの設定例. format-allというpackageの clojure custom formatterとしてcljstyleを設定して, 保存時にフックでフォーマットが走るようにする.

(add-hook! clojure-mode
  (set-formatter! 'cljstyle "cljstyle pipe" :modes '(clojure-mode))
  (add-hook 'before-save-hook 'format-all-buffer t t))

ref: 🔖Formatter 📝Clojureコーディング規約

🔧clj-kondo

Clojure リンター. Clojure用の静的解析ツール.

スタンドアロンバイナリとして動作するのでleiningenやREPLに依存しない.

ref: 🔖Linter

マクロで定義する類のシンボルでunresolved symbolのclj-kondo警告が出る

未定義シンボルに対する警告は期待通りだが, マクロで生成する類のものには警告はでてほしくない. declare をつかうことで明示的に教えてあげる.

(declare select-things)

ref. clojure - How to avoid unresolved symbol with clj-kond when using hugSQL def-db-fns macro? - Stack Overflow