あそびたい

こころにうつりゆくよしなしごとを

EmacsでSmalltalkの環境を整えようとした話

この夏に純粋オブジェクト指向Smalltalkを勉強しようと思い、環境を整えていたのですが、様々にはまるポイントがあったのでまとめようと思った次第です。
まず

何をいれたらいいのかわかりにくい

処理系がいっぱいあるっぽくて、どれを入れたらいいのかわからなかったです。
とりあえずEmacsと連携できそうなやつ、ということでSmalltalk emacsでググって出てきたgnu-smalltalkとやらを入れてみました。
一応こいつ自体はbrewで入れられたのですが

付属のEmacs lispの使い方がわからない

付属でsmalltalk-mode.elとかgst-mode.elとかがついて来るんですが、まず使い方がいまいちわからんと。
で、ググってみて出てきたelispのコードをinit.elに書いてみたんですが、動かず
small-talk-mode.elの中身見てみたらコメントでこんなことが書いてありました

;;; Incorporates Frank Caggiano's changes for Emacs 19.
;;; Updates and changes for Emacs 20 and 21 by David Forster

いや、Emacs21とか旧石器時代かよ。そら動かんわ。

ということで、こいつを動かす術を探す旅に出たのですが

調べれど調べれど何も出てこない

Qiitaとかはてなブログとかにまとめがないのは覚悟していたのですが、stack over flowとかですらみつからず途方に暮れていた時にUbuntu向けのパッケージを圧縮したファイルを見つけ、最終更新が2016年だったのでとりあえず落としてみて中身を見ると、
smalltalk-mode-init.el.in
とかいう名前のファイルがあったので、これは!と思いinit.elにコピペしてみると

変数がなくて怒られる

Emacsあるあるですね。24で削除されたinhibit-first-line-modes-regexpsって変数を書き換えようとして怒られてました。その部分をinhibit-local-variables-regexpsとすると

ついに動きました!

C-c mでgstというインタープリタ(と思われるもの)が動きました!
長い道のりでした……ということで結論。

結論:マイナー言語はめんどくさい

この一言に尽きると思います。メジャーな言語ならこんなわたわたしなくていいですからね。
とはいえこのいじってる時間も楽しかったりするのでいいんですが。
これからごりごりsmall-talkを書いていきます!
最後にinit.elに書いたものだけ書いておきます。

(push (cons "\\.star\\'"
	    (catch 'archive-mode
	      (dolist (mode-assoc auto-mode-alist 'archive-mode)
		(and (string-match (car mode-assoc) "Starfile.zip")
		     (functionp (cdr mode-assoc))
		     (throw 'archive-mode (cdr mode-assoc))))))
      auto-mode-alist)

(autoload 'smalltalk-mode "smalltalk-mode.elc" "" t)
(autoload 'gst "gst-mode.elc" "" t)

(push '("\\.st\\'" . smalltalk-mode) auto-mode-alist)

(push "\\.star\\'" inhibit-local-variables-regexps)

ではではっ