在上一篇終于實現了一門屬于自己的編程語言 介紹了自己寫的編程語言 GScript ,在文中提到希望最終可以使用 GScript 開發一個網站。
到目前為止確實是做到了,首頁地址:
https://gscript.crossoverjie.top/index
要稱為一個網站確實有點勉強,不過也是一個動態網頁,因為返回的是 HTML,所以在當前階段只要不嫌麻煩其實也能寫一個“合格”的網站,有點像以前我們學習 Java 時的 servlet。
該頁面的源碼地址在這里: https://github.com/crossoverjie/gscript-homepage
其實總共也就40來行代碼:
class GScript{
string author;
string[] features;
string since;
GScript(string a, string[] f, string s){
author=a;
features=f;
since=s;
}
}
func (HttpContext) index(HttpContext ctx){
string[] features={"statically", "strongly"};
GScript gs=GScript("crossoverJie",features, "2022");
string j=JSON(gs);
println(j);
string local=getCurrentTime("Asia/Shanghai","2006-01-02 15:04:05");
println("local=" + local);
string html=^
<html>
<title>GScript</title>
<pre>
_ _
___ ___ ___ ___|_|___| |_
| . |_ -| _| _| | . | _|
|_ |___|___|_| |_| _|_|
|___| |_| v0.0.7
^+ j +^
</pre>
<h1>current ^+ local +^</h1>
<p><a href="https://github.com/crossoverjie/gscript-homepage">GScript-homepace source code</a></p>
</html>
^;
ctx.HTML(200, html);
}
httpHandle("GET", "/index", index);
string[] args=getOSArgs();
if (len(args)==3){
httpRun(":" + args[2]);
}else {
httpRun(":8000");
}
全是利用 GScript 所提供的標準庫實現的,后文會詳細聊聊內置 HTTP 包。
下面重點來看看 v0.0.8 這個版本相較于上一個更新了哪些地方。
因為我是把自己當做一個開發者的角度去實現了一個 http 服務,同時還用 GScript 刷了兩道簡單的 LeetCode;為了讓這個過程更流暢,更符合一個現代語言的使用方式,所以本次真的更新不少東西。
刷題源碼:https://github.com/crossoverJie/gscript/tree/main/example/leetcode
大概如下:
其實從這些更新中也能看出,上個版本只是一個簡單能用的狀態,而現在這個版本已經可以拿來寫復雜邏輯了,當然目前還缺乏一些更友好的編譯提示以及運行時錯誤。
下面仔細聊聊一些更新內容。
首先是 any 通用類型,這個類似于 Java 中的 Object 和 Go 中的 interface{},極大的方便了我們編寫一些標準庫。
以之前內置的 hash 和 len 函數為例,需要對每種類型都實現一遍,非常麻煩而且毫無必要;現在只需要定義一次即可,代碼量直接省幾倍。
同理,之前實現的 Map 只支持存放 string 類型,現在便能存放任何類型的數據。
對 any 的實現過程感興趣的朋友,今后可以單獨分享一下。
寫 go 或者是 Java 的朋友應該知道,這兩門語言都無法對兩個對象進行運算,編譯器會直接報錯。
但在一些特殊場景下還是蠻好用的,于是我參考了 C# 的語法在 GScript 中也實現了。
class Person{
int age;
Person(int a){
age=a;
}
}
Person operator + (Person p1, Person p2){
Person pp=Person(p1.age+p2.age);
return pp;
}
Person operator - (Person p1, Person p2){
Person pp=Person(p1.age-p2.age);
return pp;
}
Person p1=Person(10);
Person p2=Person(20);
Person p3=p1+p2;
println("p3.age="+p3.age);
assertEqual(p3.age, 30);
聲明的函數名稱必須為 operator,之后跟上運算符便實現了重載。
支持的運算符有:+-*/ < >=<=>==。
當前版本中支持將對象、基本類型進行序列化,暫不支持反序列化為對象,但可以根據 JSON 字符串通過一定的語法查詢數據。
內置了兩個 JSON 相關函數:
// return JSON string
string JSON(any a){}
// JSON query with path
any JSONGet(string json, string path){}
class Person{
int age;
string name;
float weight;
bool man;
Person(string n, int a, float w, bool m){
name=n;
age=a;
weight=w;
man=m;
}
}
Person p1=Person("abc",10,99.99,true);
Person p2=Person("a",11,999.99,false);
string json=JSON(p1);
println(json);
// output:{"age":10,"man":true,"name":"abc","weight":99.99}
以這段代碼為例,調用 JSON 函數可以將對象序列化為 JSON 字符串。
class Person{
int age;
string name;
float weight;
bool man;
Person(string n, int a, float w, bool m){
name=n;
age=a;
weight=w;
man=m;
}
}
Person p1=Person("abc",10,99.99,true);
string json=JSON(p1);
println(json);
int age=JSONGet(json, "age");
println(age);
assertEqual(age,10);
使用 JSONGet 函數可以在一個 JSON 字符串中查詢任意的數據,這個功能是通過適配 XJSON 實現的,所以 XJSON 支持的查詢語法都能實現。
string j=^{"age":10, "abc":{"def":"def"},"list":[1,2,3]}^;
String def=JSONGet(j, "abc.def");
println(def);
assertEqual(def,"def");
int l1=JSONGet(j, "list[0]");
println(l1);
assertEqual(l1,1);
string str=^
{
"name": "bob",
"age": 20,
"skill": {
"lang": [
{
"go": {
"feature": [
"goroutine",
"channel",
"simple",
true
]
}
}
]
}
}
^;
String g=JSONGet(str, "skill.lang[0].go.feature[0]");
println(g);
assertEqual(g,"goroutine");
比如這樣復雜的嵌套 JSON,也能通過查詢語法獲取數據。
HTTP 包是本次升級的重點,標準庫中提供了以下函數和類:
// http lib
// Response json
FprintfJSON(int code, string path, string json){}
// Resonse html
FprintfHTML(int code, string path, string html){}
// path (relative paths may omit leading slash)
string QueryPath(string path){}
string FormValue(string path, string key){}
class HttpContext{
string path;
JSON(int code, any v){
string json=JSON(v);
FprintfJSON(code, path, json);
}
HTML(int code, any v) {
string html=v;
FprintfHTML(code, path, html);
}
string queryPath() {
string p=QueryPath(path);
return p;
}
string formValue(string key){
string v=FormValue(path, key);
return v;
}
}
// Bind route
httpHandle(string method, string path, func (HttpContext) handle){
// println("path="+path);
HttpContext ctx=HttpContext();
handle(ctx);
}
// Run http server.
httpRun(string addr){}
具體的使用流程:
在自己的 handle 中可以通過 HttpContext 對象拿到請求上下文,可以獲取請求參數以及響應數據。 具體使用示例可以參考這份代碼。
本次更新比我預期的要順利一些,因為語法樹和編譯器已經基本實現完畢,不會怎么改了,現在新增的特性無非就是運行時實現一些語法糖,大部分都是體力勞動;可能是新鮮感帶來的興奮劑效果,大部分時間都是痛并快樂著。
比如這兩天主要就是在修復多層 block 嵌套時遇到 return 語句無法正確返回的 bug,死活折騰了兩夜;終于在無數次分析 AST 找到了解決方案,現在想想確實還是相關經驗太少。
對這個 Bug 感興趣的朋友可以點個贊,后面可以分享一下。
下一階段重點就是將編譯信息好好整理,讓開發體驗更好。之后抽空再把 SQL 標準庫實現了,這樣就能愉快的 CURD了。
最后希望對該項目或者是編譯原理感興趣的朋友可以下載使用,提出寶貴意見,歡迎加我微信交流。
v0.0.8 下載地址: https://github.com/crossoverJie/gscript/releases/tag/v0.0.8
都訊記者黃良東8月26日是深圳經濟特區建立40周年。深圳作為全球城市經濟競爭力指數排名前五位唯一中國城市,迎來了中國特色社會主義的先行示范區和粵港澳大灣區的機遇。深圳的創新精神,使得在公共服務、產業發展、政府運營方面的探索與實踐一直走在全國前列,深圳的創新生態,推動深圳在探索數字經濟發展上走在世界前沿,并孵化了7家世界500強企業,26家全國500強企業。
7月17日(倒計時40天),華為聯合深圳特區報、南方都市報以及20多家深圳企業、機構、高校,包括比亞迪、創維、大疆創新、國信證券、哈爾濱工業大學(深圳)、華僑城、華潤置地深圳、平安智慧城市、鵬城實驗室、深圳北理莫斯科大學、深圳巴士集團、深圳地鐵、深圳大學、深圳國際會展中心、深圳航空、深圳機場、深圳萬科、深圳智慧城市集團、深圳職業技術學院、微眾銀行、香港中文大學(深圳)、招商蛇口等,共同發起“有你圳好,見證深圳經濟特區建立40周年”系列主題活動,以“數字深圳”為場景,包括線下創意展示、線上分享,借此表達我們是深圳創新的見證者和受益者,也是創新的建設者,我們一起成長、互相成就,構筑數字深圳。
一起來看看,20多家深圳企業、機構、高校對深圳的祝福。
深圳北理莫斯科大學:作為一所全新的學校落地南國鵬城,迎接來自世界各地的你們。這里是深圳,一個極具創新精神、年輕活力、包容開放的城市。我們新辦學,融合中俄教育,助你們新成長,智能未來等著你們去開拓,前進吧,少年。
OCT華僑城:作為中國唯一同時獲評“全國文化企業30強”“中國旅游集團20強”的企業,央企華僑城集團35年來秉承“優質生活創想家”理念,扎根深圳、面向全國,與城共進、與城共榮,為人民美好生活持續賦能。
香港中文大學(深圳):在這里,傳統與現代融合,國內與國際相聯接,立足深圳,面向粵港澳大灣區,攜手華為建設智慧校園,努力成長為享譽世界的中國一流學府,為師生提供更智慧、更包容、更個性化的學習體驗。
微眾銀行:作為國內首家互聯網民營銀行,微眾銀行深度擁抱互聯網的發展,踏浪而來。深圳的“智慧”已經滲入生活的方方面面,和小We一起為“數字之城”打call。
招商蛇口:四十年風雨同舟,招商蛇口見證和參與特區的開發與建設。通過“前港-中區-后城”綜合發展模式,招商蛇口助力深圳從城市功能升級、生產方式升級、生活方式升級,做“美好生活承載者”。
深圳地鐵:四十年來,深圳一直走在技術革新的最前端,深鐵與華為聯合打造數字地鐵,可實現各類設備、行車、客流、服務數據的匯聚、共享、分析、呈現,極大提升地鐵出行的便捷性和安全性,為市民創造更美好的“地鐵生活”。
深圳大學:伴深圳成長37年,深圳大學始終發揚“特區大學、窗口大學、實驗大學”的辦學特色,在信息時代迎接數字化轉型潮流,攜華為建設智慧校園的標桿,來深大,感受智慧校園的神奇魅力。
深圳智慧城市集團: 深智城全面聚焦“新基建”和數據要素市場化配置改革,圍繞數據全生命周期開展了融合韌性專網、泛在算力基礎設施、智慧城市數字底座以及數據場景實驗室等項目的建設和管理……致力于在數字世界打造一個更加繁榮的“數字特區”,讓城市更智慧,讓生活更美好。
深圳機場:與城市相伴而生的深圳機場時常出現在人們那些奮斗、奔波、相聚、重逢的珍貴回憶中。如今的深圳機場,在真情相伴的底色上,正悄然發生著“智”變。“一張臉”暢行無阻、全流程自助乘機,愿你們從機場運行、安全、服務各方面感受到“數字深圳”的智慧。
比亞迪:與你一起,堅守初心、向新而行。承載著每一個奮力拼搏的身影,感應著每一顆活力躍動的心臟,繼續朝著更智慧、更美好的生活駛進。
國信證券:攜手華為,重點關注新一代云數據中心、數據庫、網絡安全以及統一通信平臺等方面的建設,實現金融科技驅動業務發展,為用戶提供更智能、更有溫度的金融服務。
哈工大深圳:扎根南國鵬城,依托校本部深厚的學術積淀,我們與深圳共成長。在互聯網浪潮新時代,充分發揮新ICT技術建設智慧校園,為學生創造更智能、更個性化的學習體驗。
深圳職業技術學院:來自全國各地的你們齊聚深圳,恰逢深圳改革開放四十周年,讓我們共同見證。技能豐富的你們風華正茂、昂揚向上,同深圳一樣“敢為天下先”,因為你們,深職院和深圳將變得更加美好。
鵬城實驗室:深圳經濟特區將在這個盛夏正式步入不惑之年,站在下一個40年的新起點上,鵬城實驗室與深圳一起無懼挑戰、不畏失敗,以蓬勃朝氣,共建鵬城輝煌。
平安智慧城市:從平安國際金融中心眺望深圳,可一覽深圳四十年的巨大成就,深圳作為改革開放的窗口,迎來“當驚世界殊”的巨變,孕育了中國平安等領先企業。有你真好,深圳。
華潤置地:華潤置地以專業的城市運營能力,賦予城市每一寸土地新的價值。華潤置地牽手深圳,相互成就,共繪未來城市新藍圖。“有你圳好”就是華潤置地獻給深圳最好的禮贊。
除了無數扎根深圳的企業外,每一個深圳市民,都在見證著深圳從揚帆起航到銳意創新的四十年,也感受著更智慧,更有安全感、幸福感、更愜意的城市生活。7月18至19日,該活動將在深圳書城(中心城店)旁廣場南部集中展示,廣大市民可前往參觀并打卡深圳。
同時,華為與20多家參與機構在微信、微博等社交媒體上設置互動話題#有你圳好,見證深圳經濟特區建立40周年#。歡迎廣大市民轉發并留言分享你與深圳的故事,精彩留言將有機會被精選展示。
從中國改革開放的先鋒,到探索城市精細化管理的引領者,深圳一次又一次走在前列。華為將持續以5G、云計算、AI、大數據、物聯網等新ICT技術推動深圳的數字化水平和智能化發展,實現政務高效、社區智慧、交通發達、校園平安、就醫無憂,并把深圳可復制可持續的智慧城市模式帶到全世界。未來深圳及粵港澳大灣區一定是中國最活躍最發達的創新發動機,成為世界創新中心。
了解更多數字深圳的信息,請點擊https://e.huawei.com/topic/leading-new-ict-cn/index.html
或搜索關注華為企業業務微信、微博賬號。
.使用選擇器來插入內容
h2:before{
content:"前綴";
}
h2:after{
content:"后綴";
}
B.指定個別的元素不進行插入
h2.sample:before{
content:none;
}
2. 插入圖像
A.在標題前插入圖像文件
h2:before{
content:url(anwy.jpg);
}
B.將alt屬性的值作為圖像的標題來顯示(用不了)
img:after{
content:attr(alt);
display:block;
text-align:center;
margin-top:5px;
font-size:11px;
font-weight:bold;
color:black;
}
3. 插入編號
A.多個標題前加入連續編號
div:before{
content:counter(divCounter);
}
div{
counter-increment:divCounter;
}
B.在項目符號中追加文字
div:before{
content:"第"counter(divCounter)"段";
}
C.指定編號樣式、種類
div:before{
content:counter(divCounter,upper-alpha)'.';
color:blue;
font-size:16px;
}
D.編號嵌套
div:before{
content:counter(divCounter,upper-alpha)'.';
color:blue;
font-size:16px;
}
div{
counter-increment:divCounter;
counter-reset:subDivCounter;
}
p:before{
content:counter(subDivCounter)'.';
margin-left:15px;
font-size:12px;
}
p{
counter-increment:subDivCounter;
}
E.字符串兩邊添加文字嵌套符號
h3:before{
content: open-quote;
}
h3:after{
content: close-quote;
}
h3{
quotes:"【""】";
}
disc 點| circle圓圈 | square正方形 | decimal數字 | decimal-leading-zero 十進制數| lower-roman 小寫羅馬文字| upper-roman 大寫羅馬文字| lower-greek小寫希臘字母 | lower-latin小寫拉丁文 | upper-latin 大寫拉丁文| armenian亞美尼亞數字 | georgian喬治亞數字 | lower-alpha小寫英文字母 | upper-alpha大寫英文字母 | none無 | inherit繼承
*請認真填寫需求信息,我們會在24小時內與您取得聯系。