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