看到D语言的opAssign即赋值操作符,突然想是不是能实现下面这个功能呢?以D语法写出:
auto x = new Variable;
auto y = new Variable;
// x = 10; y = 5;
x + 5 = y * 3;
x / y = 2;
简单的方程组,是否可以自动求出x和y值?
从我学习过的几种语言来考察,哪些语言可以支持这种语法呢?
1、C++
C++支持赋值操作符,不过如果我把x+5写成5+x,就必须用到全局运算符重载。要支持其它类型和Variable类型、Variable类型和其它类型、Variable和Variable的运算符重载,但不应该去支持其它类型之间的运算符。这个比较难办,理论上应该是这么写:
template <class T>
ResultType operator + (T v, Variable v1){
return ResultType();
}
template <class T>
ResultType operator + (Variable v, T v1){
return ResultType();
}
ResultType operator + (Variable v, Variable v1){
return ResultType();
}
不过这如果是Variable和Variable运算,3种都可以匹配,所以会出现无法决议的错误。去掉最后一种形式,前2种还是无法决议,唯一能共存的是这2种:
template <class T, class U>
ResultType operator + (T v, U v1){
return ResultType();
}
ResultType operator + (Variable v, Variable v1){
return ResultType();
}
可以通过了,不过前一种根本没有约束,所以后面这个没多大意义,我们要的是对类型进行约束,这下又要扯远了。简单的做法是在函数体中加一个静态检查,检查2个参数中有一个类型必须是Variable,这个比较好做:
template <class T, class U>
class CheckMustHaveAVariableType{
STATIC_ASSERT<false> muse_have_a_variable_type;
}
template <class T>
class CheckMustHaveAVariableType<Variable, T>{
}
template <class T>
class CheckMustHaveAVariableType<T, Variable>{
}
template <class T, class U>
ResultType operator + (T v, U v1){
typedef CheckMustHaveAVariableType<T,U> SafeTypes;
return ResultType();
}
可以检查并禁止不是variable类型的参数运算,不过这也是破坏性的,全局泛型实现,还让不让别人活。。。
考虑这么些因素,感觉用C++实现这个语法还是会遇到些困难,放弃。
C++实现也有些好处,比如上面的Variable以及运算结果类型只要实现了“=”运算符,那么完成这整个语句:
x + 5 = y * 3;
x / y = 2;
运算会产生临时变量,只要在它们构造或析构或赋值时运算的结果树存入某一变量即可。暂时没完整思考,感觉应该是可行的。
2、D语言
D语言没有全局运算符重载,不过它可以在类中重载,而且有left-side和right-side2种,也就满足了Variable类型在运算符左边和右边的语法实现。
class Variable{
public:
Combine opAdd(T)(T v){
return null;
}
Combine opAdd_r(T)(T v){
return null;
}
}
打住!做点测试:
Variable x = new Variable;
Variable y = new Variable;
x + 5;
5 + x;
x + y; // <=====
坏了,打标记的这一行无法编译,因为2个运算符重载都匹配。在python中,__add__和__radd__是可以同时存在的,匹配规则是如果有__add__,则调用__add__,否则调用__radd__。D语言没有实现它,而且强类型的爱好者可能更希望它这样。
另一个问题:
x + 5 = y * 3;
由于 x+5的结果是个右值,所以它连=运算符也不让调用了。错误提示如下:
Error: (x) + 5 is not an lvalue
放弃。
3、python
__add__和__radd__满足要求了,问题在于它也不让上面这个赋值通过:
SyntaxError: can't assign to operator
4、ruby
它没有left-side和right-side的运算符重载,不过ruby里面所有类型都是可以扩展的,所以实现上应该没有问题。不过在它里面写上面这个式子一样有问题:
a + b = 3
#被解释为:
a + (b = 3)
x + 5 = y * 3
#被解释为:
x + (5 = y * 3)
#语法错误
看来遇到麻烦了,唯一可以在语法上通过的是C++,有空再看看。。
分享到:
相关推荐
突发奇想的好点子PPT模板.pptx,一个灯泡放在模板的中心,发散开来4各部分,用以表现一个突发奇想的好点的四方面。突发奇想的好点子PPT模板免费下载,提供.pptx格式下载。
电商客服售后客服的突发奇想 售后客服的突发奇想是指在电商平台上,客户在收到商品后发现与订单不符,或者是卖家发错货的现象。这种情况下,客户会与客服团队进行沟通,以解决问题。这篇文章讨论了售后客服在处理...
1. jQuery插件开发基础:文档中提到的“突发奇想的一个jquery插件”,揭示了开发者在短时间内基于灵感创建了一个jQuery插件。这显示了jQuery插件开发的灵活性和易用性,即使是非正式的快速开发也能创造出实用的工具...
小明同学在使用电脑上网课的时候突然电脑黑屏出现故障,小明突发奇想,对于电脑故障类问题,是否能提前预知_memory_sample_failure_predict
标题中的“突发奇想的力量”是指在科技创新过程中,人们突然涌现的创新思维和想象力所带来的巨大影响。这种力量推动了人类社会的进步,使科技从看似遥不可及的概念变为日常生活中不可或缺的部分。描述中提到的江苏省...
#include"reg52.h" #define u8 unsigned char sbit power_GND=P1^1;// sbit power_VCC=P1^2;// sbit signal_PWM=P1^3;//信号引脚 u8 temp=0;//累加标志 u8 flage=0;//清零标志 //开启定时器配置 ... }
assistant-for-reciting-the-English-text 背书时的突发奇想 目前还不能批改,不过大概晚上就可以了
在本实验中,任务是创建一个Java程序,用于输出顺时针旋转的数字方阵。这个方阵的特性是从中心开始,数字按照顺时针方向填充。给定的代码片段是用C++编写的,但我们可以将其转换为Java语言,并解释其工作原理。...
今天突发奇想,跟ChatGPT进行了一场坦诚的对话。 第一从GPT-4的视角,看到它是如何看待:ChatGPT等AI工具的涌现,对我们工作、生活、赚钱机会带来的影响。 Q1:使用ChatGPT能获得巨大提升的10类人群 Q2:ChatGPT的...
前两天突发奇想,能不能让网页上的元素很容易的发光?结果正好发现flash里面有这样的滤镜。于是就硬着头皮写了个flash,实现了发光flash的动态生成。再结合javascript实现定位,把发光的flash放到真实的dom后面。...
我便突发奇想,为像素小鸭“换衣服”。鼠标点击衣服,然后拖到鸭子身上。此后仍有作品或有趣游戏,请关注原作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快来评论...
突发奇想,好多小说软件上的听小说功能都是收费的,咱们写个小程序读一读,岂不是很哇塞! 看了一些资料,这里给大家分享出来,已经测试可以用。 C++代码和python代码实现对文本的朗读功能,代码比较简单,仅供参考...
给大家无聊的时候玩玩
前两天突发奇想,能不能让网页上的元素很容易的发光?结果正好发现flash里面有这样的滤镜。于是就硬着头皮写了个flash,实现了发光flash的动态生成。再结合javascript实现定位,把发光的flash放到真实的dom后面。...
云盘源码java后端服务器+前端electron前后端分离式自从学习了一点点electron基础命令(也就是几个标准单词),我就突发奇想,想写一款桌面基本的应用,但是也不知道该写什么demo,然后就这样子,想啊想…,直到发生了...
高中数学要学习,资料难下载?没关系,“网站图片下载器”帮您将人民...无奈工作几年学的都还给了老师,于是突发奇想做一个小程序把高中数学下载本地,再来好好复习。 本系统只供个人学习和交流用,请尊重原著版权。
这几天突发奇想,突然想自己写一个js跨域访问天气的接口然后实现天气预报功能的小例子 但是jquery跨域访问的时候出现了点问题 上csdn上晃悠了一大圈发现大多是答非所问 不少东西花积分下载之后 例子里面根本就只提供...
由于自己记性太差,很难记住朋友的生日,所以突发奇想,写了个简单的shell程序,主要目的就是为了能在固定的节日(如:圣诞、元旦等,可以指定)和朋友生日的时候自动给朋友发送祝福信件,同时密送给自己,程序虽然...