Skip to content

Latest commit

 

History

History
233 lines (161 loc) · 12.7 KB

README.zh-Hant.md

File metadata and controls

233 lines (161 loc) · 12.7 KB

文言 wenyan-lang

English | 简体中文 | 繁體中文

文言文程式語言。 線上體驗

🚧 請註意,中文版文件並非即時更新,僅供參考。如有歧義,請以英文版文件為主。

之世,結繩而足治,屈指而足算。是時豈料百代之後,計算機械之巧,精於公輸木鳶,善於武侯流馬;程式語言之多,繁若《天官》之星宿,奇勝《山經》之走獸。,或以速稱。,各爭文采。方知鬼之所以夜哭,天之所以雨粟。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。嗟予小子,遂有斯志。然則數寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羁于远邦,兩耳久旷于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故希孟不慚年少,莊生不望無涯。乃作斯言。誠未能嘔瀝長吉心血,亦庶幾免於義山流沫。既成之後,復學干將鑄劍而自飼,越王嚐糞而當先。自謂偶追《十書》之筆意,但恨少八家之淋漓。此子山所謂士衡抚掌而甘心,平子見陋而固宜。然則雖實覆甕之質,尚存斧正之望;雖乏呂相之金,易字之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。

Helloworld

文言:

吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
吾有一言。曰「「問天地好在。」」。書之。
云云。

等同於以下 JavaScript:

var n = 3;
for (var i = 0; i < n; i++) {
console.log("問天地好在。");
}

輸出:

問天地好在。
問天地好在。
問天地好在。

標點符號和換行都是可選的(就像古漢語中文字是連續的),所以上面的程式碼等同於:

吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云

更多複雜的例子,可以在 ./examples 中找到。比如,埃拉托斯特尼篩法、快速排序、曼德博集合、河諾塔。

特點

安裝

編譯器

使用以下命令安裝本編譯器:

npm install -g @wenyan/cli

嘗試運行內建的例子,例如:

wenyan examples/helloworld.wy -o helloworld.js

編輯器外掛:

語法表

上下文無關文法的語法描述還在構建中。同時,請查閱下面的語法表,或者在 src/parser.js 中學習其他更多語法。當然你也可以從線上 IDE 現有的例子中學習更多語法知識!

變量

wenyan JavaScript
吾有一數。曰三。名之曰「甲」。 var a = 3;
有數五十。名之曰「大衍」。 var dayan = 50;
昔之「甲」者。今「大衍」是也。 a = dayan;
吾有一言。曰「「噫吁戲」」。名之曰「乙」。 var b = "alas!";
吾有一爻。曰陰。名之曰「丙」。 var c = false;
吾有一列。名之曰「丁」。 var d = [];
吾有三數。曰一。曰三。曰五。名之曰「甲」曰「乙」曰「丙」。 var a=1,b=3,c=5;

流程控制

wenyan JavaScript
若三大於二者。乃得「「想當然耳」」也。 if (3>2){ return "of course"; }
若三不大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。 if(3<=5){return "of course"}else{return "no way"}
為是百遍。 ⋯⋯ 云云。 for (var i = 0; i < 100; i++){ ... }
恆為是。 ⋯⋯ 云云。 while (true) { ... }
凡「天地」中之「人」。 ⋯⋯ 云云。 for (var human of world){ ... }
乃止。 break;

運算

wenyan JavaScript
加一以二。 1+2
加一於二。 2+1
加一以二。乘其以三。 (1+2)*3
除十以三。所餘幾何。 10%3
減七百五十六以四百三十三。名之曰「甲」。 var a = 756-433;
夫「甲」「乙」中有陽乎。 a || b
夫「甲」「乙」中無陰乎。 a && b

容器

數組下標從一開始。而不是零。

wenyan JavaScript
吾有一列。名之曰「甲」。充「甲」以四。以二。 var a = []; a.push(4, 2);
銜「甲」以「乙」。以「丙」 a.concat(b).concat(c);
夫「甲」之一。 a[0]
夫「甲」之其餘。 a.slice(1);
夫「玫瑰」之「「名」」。 rose["name"]
夫「寶劍」之長。 sword.length;

