ドキュメント

はじめかた

Gravity Lensing と area51 パッケージマネージャを使って Common Lisp プロジェクトを始めるために必要なすべて。

前提条件

area51 をインストールする前に、動作する Common Lisp 処理系が必要です。パフォーマンスと幅広い互換性から SBCL(Steel Bank Common Lisp)を推奨しますが、準拠する処理系であればどれでも使えます。

  • SBCL推奨、ほとんどのプラットフォームで利用可能
  • CCL (Clozure Common Lisp) — ネイティブスレッド対応の優れた選択肢
  • ECL (Embeddable Common Lisp) — C にコンパイル、組み込み向け
  • ABCL (Armed Bear Common Lisp) — JVM 上で動作

次のコマンドでインストールを確認してください:

sbcl --version

area51 のインストール

area51 はランタイム依存なしの単一バイナリです。1つのコマンドでインストールできます:

Shell
curl -fsSL https://raw.githubusercontent.com/gr8distance/area51/main/install.sh | bash

area51 バイナリが ~/.local/bin にインストールされます。PATH に含まれていることを確認してください。インストールの確認:

area51 --version

プロジェクトの作成

area51 new で新しい Common Lisp プロジェクトを作成します。開発に必要な標準的なプロジェクト構造が生成されます。

Shell
area51 new my-project
cd my-project

生成される構造:

my-project/ area51.lisp # プロジェクトマニフェスト my-project.asd # ASDF システム定義 src/ package.lisp # パッケージ定義 main.lisp # エントリーポイント .gitignore
  • area51.lispプロジェクトマニフェスト。依存関係とメタデータを宣言。
  • my-project.asdASDF システム定義。area51 add / remove で自動更新。
  • src/package.lispパッケージシンボルを定義・エクスポート。
  • src/main.lispアプリケーションコードの開始点。

パッケージの追加

area51 add でパッケージを追加します。area51.lisp マニフェストと .asd システム定義の両方が自動更新されます。

Shell
area51 add alexandria
area51 add my-lib --github user/my-lib
area51 add some-lib --url https://example.com/lib.tar.gz

次に area51 install を実行して、すべての依存関係を解決しダウンロードします:

Shell
area51 install

area51.lock ファイルが生成され、再現可能なビルドのために正確なバージョンが固定されます。ソースファイルでパッケージを使用できます:

src/main.lisp
(in-package :my-project)

(defun load-config (path)
  (alexandria:read-file-into-string path))

area51 addarea51.lisp.asd を更新しますが、src/package.lisp は意図的に触りません。シンボルをパッケージに取り込む方法は好みが分かれるので、area51 はユーザーに任せる設計です。代表的な書き方をいくつか紹介します:

:import-from

src/package.lisp
(defpackage #:my-app
  (:use #:cl)
  (:import-from #:alexandria #:iota #:when-let)
  (:import-from #:arrows #:-> #:->>)
  (:export #:main))

明示的で、現代の Common Lisp コードで最も一般的なスタイルです。どのシンボルがどのパッケージ由来か、コードを読む人が一目で把握できます。

:local-nicknames

src/package.lisp
(defpackage #:my-app
  (:use #:cl)
  (:local-nicknames (#:a #:alexandria))
  (:export #:main))

;; usage: (a:iota 5)

完全修飾のまま使いつつ、長いパッケージ名を毎回書く手間を減らします。

:use

src/package.lisp
(defpackage #:my-app
  (:use #:cl #:arrows)
  (:export #:main))

;; usage: (-> 3 (+ 20 30))

エクスポートされた全シンボルを取り込みます。arrowsiterate のように、シンボルが構文のように読める DSL 系ライブラリと相性が良いですが、alexandria のような巨大ユーティリティに対しては避けるのが無難です(ライブラリ拡張時にシンボル衝突が気付かないうちに起きやすい)。

あるいは package.lisp を触らず、コード内で完全修飾シンボルをそのまま使うのもアリです:(alexandria:iota 5)

SLY/SLIME でのインタラクティブ開発

area51 repl は、プロジェクトをロード済みで *package* もプロジェクトパッケージに切り替えた状態の slynk サーバを起動します。Emacs から M-x sly-connect で繋ぐと、プロジェクトにスコープされた REPL がそのまま使えます。Emacs 側での .sbclrc.dir-locals.el 設定は不要です。

プロジェクトディレクトリから REPL サーバを起動します:

Shell
area51 repl

次に Emacs で:

Emacs
M-x sly-connect RET 127.0.0.1 RET 4005 RET

REPL は最初からプロジェクトのパッケージで開くので、(main) やエクスポートされた関数をすぐに裸で呼び出せます。

  • --port N で 4005 以外のポートも指定できます。
  • Ctrl-C で綺麗にシャットダウンしてポートを解放するので、そのまま再起動できます。
  • プロジェクトごとの分離: 実行中の sbcl からは、そのプロジェクトの area51.lock に載っている依存だけが ASDF から見えます(area51 run と同じ分離)。

slynk は起動時に ASDF 経由でロードされます。マシンにインストールされていない場合(SLY 同梱が一般的ですが (ql:quickload :slynk) でも OK)、ハングする代わりに一行のエラーで終了します。

パッケージの閲覧

Web でパッケージを閲覧・検索できます: glensing.dev/packages.

現在のプロジェクトにインストールされているものを確認するには:

Shell
area51 list

設定

area51 は設定とキャッシュをホームディレクトリに保存します。

~/.area51/
~/.area51/ packages/ # ダウンロード済みパッケージ quicklisp/ # キャッシュ済み Quicklisp インデックス

パッケージは一度ダウンロードされるとここにキャッシュされます。Quicklisp インデックスは24時間ごとに自動更新されます。area51 clean でキャッシュ全体をクリアできます。

コマンドリファレンス

area51 の全コマンド一覧。

コマンド説明
area51 new <name>新しい Common Lisp プロジェクトを作成
area51 add <pkg>area51.lisp と .asd に依存関係を追加
area51 remove <pkg>プロジェクトから依存関係を削除
area51 installすべての依存関係を解決しダウンロード、ロックファイルを生成
area51 list宣言済み依存関係とそのステータスを一覧表示
area51 buildプロジェクトをスタンドアロンバイナリにビルド
area51 runプロジェクトのエントリーポイントをロードして実行
area51 testプロジェクトのテストスイートを実行
area51 replSLY/SLIME 接続用の slynk サーバを起動
area51 cleanパッケージキャッシュ (~/.area51/) をクリア
area51 upgradearea51 自体を最新バージョンに更新