2021-05-19
#js 
苦手だった漢文が好きになる、プログラミング言語「文言 / wenyan-lang」を使って、緯度経度をコード化する「Geo3x3」の80言語目として実装しました。

完全に漢文にしか見えませんが、ちゃんとコンピューターで実行できます。

$ wenyan Geo3x3_encode.wy E9139659937288

コードからの変換は衝撃的です

$ wenyan Geo3x3_decode.wy 三十五又六分五釐八毫六絲三忽三微七纖九沙零一渺六漠。一百三十九又七分四釐五毫四絲六忽五微六纖三沙零二埃三渺九漠。一十四。一絲一忽二微九纖零五埃八渺五漠

数も古代中国語表記?漢数字が自然に読めるのは日本人特典。


文言 / wenyan-lang
古代中国語で綴るプログラミング言語「文言」は、決められた文法に則った漢文をJavaScript、Python、Rubyに変換するオープンソースソフトウェア(JavaScript/Node.jsで書かれたトランスパイラ)です(言語仕様src on GitHub)。

例えば、変数への代入(単位 = 180)を文言で書くと

吾有一數。曰一百八十。名之曰「单位」

中国語として翻訳できます。

私は一つ番号を持っています。 108ということです。 それを「単位」と呼びます。

命令単位が細かくてアセンブリ言語のような印章です。詩的な感じがステキ。

文法を調べながら作っていくのも楽しそうですが、JavaScriptからの逆コンパイラ「wenyanizer」を使って作ってみます。

現代プログラミング言語では変数はアルファベットである必要はありません。日本語、漢字、中国語で付けてもOKなので、下記も立派なJavaScriptです。(漢文っぽく、中国語の漢字を使いましたが、日本の漢字でも問題ありません)

function 编码(纬度, 经度, 等级) { let 结果 = "E"; if (经度 < 0.0) { 结果 = "W"; 经度 += 180.0; } 纬度 += 90.0; let 单位 = 180.0; for (let 甲 = 1; 甲 < 等级; 甲++) { 单位 /= 3.0; const 橫 = Math.floor(经度 / 单位); const 縱 = Math.floor(纬度 / 单位); 结果 += 橫 + 縱 * 3 + 1; 经度 -= 橫 * 单位; 纬度 -= 縱 * 单位; } return 结果; } console.log(编码(35.65858, 139.745433, 14));

これを文言に変換すると動くのですが、Math.floorが変換されずに残ってしまいます。

Math.floorは、標準ライブラリ『算經』に「取底」と定義があるので、そちらを使うように改めます。

吾嘗觀『算經』之書。 方悟「取底」之義。

翻訳すると

私は『算經』の本を読みました。 「取底」という意味を実感しました。

使うときは、

施「取底」於「卯戊」。(「取底」し「卯戊」に当てます)

できあがった、文言で書いたGeo3x3コード変換プログラム「编码」はこちら(メイキング on GitHub

吾有一術。名之曰「编码」 欲行是術。必先得一物。曰「纬度」。一物。曰「经度」。一物。曰「等级」。 乃行是術曰。 吾嘗觀『算經』之書。 方悟「取底」之義。 吾有一言。曰「「E」」。名之曰「结果」 若「经度」小於零者。 昔之「结果」者。今「「W」」是矣。 加「经度」以一百八十。 昔之「经度」者。今其是矣。 云云。 加「纬度」以九十。 昔之「纬度」者。今其是矣。 吾有一數。曰一百八十。名之曰「单位」 吾有一數。曰一。名之曰「甲」 恆為是。 吾有一爻。名之曰「寅辰」。若「甲」小於「等级」者。昔之「寅辰」者。今陽是矣云云。 若「寅辰」等於零者。 乃止。 云云。 除「单位」以三。 昔之「单位」者。今其是矣。 除「经度」以「单位」。 名之曰「卯戊」。 施「取底」於「卯戊」。 名之曰「橫」。 除「纬度」以「单位」。 名之曰「午十」。 施「取底」於「午十」。 名之曰「縱」。 乘「縱」以三。 加「橫」以其。 名之曰「乙午」。 加「乙午」以一。 加「结果」以其。 昔之「结果」者。今其是矣。 乘「橫」以「单位」。 減「经度」以其。 昔之「经度」者。今其是矣。 乘「縱」以「单位」。 減「纬度」以其。 昔之「纬度」者。今其是矣。 加「甲」以一。 昔之「甲」者。今其是矣。 云云。 乃得 「结果」 是謂「编码」之術也。 噫。施「编码」於三十五又六分五釐八毫五絲八忽。於一百三十九又七分四釐五毫四絲三忽二微。於一十四。 名之曰「酉辰」。 吾有一物。曰「酉辰」。 書之。

計算式が細かく分解されています。オンラインIDEを使ってかっこよく縦書き化できます!

お気に入りのアルゴリズム、額に飾っておくのもいいですね。


こちらがデコード「解码」です。なでしこなど、日本語プログラミングはたくさんありますが、中国語プログラミングは珍しい!

漢文好きな人、漢文に苦手意識がある人にオススメ、漢文プログラミング!
オンライン環境でインストールなしにすぐ体験できます。

links
- World's First Classical Chinese Programming Language - IEEE Spectrum
- 「漢文風プログラミング言語」とかいう古代文明SFモノみたいな激ヤバなブツが流れてきて - Togetter
- はじめてのプログラミングを「文言」(漢文プログラミング言語)で 0日目 - Qiita
- wenyan-lang/book: 文言陰符 An Introduction to Programming in Wenyan Language(教科書)
- 教科書「文言陰符」の訓読文
- 教科書「文言陰符」の現代語訳
- antfu/wenyan-tshirt: The Open Source T-Shirt for Wenyan

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS