Scheme

文字列が空行か調べる

文字列が空行か調べる 空行の意味によりいくつかの方法が存在します.ここでは3種類の空行において調べる方法を示します. 空白文字が入っていても空行として扱う場合 string-trim-bothとstring-null?を組み合わせます.string-trim-bothではchar/char-set/p…

空白にマッチさせる

空白にマッチさせる 空白にマッチさせるには空白文字を表す#/\s/を使えばよいでしょう. (#/\s/ "a a") =>#<<regmatch> 0x4a4300> 全角空白文字もマッチさせたい場合 #/\s/だと全角空白文字は入らないため併せて指定する必要があります. ; 文字列の最後尾に全角空白が</regmatch>…

文字列を比較する

文字列を比較する eaual?もしくはstring=?により,文字列の比較を行うことができます.eq?やeqv?は文字列比較の場合, 別の意味になる(同一オブジェクトでかつメモリ位置が同じ場合に#t)ので,ここでは使えません. (equal? obj1 obj2) (string=? string1 st…

文字の出現頻度を調べる

文字の出現頻度を調べる それっぽい手続きはなさそうなので,自力で数えることにする. (use gauche.collection) (define (match-count re str) (define (grp-to-assoc grp) (if (null? grp) '() (cons (cons (caar grp) (length (car grp))) (grp-to-assoc …

特定の文字・文字列の出現回数を調べる

文字の数を調べる 対象が文字の場合,SRFI-13にあるstring-countを使います.マルチバイト文字も使えます. (string-count s char/char-set/pred &optional start end) 使用例. (use srfi-13) (string-count "a\nb\nccc\nd\n" #\newline) =>4 (string-count…

前回マッチした部分の続きからマッチさせる

前回マッチした部分の続きからマッチさせる 正規表現オブジェクトmatchに対して(match 'after)とすると,マッチした部分の続きが文字列として得られます. したがって, (#/regexp-spec/ (match 'after)) とすると,続きからマッチさせることができます. 何…

単語にマッチさせる

単語を含むかどうか調べる 通常であればそのまま書けば終わりです.が,"\b"を使って境界を明示することで,より正確にマッチさせることができます. (#/\bspec\b/ "Scheme spec") =>#<<regmatch> 0x5330a0> (#/\bspec\b/ "Scheme specification") =>#f 正規表現\wにマ</regmatch>…

正規表現が文字列の先頭・末尾にマッチするか調べる

正規表現が文字列の先頭・末尾にマッチするか調べる 正直,正規表現ネタなので言語はあんまり関係ないのですが... 先頭にマッチするか調べる "^"で先頭を表します."\A"はまだサポートされていないようです. マッチした際,明示的に#tを得たい場合にはboole…

文字列を検索する

文字列を検索する いわゆる正規表現によるマッチングです. #/regexp-spec/ とすることで,正規表現を表現することができます.他の言語上で正規表現を使ったことがあれば,違和感ないでしょう. パターンが含まれるかどうか 空白文字もしくはタブを検索する…

文字列の長さを得る

文字列の長さを得る 文字列の長さには2種類あります.文字数と内部エンコーディングの大きさです. この2つは一致することもあれば異なる場合もあるので,用途によって使い分けを. ; 文字数 (string-length string) ; 内部エンコーディングの大きさ (string…

文字列を反復する

文字を反復する 文字列を反復するには,文字の場合と文字列の場合でやり方が異なる. 文字の場合はmake-stringで反復できる. (make-string k &optional char) 使用例. charを指定しないと空白文字が繰り返される. (make-string 5 #\c) =>"ccccc" (make-st…

文字列を複製する

文字列を複製する そのまんま,string-copyで複製できます. (string-copy string &optional start end) 使用例. (string-copy "複製元の文字列") =>"複製元の文字列" (let* ((str "複製元の文字列") (copy-str (string-copy str))) `(,(eq? str str) ,(eq?…

文字コードを推測する

文字コードを推測する gauche.charconv gauche.charconvモジュールを使うと,ces-guess-from-stringで推測できる. (ces-guess-from-string string scheme) 使用例. 書式のschemeを"*JP"とすると,JIS,EUC,ShiftJIS,UTF-8のいずれかであるとして推測して…

文字コードを変換する

文字コードを変換する gauche.charconv gauche.charconvモジュールを使うと,ces-convertで変換できる. (ces-convert string from-code &optional to-code) 使用例. #*"〜"で結果が返されているけど,これはバイト文字列(不完全な文字列)を表している. (u…

適切な文字列リテラルをえらぶ

Scheme再会 とあるレシピブックをそのままScheme(というかGauche)で書いたらどうなるか試してみる.まずは文字列から. 文字列リテラル "〜" 普通の文字列.説明不要. "通常の文字列リテラル." => "通常の文字列リテラル." 改行をそのまま含めることがで…

テンパズルを解いてみました

はじめに これまでRubyでちょこちょこプログラムを書いてきましたが,今年はLispを学ぼうということで,Schemeの本を読んでいます. そんな訳で,基礎的な練習としてテンパズルをやってみることにしました. テンパズルとは wikipedia:テンパズルにずばり書…