最近在爲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++函數申明是一種奇怪的語法,經不起各種語法組合的考驗,是一種一直被錯愛的語法,應該堅決捨棄。