しょぼしょぼすくりぷと xyzzy編 > カスタマイズするための知識 > errorミニ対策集

errorミニ対策集

ちょっとした、エラー対策集です。

参考

M-x toggle-trace-on-error を実行すると *Trace Output*にエラーのスタックトレースがでるので デバッグの足がかりになります。

M-x toggle-trace-on-error

エラー一覧
エラーの親子関係も含めた全?種類のエラー一覧が載っています。
リファレンス(wiki) > Type > Tips > エラー処理関係

実践例

予期しない文字


括弧対応や文字列の""や コメントの;がおかしくなっている可能性が高いです。
indent-current-bufferなどや (goto-matched-parenthesis)を使うと見つけやすいです。
	 (if t t nil
  
対策

適切な引数の数にする


引数が多すぎます: (#1=#:|| . #1#)


if の 引数が3個を越えていたりします。その他のFunctionでもあり得ます。
関数の終わり方や括弧対応に注意を払うと見つかります。後ろにある#1.などは内部構造がわからないと難しいです M.HiroiさんのページやEmacs Lisp(.el)系のページを参考してください。
(forward-char 1 nil)
引数が多すぎます: (forward-char 1 nil)

対策
適切な引数の数にする

(forward-char 1)

  



引数が少なすぎます: (#1=#:|| . #1#)


引数が最低限の数ありません。
括弧対応の場合が多いかも。
(if)
引数が少なすぎます: (#1=#:|| . #1#)

対策
適切な引数の数にする
	  (if t t)
  



ディスパッチングマクロ副文字ではありません


#abc -> #'abc , #\abc などに気をつければいいと思います。その他は '("apple" .@*auto-mode-alist*) のような形など。
(global-set-key #C-z 'quit)
*scratch*: 18: 不正な複素数の構文です: -z
(global-set-key '(#\C-z) #quit)
*scratch*: 17: ディスパッチングマクロ副文字ではありません: Q

対策
適切な表現に直す。
(global-set-key #\C-z 'quit)



名前が衝突するためエクスポートできません


パッケージなどで宣言する前にすでに宣言されています。
よって、ライブラリを読み込んでから、変数の値を設定する必要があります。
(load-library),(require)の前後に注意します。そこで読むファイルにかかれている変数を設定する場合は、その後に定義します。
(setq tl "apple")
;読み込まれる 部分 (ファイルなど)
(provide "temp")
(in-package "editor")
(export '(tl))
;読み込まれる部分


対策後

;読み込まれる部分
(provide "temp")
(in-package "editor")
(export '(tl))
;読み込まれる部分

(setq tl "apple"); このように、読み込んだあとに設定する。

  

パッケージは変数名を被らないようにするための仕組みで、変数とパッケージ名セットの変数をlispがやってくれるイメージです。

モジュールの中に (in-package "hogehoge")と書かれていたあとに宣言されていたら hogehoge::tl のようにしても良いです。普段何気なく使っているデフォルト標準は user パッケージ 例えば、モジュール名が分かっている java-mode等の場合、 ed::を付けて回避する方法もあります。 (editorの省略形),また、::が二つあるものはexportされておらず、一つのものはexportされています。

importやexportを使うと、デフォルトのようにいちいち指定せずに変数が使用できます。まぁダブるので元の通り、重複しますが・・

provide : モジュールを提供
defpackage:モジュールを定義する
in-package:ここから先のモジュール名

require:モジュールを読み込む
hogehoge::モジュールを使う

パッケージの概要(wiki reference)

不正なデータ型です: t: string


後ろの型が要求または対応されているのに、互換性のない型を指定しています。
上の場合 文字列(string)が正式な型で要求されてますが、t を渡しています。
私の場合、リストを使った部分で良く間違えます。
型チェックは(type-of)が有効です。
(string-match "abc" 10)
不正なデータ型です: 10: string

;10という引数が おかしい、 ここでは string 型のはず という意味

対策

適切な型を意識する
(string-match "xyz" "I love xyz cocktail")

  



変数が定義されていません。/関数が定義されていません。


関数を使うときは(function)の用に使います。
変数を使うときは (function value value)の用に使います。
cond,let以外はたいてい開き括弧の後が関数、それ以外が変数になっています。なので例えば、変数を括弧で囲んでしまったりすると関数と見なされ、逆に関数のつもりで括弧で書き始めないと変数とシステムにとられ勘違いされる場合があります。
(value if)
関数が定義されていません: value
(setq tl "apple")
(if tl and)
変数が定義されていません: and
  

しょぼしょぼすくりぷとxyzzy | カスタマイズするための知識