I
概要
プログラミング言語SML#解説
大堀 淳 上野 雄大
東北大学 電気通信研究所
令和元年12月
Contents
I
概要
1
はじめに
2
本書の構成と執筆状況
3
SML#の概要
3.1
SML#とは?
3.2
SML#の歴史
3.3
SML#開発チームと連絡先情報
3.4
謝辞
3.4.1
プロジェクトファンディング
3.4.2
SML#が使用しているソフトウエア
3.4.3
研究開発協力者
3.5
SML#第3.5.0版の機能と制限
4
SML#ライセンス
II
チュートリアル
5
SML#のインストール
5.1
動作環境
5.2
Debian GNU/Linux
5.3
Ubuntu
5.4
Fedora
5.5
CentOS
5.6
macOS
5.7
Windows 10
5.8
ソースからビルドする場合
6
SML#プログラミング環境の準備
6.1
Unix系OS,Emacsエディタ,その他ツールの整備
6.2
SML#コンパイラの構造とブートストラップ
6.3
SML#の対話型モードを使ってみよう
6.4
SML#のコンパイルモードを試してみよう
6.5
smlsharp
コマンドの起動モード
7
MLプログラミング入門
7.1
ML言語について
7.2
宣言的プログラミング
7.3
式の組み合わせによる計算の表現
7.4
定数式と組込み関数
7.4.1
int型
7.4.2
real型
7.4.3
char型
7.4.4
string 型
7.4.5
word 型
7.5
bool
型と条件式
7.6
複雑な式と関数
7.7
再帰的な関数
7.8
複数の引数を取る関数
7.9
関数適用の文法
7.10
高階の関数
7.11
高階の関数の利用
7.12
MLにおける手続き的機能
7.13
変更可能なメモリーセルを表す参照型
7.14
作用順,左から右への評価戦略
7.15
手続き的制御
7.16
ループと末尾再帰関数
7.17
let式
7.18
リストデータ型
7.19
式の組み合わせの原則
7.20
多相型を持つ関数
8
SML#の拡張機能:レコード多相性
8.1
レコード構文
8.2
フィールド取り出し演算
8.3
レコードパターン
8.4
フィールドの変更
8.5
レコードプログラミング例
8.6
オブジェクトの表現
8.7
多相バリアントの表現
9
SML#の拡張機能:その他の型の拡張
9.1
ランク1多相性
9.2
ランク1多相性による値多相性制約の緩和
9.3
第一級オーバーローディング
10
SML#の拡張機能:Cとの直接連携
10.1
C関数の使用の宣言
10.2
C関数の型
10.3
基本的なC関数のインポート例
10.4
動的リンクライブラリの使用
11
SML#の拡張機能:マルチスレッドプログラミング
11.1
Pthreadsプログラミング
11.2
MassiveThreadsを用いた細粒度スレッドプログラミング
12
SML#の拡張機能:SQLの統合
12.1
関係データベースとSQL
12.2
SML#へのSQL式の導入
12.3
問い合わせの実行
12.4
データベース問い合わせ実行例
12.5
その他のSQL文
13
SML#の拡張機能:動的型付け機構とJSONの型付き操作
13.1
動的型付け
13.2
項と型のリーフィケーション
13.3
プリティプリンタ
13.4
JSONと部分動的レコード
13.5
JSONの操作
13.6
JSONプログラミング例
14
SML#の拡張機能:SML#分割コンパイルシステム
14.1
分割コンパイルの概要
14.2
分割コンパイル例
14.3
インターフェイスファイルの構造
14.4
型の隠蔽
14.5
シグネチャの扱い
14.6
ファンクタのサポート
14.7
レプリケーション宣言
14.8
トップレベルの実行
III
参照マニュアル
15
序論
15.1
使用する表記法
16
SML#の構造
16.1
対話型モードのプログラム
16.1.1
核言語の宣言の評価
16.1.2
モジュール言語の宣言の評価
16.2
分割コンパイルモードのプログラム
16.3
プログラムの主な構成要素
17
字句構造
17.1
文字集合
17.2
字句集合
18
型
19
式
19.1
演算子式の展開
19.2
定数式
⟨
scon
⟩
19.3
long識別子式
⟨
longVid
⟩
19.4
レコード式
{
⟨
lab
1
⟩
=
⟨
exp
1
⟩
,
…
,
⟨
lab
n
⟩
=
⟨
exp
n
⟩
}
19.5
組式
(
⟨
exp
1
⟩
,
⋯
,
⟨
exp
n
⟩
)
とunit式
()
19.6
フィールドセレクタ式
#
⟨
lab
⟩
19.7
リスト式
[
⟨
exp
1
⟩
,
⋯
,
⟨
exp
n
⟩
]
19.8
逐次実行式
(
⟨
exp
1
⟩
;
⋯
;
⟨
exp
n
⟩
)
19.9
局所宣言式
let
⟨
declList
⟩
in
⟨
exp
1
⟩
;
⋯
;
⟨
exp
n
⟩
end
19.10
関数適応式
⟨
appexp
⟩
⟨
atexp
⟩
19.11
フィールドアップデート式
⟨
appexp
⟩
# {
⟨
exprow
⟩
}
19.12
型制約式
⟨
exp
⟩
:
⟨
ty
⟩
19.13
論理演算式
⟨
exp
1
⟩
andalso
⟨
exp
2
⟩
および
⟨
exp
1
⟩
orelse
⟨
exp
2
⟩
19.14
例外処理式
⟨
exp
⟩
handle
⟨
match
⟩
19.15
例外発生式
raise
⟨
exp
⟩
19.16
条件式
if
⟨
exp
1
⟩
then
⟨
exp
2
⟩
else
⟨
exp
3
⟩
19.17
while式
while
⟨
exp
1
⟩
do
⟨
exp
2
⟩
19.18
場合分け式
case
⟨
exp
⟩
of
⟨
match
⟩
19.19
関数式
fn
⟨
match
⟩
19.20
組み込み型とその演算
19.21
静的インポート式:
_import
⟨
string
⟩
:
⟨
cfunty
⟩
19.22
動的インポート式:
⟨
exp
⟩
: _import
⟨
cfunty
⟩
19.23
サイズ式
_sizeof(
⟨
ty
⟩
)
19.24
動的型キャスト式
_dynamic
⟨
exp
⟩
as
⟨
ty
⟩
19.25
動的型キャスト付き場合分け式
_dynamiccase
⟨
exp
⟩
of
⟨
match
⟩
20
パターンとパターンマッチング
21
識別子のスコープ規則
22
SQL式とコマンド
22.1
SQLの型
22.1.1
SQLの基本型
22.1.2
SQLの論理演算式の型
22.1.3
SQLのテーブルおよびスキーマの型
22.1.4
SQLクエリおよびその断片の型
22.1.5
SQL関連のハンドルの型
22.1.6
SQL式の型付け方針
22.2
SQLクエリのためのML式の拡張構文
22.3
接続先データベース宣言式:_sqlserver
22.4
SQL評価式
22.4.1
SQL定数式
22.4.2
SQL識別子式
22.4.3
SQL関数適用式およびSQL演算子式
22.4.4
SQL論理演算式
22.4.5
SQLカラム参照式
22.4.6
SQLサブクエリ
22.5
SELECTクエリ
22.5.1
SELECT句
22.5.2
FROM句
22.5.3
WHERE句
22.5.4
GROUP BY句
22.5.5
ORDER BY句
22.5.6
OFFSET句またはLIMIT句
22.5.7
相関サブクエリ
22.6
SQLコマンド
22.6.1
INSERTコマンド
22.6.2
UPDATEコマンド
22.6.3
DELETEコマンド
22.6.4
BEGIN,COMMIT,ROLLBACKコマンド
22.7
SQL実行関数式
22.8
SQLライブラリ:SQLストラクチャ
22.8.1
データベースサーバーへの接続
22.8.2
SQLクエリの実行と結果の取得
22.8.3
SQLクエリの操作
22.9
SQLライブラリ:SQL.Opストラクチャ
22.9.1
SML#の値のSQLクエリへの埋め込み
22.9.2
型を合わせるための何もしない関数
22.9.3
SQL演算子および関数
22.9.4
SQL集約関数
22.10
SQLライブラリ:SQL.Numericストラクチャ
22.11
標準SQL文法との差異(参考)
23
核言語の宣言とインターフェイス
23.1
val宣言 :
⟨
valDecl
⟩
23.1.1
val宣言インタフェイス :
⟨
valSpec
⟩
23.1.2
val宣言の評価
23.1.3
val宣言とインタフェイスの例
23.2
関数宣言 :
⟨
valRecDecl
⟩
,
⟨
funDecl
⟩
23.2.1
関数宣言インターフェイス
23.3
datatype宣言 :
⟨
datatypeDecl
⟩
23.3.1
datatype宣言インタフェース
23.3.2
datatype宣言とインタフェイスの例
23.4
type宣言 :
⟨
typDecl
⟩
23.4.1
type仕様 :
⟨
typSpec
⟩
23.4.2
型宣言とインタフェイスの例
23.5
例外宣言 :
⟨
exnDecl
⟩
23.5.1
例外仕様 :
⟨
exnSpec
⟩
23.5.2
例外宣言とインタフェイスの例
24
モジュール言語の宣言とインタフェイス
24.1
ストラクチャ宣言 :
⟨
strDecl
⟩
24.2
ストラクチャ式とその評価 :
⟨
strexp
⟩
24.3
シグネチャ式 :
⟨
sigexp
⟩
24.4
モジュール言語のインタフェイス
25
SML#のライブラリ概要
26
Standard ML標準ライブラリ
26.1
ARRAY
26.2
ARRAY_SLICE
26.3
BIN_IO
26.4
IMPERATIVE_IO
26.5
STREAM_IO
26.6
BOOL
26.7
BYTE
26.8
CHAR
26.9
COMMAND_LINE
26.10
DATE
26.11
GENERAL
26.12
IEEE_REAL
26.13
IO
26.14
INTEGER
26.15
INT_INF
26.16
LIST
26.17
LIST_PAIR
26.18
MONO_ARRAY
26.19
MONO_ARRAY_SLICE
26.20
MONO_VECTOR
26.21
MONO_VECTOR_SLICE
26.22
OPTION
26.23
OS
26.24
OS_FILE_SYS
26.25
OS_IO
26.26
OS_PATH
26.27
OS_PROCESS
26.28
REAL
26.29
MATH
26.30
STRING
26.31
STRING_CVT
26.32
SUBSTRING
26.33
TEXT
26.34
TEXT_IO
26.35
TEXT_STREAM_IO
26.36
PRIM_IO
26.37
TIME
26.38
TIMER
26.39
VECTOR
26.40
VECTOR_SLICE
26.41
WORD
26.42
トップレベル環境
27
SML#システムライブラリ
27.1
DynamicLink
27.2
Pointer
27.3
SQL
27.4
SQL.Op
27.5
SQL.Numeric
27.6
Pthread
27.7
Myth
27.8
Dynamic
28
SML#コンパイラの起動
28.1
モード選択オプション
28.2
モード共通のオプション
28.3
コンパイルオプション
28.4
リンクオプション
28.5
対話モードのオプション
28.6
コンパイラ開発者向けオプション
28.7
環境変数
28.8
典型的な使用例
28.8.1
対話環境
28.8.2
プログラムのコンパイル
28.8.3
分割コンパイルとリンク
28.8.4
Makefileの生成
29
SML#実行時データ管理
29.1
実行時表現
29.2
ガーベジコレクションの影響
29.3
スタックを巻き戻すジャンプの影響
29.4
マルチスレッドの影響
IV
プログラミングツール
30
構文解析器生成ツール smlyaccとsmllex
30.1
生成されるソースファイル
30.2
smlyacc入力ファイルの構造
30.3
smlyacc出力ファイルの構造とインタフェイスファル記述
30.4
smllex入力ファイルの構造
30.5
smllex出力ファイルのインタフェイスファル記述
V
SML#の内部構造
31
序文
32
SML#ソースパッケージ
32.1
ソースパッケージの構成
32.2
SML# ソースツリー
32.3
compiler
ディレクトリ
32.4
basis
ディレクトリ
33
コンパイラの制御構造
33.1
コンパイラスタートアップ
33.2
コンパイラコマンドのメイン処理
33.3
コンパイラのトップレベル
VI
参考文献,その他
Mozilla FireFoxなどのMathMLを表示可能なブラウザでご覧ください.