【翻译】Lisp.字符串和字符

7 views
Skip to first unread message

panfei

unread,
Oct 15, 2012, 10:59:18 AM10/15/12
to lisp-...@googlegroups.com

字符串是字符的向量。我们把常量字符串看成是一系列被双引号环绕的字符,一个单独的字符c被表示为#\c。


通常(但不是必须的),每个字符都会有一个相关的整数,这个整数就是ASCII码。在多数的实现中,函数char-code返回与一个字符相关的数字,code-char返回对应数字的字符。


函数char<(小于),char<= (小于等于),char=(等于equal), char>=(大于等于),char>(大于)和char/=(不同)用来比较字符。它们像数字比较符号一样工作。

[plain] view plaincopy
  1. [15]> (sort "elbow" #'char<)  
  2. "below"  

因为字符串是向量,序列函数和叔祖函数也可以作用于字符串。你可以使用aref来获取元素,比如:

[plain] view plaincopy
  1. [16]> (aref "abc" 1)  
  2. #\b  

但是你可以对字符串使用更加快速的char函数:

[plain] view plaincopy
  1. [17]> (char "abc" 1)  
  2. #\b  

你可以组合使用setf和char(或者aref)来替换元素:

[plain] view plaincopy
  1. [19]> (let ((str (copy-seq "Merlin"))) (setf (char str 3) #\k) str)  
  2. "Merkin"  

如果你想要比较两个字符串,你可以使用通用的equal,但是也有一个叫做string-equal的函数,这个函数会忽略大小写:

[plain] view plaincopy
  1. [20]> (equal "fred" "fred")  
  2. T  
  3. [21]> (equal "fred" "Fred")  
  4. NIL  
  5. [22]> (string-equal "fred" "Fred")  
  6. T  

Common Lisp提供了大量的比较和操作字符串的函数。有几种方式来创建字符串。最通用的方式是使用format函数。调用format时,把nil作为第一个参数,将会使它作为一个字符串返回,也就是即将要打印出的哪个字符串:

[plain] view plaincopy
  1. [23]> (format nil "~A or ~A" "truth" "dare")  
  2. "truth or dare"  

 但是如果你仅仅时想将多个字符串结合在一起,你可以使用concatenate函数,它接受一个符号,这个符号用来指定结果的类型,加上一个或者多个序列:

[plain] view plaincopy
  1. [26]> (concatenate 'string "not " "to worry")  
  2. "not to worry"  

--
不学习,不知道

Reply all
Reply to author
Forward
0 new messages