2

これを行う方法はありますか:

(defvar long-list ((1 1 1 1) (2 2 2 2) (3 3 3 3)
        (4 4 4 4) (5 5 5 5) (6 6 6 6))
(format t "magic" long-list)

次のようなものを出力するには:

(1 1 1 1) (2 2 2 2) (3 3 3 3)
(4 4 4 4) (5 5 5 5) (6 6 6 6)

印刷する列の数をどこで定義しますか?

私はオプションについて知ってい(format t "~/my-function/" long-list)ますが、おそらく何かが組み込まれていますか?

リファレンスは、この特定のトピックでは非常に役に立ちません。

4

1 に答える 1

3

OK、申し訳ありませんが、実際に見つけました: http://www.lispworks.com/documentation/lw51/CLHS/Body/f_ppr_fi.htm#pprint-tabularですが、見つける前に次のように書きました:

(defun pplist-as-string (stream fmt colon at)
  (declare (ignore colon at))
  (dolist (i fmt)
    (princ i stream)))

(defun ppcolumns (stream fmt colon at cols)
  (declare (ignore at colon))
  (when (or (not cols) (< cols 1)) (setq cols 1))
  (let* ((fmt-length (length fmt))
         (column-height (floor fmt-length cols))
         (remainder (mod fmt-length cols))
         (printed 0)
         columns
         column-sizes)
    (do ((c fmt (cdr c))
         (j 0 (1+ j))
         (r (if (zerop remainder) 0 1) (if (zerop remainder) 0 1))
         (i 0 (1+ i)))
        ((null c))
      (when (or (= j (+ r column-height)) (zerop i))
        (setq columns (cons c columns)
              column-sizes
              (cons
               (+ r column-height) column-sizes))
        (unless (zerop remainder)
          (unless (zerop i) (decf remainder)))
        (setq j 0)))
    (setq columns (reverse columns)
          column-sizes (reverse column-sizes))
    (when (/= fmt-length (* column-height cols))
      (incf column-height))
    (dotimes (i column-height)
      (do ((c columns (cdr c))
           (size column-sizes (cdr size)))
          ((or (null c)))
        (when (> printed (1- fmt-length))
          (return-from ppcolumns))
        (when (< 0 (car size))
          (pplist-as-string stream (caar c) nil nil)
          (when (caar c) (incf printed))
          (unless (null c) (princ #\ ))
          (rplaca c (cdar c))))
      (princ #\newline))))

別の方向に印刷します。必要な場合に備えて。

于 2012-06-27T13:50:50.660 に答える