カラデシュ言語!すごい!本当にすごいんだ! 【自作ネタプログラミング言語】


# はじめに
プレインズウォーカーの皆様のために、今回自作した言語の [\[エディタ＆実行環境\]](https://snowman-s.github.io/NextApp/utils/kaladesh-lang/) を用意しておきました。
[\[文法の説明\]](https://snowman-s.github.io/NextApp/utils/kaladesh-lang/help/)もあります。

# まずコード例
### Hello Kaladesh!
```text:Kaladesh-Awesome
すごい!すごい!すごい!カラデシュ!すごい!すごい!すごい!すごい!カラデシュ!本当にすごいんだ! --*!*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!すごい!カラデシュ!すごい!カラデシュ!本当にすごいんだ! --*e*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!カラデシュ!カラデシュ!すごい!カラデシュ!本当にすごいんだ! --*m*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!カラデシュ!カラデシュ!カラデシュ!カラデシュ!本当にすごいんだ! --*o*
すごい!すごい!すごい!カラデシュ!カラデシュ!カラデシュ!すごい!すごい!カラデシュ!カラデシュ!本当にすごいんだ! --*s*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!すごい!カラデシュ!すごい!カラデシュ!本当にすごいんだ! --*e*
すごい!すごい!すごい!カラデシュ!カラデシュ!カラデシュ!すごい!カラデシュ!カラデシュ!カラデシュ!本当にすごいんだ! --*w*
すごい!すごい!すごい!カラデシュ!すごい!すごい!すごい!すごい!すごい!カラデシュ!本当にすごいんだ! --*A*
すごい!すごい!すごい!カラデシュ!すごい!すごい!すごい!すごい!すごい!本当にすごいんだ! --* *
すごい!すごい!すごい!カラデシュ!すごい!すごい!すごい!すごい!カラデシュ!本当にすごいんだ! --*!*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!カラデシュ!すごい!すごい!すごい!本当にすごいんだ! --*h*
すごい!すごい!すごい!カラデシュ!カラデシュ!カラデシュ!すごい!すごい!カラデシュ!カラデシュ!本当にすごいんだ! --*s*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!すごい!カラデシュ!すごい!カラデシュ!本当にすごいんだ! --*e*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!すごい!カラデシュ!すごい!すごい!本当にすごいんだ! --*d*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!すごい!すごい!すごい!カラデシュ!本当にすごいんだ! --*a*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!カラデシュ!カラデシュ!すごい!すごい!本当にすごいんだ! --*l*
すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!すごい!すごい!すごい!カラデシュ!本当にすごいんだ! --*a*
すごい!すごい!すごい!カラデシュ!すごい!すごい!カラデシュ!すごい!カラデシュ!カラデシュ!本当にすごいんだ! --*K*
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
カラデシュ!本当にすごいんだ!すごい!すごい!
本当にすごいんだ!本当にすごいんだ!本当にすごいんだ!
```

```text:Kaladesh-Awesomeの実行結果
Kaladesh! Awesome!
```

**カラデシュ! すごい! 本当にすごいんだ!**

### FizzBuzz
```text:FizzBuzz
すごい!すごい!すごい!カラデシュ!本当にすごいんだ!
本当にすごいんだ!すごい!すごい!すごい!本当にすごいんだ!

すごい!本当にすごいんだ!すごい!
すごい!すごい!　すごい!カラデシュ!カラデシュ!カラデシュ!カラデシュ!本当にすごいんだ!
カラデシュ!すごい!カラデシュ!カラデシュ!
本当にすごいんだ!カラデシュ!すごい!すごい!すごい!本当にすごいんだ!

すごい!本当にすごいんだ!すごい!
すごい!すごい!　すごい!カラデシュ!すごい!カラデシュ!本当にすごいんだ!
カラデシュ!すごい!カラデシュ!カラデシュ!
本当にすごいんだ!カラデシュ!すごい!すごい!カラデシュ!本当にすごいんだ!

すごい!本当にすごいんだ!すごい!
すごい!すごい!　すごい!カラデシュ!カラデシュ!本当にすごいんだ!
カラデシュ!すごい!カラデシュ!カラデシュ!

本当にすごいんだ!カラデシュ!すごい!カラデシュ!すごい!本当にすごいんだ!

すごい!本当にすごいんだ!すごい!
カラデシュ!本当にすごいんだ!すごい!カラデシュ!

本当にすごいんだ!すごい!本当にすごいんだ!カラデシュ!カラデシュ!本当にすごいんだ!

本当にすごいんだ!すごい!すごい! すごい!すごい!本当にすごいんだ!
すごい!すごい!　すごい!カラデシュ!すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!本当にすごいんだ!
カラデシュ!本当にすごいんだ!すごい!すごい!
すごい!すごい!　すごい!カラデシュ!すごい!すごい!すごい!すごい!カラデシュ!すごい!本当にすごいんだ!
カラデシュ!本当にすごいんだ!すごい!すごい!
本当にすごいんだ!すごい!本当にすごいんだ!カラデシュ!カラデシュ!本当にすごいんだ!

本当にすごいんだ!すごい!すごい! すごい!カラデシュ!本当にすごいんだ!
すごい!すごい!　すごい!カラデシュ!すごい!すごい!すごい!すごい!カラデシュ!すごい!本当にすごいんだ!
カラデシュ!本当にすごいんだ!すごい!すごい!
本当にすごいんだ!すごい!本当にすごいんだ!カラデシュ!カラデシュ!本当にすごいんだ!

本当にすごいんだ!すごい!すごい! カラデシュ!すごい!本当にすごいんだ!
すごい!すごい!　すごい!カラデシュ!すごい!すごい!すごい!カラデシュ!カラデシュ!すごい!本当にすごいんだ!
カラデシュ!本当にすごいんだ!すごい!すごい!

本当にすごいんだ!すごい!すごい! カラデシュ!カラデシュ!本当にすごいんだ!

すごい!すごい!　すごい!カラデシュ!本当にすごいんだ!
カラデシュ!すごい!すごい!すごい!
すごい!本当にすごいんだ!すごい!
すごい!すごい!　すごい!カラデシュ!カラデシュ!カラデシュ!カラデシュ!カラデシュ!本当にすごいんだ!
カラデシュ!すごい!すごい!カラデシュ!
本当にすごいんだ!カラデシュ!すごい!カラデシュ!本当にすごいんだ!
本当にすごいんだ!すごい!本当にすごいんだ!すごい!本当にすごいんだ!
本当にすごいんだ!すごい!すごい!カラデシュ!本当にすごいんだ!
すごい!本当にすごいんだ!本当にすごいんだ!
本当にすごいんだ!本当にすごいんだ!本当にすごいんだ!
```
```text:FizzBuzzの実行結果
12F4BF78FB11F1314FB1617F19BF2223FB26F2829FB
```

**カラデシュ! すごい! 本当にすごいんだ!**
# 解説
(詳しくは[ヘルプ](https://snowman-s.github.io/NextApp/utils/kaladesh-lang/help/)をご覧ください。)

- カラデシュ言語は3つのトークン(**カラデシュ!**, **すごい!**, **本当にすごいんだ!**)によってのみ構成され、残りの文字(改行も含む)は全てコメントとして扱われます。
- 実行形式はスタックベースです。すなわち、スタックとヒープ領域を用いて、コマンドを一つずつ実行していきます。

- コマンドはそれぞれIMP(Instruction Modification Parameter)によってグループ化されており、コマンドを記述するときにはIMPを先に記述してから本体のコマンドの表記を書きます。

コマンド例(**太字** がIMP)：
> **すごい!** 本当にすごいんだ!すごい! -- Dup (スタックの最も上の要素を複製する)
> **カラデシュ!すごい!** 本当にすごいんだ! -- *KaladeshArithmetic* (コンピューターが耐えられないぐらい本当にすごい演算)
> **本当にすごいんだ!** 本当にすごいんだ!本当にすごいんだ! -- End (プログラムの即時終了、プログラムの最後に書くとお行儀がいい)

- また、いくつかのコマンドは引数をとります。引数は数値とラベルがあり、コマンドに続けて書く必要があります。

引数を持つコマンド例(**太字** が引数):
> すごい!すごい!　**すごい!カラデシュ!本当にすごいんだ!** -- Push +1 (スタックに1を積む)
> 本当にすごいんだ!すごい!すごい!　**カラデシュ!すごい!カラデシュ!本当にすごいんだ!** -- Label TWT (このコマンドの位置を"カラデシュ!すごい!カラデシュ!"というラベルでマークし、他のコマンドで使えるようにする。)

- ラベルを用いることで所謂"Jump命令"を書くことができます。Labelコマンドはコンパイル時に解決されるので、そのLabelコマンド実行前にJumpを使用することができます。

制御フローのコマンド例:
> 本当にすごいんだ!すごい!本当にすごいんだ!  **カラデシュ!すごい!カラデシュ!本当にすごいんだ!** -- Jump TWT ("カラデシュ!すごい!カラデシュ!"というラベルがついたコマンドの位置に実行を移す。Labelコマンドは解決済みなのでこのラベルを使用できる。)
>
> ～～～～～～
> いろんなコマンド <--- 実行されない
> ～～～～～～
> 
> 本当にすごいんだ!すごい!すごい!　**カラデシュ!すごい!カラデシュ!本当にすごいんだ!** -- Label TWT

## 実は...
**カラデシュ言語はほぼ[Whitespace](https://web.archive.org/web/20150618184706/http://compsoc.dur.ac.uk/whitespace/tutorial.php)の表記と同じです。**
> Space: "すごい!"
> Tab: "カラデシュ!"
> LF: "本当にすごいんだ!"

と対応しています。

# ソースコード
大体この辺り：[GitHub](https://github.com/Snowman-s/NextApp/tree/master/src/others/kaladesh-lang)

# 参考にしたものや触発されたもの等
https://qiita.com/vain0x/items/6d3b75f667d3ec7f1d2a

- [Whitespaceのチュートリアル](https://web.archive.org/web/20150618184706/http://compsoc.dur.ac.uk/whitespace/tutorial.php)
- [カラデシュ!すごい! 本当にすごいんだ! の解説](https://dic.nicovideo.jp/a/%E3%82%AB%E3%83%A9%E3%83%87%E3%82%B7%E3%83%A5%21%E3%81%99%E3%81%94%E3%81%84%21%E6%9C%AC%E5%BD%93%E3%81%AB%E3%81%99%E3%81%94%E3%81%84%E3%82%93%E3%81%A0%21)