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 |

2010-01-08

KMRCLを眺める (61) READ-STREAM-TO-STRINGS

| 01:45 | KMRCLを眺める (61) READ-STREAM-TO-STRINGS - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (61) READ-STREAM-TO-STRINGS - わだばLisperになる

今回はKMRCLのio.lisp中からREAD-STREAM-TO-STRINGSです。

ストリームをREAD-LINEで読んでリストにして返す関数で、定義は

(defun read-stream-to-strings (in)
  (let ((lines '())
        (eof (gensym)))
    (do ((line (read-line in nil eof)
               (read-line in nil eof)))
        ((eq line eof))
      (push line lines))
    (nreverse lines)))

となっています。

使い方は、

(import '(shibuya.lisp:$))

(with-open-file (in "/etc/motd")
  (let ((n 0))
    (map nil ($ format t "~D ~A~%" (incf n) $)
         (READ-STREAM-TO-STRINGS in))))
;->
1 Linux setq 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64
2 
3 To access official Ubuntu documentation, please visit:
4 http://help.ubuntu.com/

という感じでしょうか。

自分だと、DOから抜ける前に、linesをNREVERSEしてしまいそうですが、抜けてからNREVERSEしているのは、読み易さへの配慮かもしれません。

ちなみに、doはletの機能も持ち合せているので、

(defun read-stream-to-strings (in)
  (do* ((eof (gensym))
        (lines '() (cons line lines))
        (line (read-line in nil eof)
              (read-line in nil eof)))
      ((eq line eof) (nreverse lines))))

という風にも書けますが、DOに馴れてないと読み辛いためか、LETとDOは分離する人が多いかもしれません。

しかし、DOを使いまくっている人のコードや、CLtL2のコード例では合体しているのが多いので、馴れればどうということもない気もします。