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

KMRCLを眺める (92) POSITION-NOT-CHAR

| 22:58 | KMRCLを眺める (92) POSITION-NOT-CHAR - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (92) POSITION-NOT-CHAR - わだばLisperになる

今回はKMRCLのstrings.lispから、POSITION-NOT-CHARです。

名前の通り前回のPOSITION-CHARの逆の動作をする関数です

(defun position-not-char (char string start max)
  (declare (optimize (speed 3) (safety 0) (space 0))
           (fixnum start max) (simple-string string))
  (do* ((i start (1+ i)))
       ((= i max) nil)
    (declare (fixnum i))
    (when (char/= char (schar string i)) (return i))))

定義も、前回からの変更は、CHAR=がCHAR/=だけのもの

動作は、

(KL:POSITION-NOT-CHAR #\X "XXXXXXXXX" 0 100)
;⇒ 1

(KL:POSITION-NOT-CHAR #\0 "0123401234" 2 100)
;⇒ 2

;; SBCL
(KL:POSITION-NOT-CHAR #\X "XXXXXXXXX" 0 10)0
;⇒ 9 ;???

(LET ((STR "XXXXXXXXX"))
  (KL:POSITION-NOT-CHAR #\X STR 0 (LENGTH STR)))
;⇒ NIL

という感じでSBCLでエラーの代りに妙な値が出てくるのも一緒です。

ゲスト



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