8438


Common Lispで文字、つまりcharacterを表現するためには、`#\a`といったような表現ができると思います。

そこで、これらの文字がアルファベットかどうかを判定しようとするさい、どのような関数が利用できるでしょうか?
あるいは、どのようなコードを書くといいのでしょうか?

想定される使い道は下のようなものを考えています:

[code]

    ? (alphabet? #\f)
    T
    ? (alphabet? #\あ)
    NIL
    
[/code]


CC BY-SA 3.0
2015-03-26T07:51:39.173
8429
2015-03-26T10:16:59.207
2015-03-26T09:11:43.473
7926
939
question
common-lisp
ある文字(Character)がアルファベットかどうかを判定したい


Common Lispには、文字の種類を判定する関数がいくつかありますが、その中の、  
alpha-char-p、alphanumericpは、ラテン文字以外でも真を返すので質問のalphabet?の役割を果すことはできません。  
ということで、自作することになりますが、あれこれあって結局こうなります。

[code]

    (defun alphabet? (char)
      (and (standard-char-p char)
           (alpha-char-p char)))
    
[/code]

もしくは、面倒なので安直に

[code]

    (defun alphabet? (char)
      (and (find char "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") T))
    
[/code]

あれこれの内容ですが、Cなどでは、文字のコードがA-zの文字コードの範囲に収まっているかどうかを判定したりすることが多いようですが、それだと、

[code]

    (defun alphabet? (char)
      (typep (char-code char) '(integer #.(char-code #\A) #.(char-code #\z))))
    
[/code]

となるかと思います。しかし、Common Lispでは、ASCIIコードを前提としていないのでこの作戦は使えません(たしかCもそうだったような気はしますが)  
といっても大抵の処理系は、A-zの並びなのでEBCDICの処理系でもない限り問題にもならなそうです。  
ちなみにA-zの並びになってない処理系を知ってるか?というcomp.lang.lispの質問のレスで具体的な処理系の名前は出てこなかった憶えがあります。

A-zの文字は、Common Lispでは、alphabeticと呼びますが、  
<http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_a.htm#alphabetic>  
standard-char 96文字の中で、alphabeticなのは、A-zだけです。  
<http://www.lispworks.com/documentation/HyperSpec/Body/02_ac.htm>

ということで、

[code]

    (and (standard-char-p char)
         (alpha-char-p char))
    
[/code]

で判定することになります。


CC BY-SA 3.0
2015-03-26T10:10:20.197
8438
2015-03-26T10:16:59.207
2015-03-26T10:16:59.207
3510
3510
8429
answer