12月18日消息 有中國開發(fā)者上傳的文言文編程語言項(xiàng)目已經(jīng)在GitHub上摘得了5500星,你可知如何用文言文輸出“Hello World”?吾有一言。曰「「問天地好在?!埂?。書之。
據(jù)悉,該文言文編程語言來自CMU本科生Huang Lingdong??删幾g成Javascript,也可編譯成Python,亦有線上編輯器 (IDE) 可直接運(yùn)行。
GitHub地址:https://github.com/LingDong-/wenyan-lang
序
夫唐、虞之世,結(jié)繩而足治,屈指而足算。是時豈料百代之後,計(jì)算機(jī)械之巧,精於公輸之木鳶,善於武侯之流馬;程式語言之多,繁若《天官》之星宿,奇勝《山經(jīng)》之走獸。鼠、蟹、鑽、魚,或以速稱。蛇、象、駱、犀,各爭文采。方知鬼之所以夜哭,天之所以雨粟。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。嗟予小子,遂有斯志。然則數(shù)寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羈于遠(yuǎn)邦,兩耳久曠于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽(yù)。故希孟不慚年少,莊生不望無涯。乃作斯言。誠未能嘔瀝長吉之心血,亦庶幾免於義山之流沫。既成之後,復(fù)學(xué)干將鑄劍而自飼,越王嚐糞而當(dāng)先。自謂偶追《十書》之筆意,但恨少八家之淋漓。此子山所謂士衡撫掌而甘心,平子見陋而固宜。然則雖實(shí)覆甕之質(zhì),尚存斧正之望;雖乏呂相之金,易字之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。
Hello world
Wenyan:
吾有一數(shù)。曰三。名之曰「甲」。 為是「甲」遍。 吾有一言。曰「「問天地好在。」」。書之。 云云。
Equivalent JavaScript:
var n = 3; for (var i = 0; i < n; i++) { console.log("問天地好在。"); }
Output:
問天地好在。 問天地好在。 問天地好在。
Punctuations and newlines are completely optional (just like they are in Classical Chinese), so the above code is equivalent to:
吾有一數(shù)曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云
More sophisticated examples, such as the Sieve of Eratosthenes, Quicksort, Mandelbrot set, and Tower of Hanoi, can be found in the ./examples folder.
Features
-
An NLP sharing the grammar of Classical Chinese
-
Compiles to JavaScript or Python
-
An online IDE
-
Examples to get started
InstallationThe Compiler
Clone the repo, (OR simply download ./build/wenyan.js and set its executable bit using the terminal command chmod +x wenyan.js). Then run ./build/wenyan.js to compile your wenyan souce code to target language. Calling the compiler without arguments prints the help message, reproduced below:
Usage: wenyan [options] [input files] Options: --eval -e <string> : Give a string instead of a file (default: `') --exec -x <boolean> : Execute output (default: `false') --inspect -i <boolean> : Interactive REPL (default: `false') --lang -l <string> : Language: js/py (default: `js') --log <string> : Log file (default: `/dev/null') --output -o <string> : Output file (default: `/dev/stdout') --roman -r <boolean> : Romanize identifiers (default: `true')
Try building the included examples first, e.g.:
./build/wenyan.js examples/helloworld.wy -o helloworld.js
Building platform-specific binaries
-
Clone the repo
-
npm install
-
npm run make_cmdline
The macOS, Windows and Linux binaries will be in the ./build folder.
Syntax Cheatsheet
A context-free grammar description is under construction. Meanwhile, please check the cheatsheet below, or look into src/parser.js to learn about the syntax. Be sure to check out the examples from the online IDE too!