当前位置: 首页 > news >正文

2409dip草稿,和类型

原文

D按构造和型.

理由

语言中添加类型提供了三个关键的可用性优势.
1,业务逻辑数据的快速原型设计.可与元组结合使用,只需要一个声明,就可完整构造表示网络形式的数据.

2,启用基于栈的异常机制,而不用运行时展开库.这有可能实现单步指令一样便宜的抛.同时保证在抛它的位置附近抛的每个异常.不用堆分配.
3,与匹配相结合的安全性,保证了在编译时不会滥用@safe,从而破坏程序.

先前的工作

以前在D中实现的库类型,这些可分为两类.
1,不支持元素名:
std.variant代数
std.sum类型
2,约束集中,(可选)支持非唯一类型的元素名:
taggedalgebraic

高度强调仅针对库实现更简单元素类型划分,在其他语言中也可见:
C++变量

语言支持可分为三类,而不是两类:
1,不支持元素名:
TypeScript(类型脚本)
2,可选元素名:
rust.
3,可选元素类型:
SML
OCaml

描述

和类型是一个只能存储一个值,且访问和更改联集约束的容器.由提供标签联行为标签提供保护权限.

sumtype Identifier = int | :None | string text;

约束有三个形式.
1,类型.
2,按typeof(:None)类型覆盖:None符号的成员.
3,有叫text名的类型.

必须至少有一个约束.

如果只有一个约束,则按元素的别名 本对待它.为它提供隐式安全访问和变更.

sumtype Int = int;
Int i = 2;
i *= 5;

赋值

结构类似,赋值一个和类型给另一个和类型.

析构目标,然后复制源到该目标,复制后更新标签,复制构造器和析构器.

sumtype S = int | bool;
S source, target;
//target.destroy;
target = source;
// target.__tag = source.__tag;
// target.__copyctor = source.__copyctor;
// target.__dtor = source.__dtor;

赋值用户未显式请求的元素稍微复杂一些.仅根据约束集检查是不够的,必须考虑和类型变量自身.

sumtype S1 = int;
sumtype S2 = int | bool;
S1 source;
S2 target;
target = source;

和类型类型优先于约束集中的元素.如果需要保证它设置的是元素,而不是和类型变量,请使用cast.

访问元素

访问按类型的和类型元素的值,请使用转换.

sumtype S = int | bool;
S s;
s = 5;
assert(cast(int)s == 5);

如果要按名访问元素,请为其提供memberof(的成员)符号.

sumtype S = int i | bool;
S s;
cast(:i)s = 2;
assert(cast(:i)s == 2);

这与和类型的声明中可见的重写相同.按typeof(:Identifier)重写符号的成员.在集合提供唯一元素.

元素存储值总是是安全的.它在复制前析构容器.

如果不匹配,从元素取值不安全的.要访问元素值,这是@系统级的.

属性

和类型以下成员:
1,__tag,一个指示设置了哪个元素整数标签值.
2,__tagTypes,取约束集中的类型.
3,__tagNames,取约束集中每个元素名,如果没有,则序列中的串将为无效.
4,__tagValues,约束集中,对元素描述,把偏移映射到其标签值.

标签类型的哈希值组合标签名,来定义标签值.属于size_t类型.这样可增加和缩小约束集,这样,无需完全匹配和再赋值标签值.这对某些用例(如值类型异常)非常重要.

第一个元素选择默认标签.在下例中:None.init要用的默认元素.

sumtype S = :None | int;

类型限定符

和类型,应用类型限定符时,也针对约束集.

sumtype S = int* | bool;
const(S) s;
pragma(msg, S.__tagTypes[0]); //const(int*)

布局

和类型基于结构,与结构一样,它会自动调用复制构造器/析构器.根据约束集,它有以下可变大小的布局:
1,标签值
2,复制构造器指针
3,析构器指针
4,标签值

如果约束集元素不需要它,则可省略它.如果约束集中的所有元素的大小都为零,则可省略.

如果需要,编译器应生成一个取标签值的指针补丁函数,复制它,并与构造器/析构器组合在一起,并按闭包转换它.但是,它应该可在没有新函数重建闭包.

复制构造器代替后复制.但是,它可能需要生成包装器函数.

布局大小必须是可变的,以允许它是可保存在寄存器中的单个机器字的大小.这允许其他语言元素值类型异常,来保持零成本的能力.

如果布局中有复制构造器或析构器,则无论选择哪个元素,它都必须为非无效.

其他元素要用的未用内存将为未定义状态,且访问它不安全.

WalterBrightDConf2024时记住的一个优化策略是利用进位标志指示有错误.
在返回非空和类型时,只要和类型元素仅包含成员符号返回类型适合寄存器,这允许省略标签.

匹配

可查看DIP1048提供的匹配,以理解提供它使用的属性和类型.注意,缺少一个__tagValue,编译器了解从何处及如何取此引用.因此不应存在它.

sumtype S = int | string text | :None;
S s;
s.match {(:text someTextVar) {};(int) {};(:None) {};
};

匹配模式现在支持使用的成员符号来代替类型.它在约束集中查找给定元素名,或转换typeof(:Identifier)类型并匹配.

通过在编译时可访问的__tagNames串序列中查找索引,扩展此功能和类型库.

也是按引用,访问元素值是个@safe操作.它没有按转换访问的限制.

最后,匹配支持返回值.返回的值将是语言和类型.每个可能有在结果类型包含不同类型.

sumtype S = :None | int;
sumtype S2 = int | bool;
S1 s1;
S2 s2 = s1.match {(:None) {if (random() > 0.5)return true;elsereturn 2;};(int v) {return v;};
};

语法

注意,可模板化它,当用的成员符号提供元素时,它会按一个语义表示的概念重写为统一语法.

+ SumTypeDeclaration:
+    sumtype Identifier SumTypeConstraints
+    sumtype Identifier TemplateParameters Constraint|opt SumTypeConstraints
+ SumTypeConstraints:
+    SumTypeConstraint , SumTypeConstraints
+    SumTypeConstraint
+ SumTypeConstraint:
+    MemberOfOperator
+    Type Identifier|opt
MatchPattern:
+    MemberOfOperator FunctionLiteralBody
ParameterDeclaration:
+    ParameterAttributes|opt MemberOfOperator Identifier
TypeSpecialization:
+    sumtype

重大更改和弃用

名为和类型的符号都可能破坏.可能方法是要求关键字仅在一组版本更高版本识别它.


http://www.mrgr.cn/news/33752.html

相关文章:

  • Cesium 绘制可编辑点
  • C++自动驾驶面试核心问题整理
  • YOLOv10改进,YOLOv10替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,独家手把手教程,助力涨点)
  • 面试题(五)
  • 110. 平衡二叉树
  • 高等数学——微分学
  • Linux:终端(terminal)与终端管理器(agetty)
  • 学习记录:js算法(四十一): 基于时间的键值存储
  • 鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发
  • sftp登录ipv6用中括号 `sftp x@[ipv6]`
  • 2D目标检测常用loss
  • [Excel VBA]如何使用VBA自动生成图表
  • iOS 中 KVC 与 KVO 底层原理
  • 面试题(二)
  • Java--File
  • 【详细解答】指出下面指令的错误:IN AL,300H
  • 2024年 5 个优秀的Flutter图标库
  • CSS 选择器的分类与使用要点二
  • linux中vim编辑器的应用实例
  • 在Spring Boot中实现多环境配置