對象

wenyan JavaScript
吾有一物。名之曰「甲」。 var a = {};
吾有一物。名之曰「甲」。其物如是。物之「「乙」」者。數曰三。物之「「丙」」者。言曰「「丁」」。是謂「甲」之物也。 var a = {b:3, c:"d"}

函數

wenyan JavaScript
吾有一術。名之曰「吸星大法」。是術曰。 ⋯⋯是謂「吸星大法」之術也。 function f(){...}
吾有一術。名之曰「六脈神劍」。欲行是術。必先得六數。曰「甲」。曰「乙」。曰「丙」。曰「丁」。曰「戊」。曰「己」乃行是術曰。 ⋯⋯是謂「六脈神劍」之術也。 function f(a,b,c,d,e,f){...}
吾有一術。名之曰「翻倍」。欲行是術。必先得一數。曰「甲」。乃行是術曰。乘「甲」以二。名之曰「乙」。乃得「乙」。是謂「翻倍」之術也。 function double(a){var b = a * 2; return b;}
施「翻倍」於「大衍」。 double(dayan);
吾有一術。名之曰「甲」。欲行是術。必先得一數曰「乙」。二言。曰「丙」。曰「丁」 function a(float b, string c, string d)
夫「甲」。夫「乙」。夫「丙」。取二以施「丁」。取二以施「戊」。名之曰「己」。 var f = e(a,d(b,c))
夫「甲」。夫「乙」。夫「丙」。取二以施「丁」。取二以施「戊」。取一以施「己」。夫「庚」。夫「辛」。取三以施「壬」。名之曰「癸」。 var j = i(f(e(a,d(b,c))),g,h)

導入

wenyan JavaScript
吾嘗觀「「算經」」之書。方悟「正弦」「餘弦」之義。 var {sin,cos} = require("math");

雜項

wenyan JavaScript
吾有一數。曰五。書之。 console.log(5);

註釋

wenyan JavaScript
批曰。 「「文氣淋灕。字句切實」」。 /*文氣淋灕。字句切實*/
注曰。 「「文言備矣」」。 /*文言備矣*/
疏曰。 「「居第一之位故稱初。以其陽爻故稱九」」。 /*居第一之位故稱初。以其陽爻故稱九*/

渲染器

wenyan examples/turing.wy --render 圖靈機 --output .

src/render.js 腳本文件能把 wy 程式碼格式化輸出成為古漢語書籍樣式(歷史印刷書籍)的可縮放向量圖形(SVG)。同時它還可以將產生的SVG文件解析回原始文言程式碼。需要獲取更詳細的訊息,請使用wenyan -h命令來獲取幫助。

下圖是用 wenyan 編寫的 通用圖靈機程序 渲染而成。

功能請求

在你打開一個新Issue之前,請先檢查你的需求是否屬於以下類別:

名稱 優先級 需要幫助 狀態
語言規範 ***** 正在進行中
/ 對象文法 *** 對象文法已經添加
導入語句 *** 導入語句已經添加
標準庫(Math(數學)/Bitwise ops(位運算)/Random(隨機)) ***** 正在進行中
測試套件 **** 正在進行中
Switch語句 ***
函數式程式設計 ***
更嚴格的編譯器 ****
其他語言的編譯器 **
編輯器的附加元件 ** 適用於VSCode, Vim, Sublime的附加元件已添加
js/py/ anything 轉換回wenyan(文言) *
轉義/產生 特殊符號 ***
對「「」」的替換語法 **
對 。的替換語法 **
線上IDE 的字體垂直文本 **
將註釋呈現為小型內聯文本 **
更多示範 **

如果你可以幫助我們實現一個在需要幫助下有的功能,請放心提交一個PR。我們將非常感謝你!如果你想幫助我們實現其他功能,也請讓我們知道!謝謝。

已知問題

名稱 優先級 需要幫助 狀態
漢字到數字的轉換問題 *****
漢字到數字轉換中多字符數字沒有被加入支援 ***