企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

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

wudianyun 2025-05-30 17:55:39 精选文章 8 ℃

前两天看了一个中文编程的微头条。突然想起有个文言文编程。今天小编详细给大家介绍一下。废话不多说,直接上货。

安装

编译器

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

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("問天地好在。");
}

输出:

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

代码示例:

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

基本语法

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

变量

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

流程控制

运算

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

示例

八皇后问题

文言文代码:

注曰。「「今以八皇后置棋盤之上而不相殺。其法幾何。」」

吾有一術。名之曰「皇后問題」。欲行是術。必先得一數。曰「寬」。乃行是術曰。
	吾有一列。名之曰「棋盤」。

	吾有一術。名之曰「單步」。是術曰。
		若「棋盤」之長等於「寬」者。
			夫「棋盤」書之。
		若非。
			吾有一數。曰一。名之曰「此后」。
			為是「寬」遍。
				吾有一爻。曰陽。名之曰「可乎」。
				吾有一數。曰一。名之曰「彼后之位」。
				夫「棋盤」之長。名之曰「幾何」。
				加一於「幾何」。名之曰「此后之位」。
				為是「幾何」遍。
					夫「棋盤」之「彼后之位」。名之曰「彼后」。
					減「此后之位」以「彼后之位」。名之曰「直距」。
					減「彼后」以「此后」。名之曰「右距」。
					減「彼后」於「此后」。名之曰「左距」。
					若「彼后」等於「此后」者。昔之「可乎」者。今陰也。乃止。也。
					若「右距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。
					若「左距」等於「直距」者。昔之「可乎」者。今陰也。乃止。也。
					加一於「彼后之位」。名之曰「新位」。
					昔之「彼后之位」者。今「新位」也。
				云云。
				若「可乎」者。
					吾有一列。銜其以「棋盤」。名之曰「舊棋盤」
					充「棋盤」以「此后」。
					施「單步」。噫。
					昔之「棋盤」者。今「舊棋盤」是矣。
				也。
				加一於「此后」。名之曰「新此后」。
				昔之「此后」者。今「新此后」也。
			云云。
		也。
	是謂「單步」之術也。

	施「單步」。
是謂「皇后問題」之術也。
 
施「皇后問題」於八。噫。

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

结果:

斐波那契数列

文言文代码:

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

施「斐波那契」於十二。書之。

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

结果:

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

最近发表
标签列表