17
プログラミング言語AIII 2020年度(2) システムプログラム

プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

プログラミング言語AIII

2020年度講義資料 (2)

新潟大学工学部工学科知能情報システムプログラム

青戸等人

Page 2: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

目次

1 変数

2 関数

1 / 16

Page 3: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

目次

1 変数

2 関数

2 / 16

Page 4: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(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

Page 5: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

変数の束縛の基本形

変数の束縛の基本形

1 - val 変数名 = 式 ; (*ユーザの入力*)

2 val 変数名 = 式の値 : 式の型3 (*インタープリタからの返答*)

式中の変数の評価

式の中に表われる変数は,その値に評価される.

変数の値を定義することを,変数を束縛するという.

変数の値は,式を評価した値に束縛される.

変数の型は式の型と同じになる.

変数の値が束縛されていなければ,未定義エラーになる.

4 / 16

Page 6: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(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

Page 7: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

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

Page 8: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(3):変数(3)

1 「val -- = 1;」を入力してみよ.

2 「x + 3;」を入力したのち,「it」の値を調べよ.

3 「x + 4;」を入力したのち,「it」の値を調べよ.

4 「it + 1;」を入力したのち,「it」の値を調べよ.

確認事項

記号だけからなる変数名も使える.ただし,システムで予約されている名前は使えない.

it は直前に評価した式の値を表わす特別な変数になっている.

7 / 16

Page 9: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

目次

1 変数

2 関数

8 / 16

Page 10: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(4):関数

1 「size "aaa";」を入力してみよ.他の例も試して,sizeが文字列の長さを返す関数であることを確認せよ.関数適用は,数学ではf(x)と書くことが多いが,括弧を使わずにf xと書く.

2 「size;」を入力してみよ. size の型はどのようになるか.関数は値がないから,値の代わりに fn と書かれている.

3 「abs 6;」を入力してみよ.他の例も試して,abs が絶対値を返す関数であることを確認せよ. abs の型はどのようになるか.

9 / 16

Page 11: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

関数束縛の基本形

関数束縛の基本形

1 - fun 関数名 仮引数 = 式 ; (*ユーザの入力*)

2 val 関数名 = fn : 関数の型3 (*インタープリタからの返答*)

これによって,関数名に関数が束縛される.関数名に使える識別子は,変数名のときと同じ.

関数適用の評価

式f nは,関数fに引数nを適用して得られる値になる.

10 / 16

Page 12: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(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

Page 13: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

プログラムファイルの利用

プログラムファイルの利用

1 - use "ファイル名" ;

use 文は,指定されたファイルに書かれている式を実行する.変数定義や関数定義が書かれていれば,それを実行して変数名や関数名を束縛する.

式の評価に失敗したときは,そのエラーを解析してエラーメッセージを表示する.もちろん,エラーの解析は完全ではないので,エラーメッセージが的外れなこともある.

次ページの問題の解答は,ファイルkadai2.smlを作成して,それに書くこと.関数定義を1つ追加する毎に,インタープリタ上で, use kadai2.sml;を実行してテストせよ. (ファイルに実行テストも書いておくとよい.)

12 / 16

Page 14: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

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

Page 15: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(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

Page 16: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(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

Page 17: プログラミング AIII - 新潟大学プログラミング言語AIII 2019年度講義資料 (2) 新潟大学工学部工学科知能情報システムプログラム 青戸等人

変数関数

実習課題(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