而這么長的時間里面,葉新晨也是在解決上面這個BUG的嘗試中,才發覺TCL這種語言先天不足。
因為一旦程序邏輯復雜,它那變量無需聲明、變量無類型等等對初學者來說不可多得的“優點”就成了致命缺陷。
這會讓人不得不付出比C/C++之類“正規語言”多得多的努力去跟蹤去區分數據類型。
而且為了避免錯誤,葉新晨也不得不把數據類型也“打包”進數據,然后在程序入口寫代碼分辨它——尤其是,這些數據類型還是動態的,是從輸入數據識別出來的;不結合輸入誰都不知道某個數據在某個時刻會是什么。
這使得代碼幾乎無法靜態分析;而測試用例很難覆蓋每一條執行路線——不要忘了,這個程序“吃”進去的數據是多變的,幾乎不可能列出所有情況。
這使得葉新晨又產生了一個想法。那就是,要給它增加一些功能,把專業語言的coredump、變量先聲明后使用等等功能搞出來,使得出現類似高危行為時可以得到提醒甚至直接對相關不良行為報錯。
當然,葉新晨是沒有這么自覺的,只是葉新晨跟他們說了,他們立刻就私發了一個六萬的懸賞讓葉新晨幫忙!
原本葉新晨是不愿意的,因為那七天已經夠累的了,晚上都熬到凌晨三四點,每天就睡三四個小時,這讓葉新晨深刻的明白為什么程序員容易頭禿了。
雖然葉新晨不愿意,但是奈何對面又把這個六萬的懸賞又加了四萬……
嗯,葉新晨覺得這個功能也不是那么難,熬夜那就熬夜唄……
所以葉新晨也是立刻就進入狀態了,TCL號稱一切都是字符串,這甚至可以把系統庫函數/運算符/關鍵字都給rename掉,然后自己寫一個替代品。
這給了它的用戶極大的自由度。
比如iTCL就是用命名空間模擬的面向對象語法——這種語言仍然是面向過程的;但你可以自己定義一個class關鍵字(實質上是一個過程),把它變得和一個真正的面向對象語言幾乎一模一樣。
葉新晨首先盯上的是它的過程/函數聲明關鍵字proc。
在這種語言里,你聲明一個函數fun,格式就是
procfun(arg){
#body
}
它看似一個關鍵字;但TCL里一切都是字符串,因此這個proc實質上是個函數,它接受函數名、參數列表、函數體三個參數……
葉新晨也是把系統的proc改名叫_sys_proc,自己寫了個proc;這樣當用戶聲明一個函數/過程時,他的聲明將以字符串格式先傳給他。
這樣子的話葉新晨就可以做一些修改,把一些邏輯插進用戶編寫的代碼中,然后再把修改后的代碼傳給_sys_proc。