TypeDeclaration["Product",name,<|field1type1,field2type2,…|>]
指定の分野における製品型の宣言を表す.
TypeDeclaration["Abstract",name]
抽象的な型 name の宣言を表す.
TypeDeclaration["Alias",name,targetType]
targetType の内部表現を使った型 name の宣言を表す.
TypeDeclaration["Macro",name,targetType]
name のすべてのインスタンスを targetType で置換するように指定する宣言を表す.
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互換プログラムとインターフェースで接続する場合,次の型宣言は同等である:
- 製品型インスタンス 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"の宣言を表す:
dec = TypeDeclaration["Macro", "fooInteger", "MachineInteger"];cf = FunctionCompile[dec, Function[Typed[arg, "fooInteger"], arg + 2]]cf[5]"fooInteger"を"MachineInteger"のマクロとして大域的に宣言する:
CompilerEnvironmentAppendTo[{
TypeDeclaration["Macro", "fooInteger", "MachineInteger"]
}];cf = FunctionCompile[Function[Typed[arg, "fooInteger"], arg + 2]]cf[5]$CompilerEnvironment = CreateCompilerEnvironment[];スコープ (6)
"Product" (2)
dec = TypeDeclaration["Product", "simpleProd", <|"field1" -> "MachineInteger", "field2" -> "Boolean"|>];製品型をインスタンス化してフィールドを抽出する関数をコンパイルする:
cf = FunctionCompile[dec, Function[{},
With[{prod = CreateTypeInstance["simpleProd", <|"field1" -> 12, "field2" -> True|>]},
prod["field1"]]
]]cf[]dec = TypeDeclaration["Product", "polyProd"::[T], <|"field1" -> T, "field2" -> "Boolean"|>];機械整数を取り,これを使って上記の製品型を作る関数をコンパイルする:
cf = FunctionCompile[dec,
Function[{Typed[n, "MachineInteger"]},
Module[{prod = CreateTypeInstance["polyProd", <|"field1" -> n, "field2" -> True|>]},
prod["field1"] + 1
]
]
]cf[42]"Abstract" (1)
dec1 = TypeDeclaration["Abstract", "simpleAbstract"];dec2 = TypeDeclaration["Product", "abstractInstance1", <|"field1" -> "MachineInteger", "field2" -> "Boolean"|>, "AbstractTypes" -> {"simpleAbstract"}];dec3 = TypeDeclaration["Product", "abstractInstance2", <|"field1" -> "MachineInteger", "field2" -> "Real64"|>];dec4 = FunctionDeclaration[fieldExtractor,
Typed[ForAllType[t, t∈"simpleAbstract", {t} -> "MachineInteger"]]@
Function[arg, arg["field1"]]
];抽象型のインスタンスである型に関数を使ってプログラムをコンパイルする:
cf = FunctionCompile[{dec1, dec2, dec3, dec4}, Function[{},
fieldExtractor[CreateTypeInstance["abstractInstance1", <|"field1" -> 12, "field2" -> True|>]]
]]cf[]この関数は抽象型のインスタンスではない型からは入力を取らない:
FunctionCompile[Function[{},
fieldExtractor[CreateTypeInstance["abstractInstance2", <|"field1" -> 12, "field2" -> 3.4|>]]
]]"Alias" (1)
dec = TypeDeclaration["Alias", "aliasString", "String"];funcDec = FunctionDeclaration[StringLength,
Typed[{"aliasString"} -> "MachineInteger"]@
Function[arg, 12]
];ビットキャスティングを介してエイリアスをインスタンス化するプログラムをコンパイルし,それについて関数を評価する:
cf = FunctionCompile[{dec, funcDec}, Function[Typed[str, "String"],
StringLength[Cast[str, "aliasString", "BitCast"]]]]cf["hello"]"Macro" (2)
dec = TypeDeclaration["Macro", "macroString", "String"];cf = FunctionCompile[{dec}, Function[Typed[expr, "macroString"], StringLength[expr]]]cf["hello"]マクロは型ではなく型が解決される際にこれに適用される置換規則である.したがって,マクロと関数が参照する型について同じ関数に異なる定義をすることはできない:
dec = TypeDeclaration["Macro", "macroString", "String"];funcDec = FunctionDeclaration[StringLength, Typed[{"macroString"} -> "MachineInteger"]@
Function[arg, 12]
];FunctionCompile[{dec, funcDec},
Function[Typed[arg, "macroString"], StringLength[arg]]]
マクロとは異なりエイリアスは型であるので,関数は型に適用されるのかあるいはその型のエイリアスに適用されるのかが認識できる.
オプション (11)
"AbstractTypes" (2)
absDec = TypeDeclaration["Abstract", "simpleAbstract"];prodDec = TypeDeclaration["Product", "abstractInstance", <|"field1" -> "MachineInteger", "field2" -> "Boolean"|>, "AbstractTypes" -> {"simpleAbstract"}];funcDec = FunctionDeclaration[abstractEater,
Typed[ForAllType[t, t∈"simpleAbstract", {t} -> "MachineInteger"]]@
Function[arg, 42]];抽象型に属する製品型を取ることを示して関数をコンパイルする:
cf = FunctionCompile[{absDec, prodDec, funcDec},
Function[{}, With[{
obj = CreateTypeInstance["abstractInstance", <|"field1" -> 12, "field2" -> False|>]},
abstractEater[obj]]
]]cf[]superDec = TypeDeclaration["Abstract", "superType"];subDec = TypeDeclaration["Abstract", "subType", "AbstractTypes" -> {"superType"}];prodDec = TypeDeclaration["Product", "abstractInstance", <|"field1" -> "MachineInteger", "field2" -> "Boolean"|>, "AbstractTypes" -> {"subType"}];抽象型"superType"の任意のインスタンスを取る関数を表す:
funcDec = FunctionDeclaration[abstractEater,
Typed[ForAllType[t, t∈"superType", {t} -> "MachineInteger"]]@
Function[arg, 42]];"subType"を介して"superType"への所属を継承する製品型を取ることを示して関数をコンパイルする:
cf = FunctionCompile[{superDec, subDec, prodDec, funcDec},
Function[{}, With[{
obj = CreateTypeInstance["abstractInstance", <|"field1" -> 12, "field2" -> False|>]},
abstractEater[obj]]
]]cf[]"Creator" (1)
typeDec = TypeDeclaration["Product", "TestType", <|"value" -> "MachineInteger"|>, "Creator" -> CreateTestType];createDec = FunctionDeclaration[CreateTestType,
Typed[{} -> "TestType"]@
Function[{}, CreateTypeInstance["TestType", <|"value" -> 10|>]]];CreateTypeInstanceを使って関数をコンパイルし,"Creator"関数を呼び出す:
cf = FunctionCompile[{typeDec, createDec}, Function[{},
With[{obj = CreateTypeInstance["TestType"]},
obj["value"]
]
]]cf[]"MemoryManaged" (3)
unmanaged = TypeDeclaration["Product", "unmanagedType", <|"field" -> "MachineInteger"|>, "MemoryManaged" -> False];cf = FunctionCompile[unmanaged, Function[{},
With[{obj = CreateTypeInstance["unmanagedType", <|"field" -> 12|>]},
obj["field"]
]
]]オブジェクトが自動的に解放されないので,結果の関数にはメモリリークがある:
With[{before = MemoryInUse[]},
Do[cf[], 1000];
MemoryInUse[] - before]managed = TypeDeclaration["Product", "managedType", <|"field" -> "MachineInteger"|>];cf2 = FunctionCompile[managed, Function[{},
With[{obj = CreateTypeInstance["managedType", <|"field" -> 12|>]},
obj["field"]
]
]]With[{before = MemoryInUse[]},
Do[cf2[], 1000];
MemoryInUse[] - before]unmanaged = TypeDeclaration["Product", "unmanagedType", <|"field" -> "MachineInteger"|>, "MemoryManaged" -> False];この型を使いDeleteObjectでこれを解放する関数をコンパイルする:
cf = FunctionCompile[unmanaged, Function[{},
Module[{obj, out},
obj = obj = CreateTypeInstance["unmanagedType", <|"field" -> 12|>];
out = obj["field"];
DeleteObject[obj];
out
]
]]With[{before = MemoryInUse[]},
Do[cf[], 1000];
MemoryInUse[] - before]メモリ管理の製品型には参照数が含まれ,外部プログラムと互換ではない.製品型をライブラリ関数に渡したりライブラリ関数から製品型を受け取ったりする際は,メモリ管理は無効にすべきである.
Needs["CCompilerDriver`"];
CreateLibrary["
#include \"dllexport.h\"
typedef struct {
int f1;
float f2;
} foo;
DLLEXPORT int getIntFieldRef(foo* arg) {
return arg->f1;
}", "memoryManagementExample"];TypeDeclarationで互換型を表す:
fooTypeDec = TypeDeclaration["Product", "foo", <|"f1" -> "CInt", "f2" -> "CFloat"|>, "MemoryManaged" -> False];互換型"foo"はデフォルトで参照型であり,Cのfoo*と同等である.
cf = FunctionCompile[{
fooTypeDec, LibraryFunctionDeclaration["getIntFieldRef", "memoryManagementExample", {"foo"} -> "CInt"]
},
Function[{},
With[{foo = CreateTypeInstance["foo", <|"f1" -> Typed[42, "CInt"], "f2" -> Typed[3.1, "CFloat"]|>]},
LibraryFunction["getIntFieldRef"][foo]
]
]
]cf[]"Operations" (3)
dec1 = TypeDeclaration["Product", "simpleValue", <|"value" -> "MachineInteger"|>, "Operations" -> {"Increment"}, "AbstractTypes" -> {"DataStructures"}];dec2 = OperationDeclaration["simpleValue", "Increment", Typed[{"simpleValue"} -> "MachineInteger"]@Function[{arg},
arg["value"]++
]];型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:
funs = FunctionCompile[{dec1, dec2}, <|"create" -> Function[{}, CreateTypeInstance["simpleValue", <|"value" -> 0|>]],
"increment" -> Function[{Typed[ arg, "simpleValue"]}, arg["Increment"]]
|>]obj = funs["create"][];"Increment"操作を呼び出す.古い値の0が返される:
funs["increment"][obj]"Increment"操作を再度呼び出す.古い値は1になった:
funs["increment"][obj]操作は抽象型についても定義できる.この場合は,抽象型を実装する任意の型が使用できる.
absDec = TypeDeclaration["Abstract", "incrementer", "Operations" -> {"Increment"}];prodDec = TypeDeclaration["Product", "testType", <|"value" -> "MachineInteger"|>, "AbstractTypes" -> {"incrementer", "DataStructures"}];decOp = OperationDeclaration["testType", "Increment", Typed[ {"testType"} -> "MachineInteger"]@Function[{arg},
arg["value"]++
]];型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:
funs = FunctionCompile[{absDec, prodDec, decOp}, <|"create" -> Function[{}, CreateTypeInstance["testType", <|"value" -> 0|>]],
"increment" -> Function[{Typed[ arg, "testType"]}, arg["Increment"]]
|>]obj = funs["create"][];"Increment"操作を呼び出す.古い値の0が返される:
funs["increment"][obj]"Increment"操作を再度呼び出す.古い値は1になった:
funs["increment"][obj]absDec = TypeDeclaration["Abstract", "incrementer", "Operations" -> {"Increment" -> increment}];操作の宣言.これは,ForAllTypeを使って多態的に記述されている:
decOp = FunctionDeclaration[increment,
Typed[ForAllType[v, {v} -> "MachineInteger"]]@Function[{arg},
arg["value"]++
]];prodDec = TypeDeclaration["Product", "testType", <|"value" -> "MachineInteger"|>, "AbstractTypes" -> {"incrementer", "DataStructures"}];型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:
funs = FunctionCompile[{absDec, prodDec, decOp}, <|"create" -> Function[{}, CreateTypeInstance["testType", <|"value" -> 0|>]],
"increment" -> Function[{Typed[ arg, "testType"]}, arg["Increment"]]
|>]obj = funs["create"][];"Increment"操作を呼び出す.古い値の1が返される:
funs["increment"][obj]"Increment"操作を再度呼び出す.古い値は1になった:
funs["increment"][obj]これとは異なる方法で操作を実装することができる.これは,実際の型を使って狭義的に宣言されているので,抽象型から与えられたものをオーバーライドする:
decOp1 = OperationDeclaration["testType", "Increment", Typed[{"testType"} -> "MachineInteger"]@Function[{arg},
arg["value"] += 2
]];型の例を作成する関数をコンパイルし,別の関数をコンパイルして"Increment"操作を呼び出す:
funs = FunctionCompile[{absDec, prodDec, decOp, decOp1}, <|"create" -> Function[{}, CreateTypeInstance["testType", <|"value" -> 0|>]],
"increment" -> Function[{Typed[ arg, "testType"]}, arg["Increment"]]
|>]obj = funs["create"][];funs["increment"][obj]"ReferenceSemantics" (2)
valueTypeDec = TypeDeclaration["Product", "valueType", <|"field" -> "MachineInteger"|>, "ReferenceSemantics" -> False];cf = FunctionCompile[valueTypeDec, Function[{},
With[{obj = CreateTypeInstance["valueType", <|"field" -> 12|>]},
obj["field"]
]
]]cf[]Needs["CCompilerDriver`"];
CreateLibrary["
#include \"dllexport.h\"
typedef struct {
int f1;
float f2;
} foo;
DLLEXPORT int getIntField(foo arg) {
return arg.f1;
}", "valueTypeExample"];TypeDeclarationで互換型を表す:
fooTypeDec = TypeDeclaration["Product", "foo", <|"f1" -> "CInt", "f2" -> "CFloat"|>, "ReferenceSemantics" -> False];cf = FunctionCompile[{
fooTypeDec, LibraryFunctionDeclaration["getIntField", "valueTypeExample", {"foo"} -> "CInt"]
},
Function[{},
With[{foo = CreateTypeInstance["foo", <|"f1" -> Typed[42, "CInt"], "f2" -> Typed[3.1, "CFloat"]|>]},
LibraryFunction["getIntField"][foo]
]
]
]cf[]アプリケーション (1)
Cの標準ライブラリには2つの整数の商と余りを計算するldivと呼ばれる関数が含まれている.この関数は以下のように宣言されるオブジェクトを返す:
typedef struct {
long quot; /* quotient */
long rem; /* remainder */
} ldiv_t;
divtDec = TypeDeclaration["Product", "CLDivT", <|"quot" -> "CLong", "rem" -> "CLong"|>, "ReferenceSemantics" -> False];funcDec = LibraryFunctionDeclaration["ldiv", Automatic, {"CLong", "CLong"} -> "CLDivT"];C標準ライブラリから関数を呼び出すプログラムをコンパイルする:
quotRem = FunctionCompile[{divtDec, funcDec},
Function[{Typed[n, "CLong"], Typed[d, "CLong"]},
With[{divt = LibraryFunction["ldiv"][n, d]},
{divt["quot"], divt["rem"]}]
]
]quotRem[7, 2]考えられる問題 (1)
マクロは型ではなく型が解決される際に適用される置換規則である.したがって,同じ関数のマクロとマクロが参照する型について異なる定義をすることはできない:
dec = TypeDeclaration["Macro", "macroString", "String"];funcDec = FunctionDeclaration[StringLength, Typed[{"macroString"} -> "MachineInteger"]@
Function[arg, 12]
];FunctionCompile[{dec, funcDec},
Function[Typed[arg, "macroString"], StringLength[arg]]]
テクニカルノート
テキスト
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_2026_typedeclaration, author="Wolfram Research", title="{TypeDeclaration}", year="2022", howpublished="\url{https://reference.wolfram.com/language/ref/TypeDeclaration.html}", note=[Accessed: 03-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_typedeclaration, organization={Wolfram Research}, title={TypeDeclaration}, year={2022}, url={https://reference.wolfram.com/language/ref/TypeDeclaration.html}, note=[Accessed: 03-November-2026]}