我只介紹了表和數(shù),因為它們在Scheme中最為常用。然而,Scheme也有像字符(Character)、字符串(String)、符號(Symbol)、向量(Vector)等的其它數(shù)據(jù)類型,我將在11到14章節(jié)中介紹它們。
在某個字符前添加#\
來表明該物是一個字符。例如,#\a
表示字符a。字符#\Space
、#\Tab
、#\Linefeed
和#\Return
分別代表空格(Space)、制表符(Tab),Linefeed和返回(Return)。R5RS中定義了下面的與字符相關(guān)的函數(shù)。
(char? obj)
如果obj是一個字符則返回#t
。
(char=? c1 c3)
如果c1和c2是同一個字符的話則返回#t
。
(char->integer c)
將c轉(zhuǎn)化為對應(yīng)的整數(shù)(字符代碼,character code)。示例:(char->integer #\a) => 97
(integer->char n)
該函數(shù)將一個整數(shù)轉(zhuǎn)化為對應(yīng)的字符。
(char<? c1 c2)
(char<= c1 c2)
(char> c1 c2)
(char>= c1 c2)
這些函數(shù)用于比較字符。實際上,這些函數(shù)比較的是字符代碼的大小。例如,(char<? c1 c2)
等同于(< (char->integer c1) (char->integer c2))
(char-ci=? c1 c2)
(char-ci<? c1 c2)
(char-ci<=? c1 c2)
(char-ci>? c1 c2)
(char-ci>=? c1 c2)
這些比較函數(shù)對大小寫不敏感。
(char-alphabetic? c)
(char-numeric? c)
(char-whitespace? c)
(char-upper-case? c)
(char-lower-case? c)
這些函數(shù)分別用于檢測字符c是否為字母、數(shù)字、空白符、大寫字母或小寫字母。
(char-upcase c)
(char-downcase c)
這些函數(shù)分別返回字符C對應(yīng)的大寫或小寫。
字符串通過兩個閉合的雙引號表示。例如,”abc”表示字符串a(chǎn)bc。R5RS定義了下面的函數(shù)。
(string? s)
如果s
是一個字符則返回#t
。
(make-string n c)
返回由n
個字符c
組成的字符串。參數(shù)c
可選。
(string-length s)
返回字符串s
的長度。
(string=? s1 s2)
如果字符串s1
和s2
相同的話則返回#t
。
(string-ref s idx)
返回字符串s
中索引為idx
的字符(索引從0開始計數(shù))。
(string-set! s idx c)
將字符串s
中索引為idx
的字符設(shè)置為c
。
(substring s start end)
返回字符串s
從start
開始到end-1
處的子串。例如(substring "abcdefg" 1 4) => "b c d"
(string-append s1 s2 ...)
連接兩個字符串s1
和s2
(string->list s)
將字符串s
轉(zhuǎn)換為由字符構(gòu)成的表。
(list->string ls)
將一個由字符構(gòu)成的表轉(zhuǎn)換為字符串。
(string-copy s)
復(fù)制字符串s
。
練習(xí)1
編寫一個函數(shù)
title-style
,該函數(shù)用于將每個單詞的首字母大寫。(title-style "the cathedral and the bazaar") ;? "The Cathedral And The Bazaar"
本章講解了字符和字符串。下章我將講解符號。符號是Lisp/Scheme中的一種字符型數(shù)據(jù)類型。使用這種數(shù)據(jù)類型,可以對文本進行快速操作。
先將字符串轉(zhuǎn)化為表,將空格之后的字符大寫,最后將表轉(zhuǎn)換會字符串?!咀g注:原文似有誤。】
(define (identity x) x)
(define (title-style str)
(let loop ((ls (string->list str))
(w #t)
(acc '()))
(if (null? ls)
(list->string (reverse acc))
(let ((c (car ls)))
(loop (cdr ls)
(char-whitespace? c)
(cons ((if w char-upcase identity) c) acc))))))
;;; Another answer, You can assign caps to the string.
(define (title-style str)
(let ((n (string-length str)))
(let loop ((w #t) (i 0))
(if (= i n)
str
(let ((c (string-ref str i)))
(if w (string-set! str i (char-upcase c)))
(loop (char-whitespace? c) (1+ i)))))))
(title-style "the cathedral and the bazaar")
;? "The Cathedral And The Bazaar"
更多建議: