Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-10-27

EMACSからSLIMEにS式を投げてEMACS側で受けとりたい

| 05:28 | EMACSからSLIMEにS式を投げてEMACS側で受けとりたい - わだばLisperになる を含むブックマーク はてなブックマーク - EMACSからSLIMEにS式を投げてEMACS側で受けとりたい - わだばLisperになる

自分は、はてな日記をsimple-hatena-modeで書いて、SLIMEで投稿ということを試みているのですが、EMACS->SLIMEという風にSLIMEに式を送ることは比較的簡単なのですが、SLIMEから結果を受けとる方法は良く分からないので放置していて、面倒なのでREPLから投稿したりしていました。(とはいえSLIMEのREPLには履歴機能があるのでそんなに不便でなかったりします)

しかし、SLIMEは、EMACSとCL処理系の連携をしているわけであり、結果を受け取れない筈はありません。

という訳でちょっとslime.elを追っ掛けてみたら、すぐ目的の関数はみつかってしまいました。

目的の関数は、slime-eval-printという関数で、式を文字列として受けとって、結果をS式で返してくれる関数のようです。

これをちょっと改造すれば色々応用できそうだということで、結果をエコーエリアに表示してくれるようなものを作成しました。

(defun slime-eval-mesg (string)
  "Eval STRING in Lisp; Echo any output."
  (slime-eval-async `(swank:eval-and-grab-output ,string)
                    (lambda (result)
                      (destructuring-bind (output value) result
                        (message (format "%s" value))))))

この関数の動作の詳細は良く分かっていないので、本当に適当です。(outputは、出力、valueは返り値の様子)

それで、simple-hatena-modeの日記を投稿する関数/simple-hatena-submitを上書きして内容をCLのはてな日記を投稿する関数を呼び出すようにします。

(defun simple-hatena-submit ()
  (interactive)
  (slime-eval-mesg "(post-todays-group-entry)"))

CL側のpost-todays-group-entryは、日記を投稿して成功したら文字数を返すような関数で、成功すれば、エコーエリアに文字数が表示されることになります。

ということで、早速このエントリもこの仕組みで投稿していますが、今のところは上手く行っているようです。(エラー時のリカバリはどうするのかという謎は残っていますが…)