プログラミング aiiiaoto/lecture/19programminga...11 funadd x ys =ifmember x ysthenyselsex::ys...
TRANSCRIPT
-
プログラミング言語AIII
2019年度講義資料 (10)
新潟大学 工学部工学科 知能情報システムプログラム
青戸等人
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
目次
1 ストラクチャとシグネチャ
2 ストラクチャとシグネチャの利用
3 Compilation Managerの利用
1 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
目次
1 ストラクチャとシグネチャ
2 ストラクチャとシグネチャの利用
3 Compilation Managerの利用
2 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
ストラクチャとシグネチャ
これまで組み込みの関数 Int.XXX や List.YYY などを見てきた.これらの関数は関連するデータ構造や関数毎に,ストラクチャとよばれるものにまとめられている.
例えば,List.YYY は Listストラクチャの関数YYYを呼び出す.
ストラクチャ毎に名前空間は異なり, List.map とListPair.map は異なる関数.
ユーザも,各種のストラクチャを自分で用意し,関数を整理しないと大規模なプログラムの開発は困難.
ストラクチャに,どのような関数やデータ構造を外部に公開するかを書く,シグネチャをつけることが出来る.
3 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
実習課題 (1)
以下のような ListUtil ストラクチャを list_util.smlファイルに用意せよ.
1 signature LIST_UTIL =
2 sig
3 val member: ’’a -> ’’a list -> bool
4 val add: ’’a -> ’’a list -> ’’a list
5 end
6 structure ListUtil : LIST_UTIL =
7 struct
8 fun member x [] = false
9 | member x (y::ys) = x = y orelse member x ys
10
11 fun add x ys = if member x ys then ys else x::ys
12 end
4 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
ストラクチャ
ストラクチャとシグネチャ
シグネチャの定義
1 signature シグネチャ名 =2 sig
3 val 変数名 : 公開する型4 val 関数名 : 公開する型5 end
ストラクチャの定義
1 structure ストラチャ名 : シグネチャ名 =2 struct
3 変数定義
4 関数定義5 end
5 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
実習課題 (2)
1 list_util.smlファイルをインタプリタで読み込み,関数ListUtil.member が使えることを確認せよ.
2 list_util.smlファイルにそれぞれに要素に重複のないリストを2つ受けとったときに,和集合となっているようなリストを返す関数 union の定義を struct ... end の中に追加せよ.
3 sig ... end の中に union を追加しないとき,list_util.smlファイルをインタプリタで読み込んでも関数 ListUtil.union が使えないことを確認せよ.
4 sig ... end の中に union を追加して,関数ListUtil.union が使えるようになることを確認せよ.
5 ListUtil ストラクチャに,それぞれに要素に重複のないリストを2つ受けとったときに,その積集合を返す関数intersection を追加せよ.
6 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
目次
1 ストラクチャとシグネチャ
2 ストラクチャとシグネチャの利用
3 Compilation Managerの利用
7 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
ストラクチャの利用 (1)
ストラクチャ定義のbodyは, struct ... endだけでなく,すでに定義されているストラクチャを参照することができる.
- structure L = List;
- L.map;
open 命令を使って,ストラクチャを開くことができる.open されたストラクチャの関数はトップレベルで定義される.
- open List;
- map;
Listストラクチャ内の関数名等が,すでに定義されていた関数名を隠すこともあるので注意が必要.
8 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
local を用いた局所定義
局所定義を使う方法として, let 文を用いてきた. let 文は式の中で局所定義を使う方法だったが,関数の外で用いるためのlocal 文がある.
fun g x = let fun f x = .. in ... f ... end
local
fun f x = ..
in
fun g x = ... f ..
fun h x = ... f...
end
9 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
ストラクチャの利用 (2)
local 文と合わせて使うと,以下のように長いストラクチャ名を短く参照することができる.open 命令は(基本使わない方がよいが),使うなら local 文の中で用いるのがよい.
local
structure L = List
structure LU = ListUtil
structure S = String
(* open ListUtil *)
in
... = .... L.map ....
....
end
10 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
ストラクチャとシグネチャ(まとめ)
ストラクチャとシグネチャ
1 ストラクチャ := ストラクチャ名2 | struct .... end
3 | ストラクチャ : シグネチャ4 シグネチャ := シグネチャ名5 | sig ... end
ストラクチャとシグネチャの宣言
1 structure ストラクチャ名 { : シグネチャ }2 = ストラクチャ3 signature シグネチャ名 = シグネチャ
ストラクチャとシグネチャと組み合わせて,自由に新しいストラクチャを定義することができる.
11 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
シグネチャの利用
シグネチャには,公開する値や関数の型の他にも,その宣言に必要な type および datatype の定義,例外の宣言なども書く.type elem = ...
datatype ’a stack = ...
exception Empty
このとき,structure にも同じ定義が含まれる必要がある.その他に,次のようなものも書ける.
type 宣言(定義なし).「type elem」など.この場合,structure に含まれる elem 型の定義は,type elem = intでもtype elem = charでもよい.さらに,datatype elem = ...でもよい.
eqtype 宣言(定義なし).「eqtype elem」など.この場合も, structure の elem 型の定義は何でもよいが, ’=’判定が使える型でないとならない.
12 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
実習課題 (3)
1 スタックのインタフェースを記述した STACK シグニチャを用意せよ.
2 STACK をシグニチャにもち,スタックをリストで実現したストラクチャ LStack を用意せよ.
3 STACK をシグニチャにもち,スタックをデータ型で実現したストラクチャ DStack を用意せよ.
必要に応じて,STACK シグニチャを修正すること.
13 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
目次
1 ストラクチャとシグネチャ
2 ストラクチャとシグネチャの利用
3 Compilation Managerの利用
14 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
Compilation Managerの利用
「use ファイル名;」を用いて,プログラムを読み込む方法は,すべてのプログラムをロードし直すため,プログラムが大きくなってくると,時間がかかり不便である.
SMLでは,CM (Compilation Manager)というツールが用意されており, make と同様に,変更した箇所とそこから影響を受ける部分だけをロードし直すことができる.
CMを使うには,以下のようなファイル CMファイル("sources.cm" とおいておく)を用意する.
Group is
$/basis.cm
./list_util.sml
....
3行目以降には,用いるファイルを記述する.
15 / 16
-
ストラクチャとシグネチャストラクチャとシグネチャの利用
Compilation Managerの利用
Compilation Managerの利用
CMファイルが用意できたら,あとは,SMLインタプリタ上で, CM.make "CMファイル名"; と入力すると必要に応じてコンパイルされる.
- CM.make "sources.cm";
[autoloading]
...
val it = true : bool
-
プログラムを修正したときには,再度,CM.make "sources.cm"; を入力すれば,必要な部分だけプログラムをロードし直してくれる.
16 / 16
0¹0È0é0¯0Á0ã0h0·0°0Í0Á0ã0¹0È0é0¯0Á0ã0h0·0°0Í0Á0ã0nR)u(Compilation Manager0nR)u(