読者です 読者をやめる 読者になる 読者になる

セカイ内存在証明

それは多分、単なる思い付き

Moon言語を作っています

たまには言語オタっぽいことをしようと思って、Moon言語というプログラミング言語を作りはじめました。

現状、超絶作りかけで、まだリポジトリも作ってません。というかバージョン管理する気にもなりません。

とりあえずチューリング完全ということが証明されたので公開しておきます。

Moon is Macro based Programming Language.

Moon言語

Moon言語はマクロ(ルール)によるテキスト置換をベースにしたプログラミング言語です。

といっても分かりにくいので簡単に例を示すと、

@def(hello){world}#
@hello

こんな感じにして、最初の行でhelloというルールを定義して、それを次の行の@helloで展開しています。1行目の末尾の#はコメントです。TeXなんかだとよくある感じですね。

で、これを実行すると、

world

という出力が得られるわけです。

当然ながら再帰的に展開することもできて、

@def(a){A!!!}#
@def(b){B!!! @a}#
@b

とすると、

A!!! B!!!

になったりとか、引数を取ることもできて、

@def(say,word){I say "@word"}#
@say(YES)

とすると、

I say "YES"

となったりとか、他にもブロック引数とか可変引数とかがあります。

また、特徴的な命令として、@return@yieldがあります。

@returnは、通常のプログラミング言語にあるように、そのルールの実行を中断して、現在までの出力とそのあとの規則の文字列を合わせて出力します。

@def(rule1){@rule2 @return @rule3}#
@def(rule2){Rule 2}#
@rule1

とすると、

Rule 2  @rule3

となります。今気付きましたがこれはエスケープに使えますね。

また、@yieldも基本的に@returnと同じように動作するのですが、出力したものを呼び出しもとのソースと結合してそこから実行していきます。あ、@のあとに、特殊な記号を並べるとエスケープになります。

@def(rule1){@@rule2@yield}#
@def(rule2){Rule 2}#
@rule1

とすると、まず@rule1が展開されて、

@rule2

となり、これがさらに展開されて、最終的には

Rule 2

となるわけです。要はevalですね。

この@yieldを駆使するとマクロっぽいことができたりします。どういうことかは考えてみてください。

おやすみなさい。