14

私はLisp(実際にはEmacs Lisp)で遊んでいる初心者です。同じ構文エラーに何度も遭遇するように見える場合を除いて、それはとても楽しいです。

たとえば、これは私が何度か遭遇したものです。私には次のcondような形があります

(cond
 ((foo bar)
  (qux quux))
 ((or corge
      (grault warg))
  (fred)
  (t
   xyzzy)))

を返すデフォルトの句は、xyzzy実際には前の句の中にネストされているため、実行されません。

(cond
 ((foo bar)
  (qux quux))
 ((or corge
      (grault warg))
  (fred))
 (t
  xyzzy))

インデントの違いが1スペースしかない場合、このようなエラーを確認するのは困難です。これは時間とともに簡単になりますか?

(誤って)インデントされた線とそれがインデントされるべき線との間に大きな距離がある場合にも問題があります。letたとえば、多くの複雑なバインディングを持つunlessフォーム、または長い条件付きのフォーム:

(defun test ()
  (unless (foo bar
               (qux quux)
               (or corge
                   (grault warg)
                   (fred))))
  xyzzy)

フォームxyzzyの中にはまったく入っていなかったことがわかりました。unless

(defun test ()
  (unless (foo bar
               (qux quux)
               (or corge
                   (grault warg)
                   (fred)))
    xyzzy))

私は習慣的に自動インデントし、括弧のカウントを避けるために括弧の強調表示を使用します。ほとんどの場合、それはそよ風のように機能しますが、ときどき、デバッグするだけで構文エラーを発見します。私に何ができる?

4

7 に答える 7

28

sexpsを強調表示

まず、組み込みのパレンマッチの強調表示(show-paren-mode)をまだオンにしていない場合はオンにします。それは常にあなたがどのインデントレベルにあるかについての考えをあなたに与えます。

より洗練されたパッケージもいくつかあります。たとえば、に関するTJの回答をmic-paren参照してください。または、自分に適しているとは思いませんでしたが、すべての式ブロックを異なる色で強調表示するSchumacherの強調表示モードがあります。エドワードオコナーでさえ、現在の性別を強調するモードがあります。

パレディット

paredit-modeあなたがsexpsを書くのを助ける使用。sexps間を簡単に移動して、コードを再構築できます。さらに、括弧が常にバランスが取れていることを保証します。最初に試したとき、Pareditがコーディング方法を制限する方法は非常に面倒でしたが、それ以来、Pareditを使用することに慣れているため、生産性が大幅に向上し、括弧の開閉と混同されることはありません。

自動インデント

Emacsスターターキットを使用します。これにより、デフォルトで、改行での再インデントなど、Elispでコーディングするための多くの便利なヘルパーが有効になります。

ElDoc

emacs-lisp-modeいくつかの便利な拡張機能があります。たとえばeldoc-mode、エコー領域に現在入力している関数の引数リストまたは変数のdocstringを表示するものを常に使用します。また、間違ったブロックにいるかどうかを簡単に認識するのにも役立ちます。

Edebug

最後のチャンスとして、コードで何が起こっているのかを常に理解するのに役立つEdebugについて言及するのをほとんど忘れてしまいました。

于 2009-05-22T15:08:49.343 に答える
7

Lisp構文の問題を見つけるのに役立つ3つの具体的なことを次に示します。やがて、それは第二の性質になるでしょう。しかしそれまで:

括弧のマッチング

括弧の一致は、グループ化を確認する最も簡単な方法です。私のお気に入りのパッケージはmic-parenです。そして、私はこの特定の構成が好きです:

(setq paren-dont-touch-blink t)
(require 'mic-paren)
(paren-activate)
(setq paren-match-face 'highlight)
(setq paren-sexp-mode t)

これにより、ポイントがsexpの開始/終了にあるときに、sexp(一致する括弧)が強調表示されます。括弧が一致しない場合、ハイライトの色は異なり、より明るくなります。一致する括弧が画面外にある場合、ミニバッファーでその端がどのように見えるかを示します(そしてそれが何行離れているかを示します)。

コンパイル

もう少し複雑な方法については、Elispコンパイラをで実行できますM-x compile-defun。たとえば、この簡単な例をコンパイルすると、次のようになります。

(defun mytestfun ()
  (let ((cur (current-buffer)))
    )
  (set-buffer cur))

私は次のような名前のバッファを取得しました*Compile-Log*

警告:自由変数`cur'への参照

それは私がそれを定義したステートメントcurの外で使用していたという事実に私を手がかりにしました。let

インデントレベルの変更

インデントをより目立たせたい場合は、変数をカスタマイズできますlistp-body-indent

(setq lisp-body-indent 4) ;# default is 2

さまざまな構造のインデント方法をカスタマイズすることもできますが、これは非標準であり、ほとんどのLispコードを見るときに混乱を招く可能性があるためお勧めしません。

于 2009-05-22T15:35:22.850 に答える
2

簡単な方法の1つは、カーソルを各cond条件の先頭に移動して、閉じているパレンがどこにあるかを確認することです。

于 2009-05-22T15:02:19.933 に答える
2

lispを書くための「最良の」方法は、emacsとslimeの組み合わせです。これは、括弧の強調表示、タブ補完を提供し、lispハイパースペックドキュメントに直接ジャンプできます。関数の変数名(以下を参照)などを提供します。

(defun foo(bar)...)

入力を開始すると(fooは、fooがbarという名前の1つの引数を必要としていることを示します。これにより、関数が取る引数を簡単に「推測」できます。これは、Lispの規則に従わない関数に特に便利です。

于 2009-05-22T15:08:37.520 に答える
1

インデントの違いが1スペースしかない場合、このようなエラーを確認するのは困難です。これは時間とともに簡単になりますか?

少なくとも私にとってはそうではありません。使用する特定のxtermフォントに一部依存しますが、効果的に機能するには4スペースのインデントが必要です(ええ、古い元のxtermフォントを使用しています。SunOS4のせいです) 、そして2つでも問題があります。

括弧の強調表示も使用し、「%」キーを頻繁に使用しviます。

残念ながら、これはあまり有用な答えではありません。

于 2009-05-22T14:58:59.457 に答える
1

私はあなたが取ることができる2つのアプローチを見て、あなたの両方の例に役立つことができます。

最初の方法は、最初に全体像を描いてコードを記述し、後で詳細を入力することです。あなたの最初の例では、これを最初に書くことから始めたかもしれません

(cond
 (--
  --)
 (--
  --)
 (t
  --))

その後、詳細の入力を開始できます。--'はTODOフィラーのようなものです。

2番目の例。あなたはで始めることができます

(defun test ()
  --)

次に、次のように入力します。

(defun test ()
  (unless (--)
    --))

その後、さらに記入します。

もう1つの方法は、レインボーデリミタをカスタマイズして、ある色で偶数レベルのパレンを強調表示し、別の色で奇数レベルのパレンを強調表示することです。これは、condフォームに役立ちます。2番目の例では役に立ちませんが、(xyzzy)の代わりに使用した場合はxyzzy、役に立ちます。

于 2013-08-20T15:01:05.797 に答える
0

他のみんなの貴重なポインタに追加するには、「構造ベースの移動コマンドを使用する」などと言いbackward-sexpますforward-sexp。それはあなたがナビゲートすることを可能にします。

于 2010-04-30T10:33:11.790 に答える