はじめに
この記事は、iPhoneやiPad上で動作するLinuxエミュレータ「iSH」(Alpine Linux 32bit) で、Common Lispの対話的開発環境である ECL + Emacs + SLIME を構築するための記事です。
一応再構築しつつ記事を書いているので、おそらくこの方法で上手くいくと思います。
注: 初投稿なので不備が多いかもしれませんが、よろしくお願いします。
(推敲をAIに行わせているのでちょっと文章がAIっぽいかもしれません。すみません。)
環境
- マシン: iPad(A16)
- アプリ: iSH App
- OS: Alpine Linux v3.14 (i386)
- 構築する環境: ECL + Emacs (v27.2) + SLIME
STEP 1: ベースシステムの準備
App storeからiSHをインストールしてアプリを開きます。
早速、基本的なビルドツールをインストールしていきましょう。
# パッケージリストを最新の状態に更新します
apk update
# 基本的なツール群をインストールします
apk add build-base git wget curl autoconf automake
STEP 2: Boehm GCの手動ビルド
後のコンパイルで必須となるBoehm GCライブラリですが、残念ながらiSHのapkリポジトリには開発版が含まれていません。
ですので、ソースコードから直接ビルドすることで乗り越えます。
もし./configureでエラーが出る場合は、STEP 1のインストールをし直すとなんとかなると思います。
# ホームディレクトリに移動
cd ~
# Boehm GCのソースコードをダウンロード
wget https://github.com/ivmai/bdwgc/releases/download/v8.2.2/gc-8.2.2.tar.gz
# 展開
tar xzf gc-8.2.2.tar.gz
# ディレクトリに移動し、ビルドとインストール
cd gc-8.2.2
./configure
make
make install
# 新しくインストールしたライブラリをシステムに認識させるためのおまじない
ldconfig
STEP 3: ECL & Emacsのインストール
いよいよ主役の登場です。Common Lisp処理系であるECLと、主要な環境のEmacsをインストールします。
apk add ecl ecl-dev emacs
STEP 4: Quicklispの導入
Lispの代表的なパッケージマネージャQuicklispを導入します。
Quicklispのインストールは、いくつかのCライブラリの 開発用ファイル(-dev) を必要とします。これらを先にapkでインストールしておきます。
# Quicklispのコンパイルに必要なライブラリ群をインストール
# gmp.h, ffi.h が見つからないエラーをここで事前に解決します
apk add gmp-dev libffi-dev
準備が整ったら、ECLを起動してQuicklispをインストールします。
# ホームディレクトリに移動
cd ~
# Quicklispのインストーラをダウンロード
wget https://beta.quicklisp.org/quicklisp.lisp
# ECLを起動
ecl
ECLが起動したら(>プロンプトが表示されたら)、以下のLispコードを順番に実行してください。
(quicklisp-quickstart:install)の完了にはそこそこ時間が掛かります。マシンスペックにもよりますが、私の場合は軽く5,6分くらい掛かった気がします。コーヒを淹れたり動画を見たりして時間を潰しましょう。
(iPadを放置したい場合、右下の歯車アイコンからKeep Screen Turned OnトグルをONにしておくと画面が消えなくなります。)
;; 1. インストーラを読み込みます
(load "quicklisp.lisp")
;; 2. インストールを実行します
(quicklisp-quickstart:install)
;; 3. ECL起動時にQuicklispが自動で読み込まれるよう設定します。
;; "Press Enter to continue."と言われるので、Enterを押します。
(ql:add-to-init-file)
;; 4. ECLを終了します
(quit)
このステップがエラーなく完了すれば、ほぼ完成です。
STEP 5: SLIMEのセットアップ
最後に、EmacsとECLを連携させるためのSLIMEをセットアップします。
5.1: Emacs側の設定 (SLIMEクライアント)
EmacsがSLIMEを見つけられるように、より巨大なパッケージ置き場であるMELPAリポジトリの場所を教えてあげる必要があります。
まず、Emacsで設定ファイル ~/.emacs を開きます。(起動にはおそらく10秒程度かかります。)
emacs -nw ~/.emacs
開いたファイルに、以下の設定コードを貼り付けてください。
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
貼り付けたら、Ctrl+x Ctrl+sで保存し、Ctrl+x Ctrl+cでEmacsを終了します。
そして、Emacsを再起動し、SLIMEをインストールします。
emacs
Emacsの中で、以下の操作を行ってください。
-
Alt + xを押し、package-refresh-contentsと入力してEnter。(パッケージリストを更新)- ここで、
Contacting host: melpa.org:443と出れば、設定が上手く読み込めています。Package refresh doneと言われるまで待ちましょう。
- ここで、
-
Alt + xを押し、package-installと入力してEnter。 -
Install package:と聞かれたら、slimeと入力してEnter。
ここでAltが機能しない、または使えない場合は、esc を使うと同様のことができます。
ad-handle-definition: `slime-note.message` got redefined
と出れば成功です。
5.2: ECL側の設定 (Swankサーバー)
次に、ECL側で動作するSLIMEのサーバー部品Swankを、Quicklispを使ってインストールします。
Alt + xをまた押し、shellと入力してEnter。Emacs内部でシェルを起動します。
シェルが起動できたら、そのシェルの中でECLを動かしちゃいましょう。
ecl
ECLの中で、以下を実行します。
(これもそこそこ時間が掛かります。私は15分程度掛かりました。注意してください。)
(ql:quickload "swank")
("swank")
と出れば完了です。
連携
これですべての部品が揃いました。以下の手順で、ECLとEmacsを連携させていきます。
-
サーバー:
ECLで以下を実行してサーバーを起動します。
(swank:create-server :dont-close t)
表示されたポート番号(例: `4005`)を覚えておきます。このシェルは起動したままにします。
-
クライアント
Emacsの中で
Alt + xを押し、slime-connectを実行します。Hostはlocalhost、Portは先ほど覚えた番号を入力します。(既に入力されている場合が多いので、大抵の場合はEnter二回押しで大丈夫です。)
Versions differ: nil (slime) vs. 2.31 (swank). Continue? (y or n)
と聞かれるので、yを入力しましょう。
成功すれば、Emacsの画面にECLのREPLが出現します。これで構築完了です。お疲れ様でした。
Connected. Root, this could be start of a beautiful program.
おわりに
初めはLemを導入しようと考えていたのですが、roswellが入れられなかったり、SBCLの導入が厳しかったので諦めました。roswellが難しい時点でQLもほぼ諦めていたのですが、なんとか入れられて良かったです。もしiPadでLem環境出来たよニキがいらっしゃる場合は教えて下さると嬉しいです。
というわけで、iSHという制約の多い環境でも、本格的な開発環境を構築することができました。
slyも同じ手法で導入することができるはずです(私は試していないので、もしかしたらエラーが発生するかもしれませんが)。この文章が、今後iPadやiPhoneでCLをガチりたい人(そんな人いるのか?)の役に立つことを願っています。