関数をつなげるとか

前に書いた次の移動候補が〜とかいう話は、折角グローバル変数を使うなら移動する場所だけってのももったいないし、関数で試してみた。
案1:関数で鎖のようにつなげまくる。酷く面倒。

(defvar *next-paren* nil)
(defun create-defun()
  (let ((cp (point)))
	(insert *default-defun-name* "()" )
	(lisp-newline-and-indent)
	(goto-char cp)
	(setq *next-paren* 'next-paren)
	(selection-forward-word)))

(defun next-paren()
  (interactive)
  (forward-char)
  (setq *next-paren* 'next-interactive))

(defun next-interactive()
  (interactive "*")
  (goto-eol)
  (delete-trailing-spaces)
  (lisp-newline-and-indent)
  (let ((start (point))
		(end nil))
	(insert "(interactive)")
	(goto-eol)
	(setq end (point))
	(selection-forward-char (- start end)))
  (setq *next-paren* 'next-let))

(defun next-let()
  (interactive "*")
  (delete-char-or-selection)
  (let ((start (point))
		(end nil))
	(insert "(let ()")
	(goto-eol)
	(setq end (point))
	(selection-forward-char (- start end))))

(defun tester()
  (interactive)
  (funcall *next-paren*)
  )

 こんな感じにやたらと関数をつなげまくるとか。(こんなんじゃ汎用性は低そう)というか、之をする位なら、単純に直前の文字列をチェックした方が便利そう。というか、使い物にならない予感。上手くリストとかにして、変数に候補の関数名を入れまくれば、そこそこ、上手くいきそうって言うか、そもそも、lispの文脈を読み取る必要はないけど、何しろ人力で候補の関数を作りまくってしまうんだから人力に近いけど。しかもundoとかもあるから、果てしなく面倒な雰囲気。