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-03-11

KMRCLを眺める USB8-ARRAY-TO-STRING (111)

| 13:42 | KMRCLを眺める USB8-ARRAY-TO-STRING (111) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める USB8-ARRAY-TO-STRING (111) - わだばLisperになる

今回はKMRCLのstrings.lispから、USB8-ARRAY-TO-STRINGです。

名前の通り、(UNSIGNED-BYTE 8)のARRAYを文字列に変換する関数のようです。

動作は、

(KL:USB8-ARRAY-TO-STRING 
 (MAKE-ARRAY 100
             :INITIAL-ELEMENT (CHAR-CODE #\A)
             :ELEMENT-TYPE '(UNSIGNED-BYTE 8))
 :START 2 :END 12)
⇒ "AAAAAAAAAA"

というところ

定義は、

(defun usb8-array-to-string (vec &key (start 0) end)
  (declare (type (simple-array (unsigned-byte 8) (*)) vec)
           (fixnum start))
  (unless end
    (setq end (length vec)))
  (let* ((len (- end start))
         (str (make-string len)))
    (declare (fixnum len)
             (simple-string str)
             (optimize (speed 3) (safety 0)))
    (do ((i 0 (1+ i)))
        ((= i len) str)
      (declare (fixnum i))
      (setf (schar str i) (code-char (aref vec (the fixnum (+ i start))))))))

となっていて、空の文字列を作成して内容を移しかえています。

(TYPEP (CHAR-CODE #\あ) '(UNSIGNED-BYTE 8))
⇒ NIL

なので、文字が大体ASCIIの範囲の場合に使うのかな、というところです。