TypeDeclaration

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

表示具有指定字段的 product 类型的声明.

TypeDeclaration["Abstract",name]

表示抽象类型 name 的声明.

TypeDeclaration["Alias",name,targetType]

表示类型 name 的声明,使用的是 targetType 的内部表示.

TypeDeclaration["Macro",name,targetType]

表示一个声明,指定 name 的所有实例应被 targetType 替换.

更多信息和选项

  • TypeDeclaration 是声明的符号表示,不会自行进行计算.
  • TypeDeclaration 可在 CompilerEnvironmentAppendTo 的内部使用,也可以在 FunctionCompile 等函数的第一个参数中使用.
  • 支持以下类型的声明:
  • "Product"含有几个字段的类型;类似于 C 中的结构体 (struct)
    "Abstract"具体类型可以是某个类型的类别 (class) 的实例的抽象类型
    "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["field"] 访问和设置 product 类型实例 prod 的字段.
  • 支持以下选项:
  • "AbstractTypes"{}含有所声明类型的抽象类型
    "Creator"None调用以创建声明类型的实例的函数
    "MemoryManaged"Automatic是否自动释放未引用的实例
    "Operations"{}可用于所声明类型的运算
    "ReferenceSemantics"Automatic是否在内部用指针表示类型
  • 默认情况下,"Product" 声明含有 "MemoryManaged"True"ReferenceSemantics"True 设置.
  • 对于 "Product" 声明,"ReferenceSemantics" 只能被设为 True.
  • 对于具有引用语义的 "Product" 声明,"MemoryManaged" 只能被设为 True.
  • "Creator" 只能为 "Product" 声明设置.
  • "Operations" 只能为 "Product""Abstract" 声明设置.
  • 不能为 "Macro" 声明设置 "AbstractTypes".
  • 为了与 C 结构体兼容,product 类型通常必须设置为 "MemoryManaged",而 "ReferenceSemantics" 通常必须设置为 False.
  • 对作为 produc 类型实例的对象 prod 定义了以下方法:
  • prod["field"]获取 "field" 的值
    prod["field"]=val设置 "field" 的值
    DeleteObject[prod]释放 prod (只在 prod 不是内存管理的情况下可用)

范例

打开所有单元关闭所有单元

基本范例  (2)

将 "fooInteger" 的声明表示为 "MachineInteger" 的宏类型:

用声明编译函数:

全局声明 "fooInteger" 为 "MachineInteger" 的宏:

用 "fooInteger" 编译一个函数:

重置编译环境以清除声明:

范围  (5)

"Product"  (1)

product 类型的声明:

编译一个实例化 product 类型的函数,然后提取一个字段:

"Abstract"  (1)

抽象类型的声明:

作为抽象类型实例的 product 类型的声明:

不是抽象类型实例的 product 类型的声明:

接受任何抽象类型实例的函数的声明:

用该函数编译程序,处理是抽象类型实例的类型:

该函数不接受不是抽象类型实例的类型的输入:

"Alias"  (1)

"String" 类型的别名:

别名的函数与其在原始类型上的实现不同:

编译一个程序,通过 bitcasting 实例化别名,然后用来对函数进行计算:

"Macro"  (2)

"String" 类型的宏:

用宏指代 "String" 的函数:

宏不是类型,而是在解析时应用于类型的替换规则. 因此,一个宏和它所指代的类型不可能对同一个函数有不同的定义:

与宏不同,别名是类型,因此函数可以识别它们是应用于类型还是该类型的别名.

选项  (11)

"AbstractTypes"  (2)

表示一个抽象类型:

表示是抽象类型成员的对象:

表示一个接受任何抽象类型实例的函数:

编译该函数,显示它接受是抽象类型成员的 product 类型:

表示一个抽象类型:

表示是第一个抽象类型成员的另一个抽象类型:

表示是第二个抽象类型的实例的 product 类型:

表示一个接受抽象类型 "superType" 的任何实例的函数:

编译该函数,显示它接受通过 "subType" 继承 "superType" 成员资格的 product 类型:

"Creator"  (1)

表示有自己的创建函数的类型:

表示创建函数的实现:

编译一个使用 CreateTypeInstance 的函数,并调用 "Creator" 函数:

与预期相符,结果为 10

"MemoryManaged"  (3)

表示没有自动内存管理的类型:

编译一个使用该类型的函数:

所得函数泄漏内存,因为对象没有被自动释放:

默认情况下,product 类型是自动被内存管理的:

使用内存管理类型的函数不会泄漏内存:

表示没有自动内存管理的类型:

编译一个使用该类型的函数并用,并用 DeleteObject 释放它:

所得函数不会泄漏内存,因为它是被手动释放的:

由内存管理的 product 类型包括引用计数,并且与外部程序不兼容. 将 product 型传进和传出库函数时,应禁用内存管理.

编译一个定义结构体 foo 的库:

TypeDeclaration 表示兼容类型:

注意已编译类型 "foo" 默认是引用类型,相当于 C 中的 foo*.

编译一个使用该类型调用库的函数:

"Operations"  (3)

声明一种 product 类型,并给出一种运算:

运算声明:

编译一个函数,创建该类型的实例及另一实例,调用 "Increment" 运算:

创建实例:

调用 "Increment" 运算;返回旧值 0:

再次调用 "Increment" 运算;现在,旧值为 1:

也可以为抽象类型定义运算. 在这种情况下,它们可用于实现抽象类型的任何类型:

表示一个抽象类型:

表示一个实现该抽象类型的对象:

运算声明:

编译一个函数,创建该类型的实例及另一实例,调用 "Increment" 运算:

创建实例:

调用 "Increment" 运算;返回旧值 0:

再次调用 "Increment" 运算;现在,旧值为 1:

为抽象类型定义的运算可引用实际的实现:

表示一个抽象类型:

运算声明;它是用 ForAllType 多态编写的:

表示一个抽象类型的对象:

编译一个函数,创建该类型的实例及另一实例,调用 "Increment" 运算:

创建实例:

调用 "Increment" 运算;返回旧值 0:

再次调用 "Increment" 运算;现在,旧值为 1:

运算的实现完全由抽象类型设置.

也可以用其他方式实现运算. 由于它是用实际类型以更窄的方式声明的,因此它会覆盖抽象类型给出的实现:

编译一个函数,创建该类型的实例及另一实例,调用 "Increment" 运算:

创建实例:

现在,"Increment" 运算给出不同的结果:

"ReferenceSemantics"  (2)

表示将通过值而不是通过引用传递的类型:

编译使用值类型的函数:

编译一个定义结构体 foo 的库:

TypeDeclaration 表示兼容类型:

编译使用该类型的函数:

应用  (1)

C 标准库包含一个名为 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 语言. 2022. "TypeDeclaration." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/TypeDeclaration.html.

APA

Wolfram 语言. (2022). TypeDeclaration. Wolfram 语言与系统参考资料中心. 追溯自 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: 22-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: 22-November-2024 ]}