|
Emacs Lispは、GNU EmacsとXEmacsテキストエディタ(この記事ではあわせて Emacs と呼ぶ)で使われているLispプログラミング言語の方言である。Emacs組込みの編集機能のうち、C言語で書かれた部分以外のほとんどを実装するのに使われている。また、利用者によるEmacsのカスタム化や拡張のために用いられる。Lisp処理系で、もっとも使われている言語である。 Emacs Lispは、UnixのBourne Shell、Python、Perl、scsh、GNU Guile などのようなスクリプト言語として使うこともでき、コマンド行や実行ファイルからも呼び出せる。バッファや移動コマンドのような編集機能は、Lispの機能を補いバッチ・モードで動作する。 Emacs Lispは、ときに''Elisp''と呼ばれることもある。ただし、この呼び方は同名の無関係な古いLisp方言と混同されるおそれがある。機能でいうと、Common Lispの影響も後にみえるが、Maclisp方言と強い関係がある 〔"GNU Emacs Lisp is largely inspired by Maclisp, and a little by Common Lisp. If you know Common Lisp, you will notice many similarities. However, many features of Common Lisp have been omitted or simplified in order to reduce the memory requirements of GNU Emacs. Sometimes the simplifications are so drastic that a Common Lisp user might be very confused. We will occasionally point out how GNU Emacs Lisp differs from Common Lisp." (和訳「GNU Emacs Lispは、大いにMaclispに (そして若干Common Lispに) 触発されている。もしCommon Lispをご存じなら、多数の類似点に気づくだろう。しかし、Common Lispの多くの機能は、GNU Emacsのメモリ要件のために、けずられたり、簡略化されたりしている。ときには、簡略化がすぎて、Common Lispの利用者はこんがらがるかもしれない。GNU Emacs LispとCommon Lispの違いは、ときおりふれることにする。」) Emacs Lisp Manualの"Introduction"章"History"節より〕。プログラミング・メソッドとして、手続き指向プログラミングと関数的プログラミングに対応している。関数をデータとして扱えるなどの強力な機能のため、(TECOを拡張言語としていたオリジナルの) Emacsの書換えにあたり、リチャード・ストールマンは拡張言語としてLispを選んだ。ストールマンがGosling EmacsをGNU Emacsへ書き換えていたとき、Common Lisp とは違ってSchemeは既に存在した。しかし、当時のワークステーションの性能は貧弱であったため、Schemeよりももっと簡単に最適化のできるLisp方言を開発する必要があった〔"So the development of that operating system, the GNU operating system, is what led me to write the GNU Emacs. In doing this, I aimed to make the absolute minimal possible Lisp implementation. The size of the programs was a tremendous concern. There were people in those days, in 1985, who had one-megabyte machines without virtual memory. They wanted to be able to use GNU Emacs. This meant I had to keep the program as small as possible." (和訳「つまり、GNU Emacsを書くことが,オペレーティング・システム、すなわち、GNUオペレーティング・システムの開発につながった。このことで、わたしは極小のLisp実装をつくることになった。プログラムの大きさは,重要な関心事だった。1985年当時,仮想記憶のない1メガバイトのマシンをもつ人たちは大勢いた。そんな人たちもGNU Emacsを使いたがっていた。それで私は、プログラムをなるたけ小さく作る必要があった。」) "My Lisp Experiences and the Development of GNU Emacs" より〕。 Emacs Lispは、アプリケーション・プログラミングで使われる方言群であるSchemeやCommon Lispとは根本的に異なる。大きな違いの1つは、デフォルトで字句的スコープではなく動的スコープを使うことである。つまり、呼出し関数の局所変数は、呼び出された関数からも参照できるが、定義時のスコープで参照しているのではない。 Emacs Lispを書くのがGNU Emacsをカスタム化する唯一の方法ではない。バージョン20以降のGNU Emacsには「カスタム化」機能があり、利用者はグラフィカルなインターフェースによって一般的なカスタム化変数を設定できる。「カスタム化」機能は、比較的単純なものに制限されているものの、利用者の代わりにEmacs Lispのコードを書いてくれる。利用者全員がEmacsの提供する高度な拡張性が必要なわけではないし、またそういう人は自分でEmacs Lispのコードを書けるものだ。 == 例 == Emacs Lispで書いたEmacsの簡単な拡張例をあげよう。Emacsでは、編集領域は、別々の''バッファ''を表示する''ウインドウ''という領域に分かれる。おおざっぱにいえば、バッファとは (大抵はファイルから) Emacsのメモリに読み込んだテキストのかたまりで、テキストファイルとして保存できる。 新しいウインドウを開くユーザコマンドは、「 C-x 2 」である。これは、「Control 」キーを押下した状態で「x 」キーを押し、その後単独で「2 」キーを押す、ということだ(空白文字は読み易いように示してあるだけで、打ってはいけない)。このキー列はEmacs Lispのsplit-window-vertically 関数を動かし、普通は新しいウインドウに前のものと同じバッファが表示される。ここでは、その次に有効なバッファを表示するようにしたい、ということにしてみよう。そのためには、利用者は、次のEmacs Lispコードを、既存のEmacs Lispソース・コードや空のEmacsバッファに書く。最初の文 (defun ...) は、新しい関数my-split-window-function を定義する。これは、split-window-vertically (前のウインドウ分割関数) を呼び出し、新しいウインドウが別のバッファを表示するようにする。次の文 (global-set-key ...) は、「C-x 2 」というキー列に新しい関数を結び付けなおす。もっと簡単に書く方法もある。Emacs Lispには、''advice''という強力な機能があり、利用者は既存の関数を再定義せずに新しいラッパーを作れるのである。adviceを使うと、上のコードは、次のように再実装できる。 これは、 split-window-vertically が呼び出されたとき、関数の本体を実行する前に利用者の指定したコードを実行するよう命令している。こういった変更は、たとえば「 M-x eval-buffer 」コマンドを使ってコードが''評価''されてはじめて効果が生ずる。Emacsの再コンパイルはおろか再起動さえいらない。Emacsのカスタム化は便利だといわれる所以である。もしEmacsの「立上げファイル」(ふつうは利用者の ホームディレクトリ にある「.emacs 」という名前のファイル) にコードを保存すれば、次にEmacsが立ち上がったとき、Emacsはこの拡張を読み込むことになる。抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「Emacs Lisp」の詳細全文を読む 英語版ウィキペディアに対照対訳語「 Emacs Lisp 」があります。 スポンサード リンク
|