TypeDeclaration

TypeDeclaration["Product",name,field1type1,field2type2,|>]

指定の分野における製品型の宣言を表す.

TypeDeclaration["Abstract",name]

抽象的な型 name の宣言を表す.

TypeDeclaration["Alias",name,targetType]

targetType の内部表現を使った型 name の宣言を表す.

TypeDeclaration["Macro",name,targetType]

name のすべてのインスタンスを targetType で置換するように指定する宣言を表す.

詳細とオプション

  • TypeDeclarationは宣言の記号表現で,そのままでは評価されない.
  • TypeDeclarationは,CompilerEnvironmentAppendToの中で,およびFunctionCompile等の関数の第1引数として使うことができる.
  • 次の種類の宣言がサポートされている.
  • "Product"いくつかのフィールドを含む型.Cの構造体に似ている
    "Abstract"具体的な型がそのインスタンスであり得る抽象型.型のクラス
    "Alias"別の型と同じ内部実装を使う型
    "Macro"すべての型に適用される置換規則
  • C互換プログラムとインターフェースで接続する場合,次の型宣言は同等である:
  • TypeDeclaration["Product",
    "myStruct",
    <|"f1"->"CInt","f2"->"CDouble"|>,
    "ReferenceSemantics"->False]
    struct myStruct {int f1; double f2;};
    TypeDeclaration["Macro","myInteger","CInt"]typedef int myInteger;
  • 製品型インスタンス prod のフィールドには prod["field"]でアクセスし,設定できる.
  • 次は,サポートされるオプションである.
  • "AbstractTypes"{}宣言された型を含む抽象型
    "Creator"None宣言された型のインターフェースの作成のために呼び出す関数
    "MemoryManaged"Automatic参照されていないインスタンスを自動的に解放するかどうか
    "Operations"{}宣言された型が使用可能な操作
    "ReferenceSemantics"Automaticポインタがある型を内部的に表すかどうか
  • デフォルトで,"Product"の宣言は"MemoryManaged"Trueおよび"ReferenceSemantics"Trueを含む.
  • "ReferenceSemantics""Product"宣言についてはTrueにしか設定できない.
  • "MemoryManaged"はReference Semanticsを使う"Product"宣言についてはTrueにしか設定できない.
  • "Creator"は,"Product"宣言についてしか設定できない.
  • "Operations"は,"Product"および"Abstract"の宣言についてしか設定できない.
  • "AbstractTypes""Macro"宣言については設定できない.
  • Cの構造との互換性については, 一般に,製品型を"MemoryManaged"に,"ReferenceSemantics"Falseに設定しなければならない.
  • 製品型のインスタンスであるオブジェクト prod については以下のメソッドが定義されている.
  • prod["field"]"field"の値を得る
    prod["field"]=val"field"の値を設定する
    DeleteObject[prod]free prod を解放する(prod がメモリ管理されていない場合のみ)

例題

すべて開くすべて閉じる

  (2)

"MachineInteger"のマクロ型としての"fooInteger"の宣言を表す:

宣言を使って関数をコンパイルする:

"fooInteger"を"MachineInteger"のマクロとして大域的に宣言する:

"fooInteger"を使って関数をコンパイルする:

コンパイラ環境をリセットして宣言を消去する:

スコープ  (5)

"Product"  (1)

製品型の宣言:

製品型をインスタンス化してフィールドを抽出する関数をコンパイルする:

"Abstract"  (1)

抽象型の宣言:

抽象型のインスタンスである製品型の宣言:

抽象型のインスタンスではない製品型の宣言:

抽象型の任意のインスタンスを取る関数の宣言:

抽象型のインスタンスである型に関数を使ってプログラムをコンパイルする:

この関数は抽象型のインスタンスではない型からは入力を取らない:

"Alias"  (1)

"String"型のエイリアス:

もとの型の実装とは異なるエイリアスについての関数:

ビットキャスティングを介してエイリアスをインスタンス化するプログラムをコンパイルし,それについて関数を評価する:

"Macro"  (2)

"String"型のマクロ:

マクロを使って"String"を参照する関数:

マクロは型ではなく型が解決される際にこれに適用される置換規則である.したがって,マクロと関数が参照する型について同じ関数に異なる定義をすることはできない:

マクロとは異なりエイリアスは型であるので,関数は型に適用されるのかあるいはその型のエイリアスに適用されるのかが認識できる.

オプション  (11)

"AbstractTypes"  (2)

抽象型を表す:

抽象型に属するオブジェクトを表す:

抽象型の任意のインスタンスを取る関数を表す:

抽象型に属する製品型を取ることを示して関数をコンパイルする:

抽象型を表す:

