巷で話題の漢文プログラミング「文言(wenyan)」入門。環境構築から基本文法まで

# 巷で話題の漢文プログラミング「文言(wenyan)」入門。環境構築から基本文法まで

## wenyanとは

昨日か一昨日くらいから若干ニュースフィードなどで話題になってる漢文が使えるプログラミング言語です。
wenyanはjavascriptやpythonにコンパイルすることで実行できます。

とりあえず[公式のリポジトリ](https://github.com/LingDong-/wenyan-lang)を見てみるのがおすすめです。

![screenshot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230522/2ad64f2e-44b0-1e60-244f-612db3444a6d.png)

>公式リポジトリより引用

一番の胸アツポイントはこの漢文コードをいい感じにレンダリングできることです。
これが意味を持ったソースコードだと思うとめちゃくちゃ胸アツじゃないですか？

## wenyanをインストール！

wenyanを書く方法としては二通りあって、オンラインで書く方法、もう一つがローカルにインストールして実行する方法です。

インストールについてはwindowsのみ説明します。
僕がmacを持っていないからです。あと一応linuxに関しては公式のreadme.mdを見ればわかると思います。

### nodeのインストール

前提としてコンパイラがjavascriptでできているので、それを実行するためにnode.jsがインストールしてある必要があります。

インストールがまだであれば特に難しいことはないのでこちらを参考にインストールしておきましょう。

[windows10にNode.jsをインストールする](https://qiita.com/Masayuki-M/items/840a997a824e18f576d8)


タイトルのままですが、まずはwenyanのリポジトリをローカルにダウンロードもしくはcloneします。

好みの問題のような気がしますが一応僕はC:/Program Files以下にコピーしました。

```bash

git clone https://github.com/LingDong-/wenyan-lang.git
```
ローカルにwenyan-lang-masterがダウンロードできたかと思います。

### wenyanコマンドを実行できるよう変更

できたら、wenyan-lang-masterディレクトリに移動し、以下のコマンドを実行します。

```bash
npm install
npm run make_cmdline
```

wenyan-lang-master/buildにwenyan-win.exeが作成されたかと思います。
このwenyan-win.exeを実行すればコンパイルができます。

ただ、毎回./build/wenyan-win.exeと打つのは少々面倒なので、パスを通してwenyanコマンドを実行できるようにします。

```bash
wenyan コンパイルしたいファイル
```

といった具合に実行できるようにします。

環境変数の編集を開いて、以下のパスを追加します。

```bash
C:\Program Files\wenyan-lang-master\build
```

これをコピペしなくても先ほどのwenyan-win.exeのパスを追加してあげればいいだけです。

bashなり任意のコマンドラインを起動しなおしてwenyanコマンドを実行してみます。

```bash
$ wenyan
 ,_ ,_
 \/ ==
 /\ []

WENYAN LANG 文言 Compiler 0.01 (12/19/2019)

Usage: wenyan [options] [input files]

Options:
--eval    -e <string>  : Give a string instead of a file (default: `')
--exec    -x <boolean> : Execute ouput (default: `false')
--inspect -i <boolean> : Interactive REPL (default: `false')
--lang    -l <string>  : Language: js/py (default: `js')
--log        <string>  : Log file (default: `/dev/null')
--output  -o <string>  : Output file (default: `/dev/stdout')
--render     <string>  : Render input under given title (default: `none')
--roman   -r <string>  : Romanize identifiers (default: `none')

```

こんな感じに表示されていれば環境構築は終了です。
まあオンラインIDEを使えば一瞬なんですけどね。。。

## wenyanでhelloworld

いよいよお待ちかねのhello worldです。
今回は漢文らしく問天地好在と出力してみましょう。

とりあえず何も考えず以下のコードをコピペしてください。

拡張子は.wyです。今回はhelloworld.wyとしましょう。

```wenyan
吾有一言。曰「「問天地好在。」」。書之。
```

以下のコマンドでコンパイルを実行します。

```bash
wenyan helloworld.wy -o helloworld.js
```

コンパイルが正常に実行されればhelloworld.jsというファイルが同じディレクトリに生成されているかと思います。
実行してみると、、、

```bash
node helloworld.js
問天地好在。
```

できました！wenyan流hello worldです！

## wenyanの基本的な文法

### 変数

まずは変数の宣言についてです。以下のコードを見てください。

```
吾有一數。曰三。名之曰「甲」。
```

これは変数を宣言する最も簡単なコードです。
具体的には甲という変数に3を代入しています。
細かく解説すると以下の通りです。

まずは型の宣言についてです。整数、リスト、文字列など分けて書けます。
ですが、pythonやjavascriptには特にそういった型はありません。
将来的に別の言語にコンパイルできるようになった時のために一応説明します。

| wenyan | 型 |
|---|---|
|`吾有一數。` | int |
|`吾有一列。` | list|
|`吾有一爻。` | bool |
|`吾有一言。` | string |

`數`が数のことで敷とは違う点に注意です。「かず」の予測変換で入力できます。

そして値の定義です。

```
曰{代入したい値}。
```
これで値を定義します。それぞれの型については以下の通りです。

| wenyan | 型 | 値 |
|---|---|---|
|`曰二。` | int | 2 |
|`曰列。` | list| 空のリストしか宣言できない。 |
|`曰陽。` | bool | true |
|`曰陰。` | bool | false |
|`曰「「噫吁戲」」。` | string | 噫吁戲 |

stringに関しては二重の「「」」を使う必要があります。

そして最後に変数名の定義です。変数名の定義は以下のようにして行います。

```
名之曰「天」。
```

これなら天という名前の変数に代入するという意味になります。
変数を参照する際は必ず「」を使う必要があります。
これらを踏まえてもう一度最初のコードを見てみると意外とシンプルで簡単なことが分かります。

```
吾有一數。曰三。名之曰「甲」。
```

このコードは以下のようにコンパイルされます。

```javscript
var 甲=3;
```

吾有三敷。と変数の数を指定することで同時に複数の変数を定義することができます。

```
吾有三數。曰一。曰三。曰五。名之曰「甲」曰「乙」曰「丙」。
```

```javascript
var a=1,b=3,c=5;
```

### 基本構文

続いては基本構文についてです。

if文

```
若三不大於五者。乃得「「想當然耳」」。若非。乃得「「怪哉」」也。
```

`若`~`者`が`if`にあたり、`三大於二`が条件式にあたります。
`乃得`からが条件を満たす際に評価される式、`若非。乃得`からがelseの際の式になります。、

```javascript
if(3<=5){return "of course"}else{return "no way"}
```

このコードからわかる通り、条件演算子は以下のようになっています。
これらに関してはドキュメントに記述がなかったのですが、直感的に頑張れってことですかね？

| wenyan | javascript |
|---|---|
|`大於` | > |
|`不大於` | <= |
|`小於` | < |
|`不小於` | >= |

for文

for文は数字を変更することができます。もちろん変数に置き換えることもできます。


100回繰り返す文

```
為是百遍。
    吾有一數。曰五。書之。
云云。
```

甲に3を代入し、3回実行

```
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
    吾有一數。曰五。書之。
云云。
```

```javascript
for (var i = 0; i < 100; i++){
    console.log(5);
}
```

これ以外の文法などについても随時追記していく予定です。

## いよいよお待ちかね、wenyanのレンダリング

とにかくやりたかったのがこれ！！
、、なのですが、現在おそらくwindows非対応ではないかと思います。
というのも、ドキュメント通りにコマンドを実行してもまずwindows環境だとエラーが出ます。
おそらく内部で指定されているsvgファイルのデフォルトの保存先がdev/stdout.svgになっているからです。
-o オプションでこれを変更可能で、試してみたところコマンド自体は通り、指定通りのsvgファイルは生成されます。
ただ、以下の画像のように何も書いていないものが表示されてしまいます。。

![wenyansvg.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230522/a244ec9d-bf94-df6b-0469-60f1f9967c7d.png)

また、以下は公式のreadmeに記述されているオプション一覧です。

```
Usage: wenyan [options] [input files]

Options:
--eval    -e <string>  : Give a string instead of a file (default: `')
--exec    -x <boolean> : Execute output (default: `false')
--inspect -i <boolean> : Interactive REPL (default: `false')
--lang    -l <string>  : Language: js/py (default: `js')
--log        <string>  : Log file (default: `/dev/null')
--output  -o <string>  : Output file (default: `/dev/stdout')
--roman   -r <boolean> : Romanize identifiers (default: `true')
```

そしてこちらがコマンドで実際に表示されるヘルプです。

```
Usage: wenyan [options] [input files]

Options:
--eval    -e <string>  : Give a string instead of a file (default: `')
--exec    -x <boolean> : Execute ouput (default: `false')
--inspect -i <boolean> : Interactive REPL (default: `false')
--lang    -l <string>  : Language: js/py (default: `js')
--log        <string>  : Log file (default: `/dev/null')
--output  -o <string>  : Output file (default: `/dev/stdout')
--render     <string>  : Render input under given title (default: `none')
--roman   -r <string>  : Romanize identifiers (default: `none')
```

readmeにはなかった--renderオプションが追加されています。beta版という認識で気長に待つのがいい気がしますね。
それでも何か対策の方法がわかったらコメントで教えていただければと思います。