« Float 遊び | トップページ | ソフトウエアの「消費コスト」 »

2009年4月13日 (月)

命令的な Lisp

xyzzy で htmlize.el 的なものが欲しいと思いまして。

ソースコードを漁っていたのですけど、テキストの色を lisp から取得する方法はなさそうでした。それで、トークンの種類を取ることはできるようなので、これを使って色を付ければ良いかと考えました。

トークンの種類をとるコードを、試しに書いてみたわけですが。

色々と、 xyzzy lisp のソースコード読んでいるうちに、これは命令的に書く方が良いのかな、と思い始めまして。再帰の代わりにループと破壊的代入を使って、命令的 lisp で書いてみることにしました。

書いてみて、こういうコードは、なんか見ていてホッとするなあ、と思ったり。長年の習慣というのは、すっかり染み付いてますね。

(defun test-token (b)
  (interactive "bBuffer:")
  (with-open-stream (os (get-buffer-stream-o *foobar-output-buffer-name*))
    (set-buffer b)
    (save-excursion
      (let ((token nil)
            (s "")
            (pos 0))
        (while (< pos (point-max))
          (multiple-value-setq (token s pos) (get-token pos))
          (format os "~A ~A ~A~%" token s pos)
          )
        ))))

(defun get-buffer-stream-o (bname)
  (let ((b (get-buffer-create bname)))
    (erase-buffer b)
    (make-buffer-stream b)))

(defun get-token (pos)
  (let ((c (char-after pos)))
    (cond ((syntax-string-p c)
           (let ((s (string c))
                 (syn :string))
             (setq pos (+ pos 1))
             (setq c (char-after pos))
             (while
                 (and (< pos (point-max))
                      (eq syn :string))
               (setq s (concat s (string c)))
               (setq pos (+ pos 1))
               (setq c (char-after pos))
               (setq syn (parse-point-syntax pos)))
             (values 'string s pos)))
          ((or (syntax-word-p c)
               (syntax-symbol-p c))
           (let ((s ""))
             (while
                 (and (< pos (point-max))
                      (or (syntax-word-p c)
                          (syntax-symbol-p c)))
               (setq s (concat s (string c)))
               (setq pos (+ pos 1))
               (setq c (char-after pos)))
             (values 'word s pos)))
          (t (values 'other (string c) (+ pos 1))))
    ))

|

« Float 遊び | トップページ | ソフトウエアの「消費コスト」 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/29094737

この記事へのトラックバック一覧です: 命令的な Lisp:

« Float 遊び | トップページ | ソフトウエアの「消費コスト」 »