プログラミング言語 Standard ML 入門 (問題の解答例)
1 MLプログラミングの基本

1.2 式の入力と評価

問 1.1

第18章付録の情報などを参考に SML#コンパイラをインストールし,対話型システムを起動し,以上のよ うな対話が可能であることを確かめよ.

解答例  SML#を,そのホームページ https://smlsharp.github.io/ja/ の情報を参考にインストールしてみよう。 例えば,お使いのシステムがVittualBoxやWSL2などにセットアップされたLinux ディストリビューションであれば, ダウンロードページ の情報から簡単にインストールできる. インストールが成功すれば,以下のように起動できるはずである.

   $ smlsharp
   SML# 4.0.0 (2021-04-06 05:12:50 JST) for x86_64-pc-linux-gnu with LLVM 10.0.0
   # fun f x = x;
   val f = fn : [’a. ’a -> ’a]
問 1.2

以下の各行をこの順に入力した場合の各行の結果を予測せよ.

  1. 1.

    44;

  2. 2.

    it mod 3;

  3. 3.

    44 - it;

  4. 4.

    (it mod 3) = 0;

  5. 5.

    if it then "Boring" else "Strange";

解答例  以下の通りである。

   # 44;
   val it = 44 : int
   # it mod 3;
   val it = 2 : int
   # 44 - it;
   val it = 42 : int
   # (it mod 3) = 0;
   val it = true : bool
   # if it then "Boring" else "Strange";
   val it = "Boring" : string
問 1.3

英大文字のASCIIコードはAからZの順に並んでおり,英小文字のASCIIコー ドはaからzの順に並んでいる. この事実のみを仮定して,文字定数 #"S" を小文字に直すプログラム を書け.

解答例 

   # chr (ord \#"a" + (ord \#"S" - ord \#"A"));
   val it = #"s" : char
問 1.4

英字の大文字と小文字のASCIIコードは連続していない. これらの間にある文字の数を求める式を書き評価せよ. さらにこの結果を利用して,英字の大文字と小文字の間にあるすべての文 字を小さい順に並べた文字列を求めるプログラムを書け.

解答例  英字の大文字と小文字の間にある文字の数を求める式とその評価結果:

   # if #"A" > #"a" then ord #"A" - (ord #"z" + 1) else ord #"a" - (ord #"Z" + 1);
   val it = 6 : int

英字の大文字と小文字の間にあるすべての文字を小さい順に並べた文字列を求め る式とその評価結果

   # if (ord #"a") > (ord #"A")
     then
          str (chr ((ord #"Z") + 1))
        ^ str (chr ((ord #"Z") + 2))
        ^ str (chr ((ord #"Z") + 3))
        ^ str (chr ((ord #"Z") + 4))
        ^ str (chr ((ord #"Z") + 5))
        ^ str (chr ((ord #"Z") + 6))
        ^ str (chr ((ord #"Z") + 7))
     else
          str (chr ((ord #"z") + 1))
        ^ str (chr ((ord #"z") + 2))
        ^ str (chr ((ord #"z") + 3))
        ^ str (chr ((ord #"z") + 4))
        ^ str (chr ((ord #"z") + 5))
        ^ str (chr ((ord #"z") + 6))
        ^ str (chr ((ord #"z") + 7))
      ;

   val it = "[\\]^_‘" : string