次へ 前へ 目次へ 佐々木将人の個人ページへ

対話環境とプログラムのロード(Lisp編)

 Lispは,(例えばLisp Flavoured Erlangだと)lfeと,Erlangは,erlとそれぞれ打つと(もしくはwindows用のErlangだとwerlのアイコンをクリックすると)どちらも対話環境が動き出します。この対話環境では,なんらかの入力を行うと,それをLispなりErlangなりのプログラムとして実行し,その結果を返します。
 と言っても,その内容は微妙に異なります。

 Lispの処理系はインタープリターと呼ばれています。インタープリターというのは,プログラムを次々に読み込んでいき,意味のある塊に出会うと機械語に翻訳して直ちに実行する……の繰り返しでプログラムを実行していく方式です。
 Lispは関数型言語と言われていて,関数の定義の積み重ねでプログラムを実行していくのですが,対話環境に関数の定義を入れると,それを覚えており,入れた後はその関数が使えるようになるわけです。
 もっとも,起動させたLisp処理系を終わらせてしまうと,関数定義その他一切全部忘れてしまいます。
 というので,対話環境以外でプログラムを書いて,対話環境に読み込ませて使用するということにすると,Lisp処理系を終わらせても,次に起動した時にそのプログラムを読み込ませればよいということになります。

 そのプログラムファイルがneko.lspで保存されていたなら,Steel Bank Common Lispでは,Lisp処理系の起動後に
* (load "neko.lsp")
で,そのプログラムが読み込まれ,使用可能になります。

 また,Lispの場合,一旦起動させたLisp処理系にいろいろ操作した結果を,まるごと保存することも可能です。
 その結果を neko というファイルに保存する場合,Steel Bank Common Lispでは
* (sb-ext:save-lisp-and-die "neko")
とすれば保存して,Lisp処理系も終わります。
再現する場合には,
> sbcl --core "neko"
とすることで,Steel Bank Common Lisp を起動する際に, neko も読み込んで,あたかもLisp処理系が終わらなかったかのように再現することができます。
 ただ,この neko というファイルはどうしても大きくなりがちです。
(試しにある簡単な関数を1つを定義しただけで保存したファイルは37Mbyteくらいになりました。)

 なお,Lispの対話環境を終了させるには,LFEの場合は
lfe> (exit)
ですが,これは処理系によって異なっており,
(bye)
(quit)
などがあります。(複数の終了手段をもっているLispの方が多い。)

(2023.5.8. 初版)
(2023.6.9. 改訂)

次へ 前へ 目次へ 佐々木将人の個人ページへ