代码之家  ›  专栏  ›  技术社区  ›  rwallace

打印并报告输出的字符数

  •  0
  • rwallace  · 技术社区  · 6 年前

    write 要输出一些值(可能是一个原子、列表、点对),有没有办法找出写了多少个字符?在调用之前或之后,还是使用类似的函数?

    2 回复  |  直到 6 年前
        1
  •  4
  •   sds Niraj Rajbhandari    6 年前

    如果你写信给 file-stream , 你可以用 file-position 前后 write

    当流没有位置的概念时(例如 broadcast-stream )一个人不得不求助 到 write-to-string write-string :

    (defun write-and-count (object &rest args &key stream &allow-other-keys)
      "Write object to stream and return the number of characters written."
      (let ((start (ignore-errors (file-position stream))))
        (if start
            (progn              ; file stream
              (apply #'write object args)
              (- (file-position stream) start))
            (progn              ; something more complex
              (remf args :stream)
              (length (write-string (apply #'write-to-string object args) stream))))))
    
    (with-open-file (s "foo" :direction :output)
      (write-and-count '(1 2 3) :stream s))
    ==> 7
    (write-and-count '(1 2 3) :stream *standard-input*)
    (1 2 3)    ; output
    ==> 7      ; return value
    (write-and-count '(1 2 3))
    (1 2 3)    ; output
    ==> 7      ; return value
    

    笔记 :

    1. 这个 这种方法只是对大型对象的一种优化。
    2. remf illegal keyword/value pair 中的错误 写入字符串
    3. 溪流可能是棘手的,它是 (write x :stream s) 相当于 (write-string (write-to-string x) s) Gray streams :如果您写信给 广播流 向普通人广播 和一个 pretty-printing Gray stream ,你会的 不同的 两个流的字符数。您希望返回的字符数是多少?第一次计数?第二个?他们的总数?
        2
  •  2
  •   Rainer Joswig Michael Fox    6 年前

    更复杂的方法是 灰色溪流 ,这是一种基于CLOS的I/O流变体,曾由davidn.Gray提出。许多实现都以某种方式支持它。例如,可以编写新的流类并编写 :after

    灰色流提供可扩展的基于CLOS的I/O流。

    看到了吗 trivial gray streams 多个实现的兼容层。