Previous: Lisp Eval, Up: Building


21.10 外部Lispの実行

Emacsには他のLispシステム上でプログラムを実行する機能があります。 LispプロセスをEmacsの下位プロセスとして実行し、 それに式を渡して評価させることができます。 また、Lispプログラムを編集するEmacsバッファの中で変更した 関数定義をそのまま下位のLispプロセスに渡すこともできます。

下位のLispプロセスを実行するには、M-x run-lispと打ちます。 このコマンドは、シェルコマンドとしてlispと入力するのと同じ lispという名前のプログラムを実行し、 プログラムの入出力は‘*lisp*’という名前のEmacsバッファを 介してやりとりされます。 つまり、Lispからの『端末出力』はバッファに入りポイントを進め、 Lispへの『端末入力』はバッファのテキストから取られます。 (実行したいLisp実行ファイルの名前を変えるには、 変数inferior-lisp-programを設定する。)

Lispに入力を与えるには、バッファの末尾に移動してから入力を打鍵し、 最後に<RET>を打ちます。 ‘*lisp*’バッファは下位lisp(inferior lisp)モードになっていて、 シェル(shell)モード(see Shell Mode) のほとんどの機能にlispモードの特別な特性を組み合わせています。 サブプロセスに1行を送るという<RET>の定義は、 シェル(shell)モードの機能の1つです。

外部Lispで実行するプログラムのソースファイルにはlispモードを使います。 このモードはM-x lisp-modeで選択できます。 また、ほとんどのLispシステムで使われる .l1.lsp.lispで終る名前のファイルには このモードが自動的に使われます。

実行中のLispプログラムの関数を編集しているとき、 変更した定義を下位のLispプロセスに送るもっとも簡単な方法は キーC-M-xです。 lispモードでは、このキーは関数lisp-eval-defunを実行します。 この関数は、ポイントの周りや直後の関数定義を探し、 それをLispプロセスの入力へ送ります。 (Emacsはカレントバッファが何であるかに関わりなく、 どんな下位プロセスにも入力を送ることができる。)

C-M-xコマンドの (任意のLispシステムで実行するプログラムの編集用)lispモードでの意味と (Emacsで実行するLispプログラムの編集用)emacs-lispモードでの意味を 比較してみましょう。 どちらのモードでもポイントを含む関数定義をインストールしますが、 関連するLisp環境がどこにあるかに応じて、その方法は異なります。 See Executing Lisp


脚注

[1] 【訳注】 この拡張子はlexやflexのソースファイルにも使われる。