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 |

2007-09-17

.7

| 19:54 | .7  - わだばLisperになる を含むブックマーク はてなブックマーク - .7  - わだばLisperになる

今日は、Gaucheクックブックの「#?=を使ったデバグ」というのがなんとなく便利そうでだったので、自分なりに真似して作ってみました。

Gaucheクックブック/「#?=を使ったデバグ」

http://d.hatena.ne.jp/rui314/20070628/p1

(defmacro debug-print (obj &optional name (stream t))
  `(let ((hr "** ----------------------------------------")
	 (name (if ,name ,name 0)))
     (format ,stream "~A~%** Debug: #~A | ~A => ~A | ~S~%~0@*~A~%" 
	     hr name ',obj ,obj (type-of ,obj))
     ,obj))

(defun gauche-debug-print ()
  (when (get-dispatch-macro-character #\# #\?)
    (or (yes-or-no-p "#?は既に使用されています。上書きしますか?") 
	(return-from gauche-debug-print)))
  (set-dispatch-macro-character #\# #\?
   (lambda (stream char arg)
     (declare (ignore char))
     (if (char= #\= (peek-char t stream))
	 (read-char stream))
     (list 'debug-print (read stream t nil t) arg t))))
(gauche-debug-print)

を評価すると、#?=が使えるようになります。

(let ((foo '(1 2 3 4 5))
      (bar "qwerasdfzxcv"))
  (nreconc foo (map 'list (lambda (x) #1068?=x)
		    #?=bar)))

のように使用し、


** ----------------------------------------
** Debug: #0 | BAR => qwerasdfzxcv | (SIMPLE-ARRAY CHARACTER (12))
** ----------------------------------------
** ----------------------------------------
** Debug: #1068 | X => q | STANDARD-CHAR
** ----------------------------------------
** ----------------------------------------
** Debug: #1068 | X => w | STANDARD-CHAR
** ----------------------------------------
   ~~~~~~ ~~~

のような結果を出力します。

ディスパッチングマクロ文字は10進数の引数が取れるようなのですが、捨てるのも勿体ないので使ってみました。

引数が無ければ、番号は0になります。

そして番号付けが面倒臭いので、emacsで現在のポイントの位置を挿入してみることにしました。

;; emacs lisp
(defun insert-gauche-debug-print-dispatch-char (insert-point-p)
  (interactive "P")
  (insert 
   (format "#%s?=" (if insert-point-p (int-to-string (point)) ""))))

C-U M-X insert-gauche-debug-print-dispatch-charで、数字を付けて#?=を挿入します。