(Translated by https://www.hiragana.jp/)
Emacs Lisp - Wikipedia コンテンツにスキップ

Emacs Lisp

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

Emacs Lispは、GNU EmacsXEmacsテキストエディタ(この記事きじではあわせてEmacsぶ)で使つかわれているプログラミング言語げんごLISP方言ほうげんである。Emacs組込くみこみの編集へんしゅう機能きのうのうち、C言語げんごかれた部分ぶぶん以外いがいのほとんどを実装じっそうするのに使つかわれている。また、利用りようしゃによるEmacsのカスタム拡張かくちょうのためにもちいられる。

Emacs Lispはスクリプト言語げんごとして使つかうこともでき、コマンドぎょう実行じっこうファイルからもせる。バッファ移動いどうコマンドのような編集へんしゅう機能きのうバッチ・モード動作どうさする。

Emacs Lispは、ときに「ELisp」や「Elisp」とかれたりばれたりすることもある (りょう表記ひょうきともGNU Emacs Lispリファレンス・マニュアル[1]える)。機能きのうでいうと、Common Lispの影響えいきょうのちにみえるが、Maclisp方言ほうげんつよ関係かんけいがある [2]。プログラミング・メソッドとして、手続てつづ指向しこうプログラミングと関数かんすうてきプログラミングに対応たいおうしている。関数かんすうをデータとしてあつかえるなどの強力きょうりょく機能きのうのため、(TECO拡張かくちょう言語げんごとしていたオリジナルの) Emacsの書換かきかえにあたり、リチャード・ストールマン拡張かくちょう言語げんごとしてLISPをえらんだ。ストールマンがGosling EmacsをGNU Emacsへえていたとき、Common Lisp とはちがってSchemeはすで存在そんざいした。しかし、当時とうじのワークステーションの性能せいのう貧弱ひんじゃくであったため、Schemeよりももっと簡単かんたん最適さいてきのできるLISP方言ほうげん開発かいはつする必要ひつようがあった[3]

Emacs Lispは、アプリケーション・プログラミングで使つかわれる方言ほうげんぐんであるSchemeCommon 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 ()
   (interactive)
   (split-window-vertically)
   (set-window-buffer (next-window) (other-buffer)))
 
 (global-set-key "\C-x2" 'my-split-window-function)

最初さいしょぶん (defun ...)は、あたらしい関数かんすうmy-split-window-function定義ていぎする。これは、split-window-vertically (まえのウインドウ分割ぶんかつ関数かんすう) をし、あたらしいウインドウがべつのバッファを表示ひょうじするようにする。つぎぶん (global-set-key ...) は、「C-x 2」というキーれつあたらしい関数かんすうむすけなおす。

もっと簡単かんたん方法ほうほうもある。Emacs Lispには「advice」という強力きょうりょく機能きのうがあり、利用りようしゃ既存きそん関数かんすうさい定義ていぎせずにあたらしいラッパーをつくれる。「advice」を使つかうと、うえのコードは、つぎのようにさい実装じっそうできる。

 (defadvice split-window-vertically
   (after my-window-splitting-advice first () activate)
   (set-window-buffer (next-window) (other-buffer)))

これは、split-window-verticallyされたとき、関数かんすう本体ほんたい実行じっこうするまえ利用りようしゃ指定していしたコードを実行じっこうするよう命令めいれいしている。

こういった変更へんこうは、たとえば「M-x eval-buffer」コマンドを使つかってコードが評価ひょうかされてはじめて効果こうかしょうずる。Emacsのさいコンパイルはおろかさい起動きどうさえいらない。Emacsのカスタム便利べんりだといわれる所以ゆえんである。もしEmacsの「たてげファイル」(ふつうは利用りようしゃホームディレクトリ にある「.emacs」という名前なまえのファイル) にコードを保存ほぞんすれば、つぎにEmacsががったとき、Emacsはこの拡張かくちょうむことになる。

ソースコード

[編集へんしゅう]

Emacs Lispのコードは、「.el」という拡張子かくちょうしのファイルに、テキストファイルとして格納かくのうされる(ただし、利用りようしゃ初期しょき設定せっていファイルめいは、Emacs21以前いぜんでは例外れいがいとして「.emacs」である)。ファイルがまれると、Emacsプログラムのインタープリタ部分ぶぶんが、関数かんすう変数へんすうんだり解析かいせきしたりして、メモリに格納かくのうする。そうして、編集へんしゅう関数かんすう利用りようしゃコマンドで使つかえるようになる。関数かんすう変数へんすうは、自由じゆう修正しゅうせいしたり、みなおしたりできる。

メモリ空間くうかん節約せつやくのため、Emacsの機能きのうおおくは、必要ひつようになるまで読込よみこまれない。追加ついか機能きのう一式いっしきそれぞれは、「ライブラリ」というEmacsコードのあつまりで実装じっそうされている。たとえば、プログラムソースコードのキーワードの強調きょうちょうようライブラリやテトリス・ゲームであそぶライブラリなどがある。かくライブラリは、ひとつまたは複数ふくすうのEmacs Lispソース・ファイルで実装じっそうされる。

一部いちぶ関数かんすうC言語げんごいてある。これは「プリミティブ」とばれる(「組込くみこ関数かんすう」とか「サブル」ともいう)。プリミティブはLispコードからすことができ、C言語げんごのソース・ファイルを修正しゅうせいさいコンパイルすることでのみ変更へんこうできる。GNU Emacsでは、プリミティブを外部がいぶライブラリにすることはできず、Emacs実行じっこう形式けいしき一部分いちぶぶんとなる。XEmacsでは、オペレーティング・システムの動的どうてきリンクのサポートを使つかって、プリミティブを実行じっこうめる。関数かんすうをプリミティブでくのは、Emacs Lispからはアクセスできない外部がいぶデータやライブラリをもちいる必要ひつようがあったり、C言語げんごとEmacs Lispで実行じっこう速度そくど十分じゅうぶんみとめられるほど頻繁ひんぱんばれたりする場合ばあいである。

ただし、C言語げんごでのエラーはすぐにセグメンテーション違反いはんやより些細ささいなバグにつながるため、エディタをクラッシュさせるし、Emacs Lispのガベージ・コレクタまさしく相互そうご作用さようするC言語げんごのコードをくことは困難こんなんであり問題もんだいこしやすいため、プリミティブで実装じっそうされている関数かんすう比較的ひかくてき少数しょうすうである。

バイトコード

[編集へんしゅう]

Emacs Lispコードの性能せいのうは、「バイト・コンパイル」で向上こうじょうさせることができる。Emacs Lispのソース・ファイルをバイトコードという特殊とくしゅ表現ひょうげん変換へんかんするコンパイラがEmacsにはある。Emacs Lispのバイトコード・ファイルの拡張子かくちょうしは、「.elc」である。ソース・ファイルにくらべると、バイトコードははやめて、ディスク空間くうかんすこししかとらず、読込よみこのメモリーがすくなく、はやくうごく。

バイトコードは、プリミティブよりはおそい。しかし、バイトコードでまれた関数かんすうは、簡単かんたん修正しゅうせいしたり、さい読込よみこみしたりできる。さらに、バイトコード・ファイルは、プラットフォーム依存いぞんしない。Emacsについてくる標準ひょうじゅんてきなEmacs Lispコードは、バイトコードでまれるが、利用りようしゃ参照さんしょうようとして、対応たいおうするソース・ファイルも大抵たいていいている。利用りようしゃ拡張かくちょうはそれほどおおきくもなく、また計算けいさん負担ふたんちいさいので、普通ふつうはバイト・コンパイルされない。

言語げんご機能きのう

[編集へんしゅう]

「cl」パッケージは、Common Lispのサブセットとしてはかなりだい規模きぼ実装じっそうであり、注目ちゅうもくあたいする。

Emacs Lispは、静的せいてきでなく (字句じくてきでもなく) 動的どうてきスコープ使つかう。したがって、もし変数へんすうがある関数かんすうスコープ宣言せんげんされると、その関数かんすうからされたサブルーチンにおいても有効ゆうこうになる。これはもともとは、利用りようしゃのカスタムのための高度こうど柔軟じゅうなんせい提供ていきょうするためのものだった。しかし、動的どうてきスコープには短所たんしょがいくつかある。だいいちに、別々べつべつ関数かんすう変数へんすうあいだでの不本意ふほんい相互そうご作用さようのため、おおきなプログラムではバグを簡単かんたんしょうじやすい。だいに、動的どうてきスコープでの変数へんすうアクセスは、字句じくてきスコープのそれより、一般いっぱんおそい。そのため、Emacs Lispを字句じくてきスコープに変換へんかんする、という計画けいかくてられたが、まだ完了かんりょうはしていない。「cl」パッケージのlexical-letマクロは、Emacs Lispのプログラマに効率こうりつてき字句じくてきスコープを提供ていきょうしている。「cl」はよく使つかわれているが、lexical-letはめったに使つかわれない。

Emacs 24 では静的せいてきスコープが使つかえるようになった。

Emacs Lispは、おおくのLisp実装じっそうでおこなわれている末尾まつび再帰さいき最適さいてきをしない。最適さいてきされていない末尾まつび再帰さいき最終さいしゅうてきスタックオーバーフローいた可能かのうせいがある。

脚注きゃくちゅう

[編集へんしゅう]
  1. ^ Emacs Lisp”. FSF. 2023ねん9がつ27にち閲覧えつらん
  2. ^ "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"ぶしより
  3. ^ "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"より

参考さんこう文献ぶんけん

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]