手寫編程語言-如何為 GScript 編寫標準庫( 二 )

主要就是借助了原始的數組類型以及 toByteArray/toString 字節數組和字符串的轉換函數實現的 。
class Strings{// concatenates the elements of its first argument to create a single string. The separator// string sep is placed between elements in the resulting string.string join(string[] elems, string sep){if (len(elems) == 0) {return "";}if (len(elems) == 1) {return elems[0];}byte[] bs = toByteArray(sep);int n = len(bs) * (len(elems) -1);for (int i=0; i < len(elems); i++) {string s = elems[i];byte[] bs = toByteArray(s);n = n + len(bs);}StringBuilder sb = StringBuilder();sb.grow(n);string first = elems[0];sb.writeString(first);string[] remain = elems[1:len(elems)];for(int i=0; i < len(remain); i++){sb.writeString(sep);string r = remain[i];sb.writeString(r);}return sb.String();}// tests whether the string s begins with prefix.bool hasPrefix(string s, string prefix){byte[] bs = toByteArray(s);byte[] bp = toByteArray(prefix);return len(bs) >= len(bp) && toString(bs[0:len(bp)]) == prefix;}}Strings 工具類也是類似的 , 都是一些內置函數的組合運用;
在寫標準庫的過程中還會有額外收獲,可以再次閱讀一遍 Go 標準庫的實現流程,換了一種語法實現出來,會加深對 Go 標準庫的理解 。
所以歡迎感興趣的朋友向 GScript 貢獻標準庫,由于我個人精力有限,實現過程中可能會發現缺少某些內置函數或數據結構,這也沒關系 , 反饋 issue 后我會盡快處理 。

由于目前 GScript 還不支持包管理,所以新增的函數可以創建 Class 來實現,后續支持包或者是 namespace 之后直接將該 Class 遷移過去即可 。
本文相關資源鏈接
  • GScript 源碼:https://github.com/crossoverJie/gscript
  • Playground 源碼:https://github.com/crossoverJie/gscript-homepage
  • GScript Docker地址:https://hub.docker.com/r/crossoverjie/gscript

推薦閱讀