您的位置:首頁>設計>正文

怎麼用中文設計程式設計語言?

因為電腦科學起源于西方, 現今各種程式設計語言都是用英文, 如果用中文設計一種語言可行嗎?有大神是否想過怎麼設計呢?讓我們來看看大佬是怎麼回答的。

作者:NightyNight

連結:https://www.zhihu.com/question/66370337/answer/241622510

著作權歸作者所有。 商業轉載請聯繫作者獲得授權, 非商業轉載請注明出處。

好, 放劍制。

<img src="https://pic2.zhimg.com/50/v2-17ae2138ae63719aeae02582bc9f5669_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic2.zhimg.com/v2-17ae2138ae63719aeae02582bc9f5669_r.jpg">

來, 我們來寫文言文。

首先下一個Parser(Python 3.6)框架。 放心我不是調包黨, 我是造輪子的。

這個框架真的很有趣的(吃我安利!), 你要是有興趣可以問我實現原理, 可以看我文章。

pip install -U EBNFParser

(剛剛花時間支援了中文parser名...不然我早就來回答了。 吐槽一下, shutil包真的很玄幻。

然後, 這裡有一個檔。

很騷氣的文言程式設計文法(對不齊是因為unicode字元的鍋。 。 )

複製它, 找個地方, 放著。

然後在這裡打開命令列。

parserGenerator.py grammar ./parser.py

然後就可以開始玩了。

python testLang.py 語句 "[吾身]乃劍所[天成]。 " -o 吾身乃劍所天成python testLang.py 語句 "血作為[鐵潮];心作為[琉璃]。 " -o 血潮為鐵, 心為琉璃....

詳見travis測試檔

結果放點圖,

現在是ast。

(這個圖比較舊, 如果你認真看會發現分號被當成了變數(概念), 因為token沒對。 吃飯後更正

<img src=http://post.xxxssk.com/api/"https://pic3.zhimg.com/50/v2-e58033b6dccbfc79a039ebe970431aba_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic3.zhimg.com/v2-e58033b6dccbfc79a039ebe970431aba_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic2.zhimg.com/50/v2-d13819736f5b8344815ffa7859dfbab1_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic2.zhimg.com/v2-d13819736f5b8344815ffa7859dfbab1_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic4.zhimg.com/50/v2-21ba51a50c7e24af8243d2a8f27b651b_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic4.zhimg.com/v2-21ba51a50c7e24af8243d2a8f27b651b_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic4.zhimg.com/50/v2-a57058dffd0c44d0df47b81f0ef06907_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic4.zhimg.com/v2-a57058dffd0c44d0df47b81f0ef06907_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic4.zhimg.com/50/v2-b0931966fd0030f9380f3f1ee8bab023_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic4.zhimg.com/v2-b0931966fd0030f9380f3f1ee8bab023_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic3.zhimg.com/50/v2-65a00600b2dc86f857b5251ba3de6ec6_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic3.zhimg.com/v2-65a00600b2dc86f857b5251ba3de6ec6_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic2.zhimg.com/50/v2-a6e5f599c528608532d8d5bc73a14bed_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic2.zhimg.com/v2-a6e5f599c528608532d8d5bc73a14bed_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic1.zhimg.com/50/v2-743e28b85978aae6f7c6a694e8f599b0_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic1.zhimg.com/v2-743e28b85978aae6f7c6a694e8f599b0_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic1.zhimg.com/50/v2-e255a59fc764cc2b4df7dbe5135defd4_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic1.zhimg.com/v2-e255a59fc764cc2b4df7dbe5135defd4_r.jpg">

檔案名叫無限劍制.sh。

其實這本質上是一個函數單參數,然後有兩種倒裝運算的Lisp。

下午有課,解譯器等下。

語法是這樣的。

lambda定義是用由開頭,後面跟一個字,或者一個方括號括起來的詞,表示參數,再後面跟一個具象,你把它理解為運算式即可。

調用函數的形式是以以字開頭,後面跟參數,參數是一個具象(剛剛發現上面寫錯了。上面的圖其實用的是概念這個Ast,是錯的,但是生成Ast階段是不報錯的,在Ast解析時,這個位置的類型不是具象的話,會拋出異常)。再跟一個運算式,這個運算式得到的結果將調用前面這個參數。所有的函數都是單參數的,很洋氣:)

然後倒裝句有於、所、作為三種,其中於和所的優先順序是一樣的,作為比他們靠後。

[吾身](乃( 劍(所(天成)) ) ) # 劍所天成是會結合成一個運算式,然後用被乃調用(人)作為((天)所(寵倖)) # 這裡就是優先順序的體現了。

Emmmmm

想了一晚上還是加一句... 可以的話,github上給這項目加個星吧。

thautwarm/EBNFParser

畢竟也確實能方便到有些工作。個人也覺得挺好玩的。

以下原文

這個問題突然提起了我對所謂中文程式設計的興趣。之前見過的都是些符號替換,實在沒有半點興趣。

然後我今天早上看到大v輪的答案,他說把token搞成單一字元拆分(這個其實很有趣),然後給了自己的語言的例子。然後我來了一點靈感。

我想理想中大概是這樣的

>> 以我為0,以你為1,問以我加你是為你?=> 是>> 有年為天,幹,地,支 #容器>> 以吾之事為由某年言若某年是為天則1而若某年是為地則2否則3 # let一個lambda# 以 吾之事 為 由 某年 言 若某年是為天 則1 而若某年是為地 則2 否則3 :)# 這個語法在我後來的實現裡改了,詳見更新寫的>> 以年之天行吾之事=> 1

上面這些都很好做(吃完飯放解譯器),問題在於這些例子:

以1加2

以人餘聖

解析時,怎麼判斷1加2不是符號,以及人餘妖不是符號。怎麼把他們解析成

以(1)(加)(2)

以(人)(餘)(聖)

我解決思路應該非常清真,全部單子化

以具象行具象,等於

具象(具象)

那麼上面的以1加2就是

以1行以2行加

加 :: Int -> Int -> Int

好的,答題前其實還沒想清楚,答題後已經搞定。

對於web前端的學習有不懂的,或者不知道學習路線,不知道學習方法,不知道該如何扎實能找到工作的朋友,我還是要推薦下我自己建的前端學習群:523218370,首先你要是前端黨,其次不管你是小白還是大牛,我都挺歡迎,小白嘛,主動點多問問題也就學好了,群裡每天分享乾貨,包括我自己最近花了一星期整理的一份適合2017年自學的最新web前端資料,送給大家,歡迎初學和進階中的小夥伴。

<img src=http://post.xxxssk.com/api/"https://pic1.zhimg.com/50/v2-743e28b85978aae6f7c6a694e8f599b0_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic1.zhimg.com/v2-743e28b85978aae6f7c6a694e8f599b0_r.jpg">

<img src=http://post.xxxssk.com/api/"https://pic1.zhimg.com/50/v2-e255a59fc764cc2b4df7dbe5135defd4_hd.jpg" data-rawwidth="1366" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1366" data-original="https://pic1.zhimg.com/v2-e255a59fc764cc2b4df7dbe5135defd4_r.jpg">

檔案名叫無限劍制.sh。

其實這本質上是一個函數單參數,然後有兩種倒裝運算的Lisp。

下午有課,解譯器等下。

語法是這樣的。

lambda定義是用由開頭,後面跟一個字,或者一個方括號括起來的詞,表示參數,再後面跟一個具象,你把它理解為運算式即可。

調用函數的形式是以以字開頭,後面跟參數,參數是一個具象(剛剛發現上面寫錯了。上面的圖其實用的是概念這個Ast,是錯的,但是生成Ast階段是不報錯的,在Ast解析時,這個位置的類型不是具象的話,會拋出異常)。再跟一個運算式,這個運算式得到的結果將調用前面這個參數。所有的函數都是單參數的,很洋氣:)

