引き続き、古い言語と格闘してみる。今度はLISPにチャレンジ。
とはいえ、LISPといっても、「方言」がメチャクチャ多数ある。ややこしいのは「純LISP」という「方言」まである。(もともとのLISP=純LISP、というわけではない)
その中でも、今でも割と情報がありそうなのは、Common LISP や Emacs LISPあたりか。Wikiでは、Clojure、Scheme といったところもLISPの方言とされてるけど、TIOBE Indexに行くと、これらは別言語扱いでランキングされている。
*ここまで来ると、方言というより、「LISPをベースとした別言語」「LISP系の言語」と言ったほうが分かりやすいかも。
多数ある方言の中で、「これが本家」的な情報もなかなか見当たらないのだが、情報として多そうなCommon LISPをあたってみる。
- http://www.sbcl.org/getting.html
- http://www.nct9.ne.jp/m_hiroi/clisp/index.html#clisp
Common LISP にもいろいろ処理系があるようで、SBCL というものがあり、Linux用のバイナリが配布されているので、これを使ってみた。
# apk update # apk add --no-cache build-base # mkdir /home/lisp && cd /home/lisp # wget wget http://prdownloads.sourceforge.net/sbcl/sbcl-1.4.3-x86-linux-binary.tar.bz2 # bzip2 -cd sbcl-1.4.3-x86-linux-binary.tar.bz2 | tar xvf - # sh sbcl-1.4.3-x86-linux-binary/install.sh (中略) SBCL has been installed: binary /usr/local/bin/sbcl core and contribs in /usr/local/lib/sbcl/ Documentation: man /usr/local/share/man/man1/sbcl.1 # sbcl /bin/sh: sbcl: not found
・・・あれ?not found???
# which sbcl /usr/local/bin/sbcl # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PATHも通ってるはずだし、公式サイトの手順通りのはずなんだが・・・よく分からん。なんか、インストールの仕方がマズかったか?
とりあえず、Docker HubでDockerfile付きであがってる、LISPのイメージがないか確認してみる。
全部は見れてないが、ざっと下記のものがあるようだ。(他にもあったが、Dockerfileが無くて、実態がよく分からんからノータッチで)
- https://hub.docker.com/r/daewok/lisp-devel/dockerfile
- https://hub.docker.com/r/codesignal/lisp/dockerfile
- https://hub.docker.com/r/anhil/common-lisp-roswell
後は、下記のページあたりを見ると、「Roswell」なるものを入れると、Common LISPの環境が簡単にできるらしい。
- https://qiita.com/t-sin/items/054c2ff315ec3b9d3bdc
- https://github.com/roswell/roswell
これらの情報を元に、Alpineをベースにしている、「anhil/common-lisp-roswell」というイメージを参考にした。
FROM frolvlad/alpine-glibc RUN set -x && \ apk update && \ apk add --no-cache curl-dev && \ apk add --no-cache --virtual=build-deps git automake autoconf build-base && \ git clone https://github.com/roswell/roswell.git /tmp/roswell && \ cd /tmp/roswell && \ sh bootstrap && \ ./configure && \ make && \ make install && \ ros setup && \ cd ../../ && \ rm -rf /tmp/roswell && \ apk del build-deps CMD ["ros", "run"]
こんな感じのDockerfileでビルドしてrunしてみる。
$ docker build . -t lisp_test $ docker run -it lisp_test:latest * (format t "Hello World!~%") # 直接、SBCLのプロンプトが起動するので、ここにコードを打ち込む。 Hello World! NIL *
けど、このイメージを使っても、sbcl のコマンドを直接は使えなかった。
$ docker run -itd lisp_test:latest $ docker exec -it hoge /bin/sh # ros run * (format t "Hello World!~%") Hello World! NIL * (quit) / # sbcl /bin/sh: sbcl: not found