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

KMRCLを眺める INTEGER-STRING (119)

| 23:54 | KMRCLを眺める INTEGER-STRING (119) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める INTEGER-STRING (119) - わだばLisperになる

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

動作は、

(KL:INTEGER-STRING 1234 24)
⇒ "000000000000000000001234"

となっていて、ある数字を指定した長さで、先頭を0でパディングし文字列として返すというものです。

定義は、

(defun integer-string (num len)
  "Outputs a string of LEN digit with an optional initial character PCHAR.
Leading zeros are present."
  (declare (optimize (speed 3) (safety 0) (space 0))
           (type fixnum len)
           (type integer num))
  (do* ((zero-code (char-code #\0))
        (result (make-string len :initial-element #\0))
        (minus? (minusp num))
        (val (if minus? (- 0 num) num)
             (nth-value 0 (floor val 10)))
        (pos (1- len) (1- pos))
        (mod (mod val 10) (mod val 10)))
      ((or (zerop val) (minusp pos))
       (when minus? (setf (schar result 0) #\-))
       result)
    (declare (fixnum mod zero-code pos) (simple-string result) (integer val))
    (setf (schar result pos) (code-char (+ zero-code mod)))))

となっています。

要素が"0"の文字列を作成して、それを上書きして目的のものを作成しています。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100319