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

KMRCLを眺める (66) PRINT-N-STRINGS

| 00:58 | KMRCLを眺める (66) PRINT-N-STRINGS - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (66) PRINT-N-STRINGS - わだばLisperになる

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

前回のPRINT-N-CHARSに続いて今度は文字列版

動作は、こんな感じです。

(WITH-OUTPUT-TO-STRING (OUT)
  (PRINT-N-STRINGS "ラドレ" 10 OUT))
;⇒ "ラドレラドレラドレラドレラドレラドレラドレラドレラドレラドレ"

定義は、

(defun print-n-strings (str n stream)
  (declare (fixnum n) (optimize (speed 3) (safety 0) (space 0)))
  (dotimes (i n)
    (declare (fixnum i))
    (write-string str stream)))

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

前回謎だった重複したdeclareの宣言ですが、HyperSpecを眺めてもどこに書いているかみつけられませんでした…。

とりあえず、手元のSBCLで試すと、

(LET ((X (1+ MOST-POSITIVE-FIXNUM)))
  (DECLARE (NUMBER X))
  (DECLARE (FIXNUM X))
  X)
>>> エラー

という風にエラーになるので、どうも同一の変数への宣言を並べて書くとANDな関係になるみたいです。

(LET ((X (1+ MOST-POSITIVE-FIXNUM)))
  (DECLARE (TYPE (AND NUMBER FIXNUM) X))
  X)
>>> エラー

という風に書いたのと同じなのかもしれません。

HyperSpecでの記述をご存知の方は是非教えて下さい!

ゲスト



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