2401d,讨论d串滑动参数

2024-01-13 11:28
文章标签 参数 讨论 滑动 2401d

本文主要是介绍2401d,讨论d串滑动参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文
因为对编译时执行的i串的兴趣,我一直在考虑搞个通用用例,而不是相关i串的用例.

滑动模板参数

请考虑以下模板:

void pluto(string s)()
{pragma(msg, s);
}
void test()
{pluto!"hello"();
}

因为s是编译时参数,这编译,而pragma(msg,s)
期望s为编译时值.

void pluto()(string s)
{pragma(msg, s);
}
void test()
{pluto("hello");
}

这无法编译,因为即使它是内联的,s也是编译时不可访问的运行时参数.在此内联没用,因为内联是在CTFE分析语义后进行的.
这些示例说明了编译时参数和运行时参数间的区别.
为了说明,生成元素元组:

alias AliasSeq(T...) = T;

及接受元组函数参数列表:

void func(Args...)(Args args)
{
}

但注意,args是运行时参数.表明,它无法用元组拆分参数元组编译时元组和运行时元组,类似如下:

void pluto(Args...)(Args args)
{exec!(args[0])(args[1 .. args.length]);
}

这是DIP1036e遇见的问题.它聪明的是让编译器(因为它不能通过元编程完成)取第一个参数,并用作模板挂名值的编译时参数.

然后,该参数类型,是个把值编码可编程提取并编译时处理的类型的模板.

尴尬在它只在i串上,而不是通用功能,再加上插入挂名参数参数列表中,只为了可提取它们的类型.
因此,该提案描述了从运行时表达式元组创建编译时参数语言能力.

因为缺乏更好术语,我叫它"滑动模板参数".
考虑一个模板函数:

void pluto(string s, Args...)(Args args)
{pragma(msg, s);
}
void exec()
{pluto!"hello"(1,2,3);
}

现在有效.但如下无法编译:

pluto("hello",1,2,3);

因为没有s参数.

因此,编译器可滑动参数左侧,而不是发出编译错误,因此把第一个参数移动到编译时参数列表中.然后,调用就会编译.

规则类似:
1.该函数是个带可变运行时参数列表的模板
2.编译时参数是N个值参数序列,加可变类型参数.
3.值参数没有默认值
4.模板调用中未提供编译时参数
5.最左边的N个运行时参数与编译时参数匹配,并从运行时参数列表中删除
6.如果它们匹配,则重写模板实例化反映这一点
7.然后正常编译
然后,滑动模板可成为一个通用设施.有趣的结果是,它开辟了一类全新的函数,现在可对最左边的参数CTFE计算.

总之,这是个好主意,但建议的语法有点过于特化,受到任意限制,且行为可能是意想不到的,应该选入.

也许可这样做:

void pluto(string s, Args...)(enum string x = s, Args args){
}

也即,可在函数参数列表中使用枚举,且必须默认初化它们.即此参数总是需要有该值.

然后,在编译时计算枚举参数匹配的参数,并匹配初化器.

我昨天开始研究1036e模板的替代机制.我提到了这一点.

可在调用点传递UDA,并可在模板函数中通过__traits(getAttributes,parameter)访问它.

i"$ident$(expr)$(ident:format)${1:format}"
//变为:
@IExpression("ident")
ident,
@IExpression("expr")
expr,
@IExpression("ident")
@IFormat("format")
ident,
@IFormat("format")
@IPosition(1)
IPosition.init

这将是一个通用语言功能.

string username, password;
getopt(@description("My program")@description("Second line")commandsInfo,@description("My programs help info")@flag("help") @flag("h") helpInfo,@description("The username to connect with")@flag("username") @flag("u") username,@description("The password to connect with")@flag("password") @flag("p") password
);

我已模拟了getopt,唯一额外的模板用法formattedRead.这是一个通用功能,串插值也可绑定它.

这是个可行的方法.但仍没有格式串(writef).

如果用它来实现插值元组,我会让第一个参数类型是

struct Interpolation {immutable string[] parts; 
}

因此编译器会这样:

void foo(Interpolation interp, Args...)(Args args) {...}
void main()
{string name = "Steve";int age = 42;foo(i"Hello, $name, I see you are $age years old.");//相当于:foo!(Interpolation(["Hello, ", "name", ", I see you are ", "age", " years old."]))(name, age);
}

参数出现的顺序传递参数仍有价值.如,这禁止带多个i串的函数.但也许没关系.
另一个有趣的发展是,也可在运行时取串字面数据(喜欢或同意运行时处理串字面数据时):

void writeln(Args...)(Interpolation interp, Args args)
{assert(interp.parts.length == args.length * 2 + 1);write(interp.parts[0]); //总是是前导串;static foreach(i; 0 .. args.length)write(args[i], interp.parts[(i+1)*2]);writeln();
}

我不认为这比DIP1036eDIP1027简单.简单的转换就是简单的转换.当然,编译时传递格式串的混合DIP1027仍不可行.
但会稍微不那么臃肿.
如果该机制是让它越过终点线的原因,我可妥协.
这是可实现和玩的东西吗?
这似乎有可能破坏代码:

void foo(int x, Args...)(Args args) {
}
void foo(Args...)(Args args) {
}
foo(1, 2, 3); //这叫今天,第二个是

所以我会听从蒂蒙的建议,也许确实需要明确选入.
-史蒂夫
一个更现实示例:

writefln("blah %d", 1)

因为writefln(和format)有串模板格式参数版本.
即使选入,仍会决定(或歧义错误)来匹配重载.

-史蒂夫

这篇关于2401d,讨论d串滑动参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/601297

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

MySQL中闪回功能的方案讨论及实现

《MySQL中闪回功能的方案讨论及实现》Oracle有一个闪回(flashback)功能,能够用户恢复误操作的数据,这篇文章主要来和大家讨论一下MySQL中支持闪回功能的方案,有需要的可以了解下... 目录1、 闪回的目标2、 无米无炊一3、 无米无炊二4、 演示5、小结oracle有一个闪回(flashb

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

JAVA虚拟机中 -D, -X, -XX ,-server参数使用

《JAVA虚拟机中-D,-X,-XX,-server参数使用》本文主要介绍了JAVA虚拟机中-D,-X,-XX,-server参数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录一、-D参数二、-X参数三、-XX参数总结:在Java开发过程中,对Java虚拟机(JVM)的启动参数进

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex