プログラミング言語AIII
2020年度講義資料 (2)
新潟大学工学部工学科知能情報システムプログラム
青戸等人
変数関数
目次
1 変数
2 関数
1 / 16
変数関数
目次
1 変数
2 関数
2 / 16
変数関数
実習課題(1):変数(1)
1 「val x = 2;」を入力してみよ.
2 「x;」を入力してみよ.
3 「x + x;」を入力してみよ.
4 「x * 3;」を入力してみよ.
5 「val y = 3;」を入力してみよ.
6 「x + y;」を入力してみよ.
7 (変数zを定義しないで) 「z;」を入力してみよ.
8 (変数zを定義しないで) 「x + z;」を入力してみよ.
9 「val num = 2 + 5;」を入力してみよ. numの値を調べよ.
10 「val z = x + y;」を入力してみよ. zの値を調べよ.
11 「val x = "aaa"; val y = "bbb";」を入力した後,x ^ y の値を調べてみよ.
3 / 16
変数関数
変数の束縛の基本形
変数の束縛の基本形
1 - val 変数名 = 式 ; (*ユーザの入力*)
2 val 変数名 = 式の値 : 式の型3 (*インタープリタからの返答*)
式中の変数の評価
式の中に表われる変数は,その値に評価される.
変数の値を定義することを,変数を束縛するという.
変数の値は,式を評価した値に束縛される.
変数の型は式の型と同じになる.
変数の値が束縛されていなければ,未定義エラーになる.
4 / 16
変数関数
実習課題(2):変数(2)
1 「val A = 10;」を入力してみよ.
2 「val aa = 10;」,「val a3 = 10;」,「val 3a = 10;」を入力してみよ.
3 「val a_3 = 10;」,「val a’ = 10;」を入力してみよ.
4 「val a_2’ = 10;」を入力してみよ.
5 SMLインタープリタを一旦終了し,再度起動してから,以前に定義した変数の値を調べてみよ.
6 「val x = 1;」,「x;」,「val x = 2;」,「x;」を順に入力してみよ.
7 「val x = 1; val X = 2;」を入力した後,「x;」を入力してみよ.「X;」を入力してみよ.
8 「val x = 1;」を入力した後,「val x = 1.2;」を入力してみよ.
5 / 16
変数関数
9 「val x = 1; val y = 2; val x = x + y;」を入力してみよ. xの値は何になるか?
10 「val x=1;val y=x+1; val x=y+1; val y=x+1;」を入力してみよ. xとyの値は何になるか?
確認事項
変数名には,先頭にアルファベットの大文字か小文字,その後は英数字と と’が使える.アルファベットの大文字と小文字は区別される.ただし,システムで予約されている名前は使えない(andalsoなど).
変数の束縛のスコープ(有効範囲)は,宣言の後ろから,インタープリタが終了するか同じ変数が宣言されるまで.
同じ変数が束縛されると元の束縛は隠れて見えなくなる.ただし,変数宣言の右辺(bodyとよぶ)の方では,元の値が使われる. (右辺を評価して,その後で束縛されるため.)
6 / 16
変数関数
実習課題(3):変数(3)
1 「val -- = 1;」を入力してみよ.
2 「x + 3;」を入力したのち,「it」の値を調べよ.
3 「x + 4;」を入力したのち,「it」の値を調べよ.
4 「it + 1;」を入力したのち,「it」の値を調べよ.
確認事項
記号だけからなる変数名も使える.ただし,システムで予約されている名前は使えない.
it は直前に評価した式の値を表わす特別な変数になっている.
7 / 16
変数関数
目次
1 変数
2 関数
8 / 16
変数関数
実習課題(4):関数
1 「size "aaa";」を入力してみよ.他の例も試して,sizeが文字列の長さを返す関数であることを確認せよ.関数適用は,数学ではf(x)と書くことが多いが,括弧を使わずにf xと書く.
2 「size;」を入力してみよ. size の型はどのようになるか.関数は値がないから,値の代わりに fn と書かれている.
3 「abs 6;」を入力してみよ.他の例も試して,abs が絶対値を返す関数であることを確認せよ. abs の型はどのようになるか.
9 / 16
変数関数
関数束縛の基本形
関数束縛の基本形
1 - fun 関数名 仮引数 = 式 ; (*ユーザの入力*)
2 val 関数名 = fn : 関数の型3 (*インタープリタからの返答*)
これによって,関数名に関数が束縛される.関数名に使える識別子は,変数名のときと同じ.
関数適用の評価
式f nは,関数fに引数nを適用して得られる値になる.
10 / 16
変数関数
実習課題(4):関数定義の基本(1)
1 「fun double x = x * 2;」を入力してみよ.
2 「double 3;」を入力してみよ.他の例も試して,doubleが整数を2倍する関数になっていることを確かめよ.double の型はどのようになるか.
3 「double 3 + 5;」を入力してみよ.括弧はどのようについているのか答えよ.
4 「double (double 3);」を入力してみよ.括弧は省略できるか,確かめよ.
確認事項
中置演算子より,関数適用の結合力は強い.
関数適用は左結合. ( 「f g x」は「(f g) x」の省略形になる;この意味は後の講義で説明(高階関数).)
11 / 16
変数関数
プログラムファイルの利用
プログラムファイルの利用
1 - use "ファイル名" ;
use 文は,指定されたファイルに書かれている式を実行する.変数定義や関数定義が書かれていれば,それを実行して変数名や関数名を束縛する.
式の評価に失敗したときは,そのエラーを解析してエラーメッセージを表示する.もちろん,エラーの解析は完全ではないので,エラーメッセージが的外れなこともある.
次ページの問題の解答は,ファイルkadai2.smlを作成して,それに書くこと.関数定義を1つ追加する毎に,インタープリタ上で, use kadai2.sml;を実行してテストせよ. (ファイルに実行テストも書いておくとよい.)
12 / 16
変数関数
sml-mode in emacs
emacs で,拡張子が sml のファイルを読み込むと(設定されていれば) SML プログラムを書くようのモードsml-mode になる.
emacs のバッファが sml プログラム用のモードになっていないときは, M-x sml-mode を実行するとなる.
(自分のPCなどで) sml-mode がインストールされていないときは, (emacs 上で) M-x package-install からsml-mode と打ち込んだり, (端末上で)sudo apt install sml-mode としたりして,インストールする.
TABキーで,自動的にインデントが揃う.
13 / 16
変数関数
実習課題(5):関数定義の基本(2)
1 与えられた n 時間の秒数を返す関数 hoursToSeconds を定義せよ.
- hoursToSeconds 3;
val it = 10800 : int
-2 与えられた文字列を,括弧で囲む関数 addPar を定義せよ.
- addPar "aaa";
val it = "(aaa)" : string
-3 与えられた文字列を,2回繰り返す文字列にする関数
repeat を定義せよ.
- repeat "abc";
val it = "abcabc" : string
-
14 / 16
変数関数
実習課題(5):関数定義の基本(2)
4 与えられた整数が正の数ならtrue,そうでないならfalseを返す関数 isPositive を定義せよ.
- isPositive 3;
val it = true : bool
5 「4 mod 2;」「5 mod 2;」を入力してみよう.
6 与えられた整数が偶数かどうかを返す関数 isEven を定義せよ.
7 与えられた整数の下一桁が9かどうかを返す関数isNineMod10 を定義せよ.負の数の場合に注意.
8 与えられた整数が10以上かつ20以下であるかどうか返す関数 isBetween10and20 を定義せよ.
15 / 16
変数関数
実習課題(5):関数定義の基本(2)
9 与えられた整数が偶数なら2倍し,奇数なら3倍する関数doubleOrTriple を定義せよ.問題6で作った isEvenを用いること.- doubleOrTriple 2;
val it = 4 : int
- doubleOrTriple 3;
val it = 9 : int10 "apple"なら"orange"を返し,"orange"なら"apple"を返し,それ以外ならそのまま引数文字列を返すexchangeAppleAndOrange を定義せよ.- exchangeAppleAndOrange "apple";
val it = "orange" : string
- exchangeAppleAndOrange "orange";
val it = "apple" : string
- exchangeAppleAndOrange "banana";
val it = "banana" : string
-
16 / 16