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

KMRCLを眺める (90) COUNT-STRING-WORDS

| 23:44 | KMRCLを眺める (90) COUNT-STRING-WORDS - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (90) COUNT-STRING-WORDS - わだばLisperになる

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

定義はは、

(defun count-string-words (str)
  (declare (simple-string str)
           (optimize (speed 3) (safety 0) (space 0)))
  (let ((n-words 0)
        (in-word nil))
    (declare (fixnum n-words))
    (do* ((len (length str))
          (i 0 (1+ i)))
        ((= i len) n-words)
      (declare (fixnum i))
      (if (alphanumericp (schar str i))
          (unless in-word
            (incf n-words)
            (setq in-word t))
        (setq in-word nil)))))

となっていて、ALPHANUMERICPがNILを返す文字を区切りにして文字列が何単語で構成されているかを調べるものです。

ALPHANUMERICPを利用するので、日本語の文字列では上手く動かないんだろうと試してみたところ

;; SBCL
(KL:COUNT-STRING-WORDS "なにはつに さくやこのはな ふゆこもり")
;⇒ 3 

(KL:COUNT-STRING-WORDS "なにはつに、さくやこのはな、ふゆこもり")
;⇒ 3 

;; Allegro CL
(KL:COUNT-STRING-WORDS "なにはつに さくやこのはな ふゆこもり")
;⇒ 3 

(KL:COUNT-STRING-WORDS "なにはつに、さくやこのはな、ふゆこもり")
;⇒ 1

意外にもSBCLが細かいところに対応していました。

;; SBCL
(ALPHANUMERICP #\、)
;⇒ NIL

なんですね。

なんにしろこの辺りは、HyperSpecによると処理系依存なので、あまり期待はしない方が良いのかもしれません。