#:g1: SLIMEばつ牛ン (1) slime-eval-defun

Posted 2010-09-29 14:11:00 GMT

KMRCLも難しいファイルを後回しにしていたので、だんだん解説が難しくなってきたので、逃げ道の開拓ということで、SLIMEの機能を適当に探ってみることにしました。(LISP365完了の12月まで毎日書けるような軽いネタが必要なため…)
今回は、 slime-eval-defun です。

キーバインド

デフォルトのキーバインドは、c-m-x。
ちなみに私は、c-m-xは押しにくいし、Lispマシンと同じキーバインドにしたかったので、c-sh-e((shはシフト))にしてみています。

使い方

評価したい式の上で、実行します。
(slime-)eval-defunということで、基本的に関数定義を評価するためのものだと思うのですが、大雑把にフォームを評価するもの、という感じです。
数引数を付けると、結果をバッファ内に挿入してくれるオマケ機能があります。
(+ 3 3 3)
<ここで実行>9
定義は
;; elisp
(defun slime-eval-defun ()
  "Evaluate the current toplevel form.
Use `slime-re-evaluate-defvar' if the from starts with '(defvar'"
  (interactive)
  (let ((form (slime-defun-at-point)))
    (cond ((string-match "^(defvar " form)
           (slime-re-evaluate-defvar form))
          (t
           (slime-interactive-eval form)))))
こんな感じですが、defvarを特別扱いしていて、defvarの場合は、値をセットしなおしてくれるというさらなるオマケ機能があります。
defvarの挙動が面倒でdefparameterにしている人には嬉しい機能ですね。(望んでない人もいるかもしれませんが…)
私は以前、Lispマシンのマニュアルを眺めていて、Evaluate Region Hack(c-m-sh-e)という同様の動きをする関数をみつけて、感心して早速自作してみたことがあったのですが、SLIMEにもあったのを後で知りました。歴史は繰り返すのか、文化が連綿と受け継がれているのか…。
数引数があれば、slime-interactive-evalが呼ばれて、結果としてバッファに評価結果が挿入されます(この辺りを追い掛けて行くと芋蔓できりがなさそうなので、この辺にしておきます…。)
このブログを書いていると評価する式と評価結果を併せて書いたりすることが多いのですが、
(+ 3 3 3)
9
から一歩進んで、
(+ 3 3 3)
;; => 9
としてくれると嬉しいのにな、と思ったりもします。
そんなことをぼやいていたら、quekさんに自作のユーティリティを教えてもらいました。
;; elisp
;; 評価した結果をバッファ内に ;;=> 結果 という形で挿入
;; quekさん作
(defun slime-que-print-last-expression (string)
  "Evaluate sexp before point; print value into the current buffer"
  (interactive (list (slime-last-expression)))
  (insert "\n;; => ")
  (slime-eval-print string))
これは便利ですね!

comments powered by Disqus