最初の抽象型に属する別の抽象型を表す:

2番目の抽象型のインスタンスである製品型を表す:

抽象型"superType"の任意のインスタンスを取る関数を表す:

"subType"を介して"superType"への所属を継承する製品型を取ることを示して関数をコンパイルする:

"Creator"  (1)

それ自身の作成関数で型を表す:

作成関数の実装を表す:

CreateTypeInstanceを使って関数をコンパイルし,"Creator"関数を呼び出す:

予想される通り,結果は10である:

"MemoryManaged"  (3)

自動メモリ管理がない型を表す:

この型を使う関数をコンパイルする:

オブジェクトが自動的に解放されないので,結果の関数にはメモリリークがある:

デフォルトで,製品型のメモリは自動的に管理される:

メモリ管理型を使う関数にはメモリリークはない:

自動メモリ管理がない型を表す:

この型を使いDeleteObjectでこれを解放する関数をコンパイルする:

結果の関数は手動で解放されるのでメモリリークがない:

メモリ管理の製品型には参照数が含まれ,外部プログラムと互換ではない.製品型をライブラリ関数に渡したりライブラリ関数から製品型を受け取ったりする際は,メモリ管理は無効にすべきである.

構造体fooを定義するライブラリをコンパイルする:

TypeDeclarationで互換型を表す:

互換型"foo"はデフォルトで参照型であり,Cのfoo*と同等である.

この型を使ってライブラリを呼び出す関数をコンパイルする:

"Operations"  (3)

一つの操作による製品型の宣言:

操作の宣言:

型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:

例を作成する:

"Increment"操作を呼び出す.古い値の0が返される:

"Increment"操作を再度呼び出す.古い値は1になった:

操作は抽象型についても定義できる.この場合は,抽象型を実装する任意の型が使用できる.

抽象型を表す:

抽象型を実装するオブジェクトを表す:

操作の宣言:

型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:

例を作成する:

"Increment"操作を呼び出す.古い値の0が返される:

"Increment"操作を再度呼び出す.古い値は1になった:

抽象型について定義された操作は実際の実装を参照できる.

抽象型を表す:

操作の宣言.これは,ForAllTypeを使って多態的に記述されている:

抽象型に属するオブジェクトを表す:

型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:

例を作成する:

"Increment"操作を呼び出す.古い値の1が返される:

"Increment"操作を再度呼び出す.古い値は1になった:

操作の実装は抽象型で設定される.

これとは異なる方法で操作を実装することができる.これは,実際の型を使って狭義的に宣言されているので,抽象型から与えられたものをオーバーライドする:

型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:

例を作成する:

これで,"Increment"操作が変わった:

"ReferenceSemantics"  (2)

参照によってではなく値によって渡される型を表す:

値型を使って関数をコンパイルする:

構造体fooを定義するライブラリをコンパイルする:

TypeDeclarationで互換型を表す:

この型を使って関数をコンパイルする:

アプリケーション  (1)

Cの標準ライブラリには2つの整数の商と余りを計算するldivと呼ばれる関数が含まれている.この関数は以下のように宣言されるオブジェクトを返す:

typedef struct {
    long quot; /* quotient */
    long rem; /* remainder */
} ldiv_t;

ldiv_t型の宣言を表す:

ldiv関数の宣言を表す:

C標準ライブラリから関数を呼び出すプログラムをコンパイルする:

考えられる問題  (1)

マクロは型ではなく型が解決される際に適用される置換規則である.したがって,同じ関数のマクロとマクロが参照する型について異なる定義をすることはできない:

エイリアスはマクロと異なり型であるので,関数は自身が型に適用されるのか型のエイリアスに適用されるのかが認識できる.

Wolfram Research (2022), TypeDeclaration, Wolfram言語関数, https://reference.wolfram.com/language/ref/TypeDeclaration.html.

テキスト

Wolfram Research (2022), TypeDeclaration, Wolfram言語関数, https://reference.wolfram.com/language/ref/TypeDeclaration.html.

CMS

Wolfram Language. 2022. "TypeDeclaration." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/TypeDeclaration.html.

APA

Wolfram Language. (2022). TypeDeclaration. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/TypeDeclaration.html

BibTeX

@misc{reference.wolfram_2024_typedeclaration, author="Wolfram Research", title="{TypeDeclaration}", year="2022", howpublished="\url{https://reference.wolfram.com/language/ref/TypeDeclaration.html}", note=[Accessed: 24-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_typedeclaration, organization={Wolfram Research}, title={TypeDeclaration}, year={2022}, url={https://reference.wolfram.com/language/ref/TypeDeclaration.html}, note=[Accessed: 24-November-2024 ]}