2012-05-06 45 views

回答

5

有一个叫alpha-char-p一个方便的标准功能,做你问什么。

CL-USER(1): (alpha-char-p #\a) 
T 
CL-USER(2): (alpha-char-p #\Γ) 
T 
CL-USER(3): (alpha-char-p #\α) 
T 
CL-USER(4): (alpha-char-p #\0) 
NIL 
CL-USER(5): (alpha-char-p #\.) 
NIL 

可以在conju使用nction与every

CL-USER(7): (every #'alpha-char-p "word") 
T 
CL-USER(8): (every #'alpha-char-p "nonword7") 
NIL 
CL-USER(9): (every #'alpha-char-p "non-alpha-word") 
NIL 
CL-USER(10): (every #'alpha-char-p "今日は") 
T 
+0

是的,每个和一个合适的测试功能(比如说,ALPHA-CHAR-P)是我的直接想法。 – Vatine

+0

感谢您的回应! – Benius

2

OK,我上面谈到变音符号,因为这种特殊情况下往往被忽视,下面是一个例子:

* (defparameter *weird-letter* 
     (coerce (list (code-char #x0438) 
        (code-char #x0306)) 'string)) 
*WEIRD-LETTER* 

* *weird-letter* 
"и" 

* (length *weird-letter*) 
2 

* (every #'alpha-char-p *weird-letter*) 
NIL 

实际上,我不知道什么不同的Lisp实现将尽这里是因为Unicode支持在其中一些中是不同的(到目前为止我可以说)。

对于上面的代码,预期的结果一定是T,因为实际上,两个代码点U + 0438-U + 0306构成一个带有变音符号的单个字母。 Unicode有两种拼写方式,一种是单个字符,另一种是不带变音符号和变音符号的相同字母的组合。所以,如果你想要超级正确,那么你将不得不检查这封信是否后面跟着变音符号,但是(注意!)只有其中一些实际上是有效的字母! Unicode是严重的企业...

编辑:

为了更好地说明我的情况:

#!/opt/ActivePerl-5.14/bin/perl 

binmode STDOUT, ":utf8"; 

my $weird_letter = "\x{0438}\x{0306}"; 
print "$weird_letter\n"; 

if ($weird_letter =~ m/^(\pL|(\pL\pM))+$/) 
    { print "it is a letter!\n"; } 
else { print "it is not a letter!\n"; } 

上面几乎可以公平地对待这种字符。

相关问题