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 |

2009-11-16

KMRCLを眺める (14) print-form-and-results

| 00:01 | KMRCLを眺める (14) print-form-and-results - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (14) print-form-and-results - わだばLisperになる

今日は、KMRCLのmacros.lispの中からPRINT-FORM-AND-RESULTSです。

これも前回のMACに引き続き便利ユーティリティのようです。EXPORTされてませんので、使う時は適宜EXPORTしましょう。

使い方は、REPLなどで、

(print-form-and-results
  (DOSEQUENCES* ((I '(1 2 3 4 5 6 7)) (S "12341234123412341234" NIL :START 2))
    (PRINT (LIST I S))))
;=> (1 #\3) 
;   (2 #\4) 
;   (3 #\1) 
;   (4 #\2) 
;   (5 #\3) 
;   (6 #\4) 
;   (7 #\1) 
;   (DOSEQUENCES* ((I '(1 2 3 4 5 6 7)) (S "12341234123412341234" NIL :START 2))
;     (PRINT (LIST I S))) --> NIL

という感じでしょうか。フォームをプリントして、-->の後に返り値をプリントしています。

定義は、

(defmacro print-form-and-results (form)
  `(format t "~&~A --> ~S~%" (write-to-string ',form) ,form))

という感じです。やりたいことそのままですね。

なんとなくSLIMEと連携して表示させてみたらどうかと思い、

;; Emacs Lisp
(eval-after-load "slime"
  '(progn
     (defun slime-print-form-and-results ()
       "(Print-Form-And-Results) the form at point."
       (interactive)
       (slime-eval-and-print-form-and-results
        `(swank:eval-and-grab-output
          ,(format "(kmrcl::print-form-and-results %s)" (slime-defun-at-point)))))
     
     (defun slime-eval-and-print-form-and-results (form)
       "Print-Form-And-Results FORM in Lisp and display the result in a new buffer."
       (slime-eval-async form (slime-rcurry #'slime-show-print-form-and-results
                                            (slime-current-package))))
     
     (defun slime-show-print-form-and-results (string package)
       (slime-with-popup-buffer ("*SLIME Print-Form-And-Results*" package t t)
         (lisp-mode)
         (princ (first string))
         (goto-char (point-min))))
     
     ;; control-shift-r
     (define-key slime-mode-map
       [(control shift ?r)] 'slime-print-form-and-results)))

というのを定義してみました。

(DOSEQUENCES* ((I '(1 2 3 4 5 6 7)) (S "12341234123412341234" NIL :START 2))
  (PRINT (LIST I S)))

の上で、C-sh-Rすると、

(1 #\3) 
(2 #\4) 
(3 #\1) 
(4 #\2) 
(5 #\3) 
(6 #\4) 
(7 #\1) 
(DOSEQUENCES* ((I '(1 2 3 4 5 6 7)) (S "12341234123412341234" NIL :START 2))
  (PRINT (LIST I S))) --> NIL

のように別のフレームで表示されますが、表示がちょっと中途半端ですね。

もう少し手をかけて整形して表示すると良いかもしれません。