「Emacs Lisp」の版間の差分
削除された内容 追加された内容
m編集の要約なし |
m編集の要約なし |
||
4行目:
Emacs Lispは、ときに''Elisp''と呼ばれることもある。機能でいうと、Common Lispの影響も後にみえるが、[[Maclisp]]方言と強い関係がある
<ref>"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"節より</ref>。プログラミング・メソッドとして、[[プロシージャ|手続き]]指向プログラミングと[[関数型言語|関数的]]プログラミングに対応している。[[関数 (プログラミング)|関数]]をデータとして扱えるなどの強力な機能のため、([[TECO]]を拡張言語としていたオリジナルの) Emacsの書換えにあたり、[[リチャード・ストールマン]]は拡張言語としてLispを選んだ。ストールマンが[[Gosling Emacs]]をGNU Emacsへ書き換えていたとき、Common Lisp とは違ってSchemeは既に存在した。しかし、当時のワークステーションの性能は貧弱であったため、Schemeよりももっと簡単に最適化のできる
Emacs Lispは、アプリケーション・プログラミングで使われる方言群である[[Scheme]]や[[Common Lisp]]とは根本的に異なる。大きな違いの1つは、デフォルトで[[静的スコープ|字句的スコープ]]ではなく[[動的スコープ]]を使うことである。つまり、呼出し関数の局所変数は、呼び出された関数からも参照できるが、定義時のスコープで参照しているのではない。
26行目:
最初の文 <code>(defun ...)</code>は、新しい関数<code>my-split-window-function</code>を定義する。これは、<code>split-window-vertically</code> (前のウインドウ分割関数) を呼び出し、新しいウインドウが別のバッファを表示するようにする。次の文 <code>(global-set-key ...)</code> は、「<code>C-x 2</code>」というキー列に新しい関数を結び付けなおす。
もっと簡単に書く方法もある。Emacs Lispには
<syntaxhighlight lang="elisp">
36行目:
これは、<code>split-window-vertically</code>が呼び出されたとき、関数の本体を実行する前に利用者の指定したコードを実行するよう命令している。
こういった変更は、たとえば「<code>M-x eval-buffer</code>」コマンドを使ってコードが
== ソースコード ==
43行目:
メモリ空間の節約のため、Emacsの機能の多くは、必要になるまで読込まれない。追加機能一式それぞれは、「ライブラリ」というEmacsコードの集まりで実装されている。たとえば、プログラムソースコードのキーワードの強調用ライブラリや[[テトリス]]・ゲームで遊ぶライブラリなどがある。各ライブラリは、ひとつまたは複数のEmacs Lispソース・ファイルで実装される。
一部の関数は [[C言語]]
ただし、C言語でのエラーはすぐに[[セグメンテーション違反]]やより些細なバグにつながるため、エディタをクラッシュさせるし、Emacs Lispの[[ガベージコレクション|ガベージ・コレクタ]]と正しく相互作用するC言語のコードを書くことはエラーを引き起こしやすいので、<!--←英語版の意味が不明瞭-->プリミティブで実装されている関数は比較的少数である。
=== バイトコード ===
|