プログラミング aiiiaoto/lecture/19programminga...11 funadd x ys =ifmember x ysthenyselsex::ys...

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

Upload: others

Post on 27-Jan-2021

1 views

Category:

Documents


0 download

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(