然後倒裝句有於、所、作為三種,其中於和所的優先順序是一樣的,作為比他們靠後。

[吾身](乃( 劍(所(天成)) ) ) # 劍所天成是會結合成一個運算式,然後用被乃調用(人)作為((天)所(寵倖)) # 這裡就是優先順序的體現了。

Emmmmm

想了一晚上還是加一句... 可以的話,github上給這項目加個星吧。

thautwarm/EBNFParser

畢竟也確實能方便到有些工作。個人也覺得挺好玩的。

以下原文

這個問題突然提起了我對所謂中文程式設計的興趣。之前見過的都是些符號替換,實在沒有半點興趣。

然後我今天早上看到大v輪的答案,他說把token搞成單一字元拆分(這個其實很有趣),然後給了自己的語言的例子。然後我來了一點靈感。

我想理想中大概是這樣的

>> 以我為0,以你為1,問以我加你是為你?=> 是>> 有年為天,幹,地,支 #容器>> 以吾之事為由某年言若某年是為天則1而若某年是為地則2否則3 # let一個lambda# 以 吾之事 為 由 某年 言 若某年是為天 則1 而若某年是為地 則2 否則3 :)# 這個語法在我後來的實現裡改了,詳見更新寫的>> 以年之天行吾之事=> 1

上面這些都很好做(吃完飯放解譯器),問題在於這些例子:

以1加2

以人餘聖

解析時,怎麼判斷1加2不是符號,以及人餘妖不是符號。怎麼把他們解析成

以(1)(加)(2)

以(人)(餘)(聖)

我解決思路應該非常清真,全部單子化

以具象行具象,等於

具象(具象)

那麼上面的以1加2就是

以1行以2行加

加 :: Int -> Int -> Int

好的,答題前其實還沒想清楚,答題後已經搞定。

對於web前端的學習有不懂的,或者不知道學習路線,不知道學習方法,不知道該如何扎實能找到工作的朋友,我還是要推薦下我自己建的前端學習群:523218370,首先你要是前端黨,其次不管你是小白還是大牛,我都挺歡迎,小白嘛,主動點多問問題也就學好了,群裡每天分享乾貨,包括我自己最近花了一星期整理的一份適合2017年自學的最新web前端資料,送給大家,歡迎初學和進階中的小夥伴。

Next Article
喜欢就按个赞吧!!!
点击关闭提示