2018年5月14日月曜日

再帰関数

 shellバッファにコマンドを投げてその結果を取得したい。
 単純にshellなら「shell-command」を使えば、いいんだけど、sshでいくつかのサーバを経由したときはshellバッファへ投げるしか、ないよなぁ。問題はshellバッファはコマンドの結果が非同期だということだ。
 コマンドを投げた直後は結果がまだ返ってきてない。
 filter関数を切り替えても非同期の問題は解決しない。終わりがわからないからだ。これはあれか。1秒毎にカーソルの位置をチェックして位置がかわらなくなったら終わりだと判断するか。
 whileかなぁ、なんかLispっぽくねー。
 うだうだ考えて再帰で書けることに気づいた。
 こんな感じ?

(defun wrk(p)
  (sleep-for 1)
  (let ((now (point)))
    (if (equal p now)
 now
      (wrk now))))

 簡単にmax-lisp-eval-depthにひっかかってしまうけど、ちゃんと末尾再帰している。elispでは意味ないけど。で、こうかな。

(let ((p (point)))
  (buffer-substring-no-properties p (wrk p)))