【发布时间】:2011-07-16 06:26:36
【问题描述】:
我正在设计我自己的编程语言(称为 Lima,如果您在 www.btetrud.com 上关心它),并且我正在努力思考如何实现运算符重载。我决定在特定对象上绑定运算符(它是一种基于原型的语言)。 (它也是一种动态语言,其中 'var' 就像 javascript 中的 'var' - 一个可以保存任何类型值的变量)。
例如,这将是一个带有重新定义的 + 运算符的对象:
x =
{ int member
operator +
self int[b]:
ret b+self
int[a] self:
ret member+a
}
我希望它的作用相当明显。当 x 既是右操作数又是左操作数时定义运算符(使用self 表示这一点)。
问题是当你有两个对象以像这样的开放式方式定义一个运算符时该怎么办。例如,在这种情况下你会做什么:
A =
{ int x
operator +
self var[b]:
ret x+b
}
B =
{ int x
operator +
var[a] self:
ret x+a
}
a+b ;; is a's or b's + operator used?
所以这个问题的一个简单答案是“好吧,不要做出模棱两可的定义”,但它并不是那么简单。如果您包含一个具有 A 类型对象的模块,然后定义了 B 类型对象怎么办。
你如何创建一种语言来防止其他对象劫持你想对你的操作符做的事情?
C++ 将运算符重载定义为类的“成员”。 C++ 如何处理这样的歧义?
【问题讨论】:
-
另外,如果你有一个
var关键字,我希望你不会犯和 JavaScript 一样的错误,并且默认情况下将变量设置为全局变量,除非声明为var。这会导致很多错误(您忘记使用var的任何变量都会自动与程序中的所有其他同名变量共享)。 -
你必须声明它,如果不是它是一个错误。所以不要犯同样的错误; )
-
我不太清楚你对这门语言的真正目标是什么。你建议你对性能感兴趣,但听起来你在打鸭子,这通常不利于性能。我喜欢
a < b < c的链接,但一眼看去,我没有注意到您如何处理结果可能大于操作数类型的算术运算。 -
@supercat 目标是两全其美。主要是最大限度地提高开发效率,并使用用户创建的优化模块以完全自动化的方式最大限度地提高性能。程序员有权定义程序的预期输入(命令行、网络调用等),从而为优化器提供正常工作所需的信息。至于算术运算,lima 中的值实际上没有“类型”,并且数字大小没有上限(除了典型的内存限制)。
-
欢迎在文档底部发表评论:btetrud.com/Lima/Lima-Documentation.html 而不是 SO
标签: overloading operator-keyword