プログラミング言語 Standard ML 入門 (問題の解答例)
4 MLの基本データ型

4.5 文字型(eqtype char

問 4.3

ASCII文字表現では ord #"a" < ord #"b" < < ord #"z" かつ ord #"0" < ord #"1" < < ord #"9" かつ ord #"A" < ord #"B" < < ord #"Z" である. この事実のみを仮定して,字句解析処理などでよく使用する以下の各関数 を定義せよ.

  • isSpace : char -> bool
    文字がスペース文字(空白,改行文字,タブ,垂直タブ,フォームフィード)か 否か判定する関数.

  • isAlpha : char -> bool
    文字が英字か否かを判定する関数.

  • isNum : char -> bool
    文字が数字か否かを判定する関数.

  • isAlphaNumeric : char -> bool
    文字が英字または数字か否かを判定する関数.

  • isLower : char -> bool
    文字が英小文字か否かを判定する関数.

  • isUpper : char -> bool
    文字が英大文字か否かを判定する関数.

  • toLower : char -> char
    文字が英大文字なら英小文字に変換し,それ以外ならその文字をそのまま返す 関数.

  • toUpper : char -> char
    文字が英小文字なら英大文字に変換し,それ以外ならその文字をそのまま返す 関数.

解答例  コード例を以下の示す。

   fun isSpace c =
       case c of
            #" " => true
          | #"\t" => true
          | #"\n" => true
          | #"\v" => true
          | #"\f" => true
          | _ => false

   fun isAlpha c = c >= #"a" andalso c <= #"z" orelse
                   c >= #"A" andalso c <= #"Z"

   fun isNum c = c >= #"0" andalso c <= #"9"

   fun isAlphaNumeric c = isAlpha c orelse isNum c

   fun isLower c = #"a" <= c andalso c <= #"z"

   fun isUpper c = #"A" <= c andalso c <= #"Z"

   fun toLower c =
       if isUpper c
       then chr (ord #"a" + (ord c - ord #"A"))
       else c

   fun toUpper c =
       if isLower c
       then chr (ord #"A" + (ord c - ord #"a"))
       else c