- 论坛徽章:
- 2
|
回复 1# donglongchao
我也觉得应该这样。
在有了f(o, a1, a2, ... ); 的情况下, 加入一个o.f(a1, a2, ... ); 本身就是很短视的设计。
凭什么让o处于特殊的地位? 就因为它是"所谓的对象"?
lua在这点上更明显。
若o是一个table, o.f是 o["f"]的同义词。
若f是一个函数, 就可以:
f = o.f;
f( a1, ... o, ... , a2 ... ); //o并不一定是第1个参数
当o是第1个参数的时候:
f(o, a1, a2, ... );
可以使用这样的语法:
o:f(a1, a2, ... );
也就是说函数从根本上讲, 是free function, 而不是member function。
o@f 这种调用记法只是一种语法糖
这样的设计会简化很多问题。
C++没有这样设计, 而是真正支持member function( 有个参数一定是隐式且固定 )。
x = X();
y = Y();
x.f();
y.g();
而在lua中:
x:f()
y:g()
x.f(y)
y.g(x)
python一样:
x.f()
y.g()
X.f(y)
Y.g(x)
C++是做不到的, 那个this参数一定是被隐式且固定的传入。
要选择不同的? 要么用汇编, 要么写一个转发函数:
class X
{
f()
}
F(X* x) { reutrn x->f(); }
因为C++加入了member function这样憋足的设计, 又不得不加入pointer to member function。
写一个callable, 要同时考虑pointer to function和pointer to member function。
这是主要麻烦之一。
主要麻烦之二: f( a , b, ... ) 才是真正范化的记法, o.f( c, d, ...) 不是。
如果有2个以上的"对象"怎么办?
C++有一个multimethod的draft, 引入新的记法以支持多分派:
void f(virtual X&, virtual Y&, ... );
看到没, 终究还是回到了free function。
Java和C#更离谱, 将free function都淘汰了。
class Program { static void Main
啥狗屁东西。
Math.abs 狗屁。
无妨, 本来这2语言也就是快餐+短视的。
C#还支持一种叫extension method还是别的什么名字来着。
class X
{
R f() { ... }
}
然后是怎样一个语法忘记了, 大致是
extension
{
static R g(X x, ... );
}
X x = new X();
x.f( a, b, ... );
extension.g(x, a, b, ... );
// 然后又有个什么语法
using extension还是什么来着, 就可以:
x.g( a, b );
无聊。
我认为, 语言直接支持free function, 且只有free function。
这样, 设计callable的时候少很多麻烦。
然后支持一种"函数调用的中缀记法" —— 可以将函数写在参数之间。
这样根本就不需要pointer to member function(或者新的multimethod记法)或者是extension。
而且, 是比它们更范化的设计: "特殊的对象"可以有多个, 且位置不定。
比如:
f( a, b, c ,... );
可以记为(仅仅是记法不同):
a@f( b, c, ... );
(a,b)@f( c, ... );
(a,c)@1,3->f(b);
等等。
如果将@理解为., 那第1种就是所谓的member function。
第2种直接支持multi method且突出多态对象。
第3种可以玩一些有趣的变化, 要演示代码就多了, 不写了。 |
|