最近在为dex-理想中的编程语言模型(https://github.com/dexlang/dex)整理一些资料
发现C/C++的函数申明语法真的很奇怪:
golang已经在官方blog详细说明为什么要改掉C的函数声明语法
https://blog.golang.org/gos-declaration-syntax
大意如下:
C的函数声明语法:
retType funcName(paras){}
函数指针申明语法:
int (*fp)(int a, int b);
如果参数带函数指针:
int (*fp)(int (*ff)(int x, int y), int b)
如果去掉参数中的函数名:
int (*fp)(int (*)(int, int), int)
如果返回值是个函数指针:
int (*(*fp)(int (*)(int, int), int))(int, int)
这个奇怪的东西已经没有地球人能够认出来是个函数申明了。
而go的函数声明语法:
func funcName(paras) retType
相应的参数和返回值带函数申明的语法都非常清晰明了:
f func(func(int,int) int, int) int
f func(func(int,int) int, int) func(int, int) int
闭包调用语法也一目了然:
sum := func(a, b int) int { return a+b } (3, 4)
另外,在C++的模板申明语法里,也发现了奇怪的地方:
函数模板语法:
template<typaname T> int MyFunc(T a){ ... }
模板类声明语法:
template<typaname T> class MyClass{ ... }
模板类中的关键字class明确可以看出这是一个类申明
而模板函数申明语法,却没法通过关键字得出这是一个模板函数的声明语法。
而相应的,如果用golang的函数声明语法,模板类和模板函数的声明语法大致应该是这个样子:
template<typaname T> func MyFunc(T a) int{ ... }
template<typaname T> class MyClass{ ... }
可以发现,这两种模板的声明语法居然可以出奇的一致:
template<T> templateType(keyword) templateName ...
由此,可以得出结论,C/C++函数申明是一种奇怪的语法,经不起各种语法组合的考验,是一种一直被错爱的语法,应该坚决舍弃。