レコードの構文と意味論
構文
レコード ::= '{' 文並び '}' 文並び ::= 空 | 文並び ';' 文 文 ::= 空文 | 宣言文 | 定義文 宣言文 ::= 種 名前 プロファイル 定義文 ::= 種 名前 ':=' 項
種付きレコードは、
種付きレコード ::= 種 レコード
種〈区分 | division〉を列挙:
- type
- function
- value (マクロ)
- signature
- transformer
- structure (マクロ)
type, function valueをレイヤー0、signature, transformer, structureをレイヤー1とする。valueとstructureはマクロなので、本質的なのは type, function, signature, transformerの4つだけ。
- type結合子: *, -^
- function結合子: ;, ・, ()
- signature結合子: #, #<, ren[ ]{}
- transformer結合子: [ ], >>, << <,
指標と変換子を文脈なしで書くときは種接頭辞〈タグ | マーカー〉が必要だが、文脈があるときは省略してよい。
種付きのレコードの正確な構文は、
- signature レコード
- transformer : 指標レコード項1 -> 指標レコード項2 レコード
- 指標レコード項1には空か'?'が許される。
- 指標レコード項2には'?'が許される。空は許さない。
- 指標レコード項1が空のとき、structure : 指標レコード項2 レコード
文の略記: まず、同時宣言文
- 種 名前カンマ区切り並び プロファイル
複文は、複数の文を1個の文とみなす。ただし、同種の文しかまとめられない。
文頭にprivateを付けると、名前が隠蔽される。
どんなレコードに対しても、そのソース指標とターゲット指標を計算できる。指標レコードの場合、ソース指標もターゲット指標もその指標自身になる。
[追記]
語感の問題で、structureよりinstanceのほうがいいようだ。
ここでのラベル | オブジェクト指向 | 関数型 |
---|---|---|
signature | interface | class, signature |
instance | class | instance, structure |
transformer | アダプター | functor |
無名のsignature, transformer, instance の書き方
signature { ...指標レコード } transformer : Σ -> Δ { ...変換子レコード } transformer : Σ -> ? { ...混合レコード } transformer : ? -> ? { ...混合レコード } instance : Σ { ...インスタンスレコード } instance : ? { ...インスタンスレコード }
以上の基本の書き方、レコードの部分に指標項、変換子項、インスタンス項を書いてよい。項の定義は:
- 条件に適合したレコードは項である。
- 既に宣言された名前は項である。
- 項のラムダ抽象は項である。
- 項を結合子で組み合わせたものは項である。結合子には適用演算子もある。
- 項のラムダ抽象は項である。
- 以上のものだけが項である。
signature/transformer(instanceはtransformer)ともに、プロファイルを持つ。そのプロファイルは、ソースとターゲットに関するものと、パラメータ化に関するもとがあるので、
- パラメータ指標 => ソース指標 -> ターゲット指標
- (ソース指標 -> ターゲット指標) <= パラメータ指標
の形を持つ。パラメータ指標の具体化には<か>を使い、ソース指標の具体化には>>か<<を使う。このなかで、< は省略可能で併置で代用できる。
檜山常用 | 今回 | |
---|---|---|
図式順結合 | ; | >> |
反図式順結合 | << | |
図式順適用 | . | > |
反図式順適用 | ・, ◁ | < |
[/追記]