lispmode.lの解析、その2

 で、知りたいこと

  • indent
    • lispのindent機構*1
    • リーダーマクロ対応
  • function-list
    • lispの関数ジャンプ機構*2

 今の所は*3この二つを拡張したい、
のでLet's hack lispmode.l


lispmodeのindentについて調査

 36-94行に延々と、


各関数名のシンボルを
'lisp-indent-hookプロパティとして、
インデント数を設定してるみたい。


そのプロパティをcalc-lisp-indent関数で参照、インデント数として使用しているみたい
と、推測してみた( ̄ー+ ̄)

(setf (get 'lambda 'lisp-indent-hook) 'defun)
(setf (get 'interactive 'lisp-indent-hook) 1)

;;;以下、いっぱい続く

村瀬の疑問: 'lambda等のシンボルは関数名のシンボル?

 なのでちょっと確認。

info-modoki-modeよりgetを検索
使用例:
  ;;; シンボルにプロパティを設定してみる。
  (get 'clyde 'species)                         => nil 
  (setf (get 'clyde 'species) 'elephant)        => elephant 
  (get 'clyde 'species)                         => elephant

  ;;; 関数の説明を取得してみる。
  (defun foo (x) "increment" (1+ x))            => foo
  (get 'foo 'lisp::function-documentation)      => "increment"


 ん〜、関数名みたい。
プロパティの設定って、メタデータの設定って感じなのかな*4
じゃあ、変数名のシンボルにメタデータ設定できないのかな?

(setf foo 7) ;=> 7
(defun foo (x)
  "sqrt number"
  (* x x))   ;=> foo

(foo foo)    ;=> 49


foo                                          ;=>7
'foo                                         ;=>foo
(get 'foo 'lisp::function-documentation)     ;=>"sqrt number"


 ぐぁ〜、わからんw;
lisp-2なので、変数と関数が分かれていることは確かみたいだけど
用法としてどう使い分けんだったけ?*5

で、インデント動作の確認w;

(setf (get SYMBOL 'lisp-indent-hook) VALUE)
;(setf (get 'lambda 'lisp-indent-hook) 'defun)
(setf (get 'lambda 'lisp-indent-hook) '6)
;(setf (get 'interactive 'lisp-indent-hook) 1)
(setf (get 'interactive 'lisp-indent-hook) 3)

 lambda等のインデントを上記の用に弄ってみる、前に
インデントの確認(分かりづらいので、「スペース、タブ」=>「ドット」にしてます)

(lambda
..(interactive
......))

 で、弄ってみて確認。

(lambda
....(interactive
........))

 あれ、イメージと違うw;
どうも、意図したとおりにうごいてない。


 関数シンボル等のインデントに
上記のプロパティを使ってないのだろうか?

(defun calc-lisp-indent (opoint) &body)

 インデントを計算してると思われるcalc-lisp-indentを弄ってみる。

 インデントを0にしてみると、

(defun calc-lisp-indent (opoint)
  0)

 はい、0になってるよね

(defun
(lambda
)
)

 インデントを10にしてみると、

(defun calc-lisp-indent (opoint)
  10)

 こっちは10固定になってます。

(defun
	  (lambda
	  )
	  )


 なんで、ココなのは間違いないハズだが、う〜ん><
次回に、続くw;

*1:clojure用に流用したいので

*2:clojure用に流...

*3:そのうちemacsclojure環境も使ってみて欲しい機能も増えるかもしれないが

*4:プロパティとメタデータの違い言われても困りますけど

*5:s-exprの先頭なら関数見たいな感じだっけ