今、あなたはより効率的なコードを求めています。これによって意味することができるいくつかのことがあります。より高速に実行されるコードが必要であることを意味する場合があります。コードは今どれくらい遅いですか?Emacsで実行すると、すぐに実行できます。このコードは、定義上、ボタンを押すだけで呼び出されるため、超高速である必要はありません。あなたのコードはそのユースケースに対して十分に速いので、私はそれをこれ以上速くすることを心配しません。また、メモリを使用しません。n
何度も呼び出すと、1つの整数を格納するのに十分なメモリしか使用しません。このアルゴリズムはO(1)
です。私にはいいですね。
「これをより少ない行で書く」という意味もあります。これにより、コードのエラーが発生しにくくなり、理解しやすくなります。それは確かに合理的な目標です。あなたのコードはそもそもひどいものではないので、それは必要ではありませんが、悪い考えでもありません。関数に加えることができるいくつかの変更があります。の3番目の句全体を削除しcond
、(= iivar 2)
ケースを最後の句にして、iivar
そこで3に設定する必要をなくすことができます。まあ、それはすでに良いです。
しかし、待ってください、関数は(eq last-repeatable-command 'incremental-insert-o)
最大3回呼び出されます!それは沢山。書き直してみよう!interactive
まず、次のように、呼び出しを使用して基本関数の定義から始めましょう。
(defun incremental-insert-o ()
(interactive))
次に、コードから物事を再構築します。iivar
まず、正しく追跡できるかどうかを見てみましょう。読みやすくするために、その変数の名前をに変更しますincremental-insert-o-consecutive
。EmacsLispには単一の名前空間があるため、という名前の変数を使用する他のすべての変数はiivar
、コードが見ているのと同じ場所で読み取りと書き込みを行います。
(defun incremental-insert-o ()
(interactive)
(if (eq last-repeatable-command 'incremental-insert-o)
(setq incremental-insert-o-consecutive
(1+ incremental-insert-o-consecutive))
(setq incremental-insert-o-consecutive
1)))
それは機能していますか?あなたがしたように私はそれをバインドし[F8]
ます:(global-set-key [f8] 'incremental-insert-o)
。ここで、[F8]
を押して実行しますが、戻り値が何であるかはわかりません。関数を少し変更してテストしてみましょう。
(defun incremental-insert-o ()
(interactive)
(if (eq last-repeatable-command 'incremental-insert-o)
(setq incremental-insert-o-consecutive
(1+ incremental-insert-o-consecutive))
(setq incremental-insert-o-consecutive
1))
(message "incremental-insert-o-consecutive is currently %s" incremental-insert-o-consecutive))
それが機能することを確認するために数回叩い[F8]
てください、そしてそれは機能します!1から始まり、呼び出されるたびに1ずつ増加し、何か他のことをするとリセットされます。今、私たちは正しいメッセージを印刷する必要があります。何を印刷したいですか?さて、最初に関数を呼び出すときは、1つ「o」を出力し、次に2回目は「oo」を出力し、3回目以降は「ooo」を出力します。2番目の文字列を印刷すると、最初の文字列が2回印刷され、3番目の文字列が最初の文字列を3回印刷されることに注意してください。
(defun incremental-insert-o ()
(interactive)
(if (eq last-repeatable-command 'incremental-insert-o)
(setq incremental-insert-o-consecutive
(1+ incremental-insert-o-consecutive))
(setq incremental-insert-o-consecutive
1))
(dotimes (i incremental-insert-o-consecutive)
(insert "o ")))
これはほぼ正しいです!1〜3回は正しい動作をしますが、「ooo」の挿入に制限はありません。「oooo」などを出力します。したがって、繰り返しの制限を3で制限する必要があります。
(defun incremental-insert-o ()
(interactive)
(if (eq last-repeatable-command 'incremental-insert-o)
(setq incremental-insert-o-consecutive
(1+ incremental-insert-o-consecutive))
(setq incremental-insert-o-consecutive
1))
(dotimes (i (min incremental-insert-o-consecutive
3))
(insert "o ")))
さて、これはまさにあなたが望むことをするようです。元の関数からの変更点を見てみましょう。これは、3を超える繰り返しの数をカウントします。ただし、出力の動作は同じであるため、これは重要ではないと思います。実際の繰り返しの数を維持する方がよいようです。整数をオーバーフローさせると壊れますが、それはありそうにないようです。EmacsはMAXINTとして少なくとも536870911を保証します。それでは、その日を呼びましょう。コードを短くし、繰り返しの部分はありません。読みやすくなると思います。