前两天分享了一个中文编程的微头条。有朋友说有表情包编程语言。于是乎小编写了一篇文章最好玩儿的编程语言——表情包编程。今天再给大家介绍一个好玩的编程语言,文言文编程。
废话不多说,直接上货。
![bc67c6da8ccd5ba14a451ba27e6820c9.png](https://i-blog.csdnimg.cn/blog_migrate/1ee21e926c31ee749bc8c2cbec1595be.jpeg)
安装
编译器
使用以下命令安装本编译器:
npm install -g @wenyan/cli
尝试运行内置的例子,例如:
wenyan examples/helloworld.wy -o helloworld.js
编辑器插件:
- 由antfu提供的适用于VSCode的插件
- 由voldikss提供的适用于Vim的插件
- 由absop提供的适用于Sublime Text的插件
在线 IDE
在线 IDE这东西是小编非常喜欢的一个东西了,强烈推荐给大家。做单元测试时是真的很香。文言文编程语言作为一个完整的编程语言项目,在线IDE也是必不可少的。
https://ide.wy-lang.org/
项目源码位置
截止小编发稿,本项目已经有16.7k Star了
https://github.com/wenyan-lang/wenyan/blob/master/README.zh-Hans.md
序
夫唐、虞之世,結繩而足治,屈指而足算。是時豈料百代之後,計算機械之巧,精於公輸之木鳶,善於武侯之流馬;程式語言之多,繁若《天官》之星宿,奇勝《山經》之走獸。鼠、蟹、鑽、魚,或以速稱。蛇、象、駱、犀,各爭文采。方知鬼之所以夜哭,天之所以雨粟。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。嗟予小子,遂有斯志。然則數寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羁于远邦,兩耳久旷于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故希孟不慚年少,莊生不望無涯。乃作斯言。誠未能嘔瀝長吉之心血,亦庶幾免於義山之流沫。既成之後,復學干將鑄劍而自飼,越王嚐糞而當先。自謂偶追《十書》之筆意,但恨少八家之淋漓。此子山所謂士衡抚掌而甘心,平子見陋而固宜。然則雖實覆甕之質,尚存斧正之望;雖乏呂相之金,易字之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。
Hello world
任何一门语言学习的学习的第一个程序就是我们的“Hello world”,接下来我们学习一下文言文Hello world怎么写。
文言:
吾有一數。曰三。名之曰「甲」。為是「甲」遍。吾有一言。曰「「問天地好在。」」。書之。云云。
看不懂是不是,没关系,小编给大家翻译一下。 JavaScript如下:
var n = 3;for (var i = 0; i < n; i++) {console.log("問天地好在。");}
输出:
問天地好在。問天地好在。問天地好在。
代码示例:
![c28debc8aaeb7720423b48ef4f2e93df.png](https://i-blog.csdnimg.cn/blog_migrate/c40dd7b073247d44b5ef6a9db585ae18.jpeg)
完全的文言文编程,就连基本的关键字都是文言文,还具有图灵完整性,很神奇有木有。接下来我们再来认识一下基础语法。
基本语法
上下文无关文法的语法描述还在构建中。同时,请查阅下面的语法表,或者在 src/parser.js 中学习其他更多语法。当然你也可以从在线 IDE 现有的例子中学习更多语法知识!
变量
将文言文简单的翻译一下,就可以对应出来相应的JavaScript代码,小编感觉还是比较好理解的。
![c5875b6e49bdd355a2c30d37056f9d1c.png](https://i-blog.csdnimg.cn/blog_migrate/67f53762b642d287f474373572b30063.jpeg)
流程控制
![bf9f66dc0799eabb88a1c589fa9f6c32.png](https://i-blog.csdnimg.cn/blog_migrate/6b1c9193400a9de97f0fac56bc666fe9.jpeg)
运算
![b5c30153b23e8106c4fee022889f2f01.png](https://i-blog.csdnimg.cn/blog_migrate/fc89225b6b28c711e757a960ce687d8e.jpeg)
其余的小编就不一一赘述了,感兴趣的小伙伴们可以直接查看项目源码,链接在上面已经给出来了。接下来为大家来几个示例。
示例
八皇后问题
文言文代码:
注曰。「「今以八皇后置棋盤之上而不相殺。其法幾何。」」吾有一術。名之曰「皇后問題」。欲行是術。必先得一數。曰「寬」。乃行是術曰。吾有一列。名之曰「棋盤」。吾有一術。名之曰「單步」。是術曰。若「棋盤」之長等於「寬」者。夫「棋盤」書之。若非。吾有一數。曰一。名之曰「此后」。為是「寬」遍。吾有一爻。曰陽。名之曰「可乎」。吾有一數。曰一。名之曰「彼后之位」。夫「棋盤」之長。名之曰「幾何」。加一於「幾何」。名之曰「此后之位」。為是「幾何」遍。夫「棋盤」之「彼后之位」。名之曰「彼后」。減「此后之位」以「彼后之位」。名之曰「直距」。減「彼后」以「此后」。名之曰「右距」。減「彼后」於「此后」。名之曰「左距」。若「彼后」等於「此后」者。昔之「可乎」者。今陰也。乃止。也。若「右距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。若「左距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。加一於「彼后之位」。名之曰「新位」。昔之「彼后之位」者。今「新位」也。云云。若「可乎」者。吾有一列。銜其以「棋盤」。名之曰「舊棋盤」充「棋盤」以「此后」。施「單步」。噫。昔之「棋盤」者。今「舊棋盤」是矣。也。加一於「此后」。名之曰「新此后」。昔之「此后」者。今「新此后」也。云云。也。是謂「單步」之術也。施「單步」。是謂「皇后問題」之術也。 施「皇后問題」於八。噫。
对应的JavaScript:
/*"今以八皇后置棋盤之上而不相殺。其法幾何。"*/var 皇后問題 = _ => {};皇后問題 = 寬 => { var 棋盤 = []; var 單步 = _ => {}; 單步 = () => { if (棋盤.length == 寬) { const _ans1 = 棋盤; console.log(_ans1); } else { var 此后 = 1; for (let _rand1 = 0; _rand1 < 寬; _rand1++) { var 可乎 = true; var 彼后之位 = 1; const _ans2 = 棋盤.length; var 幾何 = _ans2; const _ans3 = 幾何 + 1; var 此后之位 = _ans3; for (let _rand2 = 0; _rand2 < 幾何; _rand2++) { const _ans4 = 棋盤[彼后之位 - 1]; var 彼后 = _ans4; const _ans5 = 此后之位 - 彼后之位; var 直距 = _ans5; const _ans6 = 彼后 - 此后; var 右距 = _ans6; const _ans7 = 此后 - 彼后; var 左距 = _ans7; if (彼后 == 此后) { 可乎 = false; break; }; if (右距 == 直距) { 可乎 = false; break; }; if (左距 == 直距) { 可乎 = false; break; }; const _ans8 = 彼后之位 + 1; var 新位 = _ans8; 彼后之位 = 新位; }; if (可乎) { var _ans9 = []; const _ans10 = _ans9.concat(棋盤); var 舊棋盤 = _ans10; 棋盤.push(此后); const _ans11 = 單步(); 棋盤 = 舊棋盤; }; const _ans12 = 此后 + 1; var 新此后 = _ans12; 此后 = 新此后; }; }; }; const _ans13 = 單步();};const _ans14 = 皇后問題(8);
结果:
![6dc103d776dda957bf920ada518c2f82.png](https://i-blog.csdnimg.cn/blog_migrate/347746846426ab12b798dd87e15a668c.jpeg)
斐波那契数列
文言文代码:
吾有一術。名之曰「斐波那契」。欲行是術。必先得一數。曰「甲」。乃行是術曰。若「甲」等於零者乃得零也若「甲」等於一者乃得一也減「甲」以一。減「甲」以二。名之曰「乙」。曰「丙」。施「斐波那契」於「乙」。名之曰「丁」。施「斐波那契」於「丙」。名之曰「戊」。加「丁」以「戊」。名之曰「己」。乃得「己」。是謂「斐波那契」之術也。施「斐波那契」於十二。書之。
对应的JavaScript:
var 斐波那契 = _ => {};斐波那契 = 甲 => { if (甲 == 0) { return 0; }; if (甲 == 1) { return 1; }; const _ans1 = 甲 - 1; const _ans2 = 甲 - 2; var 乙 = _ans1; var 丙 = _ans2; const _ans3 = 斐波那契(乙); var 丁 = _ans3; const _ans4 = 斐波那契(丙); var 戊 = _ans4; const _ans5 = 丁 + 戊; var 己 = _ans5; return 己;};const _ans6 = 斐波那契(12);console.log(_ans6);
结果:
![637cd196c6d0f62733dc49ac1a16989c.png](https://i-blog.csdnimg.cn/blog_migrate/f9cce96ab7d51c6318b05da93d6b67d4.jpeg)
参考文献:文言文编程语言源码github仓库。