next up previous
Next: 4.7 関数定義の編集例 Up: 4 リストの編集プログラム Previous: 4.5 リスト形コマンドの処理

4.6 リスト構造のプリント

リストを画面に表示する場合に,見易くするために構造に応じたインデントを することをプリティプリントといい,そのための関数pprintが用意されています.
<cl> (setq a '(defun reverse1 (x)
     (cond
      ((null x) nil)
      (t (append (reverse1 (cdr x)) (list (car x)))))))
(DEFUN REVERSE1 (X) (COND ((NULL X) NIL)
                 (T (APPEND (REVERSE1 #) (LIST #))))) 
<cl> (pprint a)
(DEFUN REVERSE1 (X)
  (COND ((NULL X)
         NIL)
        (T
         (APPEND (REVERSE1 (CDR X)) (LIST (CAR X))))))
表示されるリストの構造が深い場合に画面に表示しきれないことが 起こるため,その表示の深さレベルを変更したい場合がある Common Lispでは大域変数 *print-level*(デフォルトはnil)に レベル数を代入することで表示レベルを制御できる.
<cl> *print-level*
NIL 
<cl> (setq *print-level* 4)
4 
<cl> (pprint a)
(DEFUN REVERSE1 (X)
  (COND ((NULL X)
         NIL)
        (T
         (APPEND # #))))
レベルプリントを行なう表示関数は以下のように実現できる.
;;;level printpprint -> pretty print routine
;;;
(defvar *lprint-depth* 2)
(defvar *lprint-length* 7)
;;;
(defun lprint (l depth)
  (cond ((atom l) (prin1 l))
        ((> depth *lprint-depth*)  (princ "..."))
        (t (princ "(")
         (let ((length 0)
               (depth (1+ depth)))
           (do ()
               ((not (and l (< length *lprint-length*))))
             (lprint (car l) depth)
             (and (setq l (cdr l)) (princ " "))
             (setq length (1+ length)))
           (and l (prin1 '?)))
         (princ ")")))) 
(defun level-prin1 (l) (lprint l 1) (terpri))


generated through LaTeX2HTML. M.Inaba 平成18年5月7日