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

KMRCLを眺める (65) PRINT-N-CHARS

| 23:44 | KMRCLを眺める (65) PRINT-N-CHARS - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (65) PRINT-N-CHARS - わだばLisperになる

今回はKMRCLのio.lisp中からPRINT-N-CHARSです。

名前のとおりN回文字を出力するというもので動作は、

(WITH-OUTPUT-TO-STRING (OUT)
  (PRINT-N-CHARS #\A 15 OUT))
;⇒ "AAAAAAAAAAAAAAA"

こんな感じです。

定義は、

(defun print-n-chars (char n stream)
  (declare (fixnum n) (optimize (speed 3) (safety 0) (space 0)))
  (dotimes (i n)
    (declare (fixnum i))
    (write-char char stream)))

という風になっています。

DOTIMESで利用する変数に型宣言が付いていますが、DOTIMESは処理系側でマクロの中に宣言を入れているものが多いようで、上記のマクロを展開するとSBCL等の場合

(DO ((I 0 (1+ I))
     (#:COUNT2837 N))
    ((>= I #:COUNT2837) NIL)
    (DECLARE (TYPE UNSIGNED-BYTE I)
             (TYPE INTEGER #:COUNT2837))
    (DECLARE (FIXNUM I))
    (WRITE-CHAR CHAR STREAM))

という風になります。

こういう場合ってどっちの宣言が優先されるんでしょうね。

さて、HyperSpecで調べてみよう…。

ゲスト



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