阁下可知文言编程之精妙?文言文亦能编程!此诚年度最骚语言也,数天6K星...
點擊上方 "程序員小樂"關注,?星標或置頂一起成長
每天凌晨00點00分,?第一時間與你相約
每日英文
Try to hold the right hand with your left hand, and gave yourself most simple warmth. we should learn to get it by ourselves instead of craving for warmth from others.
試著用左手握住右手,給了自己最簡單的溫暖,不再奢求別人的給予,開始學著自己給自己。
每日掏心話
人最大的幸福是有人可以依賴,但人最大的不幸則是過份依賴某個人。
來自:量子位 報道 | 公眾號 QbitAI?|?責編:樂樂
程序員小樂(ID:study_tech)第 720 次推文? ?圖片來自網絡
往日回顧:面試官問我:new 一個對象的過程中發生了什么?我竟然回答不上來...
? ?正文? ?
同學,你可知如何用文言文輸出“Hello World”?
請君睜圓雙眼注視于此:
△?右邊一頓輸出
吾有一言。曰「「問天地好在。」」。書之。
卻為何輸出了三遍?
只因有for循環,寫作“為是「甲」遍…云云”。甲等于三,便要問三次好。
這騷之過極的文言文編程語言,來自CMU本科生Huang Lingdong。
可編譯成Javascript,也可編譯成Python,亦有線上編輯器 (IDE) 可直接玩耍。
項目文理兩開花,已于GitHub摘得6000星,且圍觀眾人皆有話說。
譬如,妒少年之才華:
譬如,點未來之方向:
中科院計算所研究員劉群老師亦感嘆:
當下,我等便前去觀膜一番,探索此語言藏有何種天地精華。
文言文編程“黑話”
Huang Lingdong同學應該是讀過《易經》,畢竟易經是最早論述二進制的古書。他用易經的陰和陽代表布爾變量中的0和1。
“吾有”系列則被用來做定義:
吾有一數是定義int變量;
吾有一爻是定義布爾變量;
吾有一言是定義字符串;
吾有一術是定義函數;
吾有一列是定義數組;
……
一般的編程里,循環判斷有if、while、for,文言文編程在這件事上更是變化無窮。下面就是一段文言文書寫的判斷語句:
若三弗大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。
翻譯過來就是:
if(3<=5){return?"of?course"} else{return?"no?way"}也許你會覺得if…else…語句用文言文太啰嗦,但是常用的for循環,用文言文表達卻更為簡潔。
為是百遍。?? 云云。
它的意思是:
for?(var?i?=?0;?i?<?100;?i++){?...?}如果需要判斷某個變量human是否在world中,我們一般用for (var human of world),初學者看到for的這種用法可能會很困惑,而文言文的表示更接近普通人的理解。
凡「天地」中之「人」。?? 云云。
古有《易經》,今有金庸小說,在展示定義函數的時候,Huang同學又皮了一下:
吾有一術。名之曰「六脈神劍」。欲行是術。必先得六數。曰「甲」。曰「乙」。曰「丙」。曰「丁」。曰「戊」。曰「己」乃行是術曰。??是謂「六脈神劍」之術也。
這里Huang同學將函數名定義為“六脈神劍”,這個函數總共有6個輸入。
funcion?f(a,b,c,d,e,f){…}還有更多好玩的函數定義:
怎樣用文言文編程
看完文言文編程的基本語法后,我們來看看怎么用它來解決一些基本的問題。
比如求100以內的素數,我們會用到一種“埃氏篩”(Sieve of Eratosthenes)算法:
看一下運行結果:
二。三。五。七。一十一。一十三。一十七。一十九。二十三。二十九。三十一。三十七。四十一。四十三。四十七。五十三。五十九。六十一。六十七。七十一。七十三。七十九。八十三。八十九。九十七
你看懂是什么意思了嗎?編譯器翻譯成JavaScript就是:
var?AI1SHI4SHAI1?=?()?=>?0; AI1SHI4SHAI1?=?function(JIA3)?{var?YAN3?=?[];for?(var?_rand4?=?0;?_rand4?<?JIA3;?_rand4++)?{YAN3.push(true);};var?_ans154?=?JIA3?/?2;var?JIA3BAN4?=?_ans154;var?WU4?=?2;while?(true)?{if?(WU4?==?JIA3BAN4)?{break;};var?XU1_?=?2;while?(true)?{if?(XU1_?==?JIA3BAN4)?{break;};var?_ans155?=?WU4?*?XU1_;var?HE2?=?_ans155;if?(HE2?<=?JIA3)?{YAN3[HE2?-?1]?=?false;}?else?{break;};var?_ans156?=?1?+?XU1_;XU1_?=?_ans156;};var?_ans157?=?1?+?WU4;WU4?=?_ans157;};var?ZHU1SU4?=?[];var?WU4?=?2;while?(true)?{if?(WU4?==?YAN3.length)?{break;};var?_ans158?=?YAN3[WU4?-?1];var?SU4YE2?=?_ans158;if?(SU4YE2)?{ZHU1SU4.push(WU4);};var?_ans159?=?1?+?WU4;WU4?=?_ans159;};return?ZHU1SU4 }; var?_ans160?=?AI1SHI4SHAI1(100); console.log(_ans160);文言文編程不僅能輸出簡單的結果,連文字圖(ASCII Art)都可以用文言文畫出來,分形問題中著名的“曼德博集合”,用中文畫出來是這樣:
△用中文畫出的曼德博集合
你以為這就是編譯結果的最終形態了?錯錯錯!
項目文件還有個腳本src/render.js,它可以把程序渲染成古代書籍的樣子。把O’Reilly系列圖書印刷成古代線裝書,真是想想就很激動啊。
安裝與使用
文言文編程只需將repo下載到本地,而且本地已經安裝Node,就能立即使用。現在它支持將wenyan lang轉換成JavaScript和Python:
./build/wenyan.js examples/helloworld.wy -o helloworld.js在這段命令中,如果不指定語言,程序將自動轉化為JavaScript,若想轉化成Python,請加入參數“—lang py”或是“-l py”。
用戶也可以自行編譯二進制文件。如果你只想嘗嘗鮮,在線IDE也是個不錯的選擇。
何出此“言”
至于,為何要炮制一門文言編程語言,少年為項目寫有一序,由此可窺一二 (后有解讀) :
夫唐、虞之世,結繩而足治,屈指而足算。是時豈料百代之後,計算機械之巧,精於公輸之木鳶,善於武侯之流馬;程式語言之多,繁若《天官》之星宿,奇勝《山經》之走獸。鼠、蟹、鑽、魚,或以速稱。蛇、象、駱、犀,各爭文采。方知鬼之所以夜哭,天之所以雨粟。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。嗟予小子,遂有斯志。
然則數寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羈于遠邦,兩耳久曠于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故希孟不慚年少,莊生不望無涯。乃作斯言。誠未能嘔瀝長吉之心血,亦庶幾免於義山之流沫。既成之後,復學干將鑄劍而自飼,越王嚐糞而當先。自謂偶追《十書》之筆意,但恨少八家之淋漓。此子山所謂士衡撫掌而甘心,平子見陋而固宜。然則雖實覆甕之質,尚存斧正之望;雖乏呂相之金,易字之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。
文中典故之多,恐無法在此一一注釋,便以劃重點之法,粗粗領會其意味,并簡要傳達為白話:
上古人類結繩記事,不會想到后代竟然發明了計算機。今天編程語言眾星閃耀,只是沒有人用文言編程。我人在國外,想念這些古典的言語,同時又擅長編程又有頭發,決定為開源事業貢獻一份力量。
注:如想查看所有典故,請前往項目頁,出處皆有維基百科鏈接。
量子位循蛛絲馬跡,得知少年名叫Huang?Lingdong,來自卡耐基梅隆大學,如今大四,明年即將畢業。高中則畢業自上海世界外國語中學。
黃姓少年一路腦洞盛開,時常開發畫風清奇之項目,量子位也曾為其另一項目撰文:
任君信筆涂鴉,皆可化作夢境中之角色,生龍活虎,與其他人物一同玩耍游蕩。如百鬼夜行之雄風。
而文言文編程語言,大抵是少年迄今最為驕傲且最為矚目之成就。
各位可速速前往吸之,定然無法自拔。
傳送門
項目代碼:
github.com/LingDong-/wenyan-lang
項目主頁:
wenyan-lang.lingdong.works/
線上IDE試玩:
wenyan-lang.lingdong.works/ide.html
個人主頁:
lingdong.works/
歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。
歡迎各位讀者加入程序員小樂技術群,在公眾號后臺回復“加群”或者“學習”即可。
猜你還想看
阿里、騰訊、百度、華為、京東最新面試題匯集
深入分析 Session 和 Cookie,看這篇就對了!
動畫演繹Java常用數據結構(建議收藏)
漫談Serverless、微服務、分布式和單體四種主流軟件架構
關注「程序員小樂」,收看更多精彩內容嘿,你在看嗎?
總結
以上是生活随笔為你收集整理的阁下可知文言编程之精妙?文言文亦能编程!此诚年度最骚语言也,数天6K星...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 串口类QSerialPort 使用
- 下一篇: 测试Markdown