Next: , Previous: , Up: List Processing   [Contents][Index]


1.3 Generate an Error Message

過ったことを実行してしまうのではとあなたが心配しないように、今度はLispインタープリターがエラーメッセージを生成するようなコマンドを与えてみましょう。これを行うことに害はなく、実際のところ意図してエラーメッセージの生成を試みることもよくあります。この用語について一度理解してしまえば、エラーメッセージが有用な情報源となり得るのです。これらは“エラー”メッセージではなく“エラー”メッセージと呼ばれるべきでしょう。これらのメッセージは旅人にとって異国における道標のようなものであり、解読は困難かもしれませんが理解してしまえば進むべき道を示してくれるのです。

エラーメッセージは組み込みのGNU Emacsデバッガによって生成されます。デバッガから抜け出すにはqとタイプしてください。

ここではクォートされておらず、コマンドとして意味をもたない要素が最初の要素であるようなリストを評価してみます。以下のリストは前にシングルクォートが置かれていない点を除けば、先程の例で使用したリストとまったく同じリストです。このリストの右にカーソルを移動してC-x C-eとタイプしてください:

(this is an unquoted list)

*Backtrace*ウィンドウがオープンして以下のような出力を目にするはずです:

---------- Buffer: *Backtrace* ----------
Debugger entered--Lisp error: (void-function this)
  (this is an unquoted list)
  eval((this is an unquoted list) nil)
  elisp--eval-last-sexp(nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)
---------- Buffer: *Backtrace* ----------

カーソルはこのウィンドウに移動するでしょう(このウィンドウが可視になるまで数秒待つ必要があるかもしれない)。デバッガを終了してデバッガウィンドウを非表示にするには以下を入力してください:

q

デバッガから抜け出せる確証を得るために、すぐにqとタイプしてみてください。それでは再度デバッガに遷移するためにC-x C-eとタイプしてください。

わたしたちがすでに得た知識にもとづき、このエラーメッセージのほとんどを解読することができます。

*Backtrace*を下から上に読んでいくと、Emacsが何を行ったかが判ります。C-x C-eをタイプした際に、コマンドeval-last-sexpにたいしてインタラクティブ(interactive: 対話的)な呼び出しが行われました。evalは“evaluate(評価)”、sexpは“シンボル式(symbolic expression)”を略したものです。このコマンドの意味は“最後のシンボル式を評価する(evaluate last symbolic expression)”であり、ここで最後の式とはカーソルの直前にある式のことです。

上記の行はそれぞれ、Lispインタープリターが次に何を評価したかを示しています。もっとも最近のアクションが一番上になります。このバッファーではEmacsを逆方向に追跡できるので、*Backtrace*バッファーと呼ばれています。

*Backtrace*バッファーの一番上に以下のような行があるのが判るでしょう:

Debugger entered--Lisp error: (void-function this)

Lispインタープリターはリストの最初のアトムである単語‘this’の評価を試みました。これがエラーメッセージ‘void-function this’を生成したアクションです。

このメッセージには‘void-function’、および‘this’という単語が含まれています。

関数(function)’という単語は前に一度触れたことがあります。これはとても重要な単語です。わたしたちの目標にとっては、コンピューターに何を行うよう指示する一連の命令セットが関数であると定義することができます。

これで‘void-function this’というエラーメッセージを理解する準備が整いました。この関数(つまり単語‘this’)にはコンピューターが実行可能な命令セットの定義が存在しないのです。

この‘void-function’という少し風変わりな単語はEmacs Lispの実装方法をカバーするようにデザインされたもので、あるシンボルに関数定義が関連付けされていない際には命令が含まれるべき場所がvoid(空所)となります。

その一方で、わたしたちは(+ 2 2)を評価することによって2に2を正常に加算できました。これによりシンボル+にはコンピューターがしたがうべき命令セットがあり、それは+に続く数値を加算する命令でなければならないと推測できます。

このようなケースにおいて、Emacsがデバッガに遷移することを抑制することもできます。ここではその方法について説明はしませんが、あなたが使っているEmacsコードに何らかのバグがある場合には似たような状況に遭遇するかもしれないので、エラー結果がどのように見えるかについて述べておきましょう。このようなケースでは、エコーエリアに表示される以下のような1行だけのエラーメッセージを目にすることになるはずです:

Symbol's function definition is void: this

このメッセージはたとえカーソルを移動するためのキーであっても、何かキーをタイプすれば消えてしまいます。

わたしたちは‘Symbol’という単語については理解しています。これはリストの最初のアトムである‘this’という単語を参照しています。‘function’という単語はコンピューターにたいして何を行うか指示する命令を参照しています(技術的にはシンボルはコンピューターにたいして命令をどこで見つけるかを指示しますが、これは当面は無視できる複雑な詳細です)。

このエラーメッセージ‘Symbol's function definition is void: this’は、シンボル(すなわち単語‘this’)にはコンピューターが実行可能な命令が欠落している、と理解することができます。

This page has generated for branch:work/add_lispintr, commit:65845cf60c073f2f3182d1d07483530e9bbe1d96 to check Japanese translation.