3

CLIPSとJESSは、AIとルールエンジンに使用されるリスパイ言語です。それらのEMACSはlispモードから派生しています。正しくフォーマットするための最も重要な形式はdefruleであり、読みやすさに役立ちます。デフォルトでは、通常のlispモードフォーマットは次のように使用されます。

(defrule any-foo
  "This is a rule for any-foo."
  ?f <- (foo)
  =>
  (do-something-to ?f))

必要なフォーマットは次のようになります。オプションのドキュメントは2文字で、右矢印は2文字で、その他はすべて6文字です。

(defrule any-foo
  "This is a rule for any-foo."
      ?f <- (foo)
  =>
      (do-something-to ?f))

EMACSのカスタムインデントについてはたくさんのリソースがありますが、右矢印に一致するもののフォーマットをインターセプトしてそれをインターセプトできるかどうか疑問に思ったので、これは飛び出しました。さらに読んでみると、シンボリック式のカスタムフォーマット関数を記述しているように理解できましたが、右矢印はそうではありません。トップレベル全体のフォーマット関数を書きたくありませんし、どのようにすればよいのかまだわかりません。

この望ましいフォーマットスタイルを取得する正しい方法は何ですか?

4

1 に答える 1

3

SYMBOLにプロパティを指定することにより、最初の要素がSYMBOLであるLispフォームのインデントを指定できますlisp-indent-function。Emacsマニュアルの「 Lispインデント」セクションを参照してください。このプロパティはさまざまな種類の値を取ることができます。これらの値は、EmacsLispマニュアルの「マクロのインデント」セクションに記載されています。特に、プロパティをシンボルに設定すると、次のようになります。

シンボルは関数名である必要があります。この関数は、この式内の行のインデントを計算するために呼び出されます。関数は2つの引数を受け取ります。

stateparse-partial-sexpこの行の先頭まで解析するときに(インデントおよびネスト計算用のLispプリミティブ) によって返される値。

posインデントされている線が始まる位置。

その行のインデントの列数である数値、または車がそのような数値であるリストのいずれかを返す必要があります。数値を返すこととリストを返すことの違いは、数値は、同じネストレベルにある後続のすべての行をこのようにインデントする必要があることを示していることです。リストには、次の行で異なるインデントが必要になる可能性があることが示されています。

(関数は実際にはこれらの引数を別の順序で受け取ります。マニュアルを修正することを提案するバグレポートを提出しました。これはEmacs 24.3で修正されました。)

したがって、フォーム内の行の適切なインデントを計算する関数を作成する必要がありますdefrule。おそらく次のようになります。

(defun indent-for-defrule (pos state)
  "A lisp-indent-function for defrule.
Indent docstring and => by 2 columns; other lines by 6 columns."
  (save-excursion
    (goto-char pos)
    (let* ((have-string (looking-at "\\s-*\""))
           (have-arrow (looking-at "\\s-*=>"))
           (first-sexp (progn
                         (ignore-errors (backward-sexp))
                         (<= (point) (nth 2 state)))))
      (+ (progn (goto-char (nth 1 state)) (current-column))
         (if (or (and first-sexp have-string) have-arrow) 2 6)))))

次に、その関数をシンボルのlisp-indent-functionプロパティに割り当てます。defrule

(put 'defrule 'lisp-indent-function #'indent-for-defrule)
于 2013-01-15T13:42:56.173 に答える