`
qiezi
  • 浏览: 497223 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

突发奇想

阅读更多
看到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++,有空再看看。。
分享到:
评论
4 楼 kindy 2008-11-05  
不知道 python 里是否可以将 = 换成 ==

有空了试试。
3 楼 qiezi 2006-12-14  
今天又仔细看了一下D语言的opAssign重载规则,它并不是都转成右值,而是不能对同一类型作opAssign重载。

引用

The assignment operator cannot be overloaded for rvalues that can be implicitly cast to the lvalue type.


道理也很简单:
Foo foo = new Foo;
foo = new Foo;

上面第2行,如果我们实现了Foo opAssign(Foo),那可能会造成恶劣后果。
2 楼 qiezi 2006-12-11  
只要语法能通过,实现应该问题不大。prolog语法上应该做不到这样吧?不过它可能不用写太多代码,我不太熟悉它。

我又想了一下,C++版本似乎是可以改进一下,分别实现Variable::operator +的泛型版本,和全局的operator+<T, Variable>,就可以避免上面的全局泛型“霸道”操作符。
1 楼 cookoo 2006-12-11  
貌似只有prolog才能这么干

相关推荐

    突发奇想的好点子PPT模板.pptx

    突发奇想的好点子PPT模板.pptx,一个灯泡放在模板的中心,发散开来4各部分,用以表现一个突发奇想的好点的四方面。突发奇想的好点子PPT模板免费下载,提供.pptx格式下载。

    售后客服的突发奇想.doc

    电商客服售后客服的突发奇想 售后客服的突发奇想是指在电商平台上,客户在收到商品后发现与订单不符,或者是卖家发错货的现象。这种情况下,客户会与客服团队进行沟通,以解决问题。这篇文章讨论了售后客服在处理...

    突发奇想的一个jquery插件

    1. jQuery插件开发基础:文档中提到的“突发奇想的一个jquery插件”,揭示了开发者在短时间内基于灵感创建了一个jQuery插件。这显示了jQuery插件开发的灵活性和易用性,即使是非正式的快速开发也能创造出实用的工具...

    小明同学在使用电脑上网课的时候突然电脑黑屏出现故障,小明突发奇想

    小明同学在使用电脑上网课的时候突然电脑黑屏出现故障,小明突发奇想,对于电脑故障类问题,是否能提前预知_memory_sample_failure_predict

    江苏省南通市小海中学高三语文学生作文突发奇想的力量素材

    标题中的“突发奇想的力量”是指在科技创新过程中,人们突然涌现的创新思维和想象力所带来的巨大影响。这种力量推动了人类社会的进步,使科技从看似遥不可及的概念变为日常生活中不可或缺的部分。描述中提到的江苏省...

    突发奇想利用51输出PWM

    #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:背书时突发奇想

    assistant-for-reciting-the-English-text 背书时的突发奇想 目前还不能批改,不过大概晚上就可以了

    数字旋转方阵(java)

    在本实验中,任务是创建一个Java程序,用于输出顺时针旋转的数字方阵。这个方阵的特性是从中心开始,数字按照顺时针方向填充。给定的代码片段是用C++编写的,但我们可以将其转换为Java语言,并解释其工作原理。...

    CHAT GPT能带来什么颠覆性改变?

    今天突发奇想,跟ChatGPT进行了一场坦诚的对话。 第一从GPT-4的视角,看到它是如何看待:ChatGPT等AI工具的涌现,对我们工作、生活、赚钱机会带来的影响。 Q1:使用ChatGPT能获得巨大提升的10类人群 Q2:ChatGPT的...

    其他类别JS+Flash让网页元素发光的插件 glow! 0.1-glow.zip

    前两天突发奇想,能不能让网页上的元素很容易的发光?结果正好发现flash里面有这样的滤镜。于是就硬着头皮写了个flash,实现了发光flash的动态生成。再结合javascript实现定位,把发光的flash放到真实的dom后面。...

    Scratch 休闲游戏:像素小鸭换衣

    我便突发奇想,为像素小鸭“换衣服”。鼠标点击衣服,然后拖到鸭子身上。此后仍有作品或有趣游戏,请关注原作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快来评论...

    C++和python代码实现朗读文本的功能

    突发奇想,好多小说软件上的听小说功能都是收费的,咱们写个小程序读一读,岂不是很哇塞! 看了一些资料,这里给大家分享出来,已经测试可以用。 C++代码和python代码实现对文本的朗读功能,代码比较简单,仅供参考...

    第108阶

    给大家无聊的时候玩玩

    JS+Flash让网页元素发光的插件 glow! 0.1-glow.zip

    前两天突发奇想,能不能让网页上的元素很容易的发光?结果正好发现flash里面有这样的滤镜。于是就硬着头皮写了个flash,实现了发光flash的动态生成。再结合javascript实现定位,把发光的flash放到真实的dom后面。...

    java云盘后端服务器+前端electron前后端分离式+简单部署教程

    云盘源码java后端服务器+前端electron前后端分离式自从学习了一点点electron基础命令(也就是几个标准单词),我就突发奇想,想写一款桌面基本的应用,但是也不知道该写什么demo,然后就这样子,想啊想…,直到发生了...

    网站图片下载小程序

    高中数学要学习,资料难下载?没关系,“网站图片下载器”帮您将人民...无奈工作几年学的都还给了老师,于是突发奇想做一个小程序把高中数学下载本地,再来好好复习。 本系统只供个人学习和交流用,请尊重原著版权。

    js天气预报

    这几天突发奇想,突然想自己写一个js跨域访问天气的接口然后实现天气预报功能的小例子 但是jquery跨域访问的时候出现了点问题 上csdn上晃悠了一大圈发现大多是答非所问 不少东西花积分下载之后 例子里面根本就只提供...

    linux 定时发送邮件 应用sendmail技术

    由于自己记性太差,很难记住朋友的生日,所以突发奇想,写了个简单的shell程序,主要目的就是为了能在固定的节日(如:圣诞、元旦等,可以指定)和朋友生日的时候自动给朋友发送祝福信件,同时密送给自己,程序虽然...

Global site tag (gtag.js) - Google Analytics