2409dip草稿,和类型

news2024/9/23 3:19:31

原文

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;
        else
            return 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.coloradmin.cn/o/2156434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法-K个一组翻转链表

// 要实现没k个节点进行翻转的操作,可以按照一下步骤进行 // 1.计算链表长度 // 2.分组反转 // 3. 使用一个虚拟头节点来处理边界情况 // 4.每次处理k个节点进行反转 // 5.如果剩余节点不足k个 则保持原有顺序 // 6.依次反转每组中的节点 // 1.使用prevGroupEEnd追…

EvilScience靶机详解

主机发现 arp-scan -l 得到靶机ip 192.168.229.152 端口扫描 nmap -sV -A -T4 192.168.1.20 这段代码使用 nmap 命令来扫描目标主机 192.168.1.20,并执行以下操作:-sV:探测开放的端口,以确定服务/版本信息。-A:启…

[大语言模型] LINFUSION:1个GPU,1分钟,16K图像

1. 文章 2409.02097 (arxiv.org)https://arxiv.org/pdf/2409.02097 LINFUSION: 1 GPU, 1 MINUTE, 16K IMAGE 摘要 本文介绍了一种新型的扩散模型LINFUSION,它能够在保持高分辨率图像生成性能的同时显著降低时间和内存复杂度。该模型采用了基于Transformer的UNet进…

常用卫星学习

文章目录 Landsat-8 Landsat-8 由一台操作陆地成像仪 (OLI) 和一台热红外传感器 (TIRS)的卫星,OLI 提供 9 个波段,覆盖 0.43–2.29 μm 的波长,其中全色波段(一般指0.5μm到0.75μm左…

Java的IO流(二)

目录 Java的IO流(二) 字节缓冲流 基本使用 使用缓冲流复制文件 字符缓冲流 缓冲流读取数据原理 字符编码 字符集 转换流 序列化流与反序列化流 基本使用 禁止成员被序列化 序列号不匹配异常 打印流 基本使用 系统打印流与改变流向 Prop…

【kaggle竞赛】毒蘑菇的二元预测题目相关信息和思路求解代码

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接,看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源,这里是一些关键点的总结: Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…

2024 硬盘格式恢复软件大揭秘

宝妈们硬盘存储图片、设计师用硬盘存储素材、学生们用硬盘存储作业和数据已经是一个普遍的社会现象了。但是有时候数据迁移之后想要一份全新的硬盘我们就会采取硬盘格式化的操作,如果格式化之后发现硬盘数据没有备份好硬盘格式化后能恢复数据吗?这次我就…

没错,我给androidx修了一个bug!

不容易啊,必须先截图留恋😁 这个bug是发生在xml中给AppcompatTextView设置textFontWeight,但是却无法生效。修复bug的代码也很简单,总共就几行代码,但是在找引起这个bug的原因和后面给androidx提pr却花了很久。 //App…

git学习【完结】

git学习【完结】 文章目录 git学习【完结】一、Git基本操作1.创建本地仓库2.配置本地仓库1.局部配置2.全局配置 3.认识工作区、暂存区、版本库4.添加文件5.修改文件6.版本回退7.撤销修改8.删除文件 二、Git分支管理1.理解分支2.创建、切换、合并分支3.删除分支4.合并冲突5.合并…

【每天学个新注解】Day 2 Lombok注解简解(一)—@Data、@Build、@Value

Data 相当于同时使用了 Getter 、Setter 、RequiredArgsConstructor、ToString、EqualsAndHashCode 1、如何使用 需要同时使用Getter 、Setter 、RequiredArgsConstructor、ToString、EqualsAndHashCode注解一个Bean的时候。 2、代码示例 例: Data public cla…

H5白色大方图形ui设计公司网站HTML模板源码

源码名称:白色大方图形ui设计公司网站模板源码 源码介绍:一款H5自适应白色大方图形ui设计公司官网网站模板源码。源码含有七个页面,可用于各种设计公司官网。 需求环境:H5 下载地址: https://www.51888w.com/369.ht…

基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,宠物种类,商家,咨询商家,用户宠物,宠物托管,宠物状况,宠物用品,用品分类,商家公告,结束托管,账单信息,延长托管 开题报告内容 基于Vue框架的宠物托管系统设计与实现开题报告 一、引言 随着现代生活节奏的加快,越来越…

如何在Linux Centos7系统中挂载群晖共享文件夹

前景:企业信息化各种系统需要上传很多的图片或者是文件,文件如何在群晖中显示,当文件或者图片上传到linux指定文件夹内,而文件夹又与群晖共享文件夹进行挂载,就能保证上传的文件或者图片出现在群晖并在群晖里进行管理。…

分布式安装LNMP

目录 搭建LNMP架构 安装mysql 1.上传mysql软件包,关闭防火墙和核心防护 2.安装环境依赖包,桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…

Rumor Mitigation in Social Media Platforms with Deep Reinforcement Learning

ABSTRACT 社交媒体平台已成为人们传播和获取信息的主要渠道之一,其可靠性受到网络谣言的严重威胁。现有的辟谣手段如暂停用户、播放真实信息等,要么成本高,要么扰乱用户。在本文中,我们引入了一种新颖的谣言缓解范例,…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步:查看当前的密码是什么? 打开redis-cli.exe,输入config get requirepass,查看当前的密码是什么? 接着,修改redis的配置文件,找到redis的安装目录,找到相关的conf文件&#x…

Spring高手之路24——事务类型及传播行为实战指南

文章目录 1. 编程式事务(不推荐)2. 声明式事务(推荐)3. 事务的传播行为(复杂混合事务场景及时序图说明)3.1 NESTED和REQUIRES_NEW传播行为的区别 1. 编程式事务(不推荐) 定义&#…

如何从 Nutanix 迁移至 SmartX 超融合?解读 4 类迁移方案和 2 例迁移实践

2022 年底,Nutanix(路坦力)正式宣布将中国市场交由合作伙伴(联想)主导销售,并于 2023 年 8 月完成全面转型。转型后,虽然中国用户依旧可以使用 Nutanix 产品,但在软件的续保和维保方…

企业EMS -能源管理系统-能源管理系统源码-能源在线监测平台

能源管理系统是以帮助工业生产企业在扩大生产的同时,合理计划和利用能源,降低单位产品能源消耗,提高经济效益,降低CO2排放量为目的信息化管控系统。 我国能源管理从上世纪80年代中期开始,通过“能量平衡测试”、“能源…

安卓数据存储——SharedPreferences

共享参数 SharedPreferences 1、sharedPreferences是Android的一个轻量级存储工具,采用的存储结构是key - value的键值对方式 2、共享参数的存储介质是符合XML规范的配置文件。保存路径是:/data/data/应用包名/shared_prefs/文件名.xml 使用场景&…