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-04-06

KMRCLを眺める(133) RANDOM-CHAR

| 14:55 | KMRCLを眺める(133) RANDOM-CHAR - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(133) RANDOM-CHAR - わだばLisperになる

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

(LOOP :FOR TYPE :IN '(:LOWER-ALPHA 
                      :LOWER-ALPHANUMERIC
                      :UPPER-LOWER-ALPHA
                      :UNAMBIGUOUS
                      :UPPER-LOWER-ALPHA)
      :COLLECT (LIST TYPE
                     (COERCE (LOOP :REPEAT 10 
                                   :COLLECT (KL::RANDOM-CHAR TYPE))
                             'STRING)))
⇒ 
((:LOWER-ALPHA        "gnuwknujwl")
 (:LOWER-ALPHANUMERIC "zpbgazxla7")
 (:UPPER-LOWER-ALPHA  "OrqKoBLBxQ") 
 (:UNAMBIGUOUS        "1EqnJ2baP4")
 (:UPPER-LOWER-ALPHA  "tyfguMsAgo"))

というように大文字/小文字/数字の色々な組み合わせでランダムな文字を出力するもののようです。

定義は、

(defconstant* +char-code-lower-a+ (char-code #\a))
(defconstant* +char-code-upper-a+ (char-code #\A))
(defconstant* +char-code-0+ (char-code #\0))

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defvar +unambiguous-charset+
    "abcdefghjkmnpqrstuvwxyz123456789ABCDEFGHJKLMNPQSRTUVWXYZ")
  (defconstant* +unambiguous-length+ (length +unambiguous-charset+)))

(defun random-char (&optional (set :lower-alpha))
  (ecase set
    (:lower-alpha
     (code-char (+ +char-code-lower-a+ (random 26))))
    (:lower-alphanumeric
     (let ((n (random 36)))
       (if (>= n 26)
           (code-char (+ +char-code-0+ (- n 26)))
         (code-char (+ +char-code-lower-a+ n)))))
    (:upper-alpha
     (code-char (+ +char-code-upper-a+ (random 26))))
    (:unambiguous
     (schar +unambiguous-charset+ (random +unambiguous-length+)))
    (:upper-lower-alpha
     (let ((n (random 52)))
       (if (>= n 26)
           (code-char (+ +char-code-upper-a+ (- n 26)))
         (code-char (+ +char-code-lower-a+ n)))))))

今回も、DEFVARと、DEFCONSTANT*の使い分けが良く分かりません。

どういう必然があってこうなっているのか…。

ゲスト



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