javascript 编程ide_好玩儿的编程语言——文言文编程语言

前两天分享了一个中文编程的微头条。有朋友说有表情包编程语言。于是乎小编写了一篇文章最好玩儿的编程语言——表情包编程。今天再给大家介绍一个好玩的编程语言,文言文编程。

废话不多说,直接上货。

bc67c6da8ccd5ba14a451ba27e6820c9.png

安装

编译器

使用以下命令安装本编译器:

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

完全的文言文编程,就连基本的关键字都是文言文,还具有图灵完整性,很神奇有木有。接下来我们再来认识一下基础语法。

基本语法

上下文无关文法的语法描述还在构建中。同时,请查阅下面的语法表,或者在 src/parser.js 中学习其他更多语法。当然你也可以从在线 IDE 现有的例子中学习更多语法知识!

变量

将文言文简单的翻译一下,就可以对应出来相应的JavaScript代码,小编感觉还是比较好理解的。

c5875b6e49bdd355a2c30d37056f9d1c.png

流程控制

bf9f66dc0799eabb88a1c589fa9f6c32.png

运算

b5c30153b23e8106c4fee022889f2f01.png

其余的小编就不一一赘述了,感兴趣的小伙伴们可以直接查看项目源码,链接在上面已经给出来了。接下来为大家来几个示例。

示例

八皇后问题

文言文代码:

注曰。「「今以八皇后置棋盤之上而不相殺。其法幾何。」」吾有一術。名之曰「皇后問題」。欲行是術。必先得一數。曰「寬」。乃行是術曰。吾有一列。名之曰「棋盤」。吾有一術。名之曰「單步」。是術曰。若「棋盤」之長等於「寬」者。夫「棋盤」書之。若非。吾有一數。曰一。名之曰「此后」。為是「寬」遍。吾有一爻。曰陽。名之曰「可乎」。吾有一數。曰一。名之曰「彼后之位」。夫「棋盤」之長。名之曰「幾何」。加一於「幾何」。名之曰「此后之位」。為是「幾何」遍。夫「棋盤」之「彼后之位」。名之曰「彼后」。減「此后之位」以「彼后之位」。名之曰「直距」。減「彼后」以「此后」。名之曰「右距」。減「彼后」於「此后」。名之曰「左距」。若「彼后」等於「此后」者。昔之「可乎」者。今陰也。乃止。也。若「右距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。若「左距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。加一於「彼后之位」。名之曰「新位」。昔之「彼后之位」者。今「新位」也。云云。若「可乎」者。吾有一列。銜其以「棋盤」。名之曰「舊棋盤」充「棋盤」以「此后」。施「單步」。噫。昔之「棋盤」者。今「舊棋盤」是矣。也。加一於「此后」。名之曰「新此后」。昔之「此后」者。今「新此后」也。云云。也。是謂「單步」之術也。施「單步」。是謂「皇后問題」之術也。 施「皇后問題」於八。噫。

对应的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

斐波那契数列

文言文代码:

吾有一術。名之曰「斐波那契」。欲行是術。必先得一數。曰「甲」。乃行是術曰。若「甲」等於零者乃得零也若「甲」等於一者乃得一也減「甲」以一。減「甲」以二。名之曰「乙」。曰「丙」。施「斐波那契」於「乙」。名之曰「丁」。施「斐波那契」於「丙」。名之曰「戊」。加「丁」以「戊」。名之曰「己」。乃得「己」。是謂「斐波那契」之術也。施「斐波那契」於十二。書之。

对应的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

参考文献:文言文编程语言源码github仓库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值