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-06

KMRCLを眺める (60) READ-FILE-TO-USB8-ARRAY

| 21:24 | KMRCLを眺める (60) READ-FILE-TO-USB8-ARRAY - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (60) READ-FILE-TO-USB8-ARRAY - わだばLisperになる

今回はKMRCLのio.lisp中からREAD-FILE-TO-USB8-ARRAYです。

usb8ってなんだという感じですが、(unsigned-byte 8)の略のようです。なるほど。

定義は

(defun read-file-to-usb8-array (file)
  "Opens a reads a file. Returns the contents as single unsigned-byte array"
  (with-open-file (in file :direction :input :element-type '(unsigned-byte 8))
    (let* ((file-len (file-length in))
           (usb8 (make-array file-len :element-type '(unsigned-byte 8)))
           (pos (read-sequence usb8 in)))
      (unless (= file-len pos)
        (error "Length read (~D) doesn't match file length (~D)~%" pos file-len))
      usb8))

となっていて、

  1. (unsigned-byte 8)でファイルを開く
  2. file-lengthでサイズを測定
  3. サイズ長のベクタをmake-arrayで作成して
  4. read-sequenceでそのベクタに読み込んで格納

というのが大まかな流れです。

試しに

いろはにほへと
ちりぬるを
わかよたれそ
つねならむ
うゐのおくやま
けふこえて
あさきゆめみし
ゑひもせす

という内容のファイルをUTF-8で/tmp/foo.txtに作成して読み込んでみると

(DEFVAR *IROHA*
  (READ-FILE-TO-USB8-ARRAY "/tmp/foo.txt"))

*IROHA*
;=>#(227 129 132 227 130 141 227 129 175 227 129 171 227 129 187 227 129 184 227
     129 168 10  227 129 161 227 130 138 227 129 172 227 130 139 227 130 146 10 227
     130 143 227 129 139 227 130 136 227 129 159 227 130 140 227 129 157 10  227
     129 164 227 129 173 227 129 170 227 130 137 227 130 128 10  227 129 134 227
     130 144 227 129 174 227 129 138 227 129 143 227 130 132 227 129 190 10  227
     129 145 227 129 181 227 129 147 227 129 136 227 129 166 10  227 129 130 227
     129 149 227 129 141 227 130 134 227 130 129 227 129 191 227 129 151 10  227
     130 145 227 129 178 227 130 130 227 129 155 227 129 153 10)

(JP:GUESS *IROHA*)
;⇒ :UTF-8

(JP:DECODE *IROHA* :GUESS)
;⇒ 
"いろはにほへと
ちりぬるを
わかよたれそ
つねならむ
うゐのおくやま
けふこえて
あさきゆめみし
ゑひもせす
"

という風になります。

※jp:decodeについては、逆引きCommon Lisp/外部からの入力バイト列を文字列にしたい(文字コード変換含む)参照