フォルダ&ファイル構成を活用する自作の難解プログラミング言語「DigFiles」を作ってみた

# はじめに
皆さん、プログラミングする時にちゃんと処理を適切に関数分けしていますか。
一つの関数がえげつない行数になっていたりするのを見ると、しんどくなってきますよね…

なので、今回は言語仕様的に**強制的に処理を分割**しなくてはいけない言語を作りました。
[GitHubのリポジトリ](https://github.com/yamaserif/DigFiles)
一応、頑張ってインタプリタも作成してあります。

# DigFilesについての説明
この言語「DigFiles」では、処理の分割にフォルダとファイルを使用します。
1つのファイルには1つの処理命令しか記述できず、また、そのファイルはフォルダ内に1つしか置けないような仕様となっています。
![digFiles_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523180/59e8b9c1-ecbb-4039-8151-35777e8439cd.png)
これにより、開発者に処理を分割するように強制することができます。
もちろん、OAOO原則[^1]を守れるようにフォルダは再利用可能とします。（他の処理から処理のブロックを呼び出せる）

また、多分チューリング完全になっていると思います。[^2]

<details><summary>GitHubから言語仕様をコピペしたもの（クリックで開けます）</summary><div>

## 仕様
- フォルダ内には「フォルダ0個以上」or「ファイル0～1個」が格納される。 
- 拡張子は処理に影響しない。 
- 動作idは「大文字と小文字の区別無しにて序数の文字列比較を行った場合の昇順」での実行順となる。(C#の「StringComparer.OrdinalIgnoreCase」にあたる)   
- 変数idは任意の整数値とする。
- 未初期化の変数値は0~99の乱数値とする。（このとき乱数値の算出方法は問わない）

（実際に記入するときは'《'と'》'は書かないことに注意 ）  
（「.《任意の文字》」は省略可能とする） 
 
### フォルダ名 
|  記法                    |  意味                                                                      |
| ------------------------ | -------------------------------------------------------------------------- |
| 《動作id》.《任意の文字》  | [動作ブロック(定義)]動作のひとかたまり（同階層内にて動作idの若い順で実行）       |
| 《#動作id》.《任意の文字》 | [動作ブロック(定義)]動作のひとかたまり（[動作ブロック(呼出)]でしか実行されない） |
 
### ファイル名 
|  記法                     |  意味                            |
| ------------------------- | ------------------------------- |
| 《実行命令》.《任意の文字》 | [動作ピース]動作単体              |
| 《%動作id》.《任意の文字》  | [動作ブロック(呼出)]動作を呼び出す |

### ファイルの中身 
引数をスペース区切りで複数指定（詳しくは命令を参照）  
（《変数id》が引数となっている場合は、《*変数id》と表記することによって変数にセットされた値を《変数id》として解釈させることが出来る） 
 
### 命令 
|  実行命令 |  変数                          |  動作                                         |
| -------- | ------------------------------ | -------------------------------------------- |
| set      | 《変数id》 《値》               | 代入                                          |
| copy     | 《変数id》 《変数id》           | 変数のコピー                                   |
| in       | 《変数id》                     | 1文字入力(utf-8)                               |
| out      | 《変数id》                     | 1文字出力(utf-8)                               |
| loop     | 《変数id》 《変数id》 《動作id》 | 2つの変数が同値でない間、指定された動作を実行する |
| add      | 《変数id》 《変数id》           | 1つ目の変数に2つ目の変数を加算する               |

</div></details>

# DigFilesインタプリタについて
皆さんがプログラムを試しやすいようにインタプリタも作成しました。
Visual StudioのC#にて作成しています。
実行可能ファイルとしては公開していないため、プロジェクトを[GitHub](https://github.com/yamaserif/DigFiles/tree/main/interpreter)にてダウンロードし、各々でビルドしていただければ幸いです。
（因みに、DEBUGビルドで動かすと内部の処理をコンソールに吐き出してくれるようになってます。試しに動かすときなどに使えます。）

また、一応[example](https://github.com/yamaserif/DigFiles/tree/main/example)にHello Worldのコードも準備したので、是非試してみてください。

# 最後に
ここまで真面目に見ていてくださっている方はお気づきかもしれませんが、この言語でのコーディングはめちゃくちゃ面倒くさいです。
いちいちフォルダを切り、ファイルを作り…と言った形で、過剰に処理を切り分ける必要が出てきます。
「Hello, World!」の文字列を作る時に、1文字ずつ丁寧に変数にUTF-8のコードをセットしなくてはならないため、ここだけでフォルダをたくさん作る必要が出てきます。[^3]

あくまで、実用性のないネタ言語、難解プログラミング言語としてお楽しみいただくようお願い致します。

**「プログラミングするときは、適切な括りで適度に関数の切り分けを行おうね！[^4]」**


[^1]: 『Once And Only Once』同じ処理を複数書かないという奴。DRY原則とよく混同される。
[^2]: 未確認だけど、感覚的にBrainfuckの動きを再現できそうな感じする。
[^3]: 自分で作っておいてなんですが、クソめんどくさかったです。
[^4]: やっぱり、何事も限度っていうのがありますので…